diff --git a/android-vault b/android-vault index 36470d78c8..240547f50a 160000 --- a/android-vault +++ b/android-vault @@ -1 +1 @@ -Subproject commit 36470d78c8684f3033bf63d8d944a479156d8b13 +Subproject commit 240547f50af79733dbed1f17e13c78f5d525db2d diff --git a/apps/flutter_parent/.gitignore b/apps/flutter_parent/.gitignore deleted file mode 100644 index d9a8ddafa6..0000000000 --- a/apps/flutter_parent/.gitignore +++ /dev/null @@ -1,87 +0,0 @@ -# Private data -key.properties -google-services.json -lib/network/utils/private_consts.dart - -# Miscellaneous -*.class -*.log -*.pyc -*.swp -.DS_Store -.atom/ -.buildlog/ -.history -.svn/ -coverage/ - -# IntelliJ related -*.iml -*.ipr -*.iws -.idea/ - -# The .vscode folder contains launch configuration and tasks you configure in -# VS Code which you may wish to be included in version control, so this line -# is commented out by default. -#.vscode/ - -# Flutter/Dart/Pub related -**/doc/api/ -.dart_tool/ -.flutter-plugins -.flutter-plugins-dependencies -.packages -.pub-cache/ -.pub/ -/build/ - -# Android related -**/android/**/gradle-wrapper.jar -**/android/.gradle -**/android/captures/ -**/android/gradlew -**/android/gradlew.bat -**/android/local.properties -**/android/**/GeneratedPluginRegistrant.java - -# We must track gradle-wrapper.properties in order to keep the gradle -# version synced with the version used by buildSrc, which is found in -# /gradle/gradle/wrapper/gradle-wrapper.properties. -# This is necessary because the flutter gradle project depends on buildSrc -# for access to things like Versions constants and PrivateData.merge(). -#**/android/**/gradle-wrapper.properties - -# iOS/XCode related -**/ios/**/*.mode1v3 -**/ios/**/*.mode2v3 -**/ios/**/*.moved-aside -**/ios/**/*.pbxuser -**/ios/**/*.perspectivev3 -**/ios/**/*sync/ -**/ios/**/.sconsign.dblite -**/ios/**/.tags* -**/ios/**/.vagrant/ -**/ios/**/DerivedData/ -**/ios/**/Icon? -**/ios/**/Pods/ -**/ios/**/.symlinks/ -**/ios/**/profile -**/ios/**/xcuserdata -**/ios/.generated/ -**/ios/Flutter/App.framework -**/ios/Flutter/Flutter.framework -**/ios/Flutter/Generated.xcconfig -**/ios/Flutter/app.flx -**/ios/Flutter/app.zip -**/ios/Flutter/flutter_assets/ -**/ios/Flutter/flutter_export_environment.sh -**/ios/ServiceDefinitions.json -**/ios/Runner/GeneratedPluginRegistrant.* - -# Exceptions to above rules. -!**/ios/**/default.mode1v3 -!**/ios/**/default.mode2v3 -!**/ios/**/default.pbxuser -!**/ios/**/default.perspectivev3 -!/packages/flutter_tools/test/data/dart_dependencies_test/**/.packages diff --git a/apps/flutter_parent/.metadata b/apps/flutter_parent/.metadata deleted file mode 100644 index 65686a2dda..0000000000 --- a/apps/flutter_parent/.metadata +++ /dev/null @@ -1,10 +0,0 @@ -# This file tracks properties of this Flutter project. -# Used by Flutter tool to assess capabilities and perform upgrades etc. -# -# This file should be version controlled and should not be manually edited. - -version: - revision: cc949a8e8b9cf394b9290a8e80f87af3e207dce5 - channel: stable - -project_type: app diff --git a/apps/flutter_parent/LICENSE b/apps/flutter_parent/LICENSE deleted file mode 100644 index 892c32a76d..0000000000 --- a/apps/flutter_parent/LICENSE +++ /dev/null @@ -1,13 +0,0 @@ -Copyright (C) 2019 - present Instructure, Inc. - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, version 3 of the License. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program. If not, see . \ No newline at end of file diff --git a/apps/flutter_parent/README.md b/apps/flutter_parent/README.md deleted file mode 100644 index bed21fad3a..0000000000 --- a/apps/flutter_parent/README.md +++ /dev/null @@ -1,119 +0,0 @@ -# flutter_parent - -A new Flutter project. - -## Getting Started - -This project is a starting point for a Flutter application. - -A few resources to get you started if this is your first Flutter project: - -- [Lab: Write your first Flutter app](https://flutter.dev/docs/get-started/codelab) -- [Cookbook: Useful Flutter samples](https://flutter.dev/docs/cookbook) - -For help getting started with Flutter, view our -[online documentation](https://flutter.dev/docs), which offers tutorials, -samples, guidance on mobile development, and a full API reference. - -## Localization - -Localization is not built in to flutter like it is with native Android. -Instead, we need to use the `intl` and `flutter_localizations` libraries. -This will allow us to have different translations being used depending -on the users locale. - -It's pretty easy to use, once set up. To add a new string, create a new -getter in `lib/l10n/app_localizations.dart` that looks something like this: -``` - // The 'name' field must match the function name, and is optional unless arguments are part of the string resource - - String get myCoolNewString(String foo) { - return Intl.message('Cool string here: $foo', name: 'myCoolNewString', args: [foo], desc: 'A description to help translators'); - } -``` - -Then, to use the newly created string, access it like so using a BuildContext: -``` -final alertTabLabel = AppLocalizations.of(context).myCoolNewString('bar'); -``` - -That is the basics of using the `intl` library for localized strings! - -### Automating Imports -Generated files are created through a dev dependency of `intl_translation`. - -The base strings are held in `lib/l10n/res/intl_messages.arb` and each -translation is held in `lib/l10n/res/intl_*.arb` where * is the language -identifier. e.g., `intl_en_unimelb_AU.arb` has the locale identifier -`en_unimelb_AU`. - -Linking the translations back in will generate a -`lib/l10n/generated/messages_*.dart` for each `intl_*.arb` that is -provided. It will also generate a `messages_all.dart` to be able to -actually perform the lookups. The `AppLocalization#load` function hooks -into this by calling `initializeMessages` from the `messages_all.dart` file. - -Command Line Usage: - -Update the base intl_messages file for translators by running this -command from the project root: -``` -flutter pub run intl_translation:extract_to_arb --output-dir=lib/l10n/res lib/l10n/app_localizations.dart -``` -Note: We also add the --warnings-are-errors flag during CI to ensure that -strings that are improperly formatted will fail to build during PRs. - -Once intl_messages has been created, it can be sent to translators where -they will create all the other `intl_*.arb` files. To link translations -back into the project once translators finish the translations, run this -command: -``` -flutter pub run intl_translation:generate_from_arb --output-dir=lib/l10n/generated --no-use-deferred-loading lib/l10n/app_localizations.dart lib/l10n/res/intl_*.arb -``` - -### CI flow -1. The `extract-flutter-for-translators` workflow will run weekly on the `canvas-android-tasks` app in Bitrise -2. Merge in the pull request generated by `extract-flutter-for-translators` (does this for all flutter projects) -3. Let the weekly export job sync the arb files to S3 like any other language resource -4. Wait for translators to do their work, and run the import workflow on `canvas-android-tasks` to get a PR -5. Merge the PR to get the translated `intl_*.arb` files -6. Once the arb files have been merged, run the `generate-flutter-translations` workflow in Bitrise under the `canvas-android-tasks` app -7. Fix any projects that have errors, reporting any issues to our i18n project manager as well, and merge the PR! - ---- - -## Viewing Code Coverage -To view code coverage, first install the `lcov` tool (`brew install lcov` for macOS). -Then, run this command from the root of the flutter project directory: -``` -flutter pub run tools/code_coverage -``` -This will run the project's unit tests with coverage enabled, remove -excluded files from the resulting coverage info, generate an HTML report -from that info, and open the report in the browser. You may skip opening -the report in the browser with the `--dont-open` flag. - -Exclusions can be configured by editing `tools/codecov_exclusions`. Note -that this script is meant to be used locally by devs, but will hopefully -serve as a starting point when we eventually wire up proper code coverage -reporting via CI. - ---- - -#### Unless otherwise noted, all parts of this application are licensed under the GPLv3 License. - -``` -Copyright (C) 2019 - present Instructure, Inc. - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, version 3 of the License. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program. If not, see . -``` diff --git a/apps/flutter_parent/analysis_options.yaml b/apps/flutter_parent/analysis_options.yaml deleted file mode 100644 index 35987d5d4a..0000000000 --- a/apps/flutter_parent/analysis_options.yaml +++ /dev/null @@ -1,3 +0,0 @@ -analyzer: - exclude: - - '**/*.g.dart' \ No newline at end of file diff --git a/apps/flutter_parent/android/app/build.gradle b/apps/flutter_parent/android/app/build.gradle deleted file mode 100644 index 0190a20214..0000000000 --- a/apps/flutter_parent/android/app/build.gradle +++ /dev/null @@ -1,116 +0,0 @@ -def localProperties = new Properties() -def localPropertiesFile = rootProject.file('local.properties') -if (localPropertiesFile.exists()) { - localPropertiesFile.withReader('UTF-8') { reader -> - localProperties.load(reader) - } -} - -def flutterRoot = localProperties.getProperty('flutter.sdk') -if (flutterRoot == null) { - throw new GradleException("Flutter SDK not found. Define location with flutter.sdk in the local.properties file.") -} - -def flutterVersionCode = localProperties.getProperty('flutter.versionCode') -if (flutterVersionCode == null) { - flutterVersionCode = '1' -} - -def flutterVersionName = localProperties.getProperty('flutter.versionName') -if (flutterVersionName == null) { - flutterVersionName = '1.0' -} - -apply plugin: 'com.android.application' -apply plugin: 'com.google.gms.google-services' -apply plugin: 'kotlin-android' -apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle" - -def keystoreProperties = new Properties() -def keystorePropertiesFile = rootProject.file('key.properties') -if (keystorePropertiesFile.exists()) { - keystoreProperties.load(new FileInputStream(keystorePropertiesFile)) -} - -android { - compileSdk 34 - - sourceSets { - main.java.srcDirs += 'src/main/kotlin' - } - - lintOptions { - disable 'InvalidPackage' - } - - defaultConfig { - applicationId "com.instructure.parentapp" - minSdkVersion 26 - targetSdk 34 - versionCode flutterVersionCode.toInteger() - versionName flutterVersionName - testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" - - //noinspection GroovyAccessibility - PrivateData.merge(project, "parent") - PrivateData.merge(project, "dataseeding-flutter") - } - - signingConfigs { - release { - keyAlias keystoreProperties['keyAlias'] - keyPassword keystoreProperties['keyPassword'] - storeFile keystoreProperties['storeFile'] ? file(keystoreProperties['storeFile']) : null - storePassword keystoreProperties['storePassword'] - } - } - - buildTypes { - release { - if (keystorePropertiesFile.exists()) { - signingConfig signingConfigs.release - } else { - signingConfig signingConfigs.debug - } - - minifyEnabled true - shrinkResources false // Must be false, otherwise resources we need are erroneously stripped out - proguardFiles 'proguard-rules.pro' - } - applicationVariants.all{ - variant -> - variant.outputs.each{ - output-> - project.ext { appName = 'parent' } - def dateTimeStamp = new Date().format('yyyy-MM-dd-HH-mm-ss') - def newName = output.outputFile.name - newName = newName.replace("app-", "$project.ext.appName-") - newName = newName.replace("-debug", "-dev-debug-" + dateTimeStamp) - newName = newName.replace("-release", "-prod-release") - output.outputFileName = newName - } - } - } - namespace 'com.instructure.parentapp' -} - -flutter { - source '../..' -} - -dependencies { - implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.5.20" - - testImplementation 'junit:junit:4.12' - - androidTestImplementation 'com.android.support.test:runner:1.0.2' - androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0' - implementation "com.squareup.okhttp3:okhttp:4.9.1" - implementation 'org.jsoup:jsoup:1.11.3' - implementation 'com.google.gms:google-services:4.3.14' -} - -apply plugin: 'com.google.firebase.crashlytics' - -// Comment out this line if the reporting logic starts going wonky. -gradle.addListener new TimingsListener(project) \ No newline at end of file diff --git a/apps/flutter_parent/android/app/proguard-rules.pro b/apps/flutter_parent/android/app/proguard-rules.pro deleted file mode 100644 index 107b91e0c7..0000000000 --- a/apps/flutter_parent/android/app/proguard-rules.pro +++ /dev/null @@ -1,11 +0,0 @@ -# Local notifications plugin --keep class com.dexterous.** { *; } - -# Crashlytics --keep class com.crashlytics.** { *; } --dontwarn com.crashlytics.** - --keep enum com.google.zxing.** { *; } - -# Android framework --keep class androidx.lifecycle.** { *; } \ No newline at end of file diff --git a/apps/flutter_parent/android/app/src/debug/AndroidManifest.xml b/apps/flutter_parent/android/app/src/debug/AndroidManifest.xml deleted file mode 100644 index f880684a6a..0000000000 --- a/apps/flutter_parent/android/app/src/debug/AndroidManifest.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - diff --git a/apps/flutter_parent/android/app/src/main/AndroidManifest.xml b/apps/flutter_parent/android/app/src/main/AndroidManifest.xml deleted file mode 100644 index 92cc44acbe..0000000000 --- a/apps/flutter_parent/android/app/src/main/AndroidManifest.xml +++ /dev/null @@ -1,104 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/apps/flutter_parent/android/app/src/main/kotlin/com/instructure/parentapp/MainActivity.kt b/apps/flutter_parent/android/app/src/main/kotlin/com/instructure/parentapp/MainActivity.kt deleted file mode 100644 index 637c7a0207..0000000000 --- a/apps/flutter_parent/android/app/src/main/kotlin/com/instructure/parentapp/MainActivity.kt +++ /dev/null @@ -1,59 +0,0 @@ -/* - * Copyright (C) 2020 - present Instructure, Inc. - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, version 3 of the License. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package com.instructure.parentapp - -import android.content.Intent -import android.net.Uri -import androidx.annotation.NonNull -import com.instructure.parentapp.plugins.DataSeedingPlugin -import com.instructure.parentapp.plugins.OldAppMigrations -import com.instructure.parentapp.plugins.UrlLauncher -import io.flutter.embedding.android.FlutterActivity -import io.flutter.embedding.engine.FlutterEngine -import io.flutter.plugins.GeneratedPluginRegistrant - -class MainActivity : FlutterActivity() { - override fun configureFlutterEngine(@NonNull flutterEngine: FlutterEngine) { - GeneratedPluginRegistrant.registerWith(flutterEngine) - OldAppMigrations.init(flutterEngine, applicationContext) - UrlLauncher.init(flutterEngine, applicationContext, this) - DataSeedingPlugin.init(flutterEngine) - - checkForLinkEvent(intent) - } - - override fun onNewIntent(intent: Intent) { - super.onNewIntent(intent) - checkForLinkEvent(intent, newIntent = true) - } - - private fun checkForLinkEvent(intent: Intent, newIntent: Boolean = false) { - val data = intent.data - if (intent.action != Intent.ACTION_VIEW || data == null) return - - // NOTE: The `url` query param has to match the result of one of the static string methods in - // panda_router.dart in the flutter code - val route = "external?url=${Uri.encode(data.toString())}" - if (newIntent) { - flutterEngine?.navigationChannel?.pushRoute(route) - } else { - this.intent = intent.putExtra("route", route) -// this.intent = intent.putExtra(FlutterActivityLaunchConfigs.EXTRA_INITIAL_ROUTE, route) // Package private, can't use directly but is exactly what we want. Leaving in for future reference -// flutterEngine?.navigationChannel?.setInitialRoute(route) // Doesn't actually work, not implemented flutter side ¯\_(ツ)_/¯ - } - } -} diff --git a/apps/flutter_parent/android/app/src/main/kotlin/com/instructure/parentapp/plugins/DataSeedingPlugin.kt b/apps/flutter_parent/android/app/src/main/kotlin/com/instructure/parentapp/plugins/DataSeedingPlugin.kt deleted file mode 100644 index 915ae78b9f..0000000000 --- a/apps/flutter_parent/android/app/src/main/kotlin/com/instructure/parentapp/plugins/DataSeedingPlugin.kt +++ /dev/null @@ -1,77 +0,0 @@ -package com.instructure.parentapp.plugins - -import android.os.AsyncTask -import io.flutter.embedding.engine.FlutterEngine -import io.flutter.plugin.common.MethodCall -import io.flutter.plugin.common.MethodChannel -import okhttp3.HttpUrl -import okhttp3.HttpUrl.Companion.toHttpUrlOrNull -import org.jsoup.Connection -import org.jsoup.Jsoup -import org.jsoup.nodes.FormElement - -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -object DataSeedingPlugin { - private const val AUTHCODE_CHANNEL = "GET_AUTH_CODE" - - fun init(flutterEngine: FlutterEngine) { - // Implement getAuthCode / JSoup support via MethodChannel - MethodChannel(flutterEngine.dartExecutor.binaryMessenger, AUTHCODE_CHANNEL).setMethodCallHandler(::handleCall) - } - - private fun handleCall(call: MethodCall, result: MethodChannel.Result) { - when (call.method) { - "getAuthCode" -> getAuthCode(call, result) - else -> result.notImplemented() - } - } - - private fun getAuthCode(call: MethodCall, result: MethodChannel.Result) { - object : AsyncTask() { - var authCode : String? = null - override fun doInBackground(vararg methodCalls: MethodCall): Void? { - val _call = methodCalls[0] - - val domain = _call.argument("domain") - val clientId = _call.argument("clientId") - val redirectUrl = _call.argument("redirectUrl") - val login = _call.argument("login") - val password = _call.argument("password") - - val loginPageResponse = Jsoup.connect("https://$domain/login/oauth2/auth") - .method(Connection.Method.GET) - .data("client_id", clientId) - .data("response_type", "code") - .data("redirect_uri", redirectUrl) - .execute() - val loginForm = loginPageResponse.parse().select("form").first() as FormElement - loginForm.getElementById("pseudonym_session_unique_id").`val`(login) - loginForm.getElementById("pseudonym_session_password").`val`(password) - val authFormResponse = loginForm.submit().cookies(loginPageResponse.cookies()).execute() - val authForm = authFormResponse.parse().select("form").first() as FormElement - val responseUrl = authForm.submit().cookies(authFormResponse.cookies()).execute().url().toString() - authCode = responseUrl?.toHttpUrlOrNull()?.queryParameter("code") - ?: throw RuntimeException("/login/oauth2/auth failed!") - - return null - } - - override fun onPostExecute(nullResult: Void?) : Unit { - result.success(authCode) - } - }.execute(call) - } -} \ No newline at end of file diff --git a/apps/flutter_parent/android/app/src/main/kotlin/com/instructure/parentapp/plugins/OldAppMigrations.kt b/apps/flutter_parent/android/app/src/main/kotlin/com/instructure/parentapp/plugins/OldAppMigrations.kt deleted file mode 100644 index d3970b188e..0000000000 --- a/apps/flutter_parent/android/app/src/main/kotlin/com/instructure/parentapp/plugins/OldAppMigrations.kt +++ /dev/null @@ -1,114 +0,0 @@ -/* - * Copyright (C) 2020 - present Instructure, Inc. - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, version 3 of the License. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package com.instructure.parentapp.plugins - -import android.content.Context -import android.database.DatabaseUtils -import android.database.sqlite.SQLiteDatabase -import android.database.sqlite.SQLiteException -import android.database.sqlite.SQLiteOpenHelper -import android.util.Log -import io.flutter.embedding.engine.FlutterEngine -import io.flutter.plugin.common.MethodCall -import io.flutter.plugin.common.MethodChannel -import org.json.JSONObject -import java.util.* - -object OldAppMigrations { - private const val CHANNEL = "com.instructure.parentapp/oldAppMigrations" - private const val METHOD_GET_LOGINS = "getLogins" - private const val METHOD_HAS_OLD_REMINDERS = "hasOldReminders" - private const val PREF_NAME_CANVAS = "canvas-kit-sp" - private const val PREF_NAME_LOGIN_LIST = "signedInUsersList" - - private lateinit var context: Context - - fun init(flutterEngine: FlutterEngine, context: Context) { - this.context = context - MethodChannel(flutterEngine.dartExecutor.binaryMessenger, CHANNEL).setMethodCallHandler(::handleCall) - } - - private fun handleCall(call: MethodCall, result: MethodChannel.Result) { - when (call.method) { - METHOD_GET_LOGINS -> getLogins(result) - METHOD_HAS_OLD_REMINDERS -> result.success(OldReminderUtil.hasPendingReminders(context)) - else -> result.notImplemented() - } - } - - private fun getLogins(result: MethodChannel.Result) { - val prefs = context.getSharedPreferences(PREF_NAME_CANVAS, Context.MODE_PRIVATE) - val refreshToken = prefs.getString("refreshToken", "INVALID") - - // Get list of login data json strings - val logins = context.getSharedPreferences(PREF_NAME_LOGIN_LIST, Context.MODE_PRIVATE).all.values - .map { JSONObject(it as String) } - .onEach { - // Convert user ID to a string - it.optJSONObject("user")?.apply { put("id", optLong("id").toString()) } - - // We use full domain on the flutter side, so we'll combine it here - it.put("domain", "${it.optString("protocol") ?: "https"}://${it.optString("domain")}") - it.remove("protocol") - - // Some users may not be on refresh tokens, so pull their old token as the 'accessToken' - val token = it.optString("token") - if (token != null && token.isNotEmpty()) it.put("accessToken", token) - - // Add client id/secret if this is the current user - if (refreshToken == it.optString("refreshToken")) { - it.put("clientId", prefs.getString("client_id", null)) - it.put("clientSecret", prefs.getString("client_secret", null)) - } - }.sortedBy { - // Sort the current login to the first position - if (it.optString("refreshToken") == refreshToken) -1 else 0 - }.map { it.toString() } - - result.success(logins.toList()) - } -} - -object OldReminderUtil { - private const val DATABASE_NAME = "alarmDatabase" - private const val TABLE = "alarms" - private const val KEY_YEAR = "_year" - private const val KEY_MONTH = "_month" - private const val KEY_DAY = "_day" - - private class DbHelper(context: Context?) : SQLiteOpenHelper(context, DATABASE_NAME, null, 1) { - override fun onCreate(db: SQLiteDatabase?) = Unit - override fun onUpgrade(db: SQLiteDatabase, oldVersion: Int, newVersion: Int) = Unit - } - - /** Returns true if the old database contains reminders with a future date */ - fun hasPendingReminders(context: Context): Boolean { - val dbHelper = DbHelper(context) - val db = dbHelper.writableDatabase - - val now = Calendar.getInstance() - val today = 10_000 * now.get(Calendar.YEAR) + 100 * now.get(Calendar.MONTH) + now.get(Calendar.DAY_OF_MONTH) - val query = "select count(*) from $TABLE where (10000 * $KEY_YEAR + 100 * $KEY_MONTH + $KEY_DAY) >= $today" - - return try { - DatabaseUtils.longForQuery(db, query, null) > 0L - } catch (e: SQLiteException) { - // Exception expected if the table doesn't exist - false - } - } -} diff --git a/apps/flutter_parent/android/app/src/main/kotlin/com/instructure/parentapp/plugins/UrlLauncher.kt b/apps/flutter_parent/android/app/src/main/kotlin/com/instructure/parentapp/plugins/UrlLauncher.kt deleted file mode 100644 index c6329de31d..0000000000 --- a/apps/flutter_parent/android/app/src/main/kotlin/com/instructure/parentapp/plugins/UrlLauncher.kt +++ /dev/null @@ -1,94 +0,0 @@ -/* - * Copyright (C) 2020 - present Instructure, Inc. - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, version 3 of the License. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package com.instructure.parentapp.plugins - -import android.app.Activity -import android.content.ComponentName -import android.content.Context -import android.content.Intent -import android.net.Uri -import android.os.Build -import io.flutter.embedding.engine.FlutterEngine -import io.flutter.plugin.common.MethodCall -import io.flutter.plugin.common.MethodChannel - -object UrlLauncher { - private const val CHANNEL = "com.instructure.parentapp/url_launcher" - private const val METHOD_LAUNCH = "launch" - private const val METHOD_CAN_LAUNCH = "canLaunch" - - private val excludeComponents = arrayOf( - // Student - ComponentName("com.instructure.candroid", "com.instructure.student.activity.InterwebsToApplication"), - - // Parent (native) - ComponentName("com.instructure.parentapp", "com.instructure.parentapp.activity.RouteValidatorActivity"), - - // Parent (flutter) - ComponentName("com.instructure.parentapp", "com.instructure.parentapp.MainActivity"), - - // Teacher - ComponentName("com.instructure.teacher", "com.instructure.teacher.activities.RouteValidatorActivity") - ) - - private lateinit var activity: Activity - private lateinit var applicationContext: Context - - fun init(flutterEngine: FlutterEngine, applicationContext: Context, activity: Activity) { - this.applicationContext = applicationContext - this.activity = activity - MethodChannel(flutterEngine.dartExecutor.binaryMessenger, CHANNEL).setMethodCallHandler(::handleCall) - } - - private fun handleCall(call: MethodCall, result: MethodChannel.Result) { - when (call.method) { - METHOD_LAUNCH -> launch(call, result) - METHOD_CAN_LAUNCH -> canLaunch(call, result) - else -> result.notImplemented() - } - } - - private fun canLaunch(call: MethodCall, result: MethodChannel.Result) { - val url: String = call.argument("url")!!; - val excludeInstructure: Boolean = call.argument("excludeInstructure")!!; - val intent: Intent = makeIntent(url, excludeInstructure) - - val componentName: ComponentName? = intent.resolveActivity(applicationContext.packageManager); - val canLaunch = componentName != null - && componentName.toShortString() != "{com.android.fallback/com.android.fallback.Fallback}"; - result.success(canLaunch) - } - - private fun launch(call: MethodCall, result: MethodChannel.Result) { - val url: String = call.argument("url")!!; - val excludeInstructure: Boolean = call.argument("excludeInstructure")!!; - val intent: Intent = makeIntent(url, excludeInstructure) - - activity.startActivity(intent); - result.success(null) - } - - private fun makeIntent(url: String, excludeInstructure: Boolean): Intent { - var intent: Intent = Intent(Intent.ACTION_VIEW).setData(Uri.parse(url)); - if (excludeInstructure) { - intent = Intent.createChooser(intent, null).apply { - putExtra(Intent.EXTRA_EXCLUDE_COMPONENTS, excludeComponents) - } - } - return intent - } -} diff --git a/apps/flutter_parent/android/app/src/main/res/drawable-hdpi/ic_notification_canvas_logo.png b/apps/flutter_parent/android/app/src/main/res/drawable-hdpi/ic_notification_canvas_logo.png deleted file mode 100755 index 9fd8f36ff5..0000000000 Binary files a/apps/flutter_parent/android/app/src/main/res/drawable-hdpi/ic_notification_canvas_logo.png and /dev/null differ diff --git a/apps/flutter_parent/android/app/src/main/res/drawable-mdpi/ic_notification_canvas_logo.png b/apps/flutter_parent/android/app/src/main/res/drawable-mdpi/ic_notification_canvas_logo.png deleted file mode 100755 index b7c6ec1a83..0000000000 Binary files a/apps/flutter_parent/android/app/src/main/res/drawable-mdpi/ic_notification_canvas_logo.png and /dev/null differ diff --git a/apps/flutter_parent/android/app/src/main/res/drawable-xhdpi/ic_notification_canvas_logo.png b/apps/flutter_parent/android/app/src/main/res/drawable-xhdpi/ic_notification_canvas_logo.png deleted file mode 100755 index 9cb3ad2d12..0000000000 Binary files a/apps/flutter_parent/android/app/src/main/res/drawable-xhdpi/ic_notification_canvas_logo.png and /dev/null differ diff --git a/apps/flutter_parent/android/app/src/main/res/drawable-xxhdpi/ic_notification_canvas_logo.png b/apps/flutter_parent/android/app/src/main/res/drawable-xxhdpi/ic_notification_canvas_logo.png deleted file mode 100755 index 54dee3ca7e..0000000000 Binary files a/apps/flutter_parent/android/app/src/main/res/drawable-xxhdpi/ic_notification_canvas_logo.png and /dev/null differ diff --git a/apps/flutter_parent/android/app/src/main/res/drawable-xxxhdpi/ic_notification_canvas_logo.png b/apps/flutter_parent/android/app/src/main/res/drawable-xxxhdpi/ic_notification_canvas_logo.png deleted file mode 100755 index af8b96104c..0000000000 Binary files a/apps/flutter_parent/android/app/src/main/res/drawable-xxxhdpi/ic_notification_canvas_logo.png and /dev/null differ diff --git a/apps/flutter_parent/android/app/src/main/res/drawable/ic_launcher_foreground.xml b/apps/flutter_parent/android/app/src/main/res/drawable/ic_launcher_foreground.xml deleted file mode 100644 index f3bc345426..0000000000 --- a/apps/flutter_parent/android/app/src/main/res/drawable/ic_launcher_foreground.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - - - diff --git a/apps/flutter_parent/android/app/src/main/res/drawable/launch_background.xml b/apps/flutter_parent/android/app/src/main/res/drawable/launch_background.xml deleted file mode 100644 index 541e571bbd..0000000000 --- a/apps/flutter_parent/android/app/src/main/res/drawable/launch_background.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - diff --git a/apps/flutter_parent/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/apps/flutter_parent/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml deleted file mode 100644 index eb117241a6..0000000000 --- a/apps/flutter_parent/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/apps/flutter_parent/android/app/src/main/res/values/colors.xml b/apps/flutter_parent/android/app/src/main/res/values/colors.xml deleted file mode 100644 index 5190efea6d..0000000000 --- a/apps/flutter_parent/android/app/src/main/res/values/colors.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - #2573DF - #FFFFFF - \ No newline at end of file diff --git a/apps/flutter_parent/android/app/src/main/res/values/ic_launcher_background.xml b/apps/flutter_parent/android/app/src/main/res/values/ic_launcher_background.xml deleted file mode 100644 index 6f99cbfbcd..0000000000 --- a/apps/flutter_parent/android/app/src/main/res/values/ic_launcher_background.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - #FFFFFF - \ No newline at end of file diff --git a/apps/flutter_parent/android/app/src/main/res/values/styles.xml b/apps/flutter_parent/android/app/src/main/res/values/styles.xml deleted file mode 100644 index 00fa4417cf..0000000000 --- a/apps/flutter_parent/android/app/src/main/res/values/styles.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - diff --git a/apps/flutter_parent/android/app/src/profile/AndroidManifest.xml b/apps/flutter_parent/android/app/src/profile/AndroidManifest.xml deleted file mode 100644 index f880684a6a..0000000000 --- a/apps/flutter_parent/android/app/src/profile/AndroidManifest.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - diff --git a/apps/flutter_parent/android/build.gradle b/apps/flutter_parent/android/build.gradle deleted file mode 100644 index f73dbba37a..0000000000 --- a/apps/flutter_parent/android/build.gradle +++ /dev/null @@ -1,32 +0,0 @@ -buildscript { - repositories { - google() - mavenCentral() - } - - dependencies { - classpath 'com.android.tools.build:gradle:7.4.2' - classpath 'com.google.firebase:firebase-crashlytics-gradle:2.5.2' - classpath "com.google.gms:google-services:4.3.14" - classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.8.20" - } -} - -allprojects { - repositories { - google() - mavenCentral() - } -} - -rootProject.buildDir = '../build' -subprojects { - project.buildDir = "${rootProject.buildDir}/${project.name}" -} -subprojects { - project.evaluationDependsOn(':app') -} - -tasks.register("clean", Delete) { - delete rootProject.buildDir -} diff --git a/apps/flutter_parent/android/buildSrc/.gitignore b/apps/flutter_parent/android/buildSrc/.gitignore deleted file mode 100644 index d16386367f..0000000000 --- a/apps/flutter_parent/android/buildSrc/.gitignore +++ /dev/null @@ -1 +0,0 @@ -build/ \ No newline at end of file diff --git a/apps/flutter_parent/android/buildSrc/build.gradle.kts b/apps/flutter_parent/android/buildSrc/build.gradle.kts deleted file mode 100644 index d450834f47..0000000000 --- a/apps/flutter_parent/android/buildSrc/build.gradle.kts +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Copyright (C) 2023 - present Instructure, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -repositories { - google() - mavenCentral() -} - -val agpVersion = "7.4.2" - -dependencies { - implementation("com.android.tools.build:gradle:$agpVersion") - implementation("com.android.tools.build:gradle-api:$agpVersion") -} - -plugins { - `kotlin-dsl` -} diff --git a/apps/flutter_parent/android/buildSrc/src/main/groovy/TimingsListener.groovy b/apps/flutter_parent/android/buildSrc/src/main/groovy/TimingsListener.groovy deleted file mode 100644 index eea645a77d..0000000000 --- a/apps/flutter_parent/android/buildSrc/src/main/groovy/TimingsListener.groovy +++ /dev/null @@ -1,156 +0,0 @@ -import org.gradle.BuildListener -import org.gradle.BuildResult -import org.gradle.api.Project -import org.gradle.api.Task -import org.gradle.api.execution.TaskExecutionListener -import org.gradle.api.initialization.Settings -import org.gradle.api.invocation.Gradle -import org.gradle.api.tasks.TaskState - -import java.util.concurrent.TimeUnit - -// A listener that will allow us to monitor task timings and, ultimately, APK size -class TimingsListener implements TaskExecutionListener, BuildListener { - private long startTime - private timings = [:] - private Project refProject - private long buildStartTime - - TimingsListener(Project _refProject) { - refProject = _refProject - buildStartTime = System.nanoTime() - } - - - @Override - void beforeExecute(Task task) { - startTime = System.nanoTime() - } - - @Override - void afterExecute(Task task, TaskState taskState) { - def ms = TimeUnit.MILLISECONDS.convert(System.nanoTime() - startTime, TimeUnit.NANOSECONDS) - timings.put(task.name, ms) - } - - @Override - void buildFinished(BuildResult result) { - - // Compute build time - def totalBuildTimeMs = TimeUnit.MILLISECONDS.convert(System.nanoTime() - buildStartTime, TimeUnit.NANOSECONDS) - - // Grab the Splunk-mobile token from Bitrise - def splunkToken = System.getenv("SPLUNK_MOBILE_TOKEN") - - // Let's abort early if (1) the build failed, or (2) we're not on bitrise - if(result.failure != null) { - println("Build report logic aborting due to failed build") - return - } - - if(splunkToken == null || splunkToken.isEmpty()) { - println("Build report logic aborting because we're not on bitrise") - return - } - - // Grab the gradle tasks passed on the command line for the job - def startTaskNames = result.gradle.startParameter.taskNames.join(",") - - // Sort the timings in descending time order, compute our top 10 - timings = timings.sort { -it.value } - def top10 = timings.take(10).entrySet() - - // Figure out our build type - def buildType = "debug" - if(startTaskNames.contains("Release")) { - buildType = "release" - } - - // Figure out our build flavor - def buildFlavor = "qa" - if(startTaskNames.contains("Dev")) { - buildFlavor = "dev" - } - else if(startTaskNames.contains("Prod")) { - buildFlavor = "prod" - } - - // Grab some data from the environment - def bitriseWorkflow = System.getenv("BITRISE_TRIGGERED_WORKFLOW_ID") - def bitriseApp = System.getenv("BITRISE_APP_TITLE") - def bitriseBranch = System.getenv("BITRISE_GIT_BRANCH") - def bitriseBuildNumber = System.getenv("BITRISE_BUILD_NUMBER") - - // Determine our project name. - // It's not as simple as looking at refProject.name; since we add this listener via the - // student project, refProject.name will always be "student". Glean our actual project name - // via the bitrise app name. - def projectName = "" - if(bitriseApp.contains("Student")) { - projectName = "student" - } - else if(bitriseApp.contains("Teacher")) { - projectName = "teacher" - } - else if(bitriseApp.toLowerCase().contains("parent")) { - projectName = "parent" - } - else { - projectName = "unknown" // Punt - } - println("projectName = $projectName") - - // Locate the apk - def file = null - def fileSizeInMB = 0.0 - if(projectName!="parent") { - // We don't necessarily want refProject.buildDir, since it will always be the student buildDir - def buildDir = refProject.buildDir.toString().replace("student",projectName) - file = new File("$buildDir/outputs/apk/$buildFlavor/$buildType/$projectName-$buildFlavor-${buildType}.apk") - fileSizeInMB = file.length() == 0 ? 0 : (file.length() / (1024.0 * 1024.0)).round(3) - } - else { - // Different location logic for flutter parent apk file - def buildDir = refProject.buildDir.toString() - file = new File("$buildDir/outputs/apk/$buildType/app-${buildType}.apk") - fileSizeInMB = file.length() == 0 ? 0 : (file.length() / (1024.0 * 1024.0)) - fileSizeInMB = (fileSizeInMB * 1000.0).toInteger() / 1000.0 // Round to three decimal places - } - println("file name=${file.path} length=${file.length()}") - - - // Construct the JSON payload for our "buildComplete" event - def payloadBuilder = new groovy.json.JsonBuilder() - payloadBuilder buildTime: totalBuildTimeMs, - gradleTasks: startTaskNames, - apkFilePath: file.path, - apkSize: fileSizeInMB, - bitriseWorkflow: bitriseWorkflow, - bitriseApp: bitriseApp, - bitriseBranch: bitriseBranch, - bitriseBuildNumber: bitriseBuildNumber, - topTasks: top10 - - // Create the event payload. Change key/value in top 10 tasks to task/ms. - def payload = payloadBuilder.toString().replaceAll("\"key\"", "\"task\"").replaceAll("\"value\"", "\"ms\"") - - println("event payload: $payload") - - // Let's issue our curl command to emit our data - refProject.exec { - executable "curl" - args "-k", "https://http-inputs-inst.splunkcloud.com:443/services/collector", "-H", "Authorization: Splunk $splunkToken", - "-d", "{\"sourcetype\" : \"mobile-android-build\", \"event\" : $payload}" - } - - } - - @Override - void projectsEvaluated(Gradle gradle) {} - - @Override - void projectsLoaded(Gradle gradle) {} - - @Override - void settingsEvaluated(Settings settings) {} -} diff --git a/apps/flutter_parent/android/buildSrc/src/main/java/MergePrivateData.kt b/apps/flutter_parent/android/buildSrc/src/main/java/MergePrivateData.kt deleted file mode 100644 index d3e8e4d542..0000000000 --- a/apps/flutter_parent/android/buildSrc/src/main/java/MergePrivateData.kt +++ /dev/null @@ -1,99 +0,0 @@ -@file:Suppress("unused") - -import org.gradle.api.Project -import org.gradle.kotlin.dsl.extra -import java.io.File -import java.io.FileInputStream -import java.io.FileNotFoundException -import java.security.MessageDigest -import java.util.* - -object PrivateData { - - private const val PRINT_PAD_SIZE = 60 - - @JvmStatic - @JvmOverloads - fun merge(project: Project, dataDirName: String = "") { - - val baseDir = resolvePrivateDataDir(project.projectDir) - val dataDir = File(baseDir, dataDirName).canonicalFile - - println("") - println("============= MERGE PRIVATE FILES: ${dataDirName.toUpperCase()} ".padEnd(PRINT_PAD_SIZE, '=')) - - /* Confirm dir exists */ - if (!dataDir.exists() || !dataDir.isDirectory) { - failMerge("Unable to find private data source directory at ${dataDir.canonicalPath}. Please add private project files.") - } - - /* Confirm files list exists */ - val fileList = File(dataDir, "files.list") - if (!fileList.exists()) { - failMerge("Unable to find file list at ${fileList.canonicalPath}. Ensure private project files have been added.") - } - - /* Grab list of files */ - val props = Properties() - FileInputStream(fileList).use { props.load(it) } - - /* Copy files and properties */ - props.stringPropertyNames().forEach { srcName -> - val src = File(dataDir, srcName) - if (!src.exists() || !src.isFile) { - failMerge("Could not find source file at ${src.canonicalPath}") - } - - /* Merge private.properties */ - if (srcName == "private.properties") { - println("Merging private.properties:") - val privateProps = Properties() - FileInputStream(src).use { privateProps.load(it) } - privateProps.stringPropertyNames().forEach { propName -> - println(" $propName") - var value = privateProps.getProperty(propName) - if (value.startsWith("file:")) { - val fileName = value.replaceFirst("file:", "") - val file = File(dataDir, fileName) - if (!file.exists()) { - failMerge("Could not find source file ${file.canonicalPath} for '$propName' specified in private.properties") - } - value = file.readText() - } - val escaped = value.replace("\"", "\\\"").replace("[\n\r]", "") - project.extra.set(propName, escaped) - } - } else { - val dstPath = props.getProperty(srcName) - val dst = File(project.projectDir, dstPath) - - /* Make parent dir if necessary */ - val dstParent = dst.parentFile - if (!dstParent.exists()) dstParent.mkdirs() - - if (!dst.exists()) { - println("Copying ${src.canonicalPath} to $dst") - src.copyTo(dst, true) - } else if (!src.md5.contentEquals(dst.md5)) { - println("${dst.canonicalPath} differs from $src and will be replaced") - src.copyTo(dst, true) - } else { - println("${dst.canonicalPath} exists and is UP-TO-DATE") - } - } - } - - println("".padEnd(PRINT_PAD_SIZE, '=')) - println("") - } - - private fun failMerge(message: String): Nothing = throw Exception("Failed to merge private data. $message") - - private val File.md5 get() = MessageDigest.getInstance("MD5").digest(readBytes()) - - private tailrec fun resolvePrivateDataDir(srcDir: File?): File { - if (srcDir == null) throw FileNotFoundException("Could not locate private data directory!") - return srcDir.resolve("private-data").takeIf { it.exists() && it.isDirectory } - ?: resolvePrivateDataDir(srcDir.parentFile) - } -} diff --git a/apps/flutter_parent/android/gradle.properties b/apps/flutter_parent/android/gradle.properties deleted file mode 100644 index 41672498af..0000000000 --- a/apps/flutter_parent/android/gradle.properties +++ /dev/null @@ -1,4 +0,0 @@ -org.gradle.jvmargs=-Xmx1536M -android.useAndroidX=true -android.enableJetifier=true -android.enableR8=true \ No newline at end of file diff --git a/apps/flutter_parent/android/gradle/wrapper/gradle-wrapper.properties b/apps/flutter_parent/android/gradle/wrapper/gradle-wrapper.properties deleted file mode 100644 index 3c472b99c6..0000000000 --- a/apps/flutter_parent/android/gradle/wrapper/gradle-wrapper.properties +++ /dev/null @@ -1,5 +0,0 @@ -distributionBase=GRADLE_USER_HOME -distributionPath=wrapper/dists -zipStoreBase=GRADLE_USER_HOME -zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.5-all.zip diff --git a/apps/flutter_parent/android/settings.gradle b/apps/flutter_parent/android/settings.gradle deleted file mode 100644 index 5a2f14fb18..0000000000 --- a/apps/flutter_parent/android/settings.gradle +++ /dev/null @@ -1,15 +0,0 @@ -include ':app' - -def flutterProjectRoot = rootProject.projectDir.parentFile.toPath() - -def plugins = new Properties() -def pluginsFile = new File(flutterProjectRoot.toFile(), '.flutter-plugins') -if (pluginsFile.exists()) { - pluginsFile.withReader('UTF-8') { reader -> plugins.load(reader) } -} - -plugins.each { name, path -> - def pluginDirectory = flutterProjectRoot.resolve(path).resolve('android').toFile() - include ":$name" - project(":$name").projectDir = pluginDirectory -} diff --git a/apps/flutter_parent/android/settings_aar.gradle b/apps/flutter_parent/android/settings_aar.gradle deleted file mode 100644 index e7b4def49c..0000000000 --- a/apps/flutter_parent/android/settings_aar.gradle +++ /dev/null @@ -1 +0,0 @@ -include ':app' diff --git a/apps/flutter_parent/assets/fonts/CanvasIcons.ttf b/apps/flutter_parent/assets/fonts/CanvasIcons.ttf deleted file mode 100755 index 3076e8b693..0000000000 Binary files a/apps/flutter_parent/assets/fonts/CanvasIcons.ttf and /dev/null differ diff --git a/apps/flutter_parent/assets/fonts/CanvasIconsSolid.ttf b/apps/flutter_parent/assets/fonts/CanvasIconsSolid.ttf deleted file mode 100755 index 18af6d8ccd..0000000000 Binary files a/apps/flutter_parent/assets/fonts/CanvasIconsSolid.ttf and /dev/null differ diff --git a/apps/flutter_parent/assets/fonts/lato_regular.ttf b/apps/flutter_parent/assets/fonts/lato_regular.ttf deleted file mode 100644 index adbfc467d2..0000000000 Binary files a/apps/flutter_parent/assets/fonts/lato_regular.ttf and /dev/null differ diff --git a/apps/flutter_parent/assets/html/html_wrapper.html b/apps/flutter_parent/assets/html/html_wrapper.html deleted file mode 100644 index d0d1371132..0000000000 --- a/apps/flutter_parent/assets/html/html_wrapper.html +++ /dev/null @@ -1,104 +0,0 @@ - - - - - - - - - - -
- {CANVAS_CONTENT} -
- - - diff --git a/apps/flutter_parent/assets/png/locate-pairing-qr-tutorial.png b/apps/flutter_parent/assets/png/locate-pairing-qr-tutorial.png deleted file mode 100644 index 8eb1074f3a..0000000000 Binary files a/apps/flutter_parent/assets/png/locate-pairing-qr-tutorial.png and /dev/null differ diff --git a/apps/flutter_parent/assets/png/locate-qr-code-tutorial.png b/apps/flutter_parent/assets/png/locate-qr-code-tutorial.png deleted file mode 100644 index cefac1a565..0000000000 Binary files a/apps/flutter_parent/assets/png/locate-qr-code-tutorial.png and /dev/null differ diff --git a/apps/flutter_parent/assets/svg/bottom-nav/alerts-dark-selected.svg b/apps/flutter_parent/assets/svg/bottom-nav/alerts-dark-selected.svg deleted file mode 100644 index 78a30bd916..0000000000 --- a/apps/flutter_parent/assets/svg/bottom-nav/alerts-dark-selected.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/apps/flutter_parent/assets/svg/bottom-nav/alerts-dark.svg b/apps/flutter_parent/assets/svg/bottom-nav/alerts-dark.svg deleted file mode 100644 index 4857f12112..0000000000 --- a/apps/flutter_parent/assets/svg/bottom-nav/alerts-dark.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/apps/flutter_parent/assets/svg/bottom-nav/alerts-light-selected.svg b/apps/flutter_parent/assets/svg/bottom-nav/alerts-light-selected.svg deleted file mode 100644 index f5f6728969..0000000000 --- a/apps/flutter_parent/assets/svg/bottom-nav/alerts-light-selected.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/apps/flutter_parent/assets/svg/bottom-nav/alerts-light.svg b/apps/flutter_parent/assets/svg/bottom-nav/alerts-light.svg deleted file mode 100644 index 30ff4f70e0..0000000000 --- a/apps/flutter_parent/assets/svg/bottom-nav/alerts-light.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/apps/flutter_parent/assets/svg/bottom-nav/calendar-dark-selected.svg b/apps/flutter_parent/assets/svg/bottom-nav/calendar-dark-selected.svg deleted file mode 100644 index 40f776eb82..0000000000 --- a/apps/flutter_parent/assets/svg/bottom-nav/calendar-dark-selected.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/apps/flutter_parent/assets/svg/bottom-nav/calendar-dark.svg b/apps/flutter_parent/assets/svg/bottom-nav/calendar-dark.svg deleted file mode 100644 index 077c3ecd1c..0000000000 --- a/apps/flutter_parent/assets/svg/bottom-nav/calendar-dark.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/apps/flutter_parent/assets/svg/bottom-nav/calendar-light-selected.svg b/apps/flutter_parent/assets/svg/bottom-nav/calendar-light-selected.svg deleted file mode 100644 index 642d95e4af..0000000000 --- a/apps/flutter_parent/assets/svg/bottom-nav/calendar-light-selected.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/apps/flutter_parent/assets/svg/bottom-nav/calendar-light.svg b/apps/flutter_parent/assets/svg/bottom-nav/calendar-light.svg deleted file mode 100644 index 0e7c167fd7..0000000000 --- a/apps/flutter_parent/assets/svg/bottom-nav/calendar-light.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/apps/flutter_parent/assets/svg/bottom-nav/courses-dark-selected.svg b/apps/flutter_parent/assets/svg/bottom-nav/courses-dark-selected.svg deleted file mode 100644 index 0d3885c7c4..0000000000 --- a/apps/flutter_parent/assets/svg/bottom-nav/courses-dark-selected.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/apps/flutter_parent/assets/svg/bottom-nav/courses-dark.svg b/apps/flutter_parent/assets/svg/bottom-nav/courses-dark.svg deleted file mode 100644 index 7aadf6c76a..0000000000 --- a/apps/flutter_parent/assets/svg/bottom-nav/courses-dark.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/apps/flutter_parent/assets/svg/bottom-nav/courses-light-selected.svg b/apps/flutter_parent/assets/svg/bottom-nav/courses-light-selected.svg deleted file mode 100644 index 1d42ecbd99..0000000000 --- a/apps/flutter_parent/assets/svg/bottom-nav/courses-light-selected.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/apps/flutter_parent/assets/svg/bottom-nav/courses-light.svg b/apps/flutter_parent/assets/svg/bottom-nav/courses-light.svg deleted file mode 100644 index 14e008e469..0000000000 --- a/apps/flutter_parent/assets/svg/bottom-nav/courses-light.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/apps/flutter_parent/assets/svg/calendar-today.svg b/apps/flutter_parent/assets/svg/calendar-today.svg deleted file mode 100644 index 43f2fc14fd..0000000000 --- a/apps/flutter_parent/assets/svg/calendar-today.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/apps/flutter_parent/assets/svg/camera.svg b/apps/flutter_parent/assets/svg/camera.svg deleted file mode 100644 index 7f13b7e7fe..0000000000 --- a/apps/flutter_parent/assets/svg/camera.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/apps/flutter_parent/assets/svg/canvas-logo-student.svg b/apps/flutter_parent/assets/svg/canvas-logo-student.svg deleted file mode 100644 index c4f35a088d..0000000000 --- a/apps/flutter_parent/assets/svg/canvas-logo-student.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/apps/flutter_parent/assets/svg/canvas-logo-teacher.svg b/apps/flutter_parent/assets/svg/canvas-logo-teacher.svg deleted file mode 100644 index 6feed44b54..0000000000 --- a/apps/flutter_parent/assets/svg/canvas-logo-teacher.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/apps/flutter_parent/assets/svg/canvas-parent-login-logo-dark.svg b/apps/flutter_parent/assets/svg/canvas-parent-login-logo-dark.svg deleted file mode 100644 index 1d2bbdfd01..0000000000 --- a/apps/flutter_parent/assets/svg/canvas-parent-login-logo-dark.svg +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - - - - - - - - - diff --git a/apps/flutter_parent/assets/svg/canvas-parent-login-logo.svg b/apps/flutter_parent/assets/svg/canvas-parent-login-logo.svg deleted file mode 100644 index 5c8960eded..0000000000 --- a/apps/flutter_parent/assets/svg/canvas-parent-login-logo.svg +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - - - - - - - - - diff --git a/apps/flutter_parent/assets/svg/canvas-wordmark.svg b/apps/flutter_parent/assets/svg/canvas-wordmark.svg deleted file mode 100644 index 3cafd18b0b..0000000000 --- a/apps/flutter_parent/assets/svg/canvas-wordmark.svg +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/apps/flutter_parent/assets/svg/external-link.svg b/apps/flutter_parent/assets/svg/external-link.svg deleted file mode 100755 index f74e2c3d31..0000000000 --- a/apps/flutter_parent/assets/svg/external-link.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - diff --git a/apps/flutter_parent/assets/svg/eye_off.svg b/apps/flutter_parent/assets/svg/eye_off.svg deleted file mode 100755 index 4b17f5283c..0000000000 --- a/apps/flutter_parent/assets/svg/eye_off.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/apps/flutter_parent/assets/svg/ic_change_user.svg b/apps/flutter_parent/assets/svg/ic_change_user.svg deleted file mode 100644 index 64741a7840..0000000000 --- a/apps/flutter_parent/assets/svg/ic_change_user.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/apps/flutter_parent/assets/svg/ic_help.svg b/apps/flutter_parent/assets/svg/ic_help.svg deleted file mode 100644 index d742a38403..0000000000 --- a/apps/flutter_parent/assets/svg/ic_help.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/apps/flutter_parent/assets/svg/ic_inbox.svg b/apps/flutter_parent/assets/svg/ic_inbox.svg deleted file mode 100644 index 1f3f00aaec..0000000000 --- a/apps/flutter_parent/assets/svg/ic_inbox.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/apps/flutter_parent/assets/svg/ic_instructure_logo.svg b/apps/flutter_parent/assets/svg/ic_instructure_logo.svg deleted file mode 100644 index a1d7c3a8c1..0000000000 --- a/apps/flutter_parent/assets/svg/ic_instructure_logo.svg +++ /dev/null @@ -1,34 +0,0 @@ - - - - - - - - - - - - - - - - - - - diff --git a/apps/flutter_parent/assets/svg/ic_logout.svg b/apps/flutter_parent/assets/svg/ic_logout.svg deleted file mode 100644 index ea3aac62a0..0000000000 --- a/apps/flutter_parent/assets/svg/ic_logout.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/apps/flutter_parent/assets/svg/ic_manage_student.svg b/apps/flutter_parent/assets/svg/ic_manage_student.svg deleted file mode 100644 index fdcd984648..0000000000 --- a/apps/flutter_parent/assets/svg/ic_manage_student.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/apps/flutter_parent/assets/svg/ic_settings.svg b/apps/flutter_parent/assets/svg/ic_settings.svg deleted file mode 100644 index 1b36c1b330..0000000000 --- a/apps/flutter_parent/assets/svg/ic_settings.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/apps/flutter_parent/assets/svg/masquerade-red-panda.svg b/apps/flutter_parent/assets/svg/masquerade-red-panda.svg deleted file mode 100644 index e6ccd4f4f7..0000000000 --- a/apps/flutter_parent/assets/svg/masquerade-red-panda.svg +++ /dev/null @@ -1,34 +0,0 @@ - - - - red-panda - Created with Sketch. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/apps/flutter_parent/assets/svg/masquerade-white-panda.svg b/apps/flutter_parent/assets/svg/masquerade-white-panda.svg deleted file mode 100644 index 741aa693f3..0000000000 --- a/apps/flutter_parent/assets/svg/masquerade-white-panda.svg +++ /dev/null @@ -1,32 +0,0 @@ - - - - white-panda - Created with Sketch. - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/apps/flutter_parent/assets/svg/panda-book.svg b/apps/flutter_parent/assets/svg/panda-book.svg deleted file mode 100644 index 5b0a989079..0000000000 --- a/apps/flutter_parent/assets/svg/panda-book.svg +++ /dev/null @@ -1,29 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/apps/flutter_parent/assets/svg/panda-dark-mode.svg b/apps/flutter_parent/assets/svg/panda-dark-mode.svg deleted file mode 100644 index f38d46dff4..0000000000 --- a/apps/flutter_parent/assets/svg/panda-dark-mode.svg +++ /dev/null @@ -1,172 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/apps/flutter_parent/assets/svg/panda-inbox-zero.svg b/apps/flutter_parent/assets/svg/panda-inbox-zero.svg deleted file mode 100644 index cac540a65c..0000000000 --- a/apps/flutter_parent/assets/svg/panda-inbox-zero.svg +++ /dev/null @@ -1,46 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/apps/flutter_parent/assets/svg/panda-light-mode.svg b/apps/flutter_parent/assets/svg/panda-light-mode.svg deleted file mode 100644 index 53c4648b87..0000000000 --- a/apps/flutter_parent/assets/svg/panda-light-mode.svg +++ /dev/null @@ -1,154 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/apps/flutter_parent/assets/svg/panda-locked.svg b/apps/flutter_parent/assets/svg/panda-locked.svg deleted file mode 100644 index 752097bd02..0000000000 --- a/apps/flutter_parent/assets/svg/panda-locked.svg +++ /dev/null @@ -1,102 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/apps/flutter_parent/assets/svg/panda-manage-students.svg b/apps/flutter_parent/assets/svg/panda-manage-students.svg deleted file mode 100644 index 180f718011..0000000000 --- a/apps/flutter_parent/assets/svg/panda-manage-students.svg +++ /dev/null @@ -1,32 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/apps/flutter_parent/assets/svg/panda-no-alerts.svg b/apps/flutter_parent/assets/svg/panda-no-alerts.svg deleted file mode 100644 index 774bb85418..0000000000 --- a/apps/flutter_parent/assets/svg/panda-no-alerts.svg +++ /dev/null @@ -1,79 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/apps/flutter_parent/assets/svg/panda-no-events.svg b/apps/flutter_parent/assets/svg/panda-no-events.svg deleted file mode 100644 index 7cde730d8c..0000000000 --- a/apps/flutter_parent/assets/svg/panda-no-events.svg +++ /dev/null @@ -1,51 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/apps/flutter_parent/assets/svg/panda-no-pairing-code.svg b/apps/flutter_parent/assets/svg/panda-no-pairing-code.svg deleted file mode 100644 index c29609ba10..0000000000 --- a/apps/flutter_parent/assets/svg/panda-no-pairing-code.svg +++ /dev/null @@ -1,35 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/apps/flutter_parent/assets/svg/panda-not-supported.svg b/apps/flutter_parent/assets/svg/panda-not-supported.svg deleted file mode 100644 index a6a3491644..0000000000 --- a/apps/flutter_parent/assets/svg/panda-not-supported.svg +++ /dev/null @@ -1,27 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/apps/flutter_parent/assets/svg/panda-space-no-assignments.svg b/apps/flutter_parent/assets/svg/panda-space-no-assignments.svg deleted file mode 100644 index f4bfef9517..0000000000 --- a/apps/flutter_parent/assets/svg/panda-space-no-assignments.svg +++ /dev/null @@ -1,100 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/apps/flutter_parent/assets/svg/panda-under-construction.svg b/apps/flutter_parent/assets/svg/panda-under-construction.svg deleted file mode 100644 index a238e39ec7..0000000000 --- a/apps/flutter_parent/assets/svg/panda-under-construction.svg +++ /dev/null @@ -1,291 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/apps/flutter_parent/assets/svg/qr-code.svg b/apps/flutter_parent/assets/svg/qr-code.svg deleted file mode 100644 index 835f8a223f..0000000000 --- a/apps/flutter_parent/assets/svg/qr-code.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/apps/flutter_parent/flutter_parent_sdk_url b/apps/flutter_parent/flutter_parent_sdk_url deleted file mode 100644 index a717a27c2c..0000000000 --- a/apps/flutter_parent/flutter_parent_sdk_url +++ /dev/null @@ -1 +0,0 @@ -https://storage.googleapis.com/flutter_infra_release/releases/stable/linux/flutter_linux_3.13.2-stable.tar.xz \ No newline at end of file diff --git a/apps/flutter_parent/ios/Flutter/AppFrameworkInfo.plist b/apps/flutter_parent/ios/Flutter/AppFrameworkInfo.plist deleted file mode 100644 index 6b4c0f78a7..0000000000 --- a/apps/flutter_parent/ios/Flutter/AppFrameworkInfo.plist +++ /dev/null @@ -1,26 +0,0 @@ - - - - - CFBundleDevelopmentRegion - $(DEVELOPMENT_LANGUAGE) - CFBundleExecutable - App - CFBundleIdentifier - io.flutter.flutter.app - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - App - CFBundlePackageType - FMWK - CFBundleShortVersionString - 1.0 - CFBundleSignature - ???? - CFBundleVersion - 1.0 - MinimumOSVersion - 8.0 - - diff --git a/apps/flutter_parent/ios/Flutter/Debug.xcconfig b/apps/flutter_parent/ios/Flutter/Debug.xcconfig deleted file mode 100644 index e8efba1146..0000000000 --- a/apps/flutter_parent/ios/Flutter/Debug.xcconfig +++ /dev/null @@ -1,2 +0,0 @@ -#include "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig" -#include "Generated.xcconfig" diff --git a/apps/flutter_parent/ios/Flutter/Release.xcconfig b/apps/flutter_parent/ios/Flutter/Release.xcconfig deleted file mode 100644 index 399e9340e6..0000000000 --- a/apps/flutter_parent/ios/Flutter/Release.xcconfig +++ /dev/null @@ -1,2 +0,0 @@ -#include "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig" -#include "Generated.xcconfig" diff --git a/apps/flutter_parent/ios/Podfile b/apps/flutter_parent/ios/Podfile deleted file mode 100644 index e9286cbac1..0000000000 --- a/apps/flutter_parent/ios/Podfile +++ /dev/null @@ -1,74 +0,0 @@ -# Uncomment this line to define a global platform for your project -# platform :ios, '9.0' - -# CocoaPods analytics sends network stats synchronously affecting flutter build latency. -ENV['COCOAPODS_DISABLE_STATS'] = 'true' - -project 'Runner', { - 'Debug' => :debug, - 'Profile' => :release, - 'Release' => :release, -} - -def parse_KV_file(file, separator='=') - file_abs_path = File.expand_path(file) - if !File.exists? file_abs_path - return []; - end - pods_ary = [] - skip_line_start_symbols = ["#", "/"] - File.foreach(file_abs_path) { |line| - next if skip_line_start_symbols.any? { |symbol| line =~ /^\s*#{symbol}/ } - plugin = line.split(pattern=separator) - if plugin.length == 2 - podname = plugin[0].strip() - path = plugin[1].strip() - podpath = File.expand_path("#{path}", file_abs_path) - pods_ary.push({:name => podname, :path => podpath}); - else - puts "Invalid plugin specification: #{line}" - end - } - return pods_ary -end - -target 'Runner' do - use_frameworks! - - # Prepare symlinks folder. We use symlinks to avoid having Podfile.lock - # referring to absolute paths on developers' machines. - system('rm -rf .symlinks') - system('mkdir -p .symlinks/plugins') - - # Flutter Pods - generated_xcode_build_settings = parse_KV_file('./Flutter/Generated.xcconfig') - if generated_xcode_build_settings.empty? - puts "Generated.xcconfig must exist. If you're running pod install manually, make sure flutter pub get is executed first." - end - generated_xcode_build_settings.map { |p| - if p[:name] == 'FLUTTER_FRAMEWORK_DIR' - symlink = File.join('.symlinks', 'flutter') - File.symlink(File.dirname(p[:path]), symlink) - pod 'Flutter', :path => File.join(symlink, File.basename(p[:path])) - end - } - - # Plugin Pods - plugin_pods = parse_KV_file('../.flutter-plugins') - plugin_pods.map { |p| - symlink = File.join('.symlinks', 'plugins', p[:name]) - File.symlink(p[:path], symlink) - pod p[:name], :path => File.join(symlink, 'ios') - } -end - -# Prevent Cocoapods from embedding a second Flutter framework and causing an error with the new Xcode build system. -install! 'cocoapods', :disable_input_output_paths => true - -post_install do |installer| - installer.pods_project.targets.each do |target| - target.build_configurations.each do |config| - config.build_settings['ENABLE_BITCODE'] = 'NO' - end - end -end diff --git a/apps/flutter_parent/ios/Runner.xcodeproj/project.pbxproj b/apps/flutter_parent/ios/Runner.xcodeproj/project.pbxproj deleted file mode 100644 index 6662000cda..0000000000 --- a/apps/flutter_parent/ios/Runner.xcodeproj/project.pbxproj +++ /dev/null @@ -1,519 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 46; - objects = { - -/* Begin PBXBuildFile section */ - 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; - 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; - 3B80C3941E831B6300D905FE /* App.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3B80C3931E831B6300D905FE /* App.framework */; }; - 3B80C3951E831B6300D905FE /* App.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 3B80C3931E831B6300D905FE /* App.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; - 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; - 9705A1C61CF904A100538489 /* Flutter.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9740EEBA1CF902C7004384FC /* Flutter.framework */; }; - 9705A1C71CF904A300538489 /* Flutter.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 9740EEBA1CF902C7004384FC /* Flutter.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; - 9740EEB41CF90195004384FC /* Debug.xcconfig in Resources */ = {isa = PBXBuildFile; fileRef = 9740EEB21CF90195004384FC /* Debug.xcconfig */; }; - 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; - 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; - 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; -/* End PBXBuildFile section */ - -/* Begin PBXCopyFilesBuildPhase section */ - 9705A1C41CF9048500538489 /* Embed Frameworks */ = { - isa = PBXCopyFilesBuildPhase; - buildActionMask = 2147483647; - dstPath = ""; - dstSubfolderSpec = 10; - files = ( - 3B80C3951E831B6300D905FE /* App.framework in Embed Frameworks */, - 9705A1C71CF904A300538489 /* Flutter.framework in Embed Frameworks */, - ); - name = "Embed Frameworks"; - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXCopyFilesBuildPhase section */ - -/* Begin PBXFileReference section */ - 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; - 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; - 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; - 3B80C3931E831B6300D905FE /* App.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = App.framework; path = Flutter/App.framework; sourceTree = ""; }; - 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; - 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; - 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; - 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; }; - 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; }; - 9740EEBA1CF902C7004384FC /* Flutter.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Flutter.framework; path = Flutter/Flutter.framework; sourceTree = ""; }; - 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; }; - 97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; - 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; - 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; - 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - 97C146EB1CF9000F007C117D /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 9705A1C61CF904A100538489 /* Flutter.framework in Frameworks */, - 3B80C3941E831B6300D905FE /* App.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 9740EEB11CF90186004384FC /* Flutter */ = { - isa = PBXGroup; - children = ( - 3B80C3931E831B6300D905FE /* App.framework */, - 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */, - 9740EEBA1CF902C7004384FC /* Flutter.framework */, - 9740EEB21CF90195004384FC /* Debug.xcconfig */, - 7AFA3C8E1D35360C0083082E /* Release.xcconfig */, - 9740EEB31CF90195004384FC /* Generated.xcconfig */, - ); - name = Flutter; - sourceTree = ""; - }; - 97C146E51CF9000F007C117D = { - isa = PBXGroup; - children = ( - 9740EEB11CF90186004384FC /* Flutter */, - 97C146F01CF9000F007C117D /* Runner */, - 97C146EF1CF9000F007C117D /* Products */, - ); - sourceTree = ""; - }; - 97C146EF1CF9000F007C117D /* Products */ = { - isa = PBXGroup; - children = ( - 97C146EE1CF9000F007C117D /* Runner.app */, - ); - name = Products; - sourceTree = ""; - }; - 97C146F01CF9000F007C117D /* Runner */ = { - isa = PBXGroup; - children = ( - 97C146FA1CF9000F007C117D /* Main.storyboard */, - 97C146FD1CF9000F007C117D /* Assets.xcassets */, - 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */, - 97C147021CF9000F007C117D /* Info.plist */, - 97C146F11CF9000F007C117D /* Supporting Files */, - 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */, - 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */, - 74858FAE1ED2DC5600515810 /* AppDelegate.swift */, - 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */, - ); - path = Runner; - sourceTree = ""; - }; - 97C146F11CF9000F007C117D /* Supporting Files */ = { - isa = PBXGroup; - children = ( - ); - name = "Supporting Files"; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXNativeTarget section */ - 97C146ED1CF9000F007C117D /* Runner */ = { - isa = PBXNativeTarget; - buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; - buildPhases = ( - 9740EEB61CF901F6004384FC /* Run Script */, - 97C146EA1CF9000F007C117D /* Sources */, - 97C146EB1CF9000F007C117D /* Frameworks */, - 97C146EC1CF9000F007C117D /* Resources */, - 9705A1C41CF9048500538489 /* Embed Frameworks */, - 3B06AD1E1E4923F5004D2608 /* Thin Binary */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = Runner; - productName = Runner; - productReference = 97C146EE1CF9000F007C117D /* Runner.app */; - productType = "com.apple.product-type.application"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - 97C146E61CF9000F007C117D /* Project object */ = { - isa = PBXProject; - attributes = { - LastUpgradeCheck = 1020; - ORGANIZATIONNAME = "The Chromium Authors"; - TargetAttributes = { - 97C146ED1CF9000F007C117D = { - CreatedOnToolsVersion = 7.3.1; - LastSwiftMigration = 0910; - }; - }; - }; - buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */; - compatibilityVersion = "Xcode 3.2"; - developmentRegion = en; - hasScannedForEncodings = 0; - knownRegions = ( - en, - Base, - ); - mainGroup = 97C146E51CF9000F007C117D; - productRefGroup = 97C146EF1CF9000F007C117D /* Products */; - projectDirPath = ""; - projectRoot = ""; - targets = ( - 97C146ED1CF9000F007C117D /* Runner */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXResourcesBuildPhase section */ - 97C146EC1CF9000F007C117D /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */, - 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */, - 9740EEB41CF90195004384FC /* Debug.xcconfig in Resources */, - 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */, - 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXResourcesBuildPhase section */ - -/* Begin PBXShellScriptBuildPhase section */ - 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - name = "Thin Binary"; - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" thin"; - }; - 9740EEB61CF901F6004384FC /* Run Script */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - name = "Run Script"; - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; - }; -/* End PBXShellScriptBuildPhase section */ - -/* Begin PBXSourcesBuildPhase section */ - 97C146EA1CF9000F007C117D /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */, - 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin PBXVariantGroup section */ - 97C146FA1CF9000F007C117D /* Main.storyboard */ = { - isa = PBXVariantGroup; - children = ( - 97C146FB1CF9000F007C117D /* Base */, - ); - name = Main.storyboard; - sourceTree = ""; - }; - 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */ = { - isa = PBXVariantGroup; - children = ( - 97C147001CF9000F007C117D /* Base */, - ); - name = LaunchScreen.storyboard; - sourceTree = ""; - }; -/* End PBXVariantGroup section */ - -/* Begin XCBuildConfiguration section */ - 249021D3217E4FDB00AE95B9 /* Profile */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ANALYZER_NONNULL = YES; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - ENABLE_NS_ASSERTIONS = NO; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_NO_COMMON_BLOCKS = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - MTL_ENABLE_DEBUG_INFO = NO; - SDKROOT = iphoneos; - TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; - }; - name = Profile; - }; - 249021D4217E4FDB00AE95B9 /* Profile */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - CLANG_ENABLE_MODULES = YES; - CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; - ENABLE_BITCODE = NO; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/Flutter", - ); - INFOPLIST_FILE = Runner/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - LIBRARY_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/Flutter", - ); - PRODUCT_BUNDLE_IDENTIFIER = com.example.flutterParent; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; - SWIFT_VERSION = 4.0; - VERSIONING_SYSTEM = "apple-generic"; - }; - name = Profile; - }; - 97C147031CF9000F007C117D /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ANALYZER_NONNULL = YES; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = dwarf; - ENABLE_STRICT_OBJC_MSGSEND = YES; - ENABLE_TESTABILITY = YES; - GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_DYNAMIC_NO_PIC = NO; - GCC_NO_COMMON_BLOCKS = YES; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - MTL_ENABLE_DEBUG_INFO = YES; - ONLY_ACTIVE_ARCH = YES; - SDKROOT = iphoneos; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Debug; - }; - 97C147041CF9000F007C117D /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ANALYZER_NONNULL = YES; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - ENABLE_NS_ASSERTIONS = NO; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_NO_COMMON_BLOCKS = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - MTL_ENABLE_DEBUG_INFO = NO; - SDKROOT = iphoneos; - SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; - TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; - }; - name = Release; - }; - 97C147061CF9000F007C117D /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - CLANG_ENABLE_MODULES = YES; - CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; - ENABLE_BITCODE = NO; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/Flutter", - ); - INFOPLIST_FILE = Runner/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - LIBRARY_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/Flutter", - ); - PRODUCT_BUNDLE_IDENTIFIER = com.example.flutterParent; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - SWIFT_VERSION = 4.0; - VERSIONING_SYSTEM = "apple-generic"; - }; - name = Debug; - }; - 97C147071CF9000F007C117D /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - CLANG_ENABLE_MODULES = YES; - CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; - ENABLE_BITCODE = NO; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/Flutter", - ); - INFOPLIST_FILE = Runner/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - LIBRARY_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/Flutter", - ); - PRODUCT_BUNDLE_IDENTIFIER = com.example.flutterParent; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; - SWIFT_VERSION = 4.0; - VERSIONING_SYSTEM = "apple-generic"; - }; - name = Release; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 97C147031CF9000F007C117D /* Debug */, - 97C147041CF9000F007C117D /* Release */, - 249021D3217E4FDB00AE95B9 /* Profile */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 97C147061CF9000F007C117D /* Debug */, - 97C147071CF9000F007C117D /* Release */, - 249021D4217E4FDB00AE95B9 /* Profile */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - - }; - rootObject = 97C146E61CF9000F007C117D /* Project object */; -} diff --git a/apps/flutter_parent/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/apps/flutter_parent/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata deleted file mode 100644 index 1d526a16ed..0000000000 --- a/apps/flutter_parent/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata +++ /dev/null @@ -1,7 +0,0 @@ - - - - - diff --git a/apps/flutter_parent/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/apps/flutter_parent/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme deleted file mode 100644 index a28140cfdb..0000000000 --- a/apps/flutter_parent/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ /dev/null @@ -1,91 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/apps/flutter_parent/ios/Runner.xcworkspace/contents.xcworkspacedata b/apps/flutter_parent/ios/Runner.xcworkspace/contents.xcworkspacedata deleted file mode 100644 index 1d526a16ed..0000000000 --- a/apps/flutter_parent/ios/Runner.xcworkspace/contents.xcworkspacedata +++ /dev/null @@ -1,7 +0,0 @@ - - - - - diff --git a/apps/flutter_parent/ios/Runner/AppDelegate.swift b/apps/flutter_parent/ios/Runner/AppDelegate.swift deleted file mode 100644 index 70693e4a8c..0000000000 --- a/apps/flutter_parent/ios/Runner/AppDelegate.swift +++ /dev/null @@ -1,13 +0,0 @@ -import UIKit -import Flutter - -@UIApplicationMain -@objc class AppDelegate: FlutterAppDelegate { - override func application( - _ application: UIApplication, - didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? - ) -> Bool { - GeneratedPluginRegistrant.register(with: self) - return super.application(application, didFinishLaunchingWithOptions: launchOptions) - } -} diff --git a/apps/flutter_parent/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/apps/flutter_parent/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json deleted file mode 100644 index d36b1fab2d..0000000000 --- a/apps/flutter_parent/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json +++ /dev/null @@ -1,122 +0,0 @@ -{ - "images" : [ - { - "size" : "20x20", - "idiom" : "iphone", - "filename" : "Icon-App-20x20@2x.png", - "scale" : "2x" - }, - { - "size" : "20x20", - "idiom" : "iphone", - "filename" : "Icon-App-20x20@3x.png", - "scale" : "3x" - }, - { - "size" : "29x29", - "idiom" : "iphone", - "filename" : "Icon-App-29x29@1x.png", - "scale" : "1x" - }, - { - "size" : "29x29", - "idiom" : "iphone", - "filename" : "Icon-App-29x29@2x.png", - "scale" : "2x" - }, - { - "size" : "29x29", - "idiom" : "iphone", - "filename" : "Icon-App-29x29@3x.png", - "scale" : "3x" - }, - { - "size" : "40x40", - "idiom" : "iphone", - "filename" : "Icon-App-40x40@2x.png", - "scale" : "2x" - }, - { - "size" : "40x40", - "idiom" : "iphone", - "filename" : "Icon-App-40x40@3x.png", - "scale" : "3x" - }, - { - "size" : "60x60", - "idiom" : "iphone", - "filename" : "Icon-App-60x60@2x.png", - "scale" : "2x" - }, - { - "size" : "60x60", - "idiom" : "iphone", - "filename" : "Icon-App-60x60@3x.png", - "scale" : "3x" - }, - { - "size" : "20x20", - "idiom" : "ipad", - "filename" : "Icon-App-20x20@1x.png", - "scale" : "1x" - }, - { - "size" : "20x20", - "idiom" : "ipad", - "filename" : "Icon-App-20x20@2x.png", - "scale" : "2x" - }, - { - "size" : "29x29", - "idiom" : "ipad", - "filename" : "Icon-App-29x29@1x.png", - "scale" : "1x" - }, - { - "size" : "29x29", - "idiom" : "ipad", - "filename" : "Icon-App-29x29@2x.png", - "scale" : "2x" - }, - { - "size" : "40x40", - "idiom" : "ipad", - "filename" : "Icon-App-40x40@1x.png", - "scale" : "1x" - }, - { - "size" : "40x40", - "idiom" : "ipad", - "filename" : "Icon-App-40x40@2x.png", - "scale" : "2x" - }, - { - "size" : "76x76", - "idiom" : "ipad", - "filename" : "Icon-App-76x76@1x.png", - "scale" : "1x" - }, - { - "size" : "76x76", - "idiom" : "ipad", - "filename" : "Icon-App-76x76@2x.png", - "scale" : "2x" - }, - { - "size" : "83.5x83.5", - "idiom" : "ipad", - "filename" : "Icon-App-83.5x83.5@2x.png", - "scale" : "2x" - }, - { - "size" : "1024x1024", - "idiom" : "ios-marketing", - "filename" : "Icon-App-1024x1024@1x.png", - "scale" : "1x" - } - ], - "info" : { - "version" : 1, - "author" : "xcode" - } -} diff --git a/apps/flutter_parent/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png b/apps/flutter_parent/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png deleted file mode 100644 index dc9ada4725..0000000000 Binary files a/apps/flutter_parent/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png and /dev/null differ diff --git a/apps/flutter_parent/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png b/apps/flutter_parent/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png deleted file mode 100644 index 28c6bf0301..0000000000 Binary files a/apps/flutter_parent/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png and /dev/null differ diff --git a/apps/flutter_parent/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png b/apps/flutter_parent/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png deleted file mode 100644 index 2ccbfd967d..0000000000 Binary files a/apps/flutter_parent/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png and /dev/null differ diff --git a/apps/flutter_parent/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png b/apps/flutter_parent/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png deleted file mode 100644 index f091b6b0bc..0000000000 Binary files a/apps/flutter_parent/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png and /dev/null differ diff --git a/apps/flutter_parent/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png b/apps/flutter_parent/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png deleted file mode 100644 index 4cde12118d..0000000000 Binary files a/apps/flutter_parent/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png and /dev/null differ diff --git a/apps/flutter_parent/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png b/apps/flutter_parent/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png deleted file mode 100644 index d0ef06e7ed..0000000000 Binary files a/apps/flutter_parent/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png and /dev/null differ diff --git a/apps/flutter_parent/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png b/apps/flutter_parent/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png deleted file mode 100644 index dcdc2306c2..0000000000 Binary files a/apps/flutter_parent/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png and /dev/null differ diff --git a/apps/flutter_parent/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png b/apps/flutter_parent/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png deleted file mode 100644 index 2ccbfd967d..0000000000 Binary files a/apps/flutter_parent/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png and /dev/null differ diff --git a/apps/flutter_parent/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png b/apps/flutter_parent/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png deleted file mode 100644 index c8f9ed8f5c..0000000000 Binary files a/apps/flutter_parent/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png and /dev/null differ diff --git a/apps/flutter_parent/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png b/apps/flutter_parent/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png deleted file mode 100644 index a6d6b8609d..0000000000 Binary files a/apps/flutter_parent/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png and /dev/null differ diff --git a/apps/flutter_parent/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png b/apps/flutter_parent/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png deleted file mode 100644 index a6d6b8609d..0000000000 Binary files a/apps/flutter_parent/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png and /dev/null differ diff --git a/apps/flutter_parent/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png b/apps/flutter_parent/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png deleted file mode 100644 index 75b2d164a5..0000000000 Binary files a/apps/flutter_parent/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png and /dev/null differ diff --git a/apps/flutter_parent/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png b/apps/flutter_parent/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png deleted file mode 100644 index c4df70d39d..0000000000 Binary files a/apps/flutter_parent/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png and /dev/null differ diff --git a/apps/flutter_parent/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png b/apps/flutter_parent/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png deleted file mode 100644 index 6a84f41e14..0000000000 Binary files a/apps/flutter_parent/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png and /dev/null differ diff --git a/apps/flutter_parent/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png b/apps/flutter_parent/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png deleted file mode 100644 index d0e1f58536..0000000000 Binary files a/apps/flutter_parent/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png and /dev/null differ diff --git a/apps/flutter_parent/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json b/apps/flutter_parent/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json deleted file mode 100644 index 0bedcf2fd4..0000000000 --- a/apps/flutter_parent/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "images" : [ - { - "idiom" : "universal", - "filename" : "LaunchImage.png", - "scale" : "1x" - }, - { - "idiom" : "universal", - "filename" : "LaunchImage@2x.png", - "scale" : "2x" - }, - { - "idiom" : "universal", - "filename" : "LaunchImage@3x.png", - "scale" : "3x" - } - ], - "info" : { - "version" : 1, - "author" : "xcode" - } -} diff --git a/apps/flutter_parent/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png b/apps/flutter_parent/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png deleted file mode 100644 index 9da19eacad..0000000000 Binary files a/apps/flutter_parent/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png and /dev/null differ diff --git a/apps/flutter_parent/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png b/apps/flutter_parent/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png deleted file mode 100644 index 9da19eacad..0000000000 Binary files a/apps/flutter_parent/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png and /dev/null differ diff --git a/apps/flutter_parent/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png b/apps/flutter_parent/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png deleted file mode 100644 index 9da19eacad..0000000000 Binary files a/apps/flutter_parent/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png and /dev/null differ diff --git a/apps/flutter_parent/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md b/apps/flutter_parent/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md deleted file mode 100644 index 89c2725b70..0000000000 --- a/apps/flutter_parent/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md +++ /dev/null @@ -1,5 +0,0 @@ -# Launch Screen Assets - -You can customize the launch screen with your own desired assets by replacing the image files in this directory. - -You can also do it by opening your Flutter project's Xcode project with `open ios/Runner.xcworkspace`, selecting `Runner/Assets.xcassets` in the Project Navigator and dropping in the desired images. \ No newline at end of file diff --git a/apps/flutter_parent/ios/Runner/Base.lproj/LaunchScreen.storyboard b/apps/flutter_parent/ios/Runner/Base.lproj/LaunchScreen.storyboard deleted file mode 100644 index f2e259c7c9..0000000000 --- a/apps/flutter_parent/ios/Runner/Base.lproj/LaunchScreen.storyboard +++ /dev/null @@ -1,37 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/apps/flutter_parent/ios/Runner/Base.lproj/Main.storyboard b/apps/flutter_parent/ios/Runner/Base.lproj/Main.storyboard deleted file mode 100644 index f3c28516fb..0000000000 --- a/apps/flutter_parent/ios/Runner/Base.lproj/Main.storyboard +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/apps/flutter_parent/ios/Runner/Info.plist b/apps/flutter_parent/ios/Runner/Info.plist deleted file mode 100644 index 97bf7b46fb..0000000000 --- a/apps/flutter_parent/ios/Runner/Info.plist +++ /dev/null @@ -1,45 +0,0 @@ - - - - - CFBundleDevelopmentRegion - $(DEVELOPMENT_LANGUAGE) - CFBundleExecutable - $(EXECUTABLE_NAME) - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - flutter_parent - CFBundlePackageType - APPL - CFBundleShortVersionString - $(FLUTTER_BUILD_NAME) - CFBundleSignature - ???? - CFBundleVersion - $(FLUTTER_BUILD_NUMBER) - LSRequiresIPhoneOS - - UILaunchStoryboardName - LaunchScreen - UIMainStoryboardFile - Main - UISupportedInterfaceOrientations - - UIInterfaceOrientationPortrait - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight - - UISupportedInterfaceOrientations~ipad - - UIInterfaceOrientationPortrait - UIInterfaceOrientationPortraitUpsideDown - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight - - UIViewControllerBasedStatusBarAppearance - - - diff --git a/apps/flutter_parent/ios/Runner/Runner-Bridging-Header.h b/apps/flutter_parent/ios/Runner/Runner-Bridging-Header.h deleted file mode 100644 index 7335fdf900..0000000000 --- a/apps/flutter_parent/ios/Runner/Runner-Bridging-Header.h +++ /dev/null @@ -1 +0,0 @@ -#import "GeneratedPluginRegistrant.h" \ No newline at end of file diff --git a/apps/flutter_parent/lib/l10n/app_localizations.dart b/apps/flutter_parent/lib/l10n/app_localizations.dart deleted file mode 100644 index a99c173e18..0000000000 --- a/apps/flutter_parent/lib/l10n/app_localizations.dart +++ /dev/null @@ -1,1728 +0,0 @@ -// Copyright (C) 2019 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:collection/collection.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_parent/l10n/generated/messages_all.dart'; -import 'package:intl/intl.dart'; - -/// -/// Delegate for setting up locales. -/// -class _AppLocalizationsDelegate extends LocalizationsDelegate { - const _AppLocalizationsDelegate(); - - List get supportedLocales { - return const [ - // First so it's our fallback - Locale('en'), - - // Supported languages - Locale('ar'), - Locale('ca'), - Locale('cy'), // Not yet supported by flutter_localizations; 'en' fallback will be used for Material localizations - Locale('da'), - Locale('de'), - Locale('en', 'AU'), - Locale('en', 'CA'), - Locale('en', 'CY'), - Locale('en', 'GB'), - Locale('es'), - Locale('fi'), - // Country has to be first so it can be matched before the general language - Locale('fr', 'CA'), - Locale('fr'), - Locale('ht'), // Not yet supported by flutter_localizations; 'en' fallback will be used for Material localizations - Locale('is'), - Locale('it'), - Locale('ja'), - Locale('mi'), // Not yet supported by flutter_localizations; 'en' fallback will be used for Material localizations - Locale('nb'), - Locale('nl'), - Locale('pl'), - // Has to match translators naming (pt-PT instead of just pt) - Locale('pt', 'PT'), - Locale('pt', 'BR'), - Locale('ru'), - Locale('sl'), - Locale('sv'), - // Country has to be first so it can be matched before the general language. Also has to match translators naming (zh-HK instead of zh-Hant) - Locale('zh', 'HK'), - Locale('zh'), - - // Custom language packs - Locale.fromSubtags(languageCode: 'da', scriptCode: 'instk12'), - Locale.fromSubtags(languageCode: 'en', scriptCode: 'unimelb', countryCode: 'AU'), - Locale.fromSubtags(languageCode: 'en', scriptCode: 'instukhe', countryCode: 'GB'), - Locale.fromSubtags(languageCode: 'nb', scriptCode: 'instk12'), - Locale.fromSubtags(languageCode: 'sv', scriptCode: 'instk12'), - ]; - } - - @override - bool isSupported(Locale locale) => _isSupported(locale, true) != null; - - @override - Future load(Locale locale) => AppLocalizations._load(locale); - - @override - bool shouldReload(LocalizationsDelegate old) => false; - - LocaleResolutionCallback resolution({Locale? fallback, bool matchCountry = true}) { - return (Locale? locale, Iterable supported) { - return _resolve(locale, fallback, supported, matchCountry); - }; - } - - /// - /// Returns true if the specified locale is supported, false otherwise. - /// - Locale? _isSupported(Locale? locale, bool shouldMatchCountry) { - // Must match language code and script code. - // Must match country code if specified or will fall back to the generic language pack if we don't match country code. - // i.e., match a passed in 'zh-Hans' to the supported 'zh' if [matchCountry] is false - return supportedLocales.firstWhereOrNull((Locale supportedLocale) { - final matchLanguage = (supportedLocale.languageCode == locale?.languageCode); - final matchScript = (locale?.scriptCode == supportedLocale.scriptCode); - final matchCountry = (supportedLocale.countryCode == locale?.countryCode); - final matchCountryFallback = - (true != shouldMatchCountry && (supportedLocale.countryCode == null || supportedLocale.countryCode?.isEmpty == true)); - - return matchLanguage && matchScript && (matchCountry || matchCountryFallback); - }); - } - - /// - /// Internal method to resolve a locale from a list of locales. - /// - Locale? _resolve(Locale? locale, Locale? fallback, Iterable supported, bool matchCountry) { - if (locale == Locale('zh', 'Hant')) { - // Special case Traditional Chinese (server sends us zh-Hant but translators give us zh-HK) - locale = Locale('zh', 'HK'); - } else if (locale == Locale('pt')) { - // Special case base Portuguese (server sends us pt but translators give us pt-PT) - locale = Locale('pt', 'PT'); - } - - return _isSupported(locale, matchCountry) ?? fallback ?? supported.first; - } -} - -AppLocalizations L10n(BuildContext context) => Localizations.of(context, AppLocalizations) ?? AppLocalizations(); - -/// -/// App Localization class. -/// -/// This will hold all of the strings and reference the right resources depending on locale. -/// View the README for detailed instructions on usage. -/// -class AppLocalizations { - static Future _load(Locale locale) { - String localeName; - if (locale.countryCode == null && locale.scriptCode == null) { - localeName = locale.languageCode; - } else if (locale.scriptCode != null) { - final countryCode = locale.countryCode == null ? '' : '_${locale.countryCode}'; - localeName = '${locale.languageCode}${countryCode}_${locale.scriptCode}'; - } else { - localeName = locale.toString(); - } - - return initializeMessages(localeName).then((_) { - Intl.defaultLocale = localeName; - return new AppLocalizations(); - }); - } - - static const _AppLocalizationsDelegate delegate = _AppLocalizationsDelegate(); - - String get alertsLabel { - return Intl.message('Alerts', name: 'alertsLabel', desc: 'The label for the Alerts tab'); - } - - String get calendarLabel { - return Intl.message('Calendar', name: 'calendarLabel', desc: 'The label for the Calendar tab'); - } - - String get coursesLabel { - return Intl.message('Courses', name: 'coursesLabel', desc: 'The label for the Courses tab'); - } - - /// Dashboard - String get noStudents => - Intl.message('No Students', desc: 'Text for when an observer has no students they are observing'); - - String get tapToShowStudentSelector => Intl.message('Tap to show student selector', - desc: 'Semantics label for the area that will show the student selector when tapped'); - - String get tapToPairNewStudent => Intl.message('Tap to pair with a new student', - desc: 'Semantics label for the add student button in the student selector'); - - String get tapToSelectStudent => Intl.message('Tap to select this student', - desc: 'Semantics label on individual students in the student switcher'); - - /// Navigation Drawer - String get manageStudents => Intl.message('Manage Students', - desc: 'Label text for the Manage Students nav drawer button as well as the title for the Manage Students screen'); - - String get help => Intl.message('Help', desc: 'Label text for the help nav drawer button'); - - String get logOut => Intl.message('Log Out', desc: 'Label text for the Log Out nav drawer button'); - - String get switchUsers => Intl.message('Switch Users', desc: 'Label text for the Switch Users nav drawer button'); - - String appVersion(String version) => Intl.message('v. $version', - name: 'appVersion', args: [version], desc: 'App version shown in the navigation drawer'); - - String get logoutConfirmation => Intl.message( - 'Are you sure you want to log out?', - desc: 'Confirmation message displayed when the user tries to log out', - ); - - /// Plalendar - - String get calendars => Intl.message( - 'Calendars', - desc: 'Label for button that lets users select which calendars to display', - ); - - String nextMonth(String month) => Intl.message( - 'Next month: $month', - name: 'nextMonth', - args: [month], - desc: 'Label for the button that switches the calendar to the next month', - ); - - String previousMonth(String month) => Intl.message( - 'Previous month: $month', - name: 'previousMonth', - args: [month], - desc: 'Label for the button that switches the calendar to the previous month', - ); - - String nextWeek(String date) => Intl.message( - 'Next week starting $date', - name: 'nextWeek', - args: [date], - desc: 'Label for the button that switches the calendar to the next week', - ); - - String previousWeek(String date) => Intl.message( - 'Previous week starting $date', - name: 'previousWeek', - args: [date], - desc: 'Label for the button that switches the calendar to the previous week', - ); - - String selectedMonthLabel(String month) => Intl.message( - 'Month of $month', - name: 'selectedMonthLabel', - args: [month], - desc: 'Accessibility label for the button that expands/collapses the month view', - ); - - String get monthTapExpandHint => Intl.message( - 'expand', - desc: 'Accessibility label for the on-tap hint for the button that expands/collapses the month view', - ); - - String get monthTapCollapseHint => Intl.message( - 'collapse', - desc: 'Accessibility label for the on-tap hint for the button that expands/collapses the month view', - ); - - String pointsPossible(String points) => Intl.message( - '$points points possible', - name: 'pointsPossible', - args: [points], - desc: 'Screen reader label used for the points possible for an assignment, quiz, etc.', - ); - - String calendarDaySemanticsLabel(String date, int eventCount) => Intl.plural( - eventCount, - one: '$date, $eventCount event', - other: '$date, $eventCount events', - name: 'calendarDaySemanticsLabel', - args: [date, eventCount], - desc: 'Screen reader label used for calendar day, reads the date and count of events', - ); - - String get noEventsTitle => Intl.message( - 'No Events Today!', - desc: 'Title displayed when there are no calendar events for the current day', - ); - - String get noEventsMessage => Intl.message( - 'It looks like a great day to rest, relax, and recharge.', - desc: 'Message displayed when there are no calendar events for the current day', - ); - - String get errorLoadingEvents => Intl.message( - 'There was an error loading your student\'s calendar', - desc: 'Message displayed when calendar events could not be loaded for the current student', - ); - - String get calendarTapToFavoriteDesc => - Intl.message('Tap to favorite the courses you want to see on the Calendar. Select up to 10.', - desc: 'Description text on calendar filter screen.'); - - String get tooManyCalendarsError => Intl.message('You may only choose 10 calendars to display', - desc: 'Error text when trying to select more than 10 calendars'); - - String get minimumCalendarsError => Intl.message('You must select at least one calendar to display', - desc: 'Error text when trying to de-select all calendars'); - - String get plannerNote => Intl.message('Planner Note', desc: 'Label used for notes in the planner'); - - String get gotoTodayButtonLabel => - Intl.message('Go to today', desc: 'Accessibility label used for the today button in the planner'); - - /// Login landing screen - - String get previousLogins => Intl.message('Previous Logins', desc: 'Label for the list of previous user logins'); - - String get canvasLogoLabel { - return Intl.message('Canvas logo', name: 'canvasLogoLabel', desc: 'The semantics label for the Canvas logo'); - } - - String get findSchool => Intl.message( - 'Find School', - name: 'findSchool', - desc: 'Text for the find-my-school button', - ); - - String get findAnotherSchool => Intl.message( - 'Find another school', - name: 'findAnotherSchool', - desc: 'Text for the find-another-school button', - ); - - /// Domain search screen - - String get domainSearchInputHint => Intl.message( - 'Enter school name or district…', - name: 'domainSearchInputHint', - desc: 'Input hint for the text box on the domain search screen', - ); - - String noDomainResults(String query) => Intl.message( - 'Unable to find schools matching "$query"', - name: 'noDomainResults', - args: [query], - desc: 'Message shown to users when the domain search query did not return any results', - ); - - String get domainSearchHelpLabel => Intl.message( - 'How do I find my school or district?', - name: 'domainSearchHelpLabel', - desc: 'Label for the help button on the domain search screen', - ); - - String get canvasGuides => Intl.message( - 'Canvas Guides', - name: 'canvasGuides', - desc: - 'Proper name for the Canvas Guides. This will be used in the domainSearchHelpBody text and will be highlighted and clickable', - ); - - String get canvasSupport => Intl.message( - 'Canvas Support', - name: 'canvasSupport', - desc: - 'Proper name for Canvas Support. This will be used in the domainSearchHelpBody text and will be highlighted and clickable', - ); - - String domainSearchHelpBody(String canvasGuides, String canvasSupport) => Intl.message( - """Try searching for the name of the school or district you’re attempting to access, like “Smith Private School” or “Smith County Schools.” You can also enter a Canvas domain directly, like “smith.instructure.com.”\n\nFor more information on finding your institution’s Canvas account, you can visit the $canvasGuides, reach out to $canvasSupport, or contact your school for assistance.""", - name: 'domainSearchHelpBody', - desc: 'The body text shown in the help dialog on the domain search screen', - args: [canvasGuides, canvasSupport]); - - /// Crash screen - - String get crashScreenTitle => - Intl.message('Uh oh!', desc: 'Title of the screen that shows when a crash has occurred'); - - String get crashScreenMessage => - Intl.message('We’re not sure what happened, but it wasn’t good. Contact us if this keeps happening.', - desc: 'Message shown when a crash has occurred'); - - String get crashScreenContact => Intl.message('Contact Support', - desc: 'Label for the button that allows users to contact support after a crash has occurred'); - - String get crashScreenViewDetails => - Intl.message('View error details', desc: 'Label for the button that allowed users to view crash details'); - - String get crashScreenRestart => - Intl.message('Restart app', desc: 'Label for the button that will restart the entire application'); - - String get crashDetailsAppVersion => - Intl.message('Application version', desc: 'Label for the application version displayed in the crash details'); - - String get crashDetailsDeviceModel => - Intl.message('Device model', desc: 'Label for the device model displayed in the crash details'); - - String get crashDetailsAndroidVersion => Intl.message('Android OS version', - desc: 'Label for the Android operating system version displayed in the crash details'); - - String get crashDetailsFullMessage => - Intl.message('Full error message', desc: 'Label for the full error message displayed in the crash details'); - - /// Inbox - - String get inbox => Intl.message('Inbox', desc: 'Title for the Inbox screen'); - - String get errorLoadingMessages => Intl.message('There was an error loading your inbox messages.'); - - String get noSubject => Intl.message('No Subject', desc: 'Title used for inbox messages that have no subject'); - - String get errorFetchingCourses => - Intl.message('Unable to fetch courses. Please check your connection and try again.', - desc: 'Message shown when an error occured while loading courses'); - - String get messageChooseCourse => Intl.message('Choose a course to message', - desc: 'Header in the course list shown when the user is choosing which course to associate with a new message'); - - String get emptyInboxTitle => - Intl.message('Inbox Zero', desc: 'Title of the message shown when there are no inbox messages'); - - String get emptyInboxSubtitle => - Intl.message('You’re all caught up!', desc: 'Subtitle of the message shown when there are no inbox messages'); - - /// Create Conversation - - String get errorLoadingRecipients => Intl.message('There was an error loading recipients for this course', - desc: 'Message shown when attempting to create a new message but the recipients list failed to load'); - - String get errorSendingMessage => Intl.message('Unable to send message. Check your connection and try again.', - desc: 'Message show when there was an error creating or sending a new message'); - - String get unsavedChangesDialogTitle => Intl.message('Unsaved changes', - desc: 'Title of the dialog shown when the user tries to leave with unsaved changes'); - - String get unsavedChangesDialogBody => - Intl.message('Are you sure you wish to close this page? Your unsent message will be lost.', - desc: 'Body text of the dialog shown when the user tries leave with unsaved changes'); - - String get newMessageTitle => Intl.message('New message', desc: 'Title of the new-message screen'); - - String get addAttachment => - Intl.message('Add attachment', desc: 'Tooltip for the add-attachment button in the new-message screen'); - - String get sendMessage => - Intl.message('Send message', desc: 'Tooltip for the send-message button in the new-message screen'); - - String get selectRecipients => - Intl.message('Select recipients', desc: 'Tooltip for the button that allows users to select message recipients'); - - String get noRecipientsSelected => Intl.message('No recipients selected', - desc: 'Hint displayed when the user has not selected any message recipients'); - - String get messageSubjectInputHint => - Intl.message('Message subject', desc: 'Hint text displayed in the input field for the message subject'); - - String get messageBodyInputHint => - Intl.message('Message', desc: 'Hint text displayed in the input field for the message body'); - - String get recipients => Intl.message('Recipients', desc: 'Label for message recipients'); - - String plusRecipientCount(int count) => Intl.message( - '+$count', - desc: 'Shows the number of recipients that are selected but not displayed on screen.', - name: 'plusRecipientCount', - args: [count], - examples: const {'count': 5}, - ); - - String get attachmentFailed => Intl.message('Failed. Tap for options.', - desc: 'Short message shown on a message attachment when uploading has failed'); - - String courseForWhom(String studentShortName) => Intl.message( - 'for $studentShortName', - desc: 'Describes for whom a course is for (i.e. for Bill)', - args: [studentShortName], - name: 'courseForWhom', - ); - - String messageLinkPostscript(String studentName, String linkUrl) => Intl.message( - 'Regarding: $studentName, $linkUrl', - desc: - 'A postscript appended to new messages that clarifies which student is the subject of the message and also includes a URL for the related Canvas component (course, assignment, event, etc).', - args: [studentName, linkUrl], - name: 'messageLinkPostscript', - ); - - /// View conversation - - String get errorLoadingConversation => Intl.message('There was an error loading this conversation', - desc: 'Message shown when a conversation fails to load'); - - String get reply => Intl.message('Reply', desc: 'Button label for replying to a conversation'); - - String get replyAll => Intl.message('Reply All', desc: 'Button label for replying to all conversation participants'); - - String get unknownUser => Intl.message('Unknown User', desc: 'Label used where the user name is not known'); - - String get userNameMe => Intl.message( - 'me', - desc: - 'First-person pronoun (i.e. \'me\') that will be used in message author info, e.g. \'Me to 4 others\' or \'Jon Snow to me\'', - ); - - String authorToRecipient(String authorName, String recipientName) { - return Intl.message( - '$authorName to $recipientName', - args: [authorName, recipientName], - name: 'authorToRecipient', - desc: 'Author info for a single-recipient message; includes both the author name and the recipient name.', - ); - } - - String authorToNOthers(String authorName, int howMany) { - return Intl.plural( - howMany, - one: '$authorName to 1 other', - other: '$authorName to $howMany others', - args: [authorName, howMany], - name: 'authorToNOthers', - desc: 'Author info for a mutli-recipient message; includes the author name and the number of recipients', - ); - } - - String authorToRecipientAndNOthers(String authorName, String recipientName, int howMany) { - return Intl.plural( - howMany, - one: '$authorName to $recipientName & 1 other', - other: '$authorName to $recipientName & $howMany others', - args: [authorName, recipientName, howMany], - name: 'authorToRecipientAndNOthers', - desc: - 'Author info for a multi-recipient message; includes the author name, one recipient name, and the number of other recipients', - ); - } - - /// Viewing attachments - - String get download => Intl.message('Download', desc: 'Label for the button that will begin downloading a file'); - - String get openFileExternally => Intl.message('Open with another app', - desc: 'Label for the button that will allow users to open a file with another app'); - - String get noApplicationsToHandleFile => Intl.message('There are no installed applications that can open this file'); - - String get unsupportedFileTitle => Intl.message('Unsupported File'); - - String get unsupportedFileMessage => Intl.message('This file is unsupported and can’t be viewed through the app'); - - String get errorPlayingMedia => Intl.message( - 'Unable to play this media file', - desc: 'Message shown when audio or video media could not be played', - ); - - String get errorLoadingImage => Intl.message( - 'Unable to load this image', - desc: 'Message shown when an image file could not be loaded or displayed', - ); - - String get errorLoadingFile => Intl.message( - 'There was an error loading this file', - desc: 'Message shown when a file could not be loaded or displayed', - ); - - /// Courses Screen - - String get noCoursesTitle => Intl.message('No Courses', desc: 'Title for having no courses'); - - String get noCoursesMessage => - Intl.message('Your student\’s courses might not be published yet.', desc: 'Message for having no courses'); - - String get errorLoadingCourses => Intl.message( - 'There was an error loading your student\’s courses.', - desc: 'Message displayed when the list of student courses could not be loaded', - ); - - String get noGrade => Intl.message( - 'No Grade', - desc: 'Message shown when there is currently no grade available for a course', - ); - - /// Course Details Screen - - String get filterBy => Intl.message('Filter by', desc: 'Title for list of terms to filter grades by'); - - String get courseGradesLabel => Intl.message( - 'Grades', - desc: 'Label for the "Grades" tab in course details', - ); - - String get courseSyllabusLabel => Intl.message( - 'Syllabus', - desc: 'Label for the "Syllabus" tab in course details', - ); - - String get courseFrontPageLabel => Intl.message( - 'Front Page', - desc: 'Label for the "Front Page" tab in course details', - ); - - String get courseSummaryLabel => Intl.message( - 'Summary', - desc: 'Label for the "Summary" tab in course details', - ); - - String get courseMessageHint => Intl.message( - 'Send a message about this course', - desc: 'Accessibility hint for the course messaage floating action button', - ); - - String get courseTotalGradeLabel => Intl.message( - 'Total Grade', - desc: 'Label for the total grade in the course', - ); - - String get assignmentGradedLabel => Intl.message( - 'Graded', - desc: 'Label for assignments that have been graded', - ); - - String get assignmentSubmittedLabel => Intl.message( - 'Submitted', - desc: 'Label for assignments that have been submitted', - ); - - String get assignmentNotSubmittedLabel => Intl.message( - 'Not Submitted', - desc: 'Label for assignments that have not been submitted', - ); - - String get assignmentLateSubmittedLabel => Intl.message( - 'Late', - desc: 'Label for assignments that have been marked late or submitted late', - ); - - String get assignmentMissingSubmittedLabel => Intl.message( - 'Missing', - desc: 'Label for assignments that have been marked missing or are not submitted and past the due date', - ); - - String get assignmentNoScore => Intl.message( - '-', - desc: 'Value representing no score for student submission', - ); - - String get allGradingPeriods => Intl.message( - 'All Grading Periods', - desc: 'Label for selecting all grading periods', - ); - - String get noAssignmentsTitle => Intl.message( - 'No Assignments', - desc: 'Title for the no assignments message', - ); - - String get noAssignmentsMessage => Intl.message( - 'It looks like assignments haven\'t been created in this space yet.', - desc: 'Message for no assignments', - ); - - String get errorLoadingCourseSummary => Intl.message( - 'There was an error loading the summary details for this course.', - desc: 'Message shown when the course summary could not be loaded', - ); - - String get noCourseSummaryTitle => Intl.message( - 'No Summary', - desc: 'Title displayed when there are no items in the course summary', - ); - - String get noCourseSummaryMessage => Intl.message( - 'This course does not have any assignments or calendar events yet.', - desc: 'Message displayed when there are no items in the course summary', - ); - - String gradeFormatScoreOutOfPointsPossible(String score, String pointsPossible) => Intl.message( - '${score} / ${pointsPossible}', - desc: 'Formatted string for a student score out of the points possible', - name: 'gradeFormatScoreOutOfPointsPossible', - args: [score, pointsPossible], - ); - - String contentDescriptionScoreOutOfPointsPossible(String score, String pointsPossible) => Intl.message( - '${score} out of ${pointsPossible} points', - desc: 'Formatted string for a student score out of the points possible', - name: 'contentDescriptionScoreOutOfPointsPossible', - args: [score, pointsPossible], - ); - - String gradesSubjectMessage(String studentName) => Intl.message( - 'Regarding: $studentName, Grades', - desc: 'The subject line for a message to a teacher regarding a student\'s grades', - name: 'gradesSubjectMessage', - args: [studentName], - ); - - String syllabusSubjectMessage(String studentName) => Intl.message( - 'Regarding: $studentName, Syllabus', - desc: 'The subject line for a message to a teacher regarding a course syllabus', - name: 'syllabusSubjectMessage', - args: [studentName], - ); - - String frontPageSubjectMessage(String studentName) => Intl.message( - 'Regarding: $studentName, Front Page', - desc: 'The subject line for a message to a teacher regarding a course front page', - name: 'frontPageSubjectMessage', - args: [studentName], - ); - - String assignmentSubjectMessage(String studentName, String assignmentName) => Intl.message( - 'Regarding: $studentName, Assignment - $assignmentName', - desc: 'The subject line for a message to a teacher regarding a student\'s assignment', - name: 'assignmentSubjectMessage', - args: [studentName, assignmentName], - ); - - String eventSubjectMessage(String studentName, String eventTitle) => Intl.message( - 'Regarding: $studentName, Event - $eventTitle', - desc: 'The subject line for a message to a teacher regarding a calendar event', - name: 'eventSubjectMessage', - args: [studentName, eventTitle], - ); - - String get noPageFound => Intl.message( - 'There is no page information available.', - desc: 'Description for when no page information is available', - ); - - /// Assignment Details Screen - - String get assignmentDetailsTitle => - Intl.message('Assignment Details', desc: 'Title for the page that shows details for an assignment'); - - String assignmentTotalPoints(String points) => Intl.message( - '$points pts', - name: 'assignmentTotalPoints', - args: [points], - desc: 'Label used for the total points the assignment is worth', - ); - - String assignmentTotalPointsAccessible(String points) => Intl.message( - '$points points', - name: 'assignmentTotalPointsAccessible', - args: [points], - desc: 'Screen reader label used for the total points the assignment is worth', - ); - - String get assignmentDueLabel => Intl.message('Due', desc: 'Label for an assignment due date'); - - String get assignmentGradeLabel => Intl.message( - 'Grade', - desc: 'Label for the section that displays an assignment\'s grade', - ); - - String get assignmentLockLabel => Intl.message('Locked', desc: 'Label for when an assignment is locked'); - - String assignmentLockedModule(String moduleName) => Intl.message( - 'This assignment is locked by the module \"$moduleName\".', - name: 'assignmentLockedModule', - args: [moduleName], - desc: 'The locked description when an assignment is locked by a module', - ); - - String get assignmentRemindMeLabel => Intl.message('Remind Me', desc: 'Label for the row to set reminders'); - - String get assignmentRemindMeDescription => - Intl.message('Set a date and time to be notified of this specific assignment.', - desc: 'Description for row to set reminders'); - - String get assignmentRemindMeSet => - Intl.message('You will be notified about this assignment on…', desc: 'Description for when a reminder is set'); - - String get assignmentInstructionsLabel => - Intl.message('Instructions', desc: 'Label for the description of the assignment when it has quiz instructions'); - - String get assignmentMessageHint => Intl.message( - 'Send a message about this assignment', - desc: 'Accessibility hint for the assignment messaage floating action button', - ); - - /// Web Login Screen - - String get domainVerificationErrorGeneral => Intl.message( - 'This app is not authorized for use.', - desc: 'The error shown when the app being used is not verified by Canvas', - ); - - String get domainVerificationErrorDomain => Intl.message( - 'The server you entered is not authorized for this app.', - desc: 'The error shown when the desired login domain is not verified by Canvas', - ); - - String get domainVerificationErrorUserAgent => Intl.message( - 'The user agent for this app is not authorized.', - desc: 'The error shown when the user agent during verification is not verified by Canvas', - ); - - String get domainVerificationErrorUnknown => Intl.message( - 'We were unable to verify the server for use with this app.', - desc: 'The generic error shown when we are unable to verify with Canvas', - ); - - // Skip non translatable (support only) - String get skipMobileVerifyTitle => Intl.message( - 'Skipping Mobile Verify…', - skip: true, - ); - - // Skip non translatable (support only) - String get skipMobileVerifyProtocol => Intl.message( - 'https', - skip: true, - ); - - // Skip non translatable (support only) - String get skipMobileVerifyProtocolMissing => Intl.message( - 'Must provide a protocol', - skip: true, - ); - - // Skip non translatable (support only) - String get skipMobileVerifyClientId => Intl.message( - 'Client Id', - skip: true, - ); - - // Skip non translatable (support only) - String get skipMobileVerifyClientIdMissing => Intl.message( - 'Must provide a client id', - skip: true, - ); - - // Skip non translatable (support only) - String get skipMobileVerifyClientSecret => Intl.message( - 'Client Secret', - skip: true, - ); - - // Skip non translatable (support only) - String get skipMobileVerifyClientSecretMissing => Intl.message( - 'Must provide a client secret', - skip: true, - ); - - /// Reminders - - String get remindersNotificationChannelName => Intl.message( - 'Reminders', - desc: 'Name of the system notification channel for assignment and event reminders', - ); - - String get remindersNotificationChannelDescription => Intl.message( - 'Notifications for reminders about assignments and calendar events', - desc: 'Description of the system notification channel for assignment and event reminders', - ); - - String get oldReminderMessageTitle => Intl.message( - 'Reminders have changed!', - desc: 'Title of the dialog shown when the user needs to update their reminders', - ); - - String get oldReminderMessage => Intl.message( - 'In order to provide you with a better experience, we have updated how reminders work. You can add new reminders by viewing an assignment or calendar event and tapping the switch under the "Remind Me" section.\n\nBe aware that any reminders created with older versions of this app will not be compatible with the new changes and you will need to create them again.', - ); - - /// Not-A-Parent screen - - String get notAParentTitle => Intl.message('Not a parent?', - desc: 'Title for the screen that shows when the user is not observing any students'); - - String get notAParentSubtitle => Intl.message('We couldn\'t find any students associated with this account', - desc: 'Subtitle for the screen that shows when the user is not observing any students'); - - String get studentOrTeacherTitle => Intl.message('Are you a student or teacher?', - desc: 'Label for button that will show users the option to view other Canvas apps in the Play Store'); - - String get studentOrTeacherSubtitle => - Intl.message('One of our other apps might be a better fit. Tap one to visit the Play Store.', - desc: 'Description of options to view other Canvas apps in the Play Store'); - - String get returnToLogin => - Intl.message('Return to Login', desc: 'Label for the button that returns the user to the login screen'); - - String get studentApp => Intl.message('STUDENT', - desc: - 'The "student" portion of the "Canvas Student" app name, in all caps. "Canvas" is excluded in this context as it will be displayed to the user as a wordmark image'); - - String get teacherApp => Intl.message('TEACHER', - desc: - 'The "teacher" portion of the "Canvas Teacher" app name, in all caps. "Canvas" is excluded in this context as it will be displayed to the user as a wordmark image'); - - String get canvasStudentApp => Intl.message('Canvas Student', - desc: - 'The name of the Canvas Student app. Only "Student" should be translated as "Canvas" is a brand name in this context and should not be translated.'); - - String get canvasTeacherApp => Intl.message('Canvas Teacher', - desc: - 'The name of the Canvas Teacher app. Only "Teacher" should be translated as "Canvas" is a brand name in this context and should not be translated.'); - - /// Alerts Screen - - String get noAlertsTitle => Intl.message( - 'No Alerts', - desc: 'The title for the empty message to show to users when there are no alerts for the student.', - ); - - String get noAlertsMessage => Intl.message( - 'There’s nothing to be notified of yet.', - desc: 'The empty message to show to users when there are no alerts for the student.', - ); - - String dismissAlertLabel(String alertTitle) => Intl.message( - 'Dismiss $alertTitle', - name: 'dismissAlertLabel', - args: [alertTitle], - desc: 'Accessibility label to dismiss an alert', - ); - - String get courseAnnouncement => Intl.message( - 'Course Announcement', - desc: 'Title for alerts when there is a course announcement', - ); - - String get globalAnnouncement => Intl.message( - 'Global Announcement', - desc: 'Title for alerts when there is a global announcement', - ); - - String assignmentGradeAboveThreshold(String threshold) => Intl.message( - 'Assignment Grade Above $threshold', - name: 'assignmentGradeAboveThreshold', - args: [threshold], - desc: 'Title for alerts when an assignment grade is above the threshold value', - ); - - String assignmentGradeBelowThreshold(String threshold) => Intl.message( - 'Assignment Grade Below $threshold', - name: 'assignmentGradeBelowThreshold', - args: [threshold], - desc: 'Title for alerts when an assignment grade is below the threshold value', - ); - - String courseGradeAboveThreshold(String threshold) => Intl.message( - 'Course Grade Above $threshold', - name: 'courseGradeAboveThreshold', - args: [threshold], - desc: 'Title for alerts when a course grade is above the threshold value', - ); - - String courseGradeBelowThreshold(String threshold) => Intl.message( - 'Course Grade Below $threshold', - name: 'courseGradeBelowThreshold', - args: [threshold], - desc: 'Title for alerts when a course grade is below the threshold value', - ); - - /// Settings screen - - String get settings => Intl.message('Settings', desc: 'Title for the settings screen'); - - String get theme => Intl.message('Theme', desc: 'Label for the light/dark theme section in the settings page'); - - String get darkModeLabel => Intl.message('Dark Mode', desc: 'Label for the button that enables dark mode'); - - String get lightModeLabel => Intl.message('Light Mode', desc: 'Label for the button that enables light mode'); - - String get highContrastLabel => - Intl.message('High Contrast Mode', desc: 'Label for the switch that toggles high contrast mode'); - - String get webViewDarkModeLabel => - Intl.message('Use Dark Theme in Web Content', desc: 'Label for the switch that toggles dark mode for webviews'); - - String get appearance => Intl.message('Appearance', desc: 'Label for the appearance section in the settings page'); - - /// Grade cell - - String get submissionStatusSuccessTitle => Intl.message('Successfully submitted!', - desc: 'Title displayed in the grade cell for an assignment that has been submitted'); - - String submissionStatusSuccessSubtitle(String date, String time) { - return Intl.message( - 'This assignment was submitted on $date at $time and is waiting to be graded', - desc: 'Subtitle displayed in the grade cell for an assignment that has been submitted and is awaiting a grade', - args: [date, time], - name: 'submissionStatusSuccessSubtitle', - ); - } - - String outOfPoints(String points, num howMany) => Intl.plural( - howMany, - one: 'Out of 1 point', - other: 'Out of $points points', - desc: 'Description for an assignment grade that has points without a current scoroe', - args: [points, howMany], - name: 'outOfPoints', - precision: 2, - ); - - String get excused => Intl.message('Excused', desc: 'Grading status for an assignment marked as excused'); - - String get gradeComplete => Intl.message('Complete', desc: 'Grading status for an assignment marked as complete'); - - String get gradeIncomplete => Intl.message( - 'Incomplete', - desc: 'Grading status for an assignment marked as incomplete', - ); - - String get accessibilityMinus => Intl.message( - 'minus', - desc: 'Screen reader-friendly replacement for the "-" character in letter grades like "A-"', - ); - - String yourGrade(String pointsAchieved) => Intl.message( - 'Your grade: $pointsAchieved', - desc: 'Text displayed when a late penalty has been applied to the assignment, this is the achieved score without the penalty', - args: [pointsAchieved], - name: 'yourGrade', - ); - - String latePenaltyUpdated(String pointsLost) => Intl.message( - 'Late Penalty: -$pointsLost pts', - desc: 'Text displayed when a late penalty has been applied to the assignment', - args: [pointsLost], - name: 'latePenaltyUpdated', - ); - - String finalGrade(String grade) => Intl.message( - 'Final Grade: $grade', - desc: 'Text that displays the final grade of an assignment', - args: [grade], - name: 'finalGrade', - ); - - /// Alert Thresholds Screen - String get alertSettings => Intl.message('Alert Settings'); - - String get alertMeWhen => Intl.message('Alert me when…', - desc: - 'Header for the screen where the observer chooses the thresholds that will determine when they receive alerts (e.g. when an assignment is graded below 70%)'); - - String get courseGradeBelow => Intl.message('Course grade below', - desc: 'Label describing the threshold for when the course grade is below a certain percentage'); - - String get courseGradeAbove => Intl.message('Course grade above', - desc: 'Label describing the threshold for when the course grade is above a certain percentage'); - - String get assignmentMissing => Intl.message('Assignment missing'); - - String get assignmentGradeBelow => Intl.message('Assignment grade below', - desc: 'Label describing the threshold for when an assignment is graded below a certain percentage'); - - String get assignmentGradeAbove => Intl.message('Assignment grade above', - desc: 'Label describing the threshold for when an assignment is graded above a certain percentage'); - - String get courseAnnouncements => Intl.message('Course Announcements'); - - String get globalAnnouncements => Intl.message('Global Announcements'); - - String get never => Intl.message('Never', - desc: 'Indication that tells the user they will not receive alert notifications of a specific kind'); - - String get gradePercentage => Intl.message('Grade percentage'); - - String get alertThresholdsLoadingError => Intl.message('There was an error loading your student\'s alerts.'); - - String get mustBeBelow100 => Intl.message('Must be below 100'); - - String mustBeBelowN(int percentage) => Intl.message( - 'Must be below $percentage', - desc: 'Validation error to the user that they must choose a percentage below \'n\'', - args: [percentage], - name: 'mustBeBelowN', - examples: const {'percentage': 5}, - ); - - String mustBeAboveN(int percentage) => Intl.message( - 'Must be above $percentage', - desc: 'Validation error to the user that they must choose a percentage above \'n\'', - args: [percentage], - name: 'mustBeAboveN', - examples: const {'percentage': 5}, - ); - - /// Student color picker - - String get selectStudentColor => Intl.message( - 'Select Student Color', - desc: 'Title for screen that allows users to assign a color to a specific student', - ); - - String get colorElectric => Intl.message('Electric, blue', desc: 'Name of the Electric (blue) color'); - - String get colorPlum => Intl.message('Plum, Purple', desc: 'Name of the Plum (purple) color'); - - String get colorBarney => Intl.message('Barney, Fuschia', desc: 'Name of the Barney (fuschia) color'); - - String get colorRaspberry => Intl.message('Raspberry, Red', desc: 'Name of the Raspberry (red) color'); - - String get colorFire => Intl.message('Fire, Orange', desc: 'Name of the Fire (orange) color'); - - String get colorShamrock => Intl.message('Shamrock, Green', desc: 'Name of the Shamrock (green) color'); - - String get errorSavingColor => Intl.message('An error occurred while saving your selection. Please try again.'); - - String changeStudentColorLabel(String studentName) => Intl.message( - 'Change color for $studentName', - name: 'changeStudentColorLabel', - args: [studentName], - desc: 'Accessibility label for the button that lets users change the color associated with a specific student', - ); - - /// Enrollment types - - String get enrollmentTypeTeacher => Intl.message('Teacher', desc: 'Label for the Teacher enrollment type'); - - String get enrollmentTypeStudent => Intl.message('Student', desc: 'Label for the Student enrollment type'); - - String get enrollmentTypeTA => Intl.message('TA', - desc: - 'Label for the Teaching Assistant enrollment type (also known as Teacher Aid or Education Assistant), reduced to a short acronym/initialism if appropriate.'); - - String get enrollmentTypeObserver => Intl.message('Observer', desc: 'Label for the Observer enrollment type'); - - // Attachment picker - - String get useCamera => Intl.message('Use Camera', - desc: 'Label for the action item that lets the user capture a photo using the device camera'); - - String get uploadFile => - Intl.message('Upload File', desc: 'Label for the action item that lets the user upload a file from their device'); - - String get chooseFromGallery => Intl.message('Choose from Gallery', - desc: 'Label for the action item that lets the user select a photo from their device gallery'); - - String get attachmentPreparing => - Intl.message('Preparing…', desc: 'Message shown while a file is being prepared to attach to a message'); - - /// Manage Students - String get addStudentWith => Intl.message('Add student with…'); - - String get addStudent => Intl.message('Add Student'); - - String get emptyStudentList => Intl.message('You are not observing any students.'); - - String get errorLoadingStudents => Intl.message('There was an error loading your students.'); - - String get pairingCode => Intl.message('Pairing Code'); - - String get pairingCodeDescription => Intl.message('Students can obtain a pairing code through the Canvas website'); - - String get pairingCodeEntryExplanation => Intl.message( - 'Enter the student pairing code provided to you. If the pairing code doesn\'t work, it may have expired'); - - String get errorPairingFailed => Intl.message('Your code is incorrect or expired.'); - - String get errorGenericPairingFailed => Intl.message( - 'Something went wrong trying to create your account, please reach out to your school for assistance.'); - - String get qrCode => Intl.message('QR Code'); - - String get qrCodeDescription => - Intl.message('Students can create a QR code using the Canvas Student app on their mobile device'); - - String get addNewStudent => - Intl.message('Add new student', desc: 'Semantics label for the FAB on the Manage Students Screen'); - - String get qrLoginSelect => Intl.message('Select', desc: 'Hint text to tell the user to choose one of two options'); - - String get qrLoginHaveAccount => - Intl.message('I have a Canvas account', desc: 'Option to select for users that have a canvas account'); - - String get qrLoginNewAccount => Intl.message('I don\'t have a Canvas account', - desc: 'Option to select for users that don\'t have a canvas account'); - - String get qrCreateAccount => Intl.message('Create Account', desc: 'Button text for account creation confirmation'); - - String get qrCreateAccountLabelName => Intl.message('Full Name'); - - String get qrCreateAccountLabelEmail => Intl.message('Email Address'); - - String get qrCreateAccountLabelPassword => Intl.message('Password'); - - String get qrCreateAccountHintName => Intl.message('Full Name…', desc: 'hint label for inside form field'); - - String get qrCreateAccountHintEmail => Intl.message('Email…', desc: 'hint label for inside form field'); - - String get qrCreateAccountHintPassword => Intl.message('Password…', desc: 'hint label for inside form field'); - - String get qrCreateAccountNameError => Intl.message('Please enter full name', desc: 'Error message for form field'); - - String get qrCreateAccountEmailError => - Intl.message('Please enter an email address', desc: 'Error message for form field'); - - String get qrCreateAccountInvalidEmailError => - Intl.message('Please enter a valid email address', desc: 'Error message for form field'); - - String get qrCreateAccountPasswordError => Intl.message('Password is required', desc: 'Error message for form field'); - - String get qrCreateAccountPasswordLengthError => - Intl.message('Password must contain at least 8 characters', desc: 'Error message for form field'); - - String qrCreateAccountTos(String termsOfService, String privacyPolicy) => Intl.message( - """By tapping 'Create Account', you agree to the $termsOfService and acknowledge the $privacyPolicy""", - name: 'qrCreateAccountTos', - desc: 'The text show on the account creation screen', - args: [termsOfService, privacyPolicy]); - - String get qrCreateAccountTermsOfService => Intl.message( - 'Terms of Service', - desc: - 'Label for the Canvas Terms of Service agreement. This will be used in the qrCreateAccountTos text and will be highlighted and clickable', - ); - - String get qrCreateAccountPrivacyPolicy => Intl.message( - 'Privacy Policy', - desc: - 'Label for the Canvas Privacy Policy agreement. This will be used in the qrCreateAccountTos text and will be highlighted and clickable', - ); - - String get qrCreateAccountViewPrivacy => Intl.message('View the Privacy Policy'); - - String get qrCreateAccountSignIn1 => Intl.message('Already have an account? ', - desc: 'Part of multiline text span, includes AccountSignIn1-2, in that order'); - - String get qrCreateAccountSignIn2 => - Intl.message('Sign In', desc: 'Part of multiline text span, includes AccountSignIn1-2, in that order'); - - String get qrCreateAccountEyeOffSemantics => - Intl.message('Hide Password', desc: 'content description for password hide button'); - - String get qrCreateAccountEyeSemantics => - Intl.message('Show Password', desc: 'content description for password show button'); - - String get qrCreateAccountTosSemantics => - Intl.message('Terms of Service Link', desc: 'content description for terms of service link'); - - String get qrCreateAccountPrivacySemantics => - Intl.message('Privacy Policy Link', desc: 'content description for privacy policy link'); - - /// Event details - - String get eventDetailsTitle => Intl.message('Event', desc: 'Title for the event details screen'); - - String get eventDateLabel => Intl.message('Date', desc: 'Label for the event date'); - - String get eventLocationLabel => Intl.message('Location', desc: 'Label for the location information'); - - String get eventNoLocation => - Intl.message('No Location Specified', desc: 'Description for events that do not have a location'); - - String eventTime(String startAt, String endAt) => Intl.message( - '$startAt - $endAt', - name: 'eventTime', - args: [startAt, endAt], - desc: 'The time the event is happening, example: "2:00 pm - 4:00 pm"', - ); - - String get eventRemindMeDescription => Intl.message('Set a date and time to be notified of this event.', - desc: 'Description for row to set event reminders'); - - String get eventRemindMeSet => - Intl.message('You will be notified about this event on…', desc: 'Description for when an event reminder is set'); - - /// Help Screen - String get helpShareLoveLabel => Intl.message( - 'Share Your Love for the App', - desc: 'Label for option to open the app store', - ); - - String get helpShareLoveDescription => Intl.message( - 'Tell us about your favorite parts of the app', - desc: 'Description for option to open the app store', - ); - - String get helpLegalLabel => Intl.message( - 'Legal', - desc: 'Label for legal information option', - ); - - String get helpLegalDescription => Intl.message( - 'Privacy policy, terms of use, open source', - desc: 'Description for legal information option', - ); - - String get featureRequestSubject => Intl.message( - 'Idea for Canvas Parent App [Android]', - desc: 'The subject for the email to request a feature', - ); - - String get featureRequestHeader => Intl.message( - 'The following information will help us better understand your idea:', - desc: 'The header for the users information that is attached to a feature request', - ); - - String get helpDomain => Intl.message('Domain:', desc: 'The label for the Canvas domain of the logged in user'); - - String get helpUserId => Intl.message('User ID:', desc: 'The label for the Canvas user ID of the logged in user'); - - String get helpEmail => Intl.message('Email:', desc: 'The label for the eamil of the logged in user'); - - String get helpLocale => Intl.message('Locale:', desc: 'The label for the locale of the logged in user'); - - /// Legal Screen - - String get privacyPolicy => Intl.message('Privacy Policy', desc: 'Label for the privacy policy'); - - String get termsOfUse => Intl.message('Terms of Use', desc: 'Label for the terms of use'); - - String get canvasOnGithub => Intl.message( - 'Canvas on GitHub', - desc: 'Label for the button that opens the Canvas project on GitHub\'s website', - ); - - String get errorLoadingTermsOfUse => Intl.message('There was a problem loading the Terms of Use'); - - /// Error Report Dialog - - String get device => Intl.message('Device', desc: 'Label used for device manufacturer/model in the error report'); - - String get osVersion => - Intl.message('OS Version', desc: 'Label used for device operating system version in the error report'); - - String get versionNumber => - Intl.message('Version Number', desc: 'Label used for the app version number in the error report'); - - String get reportProblemTitle => - Intl.message('Report A Problem', desc: 'Title used for generic dialog to report problems'); - - String get reportProblemSubject => Intl.message('Subject', desc: 'Label used for Subject text field'); - - String get reportProblemSubjectEmpty => - Intl.message('A subject is required.', desc: 'Error shown when the subject field is empty'); - - String get reportProblemEmail => Intl.message('Email Address', desc: 'Label used for Email Address text field'); - - String get reportProblemEmailEmpty => - Intl.message('An email address is required.', desc: 'Error shown when the email field is empty'); - - String get reportProblemDescription => Intl.message('Description', desc: 'Label used for Description text field'); - - String get reportProblemDescriptionEmpty => - Intl.message('A description is required.', desc: 'Error shown when the description field is empty'); - - String get reportProblemSeverity => - Intl.message('How is this affecting you?', desc: 'Label used for the dropdown to select how severe the issue is'); - - String get sendReport => Intl.message('send', desc: 'Label used for send button when reporting a problem'); - - String get errorSeverityComment => Intl.message('Just a casual question, comment, idea, suggestion…'); - - String get errorSeverityNotUrgent => Intl.message('I need some help but it\'s not urgent.'); - - String get errorSeverityWorkaroundPossible => - Intl.message('Something\'s broken but I can work around it to get what I need done.'); - - String get errorSeverityBlocking => Intl.message('I can\'t get things done until I hear back from you.'); - - String get errorSeverityCritical => Intl.message('EXTREME CRITICAL EMERGENCY!!'); - - /// Calendar Screen - String get missing => Intl.message( - 'Missing', - desc: 'Description for when a student has not turned anything in for an assignment', - ); - - String get notGraded => Intl.message( - 'Not Graded', - desc: 'Description for an assignment has not been graded.', - ); - - /// Masquerading - - String get loginFlowNormal => Intl.message( - 'Login flow: Normal', - desc: 'Description for the normal login flow', - ); - - String get loginFlowCanvas => Intl.message( - 'Login flow: Canvas', - desc: 'Description for the Canvas login flow', - ); - - String get loginFlowSiteAdmin => Intl.message( - 'Login flow: Site Admin', - desc: 'Description for the Site Admin login flow', - ); - - String get loginFlowSkipMobileVerify => Intl.message( - 'Login flow: Skip mobile verify', - desc: 'Description for the login flow that skips domain verification for mobile', - ); - - String get actAsUser => Intl.message( - 'Act As User', - desc: 'Label for the button that allows the user to act (masquerade) as another user', - ); - - String get stopActAsUser => Intl.message( - 'Stop Acting as User', - desc: 'Label for the button that allows the user to stop acting (masquerading) as another user', - ); - - String actingAsUser(String userName) => Intl.message( - 'You are acting as $userName', - name: 'actingAsUser', - args: [userName], - desc: 'Message shown while acting (masquerading) as another user', - ); - - String get actAsDescription => Intl.message( - '"Act as" is essentially logging in as this user without a password. You will be able to take any action as if you were this user, and from other users\' points of views, it will be as if this user performed them. However, audit logs record that you were the one who performed the actions on behalf of this user.'); - - String get domainInputHint => Intl.message('Domain', desc: 'Text field hint for domain url input'); - - String get domainInputError => Intl.message( - 'You must enter a valid domain', - desc: 'Message displayed for domain input error', - ); - - String get userIdInputHint => Intl.message('User ID', desc: 'Text field hint for user ID input'); - - String get userIdInputError => Intl.message( - 'You must enter a user id', - desc: 'Message displayed for user Id input error', - ); - - String get actAsUserError => Intl.message( - 'There was an error trying to act as this user. Please check the Domain and User ID and try again.', - ); - - String endMasqueradeMessage(String userName) => Intl.message( - 'You will stop acting as $userName and return to your original account.', - name: 'endMasqueradeMessage', - args: [userName], - desc: 'Confirmation message displayed when the user wants to stop acting (masquerading) as another user', - ); - - String endMasqueradeLogoutMessage(String userName) => Intl.message( - 'You will stop acting as $userName and will be logged out.', - name: 'endMasqueradeLogoutMessage', - args: [userName], - desc: - 'Confirmation message displayed when the user wants to stop acting (masquerading) as another user and will be logged out.', - ); - - /// Rating dialog - - String get ratingDialogTitle => Intl.message( - 'How are we doing?', - desc: 'Title for dialog asking user to rate the app out of 5 stars.', - ); - - String get ratingDialogDontShowAgain => Intl.message( - 'Don\'t show again', - desc: 'Button to prevent the rating dialog from showing again.', - ); - - String get ratingDialogCommentDescription => Intl.message( - 'What can we do better?', - desc: 'Hint text for providing a comment with the rating.', - ); - - String get ratingDialogSendFeedback => Intl.message('Send Feedback', desc: 'Button to send rating with feedback'); - - String ratingDialogEmailSubject(String version) => Intl.message( - 'Suggestions for Android - Canvas Parent $version', - desc: 'The subject for an email to provide feedback for CanvasParent.', - name: 'ratingDialogEmailSubject', - args: [version], - ); - - String starRating(int position) => Intl.plural( - position, - one: '$position star', - other: '$position stars', - args: [position], - name: 'starRating', - desc: 'Accessibility label for the 1 stars to 5 stars rating', - examples: const {'position': 1}, - ); - - /// QR Pairing - - String get qrPairingTitle => Intl.message( - 'Student Pairing', - desc: 'Title for the screen where users can pair to students using a QR code', - ); - - String get qrPairingTutorialTitle => Intl.message( - 'Open Canvas Student', - desc: 'Title for QR pairing tutorial screen instructing users to open the Canvas Student app', - ); - - String get qrPairingTutorialMessage => Intl.message( - 'You\'ll need to open your student\'s Canvas Student app to continue. Go into Main Menu > Settings > Pair with Observer and scan the QR code you see there.', - desc: 'Message explaining how QR code pairing works', - ); - - String get qrPairingScreenshotContentDescription => Intl.message( - 'Screenshot showing location of pairing QR code generation in the Canvas Student app', - desc: 'Content Description for qr pairing tutorial screenshot', - ); - - String get qrPairingFailedTitle => Intl.message( - 'Expired QR Code', - desc: 'Error title shown when the users scans a QR code that has expired', - ); - - String get qrPairingFailedSubtitle => Intl.message( - 'The QR code you scanned may have expired. Refresh the code on the student\'s device and try again.', - ); - - String get qrPairingNetworkError => Intl.message( - 'A network error occurred when adding this student. Check your connection and try again.', - ); - - String get qrPairingInvalidCodeTitle => Intl.message( - 'Invalid QR Code', - desc: 'Error title shown when the user scans an invalid QR code', - ); - - String get qrPairingWrongDomainTitle => Intl.message( - 'Incorrect Domain', - desc: 'Error title shown when the users scane a QR code for a student that belongs to a different domain', - ); - - String get qrPairingWrongDomainSubtitle => Intl.message( - 'The student you are trying to add belongs to a different school. Log in or create an account with that school to scan this code.', - ); - - String get qrPairingCameraPermissionTitle => Intl.message( - 'Camera Permission', - desc: 'Error title shown when the user wans to scan a QR code but has denied the camera permission', - ); - - String get confirmDeleteStudentMessage => Intl.message( - 'This will unpair and remove all enrollments for this student from your account.', - desc: 'Confirmation message shown when the user tries to delete a student from their account', - ); - - String get deleteStudentFailure => Intl.message( - 'There was a problem removing this student from your account. Please check your connection and try again.', - ); - - /// Miscellaneous - - String get cancel => Intl.message('Cancel'); - - String get next => Intl.message('Next', name: 'next'); - - String get ok => Intl.message('OK', name: 'ok'); - - String get yes => Intl.message('Yes'); - - String get no => Intl.message('No'); - - String get retry => Intl.message('Retry'); - - String get delete => Intl.message('Delete', desc: 'Label used for general delete/remove actions'); - - String get done => Intl.message('Done', desc: 'Label for general done/finished actions'); - - String get refresh => Intl.message('Refresh', desc: 'Label for button to refresh data from the web'); - - String get viewDescription => Intl.message( - 'View Description', - desc: 'Button to view the description for an event or assignment', - ); - - String get allyExpanded => Intl.message( - 'expanded', - desc: 'Description for the accessibility reader for list groups that are expanded', - ); - - String get allyCollapsed => Intl.message( - 'collapsed', - desc: 'Description for the accessibility reader for list groups that are expanded', - ); - - String get unexpectedError => Intl.message('An unexpected error occurred'); - - String get descriptionTitle => Intl.message( - 'Description', - desc: 'Title for screens that contain only a description from Canavs', - ); - - String get noDescriptionBody => - Intl.message('No description', desc: 'Message used when the assignment has no description'); - - String get launchExternalTool => Intl.message( - 'Launch External Tool', - desc: 'Button text added to webviews to let users open external tools in their browser', - ); - - String get webAccessLimitedMessage => Intl.message( - 'Interactions on this page are limited by your institution.', - desc: 'Message describing how the webview has limited access due to an instution setting', - ); - - String dateAtTime(String date, String time) => Intl.message( - '$date at $time', - args: [date, time], - name: 'dateAtTime', - desc: 'The string to format dates', - ); - - String dueDateAtTime(String date, String time) => Intl.message( - 'Due $date at $time', - args: [date, time], - name: 'dueDateAtTime', - desc: 'The string to format due dates', - ); - - String get noDueDate => Intl.message( - 'No Due Date', - desc: 'Label for assignments that do not have a due date', - ); - - String get filter => Intl.message( - 'Filter', - desc: 'Label for buttons to filter what items are visible', - ); - - String get unread => Intl.message('unread', desc: 'Label for things that are marked as unread'); - - String unreadCount(int count) => Intl.message( - '${count} unread', - args: [count], - name: 'unreadCount', - desc: 'Formatted string for when there are a number of unread items', - ); - - String badgeNumberPlus(int count) => Intl.message( - '${count}+', - args: [count], - name: 'badgeNumberPlus', - desc: 'Formatted string for when too many items are being notified in a badge, generally something like: 99+', - ); - - String get errorLoadingAnnouncement => Intl.message('There was an error loading this announcement', - desc: 'Message shown when an announcement detail screen fails to load'); - - String get globalAnnouncementTitle => - Intl.message('Global Announcement', desc: 'Title text shown for institution level announcements'); - - String get genericNetworkError => Intl.message('Network error'); - - String get underConstruction => Intl.message('Under Construction'); - - String get currentlyBuildingThisFeature => - Intl.message('We are currently building this feature for your viewing pleasure.'); - - String get loginHelpHint => Intl.message('Request Login Help Button', - desc: 'Accessibility hint for button that opens help dialog for a login help request'); - - String get loginHelpTitle => - Intl.message('Request Login Help', desc: 'Title of help dialog for a login help request'); - - String get loginHelpSubject => - Intl.message('I\'m having trouble logging in', desc: 'Subject of help dialog for a login help request'); - - String get routerLaunchErrorMessage => Intl.message('An error occurred when trying to display this link', - desc: 'Error message shown when a link can\'t be opened'); - - String get routerErrorMessage => Intl.message( - 'We are unable to display this link, it may belong to an institution you currently aren\'t logged in to.', - desc: 'Description for error page shown when clicking a link'); - - String get routerErrorTitle => Intl.message('Link Error', desc: 'Title for error page shown when clicking a link'); - - String get openInBrowser => Intl.message('Open In Browser', desc: 'Text for button to open a link in the browswer'); - - String get qrCodeExplanation => Intl.message( - 'You\'ll find the QR code on the web in your account profile. Click \'QR for Mobile Login\' in the list.', - desc: 'Text for qr login tutorial screen'); - - String get loginWithQRCode => Intl.message('QR Code', desc: 'Text for qr login button'); - - String get locateQRCode => Intl.message('Locate QR Code', desc: 'Text for qr login button'); - - String get invalidQRCodeError => - Intl.message('Please scan a QR code generated by Canvas', desc: 'Text for qr login error with incorrect qr code'); - - String get loginWithQRCodeError => - Intl.message('There was an error logging in. Please generate another QR Code and try again.', - desc: 'Text for qr login error'); - - String get qrCodeScreenshotContentDescription => - Intl.message('Screenshot showing location of QR code generation in browser', - desc: 'Content Description for qr login tutorial screenshot'); - - String get qrCodeNoCameraError => - Intl.message('QR scanning requires camera access', desc: 'placeholder for camera error for QR code scan'); - - String get lockedForUserError => - Intl.message('The linked item is no longer available', desc: 'error message when the alert could no be opened'); - - String get lockedForUserTitle => - Intl.message('Locked', desc: 'title for locked alerts'); - - String get messageSent => - Intl.message('Message sent', desc: 'confirmation message on the screen when the user succesfully sends a message'); - - String get acceptableUsePolicyTitle => - Intl.message('Acceptable Use Policy', desc: 'title for the acceptable use policy screen'); - - String get acceptableUsePolicyConfirm => - Intl.message('Submit', desc: 'submit button title for acceptable use policy screen'); - - String get acceptableUsePolicyDescription => - Intl.message('Either you\'re a new user or the Acceptable Use Policy has changed since you last agreed to it. Please agree to the Acceptable Use Policy before you continue.', desc: 'acceptable use policy screen description'); - - String get acceptableUsePolicyAgree => - Intl.message('I agree to the Acceptable Use Policy.', desc: 'acceptable use policy switch title'); - - String get about => - Intl.message('About', desc: 'Title for about menu item in settings'); - - String get aboutAppTitle => - Intl.message('App', desc: 'Title for App field on about page'); - - String get aboutDomainTitle => - Intl.message('Domain', desc: 'Title for Domain field on about page'); - - String get aboutLoginIdTitle => - Intl.message('Login ID', desc: 'Title for Login ID field on about page'); - - String get aboutEmailTitle => - Intl.message('Email', desc: 'Title for Email field on about page'); - - String get aboutVersionTitle => - Intl.message('Version', desc: 'Title for Version field on about page'); - - String get aboutLogoSemanticsLabel => - Intl.message('Instructure logo', desc: 'Semantics label for the Instructure logo on the about page'); - - String get needToEnablePermission => - Intl.message('You need to enable exact alarm permission for this action', desc: 'Error message when the user tries to set a reminder without the permission'); - - String get submissionAndRubric => Intl.message( - 'Submission & Rubric', - desc: 'Button text for Submission and Rubric on Assignment Details Screen' - ); - - String get submission => Intl.message( - 'Submission', - desc: 'Title for WebView screen when opening submission' - ); -} diff --git a/apps/flutter_parent/lib/l10n/fallback_material_localizations_delegate.dart b/apps/flutter_parent/lib/l10n/fallback_material_localizations_delegate.dart deleted file mode 100644 index 4a9d987d43..0000000000 --- a/apps/flutter_parent/lib/l10n/fallback_material_localizations_delegate.dart +++ /dev/null @@ -1,39 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:flutter/material.dart'; -import 'package:flutter_localizations/flutter_localizations.dart'; - -/// A MaterialLocalizations delegate which wraps GlobalMaterialLocalizations.delegate and adds a fallback -/// to the default locale ('en') for unsupported locales -class FallbackMaterialLocalizationsDelegate extends LocalizationsDelegate { - static const LocalizationsDelegate delegate = GlobalMaterialLocalizations.delegate; - - const FallbackMaterialLocalizationsDelegate(); - - @override - bool isSupported(Locale locale) => true; - - @override - Future load(Locale locale) { - if (delegate.isSupported(locale)) return delegate.load(locale); - return delegate.load(Locale('en')); - } - - @override - bool shouldReload(FallbackMaterialLocalizationsDelegate old) => false; - - @override - String toString() => 'FallbackMaterialLocalizationsDelegate - ${kMaterialSupportedLanguages.length} locales)'; -} diff --git a/apps/flutter_parent/lib/l10n/generated/messages_all.dart b/apps/flutter_parent/lib/l10n/generated/messages_all.dart deleted file mode 100644 index 72c44c1749..0000000000 --- a/apps/flutter_parent/lib/l10n/generated/messages_all.dart +++ /dev/null @@ -1,199 +0,0 @@ -// DO NOT EDIT. This is code generated via package:intl/generate_localized.dart -// This is a library that looks up messages for specific locales by -// delegating to the appropriate library. - -// Ignore issues from commonly used lints in this file. -// ignore_for_file:implementation_imports, file_names, unnecessary_new -// ignore_for_file:unnecessary_brace_in_string_interps, directives_ordering -// ignore_for_file:argument_type_not_assignable, invalid_assignment -// ignore_for_file:prefer_single_quotes, prefer_generic_function_type_aliases -// ignore_for_file:comment_references - -import 'dart:async'; - -import 'package:intl/intl.dart'; -import 'package:intl/message_lookup_by_library.dart'; -import 'package:intl/src/intl_helpers.dart'; - -import 'messages_ar.dart' as messages_ar; -import 'messages_ca.dart' as messages_ca; -import 'messages_cy.dart' as messages_cy; -import 'messages_da.dart' as messages_da; -import 'messages_da_instk12.dart' as messages_da_instk12; -import 'messages_de.dart' as messages_de; -import 'messages_en.dart' as messages_en; -import 'messages_en_AU.dart' as messages_en_au; -import 'messages_en_AU_unimelb.dart' as messages_en_au_unimelb; -import 'messages_en_CA.dart' as messages_en_ca; -import 'messages_en_CY.dart' as messages_en_cy; -import 'messages_en_GB.dart' as messages_en_gb; -import 'messages_en_GB_instukhe.dart' as messages_en_gb_instukhe; -import 'messages_es.dart' as messages_es; -import 'messages_fi.dart' as messages_fi; -import 'messages_fr.dart' as messages_fr; -import 'messages_fr_CA.dart' as messages_fr_ca; -import 'messages_ht.dart' as messages_ht; -import 'messages_is.dart' as messages_is; -import 'messages_it.dart' as messages_it; -import 'messages_ja.dart' as messages_ja; -import 'messages_messages.dart' as messages_messages; -import 'messages_mi.dart' as messages_mi; -import 'messages_nb.dart' as messages_nb; -import 'messages_nb_instk12.dart' as messages_nb_instk12; -import 'messages_nl.dart' as messages_nl; -import 'messages_pl.dart' as messages_pl; -import 'messages_pt_BR.dart' as messages_pt_br; -import 'messages_pt_PT.dart' as messages_pt_pt; -import 'messages_ru.dart' as messages_ru; -import 'messages_sl.dart' as messages_sl; -import 'messages_sv.dart' as messages_sv; -import 'messages_sv_instk12.dart' as messages_sv_instk12; -import 'messages_zh.dart' as messages_zh; -import 'messages_zh_HK.dart' as messages_zh_hk; - -typedef Future? LibraryLoader(); -Map _deferredLibraries = { - 'ar': () => new Future.value(null), - 'ca': () => new Future.value(null), - 'cy': () => new Future.value(null), - 'da': () => new Future.value(null), - 'da_instk12': () => new Future.value(null), - 'de': () => new Future.value(null), - 'en': () => new Future.value(null), - 'en_AU': () => new Future.value(null), - 'en_AU_unimelb': () => new Future.value(null), - 'en_CA': () => new Future.value(null), - 'en_CY': () => new Future.value(null), - 'en_GB': () => new Future.value(null), - 'en_GB_instukhe': () => new Future.value(null), - 'es': () => new Future.value(null), - 'fi': () => new Future.value(null), - 'fr': () => new Future.value(null), - 'fr_CA': () => new Future.value(null), - 'ht': () => new Future.value(null), - 'is': () => new Future.value(null), - 'it': () => new Future.value(null), - 'ja': () => new Future.value(null), - 'messages': () => new Future.value(null), - 'mi': () => new Future.value(null), - 'nb': () => new Future.value(null), - 'nb_instk12': () => new Future.value(null), - 'nl': () => new Future.value(null), - 'pl': () => new Future.value(null), - 'pt_BR': () => new Future.value(null), - 'pt_PT': () => new Future.value(null), - 'ru': () => new Future.value(null), - 'sl': () => new Future.value(null), - 'sv': () => new Future.value(null), - 'sv_instk12': () => new Future.value(null), - 'zh': () => new Future.value(null), - 'zh_HK': () => new Future.value(null), -}; - -MessageLookupByLibrary? _findExact(String localeName) { - switch (localeName) { - case 'ar': - return messages_ar.messages; - case 'ca': - return messages_ca.messages; - case 'cy': - return messages_cy.messages; - case 'da': - return messages_da.messages; - case 'da_instk12': - return messages_da_instk12.messages; - case 'de': - return messages_de.messages; - case 'en': - return messages_en.messages; - case 'en_AU': - return messages_en_au.messages; - case 'en_AU_unimelb': - return messages_en_au_unimelb.messages; - case 'en_CA': - return messages_en_ca.messages; - case 'en_CY': - return messages_en_cy.messages; - case 'en_GB': - return messages_en_gb.messages; - case 'en_GB_instukhe': - return messages_en_gb_instukhe.messages; - case 'es': - return messages_es.messages; - case 'fi': - return messages_fi.messages; - case 'fr': - return messages_fr.messages; - case 'fr_CA': - return messages_fr_ca.messages; - case 'ht': - return messages_ht.messages; - case 'is': - return messages_is.messages; - case 'it': - return messages_it.messages; - case 'ja': - return messages_ja.messages; - case 'messages': - return messages_messages.messages; - case 'mi': - return messages_mi.messages; - case 'nb': - return messages_nb.messages; - case 'nb_instk12': - return messages_nb_instk12.messages; - case 'nl': - return messages_nl.messages; - case 'pl': - return messages_pl.messages; - case 'pt_BR': - return messages_pt_br.messages; - case 'pt_PT': - return messages_pt_pt.messages; - case 'ru': - return messages_ru.messages; - case 'sl': - return messages_sl.messages; - case 'sv': - return messages_sv.messages; - case 'sv_instk12': - return messages_sv_instk12.messages; - case 'zh': - return messages_zh.messages; - case 'zh_HK': - return messages_zh_hk.messages; - default: - return null; - } -} - -/// User programs should call this before using [localeName] for messages. -Future initializeMessages(String localeName) async { - var availableLocale = Intl.verifiedLocale( - localeName, - (locale) => _deferredLibraries[locale] != null, - onFailure: (_) => null); - if (availableLocale == null) { - return new Future.value(false); - } - var lib = _deferredLibraries[availableLocale]; - await (lib == null ? new Future.value(false) : lib()); - initializeInternalMessageLookup(() => new CompositeMessageLookup()); - messageLookup.addLocale(availableLocale, _findGeneratedMessagesFor); - return new Future.value(true); -} - -bool _messagesExistFor(String locale) { - try { - return _findExact(locale) != null; - } catch (e) { - return false; - } -} - -MessageLookupByLibrary? _findGeneratedMessagesFor(String locale) { - var actualLocale = Intl.verifiedLocale(locale, _messagesExistFor, - onFailure: (_) => null); - if (actualLocale == null) return null; - return _findExact(actualLocale); -} diff --git a/apps/flutter_parent/lib/l10n/generated/messages_ar.dart b/apps/flutter_parent/lib/l10n/generated/messages_ar.dart deleted file mode 100644 index 3490625d8a..0000000000 --- a/apps/flutter_parent/lib/l10n/generated/messages_ar.dart +++ /dev/null @@ -1,473 +0,0 @@ -// DO NOT EDIT. This is code generated via package:intl/generate_localized.dart -// This is a library that provides messages for a ar locale. All the -// messages from the main program should be duplicated here with the same -// function name. - -// Ignore issues from commonly used lints in this file. -// ignore_for_file:unnecessary_brace_in_string_interps, unnecessary_new -// ignore_for_file:prefer_single_quotes,comment_references, directives_ordering -// ignore_for_file:annotate_overrides,prefer_generic_function_type_aliases -// ignore_for_file:unused_import, file_names - -import 'package:intl/intl.dart'; -import 'package:intl/message_lookup_by_library.dart'; - -final messages = new MessageLookup(); - -typedef String MessageIfAbsent(String messageStr, List args); - -class MessageLookup extends MessageLookupByLibrary { - String get localeName => 'ar'; - - static m0(userName) => "أنت تتصرف باعتبارك ${userName}"; - - static m1(version) => "إصدار ${version}"; - - static m2(threshold) => "تقييم المهمة أعلاه ${threshold}"; - - static m3(threshold) => "تقييم المهمة أدناه ${threshold}"; - - static m4(moduleName) => "هذه المهمة مؤمّنة بسبب الوحدة المنطقية \"${moduleName}\"."; - - static m5(studentName, assignmentName) => "بخصوص: ${studentName}، المهمة - ${assignmentName}"; - - static m6(points) => "${points} نقاط"; - - static m7(points) => "${points} من النقاط"; - - static m8(authorName, howMany) => "${Intl.plural(howMany, one: '${authorName} إلى 1 آخرين', other: '${authorName} إلى ${howMany} آخرين')}"; - - static m9(authorName, recipientName) => "${authorName} إلى ${recipientName}"; - - static m10(authorName, recipientName, howMany) => "${Intl.plural(howMany, one: '${authorName} إلى ${recipientName} و 1 أخرى', other: '${authorName} آخر إلى ${recipientName} و ${howMany} أخرى')}"; - - static m11(count) => "${count}+"; - - static m12(studentName) => "تغيير اللون لـ ${studentName}"; - - static m13(score, pointsPossible) => "${score} من إجمالي ${pointsPossible} نقاط"; - - static m14(studentShortName) => "بالنسبة لـ ${studentShortName}"; - - static m15(threshold) => "تقييم المساق أعلاه ${threshold}"; - - static m16(threshold) => "تقييم المساق أدناه ${threshold}"; - - static m17(date, time) => "${date} في ${time}"; - - static m18(alertTitle) => "تجاهل ${alertTitle}"; - - static m19(canvasGuides, canvasSupport) => "جرب البحث عن اسم المدرسة أو الدائرة التعليمية التي تحاول الوصول إليها مثل \"Smith Private School\" أو \"Smith County Schools\". يمكنك أيضاً الدخول في مجال Canvas مباشرة، مثل \"smith.instructure.com.\"\n\nللمزيد من المعلومات حول العثور على حساب Canvas للمؤسسة التي تبحث عنها، يمكنك زيارة ${canvasGuides} أو التواصل مع ${canvasSupport} أو الاتصال بمدرستك لطلب المساعدة."; - - static m20(date, time) => "تاريخ الاستحقاق ${date} في ${time}"; - - static m21(userName) => "ستتوقف عن التصرف باعتبارك ${userName} وسيتم إخراجك من الحساب."; - - static m22(userName) => "ستتوقف عن التصرف باعتبارك ${userName} وستعود إلى حسابك الأصلي."; - - static m23(studentName, eventTitle) => "بخصوص: ${studentName}، الحدث - ${eventTitle}"; - - static m24(startAt, endAt) => "${startAt} - ${endAt}"; - - static m25(grade) => "الدرجة النهائية: ${grade}"; - - static m26(studentName) => "بخصوص: ${studentName}، الصفحة الأمامية"; - - static m27(score, pointsPossible) => "${score} / ${pointsPossible}"; - - static m28(studentName) => "بخصوص: ${studentName}، الدرجات"; - - static m29(pointsLost) => "عقوبة التأخير (-${pointsLost})"; - - static m30(studentName, linkUrl) => "بخصوص: ${studentName}، ${linkUrl}"; - - static m31(percentage) => "يجب أن تزيد عن ${percentage}"; - - static m32(percentage) => "يجب أن تقل عن ${percentage}"; - - static m33(month) => "الشهر القادم: ${month}"; - - static m34(date) => "الأسبوع القادم بدءاً من ${date}"; - - static m35(query) => "يتعذر العثور على مدارس مطابقة \"${query}\""; - - static m36(points, howMany) => "${Intl.plural(howMany, one: 'من إجمالي 1 نقطة', other: 'من إجمالي ${points} نقاط')}"; - - static m37(count) => "+${count}"; - - static m38(points) => "${points} نقاط ممكنة"; - - static m39(month) => "الشهر السابق: ${month}"; - - static m40(date) => "الأسبوع الماضي بدءاً من ${date}"; - - static m41(termsOfService, privacyPolicy) => "بالضغط على \"إنشاء حساب\"، أنت توافق على ${termsOfService} وتقر بـ ${privacyPolicy}"; - - static m42(version) => "اقتراحات لـ Android - Canvas Parent ${version}"; - - static m43(month) => "شهر ${month}"; - - static m44(position) => "${Intl.plural(position, one: '${position} نجمة', other: '${position} نجوم')}"; - - static m45(date, time) => "تم إرسال هذه المهمة في ${date} ${time} وبانتظار التقييم"; - - static m46(studentName) => "بخصوص: ${studentName}، المخطط الدراسي"; - - static m47(count) => "${count} غير مقروء"; - - final messages = _notInlinedMessages(_notInlinedMessages); - static _notInlinedMessages(_) => { - "\"Act as\" is essentially logging in as this user without a password. You will be able to take any action as if you were this user, and from other users\' points of views, it will be as if this user performed them. However, audit logs record that you were the one who performed the actions on behalf of this user." : MessageLookupByLibrary.simpleMessage("\"تصرف كـ\" هو تسجيل الدخول كما لو كنت هذا المستخدم دون كلمة مرور. ستتمكن من اتخاذ أي إجراء كما لو كنت هذا المستخدم، ومن وجهة نظر المستخدمين الآخرين، سيبدو الأمر كما لو كان هذا المستخدم هو من قام بهذه الإجراءات. ولكن سجلات التدقيق ستسجل أنك كنت الشخص الذي قام بالإجراءات نيابةً عن هذا المستخدم."), - "-" : MessageLookupByLibrary.simpleMessage("-"), - "A description is required." : MessageLookupByLibrary.simpleMessage("يجب توفير وصف."), - "A network error occurred when adding this student. Check your connection and try again." : MessageLookupByLibrary.simpleMessage("حدث خطأ في الشبكة أثناء إضافة هذا الطالب. تحقق من الاتصال وأعد المحاولة."), - "A subject is required." : MessageLookupByLibrary.simpleMessage("يجب توفر موضوع."), - "Act As User" : MessageLookupByLibrary.simpleMessage("تصرف كمستخدم"), - "Add Student" : MessageLookupByLibrary.simpleMessage("إضافة طالب"), - "Add attachment" : MessageLookupByLibrary.simpleMessage("إضافة مرفق"), - "Add new student" : MessageLookupByLibrary.simpleMessage("إضافة طالب جديد"), - "Add student with…" : MessageLookupByLibrary.simpleMessage("إضافة طالب بـ..."), - "Alert Settings" : MessageLookupByLibrary.simpleMessage("إعدادات التنبيه"), - "Alert me when…" : MessageLookupByLibrary.simpleMessage("تنبيهي عندما..."), - "All Grading Periods" : MessageLookupByLibrary.simpleMessage("جميع فترات تقييم الدرجات"), - "Already have an account? " : MessageLookupByLibrary.simpleMessage("هل تمتلك حسابًا بالفعل؟ "), - "An email address is required." : MessageLookupByLibrary.simpleMessage("يجب توفير عنوان بريد إلكتروني."), - "An error occurred when trying to display this link" : MessageLookupByLibrary.simpleMessage("حدث خطأ أثناء محاولة عرض هذا الرابط"), - "An error occurred while saving your selection. Please try again." : MessageLookupByLibrary.simpleMessage("حدث خطأ أثناء حفظ التحديد الخاص بك يرجى إعادة المحاولة."), - "An unexpected error occurred" : MessageLookupByLibrary.simpleMessage("حدث خطأ غير متوقع"), - "Android OS version" : MessageLookupByLibrary.simpleMessage("إصدار نظام تشغيل Android"), - "Appearance" : MessageLookupByLibrary.simpleMessage("المظهر"), - "Application version" : MessageLookupByLibrary.simpleMessage("إصدار التطبيق"), - "Are you a student or teacher?" : MessageLookupByLibrary.simpleMessage("هل أنت طالب أو معلم؟"), - "Are you sure you want to log out?" : MessageLookupByLibrary.simpleMessage("هل تريد بالتأكيد تسجيل الخروج؟"), - "Are you sure you wish to close this page? Your unsent message will be lost." : MessageLookupByLibrary.simpleMessage("هل ترغب بالتأكيد في إغلاق هذه الصفحة؟ سيتم فقد رسالتك غير المرسلة."), - "Assignment Details" : MessageLookupByLibrary.simpleMessage("تفاصيل المهمة"), - "Assignment grade above" : MessageLookupByLibrary.simpleMessage("تقييم المهمة أعلاه"), - "Assignment grade below" : MessageLookupByLibrary.simpleMessage("تقييم المهمة أدناه"), - "Assignment missing" : MessageLookupByLibrary.simpleMessage("مهمة مفقودة"), - "Barney, Fuschia" : MessageLookupByLibrary.simpleMessage("فوشيا، بارني"), - "Calendars" : MessageLookupByLibrary.simpleMessage("التقويمات"), - "Camera Permission" : MessageLookupByLibrary.simpleMessage("إذن الكاميرا"), - "Cancel" : MessageLookupByLibrary.simpleMessage("إلغاء"), - "Canvas Student" : MessageLookupByLibrary.simpleMessage("Canvas Student"), - "Canvas Teacher" : MessageLookupByLibrary.simpleMessage("Canvas Teacher"), - "Canvas on GitHub" : MessageLookupByLibrary.simpleMessage("Canvas على GitHub"), - "Choose a course to message" : MessageLookupByLibrary.simpleMessage("اختر مساقاً لإرسال رسالة"), - "Choose from Gallery" : MessageLookupByLibrary.simpleMessage("اختر من المعرض"), - "Complete" : MessageLookupByLibrary.simpleMessage("مكتمل"), - "Contact Support" : MessageLookupByLibrary.simpleMessage("اتصل بالدعم"), - "Course Announcement" : MessageLookupByLibrary.simpleMessage("إعلان المساق"), - "Course Announcements" : MessageLookupByLibrary.simpleMessage("إعلانات المساق"), - "Course grade above" : MessageLookupByLibrary.simpleMessage("تقييم المساق أعلاه"), - "Course grade below" : MessageLookupByLibrary.simpleMessage("تقييم المساق أدناه"), - "Create Account" : MessageLookupByLibrary.simpleMessage("إنشاء حساب"), - "Dark Mode" : MessageLookupByLibrary.simpleMessage("وضع داكن"), - "Date" : MessageLookupByLibrary.simpleMessage("التاريخ"), - "Delete" : MessageLookupByLibrary.simpleMessage("حذف"), - "Description" : MessageLookupByLibrary.simpleMessage("الوصف"), - "Device" : MessageLookupByLibrary.simpleMessage("الجهاز"), - "Device model" : MessageLookupByLibrary.simpleMessage("طراز الجهاز"), - "Domain" : MessageLookupByLibrary.simpleMessage("المجال"), - "Domain:" : MessageLookupByLibrary.simpleMessage("المجال:"), - "Don\'t show again" : MessageLookupByLibrary.simpleMessage("عدم الإظهار مرة أخرى"), - "Done" : MessageLookupByLibrary.simpleMessage("تم"), - "Download" : MessageLookupByLibrary.simpleMessage("تنزيل"), - "Due" : MessageLookupByLibrary.simpleMessage("الاستحقاق"), - "EXTREME CRITICAL EMERGENCY!!" : MessageLookupByLibrary.simpleMessage("حالة طارئة حرجة للغاية!!"), - "Electric, blue" : MessageLookupByLibrary.simpleMessage("أزرق، كهربائي"), - "Email Address" : MessageLookupByLibrary.simpleMessage("عنوان البريد الإلكتروني"), - "Email:" : MessageLookupByLibrary.simpleMessage("البريد الإلكتروني:"), - "Email…" : MessageLookupByLibrary.simpleMessage("البريد الإلكتروني..."), - "Enter the student pairing code provided to you. If the pairing code doesn\'t work, it may have expired" : MessageLookupByLibrary.simpleMessage("أدخل رمز إقران الطالب المقدم لك. إذا لم يعمل رمز الإقران، فقد يكون انتهت صلاحيته"), - "Event" : MessageLookupByLibrary.simpleMessage("الحدث"), - "Excused" : MessageLookupByLibrary.simpleMessage("معفى"), - "Expired QR Code" : MessageLookupByLibrary.simpleMessage("رمز QR منته الصلاحية"), - "Failed. Tap for options." : MessageLookupByLibrary.simpleMessage("فشل. اضغط للوصول إلى الخيارات."), - "Filter" : MessageLookupByLibrary.simpleMessage("عامل تصفية"), - "Filter by" : MessageLookupByLibrary.simpleMessage("التصفية حسب"), - "Fire, Orange" : MessageLookupByLibrary.simpleMessage("برتقالي، ناري"), - "Front Page" : MessageLookupByLibrary.simpleMessage("الصفحة الأمامية"), - "Full Name" : MessageLookupByLibrary.simpleMessage("الاسم الكامل"), - "Full Name…" : MessageLookupByLibrary.simpleMessage("الاسم الكامل..."), - "Full error message" : MessageLookupByLibrary.simpleMessage("رسالة الخطأ الكاملة"), - "Go to today" : MessageLookupByLibrary.simpleMessage("الذهاب إلى اليوم"), - "Grade" : MessageLookupByLibrary.simpleMessage("الدرجة"), - "Grade percentage" : MessageLookupByLibrary.simpleMessage("النسبة المئوية للدرجة"), - "Graded" : MessageLookupByLibrary.simpleMessage("تم تقييم الدرجة"), - "Grades" : MessageLookupByLibrary.simpleMessage("الدرجات"), - "Help" : MessageLookupByLibrary.simpleMessage("المساعدة"), - "Hide Password" : MessageLookupByLibrary.simpleMessage("إخفاء كلمة المرور"), - "High Contrast Mode" : MessageLookupByLibrary.simpleMessage("وضع عالي التباين"), - "How are we doing?" : MessageLookupByLibrary.simpleMessage("كيف هو أداؤنا؟"), - "How is this affecting you?" : MessageLookupByLibrary.simpleMessage("كيف يؤثر عليك ذلك؟"), - "I can\'t get things done until I hear back from you." : MessageLookupByLibrary.simpleMessage("لا يمكنني القيام بأي شيء ما لم أحصل على رد منكم."), - "I don\'t have a Canvas account" : MessageLookupByLibrary.simpleMessage("ليس لدي حساب Canvas"), - "I have a Canvas account" : MessageLookupByLibrary.simpleMessage("لدي حساب Canvas"), - "I need some help but it\'s not urgent." : MessageLookupByLibrary.simpleMessage("أحتاج لبعض المساعدة لكن الأمر غير عاجل."), - "I\'m having trouble logging in" : MessageLookupByLibrary.simpleMessage("لدي مشكلة في تسجيل الدخول"), - "Idea for Canvas Parent App [Android]" : MessageLookupByLibrary.simpleMessage("أفكار لتطبيق Canvas Parent [Android]"), - "In order to provide you with a better experience, we have updated how reminders work. You can add new reminders by viewing an assignment or calendar event and tapping the switch under the \"Remind Me\" section.\n\nBe aware that any reminders created with older versions of this app will not be compatible with the new changes and you will need to create them again." : MessageLookupByLibrary.simpleMessage("لتقديم تجربة أفضل، قمنا بتحديث طريقة التذكيرات. يمكنك إضافة تذكيرات جديدة عن طريق عرض حدث مهمة أو تقويم والضغط على المفتاح تحت قسم \"ذكرني\".\n\nاعلم أن أي تذكيرات يتم إنشاؤها بإصدارات أقدم من هذا التطبيق ستكون غير متوافقة مع التغييرات الجديدة وستحتاج إلى إنشائها مجدداً."), - "Inbox" : MessageLookupByLibrary.simpleMessage("علبة الوارد"), - "Inbox Zero" : MessageLookupByLibrary.simpleMessage("علبة الوارد صفر"), - "Incomplete" : MessageLookupByLibrary.simpleMessage("غير مكتمل"), - "Incorrect Domain" : MessageLookupByLibrary.simpleMessage("مجال غير صالح"), - "Institution Announcement" : MessageLookupByLibrary.simpleMessage("إعلان المؤسسة"), - "Institution Announcements" : MessageLookupByLibrary.simpleMessage("إعلانات المؤسسة"), - "Instructions" : MessageLookupByLibrary.simpleMessage("الإرشادات"), - "Interactions on this page are limited by your institution." : MessageLookupByLibrary.simpleMessage("التفاعلات الموجودة في هذه الصفحة مقيدة بمؤسستك."), - "Invalid QR Code" : MessageLookupByLibrary.simpleMessage("رمز QR غير صالح"), - "It looks like a great day to rest, relax, and recharge." : MessageLookupByLibrary.simpleMessage("يبدو أنه يوم رائع للراحة والاسترخاء وتجديد النشاط."), - "It looks like assignments haven\'t been created in this space yet." : MessageLookupByLibrary.simpleMessage("يبدو أنه لم يتم إنشاء مهام في هذه المساحة حتى الآن."), - "Just a casual question, comment, idea, suggestion…" : MessageLookupByLibrary.simpleMessage("مجرد سؤال عابر أو تعليق أو فكرة أو اقتراح..."), - "Late" : MessageLookupByLibrary.simpleMessage("متأخر"), - "Launch External Tool" : MessageLookupByLibrary.simpleMessage("تشغيل الأداة الخارجية"), - "Legal" : MessageLookupByLibrary.simpleMessage("القانوني"), - "Light Mode" : MessageLookupByLibrary.simpleMessage("وضع فاتح"), - "Link Error" : MessageLookupByLibrary.simpleMessage("خطأ في الرابط"), - "Locale:" : MessageLookupByLibrary.simpleMessage("الإعدادات المحلية"), - "Locate QR Code" : MessageLookupByLibrary.simpleMessage("ابحث عن رمز QR"), - "Location" : MessageLookupByLibrary.simpleMessage("الموقع"), - "Locked" : MessageLookupByLibrary.simpleMessage("مؤمّن"), - "Log Out" : MessageLookupByLibrary.simpleMessage("تسجيل الخروج"), - "Login flow: Canvas" : MessageLookupByLibrary.simpleMessage("تدفق تسجيل الدخول: Canvas"), - "Login flow: Normal" : MessageLookupByLibrary.simpleMessage("تدفق تسجيل الدخول: عادي"), - "Login flow: Site Admin" : MessageLookupByLibrary.simpleMessage("تدفق تسجيل الدخول: مسؤول الموقع"), - "Login flow: Skip mobile verify" : MessageLookupByLibrary.simpleMessage("تدفق تسجيل الدخول: تخطي التحقق من الجوّال"), - "Manage Students" : MessageLookupByLibrary.simpleMessage("إدارة الطلاب"), - "Message" : MessageLookupByLibrary.simpleMessage("الرسالة"), - "Message subject" : MessageLookupByLibrary.simpleMessage("موضوع الرسالة"), - "Missing" : MessageLookupByLibrary.simpleMessage("مفقود"), - "Must be below 100" : MessageLookupByLibrary.simpleMessage("يجب أن تقل عن 100"), - "Network error" : MessageLookupByLibrary.simpleMessage("خطأ في الشبكة"), - "Never" : MessageLookupByLibrary.simpleMessage("أبدًا"), - "New message" : MessageLookupByLibrary.simpleMessage("رسالة جديدة"), - "No" : MessageLookupByLibrary.simpleMessage("لا"), - "No Alerts" : MessageLookupByLibrary.simpleMessage("لا توجد تنبيهات"), - "No Assignments" : MessageLookupByLibrary.simpleMessage("لا توجد أي مهام"), - "No Courses" : MessageLookupByLibrary.simpleMessage("لا يوجد أي مساق"), - "No Due Date" : MessageLookupByLibrary.simpleMessage("لا يوجد تاريخ استحقاق"), - "No Events Today!" : MessageLookupByLibrary.simpleMessage("لا توجد أحداث اليوم!"), - "No Grade" : MessageLookupByLibrary.simpleMessage("لا توجد أي درجة"), - "No Location Specified" : MessageLookupByLibrary.simpleMessage("لم يتم تحديد أي موقع"), - "No Students" : MessageLookupByLibrary.simpleMessage("لا يوجد طلاب"), - "No Subject" : MessageLookupByLibrary.simpleMessage("لا يوجد موضوع"), - "No Summary" : MessageLookupByLibrary.simpleMessage("لا يوجد ملخص"), - "No description" : MessageLookupByLibrary.simpleMessage("بلا وصف"), - "No recipients selected" : MessageLookupByLibrary.simpleMessage("لم يتم تحديد متلقين"), - "Not Graded" : MessageLookupByLibrary.simpleMessage("لم يتم التقييم"), - "Not Submitted" : MessageLookupByLibrary.simpleMessage("لم يتم الإرسال"), - "Not a parent?" : MessageLookupByLibrary.simpleMessage("لست ولي أمر؟"), - "Notifications for reminders about assignments and calendar events" : MessageLookupByLibrary.simpleMessage("إعلامات لتذكيرات حول المهام وأحداث التقويم"), - "OS Version" : MessageLookupByLibrary.simpleMessage("إصدار نظام التشغيل"), - "Observer" : MessageLookupByLibrary.simpleMessage("المراقب"), - "One of our other apps might be a better fit. Tap one to visit the Play Store." : MessageLookupByLibrary.simpleMessage("ربما تكون إحدى تطبيقاتنا الأخرى مناسبة بشكل أفضل. اضغط على واحد لزيارة Play Store."), - "Open Canvas Student" : MessageLookupByLibrary.simpleMessage("افتح Canvas Student"), - "Open In Browser" : MessageLookupByLibrary.simpleMessage("الفتح في المستعرض"), - "Open with another app" : MessageLookupByLibrary.simpleMessage("فتح بواسطة تطبيق آخر"), - "Pairing Code" : MessageLookupByLibrary.simpleMessage("رمز الإقران"), - "Password" : MessageLookupByLibrary.simpleMessage("كلمة المرور"), - "Password is required" : MessageLookupByLibrary.simpleMessage("كلمة المرور مطلوبة"), - "Password must contain at least 8 characters" : MessageLookupByLibrary.simpleMessage("يجب أن تحتوي كلمة المرور على 8 أحرف على الأقل"), - "Password…" : MessageLookupByLibrary.simpleMessage("كلمة المرور..."), - "Planner Note" : MessageLookupByLibrary.simpleMessage("ملاحظة المخطِط"), - "Please enter a valid email address" : MessageLookupByLibrary.simpleMessage("يرجى إدخال عنوان بريد إلكتروني صالح"), - "Please enter an email address" : MessageLookupByLibrary.simpleMessage("يُرجى إدخال عنوان بريد إلكتروني"), - "Please enter full name" : MessageLookupByLibrary.simpleMessage("يُرجى إدخال الاسم الكامل"), - "Please scan a QR code generated by Canvas" : MessageLookupByLibrary.simpleMessage("يرجى مسح رمز QR من إنشاء Canvas"), - "Plum, Purple" : MessageLookupByLibrary.simpleMessage("أرجواني، برقوقي"), - "Preparing…" : MessageLookupByLibrary.simpleMessage("جارٍ الإعداد..."), - "Previous Logins" : MessageLookupByLibrary.simpleMessage("عمليات تسجيل الدخول السابقة"), - "Privacy Policy" : MessageLookupByLibrary.simpleMessage("سياسة الخصوصية"), - "Privacy Policy Link" : MessageLookupByLibrary.simpleMessage("ارتباط سياسة الخصوصية"), - "Privacy policy, terms of use, open source" : MessageLookupByLibrary.simpleMessage("سياسة الخصوصية، شروط الاستخدام، المصدر المفتوح"), - "QR Code" : MessageLookupByLibrary.simpleMessage("رمز QR"), - "QR scanning requires camera access" : MessageLookupByLibrary.simpleMessage("مسح رمز QR يتطلب الوصول إلى الكاميرا"), - "Raspberry, Red" : MessageLookupByLibrary.simpleMessage("أحمر، لون التوت"), - "Recipients" : MessageLookupByLibrary.simpleMessage("المتلقون"), - "Refresh" : MessageLookupByLibrary.simpleMessage("تحديث"), - "Remind Me" : MessageLookupByLibrary.simpleMessage("ذكرني"), - "Reminders" : MessageLookupByLibrary.simpleMessage("التذكيرات"), - "Reminders have changed!" : MessageLookupByLibrary.simpleMessage("تم تغيير التذكيرات!"), - "Reply" : MessageLookupByLibrary.simpleMessage("رد"), - "Reply All" : MessageLookupByLibrary.simpleMessage("رد على الكل"), - "Report A Problem" : MessageLookupByLibrary.simpleMessage("الإبلاغ عن مشكلة"), - "Request Login Help" : MessageLookupByLibrary.simpleMessage("طلب مساعدة لتسجيل الدخول"), - "Request Login Help Button" : MessageLookupByLibrary.simpleMessage("زر طلب مساعدة لتسجيل الدخول"), - "Restart app" : MessageLookupByLibrary.simpleMessage("إعادة تشغيل التطبيق"), - "Retry" : MessageLookupByLibrary.simpleMessage("إعادة المحاولة"), - "Return to Login" : MessageLookupByLibrary.simpleMessage("العودة إلى تسجيل الدخول"), - "STUDENT" : MessageLookupByLibrary.simpleMessage("الطالب"), - "Screenshot showing location of QR code generation in browser" : MessageLookupByLibrary.simpleMessage("التقط لقطة شاشة لإظهار موقع إنشاء رمز QR في المستعرض"), - "Screenshot showing location of pairing QR code generation in the Canvas Student app" : MessageLookupByLibrary.simpleMessage("لقطة شاشة تظهر موقع إنشاء رمز QR للإقران في تطبيق Canvas Student"), - "Select" : MessageLookupByLibrary.simpleMessage("تحديد"), - "Select Student Color" : MessageLookupByLibrary.simpleMessage("حدد اللون المخصص للطالب"), - "Select recipients" : MessageLookupByLibrary.simpleMessage("تحديد متلقين"), - "Send Feedback" : MessageLookupByLibrary.simpleMessage("إرسال تعليقات"), - "Send a message about this assignment" : MessageLookupByLibrary.simpleMessage("إرسال رسالة حول هذه المهمة"), - "Send a message about this course" : MessageLookupByLibrary.simpleMessage("إرسال رسالة حول هذا المساق"), - "Send message" : MessageLookupByLibrary.simpleMessage("إرسال رسالة"), - "Set a date and time to be notified of this event." : MessageLookupByLibrary.simpleMessage("تعيين تاريخ ووقت للإعلام بهذا الحدث."), - "Set a date and time to be notified of this specific assignment." : MessageLookupByLibrary.simpleMessage("تعيين تاريخ ووقت للإعلام بهذه المهمة المحددة."), - "Settings" : MessageLookupByLibrary.simpleMessage("الإعدادات"), - "Shamrock, Green" : MessageLookupByLibrary.simpleMessage("أخضر، النفل"), - "Share Your Love for the App" : MessageLookupByLibrary.simpleMessage("شارك إعجابك بالتطبيق"), - "Show Password" : MessageLookupByLibrary.simpleMessage("إظهار كلمة المرور"), - "Sign In" : MessageLookupByLibrary.simpleMessage("تسجيل الدخول"), - "Something went wrong trying to create your account, please reach out to your school for assistance." : MessageLookupByLibrary.simpleMessage("حدث خطأ ما أثناء محاولة إنشاء حسابك، يرجى الاتصال بمدرستك للمساعدة."), - "Something\'s broken but I can work around it to get what I need done." : MessageLookupByLibrary.simpleMessage("شيء ما معطل لكن بإمكاني إتمام المهام التي يجب أن أقوم بإنجازها."), - "Stop Acting as User" : MessageLookupByLibrary.simpleMessage("إيقاف التصرف كمستخدم"), - "Student" : MessageLookupByLibrary.simpleMessage("الطالب"), - "Student Pairing" : MessageLookupByLibrary.simpleMessage("إقران الطالب"), - "Students can create a QR code using the Canvas Student app on their mobile device" : MessageLookupByLibrary.simpleMessage("يستطيع الطلاب إنشاء رمز QR باستخدام تطبيق Canvas Student على أجهزتهم المحمولة"), - "Students can obtain a pairing code through the Canvas website" : MessageLookupByLibrary.simpleMessage("يمكن للطلاب الحصول على رمز إقران من خلال موقع Canvas على الويب."), - "Subject" : MessageLookupByLibrary.simpleMessage("الموضوع"), - "Submitted" : MessageLookupByLibrary.simpleMessage("تم الإرسال"), - "Successfully submitted!" : MessageLookupByLibrary.simpleMessage("تم الإرسال بنجاح!"), - "Summary" : MessageLookupByLibrary.simpleMessage("ملخص"), - "Switch Users" : MessageLookupByLibrary.simpleMessage("تبديل المستخدمين"), - "Syllabus" : MessageLookupByLibrary.simpleMessage("المناهج"), - "TA" : MessageLookupByLibrary.simpleMessage("مساعد المعلم"), - "TEACHER" : MessageLookupByLibrary.simpleMessage("المعلم"), - "Tap to favorite the courses you want to see on the Calendar. Select up to 10." : MessageLookupByLibrary.simpleMessage("اضغط إضافة المساقات إلى المفضلة التي ترغب في رؤيتها على التقويم. تحديد 10 بحد أقصى."), - "Tap to pair with a new student" : MessageLookupByLibrary.simpleMessage("اضغط لإقران مع طالب جديد"), - "Tap to select this student" : MessageLookupByLibrary.simpleMessage("اضغط لتحديد هذا الطالب"), - "Tap to show student selector" : MessageLookupByLibrary.simpleMessage("اضغط لإظهار أداة تحديد الطلاب"), - "Teacher" : MessageLookupByLibrary.simpleMessage("المعلم"), - "Tell us about your favorite parts of the app" : MessageLookupByLibrary.simpleMessage("أخبرنا بالأشياء التي تفضلها في التطبيق"), - "Terms of Service" : MessageLookupByLibrary.simpleMessage("شروط الخدمة"), - "Terms of Service Link" : MessageLookupByLibrary.simpleMessage("ارتباط شروط الخدمة"), - "Terms of Use" : MessageLookupByLibrary.simpleMessage("شروط الاستخدام"), - "The QR code you scanned may have expired. Refresh the code on the student\'s device and try again." : MessageLookupByLibrary.simpleMessage("ربما يكون رمز QR الذي مسحته انتهت صلاحيته. قم بتحديث الرمز على جهاز الطالب وأعد المحاولة."), - "The following information will help us better understand your idea:" : MessageLookupByLibrary.simpleMessage("ستساعدنا المعلومات التالية على فهم فكرتك بشكل أفضل:"), - "The server you entered is not authorized for this app." : MessageLookupByLibrary.simpleMessage("الخادم الذي أدخلته غير مخول لهذا التطبيق."), - "The student you are trying to add belongs to a different school. Log in or create an account with that school to scan this code." : MessageLookupByLibrary.simpleMessage("الطالب الذي تحاول إضافته يتبع مدرسة مختلفة. سجّل الدخول أو أنشئ حساباً في هذه المدرسة لمسح هذا الرمز."), - "The user agent for this app is not authorized." : MessageLookupByLibrary.simpleMessage("وكيل المستخدم لهذا التطبيق غير مخوَّل."), - "Theme" : MessageLookupByLibrary.simpleMessage("النسق"), - "There are no installed applications that can open this file" : MessageLookupByLibrary.simpleMessage("لا توجد تطبيقات مثبتة يمكن من خلالها فتح هذا الملف"), - "There is no page information available." : MessageLookupByLibrary.simpleMessage("لا تتوفر أي صفحة معلومات"), - "There was a problem loading the Terms of Use" : MessageLookupByLibrary.simpleMessage("حدثت مشكلة أثناء تحميل شروط الاستخدام"), - "There was a problem removing this student from your account. Please check your connection and try again." : MessageLookupByLibrary.simpleMessage("حدثت مشكلة في إزالة هذا الطالب من حسابك. يرجى التحقق من الاتصال وإعادة المحاولة."), - "There was an error loading recipients for this course" : MessageLookupByLibrary.simpleMessage("حدث خطأ أثناء تحميل متلقين لهذا المساق"), - "There was an error loading the summary details for this course." : MessageLookupByLibrary.simpleMessage("حدث خطأ أثناء تحميل تفاصيل الملخص لهذا المساق."), - "There was an error loading this announcement" : MessageLookupByLibrary.simpleMessage("حدث خطأ أثناء تحميل هذا الإعلان"), - "There was an error loading this conversation" : MessageLookupByLibrary.simpleMessage("حدث خطأ أثناء تحميل هذه المحادثة"), - "There was an error loading this file" : MessageLookupByLibrary.simpleMessage("حدث خطأ أثناء تحميل هذا الملف"), - "There was an error loading your inbox messages." : MessageLookupByLibrary.simpleMessage("حدث خطأ أثناء تحميل رسائلك في علبة الوارد."), - "There was an error loading your student\'s alerts." : MessageLookupByLibrary.simpleMessage("حدث خطأ أثناء تحميل تنبيهات الطالب."), - "There was an error loading your student\'s calendar" : MessageLookupByLibrary.simpleMessage("حدث خطأ أثناء تحميل تقويم الطالب."), - "There was an error loading your students." : MessageLookupByLibrary.simpleMessage("حدث خطأ أثناء تحميل طلابك."), - "There was an error loading your student’s courses." : MessageLookupByLibrary.simpleMessage("حدث خطأ أثناء تحميل مساقات الطالب لديك."), - "There was an error logging in. Please generate another QR Code and try again." : MessageLookupByLibrary.simpleMessage("حدث خطأ أثناء تسجيل الدخول. يرجى إنشاء رمز QR وإعادة المحاولة."), - "There was an error trying to act as this user. Please check the Domain and User ID and try again." : MessageLookupByLibrary.simpleMessage("حدث خطأ ما في التصرف باعتبارك هذا المستخدم. يرجى التحقق من المجال ومعرف المستخدم وإعادة المحاولة."), - "There’s nothing to be notified of yet." : MessageLookupByLibrary.simpleMessage("لا يوجد شيء للإعلام عنه حتى الآن."), - "This app is not authorized for use." : MessageLookupByLibrary.simpleMessage("هذا التطبيق غير مخول للاستخدام."), - "This course does not have any assignments or calendar events yet." : MessageLookupByLibrary.simpleMessage("لا يحتوي هذا المساق على أي مهام أو أحداث بالتقويم حتى الآن."), - "This file is unsupported and can’t be viewed through the app" : MessageLookupByLibrary.simpleMessage("هذا الملف غير مدعوم ولا يمكن عرضه من خلال التطبيق"), - "This will unpair and remove all enrollments for this student from your account." : MessageLookupByLibrary.simpleMessage("سيؤدي هذا إلى إلغاء الإقران وإزالة جميع التسجيلات لهذا الطالب من حسابك."), - "Total Grade" : MessageLookupByLibrary.simpleMessage("التقدير الإجمالي"), - "Uh oh!" : MessageLookupByLibrary.simpleMessage("عذرًا!"), - "Unable to fetch courses. Please check your connection and try again." : MessageLookupByLibrary.simpleMessage("يتعذر إحضار المساقات. يرجى التحقق من الاتصال وإعادة المحاولة."), - "Unable to load this image" : MessageLookupByLibrary.simpleMessage("يتعذر تحميل هذه الصورة"), - "Unable to play this media file" : MessageLookupByLibrary.simpleMessage("يتعذر تشغيل ملف الوسائط هذا"), - "Unable to send message. Check your connection and try again." : MessageLookupByLibrary.simpleMessage("يتعذر إرسال رسالة. تحقق من الاتصال وأعد المحاولة."), - "Under Construction" : MessageLookupByLibrary.simpleMessage("تحت الإنشاء"), - "Unknown User" : MessageLookupByLibrary.simpleMessage("مستخدم غير معروف"), - "Unsaved changes" : MessageLookupByLibrary.simpleMessage("تغييرات غير محفوظة"), - "Unsupported File" : MessageLookupByLibrary.simpleMessage("الملف غير مدعوم"), - "Upload File" : MessageLookupByLibrary.simpleMessage("تحميل ملف"), - "Use Camera" : MessageLookupByLibrary.simpleMessage("استخدام الكاميرا"), - "Use Dark Theme in Web Content" : MessageLookupByLibrary.simpleMessage("استخدام النسق الداكن في محتوى الويب"), - "User ID" : MessageLookupByLibrary.simpleMessage("معرف المستخدم"), - "User ID:" : MessageLookupByLibrary.simpleMessage("معرف المستخدم:"), - "Version Number" : MessageLookupByLibrary.simpleMessage("رقم الإصدار"), - "View Description" : MessageLookupByLibrary.simpleMessage("وصف طريقة عرض"), - "View error details" : MessageLookupByLibrary.simpleMessage("عرض تفاصيل الخطأ"), - "View the Privacy Policy" : MessageLookupByLibrary.simpleMessage("عرض سياسة الخصوصية"), - "We are currently building this feature for your viewing pleasure." : MessageLookupByLibrary.simpleMessage("نقوم في الوقت الحالي ببناء هذه الميزة لتستمتع بالعرض."), - "We are unable to display this link, it may belong to an institution you currently aren\'t logged in to." : MessageLookupByLibrary.simpleMessage("لم يمكننا عرض هذا الرابط، قد يكون تابعاً لمؤسسة لم تسجل الدخول إليها في الوقت الحالي."), - "We couldn\'t find any students associated with this account" : MessageLookupByLibrary.simpleMessage("تعذر علينا العثور على أي طلاب مقترنين بهذا الحساب"), - "We were unable to verify the server for use with this app." : MessageLookupByLibrary.simpleMessage("لم نتمكن من التحقق من الخادم لاستخدامه مع هذا التطبيق."), - "We’re not sure what happened, but it wasn’t good. Contact us if this keeps happening." : MessageLookupByLibrary.simpleMessage("لا نعلم على وجه الدقة بما حدث، ولكنه لم يكن أمراً جيداً. اتصل بنا إذا استمر هذا في الحدوث."), - "What can we do better?" : MessageLookupByLibrary.simpleMessage("ماذا يمكننا فعله لتطوير أداءنا؟"), - "Yes" : MessageLookupByLibrary.simpleMessage("نعم"), - "You are not observing any students." : MessageLookupByLibrary.simpleMessage("أنت لا تراقب أي طالب."), - "You may only choose 10 calendars to display" : MessageLookupByLibrary.simpleMessage("يمكنك اختيار 10 تقويمات فقط لعرضها"), - "You must enter a user id" : MessageLookupByLibrary.simpleMessage("يجب أن تدخل معرف مستخدم"), - "You must enter a valid domain" : MessageLookupByLibrary.simpleMessage("يجب عليك إدخال مجال صالح"), - "You must select at least one calendar to display" : MessageLookupByLibrary.simpleMessage("يجب عليك تحديد تقويم واحد على الأقل للعرض"), - "You will be notified about this assignment on…" : MessageLookupByLibrary.simpleMessage("سيتم إعلامك بهذه المهمة في..."), - "You will be notified about this event on…" : MessageLookupByLibrary.simpleMessage("سيتم إعلامك بهذا الحدث في..."), - "You\'ll find the QR code on the web in your account profile. Click \'QR for Mobile Login\' in the list." : MessageLookupByLibrary.simpleMessage("ستجد رمز QR على الويب في ملف تعريف حسابك. انقر فوق \"QR لتسجيل دخول الجوال\" في القائمة."), - "You\'ll need to open your student\'s Canvas Student app to continue. Go into Main Menu > Settings > Pair with Observer and scan the QR code you see there." : MessageLookupByLibrary.simpleMessage("ستحتاج إلى فتح تطبيق Canvas Student لدى الطالب للمتابعة. انتقل إلى القائمة الرئيسية > الإعدادات > إقران مع Observer ثم امسح رمز QR الذي تراه هناك."), - "Your code is incorrect or expired." : MessageLookupByLibrary.simpleMessage("رمزك غير صحيح أو منته الصلاحية."), - "Your student’s courses might not be published yet." : MessageLookupByLibrary.simpleMessage("ربما لم يتم نشر مساقات الطالب بعد."), - "You’re all caught up!" : MessageLookupByLibrary.simpleMessage("لقد اطلعت عليها جميعًا!"), - "actingAsUser" : m0, - "alertsLabel" : MessageLookupByLibrary.simpleMessage("التنبيهات"), - "appVersion" : m1, - "assignmentGradeAboveThreshold" : m2, - "assignmentGradeBelowThreshold" : m3, - "assignmentLockedModule" : m4, - "assignmentSubjectMessage" : m5, - "assignmentTotalPoints" : m6, - "assignmentTotalPointsAccessible" : m7, - "authorToNOthers" : m8, - "authorToRecipient" : m9, - "authorToRecipientAndNOthers" : m10, - "badgeNumberPlus" : m11, - "calendarLabel" : MessageLookupByLibrary.simpleMessage("التقويم"), - "canvasGuides" : MessageLookupByLibrary.simpleMessage("Canvas Guides"), - "canvasLogoLabel" : MessageLookupByLibrary.simpleMessage("شعار Canvas"), - "canvasSupport" : MessageLookupByLibrary.simpleMessage("Canvas Support"), - "changeStudentColorLabel" : m12, - "collapse" : MessageLookupByLibrary.simpleMessage("طي"), - "collapsed" : MessageLookupByLibrary.simpleMessage("تم الطي"), - "contentDescriptionScoreOutOfPointsPossible" : m13, - "courseForWhom" : m14, - "courseGradeAboveThreshold" : m15, - "courseGradeBelowThreshold" : m16, - "coursesLabel" : MessageLookupByLibrary.simpleMessage("المساقات"), - "dateAtTime" : m17, - "dismissAlertLabel" : m18, - "domainSearchHelpBody" : m19, - "domainSearchHelpLabel" : MessageLookupByLibrary.simpleMessage("كيف أعثر على مدرستي أو دائرتي التعليمية؟"), - "domainSearchInputHint" : MessageLookupByLibrary.simpleMessage("أدخل اسم المدرسة أو الدائرة التعليمية..."), - "dueDateAtTime" : m20, - "endMasqueradeLogoutMessage" : m21, - "endMasqueradeMessage" : m22, - "eventSubjectMessage" : m23, - "eventTime" : m24, - "expand" : MessageLookupByLibrary.simpleMessage("توسيع"), - "expanded" : MessageLookupByLibrary.simpleMessage("تم التوسيع"), - "finalGrade" : m25, - "findSchool" : MessageLookupByLibrary.simpleMessage("البحث عن مدرسة"), - "frontPageSubjectMessage" : m26, - "gradeFormatScoreOutOfPointsPossible" : m27, - "gradesSubjectMessage" : m28, - "latePenalty" : m29, - "me" : MessageLookupByLibrary.simpleMessage("أنا"), - "messageLinkPostscript" : m30, - "minus" : MessageLookupByLibrary.simpleMessage("سالب"), - "mustBeAboveN" : m31, - "mustBeBelowN" : m32, - "next" : MessageLookupByLibrary.simpleMessage("التالي"), - "nextMonth" : m33, - "nextWeek" : m34, - "noDomainResults" : m35, - "ok" : MessageLookupByLibrary.simpleMessage("موافق"), - "outOfPoints" : m36, - "plusRecipientCount" : m37, - "pointsPossible" : m38, - "previousMonth" : m39, - "previousWeek" : m40, - "qrCreateAccountTos" : m41, - "ratingDialogEmailSubject" : m42, - "selectedMonthLabel" : m43, - "send" : MessageLookupByLibrary.simpleMessage("إرسال"), - "starRating" : m44, - "submissionStatusSuccessSubtitle" : m45, - "syllabusSubjectMessage" : m46, - "unread" : MessageLookupByLibrary.simpleMessage("غير مقروء"), - "unreadCount" : m47 - }; -} diff --git a/apps/flutter_parent/lib/l10n/generated/messages_ca.dart b/apps/flutter_parent/lib/l10n/generated/messages_ca.dart deleted file mode 100644 index 286f0d8f53..0000000000 --- a/apps/flutter_parent/lib/l10n/generated/messages_ca.dart +++ /dev/null @@ -1,473 +0,0 @@ -// DO NOT EDIT. This is code generated via package:intl/generate_localized.dart -// This is a library that provides messages for a ca locale. All the -// messages from the main program should be duplicated here with the same -// function name. - -// Ignore issues from commonly used lints in this file. -// ignore_for_file:unnecessary_brace_in_string_interps, unnecessary_new -// ignore_for_file:prefer_single_quotes,comment_references, directives_ordering -// ignore_for_file:annotate_overrides,prefer_generic_function_type_aliases -// ignore_for_file:unused_import, file_names - -import 'package:intl/intl.dart'; -import 'package:intl/message_lookup_by_library.dart'; - -final messages = new MessageLookup(); - -typedef String MessageIfAbsent(String messageStr, List args); - -class MessageLookup extends MessageLookupByLibrary { - String get localeName => 'ca'; - - static m0(userName) => "Esteu fent de ${userName}"; - - static m1(version) => "versió ${version}"; - - static m2(threshold) => "Qualificació de la tasca per sobre de ${threshold}"; - - static m3(threshold) => "Qualificació de la tasca per sota de ${threshold}"; - - static m4(moduleName) => "El mòdul “${moduleName}” bloqueja aquesta tasca."; - - static m5(studentName, assignmentName) => "Sobre: ${studentName}, tasca - ${assignmentName}"; - - static m6(points) => "${points} punts"; - - static m7(points) => "${points} punts"; - - static m8(authorName, howMany) => "${Intl.plural(howMany, one: '${authorName} a 1 altre', other: '${authorName} a ${howMany} més')}"; - - static m9(authorName, recipientName) => "De ${authorName} a ${recipientName}"; - - static m10(authorName, recipientName, howMany) => "${Intl.plural(howMany, one: '${authorName} a ${recipientName} i 1 altre', other: '${authorName} a ${recipientName} i ${howMany} més')}"; - - static m11(count) => "${count}+"; - - static m12(studentName) => "Canvia el color de ${studentName}"; - - static m13(score, pointsPossible) => "${score} de ${pointsPossible} punts"; - - static m14(studentShortName) => "per a ${studentShortName}"; - - static m15(threshold) => "Qualificació del curs per sobre de ${threshold}"; - - static m16(threshold) => "Qualificació del curs per sota de ${threshold}"; - - static m17(date, time) => "${date} a les ${time}"; - - static m18(alertTitle) => "Descarta ${alertTitle}"; - - static m19(canvasGuides, canvasSupport) => "Proveu de cercar pel nom de l\'escola o districte al qual intenteu accedir, com ara “Escola Privada Smith” o “Escoles de la Regió d\'Smith”. També podeu introduir un domini del Canvas directament, com ara “smith.instructure.com.”\n\nPer obtenir més informació sobre com cercar el compte del Canvas de la vostra institució, podeu consultar les ${canvasGuides}, contactar amb l\'${canvasSupport}, o posar-vos en contacte amb la vostra escola per obtenir assistència."; - - static m20(date, time) => "Venç el ${date} a les ${time}"; - - static m21(userName) => "Deixareu d\'actuar com a ${userName} i es tancarà la vostra sessió."; - - static m22(userName) => "Deixareu d\'actuar com a ${userName} i tornareu al vostre compte original."; - - static m23(studentName, eventTitle) => "Sobre: ${studentName}, esdeveniment - ${eventTitle}"; - - static m24(startAt, endAt) => "${startAt} - ${endAt}"; - - static m25(grade) => "Qualificació final: ${grade}"; - - static m26(studentName) => "Sobre: ${studentName}, pàgina frontal"; - - static m27(score, pointsPossible) => "${score} / ${pointsPossible}"; - - static m28(studentName) => "Sobre: ${studentName}, qualificacions"; - - static m29(pointsLost) => "Sanció per endarreriment (-${pointsLost})"; - - static m30(studentName, linkUrl) => "Sobre: ${studentName}, ${linkUrl}"; - - static m31(percentage) => "Ha de ser superior a ${percentage}"; - - static m32(percentage) => "Ha de ser inferior a ${percentage}"; - - static m33(month) => "El mes que ve: ${month}"; - - static m34(date) => "La setmana que ve a partir del ${date}"; - - static m35(query) => "No s\'han trobat escoles que coincideixin amb “${query}”"; - - static m36(points, howMany) => "${Intl.plural(howMany, one: 'D\'1 punt', other: 'De ${points} punts')}"; - - static m37(count) => "+${count}"; - - static m38(points) => "${points} punts possibles"; - - static m39(month) => "El mes passat: ${month}"; - - static m40(date) => "La setmana passada a partir del ${date}"; - - static m41(termsOfService, privacyPolicy) => "En tocar \"Crea un compte\", accepteu les ${termsOfService} i reconeixeu la ${privacyPolicy}."; - - static m42(version) => "Suggeriments per a Android - Canvas Parent ${version}"; - - static m43(month) => "Mes de ${month}"; - - static m44(position) => "${Intl.plural(position, one: '${position} estrella', other: '${position} estrelles')}"; - - static m45(date, time) => "Aquesta tasca es va entregar el ${date} a les ${time} i està a l\'espera de qualificació"; - - static m46(studentName) => "Sobre: ${studentName}, temari"; - - static m47(count) => "${count} sense llegir"; - - final messages = _notInlinedMessages(_notInlinedMessages); - static _notInlinedMessages(_) => { - "\"Act as\" is essentially logging in as this user without a password. You will be able to take any action as if you were this user, and from other users\' points of views, it will be as if this user performed them. However, audit logs record that you were the one who performed the actions on behalf of this user." : MessageLookupByLibrary.simpleMessage("“Actua com” vol dir bàsicament iniciar la sessió com aquest usuari sense una contrasenya. Podreu fer qualsevol acció com si fóssiu aquest usuari, i des del punt de vista dels altres usuaris, serà com si les hagués dut a terme aquest usuari. Tanmateix, els registres d\'auditoria enregistren que heu sigut vós qui ha dut a terme les accions en nom de l\'altre usuari."), - "-" : MessageLookupByLibrary.simpleMessage("-"), - "A description is required." : MessageLookupByLibrary.simpleMessage("Cal una descripció."), - "A network error occurred when adding this student. Check your connection and try again." : MessageLookupByLibrary.simpleMessage("S\'ha produït un error de xarxa en afegir aquest estudiant. Reviseu la connexió i torneu-ho a provar."), - "A subject is required." : MessageLookupByLibrary.simpleMessage("Cal un assumpte."), - "Act As User" : MessageLookupByLibrary.simpleMessage("Actua com un usuari"), - "Add Student" : MessageLookupByLibrary.simpleMessage("Afegeix un estudiant"), - "Add attachment" : MessageLookupByLibrary.simpleMessage("Afegeix un fitxer adjunt"), - "Add new student" : MessageLookupByLibrary.simpleMessage("Afegeix un estudiant nou"), - "Add student with…" : MessageLookupByLibrary.simpleMessage("Afegeix un estudiant amb..."), - "Alert Settings" : MessageLookupByLibrary.simpleMessage("Configuració de l\'avís"), - "Alert me when…" : MessageLookupByLibrary.simpleMessage("Avisa\'m quan..."), - "All Grading Periods" : MessageLookupByLibrary.simpleMessage("Tots els períodes de qualificació"), - "Already have an account? " : MessageLookupByLibrary.simpleMessage("Ja teniu un compte? "), - "An email address is required." : MessageLookupByLibrary.simpleMessage("Cal una adreça electrònica."), - "An error occurred when trying to display this link" : MessageLookupByLibrary.simpleMessage("S\'ha produït un error en provar de mostrar aquest enllaç"), - "An error occurred while saving your selection. Please try again." : MessageLookupByLibrary.simpleMessage("S\'ha produït un error en desar la vostra selecció. Torneu-ho a provar."), - "An unexpected error occurred" : MessageLookupByLibrary.simpleMessage("S\'ha produït un error inesperat"), - "Android OS version" : MessageLookupByLibrary.simpleMessage("Versió del sistema operatiu Android"), - "Appearance" : MessageLookupByLibrary.simpleMessage("Aspecte"), - "Application version" : MessageLookupByLibrary.simpleMessage("Versió de l\'aplicació"), - "Are you a student or teacher?" : MessageLookupByLibrary.simpleMessage("Sou un estudiant o professor?"), - "Are you sure you want to log out?" : MessageLookupByLibrary.simpleMessage("Segur que voleu tancar la sessió?"), - "Are you sure you wish to close this page? Your unsent message will be lost." : MessageLookupByLibrary.simpleMessage("Segur que voleu tancar aquesta pàgina? El vostre missatge no enviat es perdrà."), - "Assignment Details" : MessageLookupByLibrary.simpleMessage("Detalls de la tasca"), - "Assignment grade above" : MessageLookupByLibrary.simpleMessage("Qualificació de la tasca per sobre de"), - "Assignment grade below" : MessageLookupByLibrary.simpleMessage("Qualificació de la tasca per sota de"), - "Assignment missing" : MessageLookupByLibrary.simpleMessage("Falta la tasca"), - "Barney, Fuschia" : MessageLookupByLibrary.simpleMessage("Barney, fúcsia"), - "Calendars" : MessageLookupByLibrary.simpleMessage("Calendaris"), - "Camera Permission" : MessageLookupByLibrary.simpleMessage("Permís per a la càmera"), - "Cancel" : MessageLookupByLibrary.simpleMessage("Cancel·la"), - "Canvas Student" : MessageLookupByLibrary.simpleMessage("Canvas Student"), - "Canvas Teacher" : MessageLookupByLibrary.simpleMessage("Canvas Teacher"), - "Canvas on GitHub" : MessageLookupByLibrary.simpleMessage("Canvas a GitHub"), - "Choose a course to message" : MessageLookupByLibrary.simpleMessage("Trieu un curs per enviar el missatge"), - "Choose from Gallery" : MessageLookupByLibrary.simpleMessage("Tria de la galeria"), - "Complete" : MessageLookupByLibrary.simpleMessage("Complet"), - "Contact Support" : MessageLookupByLibrary.simpleMessage("Contacta amb l\'assistència tècnica"), - "Course Announcement" : MessageLookupByLibrary.simpleMessage("Anunci del curs"), - "Course Announcements" : MessageLookupByLibrary.simpleMessage("Anuncis del curs"), - "Course grade above" : MessageLookupByLibrary.simpleMessage("Qualificació del curs per sobre de"), - "Course grade below" : MessageLookupByLibrary.simpleMessage("Qualificació del curs per sota de"), - "Create Account" : MessageLookupByLibrary.simpleMessage("Crea un compte"), - "Dark Mode" : MessageLookupByLibrary.simpleMessage("Mode fosc"), - "Date" : MessageLookupByLibrary.simpleMessage("Data"), - "Delete" : MessageLookupByLibrary.simpleMessage("Suprimeix"), - "Description" : MessageLookupByLibrary.simpleMessage("Descripció"), - "Device" : MessageLookupByLibrary.simpleMessage("Dispositiu"), - "Device model" : MessageLookupByLibrary.simpleMessage("Model del dispositiu"), - "Domain" : MessageLookupByLibrary.simpleMessage("Domini"), - "Domain:" : MessageLookupByLibrary.simpleMessage("Domini:"), - "Don\'t show again" : MessageLookupByLibrary.simpleMessage("No ho tornis a mostrar"), - "Done" : MessageLookupByLibrary.simpleMessage("Fet"), - "Download" : MessageLookupByLibrary.simpleMessage("Baixa"), - "Due" : MessageLookupByLibrary.simpleMessage("Venciment"), - "EXTREME CRITICAL EMERGENCY!!" : MessageLookupByLibrary.simpleMessage("EMERGÈNCIA DE CRÍTICA IMPORTÀNCIA!!"), - "Electric, blue" : MessageLookupByLibrary.simpleMessage("Elèctric, blau"), - "Email Address" : MessageLookupByLibrary.simpleMessage("Adreça electrònica"), - "Email:" : MessageLookupByLibrary.simpleMessage("Adreça electrònica:"), - "Email…" : MessageLookupByLibrary.simpleMessage("Adreça electrònica..."), - "Enter the student pairing code provided to you. If the pairing code doesn\'t work, it may have expired" : MessageLookupByLibrary.simpleMessage("Introduïu el codi d\'emparellament d\'estudiants que se us ha proporcionat. Si el codi d\'emparellament no funciona, pot ser que hagi caducat"), - "Event" : MessageLookupByLibrary.simpleMessage("Esdeveniment"), - "Excused" : MessageLookupByLibrary.simpleMessage("Excusat"), - "Expired QR Code" : MessageLookupByLibrary.simpleMessage("Codi QR caducat"), - "Failed. Tap for options." : MessageLookupByLibrary.simpleMessage("S\'ha produït un error. Toqueu per veure les opcions."), - "Filter" : MessageLookupByLibrary.simpleMessage("Filtre"), - "Filter by" : MessageLookupByLibrary.simpleMessage("Filtra per"), - "Fire, Orange" : MessageLookupByLibrary.simpleMessage("Foc, taronja"), - "Front Page" : MessageLookupByLibrary.simpleMessage("Pàgina frontal"), - "Full Name" : MessageLookupByLibrary.simpleMessage("Nom complet"), - "Full Name…" : MessageLookupByLibrary.simpleMessage("Nom complet..."), - "Full error message" : MessageLookupByLibrary.simpleMessage("Missatge d\'error complet"), - "Go to today" : MessageLookupByLibrary.simpleMessage("Vés a avui"), - "Grade" : MessageLookupByLibrary.simpleMessage("Qualificació"), - "Grade percentage" : MessageLookupByLibrary.simpleMessage("Percentatge de la qualificació"), - "Graded" : MessageLookupByLibrary.simpleMessage("Qualificat"), - "Grades" : MessageLookupByLibrary.simpleMessage("Qualificacions"), - "Help" : MessageLookupByLibrary.simpleMessage("Ajuda"), - "Hide Password" : MessageLookupByLibrary.simpleMessage("Amaga la contrasenya"), - "High Contrast Mode" : MessageLookupByLibrary.simpleMessage("Mode de contrast alt"), - "How are we doing?" : MessageLookupByLibrary.simpleMessage("Com ho estem fem?"), - "How is this affecting you?" : MessageLookupByLibrary.simpleMessage("Com us afecta això?"), - "I can\'t get things done until I hear back from you." : MessageLookupByLibrary.simpleMessage("No podré fer res fins que em respongueu."), - "I don\'t have a Canvas account" : MessageLookupByLibrary.simpleMessage("No tinc un compte del Canvas"), - "I have a Canvas account" : MessageLookupByLibrary.simpleMessage("Tinc un compte del Canvas"), - "I need some help but it\'s not urgent." : MessageLookupByLibrary.simpleMessage("Necessito ajuda, però no és urgent."), - "I\'m having trouble logging in" : MessageLookupByLibrary.simpleMessage("Tinc problemes per iniciar la sessió"), - "Idea for Canvas Parent App [Android]" : MessageLookupByLibrary.simpleMessage("Idea per a l\'aplicació Canvas Parent (Android)"), - "In order to provide you with a better experience, we have updated how reminders work. You can add new reminders by viewing an assignment or calendar event and tapping the switch under the \"Remind Me\" section.\n\nBe aware that any reminders created with older versions of this app will not be compatible with the new changes and you will need to create them again." : MessageLookupByLibrary.simpleMessage("Per tal de proporcionar-vos una millor experiència, hem actualitzat la manera com funcionen els recordatoris. Podeu afegir recordatoris nous en visualitzar una tasca o esdeveniment del calendari i tocant el botó a sota de la secció \"Recorda-m\'ho\".\n\nTingueu en compte que els recordatoris creats amb les versions anteriors de l\'aplicació no seran compatibles amb els nous canvis i els haureu de tornar a crear."), - "Inbox" : MessageLookupByLibrary.simpleMessage("Safata d\'entrada"), - "Inbox Zero" : MessageLookupByLibrary.simpleMessage("Safata d\'entrada buida"), - "Incomplete" : MessageLookupByLibrary.simpleMessage("Incomplet"), - "Incorrect Domain" : MessageLookupByLibrary.simpleMessage("Domini incorrecte"), - "Institution Announcement" : MessageLookupByLibrary.simpleMessage("Anunci de la institució"), - "Institution Announcements" : MessageLookupByLibrary.simpleMessage("Anuncis de la institució"), - "Instructions" : MessageLookupByLibrary.simpleMessage("Instruccions"), - "Interactions on this page are limited by your institution." : MessageLookupByLibrary.simpleMessage("La vostra institució ha limitat les interaccions en aquesta pàgina."), - "Invalid QR Code" : MessageLookupByLibrary.simpleMessage("Codi QR no vàlid"), - "It looks like a great day to rest, relax, and recharge." : MessageLookupByLibrary.simpleMessage("Sembla un dia fabulós per descansar, relaxar-se i carregar piles."), - "It looks like assignments haven\'t been created in this space yet." : MessageLookupByLibrary.simpleMessage("Sembla que en aquest espai encara no s\'ha creat cap tasca."), - "Just a casual question, comment, idea, suggestion…" : MessageLookupByLibrary.simpleMessage("Simplement una pregunta, un comentari, una idea, un suggeriment informal…"), - "Late" : MessageLookupByLibrary.simpleMessage("Tardà"), - "Launch External Tool" : MessageLookupByLibrary.simpleMessage("Inicieu l\'eina externa"), - "Legal" : MessageLookupByLibrary.simpleMessage("Jurídic"), - "Light Mode" : MessageLookupByLibrary.simpleMessage("Mode clar"), - "Link Error" : MessageLookupByLibrary.simpleMessage("Error d\'enllaç"), - "Locale:" : MessageLookupByLibrary.simpleMessage("Zona:"), - "Locate QR Code" : MessageLookupByLibrary.simpleMessage("Localitzeu el codi QR"), - "Location" : MessageLookupByLibrary.simpleMessage("Ubicació"), - "Locked" : MessageLookupByLibrary.simpleMessage("Bloquejat"), - "Log Out" : MessageLookupByLibrary.simpleMessage("Tanca la sessió"), - "Login flow: Canvas" : MessageLookupByLibrary.simpleMessage("Flux d\'inici de sessió: Canvas"), - "Login flow: Normal" : MessageLookupByLibrary.simpleMessage("Flux d\'inici de sessió: Normal"), - "Login flow: Site Admin" : MessageLookupByLibrary.simpleMessage("Flux d\'inici de sessió: Administrador del lloc web"), - "Login flow: Skip mobile verify" : MessageLookupByLibrary.simpleMessage("Flux d\'inici de sessió: Omet la verificació mòbil"), - "Manage Students" : MessageLookupByLibrary.simpleMessage("Administra els estudiants"), - "Message" : MessageLookupByLibrary.simpleMessage("Missatge"), - "Message subject" : MessageLookupByLibrary.simpleMessage("Assumpte del missatge"), - "Missing" : MessageLookupByLibrary.simpleMessage("Falta"), - "Must be below 100" : MessageLookupByLibrary.simpleMessage("Ha de ser inferior a 100"), - "Network error" : MessageLookupByLibrary.simpleMessage("Error de xarxa"), - "Never" : MessageLookupByLibrary.simpleMessage("Mai"), - "New message" : MessageLookupByLibrary.simpleMessage("Missatge nou"), - "No" : MessageLookupByLibrary.simpleMessage("No"), - "No Alerts" : MessageLookupByLibrary.simpleMessage("Cap avís"), - "No Assignments" : MessageLookupByLibrary.simpleMessage("No hi ha cap tasca"), - "No Courses" : MessageLookupByLibrary.simpleMessage("No hi ha cap curs"), - "No Due Date" : MessageLookupByLibrary.simpleMessage("Sense data de venciment"), - "No Events Today!" : MessageLookupByLibrary.simpleMessage("Avui no hi ha cap esdeveniment."), - "No Grade" : MessageLookupByLibrary.simpleMessage("Sense qualificació"), - "No Location Specified" : MessageLookupByLibrary.simpleMessage("No s\'ha especificat cap ubicació"), - "No Students" : MessageLookupByLibrary.simpleMessage("Cap estudiant"), - "No Subject" : MessageLookupByLibrary.simpleMessage("Sense assumpte"), - "No Summary" : MessageLookupByLibrary.simpleMessage("Cap resum"), - "No description" : MessageLookupByLibrary.simpleMessage("Sense descripció"), - "No recipients selected" : MessageLookupByLibrary.simpleMessage("Cap destinatari seleccionat"), - "Not Graded" : MessageLookupByLibrary.simpleMessage("Sense qualificació"), - "Not Submitted" : MessageLookupByLibrary.simpleMessage("No entregat"), - "Not a parent?" : MessageLookupByLibrary.simpleMessage("No sou un progenitor?"), - "Notifications for reminders about assignments and calendar events" : MessageLookupByLibrary.simpleMessage("Notificacions de recordatoris sobre tasques i esdeveniments del calendari"), - "OS Version" : MessageLookupByLibrary.simpleMessage("Versió del sistema operatiu"), - "Observer" : MessageLookupByLibrary.simpleMessage("Observador"), - "One of our other apps might be a better fit. Tap one to visit the Play Store." : MessageLookupByLibrary.simpleMessage("És possible que alguna de les altres aplicacions nostres us sigui més útil. Toqueu-ne una per anar a Play Store."), - "Open Canvas Student" : MessageLookupByLibrary.simpleMessage("Obriu Canvas Student"), - "Open In Browser" : MessageLookupByLibrary.simpleMessage("Obre\'l al navegador"), - "Open with another app" : MessageLookupByLibrary.simpleMessage("Obre amb una altra aplicació"), - "Pairing Code" : MessageLookupByLibrary.simpleMessage("Codi d\'emparellament"), - "Password" : MessageLookupByLibrary.simpleMessage("Contrasenya"), - "Password is required" : MessageLookupByLibrary.simpleMessage("La contrasenya és obligatòria"), - "Password must contain at least 8 characters" : MessageLookupByLibrary.simpleMessage("La contrasenya ha de tenir com a mínim 8 caràcters"), - "Password…" : MessageLookupByLibrary.simpleMessage("Contrasenya..."), - "Planner Note" : MessageLookupByLibrary.simpleMessage("Nota del planificador"), - "Please enter a valid email address" : MessageLookupByLibrary.simpleMessage("Introduïu una adreça electrònica vàlida"), - "Please enter an email address" : MessageLookupByLibrary.simpleMessage("Introduïu una adreça electrònica"), - "Please enter full name" : MessageLookupByLibrary.simpleMessage("Introduïu un nom complet"), - "Please scan a QR code generated by Canvas" : MessageLookupByLibrary.simpleMessage("Escanegeu un codi QR generat pel Canvas"), - "Plum, Purple" : MessageLookupByLibrary.simpleMessage("Pruna, porpra"), - "Preparing…" : MessageLookupByLibrary.simpleMessage("S\'està preparant..."), - "Previous Logins" : MessageLookupByLibrary.simpleMessage("Inicis de sessió anteriors"), - "Privacy Policy" : MessageLookupByLibrary.simpleMessage("Política de privacitat"), - "Privacy Policy Link" : MessageLookupByLibrary.simpleMessage("Enllaç a la Política de privacitat"), - "Privacy policy, terms of use, open source" : MessageLookupByLibrary.simpleMessage("Política de privacitat, condicions d\'ús, font oberta"), - "QR Code" : MessageLookupByLibrary.simpleMessage("Codi QR"), - "QR scanning requires camera access" : MessageLookupByLibrary.simpleMessage("Per escanejar el codi QR, cal tenir accés a la càmera."), - "Raspberry, Red" : MessageLookupByLibrary.simpleMessage("Gerd, vermell"), - "Recipients" : MessageLookupByLibrary.simpleMessage("Destinataris"), - "Refresh" : MessageLookupByLibrary.simpleMessage("Actualitza"), - "Remind Me" : MessageLookupByLibrary.simpleMessage("Recorda-m\'ho"), - "Reminders" : MessageLookupByLibrary.simpleMessage("Recordatoris"), - "Reminders have changed!" : MessageLookupByLibrary.simpleMessage("Els recordatoris han canviat!"), - "Reply" : MessageLookupByLibrary.simpleMessage("Respon"), - "Reply All" : MessageLookupByLibrary.simpleMessage("Respon a tots"), - "Report A Problem" : MessageLookupByLibrary.simpleMessage("Informeu d\'un problema"), - "Request Login Help" : MessageLookupByLibrary.simpleMessage("Sol·liciteu ajuda per iniciar la sessió"), - "Request Login Help Button" : MessageLookupByLibrary.simpleMessage("Botó Sol·liciteu ajuda per iniciar la sessió"), - "Restart app" : MessageLookupByLibrary.simpleMessage("Reinicia l\'aplicació"), - "Retry" : MessageLookupByLibrary.simpleMessage("Torna-ho a provar"), - "Return to Login" : MessageLookupByLibrary.simpleMessage("Torna a l\'inici de sessió"), - "STUDENT" : MessageLookupByLibrary.simpleMessage("ESTUDIANT"), - "Screenshot showing location of QR code generation in browser" : MessageLookupByLibrary.simpleMessage("Captura de pantalla que mostra la ubicació de la generació d\'un codi QR al navegador"), - "Screenshot showing location of pairing QR code generation in the Canvas Student app" : MessageLookupByLibrary.simpleMessage("Captura de pantalla en què es mostra la ubicació de la generació del codi QR d\'emparellament a l\'aplicació Canvas Student"), - "Select" : MessageLookupByLibrary.simpleMessage("Selecciona"), - "Select Student Color" : MessageLookupByLibrary.simpleMessage("Selecciona el color de l’estudiant"), - "Select recipients" : MessageLookupByLibrary.simpleMessage("Selecciona els destinataris"), - "Send Feedback" : MessageLookupByLibrary.simpleMessage("Envia els comentaris"), - "Send a message about this assignment" : MessageLookupByLibrary.simpleMessage("Envia un missatge sobre aquesta tasca"), - "Send a message about this course" : MessageLookupByLibrary.simpleMessage("Envia un missatge sobre aquest curs"), - "Send message" : MessageLookupByLibrary.simpleMessage("Envia el missatge"), - "Set a date and time to be notified of this event." : MessageLookupByLibrary.simpleMessage("Establiu una data i hora per rebre una notificació sobre aquest esdeveniment."), - "Set a date and time to be notified of this specific assignment." : MessageLookupByLibrary.simpleMessage("Establiu una data i hora per rebre una notificació sobre aquesta tasca concreta."), - "Settings" : MessageLookupByLibrary.simpleMessage("Configuració"), - "Shamrock, Green" : MessageLookupByLibrary.simpleMessage("Trèvol, verd"), - "Share Your Love for the App" : MessageLookupByLibrary.simpleMessage("Compartiu l\'interès que us desperta l\'aplicació"), - "Show Password" : MessageLookupByLibrary.simpleMessage("Mostra la contrasenya"), - "Sign In" : MessageLookupByLibrary.simpleMessage("Inicia la sessió"), - "Something went wrong trying to create your account, please reach out to your school for assistance." : MessageLookupByLibrary.simpleMessage("Alguna cosa no ha anat bé en intentar crear el vostre compte, poseu-vos en contacte amb la vostra escola per obtenir assistència."), - "Something\'s broken but I can work around it to get what I need done." : MessageLookupByLibrary.simpleMessage("Alguna cosa no funciona bé però per ara puc seguir treballant per tal d\'acabar de fer allò que necessito."), - "Stop Acting as User" : MessageLookupByLibrary.simpleMessage("Deixa d\'actuar com a usuari"), - "Student" : MessageLookupByLibrary.simpleMessage("Estudiant"), - "Student Pairing" : MessageLookupByLibrary.simpleMessage("Emparellament de l\'estudiant"), - "Students can create a QR code using the Canvas Student app on their mobile device" : MessageLookupByLibrary.simpleMessage("Al dispositiu mòbil, els estudiants poden crear un codi QR mitjançant l’aplicació Canvas Student"), - "Students can obtain a pairing code through the Canvas website" : MessageLookupByLibrary.simpleMessage("Els estudiants poden obtenir un codi d\'emparellament a través del lloc web de Canvas"), - "Subject" : MessageLookupByLibrary.simpleMessage("Assumpte"), - "Submitted" : MessageLookupByLibrary.simpleMessage("Entregat"), - "Successfully submitted!" : MessageLookupByLibrary.simpleMessage("S\'ha enviat correctament."), - "Summary" : MessageLookupByLibrary.simpleMessage("Resum"), - "Switch Users" : MessageLookupByLibrary.simpleMessage("Canvia els usuaris"), - "Syllabus" : MessageLookupByLibrary.simpleMessage("Temari"), - "TA" : MessageLookupByLibrary.simpleMessage("Auxiliar de professor"), - "TEACHER" : MessageLookupByLibrary.simpleMessage("PROFESSOR"), - "Tap to favorite the courses you want to see on the Calendar. Select up to 10." : MessageLookupByLibrary.simpleMessage("Toqueu per afegir als preferits els cursos que voleu veure al Calendari. Seleccioneu-ne fins a 10."), - "Tap to pair with a new student" : MessageLookupByLibrary.simpleMessage("Toqueu per emparellar amb un estudiant nou"), - "Tap to select this student" : MessageLookupByLibrary.simpleMessage("Toqueu per seleccionar aquest estudiant"), - "Tap to show student selector" : MessageLookupByLibrary.simpleMessage("Toqueu per mostrar el selector d\'estudiants"), - "Teacher" : MessageLookupByLibrary.simpleMessage("Professor"), - "Tell us about your favorite parts of the app" : MessageLookupByLibrary.simpleMessage("Expliqueu-nos quines són les parts preferides de l\'aplicació"), - "Terms of Service" : MessageLookupByLibrary.simpleMessage("Condicions de servei"), - "Terms of Service Link" : MessageLookupByLibrary.simpleMessage("Enllaç a les Condicions de servei"), - "Terms of Use" : MessageLookupByLibrary.simpleMessage("Condicions d\'ús"), - "The QR code you scanned may have expired. Refresh the code on the student\'s device and try again." : MessageLookupByLibrary.simpleMessage("És possible que el codi QR que heu escanejat ja hagi caducat. Actualitzeu el codi al dispositiu de l’estudiant i torneu-ho a provar."), - "The following information will help us better understand your idea:" : MessageLookupByLibrary.simpleMessage("La informació següent ens ajudarà a conèixer millor la vostra idea:"), - "The server you entered is not authorized for this app." : MessageLookupByLibrary.simpleMessage("El servidor que heu introduït no té autorització per a aquesta aplicació."), - "The student you are trying to add belongs to a different school. Log in or create an account with that school to scan this code." : MessageLookupByLibrary.simpleMessage("L\'estudiant que esteu provant d\'afegir pertany a una altra escola. Inicieu la sessió o creeu un compte amb aquesta escola per escanejar aquest codi."), - "The user agent for this app is not authorized." : MessageLookupByLibrary.simpleMessage("L\'agent d\'usuari per a aquesta aplicació no està autoritzat."), - "Theme" : MessageLookupByLibrary.simpleMessage("Tema"), - "There are no installed applications that can open this file" : MessageLookupByLibrary.simpleMessage("No hi ha cap aplicació instal·lada que pugui obrir aquest fitxer"), - "There is no page information available." : MessageLookupByLibrary.simpleMessage("No hi ha informació disponible sobre la pàgina."), - "There was a problem loading the Terms of Use" : MessageLookupByLibrary.simpleMessage("S\'ha produït un problema en carregar les condicions d\'ús"), - "There was a problem removing this student from your account. Please check your connection and try again." : MessageLookupByLibrary.simpleMessage("S’ha produït un problema en suprimir aquest estudiant del vostre compte. Reviseu la connexió i torneu-ho a provar."), - "There was an error loading recipients for this course" : MessageLookupByLibrary.simpleMessage("S\'ha produït un error en carregar els destinataris d\'aquest curs"), - "There was an error loading the summary details for this course." : MessageLookupByLibrary.simpleMessage("S\'ha produït un error en carregar els detalls de resumen d\'aquest curs."), - "There was an error loading this announcement" : MessageLookupByLibrary.simpleMessage("S\'ha produït un error en carregar aquest anunci"), - "There was an error loading this conversation" : MessageLookupByLibrary.simpleMessage("S\'ha produït un error en carregar aquesta conversa"), - "There was an error loading this file" : MessageLookupByLibrary.simpleMessage("S\'ha produït un error en carregar aquest fitxer"), - "There was an error loading your inbox messages." : MessageLookupByLibrary.simpleMessage("S\'ha produït un error en carregar els missatges de la vostra safata d\'entrada."), - "There was an error loading your student\'s alerts." : MessageLookupByLibrary.simpleMessage("S\'ha produït un error en carregar els vostres avisos de l\'estudiant."), - "There was an error loading your student\'s calendar" : MessageLookupByLibrary.simpleMessage("S\'ha produït un error en carregar el vostre calendari de l\'estudiant"), - "There was an error loading your students." : MessageLookupByLibrary.simpleMessage("S\'ha produït un error en carregar els vostres estudiants."), - "There was an error loading your student’s courses." : MessageLookupByLibrary.simpleMessage("S\'ha produït un error en carregar els vostres cursos de l\'estudiant."), - "There was an error logging in. Please generate another QR Code and try again." : MessageLookupByLibrary.simpleMessage("S\'ha produït un error en iniciar la sessió. Genereu un altre codi QR i torneu-ho a provar."), - "There was an error trying to act as this user. Please check the Domain and User ID and try again." : MessageLookupByLibrary.simpleMessage("S\'ha produït un error en intentar actuar com a aquest usuari. Comproveu l\'ID d\'usuari i el domini i torneu-ho a provar."), - "There’s nothing to be notified of yet." : MessageLookupByLibrary.simpleMessage("Encara no hi ha res que s\'hagi de notificar."), - "This app is not authorized for use." : MessageLookupByLibrary.simpleMessage("Aquesta aplicació no té autorització perquè s\'utilitzi."), - "This course does not have any assignments or calendar events yet." : MessageLookupByLibrary.simpleMessage("Aquest curs encara no té cap tasca o esdeveniment al calendari."), - "This file is unsupported and can’t be viewed through the app" : MessageLookupByLibrary.simpleMessage("Aquest fitxer no s\'admet i no es pot visualitzar a través de l\'aplicació"), - "This will unpair and remove all enrollments for this student from your account." : MessageLookupByLibrary.simpleMessage("Amb aquesta acció es cancel·larà l’emparellament i se suprimiran del vostre compte totes les inscripcions per a aquest estudiant."), - "Total Grade" : MessageLookupByLibrary.simpleMessage("Qualificació total"), - "Uh oh!" : MessageLookupByLibrary.simpleMessage("Oh!"), - "Unable to fetch courses. Please check your connection and try again." : MessageLookupByLibrary.simpleMessage("No es poden obtenir els cursos. Reviseu la connexió i torneu-ho a provar."), - "Unable to load this image" : MessageLookupByLibrary.simpleMessage("No es pot carregar aquesta imatge"), - "Unable to play this media file" : MessageLookupByLibrary.simpleMessage("No es pot reproduir aquest fitxer multimèdia"), - "Unable to send message. Check your connection and try again." : MessageLookupByLibrary.simpleMessage("No es pot enviar el missatge. Reviseu la connexió i torneu-ho a provar."), - "Under Construction" : MessageLookupByLibrary.simpleMessage("En construcció"), - "Unknown User" : MessageLookupByLibrary.simpleMessage("Usuari desconegut"), - "Unsaved changes" : MessageLookupByLibrary.simpleMessage("Canvis no desats"), - "Unsupported File" : MessageLookupByLibrary.simpleMessage("Fitxer no admès"), - "Upload File" : MessageLookupByLibrary.simpleMessage("Penja el fitxer"), - "Use Camera" : MessageLookupByLibrary.simpleMessage("Utilitza la càmera"), - "Use Dark Theme in Web Content" : MessageLookupByLibrary.simpleMessage("Utilitza el tema fosc al contingut web"), - "User ID" : MessageLookupByLibrary.simpleMessage("ID d\'usuari"), - "User ID:" : MessageLookupByLibrary.simpleMessage("ID d\'usuari:"), - "Version Number" : MessageLookupByLibrary.simpleMessage("Número de versió"), - "View Description" : MessageLookupByLibrary.simpleMessage("Mostra la descripció"), - "View error details" : MessageLookupByLibrary.simpleMessage("Visualitza els detalls de l\'error"), - "View the Privacy Policy" : MessageLookupByLibrary.simpleMessage("Visualitza la política de privacitat"), - "We are currently building this feature for your viewing pleasure." : MessageLookupByLibrary.simpleMessage("Estem creant aquesta característica perquè pugueu gaudir de la visualització."), - "We are unable to display this link, it may belong to an institution you currently aren\'t logged in to." : MessageLookupByLibrary.simpleMessage("No podem mostrar aquest enllaç, pot ser que pertanyi a una institució en la que actualment no teniu la sessió iniciada."), - "We couldn\'t find any students associated with this account" : MessageLookupByLibrary.simpleMessage("No hem trobat cap estudiant associat amb aquest compte"), - "We were unable to verify the server for use with this app." : MessageLookupByLibrary.simpleMessage("No hem pogut verificar si el servidor es pot utilitzar amb aquesta aplicació."), - "We’re not sure what happened, but it wasn’t good. Contact us if this keeps happening." : MessageLookupByLibrary.simpleMessage("No estem segurs de què ha passat, però no ha sigut res bo. Poseu-vos en contacte amb nosaltres si us segueix passant."), - "What can we do better?" : MessageLookupByLibrary.simpleMessage("Què podem fer millor?"), - "Yes" : MessageLookupByLibrary.simpleMessage("Sí"), - "You are not observing any students." : MessageLookupByLibrary.simpleMessage("No esteu observant cap estudiant."), - "You may only choose 10 calendars to display" : MessageLookupByLibrary.simpleMessage("Només podeu triar 10 calendaris perquè es mostrin"), - "You must enter a user id" : MessageLookupByLibrary.simpleMessage("Heu d\'introduir un ID d\'usuari"), - "You must enter a valid domain" : MessageLookupByLibrary.simpleMessage("Heu d\'introduir un domini vàlid"), - "You must select at least one calendar to display" : MessageLookupByLibrary.simpleMessage("Heu de seleccionar com a mínim un calendari perquè es mostri"), - "You will be notified about this assignment on…" : MessageLookupByLibrary.simpleMessage("Rebreu una notificació sobre aquesta tasca el..."), - "You will be notified about this event on…" : MessageLookupByLibrary.simpleMessage("Rebreu una notificació sobre aquest esdeveniment el..."), - "You\'ll find the QR code on the web in your account profile. Click \'QR for Mobile Login\' in the list." : MessageLookupByLibrary.simpleMessage("Trobareu el codi QR a la web, al perfil del vostre compte. Feu clic a \"QR per a inici de sessió mòbil\" a la llista."), - "You\'ll need to open your student\'s Canvas Student app to continue. Go into Main Menu > Settings > Pair with Observer and scan the QR code you see there." : MessageLookupByLibrary.simpleMessage("Per continuar, haureu d\'obrir l’aplicació Canvas Student de l’estudiant. Aneu a Menú principal > Configuració > Emparella amb l\'observador i escanegeu el codi QR que s’hi mostra."), - "Your code is incorrect or expired." : MessageLookupByLibrary.simpleMessage("El vostre codi es incorrecte o ha caducat."), - "Your student’s courses might not be published yet." : MessageLookupByLibrary.simpleMessage("És possible que encara no s\'hagin publicat els vostres cursos de l\'estudiant."), - "You’re all caught up!" : MessageLookupByLibrary.simpleMessage("Esteu completament al dia!"), - "actingAsUser" : m0, - "alertsLabel" : MessageLookupByLibrary.simpleMessage("Avisos"), - "appVersion" : m1, - "assignmentGradeAboveThreshold" : m2, - "assignmentGradeBelowThreshold" : m3, - "assignmentLockedModule" : m4, - "assignmentSubjectMessage" : m5, - "assignmentTotalPoints" : m6, - "assignmentTotalPointsAccessible" : m7, - "authorToNOthers" : m8, - "authorToRecipient" : m9, - "authorToRecipientAndNOthers" : m10, - "badgeNumberPlus" : m11, - "calendarLabel" : MessageLookupByLibrary.simpleMessage("Calendari"), - "canvasGuides" : MessageLookupByLibrary.simpleMessage("Guies del Canvas"), - "canvasLogoLabel" : MessageLookupByLibrary.simpleMessage("Logotip del Canvas"), - "canvasSupport" : MessageLookupByLibrary.simpleMessage("Assistència tècnica del Canvas"), - "changeStudentColorLabel" : m12, - "collapse" : MessageLookupByLibrary.simpleMessage("redueix"), - "collapsed" : MessageLookupByLibrary.simpleMessage("reduït"), - "contentDescriptionScoreOutOfPointsPossible" : m13, - "courseForWhom" : m14, - "courseGradeAboveThreshold" : m15, - "courseGradeBelowThreshold" : m16, - "coursesLabel" : MessageLookupByLibrary.simpleMessage("Cursos"), - "dateAtTime" : m17, - "dismissAlertLabel" : m18, - "domainSearchHelpBody" : m19, - "domainSearchHelpLabel" : MessageLookupByLibrary.simpleMessage("Com puc trobar la meva escola o districte?"), - "domainSearchInputHint" : MessageLookupByLibrary.simpleMessage("Introduïu el nom de l\'escola o el districte..."), - "dueDateAtTime" : m20, - "endMasqueradeLogoutMessage" : m21, - "endMasqueradeMessage" : m22, - "eventSubjectMessage" : m23, - "eventTime" : m24, - "expand" : MessageLookupByLibrary.simpleMessage("desplega"), - "expanded" : MessageLookupByLibrary.simpleMessage("desplegat"), - "finalGrade" : m25, - "findSchool" : MessageLookupByLibrary.simpleMessage("Cerca una escola"), - "frontPageSubjectMessage" : m26, - "gradeFormatScoreOutOfPointsPossible" : m27, - "gradesSubjectMessage" : m28, - "latePenalty" : m29, - "me" : MessageLookupByLibrary.simpleMessage("mi"), - "messageLinkPostscript" : m30, - "minus" : MessageLookupByLibrary.simpleMessage("menys"), - "mustBeAboveN" : m31, - "mustBeBelowN" : m32, - "next" : MessageLookupByLibrary.simpleMessage("Següent"), - "nextMonth" : m33, - "nextWeek" : m34, - "noDomainResults" : m35, - "ok" : MessageLookupByLibrary.simpleMessage("D\'acord"), - "outOfPoints" : m36, - "plusRecipientCount" : m37, - "pointsPossible" : m38, - "previousMonth" : m39, - "previousWeek" : m40, - "qrCreateAccountTos" : m41, - "ratingDialogEmailSubject" : m42, - "selectedMonthLabel" : m43, - "send" : MessageLookupByLibrary.simpleMessage("envia"), - "starRating" : m44, - "submissionStatusSuccessSubtitle" : m45, - "syllabusSubjectMessage" : m46, - "unread" : MessageLookupByLibrary.simpleMessage("sense llegir"), - "unreadCount" : m47 - }; -} diff --git a/apps/flutter_parent/lib/l10n/generated/messages_cy.dart b/apps/flutter_parent/lib/l10n/generated/messages_cy.dart deleted file mode 100644 index 6e66a305b3..0000000000 --- a/apps/flutter_parent/lib/l10n/generated/messages_cy.dart +++ /dev/null @@ -1,473 +0,0 @@ -// DO NOT EDIT. This is code generated via package:intl/generate_localized.dart -// This is a library that provides messages for a cy locale. All the -// messages from the main program should be duplicated here with the same -// function name. - -// Ignore issues from commonly used lints in this file. -// ignore_for_file:unnecessary_brace_in_string_interps, unnecessary_new -// ignore_for_file:prefer_single_quotes,comment_references, directives_ordering -// ignore_for_file:annotate_overrides,prefer_generic_function_type_aliases -// ignore_for_file:unused_import, file_names - -import 'package:intl/intl.dart'; -import 'package:intl/message_lookup_by_library.dart'; - -final messages = new MessageLookup(); - -typedef String MessageIfAbsent(String messageStr, List args); - -class MessageLookup extends MessageLookupByLibrary { - String get localeName => 'cy'; - - static m0(userName) => "Rydych chi’n gweithredu fel ${userName}"; - - static m1(version) => "v. ${version}"; - - static m2(threshold) => "Gradd yr Aseiniad yn Uwch na ${threshold}"; - - static m3(threshold) => "Gradd yr Aseiniad yn Is na ${threshold}"; - - static m4(moduleName) => "Mae\'r aseiniad hwn wedi\'i gloi gan y modiwl \"${moduleName}\"."; - - static m5(studentName, assignmentName) => "Ynghylch: ${studentName}, Aseiniad - ${assignmentName}"; - - static m6(points) => "${points} pwynt"; - - static m7(points) => "${points} pwynt"; - - static m8(authorName, howMany) => "${Intl.plural(howMany, one: '${authorName} i 1 arall', other: '${authorName} i ${howMany} arall')}"; - - static m9(authorName, recipientName) => "${authorName} i ${recipientName}"; - - static m10(authorName, recipientName, howMany) => "${Intl.plural(howMany, one: '${authorName} i ${recipientName} ac 1 arall', other: '${authorName} i ${recipientName} a ${howMany} arall')}"; - - static m11(count) => "${count}+"; - - static m12(studentName) => "Newid lliw ${studentName}"; - - static m13(score, pointsPossible) => "${score} allan o ${pointsPossible} pwynt"; - - static m14(studentShortName) => "ar gyfer ${studentShortName}"; - - static m15(threshold) => "Gradd y Cwrs yn Uwch na ${threshold}"; - - static m16(threshold) => "Gradd y Cwrs yn Is na ${threshold}"; - - static m17(date, time) => "${date} at ${time}"; - - static m18(alertTitle) => "Gwrthod ${alertTitle}"; - - static m19(canvasGuides, canvasSupport) => "Ceisiwch chwilio am enw’r ysgol neu’r ardal rydych chi’n ceisio cael mynediad atynt, fel “Smith Private School” neu “Smith County Schools.” Gallwch chi hefyd roi parth Canvas yn uniongyrchol, fel “smith.instructure.com.”\n\nI gael rhagor o wybodaeth ynglŷn â chanfod cyfrif Canvas eich sefydliad, ewch i ${canvasGuides}, gofynnwch i ${canvasSupport}, neu cysylltwch â’ch ysgol i gael help."; - - static m20(date, time) => "Erbyn ${date} am ${time}"; - - static m21(userName) => "Byddwch chi’n stopio gweithredu fel ${userName} ac yn cael eich allgofnodi."; - - static m22(userName) => "Byddwch chi’n stopio gweithredu fel ${userName} ac yn dychwelyd i’ch cyfrif gwreiddiol."; - - static m23(studentName, eventTitle) => "Ynghylch: ${studentName}, Digwyddiad - ${eventTitle}"; - - static m24(startAt, endAt) => "${startAt} - ${endAt}"; - - static m25(grade) => "Gradd Derfynol: ${grade}"; - - static m26(studentName) => "Ynghylch: ${studentName}, Tudalen Flaen"; - - static m27(score, pointsPossible) => "${score} / ${pointsPossible}"; - - static m28(studentName) => "Ynghylch: ${studentName}, Graddau"; - - static m29(pointsLost) => "Cosb am fod yn hwyr (-${pointsLost})"; - - static m30(studentName, linkUrl) => "Ynghylch: ${studentName}, ${linkUrl}"; - - static m31(percentage) => "Rhaid bod yn uwch na ${percentage}"; - - static m32(percentage) => "Rhaid bod yn is na ${percentage}"; - - static m33(month) => "Mis nesaf: ${month}"; - - static m34(date) => "Wythnos nesaf yn cychwyn ${date}"; - - static m35(query) => "Doedd dim modd dod o hyd i ysgolion yn cyfateb â \"${query}\""; - - static m36(points, howMany) => "${Intl.plural(howMany, one: 'Allan o 1 pwynt', other: 'Allan o ${points} pwynt')}"; - - static m37(count) => "+${count}"; - - static m38(points) => "${points} pwynt yn bosib"; - - static m39(month) => "Mis blaenorol: ${month}"; - - static m40(date) => "Wythnos flaenorol yn cychwyn ${date}"; - - static m41(termsOfService, privacyPolicy) => "Wrth daro ‘Creu Cyfrif’, rydych chi’n cytuno i’r ${termsOfService} ac yn cydnabod y ${privacyPolicy}"; - - static m42(version) => "Awgrymiadau i Android - Canvas Parent ${version}"; - - static m43(month) => "Mis ${month}"; - - static m44(position) => "${Intl.plural(position, one: '${position} seren', other: '${position} seren')}"; - - static m45(date, time) => "Cafodd yr aseiniad hwn ei gyflwyno ar ${date} am ${time} ac mae’n aros i gael ei raddio"; - - static m46(studentName) => "Ynghylch: ${studentName}, Maes Llafur"; - - static m47(count) => "${count} heb eu darllen"; - - final messages = _notInlinedMessages(_notInlinedMessages); - static _notInlinedMessages(_) => { - "\"Act as\" is essentially logging in as this user without a password. You will be able to take any action as if you were this user, and from other users\' points of views, it will be as if this user performed them. However, audit logs record that you were the one who performed the actions on behalf of this user." : MessageLookupByLibrary.simpleMessage("Bydd \"Gweithredu fel\" yn golygu eich bod yn mewngofnodi fel y defnyddiwr hwn heb gyfrinair. Byddwch chi’n gallu gwneud unrhyw beth fel petai chi yw’r defnyddiwr hwn. O safbwynt defnyddwyr eraill, bydd yn edrych fel mai’r defnyddiwr hwn sydd wedi gwneud hynny. Ond, bydd logiau archwilio’n cofnodi mai chi wnaeth hynny ar ran y defnyddiwr hwn."), - "-" : MessageLookupByLibrary.simpleMessage("-"), - "A description is required." : MessageLookupByLibrary.simpleMessage("Rhaid rhoi disgrifiad."), - "A network error occurred when adding this student. Check your connection and try again." : MessageLookupByLibrary.simpleMessage("Gwall ar y rhwydwaith wrth ychwanegu\'r myfyriwr hwn. Gwiriwch eich cysylltiad a rhowch gynnig arall arni."), - "A subject is required." : MessageLookupByLibrary.simpleMessage("Rhaid rhoi pwnc."), - "Act As User" : MessageLookupByLibrary.simpleMessage("Gweithredu fel Defnyddiwr"), - "Add Student" : MessageLookupByLibrary.simpleMessage("Ychwanegu Myfyriwr"), - "Add attachment" : MessageLookupByLibrary.simpleMessage("Ychwanegu atodiad"), - "Add new student" : MessageLookupByLibrary.simpleMessage("Ychwanegu myfyriwr newydd"), - "Add student with…" : MessageLookupByLibrary.simpleMessage("Ychwanegu myfyriwr gyda..."), - "Alert Settings" : MessageLookupByLibrary.simpleMessage("Gosodiadau Hysbysu"), - "Alert me when…" : MessageLookupByLibrary.simpleMessage("Rhowch wybod i mi pan..."), - "All Grading Periods" : MessageLookupByLibrary.simpleMessage("Pob Cyfnod Graddio"), - "Already have an account? " : MessageLookupByLibrary.simpleMessage("Oes gennych chi gyfrif yn barod? "), - "An email address is required." : MessageLookupByLibrary.simpleMessage("Rhaid rhoi cyfeiriad e-bost."), - "An error occurred when trying to display this link" : MessageLookupByLibrary.simpleMessage("Gwall wrth geisio dangos y ddolen hon"), - "An error occurred while saving your selection. Please try again." : MessageLookupByLibrary.simpleMessage("Gwall wrth gadw eich dewis. Rhowch gynnig arall arni."), - "An unexpected error occurred" : MessageLookupByLibrary.simpleMessage("Gwall annisgwyl"), - "Android OS version" : MessageLookupByLibrary.simpleMessage("Fersiwn OS Android"), - "Appearance" : MessageLookupByLibrary.simpleMessage("Ymddangdosiad"), - "Application version" : MessageLookupByLibrary.simpleMessage("Fersin o’r rhaglen"), - "Are you a student or teacher?" : MessageLookupByLibrary.simpleMessage("Ai myfyriwr neu athro ydych chi?"), - "Are you sure you want to log out?" : MessageLookupByLibrary.simpleMessage("Ydych chi’n siŵr eich bod am allgofnodi?"), - "Are you sure you wish to close this page? Your unsent message will be lost." : MessageLookupByLibrary.simpleMessage("Ydych chi’n siŵr eich bod chi eisiau cau’r dudalen hon? Od nad yw eich neges wedi’i anfon bydd yn cael ei golli."), - "Assignment Details" : MessageLookupByLibrary.simpleMessage("Manylion Aseiniad"), - "Assignment grade above" : MessageLookupByLibrary.simpleMessage("Gradd yr aseiniad yn uwch na"), - "Assignment grade below" : MessageLookupByLibrary.simpleMessage("Gradd yr aseiniad yn is na"), - "Assignment missing" : MessageLookupByLibrary.simpleMessage("Aseiniad ar goll"), - "Barney, Fuschia" : MessageLookupByLibrary.simpleMessage("Barney, Ffiwsia"), - "Calendars" : MessageLookupByLibrary.simpleMessage("Calendrau"), - "Camera Permission" : MessageLookupByLibrary.simpleMessage("Hawl Camera"), - "Cancel" : MessageLookupByLibrary.simpleMessage("Canslo"), - "Canvas Student" : MessageLookupByLibrary.simpleMessage("Myfyriwr Canvas"), - "Canvas Teacher" : MessageLookupByLibrary.simpleMessage("Canvas Teacher"), - "Canvas on GitHub" : MessageLookupByLibrary.simpleMessage("Canvas ar GitHub"), - "Choose a course to message" : MessageLookupByLibrary.simpleMessage("Dewiswch gwrs i anfon neges ato"), - "Choose from Gallery" : MessageLookupByLibrary.simpleMessage("Dewis o’r Oriel"), - "Complete" : MessageLookupByLibrary.simpleMessage("Cwblhau"), - "Contact Support" : MessageLookupByLibrary.simpleMessage("Cysylltwch â\'r adran Gymorth"), - "Course Announcement" : MessageLookupByLibrary.simpleMessage("Cyhoeddiad Cwrs"), - "Course Announcements" : MessageLookupByLibrary.simpleMessage("Cyhoeddiadau Cwrs"), - "Course grade above" : MessageLookupByLibrary.simpleMessage("Gradd y cwrs yn uwch na"), - "Course grade below" : MessageLookupByLibrary.simpleMessage("Gradd y cwrs yn is na"), - "Create Account" : MessageLookupByLibrary.simpleMessage("Creu Cyfrif"), - "Dark Mode" : MessageLookupByLibrary.simpleMessage("Modd Tywyll"), - "Date" : MessageLookupByLibrary.simpleMessage("Dyddiad"), - "Delete" : MessageLookupByLibrary.simpleMessage("Dileu"), - "Description" : MessageLookupByLibrary.simpleMessage("Disgrifiad"), - "Device" : MessageLookupByLibrary.simpleMessage("Dyfais"), - "Device model" : MessageLookupByLibrary.simpleMessage("Model o’r ddyfais"), - "Domain" : MessageLookupByLibrary.simpleMessage("Parth"), - "Domain:" : MessageLookupByLibrary.simpleMessage("Parth:"), - "Don\'t show again" : MessageLookupByLibrary.simpleMessage("Peidio â dangos eto"), - "Done" : MessageLookupByLibrary.simpleMessage("Wedi gorffen"), - "Download" : MessageLookupByLibrary.simpleMessage("Llwytho i Lawr"), - "Due" : MessageLookupByLibrary.simpleMessage("Erbyn"), - "EXTREME CRITICAL EMERGENCY!!" : MessageLookupByLibrary.simpleMessage("ARGYFWNG - DIFRIFOL IAWN!!"), - "Electric, blue" : MessageLookupByLibrary.simpleMessage("Trydan, Glas"), - "Email Address" : MessageLookupByLibrary.simpleMessage("Cyfeiriad E-bost"), - "Email:" : MessageLookupByLibrary.simpleMessage("E-bost:"), - "Email…" : MessageLookupByLibrary.simpleMessage("E-bost..."), - "Enter the student pairing code provided to you. If the pairing code doesn\'t work, it may have expired" : MessageLookupByLibrary.simpleMessage("Rhowch y cod paru myfyriwr a roddwyd i chi. Os nad yw’r cod paru yn gweithio, mae’n bosib ei fod wedi dod i ben"), - "Event" : MessageLookupByLibrary.simpleMessage("Digwyddiad"), - "Excused" : MessageLookupByLibrary.simpleMessage("Wedi esgusodi"), - "Expired QR Code" : MessageLookupByLibrary.simpleMessage("Cod QR wedi dod i ben"), - "Failed. Tap for options." : MessageLookupByLibrary.simpleMessage("Wedi methu. Tapiwch i gael opsiynau."), - "Filter" : MessageLookupByLibrary.simpleMessage("Hidlo"), - "Filter by" : MessageLookupByLibrary.simpleMessage("Hidlo yn ôl"), - "Fire, Orange" : MessageLookupByLibrary.simpleMessage("Tân, Oren"), - "Front Page" : MessageLookupByLibrary.simpleMessage("Tudalen Flaen"), - "Full Name" : MessageLookupByLibrary.simpleMessage("Enw Llawn"), - "Full Name…" : MessageLookupByLibrary.simpleMessage("Enw Llawn..."), - "Full error message" : MessageLookupByLibrary.simpleMessage("Neges gwall llawn"), - "Go to today" : MessageLookupByLibrary.simpleMessage("Mynd i heddiw"), - "Grade" : MessageLookupByLibrary.simpleMessage("Gradd"), - "Grade percentage" : MessageLookupByLibrary.simpleMessage("Canran gradd"), - "Graded" : MessageLookupByLibrary.simpleMessage("Wedi graddio"), - "Grades" : MessageLookupByLibrary.simpleMessage("Graddau"), - "Help" : MessageLookupByLibrary.simpleMessage("Help"), - "Hide Password" : MessageLookupByLibrary.simpleMessage("Cuddio Cyfrinair"), - "High Contrast Mode" : MessageLookupByLibrary.simpleMessage("Modd â Chyferbyniad Uchel"), - "How are we doing?" : MessageLookupByLibrary.simpleMessage("Sut hwyl rydyn ni’n ei gael arni?"), - "How is this affecting you?" : MessageLookupByLibrary.simpleMessage("Sut mae hyn yn effeithio arnoch chi?"), - "I can\'t get things done until I hear back from you." : MessageLookupByLibrary.simpleMessage("Alla i ddim bwrw ymlaen nes bydda i wedi cael ateb gennych chi."), - "I don\'t have a Canvas account" : MessageLookupByLibrary.simpleMessage("Does gen i ddim cyfrif Canvas"), - "I have a Canvas account" : MessageLookupByLibrary.simpleMessage("Mae gen i gyfrif Canvas"), - "I need some help but it\'s not urgent." : MessageLookupByLibrary.simpleMessage("Mae angen help arna i, ond dydy’r mater ddim yn un brys."), - "I\'m having trouble logging in" : MessageLookupByLibrary.simpleMessage("Rwy’n cael trafferth yn mewngofnodi"), - "Idea for Canvas Parent App [Android]" : MessageLookupByLibrary.simpleMessage("Syniad ar gyfer Ap Canvas Parent [Android]"), - "In order to provide you with a better experience, we have updated how reminders work. You can add new reminders by viewing an assignment or calendar event and tapping the switch under the \"Remind Me\" section.\n\nBe aware that any reminders created with older versions of this app will not be compatible with the new changes and you will need to create them again." : MessageLookupByLibrary.simpleMessage("Er mwyn rhoi profiad gwell i chi, rydyn ni wedi diweddaru sut mae nodiadau atgoffa’n gweithio. Gallwch chi ychwanegu nodiadau atgoffa newydd drwy edrych at aseiniad neu ddigwyddiad calendr a thapio’r switsh o dan yr adran \"Fy Atgoffa\".\n\nByddwch yn ymwybodol na fydd unrhyw nodiadau atgoffa sydd wedi cael eu creu gyda hen fersiynau o’r ap hwn yn gydnaws a’r newidiadau newydd a bydd angen i chi eu creu eto."), - "Inbox" : MessageLookupByLibrary.simpleMessage("Blwch Derbyn"), - "Inbox Zero" : MessageLookupByLibrary.simpleMessage("Inbox Zero"), - "Incomplete" : MessageLookupByLibrary.simpleMessage("Heb Gwblhau"), - "Incorrect Domain" : MessageLookupByLibrary.simpleMessage("Parth Anghywir"), - "Institution Announcement" : MessageLookupByLibrary.simpleMessage("Cyhoeddiad Sefydliad"), - "Institution Announcements" : MessageLookupByLibrary.simpleMessage("Cyhoeddiadau Sefydliadau"), - "Instructions" : MessageLookupByLibrary.simpleMessage("Cyfarwyddiadau"), - "Interactions on this page are limited by your institution." : MessageLookupByLibrary.simpleMessage("Mae achosion o ryngweithio ar y dudalen hon wedi’u cyfyngu gan eich sefydliad."), - "Invalid QR Code" : MessageLookupByLibrary.simpleMessage("Cod QR Annilys"), - "It looks like a great day to rest, relax, and recharge." : MessageLookupByLibrary.simpleMessage("Mae’n edrych fel diwrnod gwych i orffwys, ymlacio a dod at eich hun."), - "It looks like assignments haven\'t been created in this space yet." : MessageLookupByLibrary.simpleMessage("Mae’n ymddangos nad oes aseiniadau wedi cael eu creu yn y gofod hwn eto."), - "Just a casual question, comment, idea, suggestion…" : MessageLookupByLibrary.simpleMessage("Dim ond awgrym, syniad, sylw neu gwestiwn anffurfiol..."), - "Late" : MessageLookupByLibrary.simpleMessage("Yn Hwyr"), - "Launch External Tool" : MessageLookupByLibrary.simpleMessage("Lansio Adnodd Allanol"), - "Legal" : MessageLookupByLibrary.simpleMessage("Cyfreithiol"), - "Light Mode" : MessageLookupByLibrary.simpleMessage("Modd Golau"), - "Link Error" : MessageLookupByLibrary.simpleMessage("Gwall Dolen"), - "Locale:" : MessageLookupByLibrary.simpleMessage("Lleoliad:"), - "Locate QR Code" : MessageLookupByLibrary.simpleMessage("Dod o hyd i God QR"), - "Location" : MessageLookupByLibrary.simpleMessage("Lleoliad"), - "Locked" : MessageLookupByLibrary.simpleMessage("Wedi Cloi"), - "Log Out" : MessageLookupByLibrary.simpleMessage("Allgofnodi"), - "Login flow: Canvas" : MessageLookupByLibrary.simpleMessage("Llif Mewngofnodi: Canvas"), - "Login flow: Normal" : MessageLookupByLibrary.simpleMessage("Llif Mewngofnodi: Arferol"), - "Login flow: Site Admin" : MessageLookupByLibrary.simpleMessage("Llif Mewngofnodi: Gweinyddwr Safle"), - "Login flow: Skip mobile verify" : MessageLookupByLibrary.simpleMessage("Llif Mewngofnodi: Anwybyddu cadarnhau symudol"), - "Manage Students" : MessageLookupByLibrary.simpleMessage("Rheoli Myfyrwyr"), - "Message" : MessageLookupByLibrary.simpleMessage("Neges"), - "Message subject" : MessageLookupByLibrary.simpleMessage("Pwnc y neges"), - "Missing" : MessageLookupByLibrary.simpleMessage("Ar goll"), - "Must be below 100" : MessageLookupByLibrary.simpleMessage("Rhaid bod is na 100"), - "Network error" : MessageLookupByLibrary.simpleMessage("Gwall ar y rhwydwaith"), - "Never" : MessageLookupByLibrary.simpleMessage("Byth"), - "New message" : MessageLookupByLibrary.simpleMessage("Neges newydd"), - "No" : MessageLookupByLibrary.simpleMessage("Na"), - "No Alerts" : MessageLookupByLibrary.simpleMessage("Dim Negeseuon Hysbysu"), - "No Assignments" : MessageLookupByLibrary.simpleMessage("Dim Aseiniadau"), - "No Courses" : MessageLookupByLibrary.simpleMessage("Dim Cyrsiau"), - "No Due Date" : MessageLookupByLibrary.simpleMessage("Dim Dyddiad Erbyn"), - "No Events Today!" : MessageLookupByLibrary.simpleMessage("Dim Digwyddiadau Heddiw!"), - "No Grade" : MessageLookupByLibrary.simpleMessage("Dim Gradd"), - "No Location Specified" : MessageLookupByLibrary.simpleMessage("Dim Lleoliad wedi’i Nodi"), - "No Students" : MessageLookupByLibrary.simpleMessage("Dim Myfyrwyr"), - "No Subject" : MessageLookupByLibrary.simpleMessage("Dim Pwnc"), - "No Summary" : MessageLookupByLibrary.simpleMessage("Dim Crynodeb"), - "No description" : MessageLookupByLibrary.simpleMessage("Dim disgrifiad"), - "No recipients selected" : MessageLookupByLibrary.simpleMessage("Dim derbynwyr wedi’u dewis"), - "Not Graded" : MessageLookupByLibrary.simpleMessage("Heb eu graddio"), - "Not Submitted" : MessageLookupByLibrary.simpleMessage("Heb Gyflwyno"), - "Not a parent?" : MessageLookupByLibrary.simpleMessage("Ddim yn rhiant?"), - "Notifications for reminders about assignments and calendar events" : MessageLookupByLibrary.simpleMessage("Hysbysiadau ar gyfer nodiadau atgoffa am aseiniadau a digwyddiadau calendr"), - "OS Version" : MessageLookupByLibrary.simpleMessage("Fersiwn OS"), - "Observer" : MessageLookupByLibrary.simpleMessage("Arsyllwr"), - "One of our other apps might be a better fit. Tap one to visit the Play Store." : MessageLookupByLibrary.simpleMessage("Efallai y byddai un o\'r apiau eraill yn fwy addas. Tapiwch un i fynd i\'r Play Store."), - "Open Canvas Student" : MessageLookupByLibrary.simpleMessage("Agor Canvas Student"), - "Open In Browser" : MessageLookupByLibrary.simpleMessage("Agor mewn Porwr"), - "Open with another app" : MessageLookupByLibrary.simpleMessage("Agor gydag ap arall"), - "Pairing Code" : MessageLookupByLibrary.simpleMessage("Cod Paru"), - "Password" : MessageLookupByLibrary.simpleMessage("Cyfrinair"), - "Password is required" : MessageLookupByLibrary.simpleMessage("Rhaid rhoi cyfrinair"), - "Password must contain at least 8 characters" : MessageLookupByLibrary.simpleMessage("Rhaid i gyfrinair gynnwys o leiaf 8 nod"), - "Password…" : MessageLookupByLibrary.simpleMessage("Cyfrinair..."), - "Planner Note" : MessageLookupByLibrary.simpleMessage("Nodyn gan y Trefnydd"), - "Please enter a valid email address" : MessageLookupByLibrary.simpleMessage("Rhowch gyfeiriad e-bost dilys"), - "Please enter an email address" : MessageLookupByLibrary.simpleMessage("Rhowch gyfeiriad e-bost"), - "Please enter full name" : MessageLookupByLibrary.simpleMessage("Rhowch enw llawn"), - "Please scan a QR code generated by Canvas" : MessageLookupByLibrary.simpleMessage("Sganiwch god QR sydd wedi cael ei greu gan Canvas."), - "Plum, Purple" : MessageLookupByLibrary.simpleMessage("Eirinen, Porffor"), - "Preparing…" : MessageLookupByLibrary.simpleMessage("Wrthi’n paratoi..."), - "Previous Logins" : MessageLookupByLibrary.simpleMessage("Manylion Mewngofnodi Blaenorol"), - "Privacy Policy" : MessageLookupByLibrary.simpleMessage("Polisi Preifatrwydd"), - "Privacy Policy Link" : MessageLookupByLibrary.simpleMessage("Dolen y Polisi Preifatrwydd"), - "Privacy policy, terms of use, open source" : MessageLookupByLibrary.simpleMessage("Polisi preifatrwydd, telerau defnyddio, ffynhonnell agored"), - "QR Code" : MessageLookupByLibrary.simpleMessage("Cod QR"), - "QR scanning requires camera access" : MessageLookupByLibrary.simpleMessage("Mae sganio QR angen mynediad at eich camera"), - "Raspberry, Red" : MessageLookupByLibrary.simpleMessage("Mafonen, Coch"), - "Recipients" : MessageLookupByLibrary.simpleMessage("Derbynwyr"), - "Refresh" : MessageLookupByLibrary.simpleMessage("Adnewyddu"), - "Remind Me" : MessageLookupByLibrary.simpleMessage("Fy Atgoffa"), - "Reminders" : MessageLookupByLibrary.simpleMessage("Nodiadau atgoffa"), - "Reminders have changed!" : MessageLookupByLibrary.simpleMessage("Mae’r nodiadau atgoffa wedi newid!"), - "Reply" : MessageLookupByLibrary.simpleMessage("Ateb"), - "Reply All" : MessageLookupByLibrary.simpleMessage("Ateb Pawb"), - "Report A Problem" : MessageLookupByLibrary.simpleMessage("Rhoi gwybod am broblem"), - "Request Login Help" : MessageLookupByLibrary.simpleMessage("Gofyn am Help i Fewngofnodi"), - "Request Login Help Button" : MessageLookupByLibrary.simpleMessage("Botwm Gofyn am Help i Fewngofnodi"), - "Restart app" : MessageLookupByLibrary.simpleMessage("Ailddechrau’r ap"), - "Retry" : MessageLookupByLibrary.simpleMessage("Ailgynnig"), - "Return to Login" : MessageLookupByLibrary.simpleMessage("Yn ôl i Fewngofnodi"), - "STUDENT" : MessageLookupByLibrary.simpleMessage("MYFYRIWR"), - "Screenshot showing location of QR code generation in browser" : MessageLookupByLibrary.simpleMessage("Ciplun yn dangos y lleoliad creu cod QR yn y porwr."), - "Screenshot showing location of pairing QR code generation in the Canvas Student app" : MessageLookupByLibrary.simpleMessage("Ciplun yn dangos y lleoliad creu cod QR paru yn ap Canvas Student"), - "Select" : MessageLookupByLibrary.simpleMessage("Dewiswch"), - "Select Student Color" : MessageLookupByLibrary.simpleMessage("Dewis Lliw Myfyriwr"), - "Select recipients" : MessageLookupByLibrary.simpleMessage("Dewis derbynwyr"), - "Send Feedback" : MessageLookupByLibrary.simpleMessage("Anfon Adborth"), - "Send a message about this assignment" : MessageLookupByLibrary.simpleMessage("Anfon neges am yr aseiniad hwn"), - "Send a message about this course" : MessageLookupByLibrary.simpleMessage("Anfon neges am y cwrs hwn"), - "Send message" : MessageLookupByLibrary.simpleMessage("Anfon neges"), - "Set a date and time to be notified of this event." : MessageLookupByLibrary.simpleMessage("Gosod dyddiad ac amser i gael eich atgoffa am y digwyddiad hwn."), - "Set a date and time to be notified of this specific assignment." : MessageLookupByLibrary.simpleMessage("Gosod dyddiad ac amser i gael eich atgoffa am yr aseiniad penodol hwn."), - "Settings" : MessageLookupByLibrary.simpleMessage("Gosodiadau"), - "Shamrock, Green" : MessageLookupByLibrary.simpleMessage("Meillionen, Gwyrdd"), - "Share Your Love for the App" : MessageLookupByLibrary.simpleMessage("Rhowch eich barn am yr ap"), - "Show Password" : MessageLookupByLibrary.simpleMessage("Dangos Cyfrinair"), - "Sign In" : MessageLookupByLibrary.simpleMessage("Mewngofnodi"), - "Something went wrong trying to create your account, please reach out to your school for assistance." : MessageLookupByLibrary.simpleMessage("Aeth rhywbeth o’i le wrth geisio creu eich cyfrif, gofynnwch i’ch ysgol am gymorth."), - "Something\'s broken but I can work around it to get what I need done." : MessageLookupByLibrary.simpleMessage("Mae rhywbeth wedi mynd o’i le, ond fe alla i ddal i wneud yr hyn rydw i angen ei wneud."), - "Stop Acting as User" : MessageLookupByLibrary.simpleMessage("Stopio Gweithredu fel Defnyddiwr"), - "Student" : MessageLookupByLibrary.simpleMessage("Myfyriwr"), - "Student Pairing" : MessageLookupByLibrary.simpleMessage("Paru Myfyrwyr"), - "Students can create a QR code using the Canvas Student app on their mobile device" : MessageLookupByLibrary.simpleMessage("Mae myfyrwyr yn gallu creu cod QR drwy ddefnyddio app Canvas Student ar eu dyfais symudol"), - "Students can obtain a pairing code through the Canvas website" : MessageLookupByLibrary.simpleMessage("Mae myfyrwyr yn gallu cael cod paru trwy wefan Canvas"), - "Subject" : MessageLookupByLibrary.simpleMessage("Pwnc"), - "Submitted" : MessageLookupByLibrary.simpleMessage("Wedi Cyflwyno"), - "Successfully submitted!" : MessageLookupByLibrary.simpleMessage("Wedi llwyddo i gyflwyno!"), - "Summary" : MessageLookupByLibrary.simpleMessage("Crynodeb"), - "Switch Users" : MessageLookupByLibrary.simpleMessage("Newid Defnyddwyr"), - "Syllabus" : MessageLookupByLibrary.simpleMessage("Maes Llafur"), - "TA" : MessageLookupByLibrary.simpleMessage("Cynorthwyydd Dysgu"), - "TEACHER" : MessageLookupByLibrary.simpleMessage("ATHRO"), - "Tap to favorite the courses you want to see on the Calendar. Select up to 10." : MessageLookupByLibrary.simpleMessage("Tapiwch i nodi fel ffefrynau’r cyrsiau rydych chi am eu gweld ar y Calendr. Dewiswch hyd at 10."), - "Tap to pair with a new student" : MessageLookupByLibrary.simpleMessage("Tapiwch i baru â myfyriwr newydd"), - "Tap to select this student" : MessageLookupByLibrary.simpleMessage("Tapiwch i ddewis y myfyriwr hwn"), - "Tap to show student selector" : MessageLookupByLibrary.simpleMessage("Tapiwch i ddangos y dewisydd myfyrwyr"), - "Teacher" : MessageLookupByLibrary.simpleMessage("Athro"), - "Tell us about your favorite parts of the app" : MessageLookupByLibrary.simpleMessage("Rhowch wybod i ni am eich hoff rannau o’r ap"), - "Terms of Service" : MessageLookupByLibrary.simpleMessage("Telerau Gwasanaeth"), - "Terms of Service Link" : MessageLookupByLibrary.simpleMessage("Dolen y Telerau Gwasanaeth"), - "Terms of Use" : MessageLookupByLibrary.simpleMessage("Telerau Defnyddio"), - "The QR code you scanned may have expired. Refresh the code on the student\'s device and try again." : MessageLookupByLibrary.simpleMessage("Efallai fod y cod QR y gwnaethoch chi ei sganio wedi dod i ben. Adnewyddwch y cod ar ddyfais y myfyriwr a rhowch gynnig arall arni."), - "The following information will help us better understand your idea:" : MessageLookupByLibrary.simpleMessage("Bydd y wybodaeth ganlynol yn ein helpu ni i ddeall eich syniad yn well:"), - "The server you entered is not authorized for this app." : MessageLookupByLibrary.simpleMessage("Dydy’r gweinydd rydych chi wedi\'i roi ddim wedi’i awdurdodi ar gyfer yr ap hwn."), - "The student you are trying to add belongs to a different school. Log in or create an account with that school to scan this code." : MessageLookupByLibrary.simpleMessage("Mae’r myfyriwr rydych chi’n ceisio ei ychwanegu’n perthyn i ysgol arall. Rhaid i chi fewngofnodi neu greu cyfrif gyda’r ysgol honno i sganio’r cod hwn."), - "The user agent for this app is not authorized." : MessageLookupByLibrary.simpleMessage("Dydy’r asiant defnyddiwr ar gyfer yr ap hwn ddim wedi’i awdurdodi."), - "Theme" : MessageLookupByLibrary.simpleMessage("Thema"), - "There are no installed applications that can open this file" : MessageLookupByLibrary.simpleMessage("Does dim rhaglen wedi’i gosod a all agor y ffeil hon"), - "There is no page information available." : MessageLookupByLibrary.simpleMessage("Does dim gwybodaeth tudalen ar gael."), - "There was a problem loading the Terms of Use" : MessageLookupByLibrary.simpleMessage("Problem wrth lwytho’r Telerau Defnyddio"), - "There was a problem removing this student from your account. Please check your connection and try again." : MessageLookupByLibrary.simpleMessage("Roedd problem wrth dynnu’r myfyriwr hwn o’ch cyfrif. Gwiriwch eich cysylltiad a rhowch gynnig arall arni."), - "There was an error loading recipients for this course" : MessageLookupByLibrary.simpleMessage("Gwall wrth lwytho derbynwyr ar gyfer y cwrs hwn"), - "There was an error loading the summary details for this course." : MessageLookupByLibrary.simpleMessage("Gwall wrth lwytho’r manylion cryno ar gyfer y cwrs hwn."), - "There was an error loading this announcement" : MessageLookupByLibrary.simpleMessage("Gwall wrth lwytho\'r cyhoeddiad hwn"), - "There was an error loading this conversation" : MessageLookupByLibrary.simpleMessage("Gwall wrth lwytho\'r sgwrs hon"), - "There was an error loading this file" : MessageLookupByLibrary.simpleMessage("Gwall wrth lwytho\'r ffeil hon"), - "There was an error loading your inbox messages." : MessageLookupByLibrary.simpleMessage("Gwall wrth lwytho’ch negeseuon blwch derbyn."), - "There was an error loading your student\'s alerts." : MessageLookupByLibrary.simpleMessage("Gwall wrth lwytho hysbysiadau eich myfyriwr."), - "There was an error loading your student\'s calendar" : MessageLookupByLibrary.simpleMessage("Gwall wrth lwytho calendr eich myfyriwr"), - "There was an error loading your students." : MessageLookupByLibrary.simpleMessage("Gwall wrth lwytho’ch myfyrwyr."), - "There was an error loading your student’s courses." : MessageLookupByLibrary.simpleMessage("Gwall wrth lwytho cyrsiau eich myfyriwr."), - "There was an error logging in. Please generate another QR Code and try again." : MessageLookupByLibrary.simpleMessage("Gwall wrth fewngofnodi. Crëwch God QR arall a rhoi cynnig arall arni."), - "There was an error trying to act as this user. Please check the Domain and User ID and try again." : MessageLookupByLibrary.simpleMessage("Gwall wrth geisio gweithredu fel y defnyddiwr hwn. Gwnewch yn sîwr bod y Parth a’r ID Defnyddiwr yn iawn a rhoi cynnig arall arni."), - "There’s nothing to be notified of yet." : MessageLookupByLibrary.simpleMessage("Does dim i’w hysbysu eto."), - "This app is not authorized for use." : MessageLookupByLibrary.simpleMessage("Dydi’r ap hwn ddim wedi’i awdurdodi i’w ddefnyddio."), - "This course does not have any assignments or calendar events yet." : MessageLookupByLibrary.simpleMessage("Does gan y cwrs hwn ddim aseiniadau neu ddigwyddiadau calendr eto."), - "This file is unsupported and can’t be viewed through the app" : MessageLookupByLibrary.simpleMessage("Mae’r ffeil hon yn anghydnaws ac nid oes modd ei gweld drwy’r ap"), - "This will unpair and remove all enrollments for this student from your account." : MessageLookupByLibrary.simpleMessage("Bydd hyn yn dadbaru ac yn tynnu’r holl ymrestriadau ar gyfer y myfyriwr hwn o’ch cyfrif."), - "Total Grade" : MessageLookupByLibrary.simpleMessage("Gradd Gyffredinol"), - "Uh oh!" : MessageLookupByLibrary.simpleMessage("O na!"), - "Unable to fetch courses. Please check your connection and try again." : MessageLookupByLibrary.simpleMessage("Doedd dim modd nôl cyrsiau. Gwiriwch eich cysylltiad a rhoi cynnig arall arni."), - "Unable to load this image" : MessageLookupByLibrary.simpleMessage("Doedd dim modd llwytho’r ddelwedd hon"), - "Unable to play this media file" : MessageLookupByLibrary.simpleMessage("Doedd dim modd chwarae’r ffeil gyfryngau"), - "Unable to send message. Check your connection and try again." : MessageLookupByLibrary.simpleMessage("Doedd dim modd anfon y neges. Gwiriwch eich cysylltiad a rhoi cynnig arall arni."), - "Under Construction" : MessageLookupByLibrary.simpleMessage("Wrthi’n cael ei greu"), - "Unknown User" : MessageLookupByLibrary.simpleMessage("Defnyddiwr Dieithr"), - "Unsaved changes" : MessageLookupByLibrary.simpleMessage("Newidiadau heb eu cadw"), - "Unsupported File" : MessageLookupByLibrary.simpleMessage("Ffeil Anghydnaws"), - "Upload File" : MessageLookupByLibrary.simpleMessage("Llwytho Ffeil i Fyny"), - "Use Camera" : MessageLookupByLibrary.simpleMessage("Defnyddio Camera"), - "Use Dark Theme in Web Content" : MessageLookupByLibrary.simpleMessage("Defnyddio Thema Dywyll mewn Cynnwys Gwe"), - "User ID" : MessageLookupByLibrary.simpleMessage("ID Defnyddiwr"), - "User ID:" : MessageLookupByLibrary.simpleMessage("ID Defnyddiwr:"), - "Version Number" : MessageLookupByLibrary.simpleMessage("Rhif Fersiwn"), - "View Description" : MessageLookupByLibrary.simpleMessage("Gweld Disgrifiad"), - "View error details" : MessageLookupByLibrary.simpleMessage("Gweld manylion gwall"), - "View the Privacy Policy" : MessageLookupByLibrary.simpleMessage("Gweld y Polisi Preifatrwydd"), - "We are currently building this feature for your viewing pleasure." : MessageLookupByLibrary.simpleMessage("Rydyn ni’n adeiladu’r nodwedd hon ar hyn o bryd er mwyn i chi allu gweld."), - "We are unable to display this link, it may belong to an institution you currently aren\'t logged in to." : MessageLookupByLibrary.simpleMessage("Does dim modd i ni ddangos y ddolen hon, efallai ei bod hi’n perthyn i sefydliad nad ydych chi wedi mewngofnodi iddo ar hyn o bryd."), - "We couldn\'t find any students associated with this account" : MessageLookupByLibrary.simpleMessage("Doedd dim modd dod o hyd i unrhyw fyfyrwyr sy’n gysylltiedig â’r cyfrif hwn"), - "We were unable to verify the server for use with this app." : MessageLookupByLibrary.simpleMessage("Doedd dim modd dilysu’r gweinydd i’w ddefnyddio gyda’r ap hwn."), - "We’re not sure what happened, but it wasn’t good. Contact us if this keeps happening." : MessageLookupByLibrary.simpleMessage("Dydyn ni ddim yn siŵr beth ddigwyddodd, ond doedd o ddim yn dd. Cysylltwch â ni os ydy hyn yn parhau i ddigwydd."), - "What can we do better?" : MessageLookupByLibrary.simpleMessage("Beth fydden ni’n gallu ei wneud yn well?"), - "Yes" : MessageLookupByLibrary.simpleMessage("Iawn"), - "You are not observing any students." : MessageLookupByLibrary.simpleMessage("Dydych chi ddim yn arsyllu unrhyw fyfyrwyr."), - "You may only choose 10 calendars to display" : MessageLookupByLibrary.simpleMessage("Dim ond 10 calendr y cewch chi eu dewis i’w dangos"), - "You must enter a user id" : MessageLookupByLibrary.simpleMessage("Mae’n rhaid i chi roi ID defnyddiwr"), - "You must enter a valid domain" : MessageLookupByLibrary.simpleMessage("Mae’n rhaid i chi roi parth dilys"), - "You must select at least one calendar to display" : MessageLookupByLibrary.simpleMessage("Mae’n rhaid i chi ddewis o leiaf un calendr i\'w ddangos"), - "You will be notified about this assignment on…" : MessageLookupByLibrary.simpleMessage("Byddwch chi’n cael eich hysbysu am yr aseiniad hwn ar..."), - "You will be notified about this event on…" : MessageLookupByLibrary.simpleMessage("Byddwch chi’n cael eich hysbysu am y digwyddiad hwn ar..."), - "You\'ll find the QR code on the web in your account profile. Click \'QR for Mobile Login\' in the list." : MessageLookupByLibrary.simpleMessage("Fe ddewch chi o hyd i’r cod QR ar y we yn eich proffil cyfrif. Cliciwch \'QR ar gyfer Mewngofnodi Symudol\' yn y rhestr."), - "You\'ll need to open your student\'s Canvas Student app to continue. Go into Main Menu > Settings > Pair with Observer and scan the QR code you see there." : MessageLookupByLibrary.simpleMessage("Bydd angen i chi agor app Canvas Student eich myfyriwr i barhau. Ewch i\'r Brif Ddewislen > Gosodiadau > Paru ag Arsyllwr a sganiwch y cod QR rydych chi’n ei weld yno."), - "Your code is incorrect or expired." : MessageLookupByLibrary.simpleMessage("Mae eich cod yn anghywir neu mae wedi dod i ben."), - "Your student’s courses might not be published yet." : MessageLookupByLibrary.simpleMessage("Efallai nad yw cyrsiau eich myfyriwr wedi cael eu cyhoeddi eto."), - "You’re all caught up!" : MessageLookupByLibrary.simpleMessage("Rydych chi wedi dal i fyny!"), - "actingAsUser" : m0, - "alertsLabel" : MessageLookupByLibrary.simpleMessage("Negeseuon Hysbysu"), - "appVersion" : m1, - "assignmentGradeAboveThreshold" : m2, - "assignmentGradeBelowThreshold" : m3, - "assignmentLockedModule" : m4, - "assignmentSubjectMessage" : m5, - "assignmentTotalPoints" : m6, - "assignmentTotalPointsAccessible" : m7, - "authorToNOthers" : m8, - "authorToRecipient" : m9, - "authorToRecipientAndNOthers" : m10, - "badgeNumberPlus" : m11, - "calendarLabel" : MessageLookupByLibrary.simpleMessage("Calendr"), - "canvasGuides" : MessageLookupByLibrary.simpleMessage("Canllawiau Canvas"), - "canvasLogoLabel" : MessageLookupByLibrary.simpleMessage("Logo Canvas"), - "canvasSupport" : MessageLookupByLibrary.simpleMessage("Cymorth Canvas"), - "changeStudentColorLabel" : m12, - "collapse" : MessageLookupByLibrary.simpleMessage("crebachu"), - "collapsed" : MessageLookupByLibrary.simpleMessage("wedi crebachu"), - "contentDescriptionScoreOutOfPointsPossible" : m13, - "courseForWhom" : m14, - "courseGradeAboveThreshold" : m15, - "courseGradeBelowThreshold" : m16, - "coursesLabel" : MessageLookupByLibrary.simpleMessage("Cyrsiau"), - "dateAtTime" : m17, - "dismissAlertLabel" : m18, - "domainSearchHelpBody" : m19, - "domainSearchHelpLabel" : MessageLookupByLibrary.simpleMessage("Sut ydw i’n dod o hyd i fy ysgol neu ardal?"), - "domainSearchInputHint" : MessageLookupByLibrary.simpleMessage("Rhowch ardal neu enw’r ysgol..."), - "dueDateAtTime" : m20, - "endMasqueradeLogoutMessage" : m21, - "endMasqueradeMessage" : m22, - "eventSubjectMessage" : m23, - "eventTime" : m24, - "expand" : MessageLookupByLibrary.simpleMessage("ehangu"), - "expanded" : MessageLookupByLibrary.simpleMessage("wedi ehangu"), - "finalGrade" : m25, - "findSchool" : MessageLookupByLibrary.simpleMessage("Dod o hyd i Ysgol"), - "frontPageSubjectMessage" : m26, - "gradeFormatScoreOutOfPointsPossible" : m27, - "gradesSubjectMessage" : m28, - "latePenalty" : m29, - "me" : MessageLookupByLibrary.simpleMessage("fi"), - "messageLinkPostscript" : m30, - "minus" : MessageLookupByLibrary.simpleMessage("minws"), - "mustBeAboveN" : m31, - "mustBeBelowN" : m32, - "next" : MessageLookupByLibrary.simpleMessage("Nesaf"), - "nextMonth" : m33, - "nextWeek" : m34, - "noDomainResults" : m35, - "ok" : MessageLookupByLibrary.simpleMessage("Iawn"), - "outOfPoints" : m36, - "plusRecipientCount" : m37, - "pointsPossible" : m38, - "previousMonth" : m39, - "previousWeek" : m40, - "qrCreateAccountTos" : m41, - "ratingDialogEmailSubject" : m42, - "selectedMonthLabel" : m43, - "send" : MessageLookupByLibrary.simpleMessage("anfon"), - "starRating" : m44, - "submissionStatusSuccessSubtitle" : m45, - "syllabusSubjectMessage" : m46, - "unread" : MessageLookupByLibrary.simpleMessage("heb eu darllen"), - "unreadCount" : m47 - }; -} diff --git a/apps/flutter_parent/lib/l10n/generated/messages_da.dart b/apps/flutter_parent/lib/l10n/generated/messages_da.dart deleted file mode 100644 index 6684174537..0000000000 --- a/apps/flutter_parent/lib/l10n/generated/messages_da.dart +++ /dev/null @@ -1,473 +0,0 @@ -// DO NOT EDIT. This is code generated via package:intl/generate_localized.dart -// This is a library that provides messages for a da locale. All the -// messages from the main program should be duplicated here with the same -// function name. - -// Ignore issues from commonly used lints in this file. -// ignore_for_file:unnecessary_brace_in_string_interps, unnecessary_new -// ignore_for_file:prefer_single_quotes,comment_references, directives_ordering -// ignore_for_file:annotate_overrides,prefer_generic_function_type_aliases -// ignore_for_file:unused_import, file_names - -import 'package:intl/intl.dart'; -import 'package:intl/message_lookup_by_library.dart'; - -final messages = new MessageLookup(); - -typedef String MessageIfAbsent(String messageStr, List args); - -class MessageLookup extends MessageLookupByLibrary { - String get localeName => 'da'; - - static m0(userName) => "Du fungerer som ${userName}"; - - static m1(version) => "v. ${version}"; - - static m2(threshold) => "Opgavekarakter over ${threshold}"; - - static m3(threshold) => "Opgavekarakter under ${threshold}"; - - static m4(moduleName) => "Denne opgave er låst af modulet \"${moduleName}\"."; - - static m5(studentName, assignmentName) => "Vedrørende: ${studentName}, Opgave - ${assignmentName}"; - - static m6(points) => "${points} point"; - - static m7(points) => "${points} point"; - - static m8(authorName, howMany) => "${Intl.plural(howMany, one: '${authorName} til 1 anden', other: '${authorName} til ${howMany} andre')}"; - - static m9(authorName, recipientName) => "${authorName} til ${recipientName}"; - - static m10(authorName, recipientName, howMany) => "${Intl.plural(howMany, one: '${authorName} til ${recipientName} & 1 anden', other: '${authorName} til ${recipientName} & ${howMany} andre')}"; - - static m11(count) => "${count}+"; - - static m12(studentName) => "Skift farve til ${studentName}"; - - static m13(score, pointsPossible) => "${score} ud af ${pointsPossible} point"; - - static m14(studentShortName) => "for ${studentShortName}"; - - static m15(threshold) => "Kursuskarakter oven ${threshold}"; - - static m16(threshold) => "Kursuskarakter under ${threshold}"; - - static m17(date, time) => "${date} kl. ${time}"; - - static m18(alertTitle) => "Afvis ${alertTitle}"; - - static m19(canvasGuides, canvasSupport) => "Prøv at søge efter navnet på den skole eller det distrikt, du forsøger at få adgang til, fx “Smith Private School” eller “Smith County Schools.” Du kan også indtaste et Canvas-domæne direkte, som fx “smith.instructure.com.”\n\nFor mere information om hvordan du finder din institutions Canvas-konto, kan du besøge ${canvasGuides}, kontakte ${canvasSupport} eller kontakte din skole for at få hjælp."; - - static m20(date, time) => "Forfalder d. ${date} kl. ${time}"; - - static m21(userName) => "Du vil stoppe med at fungere som ${userName} og bliver logget ud."; - - static m22(userName) => "Du vil stoppe med at fungere som ${userName} og vende tilbage til din originale konto."; - - static m23(studentName, eventTitle) => "Vedrørende: ${studentName}, Begivenhed - ${eventTitle}"; - - static m24(startAt, endAt) => "${startAt} - ${endAt}"; - - static m25(grade) => "Endelig karakter: ${grade}"; - - static m26(studentName) => "Vedrørende: ${studentName}, Forside"; - - static m27(score, pointsPossible) => "${score} / ${pointsPossible}"; - - static m28(studentName) => "Vedrørende: ${studentName}, Karakterer"; - - static m29(pointsLost) => "Straf for sen aflevering (-${pointsLost})"; - - static m30(studentName, linkUrl) => "Vedrørende: ${studentName}, ${linkUrl}"; - - static m31(percentage) => "Skal være over ${percentage}"; - - static m32(percentage) => "Skal være under ${percentage}"; - - static m33(month) => "Næste måned: ${month}"; - - static m34(date) => "Næste uge, der starter ${date}"; - - static m35(query) => "Kan ikke finde skoler, der matcher \"${query}\""; - - static m36(points, howMany) => "${Intl.plural(howMany, one: 'Ud af 1 point', other: 'Ud af ${points} point')}"; - - static m37(count) => "+${count}"; - - static m38(points) => "${points} mulige point"; - - static m39(month) => "Forrige måned: ${month}"; - - static m40(date) => "Forrige uge, der starter ${date}"; - - static m41(termsOfService, privacyPolicy) => "Ved at trykke på \'Opret konto\' accepterer jeg ${termsOfService} og accepterer ${privacyPolicy}."; - - static m42(version) => "Forslag til Android - Canvas Parent ${version}"; - - static m43(month) => "Måneden ${month}"; - - static m44(position) => "${Intl.plural(position, one: '${position} stjerne', other: '${position} stjerner')}"; - - static m45(date, time) => "Denne opgave blev afleveret den ${date} kl. ${time} og venter på at blive bedømt"; - - static m46(studentName) => "Vedrørende: ${studentName}, Læseplan"; - - static m47(count) => "${count} ulæst"; - - final messages = _notInlinedMessages(_notInlinedMessages); - static _notInlinedMessages(_) => { - "\"Act as\" is essentially logging in as this user without a password. You will be able to take any action as if you were this user, and from other users\' points of views, it will be as if this user performed them. However, audit logs record that you were the one who performed the actions on behalf of this user." : MessageLookupByLibrary.simpleMessage("\"Funger som\" betyder i bund og grund, at du logger ind som denne bruger uden adgangskode. Du kan foretage dig alt, som om du var denne bruger, og for andre brugere, er det lige som om, det var denne bruger, der gjorde det. Dog registrerer audit-logs, at det faktisk var dig, der udførte handlingerne på vegne af denne bruger."), - "-" : MessageLookupByLibrary.simpleMessage("-"), - "A description is required." : MessageLookupByLibrary.simpleMessage("Der kræves en beskrivelse."), - "A network error occurred when adding this student. Check your connection and try again." : MessageLookupByLibrary.simpleMessage("Der opstod en netværksfejl under dit forsøg på at tilføje denne studerende. Kontrollér forbindelsen, og prøv igen."), - "A subject is required." : MessageLookupByLibrary.simpleMessage("Der kræves et emne."), - "Act As User" : MessageLookupByLibrary.simpleMessage("Funger som bruger"), - "Add Student" : MessageLookupByLibrary.simpleMessage("Tilføj studerende"), - "Add attachment" : MessageLookupByLibrary.simpleMessage("Tilføj vedhæftet fil"), - "Add new student" : MessageLookupByLibrary.simpleMessage("Tilføj ny studerende"), - "Add student with…" : MessageLookupByLibrary.simpleMessage("Tilføj studerende med ..."), - "Alert Settings" : MessageLookupByLibrary.simpleMessage("Varslingsindstillinger"), - "Alert me when…" : MessageLookupByLibrary.simpleMessage("Send mig en varsling når ..."), - "All Grading Periods" : MessageLookupByLibrary.simpleMessage("Alle karakterperioder"), - "Already have an account? " : MessageLookupByLibrary.simpleMessage("Har du allerede en konto? "), - "An email address is required." : MessageLookupByLibrary.simpleMessage("Der kræves en e-mailadresse."), - "An error occurred when trying to display this link" : MessageLookupByLibrary.simpleMessage("Der opstod en fejl ved forsøg på at vise dette link"), - "An error occurred while saving your selection. Please try again." : MessageLookupByLibrary.simpleMessage("Der opstod en fejl, da du forsøgte at gemme dit valg. Prøv igen."), - "An unexpected error occurred" : MessageLookupByLibrary.simpleMessage("En uventet fejl opstod"), - "Android OS version" : MessageLookupByLibrary.simpleMessage("Android OS-version"), - "Appearance" : MessageLookupByLibrary.simpleMessage("Udseende"), - "Application version" : MessageLookupByLibrary.simpleMessage("App-version"), - "Are you a student or teacher?" : MessageLookupByLibrary.simpleMessage("Er du studerende eller lærer?"), - "Are you sure you want to log out?" : MessageLookupByLibrary.simpleMessage("Er du sikker på, du vil logge af?"), - "Are you sure you wish to close this page? Your unsent message will be lost." : MessageLookupByLibrary.simpleMessage("Er du sikker på, at du vil lukke denne side? Din usendte besked vil gå tabt."), - "Assignment Details" : MessageLookupByLibrary.simpleMessage("Opgaveoplysninger"), - "Assignment grade above" : MessageLookupByLibrary.simpleMessage("Opgavekarakter over"), - "Assignment grade below" : MessageLookupByLibrary.simpleMessage("Opgavekarakter under"), - "Assignment missing" : MessageLookupByLibrary.simpleMessage("Opgave mangler"), - "Barney, Fuschia" : MessageLookupByLibrary.simpleMessage("Barney, fuschia"), - "Calendars" : MessageLookupByLibrary.simpleMessage("Kalendere"), - "Camera Permission" : MessageLookupByLibrary.simpleMessage("Kameratilladelse"), - "Cancel" : MessageLookupByLibrary.simpleMessage("Annullér"), - "Canvas Student" : MessageLookupByLibrary.simpleMessage("Canvas-studerende"), - "Canvas Teacher" : MessageLookupByLibrary.simpleMessage("Canvas Teacher"), - "Canvas on GitHub" : MessageLookupByLibrary.simpleMessage("Canvas på GitHub"), - "Choose a course to message" : MessageLookupByLibrary.simpleMessage("Vælg et fag at sende en meddelelse til"), - "Choose from Gallery" : MessageLookupByLibrary.simpleMessage("Vælg fra galleri"), - "Complete" : MessageLookupByLibrary.simpleMessage("Fuldført"), - "Contact Support" : MessageLookupByLibrary.simpleMessage("Kontakt support"), - "Course Announcement" : MessageLookupByLibrary.simpleMessage("Besked til faget"), - "Course Announcements" : MessageLookupByLibrary.simpleMessage("Fag-beskeder"), - "Course grade above" : MessageLookupByLibrary.simpleMessage("Kursuskarakter over"), - "Course grade below" : MessageLookupByLibrary.simpleMessage("Kursuskarakter under"), - "Create Account" : MessageLookupByLibrary.simpleMessage("Opret konto"), - "Dark Mode" : MessageLookupByLibrary.simpleMessage("Mørk tilstand"), - "Date" : MessageLookupByLibrary.simpleMessage("Dato"), - "Delete" : MessageLookupByLibrary.simpleMessage("Slet"), - "Description" : MessageLookupByLibrary.simpleMessage("Beskrivelse"), - "Device" : MessageLookupByLibrary.simpleMessage("Enhed"), - "Device model" : MessageLookupByLibrary.simpleMessage("Enhedsmodel"), - "Domain" : MessageLookupByLibrary.simpleMessage("Domæne"), - "Domain:" : MessageLookupByLibrary.simpleMessage("Domæne:"), - "Don\'t show again" : MessageLookupByLibrary.simpleMessage("Vis ikke igen"), - "Done" : MessageLookupByLibrary.simpleMessage("Udført"), - "Download" : MessageLookupByLibrary.simpleMessage("Download"), - "Due" : MessageLookupByLibrary.simpleMessage("Forfalder"), - "EXTREME CRITICAL EMERGENCY!!" : MessageLookupByLibrary.simpleMessage("EKSTREMT KRITISK NØDSTILFÆLDE!!"), - "Electric, blue" : MessageLookupByLibrary.simpleMessage("Elektrisk, blå"), - "Email Address" : MessageLookupByLibrary.simpleMessage("E-mailadresse"), - "Email:" : MessageLookupByLibrary.simpleMessage("E-mail:"), - "Email…" : MessageLookupByLibrary.simpleMessage("E-mail ..."), - "Enter the student pairing code provided to you. If the pairing code doesn\'t work, it may have expired" : MessageLookupByLibrary.simpleMessage("Indtast den studerendes parringskode, der er blevet givet til dig. Hvis parringskoden ikke fungerer, kan den være udløbet"), - "Event" : MessageLookupByLibrary.simpleMessage("Begivenhed"), - "Excused" : MessageLookupByLibrary.simpleMessage("Undskyldt"), - "Expired QR Code" : MessageLookupByLibrary.simpleMessage("Udløbet QR-kode"), - "Failed. Tap for options." : MessageLookupByLibrary.simpleMessage("Mislykkedes. Tryk for indstillinger."), - "Filter" : MessageLookupByLibrary.simpleMessage("Filter"), - "Filter by" : MessageLookupByLibrary.simpleMessage("Filtrer efter"), - "Fire, Orange" : MessageLookupByLibrary.simpleMessage("Ild, orange"), - "Front Page" : MessageLookupByLibrary.simpleMessage("Forside"), - "Full Name" : MessageLookupByLibrary.simpleMessage("Fulde navn"), - "Full Name…" : MessageLookupByLibrary.simpleMessage("Fulde navn ..."), - "Full error message" : MessageLookupByLibrary.simpleMessage("Hel fejlmeddelelse"), - "Go to today" : MessageLookupByLibrary.simpleMessage("Gå til I dag"), - "Grade" : MessageLookupByLibrary.simpleMessage("Karakter"), - "Grade percentage" : MessageLookupByLibrary.simpleMessage("Karakter procent"), - "Graded" : MessageLookupByLibrary.simpleMessage("Bedømt"), - "Grades" : MessageLookupByLibrary.simpleMessage("Karakterer"), - "Help" : MessageLookupByLibrary.simpleMessage("Hjælp"), - "Hide Password" : MessageLookupByLibrary.simpleMessage("Skjul adgangskode"), - "High Contrast Mode" : MessageLookupByLibrary.simpleMessage("Høj kontrast-tilstand"), - "How are we doing?" : MessageLookupByLibrary.simpleMessage("Hvordan klarer vi os?"), - "How is this affecting you?" : MessageLookupByLibrary.simpleMessage("Hvordan påvirker det dig?"), - "I can\'t get things done until I hear back from you." : MessageLookupByLibrary.simpleMessage("Jeg kan ikke udføre ting før jeg har fået dit svar."), - "I don\'t have a Canvas account" : MessageLookupByLibrary.simpleMessage("Jeg har ikke en Canvas-konto"), - "I have a Canvas account" : MessageLookupByLibrary.simpleMessage("Jeg har en Canvas-konto"), - "I need some help but it\'s not urgent." : MessageLookupByLibrary.simpleMessage("Jeg behøver hjælp, men det er ikke presserende."), - "I\'m having trouble logging in" : MessageLookupByLibrary.simpleMessage("Jeg har problemer med at logge ind"), - "Idea for Canvas Parent App [Android]" : MessageLookupByLibrary.simpleMessage("Ide for Canvas Parent App [Android]"), - "In order to provide you with a better experience, we have updated how reminders work. You can add new reminders by viewing an assignment or calendar event and tapping the switch under the \"Remind Me\" section.\n\nBe aware that any reminders created with older versions of this app will not be compatible with the new changes and you will need to create them again." : MessageLookupByLibrary.simpleMessage("For at give dig en bedre oplevelse har vi opdateret, hvordan påmindelser fungerer. Du kan tilføje nye påmindelser ved at se en opgave eller kalenderbegivenhed og trykke på kontakten i sektionen \"Påmind mig\".\n\nVær opmærksom på, at alle påmindelser oprettet med ældre versioner af denne app ikke vil være kompatible med de nye ændringer, og du derfor må oprette dem igen."), - "Inbox" : MessageLookupByLibrary.simpleMessage("Indbakke"), - "Inbox Zero" : MessageLookupByLibrary.simpleMessage("Indbakke nul"), - "Incomplete" : MessageLookupByLibrary.simpleMessage("Ufuldstændig"), - "Incorrect Domain" : MessageLookupByLibrary.simpleMessage("Forkert domæne"), - "Institution Announcement" : MessageLookupByLibrary.simpleMessage("Besked til institutionen"), - "Institution Announcements" : MessageLookupByLibrary.simpleMessage("Institutionsmeddelelser"), - "Instructions" : MessageLookupByLibrary.simpleMessage("Instruktioner"), - "Interactions on this page are limited by your institution." : MessageLookupByLibrary.simpleMessage("Interaktioner på denne side er begrænset af din institution."), - "Invalid QR Code" : MessageLookupByLibrary.simpleMessage("Ugyldig QR-kode"), - "It looks like a great day to rest, relax, and recharge." : MessageLookupByLibrary.simpleMessage("Det er en alle tiders dag til at tage den med ro og slappe af."), - "It looks like assignments haven\'t been created in this space yet." : MessageLookupByLibrary.simpleMessage("Det ser ud til, at opgaver ikke er blevet oprettet i dette rum endnu."), - "Just a casual question, comment, idea, suggestion…" : MessageLookupByLibrary.simpleMessage("Blot et simpelt spørgmål, kommentar, ide, forslag..."), - "Late" : MessageLookupByLibrary.simpleMessage("Sen"), - "Launch External Tool" : MessageLookupByLibrary.simpleMessage("Start eksternt værktøj"), - "Legal" : MessageLookupByLibrary.simpleMessage("Juridisk"), - "Light Mode" : MessageLookupByLibrary.simpleMessage("Lys tilstand"), - "Link Error" : MessageLookupByLibrary.simpleMessage("Linkfejl"), - "Locale:" : MessageLookupByLibrary.simpleMessage("Sted:"), - "Locate QR Code" : MessageLookupByLibrary.simpleMessage("Find QR-kode"), - "Location" : MessageLookupByLibrary.simpleMessage("Placering"), - "Locked" : MessageLookupByLibrary.simpleMessage("Låst"), - "Log Out" : MessageLookupByLibrary.simpleMessage("Log ud"), - "Login flow: Canvas" : MessageLookupByLibrary.simpleMessage("Login-flow: Canvas"), - "Login flow: Normal" : MessageLookupByLibrary.simpleMessage("Login-flow: Normalt"), - "Login flow: Site Admin" : MessageLookupByLibrary.simpleMessage("Login-flow: Websideadministrator"), - "Login flow: Skip mobile verify" : MessageLookupByLibrary.simpleMessage("Login-flow: Spring mobil bekræftelse over"), - "Manage Students" : MessageLookupByLibrary.simpleMessage("Administrer studerende"), - "Message" : MessageLookupByLibrary.simpleMessage("Besked"), - "Message subject" : MessageLookupByLibrary.simpleMessage("Beskedens emne"), - "Missing" : MessageLookupByLibrary.simpleMessage("Mangler"), - "Must be below 100" : MessageLookupByLibrary.simpleMessage("Skal være under 100"), - "Network error" : MessageLookupByLibrary.simpleMessage("Netværksfejl"), - "Never" : MessageLookupByLibrary.simpleMessage("Aldrig"), - "New message" : MessageLookupByLibrary.simpleMessage("Ny besked"), - "No" : MessageLookupByLibrary.simpleMessage("Nej"), - "No Alerts" : MessageLookupByLibrary.simpleMessage("Ingen varslinger"), - "No Assignments" : MessageLookupByLibrary.simpleMessage("Ingen opgaver"), - "No Courses" : MessageLookupByLibrary.simpleMessage("Ingen kurser"), - "No Due Date" : MessageLookupByLibrary.simpleMessage("Ingen afleveringsdato"), - "No Events Today!" : MessageLookupByLibrary.simpleMessage("Ingen begivenheder i dag!"), - "No Grade" : MessageLookupByLibrary.simpleMessage("Ingen karakter"), - "No Location Specified" : MessageLookupByLibrary.simpleMessage("Ingen lokation specificeret"), - "No Students" : MessageLookupByLibrary.simpleMessage("Ingen studerende"), - "No Subject" : MessageLookupByLibrary.simpleMessage("Intet emne"), - "No Summary" : MessageLookupByLibrary.simpleMessage("Intet sammendrag"), - "No description" : MessageLookupByLibrary.simpleMessage("Ingen beskrivelse"), - "No recipients selected" : MessageLookupByLibrary.simpleMessage("Ingen modtagere valgt"), - "Not Graded" : MessageLookupByLibrary.simpleMessage("Ikke bedømt"), - "Not Submitted" : MessageLookupByLibrary.simpleMessage("Ikke indsendt"), - "Not a parent?" : MessageLookupByLibrary.simpleMessage("Ikke forælder?"), - "Notifications for reminders about assignments and calendar events" : MessageLookupByLibrary.simpleMessage("Meddelelser for påmindelser om opgaver og kalenderbegivenheder"), - "OS Version" : MessageLookupByLibrary.simpleMessage("OS-version"), - "Observer" : MessageLookupByLibrary.simpleMessage("Observatør"), - "One of our other apps might be a better fit. Tap one to visit the Play Store." : MessageLookupByLibrary.simpleMessage("En af vores andre apps kan være bedre egnet. Tryk på et for at besøge Play Store."), - "Open Canvas Student" : MessageLookupByLibrary.simpleMessage("Åbn Canvas Student-appen"), - "Open In Browser" : MessageLookupByLibrary.simpleMessage("Åbn i browser"), - "Open with another app" : MessageLookupByLibrary.simpleMessage("Åbn med en anden app"), - "Pairing Code" : MessageLookupByLibrary.simpleMessage("Parringskode"), - "Password" : MessageLookupByLibrary.simpleMessage("Adgangskode"), - "Password is required" : MessageLookupByLibrary.simpleMessage("Adgangskode er påkrævet"), - "Password must contain at least 8 characters" : MessageLookupByLibrary.simpleMessage("Adgangskode skal indeholde mindst 8 tegn"), - "Password…" : MessageLookupByLibrary.simpleMessage("Adgangskode ..."), - "Planner Note" : MessageLookupByLibrary.simpleMessage("Planlægger-bemærkning"), - "Please enter a valid email address" : MessageLookupByLibrary.simpleMessage("Indtast gyldig e-mailadresse"), - "Please enter an email address" : MessageLookupByLibrary.simpleMessage("Indtast en e-mailadresse"), - "Please enter full name" : MessageLookupByLibrary.simpleMessage("Indtast det fulde navn"), - "Please scan a QR code generated by Canvas" : MessageLookupByLibrary.simpleMessage("Scan en QR-kode genereret af Canvas"), - "Plum, Purple" : MessageLookupByLibrary.simpleMessage("Blomme, lilla"), - "Preparing…" : MessageLookupByLibrary.simpleMessage("Forbereder ..."), - "Previous Logins" : MessageLookupByLibrary.simpleMessage("Tidligere logins"), - "Privacy Policy" : MessageLookupByLibrary.simpleMessage("Datapolitik"), - "Privacy Policy Link" : MessageLookupByLibrary.simpleMessage("Link til Datapolitik"), - "Privacy policy, terms of use, open source" : MessageLookupByLibrary.simpleMessage("Fortrolighedspolitik, betingelser for brug, open source"), - "QR Code" : MessageLookupByLibrary.simpleMessage("QR-kode"), - "QR scanning requires camera access" : MessageLookupByLibrary.simpleMessage("QR-scanning kræver kameraadgang"), - "Raspberry, Red" : MessageLookupByLibrary.simpleMessage("Hindbær, rød"), - "Recipients" : MessageLookupByLibrary.simpleMessage("Modtagere"), - "Refresh" : MessageLookupByLibrary.simpleMessage("Opdater"), - "Remind Me" : MessageLookupByLibrary.simpleMessage("Påmind mig"), - "Reminders" : MessageLookupByLibrary.simpleMessage("Påmindelser"), - "Reminders have changed!" : MessageLookupByLibrary.simpleMessage("Påmindelser er blevet ændret!"), - "Reply" : MessageLookupByLibrary.simpleMessage("Svar"), - "Reply All" : MessageLookupByLibrary.simpleMessage("Svar til alle"), - "Report A Problem" : MessageLookupByLibrary.simpleMessage("Rapporter et problem"), - "Request Login Help" : MessageLookupByLibrary.simpleMessage("Anmod om hjælp til login"), - "Request Login Help Button" : MessageLookupByLibrary.simpleMessage("Knap til anmodning om hjælp til login"), - "Restart app" : MessageLookupByLibrary.simpleMessage("Genstart app"), - "Retry" : MessageLookupByLibrary.simpleMessage("Prøv igen"), - "Return to Login" : MessageLookupByLibrary.simpleMessage("Retur til login"), - "STUDENT" : MessageLookupByLibrary.simpleMessage("STUDERENDE"), - "Screenshot showing location of QR code generation in browser" : MessageLookupByLibrary.simpleMessage("Skærmbillede, der viser placeringen af QR-kodegenerering i browseren"), - "Screenshot showing location of pairing QR code generation in the Canvas Student app" : MessageLookupByLibrary.simpleMessage("Skærmbillede, der viser placering af QR-koden i Canvas Student-appen"), - "Select" : MessageLookupByLibrary.simpleMessage("Vælg"), - "Select Student Color" : MessageLookupByLibrary.simpleMessage("Vælg den studerendes farve"), - "Select recipients" : MessageLookupByLibrary.simpleMessage("Vælg modtagere"), - "Send Feedback" : MessageLookupByLibrary.simpleMessage("Send feedback"), - "Send a message about this assignment" : MessageLookupByLibrary.simpleMessage("Send en besked om denne opgave"), - "Send a message about this course" : MessageLookupByLibrary.simpleMessage("Send en besked om dette fag"), - "Send message" : MessageLookupByLibrary.simpleMessage("Send besked"), - "Set a date and time to be notified of this event." : MessageLookupByLibrary.simpleMessage("Indstil en dato og tid for, hvornår der skal meddeles om denne begivenhed."), - "Set a date and time to be notified of this specific assignment." : MessageLookupByLibrary.simpleMessage("Indstil en dato og tid for at blive meddelt om denne specifikke opgave."), - "Settings" : MessageLookupByLibrary.simpleMessage("Indstillinger"), - "Shamrock, Green" : MessageLookupByLibrary.simpleMessage("Firkløver, grøn"), - "Share Your Love for the App" : MessageLookupByLibrary.simpleMessage("Del din kærlighed for denne app"), - "Show Password" : MessageLookupByLibrary.simpleMessage("Vis adgangskode"), - "Sign In" : MessageLookupByLibrary.simpleMessage("Log på"), - "Something went wrong trying to create your account, please reach out to your school for assistance." : MessageLookupByLibrary.simpleMessage("Noget gik galt ved oprettelse af din konto. Kontakt din skole for at få hjælp."), - "Something\'s broken but I can work around it to get what I need done." : MessageLookupByLibrary.simpleMessage("Noget et i stykker, men jeg kan ikke rette det, for at få hvad jeg behøver at gøre."), - "Stop Acting as User" : MessageLookupByLibrary.simpleMessage("Hold op med at fungere som bruger"), - "Student" : MessageLookupByLibrary.simpleMessage("Studerende"), - "Student Pairing" : MessageLookupByLibrary.simpleMessage("Parring af konti for studerende"), - "Students can create a QR code using the Canvas Student app on their mobile device" : MessageLookupByLibrary.simpleMessage("Studerende kan oprette en QR-kode ved hjælp af Canvas Student-appen på deres mobilenhed"), - "Students can obtain a pairing code through the Canvas website" : MessageLookupByLibrary.simpleMessage("Studerende kan få en parringskode via Canvas-webstedet"), - "Subject" : MessageLookupByLibrary.simpleMessage("Emne"), - "Submitted" : MessageLookupByLibrary.simpleMessage("Afleveret"), - "Successfully submitted!" : MessageLookupByLibrary.simpleMessage("Blev indsendt!"), - "Summary" : MessageLookupByLibrary.simpleMessage("Sammendrag"), - "Switch Users" : MessageLookupByLibrary.simpleMessage("Skift brugere"), - "Syllabus" : MessageLookupByLibrary.simpleMessage("Læseplan"), - "TA" : MessageLookupByLibrary.simpleMessage("Undervisningsassistent"), - "TEACHER" : MessageLookupByLibrary.simpleMessage("LÆRER"), - "Tap to favorite the courses you want to see on the Calendar. Select up to 10." : MessageLookupByLibrary.simpleMessage("Tryk for at få vist dine favoritfag i kalenderen. Vælg op til 10."), - "Tap to pair with a new student" : MessageLookupByLibrary.simpleMessage("Tryk for at parre med en ny studerende"), - "Tap to select this student" : MessageLookupByLibrary.simpleMessage("Tryk for at vælge denne studerende"), - "Tap to show student selector" : MessageLookupByLibrary.simpleMessage("Tryk for at vise vælger for studerende"), - "Teacher" : MessageLookupByLibrary.simpleMessage("Lærer"), - "Tell us about your favorite parts of the app" : MessageLookupByLibrary.simpleMessage("Fortæl os om, hvad du bedst kan lide af denne app"), - "Terms of Service" : MessageLookupByLibrary.simpleMessage("Betingelser for service"), - "Terms of Service Link" : MessageLookupByLibrary.simpleMessage("Link til Betingelser for service"), - "Terms of Use" : MessageLookupByLibrary.simpleMessage("Betingelser for brug"), - "The QR code you scanned may have expired. Refresh the code on the student\'s device and try again." : MessageLookupByLibrary.simpleMessage("Den QR-kode, du scannede, kan være udløbet. Opdater koden på den studerendes enhed, og prøv igen."), - "The following information will help us better understand your idea:" : MessageLookupByLibrary.simpleMessage("Følgende oplysninger hjælper os med bedre at forstå din idé:"), - "The server you entered is not authorized for this app." : MessageLookupByLibrary.simpleMessage("Den server, du indtastede, er ikke autoriseret til denne app."), - "The student you are trying to add belongs to a different school. Log in or create an account with that school to scan this code." : MessageLookupByLibrary.simpleMessage("Den studerende, du prøver at tilføje, tilhører en anden skole. Log ind eller opret en konto med denne skole for at scanne denne kode."), - "The user agent for this app is not authorized." : MessageLookupByLibrary.simpleMessage("Brugeragenten for denne app er ikke autoriseret."), - "Theme" : MessageLookupByLibrary.simpleMessage("Tema"), - "There are no installed applications that can open this file" : MessageLookupByLibrary.simpleMessage("Der er ingen installerede applikationer, der kan åbne denne fil"), - "There is no page information available." : MessageLookupByLibrary.simpleMessage("Der er ingen tilgængelige sideinformationer."), - "There was a problem loading the Terms of Use" : MessageLookupByLibrary.simpleMessage("Der opstod et problem ved indlæsning af Betingelser for brug"), - "There was a problem removing this student from your account. Please check your connection and try again." : MessageLookupByLibrary.simpleMessage("Der opstod et problem under forsøg på at fjerne denne studerende fra din konto. Kontrollér forbindelsen, og prøv igen."), - "There was an error loading recipients for this course" : MessageLookupByLibrary.simpleMessage("Der opstod en fejl under indlæsning af modtagere for dette fag"), - "There was an error loading the summary details for this course." : MessageLookupByLibrary.simpleMessage("Der opstod en fejl ved indlæsning af sammendragsoplysningerne for dette fag."), - "There was an error loading this announcement" : MessageLookupByLibrary.simpleMessage("Der opstod en fejl under indlæsning af denne besked"), - "There was an error loading this conversation" : MessageLookupByLibrary.simpleMessage("Der opstod en fejl under indlæsning af denne diskussion"), - "There was an error loading this file" : MessageLookupByLibrary.simpleMessage("Der opstod en fejl ved indlæsning af denne fil"), - "There was an error loading your inbox messages." : MessageLookupByLibrary.simpleMessage("Der opstod en fejl under indlæsning af beskederne i indbakken."), - "There was an error loading your student\'s alerts." : MessageLookupByLibrary.simpleMessage("Der opstod en fejl under indlæsning af den studerendes varslinger."), - "There was an error loading your student\'s calendar" : MessageLookupByLibrary.simpleMessage("Der opstod en fejl under indlæsning af den studerendes kalender"), - "There was an error loading your students." : MessageLookupByLibrary.simpleMessage("Der opstod en fejl under indlæsning af de studerende."), - "There was an error loading your student’s courses." : MessageLookupByLibrary.simpleMessage("Der opstod en fejl under indlæsning af din studerendes fag."), - "There was an error logging in. Please generate another QR Code and try again." : MessageLookupByLibrary.simpleMessage("Der opstod en fejl ved indlogning. Generer en QR-kode til, og prøv igen."), - "There was an error trying to act as this user. Please check the Domain and User ID and try again." : MessageLookupByLibrary.simpleMessage("Der opstod en fejl ved at fungere som denne bruger. Kontroller domænet og bruger-ID\'et, og prøv igen."), - "There’s nothing to be notified of yet." : MessageLookupByLibrary.simpleMessage("Der er intet at blive underrettet om endnu."), - "This app is not authorized for use." : MessageLookupByLibrary.simpleMessage("Denne app er ikke autoriseret for brug."), - "This course does not have any assignments or calendar events yet." : MessageLookupByLibrary.simpleMessage("Dette fag har endnu ingen opgaver eller kalenderbegivenheder."), - "This file is unsupported and can’t be viewed through the app" : MessageLookupByLibrary.simpleMessage("Denne fil understøttes ikke og kan ikke vises i appen"), - "This will unpair and remove all enrollments for this student from your account." : MessageLookupByLibrary.simpleMessage("Dette vil fjerne parring og alle tilmeldinger for denne studerende fra din konto."), - "Total Grade" : MessageLookupByLibrary.simpleMessage("Total karakter"), - "Uh oh!" : MessageLookupByLibrary.simpleMessage("Åh ååh!"), - "Unable to fetch courses. Please check your connection and try again." : MessageLookupByLibrary.simpleMessage("Kan ikke hente fag. Kontrollér forbindelsen, og prøv igen."), - "Unable to load this image" : MessageLookupByLibrary.simpleMessage("Kan ikke indlæse dette billede"), - "Unable to play this media file" : MessageLookupByLibrary.simpleMessage("Denne mediefil kunne ikke afspilles"), - "Unable to send message. Check your connection and try again." : MessageLookupByLibrary.simpleMessage("Kan ikke sende besked. Kontrollér forbindelsen, og prøv igen."), - "Under Construction" : MessageLookupByLibrary.simpleMessage("Under opbygning"), - "Unknown User" : MessageLookupByLibrary.simpleMessage("Ukendt bruger"), - "Unsaved changes" : MessageLookupByLibrary.simpleMessage("Ugemte ændringer"), - "Unsupported File" : MessageLookupByLibrary.simpleMessage("Ikke-understøttet fil"), - "Upload File" : MessageLookupByLibrary.simpleMessage("Overfør fil"), - "Use Camera" : MessageLookupByLibrary.simpleMessage("Brug kamera"), - "Use Dark Theme in Web Content" : MessageLookupByLibrary.simpleMessage("Brug mørkt tema i webindhold"), - "User ID" : MessageLookupByLibrary.simpleMessage("Bruger-id"), - "User ID:" : MessageLookupByLibrary.simpleMessage("Bruger ID:"), - "Version Number" : MessageLookupByLibrary.simpleMessage("Versionsnummer"), - "View Description" : MessageLookupByLibrary.simpleMessage("Vis beskrivelse"), - "View error details" : MessageLookupByLibrary.simpleMessage("Vis fejldetaljer"), - "View the Privacy Policy" : MessageLookupByLibrary.simpleMessage("Vis datapolitikken"), - "We are currently building this feature for your viewing pleasure." : MessageLookupByLibrary.simpleMessage("Vi er i øjeblikket ved at bygge denne funktion."), - "We are unable to display this link, it may belong to an institution you currently aren\'t logged in to." : MessageLookupByLibrary.simpleMessage("Vi kan ikke vise dette link, måske hører det til en institution, som du i øjeblikket ikke er logget ind på."), - "We couldn\'t find any students associated with this account" : MessageLookupByLibrary.simpleMessage("Vi kunne ikke finde nogen studerende tilknyttet den konto."), - "We were unable to verify the server for use with this app." : MessageLookupByLibrary.simpleMessage("Vi kunne ikke bekræfte serveren til brug med denne app."), - "We’re not sure what happened, but it wasn’t good. Contact us if this keeps happening." : MessageLookupByLibrary.simpleMessage("Vi ved ikke helt, hvad der skete, men det var ikke godt. Kontakt os, hvis dette fortsætter."), - "What can we do better?" : MessageLookupByLibrary.simpleMessage("Hvad kan vi gøre bedre?"), - "Yes" : MessageLookupByLibrary.simpleMessage("Ja"), - "You are not observing any students." : MessageLookupByLibrary.simpleMessage("Du observerer ikke nogen studerende."), - "You may only choose 10 calendars to display" : MessageLookupByLibrary.simpleMessage("Du kan kun vælge at vise 10 kalendere"), - "You must enter a user id" : MessageLookupByLibrary.simpleMessage("Du skal indtaste et bruger-ID"), - "You must enter a valid domain" : MessageLookupByLibrary.simpleMessage("Du skal indtaste et gyldigt domæne"), - "You must select at least one calendar to display" : MessageLookupByLibrary.simpleMessage("Du skal vælge mindst en kalender at vise"), - "You will be notified about this assignment on…" : MessageLookupByLibrary.simpleMessage("Du får besked om denne opgave den …"), - "You will be notified about this event on…" : MessageLookupByLibrary.simpleMessage("Du får besked om denne begivenhed den ..."), - "You\'ll find the QR code on the web in your account profile. Click \'QR for Mobile Login\' in the list." : MessageLookupByLibrary.simpleMessage("Du finder QR-koden på nettet i din kontoprofil. Klik på \'QR for mobil login\' på listen."), - "You\'ll need to open your student\'s Canvas Student app to continue. Go into Main Menu > Settings > Pair with Observer and scan the QR code you see there." : MessageLookupByLibrary.simpleMessage("Du skal åbne din studerendes Canvas Student-app for at fortsætte. Gå til Hovedmenu > Indstillinger> Par med observatør, og scan den QR-kode, du ser der."), - "Your code is incorrect or expired." : MessageLookupByLibrary.simpleMessage("Din kode er forkert eller udløbet."), - "Your student’s courses might not be published yet." : MessageLookupByLibrary.simpleMessage("Din studerendes fag kan muligvis ikke offentliggøres endnu."), - "You’re all caught up!" : MessageLookupByLibrary.simpleMessage("Du har set det hele!"), - "actingAsUser" : m0, - "alertsLabel" : MessageLookupByLibrary.simpleMessage("Varslinger"), - "appVersion" : m1, - "assignmentGradeAboveThreshold" : m2, - "assignmentGradeBelowThreshold" : m3, - "assignmentLockedModule" : m4, - "assignmentSubjectMessage" : m5, - "assignmentTotalPoints" : m6, - "assignmentTotalPointsAccessible" : m7, - "authorToNOthers" : m8, - "authorToRecipient" : m9, - "authorToRecipientAndNOthers" : m10, - "badgeNumberPlus" : m11, - "calendarLabel" : MessageLookupByLibrary.simpleMessage("Kalender"), - "canvasGuides" : MessageLookupByLibrary.simpleMessage("Canvas-vejledningerne"), - "canvasLogoLabel" : MessageLookupByLibrary.simpleMessage("Canvas-logo"), - "canvasSupport" : MessageLookupByLibrary.simpleMessage("Canvas-support"), - "changeStudentColorLabel" : m12, - "collapse" : MessageLookupByLibrary.simpleMessage("skjul"), - "collapsed" : MessageLookupByLibrary.simpleMessage("skjult"), - "contentDescriptionScoreOutOfPointsPossible" : m13, - "courseForWhom" : m14, - "courseGradeAboveThreshold" : m15, - "courseGradeBelowThreshold" : m16, - "coursesLabel" : MessageLookupByLibrary.simpleMessage("Fag"), - "dateAtTime" : m17, - "dismissAlertLabel" : m18, - "domainSearchHelpBody" : m19, - "domainSearchHelpLabel" : MessageLookupByLibrary.simpleMessage("Hvordan finder jeg min skole eller distrikt?"), - "domainSearchInputHint" : MessageLookupByLibrary.simpleMessage("Indtast skolens navn eller distrikt ..."), - "dueDateAtTime" : m20, - "endMasqueradeLogoutMessage" : m21, - "endMasqueradeMessage" : m22, - "eventSubjectMessage" : m23, - "eventTime" : m24, - "expand" : MessageLookupByLibrary.simpleMessage("udvid"), - "expanded" : MessageLookupByLibrary.simpleMessage("udvidet"), - "finalGrade" : m25, - "findSchool" : MessageLookupByLibrary.simpleMessage("Find skole"), - "frontPageSubjectMessage" : m26, - "gradeFormatScoreOutOfPointsPossible" : m27, - "gradesSubjectMessage" : m28, - "latePenalty" : m29, - "me" : MessageLookupByLibrary.simpleMessage("mig"), - "messageLinkPostscript" : m30, - "minus" : MessageLookupByLibrary.simpleMessage("minus"), - "mustBeAboveN" : m31, - "mustBeBelowN" : m32, - "next" : MessageLookupByLibrary.simpleMessage("Næste"), - "nextMonth" : m33, - "nextWeek" : m34, - "noDomainResults" : m35, - "ok" : MessageLookupByLibrary.simpleMessage("OK"), - "outOfPoints" : m36, - "plusRecipientCount" : m37, - "pointsPossible" : m38, - "previousMonth" : m39, - "previousWeek" : m40, - "qrCreateAccountTos" : m41, - "ratingDialogEmailSubject" : m42, - "selectedMonthLabel" : m43, - "send" : MessageLookupByLibrary.simpleMessage("send"), - "starRating" : m44, - "submissionStatusSuccessSubtitle" : m45, - "syllabusSubjectMessage" : m46, - "unread" : MessageLookupByLibrary.simpleMessage("ulæst"), - "unreadCount" : m47 - }; -} diff --git a/apps/flutter_parent/lib/l10n/generated/messages_da_instk12.dart b/apps/flutter_parent/lib/l10n/generated/messages_da_instk12.dart deleted file mode 100644 index 81efb20f53..0000000000 --- a/apps/flutter_parent/lib/l10n/generated/messages_da_instk12.dart +++ /dev/null @@ -1,473 +0,0 @@ -// DO NOT EDIT. This is code generated via package:intl/generate_localized.dart -// This is a library that provides messages for a da_instk12 locale. All the -// messages from the main program should be duplicated here with the same -// function name. - -// Ignore issues from commonly used lints in this file. -// ignore_for_file:unnecessary_brace_in_string_interps, unnecessary_new -// ignore_for_file:prefer_single_quotes,comment_references, directives_ordering -// ignore_for_file:annotate_overrides,prefer_generic_function_type_aliases -// ignore_for_file:unused_import, file_names - -import 'package:intl/intl.dart'; -import 'package:intl/message_lookup_by_library.dart'; - -final messages = new MessageLookup(); - -typedef String MessageIfAbsent(String messageStr, List args); - -class MessageLookup extends MessageLookupByLibrary { - String get localeName => 'da_instk12'; - - static m0(userName) => "Du fungerer som ${userName}"; - - static m1(version) => "v. ${version}"; - - static m2(threshold) => "Opgavevurdering over ${threshold}"; - - static m3(threshold) => "Opgavevurdering under ${threshold}"; - - static m4(moduleName) => "Denne opgave er låst af forløbet \"${moduleName}\"."; - - static m5(studentName, assignmentName) => "Vedrørende: ${studentName}, Opgave - ${assignmentName}"; - - static m6(points) => "${points} point"; - - static m7(points) => "${points} point"; - - static m8(authorName, howMany) => "${Intl.plural(howMany, one: '${authorName} til 1 anden', other: '${authorName} til ${howMany} andre')}"; - - static m9(authorName, recipientName) => "${authorName} til ${recipientName}"; - - static m10(authorName, recipientName, howMany) => "${Intl.plural(howMany, one: '${authorName} til ${recipientName} & 1 anden', other: '${authorName} til ${recipientName} & ${howMany} andre')}"; - - static m11(count) => "${count}+"; - - static m12(studentName) => "Skift farve til ${studentName}"; - - static m13(score, pointsPossible) => "${score} ud af ${pointsPossible} point"; - - static m14(studentShortName) => "for ${studentShortName}"; - - static m15(threshold) => "Fagvurdering oven ${threshold}"; - - static m16(threshold) => "Fagvurdering under ${threshold}"; - - static m17(date, time) => "${date} kl. ${time}"; - - static m18(alertTitle) => "Afvis ${alertTitle}"; - - static m19(canvasGuides, canvasSupport) => "Prøv at søge efter navnet på den skole eller det distrikt, du forsøger at få adgang til, fx “Smith Private School” eller “Smith County Schools.” Du kan også indtaste et Canvas-domæne direkte, som fx “smith.instructure.com.”\n\nFor mere information om hvordan du finder din institutions Canvas-konto, kan du besøge ${canvasGuides}, kontakte ${canvasSupport} eller kontakte din skole for at få hjælp."; - - static m20(date, time) => "Forfalder d. ${date} kl. ${time}"; - - static m21(userName) => "Du vil stoppe med at fungere som ${userName} og bliver logget ud."; - - static m22(userName) => "Du vil stoppe med at fungere som ${userName} og vende tilbage til din originale konto."; - - static m23(studentName, eventTitle) => "Vedrørende: ${studentName}, Begivenhed - ${eventTitle}"; - - static m24(startAt, endAt) => "${startAt} - ${endAt}"; - - static m25(grade) => "Endelig vurdering: ${grade}"; - - static m26(studentName) => "Vedrørende: ${studentName}, Forside"; - - static m27(score, pointsPossible) => "${score} / ${pointsPossible}"; - - static m28(studentName) => "Vedrørende: ${studentName}, Vurderinger"; - - static m29(pointsLost) => "Straf for sen aflevering (-${pointsLost})"; - - static m30(studentName, linkUrl) => "Vedrørende: ${studentName}, ${linkUrl}"; - - static m31(percentage) => "Skal være over ${percentage}"; - - static m32(percentage) => "Skal være under ${percentage}"; - - static m33(month) => "Næste måned: ${month}"; - - static m34(date) => "Næste uge, der starter ${date}"; - - static m35(query) => "Kan ikke finde skoler, der matcher \"${query}\""; - - static m36(points, howMany) => "${Intl.plural(howMany, one: 'Ud af 1 point', other: 'Ud af ${points} point')}"; - - static m37(count) => "+${count}"; - - static m38(points) => "${points} mulige point"; - - static m39(month) => "Forrige måned: ${month}"; - - static m40(date) => "Forrige uge, der starter ${date}"; - - static m41(termsOfService, privacyPolicy) => "Ved at trykke på \'Opret konto\' accepterer jeg ${termsOfService} og accepterer ${privacyPolicy}."; - - static m42(version) => "Forslag til Android - Canvas Parent ${version}"; - - static m43(month) => "Måneden ${month}"; - - static m44(position) => "${Intl.plural(position, one: '${position} stjerne', other: '${position} stjerner')}"; - - static m45(date, time) => "Denne opgave blev afleveret den ${date} kl. ${time} og venter på at blive bedømt"; - - static m46(studentName) => "Vedrørende: ${studentName}, Fagplan"; - - static m47(count) => "${count} ulæst"; - - final messages = _notInlinedMessages(_notInlinedMessages); - static _notInlinedMessages(_) => { - "\"Act as\" is essentially logging in as this user without a password. You will be able to take any action as if you were this user, and from other users\' points of views, it will be as if this user performed them. However, audit logs record that you were the one who performed the actions on behalf of this user." : MessageLookupByLibrary.simpleMessage("\"Funger som\" betyder i bund og grund, at du logger ind som denne bruger uden adgangskode. Du kan foretage dig alt, som om du var denne bruger, og for andre brugere, er det lige som om, det var denne bruger, der gjorde det. Dog registrerer audit-logs, at det faktisk var dig, der udførte handlingerne på vegne af denne bruger."), - "-" : MessageLookupByLibrary.simpleMessage("-"), - "A description is required." : MessageLookupByLibrary.simpleMessage("Der kræves en beskrivelse."), - "A network error occurred when adding this student. Check your connection and try again." : MessageLookupByLibrary.simpleMessage("Der opstod en netværksfejl under dit forsøg på at tilføje denne elev. Kontrollér forbindelsen, og prøv igen."), - "A subject is required." : MessageLookupByLibrary.simpleMessage("Der kræves et emne."), - "Act As User" : MessageLookupByLibrary.simpleMessage("Funger som bruger"), - "Add Student" : MessageLookupByLibrary.simpleMessage("Tilføj elever"), - "Add attachment" : MessageLookupByLibrary.simpleMessage("Tilføj vedhæftet fil"), - "Add new student" : MessageLookupByLibrary.simpleMessage("Tilføj ny elev"), - "Add student with…" : MessageLookupByLibrary.simpleMessage("Tilføj elev med ..."), - "Alert Settings" : MessageLookupByLibrary.simpleMessage("Varslingsindstillinger"), - "Alert me when…" : MessageLookupByLibrary.simpleMessage("Send mig en varsling når ..."), - "All Grading Periods" : MessageLookupByLibrary.simpleMessage("Alle vurderingsperioder"), - "Already have an account? " : MessageLookupByLibrary.simpleMessage("Har du allerede en konto? "), - "An email address is required." : MessageLookupByLibrary.simpleMessage("Der kræves en e-mailadresse."), - "An error occurred when trying to display this link" : MessageLookupByLibrary.simpleMessage("Der opstod en fejl ved forsøg på at vise dette link"), - "An error occurred while saving your selection. Please try again." : MessageLookupByLibrary.simpleMessage("Der opstod en fejl, da du forsøgte at gemme dit valg. Prøv igen."), - "An unexpected error occurred" : MessageLookupByLibrary.simpleMessage("Der opstod en uventet fejl"), - "Android OS version" : MessageLookupByLibrary.simpleMessage("Android OS-version"), - "Appearance" : MessageLookupByLibrary.simpleMessage("Udseende"), - "Application version" : MessageLookupByLibrary.simpleMessage("App-version"), - "Are you a student or teacher?" : MessageLookupByLibrary.simpleMessage("Er du elev eller lærer?"), - "Are you sure you want to log out?" : MessageLookupByLibrary.simpleMessage("Er du sikker på, du vil logge af?"), - "Are you sure you wish to close this page? Your unsent message will be lost." : MessageLookupByLibrary.simpleMessage("Er du sikker på, at du vil lukke denne side? Din usendte besked vil gå tabt."), - "Assignment Details" : MessageLookupByLibrary.simpleMessage("Opgaveoplysninger"), - "Assignment grade above" : MessageLookupByLibrary.simpleMessage("Opgavevurdering over"), - "Assignment grade below" : MessageLookupByLibrary.simpleMessage("Opgavevurdering under"), - "Assignment missing" : MessageLookupByLibrary.simpleMessage("Manglende opgave"), - "Barney, Fuschia" : MessageLookupByLibrary.simpleMessage("Barney, fuschia"), - "Calendars" : MessageLookupByLibrary.simpleMessage("Kalendere"), - "Camera Permission" : MessageLookupByLibrary.simpleMessage("Kameratilladelse"), - "Cancel" : MessageLookupByLibrary.simpleMessage("Annullér"), - "Canvas Student" : MessageLookupByLibrary.simpleMessage("Canvas-elev"), - "Canvas Teacher" : MessageLookupByLibrary.simpleMessage("Canvas Teacher"), - "Canvas on GitHub" : MessageLookupByLibrary.simpleMessage("Canvas på GitHub"), - "Choose a course to message" : MessageLookupByLibrary.simpleMessage("Vælg et fag at sende en meddelelse til"), - "Choose from Gallery" : MessageLookupByLibrary.simpleMessage("Vælg fra galleri"), - "Complete" : MessageLookupByLibrary.simpleMessage("Fuldført"), - "Contact Support" : MessageLookupByLibrary.simpleMessage("Kontakt support"), - "Course Announcement" : MessageLookupByLibrary.simpleMessage("Besked til faget"), - "Course Announcements" : MessageLookupByLibrary.simpleMessage("Fag-beskeder"), - "Course grade above" : MessageLookupByLibrary.simpleMessage("Fagvurdering over"), - "Course grade below" : MessageLookupByLibrary.simpleMessage("Fagvurdering under"), - "Create Account" : MessageLookupByLibrary.simpleMessage("Opret konto"), - "Dark Mode" : MessageLookupByLibrary.simpleMessage("Mørk tilstand"), - "Date" : MessageLookupByLibrary.simpleMessage("Dato"), - "Delete" : MessageLookupByLibrary.simpleMessage("Slet"), - "Description" : MessageLookupByLibrary.simpleMessage("Beskrivelse"), - "Device" : MessageLookupByLibrary.simpleMessage("Enhed"), - "Device model" : MessageLookupByLibrary.simpleMessage("Enhedsmodel"), - "Domain" : MessageLookupByLibrary.simpleMessage("Domæne"), - "Domain:" : MessageLookupByLibrary.simpleMessage("Domæne:"), - "Don\'t show again" : MessageLookupByLibrary.simpleMessage("Vis ikke igen"), - "Done" : MessageLookupByLibrary.simpleMessage("Udført"), - "Download" : MessageLookupByLibrary.simpleMessage("Download"), - "Due" : MessageLookupByLibrary.simpleMessage("Forfalder"), - "EXTREME CRITICAL EMERGENCY!!" : MessageLookupByLibrary.simpleMessage("EKSTREMT KRITISK NØDSTILFÆLDE!!"), - "Electric, blue" : MessageLookupByLibrary.simpleMessage("Elektrisk, blå"), - "Email Address" : MessageLookupByLibrary.simpleMessage("E-mail-adresse"), - "Email:" : MessageLookupByLibrary.simpleMessage("E-mail:"), - "Email…" : MessageLookupByLibrary.simpleMessage("E-mail ..."), - "Enter the student pairing code provided to you. If the pairing code doesn\'t work, it may have expired" : MessageLookupByLibrary.simpleMessage("Indtast elevens parringskode, der er blevet givet til dig. Hvis parringskoden ikke fungerer, kan den være udløbet"), - "Event" : MessageLookupByLibrary.simpleMessage("Begivenhed"), - "Excused" : MessageLookupByLibrary.simpleMessage("Undskyldt"), - "Expired QR Code" : MessageLookupByLibrary.simpleMessage("Udløbet QR-kode"), - "Failed. Tap for options." : MessageLookupByLibrary.simpleMessage("Mislykkedes. Tryk for indstillinger."), - "Filter" : MessageLookupByLibrary.simpleMessage("Filter"), - "Filter by" : MessageLookupByLibrary.simpleMessage("Filtrere efter"), - "Fire, Orange" : MessageLookupByLibrary.simpleMessage("Ild, orange"), - "Front Page" : MessageLookupByLibrary.simpleMessage("Forside"), - "Full Name" : MessageLookupByLibrary.simpleMessage("Fulde navn"), - "Full Name…" : MessageLookupByLibrary.simpleMessage("Fulde navn ..."), - "Full error message" : MessageLookupByLibrary.simpleMessage("Hel fejlmeddelelse"), - "Go to today" : MessageLookupByLibrary.simpleMessage("Gå til I dag"), - "Grade" : MessageLookupByLibrary.simpleMessage("Vurdering"), - "Grade percentage" : MessageLookupByLibrary.simpleMessage("Vurdering procent"), - "Graded" : MessageLookupByLibrary.simpleMessage("Bedømt"), - "Grades" : MessageLookupByLibrary.simpleMessage("Vurderinger"), - "Help" : MessageLookupByLibrary.simpleMessage("Hjælp"), - "Hide Password" : MessageLookupByLibrary.simpleMessage("Skjul adgangskode"), - "High Contrast Mode" : MessageLookupByLibrary.simpleMessage("Høj kontrast-tilstand"), - "How are we doing?" : MessageLookupByLibrary.simpleMessage("Hvordan klarer vi os?"), - "How is this affecting you?" : MessageLookupByLibrary.simpleMessage("Hvordan påvirker det dig?"), - "I can\'t get things done until I hear back from you." : MessageLookupByLibrary.simpleMessage("Jeg kan ikke fortsætte, før jeg har fået svar."), - "I don\'t have a Canvas account" : MessageLookupByLibrary.simpleMessage("Jeg har ikke en Canvas-konto"), - "I have a Canvas account" : MessageLookupByLibrary.simpleMessage("Jeg har en Canvas-konto"), - "I need some help but it\'s not urgent." : MessageLookupByLibrary.simpleMessage("Jeg behøver hjælp, men det er ikke presserende."), - "I\'m having trouble logging in" : MessageLookupByLibrary.simpleMessage("Jeg har problemer med at logge ind"), - "Idea for Canvas Parent App [Android]" : MessageLookupByLibrary.simpleMessage("Ide for Canvas Parent App [Android]"), - "In order to provide you with a better experience, we have updated how reminders work. You can add new reminders by viewing an assignment or calendar event and tapping the switch under the \"Remind Me\" section.\n\nBe aware that any reminders created with older versions of this app will not be compatible with the new changes and you will need to create them again." : MessageLookupByLibrary.simpleMessage("For at give dig en bedre oplevelse har vi opdateret, hvordan påmindelser fungerer. Du kan tilføje nye påmindelser ved at se en opgave eller kalenderbegivenhed og trykke på kontakten i sektionen \"Påmind mig\".\n\nVær opmærksom på, at alle påmindelser oprettet med ældre versioner af denne app ikke vil være kompatible med de nye ændringer, og du derfor må oprette dem igen."), - "Inbox" : MessageLookupByLibrary.simpleMessage("Indbakke"), - "Inbox Zero" : MessageLookupByLibrary.simpleMessage("Indbakke nul"), - "Incomplete" : MessageLookupByLibrary.simpleMessage("Ufuldstændig"), - "Incorrect Domain" : MessageLookupByLibrary.simpleMessage("Forkert domæne"), - "Institution Announcement" : MessageLookupByLibrary.simpleMessage("Besked til institutionen"), - "Institution Announcements" : MessageLookupByLibrary.simpleMessage("Institutionsmeddelelser"), - "Instructions" : MessageLookupByLibrary.simpleMessage("Instruktioner"), - "Interactions on this page are limited by your institution." : MessageLookupByLibrary.simpleMessage("Interaktioner på denne side er begrænset af din institution."), - "Invalid QR Code" : MessageLookupByLibrary.simpleMessage("Ugyldig QR-kode"), - "It looks like a great day to rest, relax, and recharge." : MessageLookupByLibrary.simpleMessage("Det er en alle tiders dag til at tage den med ro og slappe af."), - "It looks like assignments haven\'t been created in this space yet." : MessageLookupByLibrary.simpleMessage("Det ser ud til, at opgaver ikke er blevet oprettet i dette rum endnu."), - "Just a casual question, comment, idea, suggestion…" : MessageLookupByLibrary.simpleMessage("Blot et simpelt spørgsmål, kommentar, ide, forslag..."), - "Late" : MessageLookupByLibrary.simpleMessage("Sen"), - "Launch External Tool" : MessageLookupByLibrary.simpleMessage("Start eksternt værktøj"), - "Legal" : MessageLookupByLibrary.simpleMessage("Juridisk"), - "Light Mode" : MessageLookupByLibrary.simpleMessage("Lys tilstand"), - "Link Error" : MessageLookupByLibrary.simpleMessage("Linkfejl"), - "Locale:" : MessageLookupByLibrary.simpleMessage("Sted:"), - "Locate QR Code" : MessageLookupByLibrary.simpleMessage("Find QR-kode"), - "Location" : MessageLookupByLibrary.simpleMessage("Placering"), - "Locked" : MessageLookupByLibrary.simpleMessage("Låst"), - "Log Out" : MessageLookupByLibrary.simpleMessage("Log ud"), - "Login flow: Canvas" : MessageLookupByLibrary.simpleMessage("Login-flow: Canvas"), - "Login flow: Normal" : MessageLookupByLibrary.simpleMessage("Login-flow: Normalt"), - "Login flow: Site Admin" : MessageLookupByLibrary.simpleMessage("Login-flow: Websideadministrator"), - "Login flow: Skip mobile verify" : MessageLookupByLibrary.simpleMessage("Login-flow: Spring mobil bekræftelse over"), - "Manage Students" : MessageLookupByLibrary.simpleMessage("Administrer elever"), - "Message" : MessageLookupByLibrary.simpleMessage("Besked"), - "Message subject" : MessageLookupByLibrary.simpleMessage("Beskedens emne"), - "Missing" : MessageLookupByLibrary.simpleMessage("Mangler"), - "Must be below 100" : MessageLookupByLibrary.simpleMessage("Skal være under 100"), - "Network error" : MessageLookupByLibrary.simpleMessage("Netværksfejl"), - "Never" : MessageLookupByLibrary.simpleMessage("Aldrig"), - "New message" : MessageLookupByLibrary.simpleMessage("Ny besked"), - "No" : MessageLookupByLibrary.simpleMessage("Nej"), - "No Alerts" : MessageLookupByLibrary.simpleMessage("Ingen varslinger"), - "No Assignments" : MessageLookupByLibrary.simpleMessage("Ingen opgaver"), - "No Courses" : MessageLookupByLibrary.simpleMessage("Ingen fag"), - "No Due Date" : MessageLookupByLibrary.simpleMessage("Ingen afleveringsdato"), - "No Events Today!" : MessageLookupByLibrary.simpleMessage("Ingen begivenheder i dag!"), - "No Grade" : MessageLookupByLibrary.simpleMessage("Ingen vurdering"), - "No Location Specified" : MessageLookupByLibrary.simpleMessage("Ingen lokation specificeret"), - "No Students" : MessageLookupByLibrary.simpleMessage("Ingen elever"), - "No Subject" : MessageLookupByLibrary.simpleMessage("Intet emne"), - "No Summary" : MessageLookupByLibrary.simpleMessage("Intet sammendrag"), - "No description" : MessageLookupByLibrary.simpleMessage("Ingen beskrivelse"), - "No recipients selected" : MessageLookupByLibrary.simpleMessage("Ingen modtagere valgt"), - "Not Graded" : MessageLookupByLibrary.simpleMessage("Ikke bedømt"), - "Not Submitted" : MessageLookupByLibrary.simpleMessage("Ikke indsendt"), - "Not a parent?" : MessageLookupByLibrary.simpleMessage("Ikke forælder?"), - "Notifications for reminders about assignments and calendar events" : MessageLookupByLibrary.simpleMessage("Meddelelser for påmindelser om opgaver og kalenderbegivenheder"), - "OS Version" : MessageLookupByLibrary.simpleMessage("OS-version"), - "Observer" : MessageLookupByLibrary.simpleMessage("Observatør"), - "One of our other apps might be a better fit. Tap one to visit the Play Store." : MessageLookupByLibrary.simpleMessage("En af vores andre apps kan være bedre egnet. Tryk på et for at besøge Play Store."), - "Open Canvas Student" : MessageLookupByLibrary.simpleMessage("Åbn Canvas-appen for elev"), - "Open In Browser" : MessageLookupByLibrary.simpleMessage("Åbn i browser"), - "Open with another app" : MessageLookupByLibrary.simpleMessage("Åbn med en anden app"), - "Pairing Code" : MessageLookupByLibrary.simpleMessage("Parringskode"), - "Password" : MessageLookupByLibrary.simpleMessage("Adgangskode"), - "Password is required" : MessageLookupByLibrary.simpleMessage("Adgangskode er påkrævet"), - "Password must contain at least 8 characters" : MessageLookupByLibrary.simpleMessage("Adgangskode skal indeholde mindst 8 tegn"), - "Password…" : MessageLookupByLibrary.simpleMessage("Adgangskode ..."), - "Planner Note" : MessageLookupByLibrary.simpleMessage("Planlægger - bemærkning"), - "Please enter a valid email address" : MessageLookupByLibrary.simpleMessage("Indtast gyldig e-mailadresse"), - "Please enter an email address" : MessageLookupByLibrary.simpleMessage("Indtast en e-mailadresse"), - "Please enter full name" : MessageLookupByLibrary.simpleMessage("Indtast det fulde navn"), - "Please scan a QR code generated by Canvas" : MessageLookupByLibrary.simpleMessage("Scan en QR-kode genereret af Canvas"), - "Plum, Purple" : MessageLookupByLibrary.simpleMessage("Blomme, lilla"), - "Preparing…" : MessageLookupByLibrary.simpleMessage("Forbereder ..."), - "Previous Logins" : MessageLookupByLibrary.simpleMessage("Tidligere logins"), - "Privacy Policy" : MessageLookupByLibrary.simpleMessage("Datapolitik"), - "Privacy Policy Link" : MessageLookupByLibrary.simpleMessage("Link til Datapolitik"), - "Privacy policy, terms of use, open source" : MessageLookupByLibrary.simpleMessage("Fortrolighedspolitik, betingelser for brug, open source"), - "QR Code" : MessageLookupByLibrary.simpleMessage("QR-kode"), - "QR scanning requires camera access" : MessageLookupByLibrary.simpleMessage("QR-scanning kræver kameraadgang"), - "Raspberry, Red" : MessageLookupByLibrary.simpleMessage("Hindbær, rød"), - "Recipients" : MessageLookupByLibrary.simpleMessage("Modtagere"), - "Refresh" : MessageLookupByLibrary.simpleMessage("Opdater"), - "Remind Me" : MessageLookupByLibrary.simpleMessage("Påmind mig"), - "Reminders" : MessageLookupByLibrary.simpleMessage("Påmindelser"), - "Reminders have changed!" : MessageLookupByLibrary.simpleMessage("Påmindelser er blevet ændret!"), - "Reply" : MessageLookupByLibrary.simpleMessage("Svar"), - "Reply All" : MessageLookupByLibrary.simpleMessage("Svar til alle"), - "Report A Problem" : MessageLookupByLibrary.simpleMessage("Rapporter et problem"), - "Request Login Help" : MessageLookupByLibrary.simpleMessage("Anmod om hjælp til login"), - "Request Login Help Button" : MessageLookupByLibrary.simpleMessage("Knap til anmodning om hjælp til login"), - "Restart app" : MessageLookupByLibrary.simpleMessage("Genstart app"), - "Retry" : MessageLookupByLibrary.simpleMessage("Prøv igen"), - "Return to Login" : MessageLookupByLibrary.simpleMessage("Retur til login"), - "STUDENT" : MessageLookupByLibrary.simpleMessage("ELEV"), - "Screenshot showing location of QR code generation in browser" : MessageLookupByLibrary.simpleMessage("Skærmbillede, der viser placeringen af QR-kodegenerering i browseren"), - "Screenshot showing location of pairing QR code generation in the Canvas Student app" : MessageLookupByLibrary.simpleMessage("Skærmbillede, der viser placering af QR-koden i Åbn Canvas-appen for elev"), - "Select" : MessageLookupByLibrary.simpleMessage("Vælg"), - "Select Student Color" : MessageLookupByLibrary.simpleMessage("Vælg denne elev farve"), - "Select recipients" : MessageLookupByLibrary.simpleMessage("Vælg modtagere"), - "Send Feedback" : MessageLookupByLibrary.simpleMessage("Send feedback"), - "Send a message about this assignment" : MessageLookupByLibrary.simpleMessage("Send en besked om denne opgave"), - "Send a message about this course" : MessageLookupByLibrary.simpleMessage("Send en besked om dette fag"), - "Send message" : MessageLookupByLibrary.simpleMessage("Send besked"), - "Set a date and time to be notified of this event." : MessageLookupByLibrary.simpleMessage("Indstil en dato og tid for, hvornår der skal meddeles om denne begivenhed."), - "Set a date and time to be notified of this specific assignment." : MessageLookupByLibrary.simpleMessage("Indstil en dato og tid for at blive meddelt om denne specifikke opgave."), - "Settings" : MessageLookupByLibrary.simpleMessage("Indstillinger"), - "Shamrock, Green" : MessageLookupByLibrary.simpleMessage("Firkløver, grøn"), - "Share Your Love for the App" : MessageLookupByLibrary.simpleMessage("Del din kærlighed for denne app"), - "Show Password" : MessageLookupByLibrary.simpleMessage("Vis adgangskode"), - "Sign In" : MessageLookupByLibrary.simpleMessage("Log på"), - "Something went wrong trying to create your account, please reach out to your school for assistance." : MessageLookupByLibrary.simpleMessage("Noget gik galt ved oprettelse af din konto. Kontakt din skole for at få hjælp."), - "Something\'s broken but I can work around it to get what I need done." : MessageLookupByLibrary.simpleMessage("Der er noget, der ikke virker, men jeg kan godt få det gjort, jeg skal gøre."), - "Stop Acting as User" : MessageLookupByLibrary.simpleMessage("Hold op med at fungere som bruger"), - "Student" : MessageLookupByLibrary.simpleMessage("Elev"), - "Student Pairing" : MessageLookupByLibrary.simpleMessage("Parring af konti for elever"), - "Students can create a QR code using the Canvas Student app on their mobile device" : MessageLookupByLibrary.simpleMessage("Elever kan oprette en QR-kode ved hjælp af Canvas-appen for elev på deres mobilenhed"), - "Students can obtain a pairing code through the Canvas website" : MessageLookupByLibrary.simpleMessage("Elever kan få en parringskode via Canvas-webstedet"), - "Subject" : MessageLookupByLibrary.simpleMessage("Emne"), - "Submitted" : MessageLookupByLibrary.simpleMessage("Afleveret"), - "Successfully submitted!" : MessageLookupByLibrary.simpleMessage("Blev indsendt!"), - "Summary" : MessageLookupByLibrary.simpleMessage("Sammendrag"), - "Switch Users" : MessageLookupByLibrary.simpleMessage("Skift brugere"), - "Syllabus" : MessageLookupByLibrary.simpleMessage("Fagplan"), - "TA" : MessageLookupByLibrary.simpleMessage("Undervisningsassistent"), - "TEACHER" : MessageLookupByLibrary.simpleMessage("LÆRER"), - "Tap to favorite the courses you want to see on the Calendar. Select up to 10." : MessageLookupByLibrary.simpleMessage("Tryk for at få vist dine favoritfag i kalenderen. Vælg op til 10."), - "Tap to pair with a new student" : MessageLookupByLibrary.simpleMessage("Tryk for at parre med en ny elev"), - "Tap to select this student" : MessageLookupByLibrary.simpleMessage("Tryk for at vælge denne elev"), - "Tap to show student selector" : MessageLookupByLibrary.simpleMessage("Tryk for at vise elevvælger"), - "Teacher" : MessageLookupByLibrary.simpleMessage("Lærer"), - "Tell us about your favorite parts of the app" : MessageLookupByLibrary.simpleMessage("Fortæl os om, hvad du bedst kan lide af denne app"), - "Terms of Service" : MessageLookupByLibrary.simpleMessage("Betingelser for service"), - "Terms of Service Link" : MessageLookupByLibrary.simpleMessage("Link til Betingelser for service"), - "Terms of Use" : MessageLookupByLibrary.simpleMessage("Betingelser for brug"), - "The QR code you scanned may have expired. Refresh the code on the student\'s device and try again." : MessageLookupByLibrary.simpleMessage("Den QR-kode, du scannede, kan være udløbet. Opdater koden på elevens enhed, og prøv igen."), - "The following information will help us better understand your idea:" : MessageLookupByLibrary.simpleMessage("Følgende oplysninger hjælper os med bedre at forstå din idé:"), - "The server you entered is not authorized for this app." : MessageLookupByLibrary.simpleMessage("Den server, du indtastede, er ikke autoriseret til denne app."), - "The student you are trying to add belongs to a different school. Log in or create an account with that school to scan this code." : MessageLookupByLibrary.simpleMessage("Den elev, du prøver at tilføje, tilhører en anden skole. Log ind eller opret en konto med denne skole for at scanne denne kode."), - "The user agent for this app is not authorized." : MessageLookupByLibrary.simpleMessage("Brugeragenten for denne app er ikke autoriseret."), - "Theme" : MessageLookupByLibrary.simpleMessage("Tema"), - "There are no installed applications that can open this file" : MessageLookupByLibrary.simpleMessage("Der er ingen installerede applikationer, der kan åbne denne fil"), - "There is no page information available." : MessageLookupByLibrary.simpleMessage("Der er ingen tilgængelige sideinformationer."), - "There was a problem loading the Terms of Use" : MessageLookupByLibrary.simpleMessage("Der opstod et problem ved indlæsning af Betingelser for brug"), - "There was a problem removing this student from your account. Please check your connection and try again." : MessageLookupByLibrary.simpleMessage("Der opstod et problem under forsøg på at fjerne denne elev fra din konto. Kontrollér forbindelsen, og prøv igen."), - "There was an error loading recipients for this course" : MessageLookupByLibrary.simpleMessage("Der opstod en fejl under indlæsning af modtagere for dette fag"), - "There was an error loading the summary details for this course." : MessageLookupByLibrary.simpleMessage("Der opstod en fejl ved indlæsning af sammendragsoplysningerne for dette fag."), - "There was an error loading this announcement" : MessageLookupByLibrary.simpleMessage("Der opstod en fejl under indlæsning af denne besked"), - "There was an error loading this conversation" : MessageLookupByLibrary.simpleMessage("Der opstod en fejl under indlæsning af denne diskussion"), - "There was an error loading this file" : MessageLookupByLibrary.simpleMessage("Der opstod en fejl ved indlæsning af denne fil"), - "There was an error loading your inbox messages." : MessageLookupByLibrary.simpleMessage("Der opstod en fejl under indlæsning af beskederne i indbakken."), - "There was an error loading your student\'s alerts." : MessageLookupByLibrary.simpleMessage("Der opstod en fejl under indlæsning af elevens varslinger."), - "There was an error loading your student\'s calendar" : MessageLookupByLibrary.simpleMessage("Der opstod en fejl under indlæsning af elevens kalender"), - "There was an error loading your students." : MessageLookupByLibrary.simpleMessage("Der opstod en fejl under indlæsning af eleverne."), - "There was an error loading your student’s courses." : MessageLookupByLibrary.simpleMessage("Der opstod en fejl under indlæsning af elevens fag."), - "There was an error logging in. Please generate another QR Code and try again." : MessageLookupByLibrary.simpleMessage("Der opstod en fejl ved indlogning. Generer en QR-kode til, og prøv igen."), - "There was an error trying to act as this user. Please check the Domain and User ID and try again." : MessageLookupByLibrary.simpleMessage("Der opstod en fejl ved at fungere som denne bruger. Kontroller domænet og bruger-ID\'et, og prøv igen."), - "There’s nothing to be notified of yet." : MessageLookupByLibrary.simpleMessage("Der er intet at blive underrettet om endnu."), - "This app is not authorized for use." : MessageLookupByLibrary.simpleMessage("Denne app er ikke autoriseret for brug."), - "This course does not have any assignments or calendar events yet." : MessageLookupByLibrary.simpleMessage("Dette fag har endnu ingen opgaver eller kalenderbegivenheder."), - "This file is unsupported and can’t be viewed through the app" : MessageLookupByLibrary.simpleMessage("Denne fil understøttes ikke og kan ikke vises i appen"), - "This will unpair and remove all enrollments for this student from your account." : MessageLookupByLibrary.simpleMessage("Dette vil fjerne parring og alle tilmeldinger for denne elev fra din konto."), - "Total Grade" : MessageLookupByLibrary.simpleMessage("Vurdering i alt"), - "Uh oh!" : MessageLookupByLibrary.simpleMessage("Åh nej!"), - "Unable to fetch courses. Please check your connection and try again." : MessageLookupByLibrary.simpleMessage("Kan ikke hente fag. Kontrollér forbindelsen, og prøv igen."), - "Unable to load this image" : MessageLookupByLibrary.simpleMessage("Kan ikke indlæse dette billede"), - "Unable to play this media file" : MessageLookupByLibrary.simpleMessage("Denne mediefil kunne ikke afspilles"), - "Unable to send message. Check your connection and try again." : MessageLookupByLibrary.simpleMessage("Kan ikke sende besked. Kontrollér forbindelsen, og prøv igen."), - "Under Construction" : MessageLookupByLibrary.simpleMessage("Under opbygning"), - "Unknown User" : MessageLookupByLibrary.simpleMessage("Ukendt bruger"), - "Unsaved changes" : MessageLookupByLibrary.simpleMessage("Ugemte ændringer"), - "Unsupported File" : MessageLookupByLibrary.simpleMessage("Ikke-understøttet fil"), - "Upload File" : MessageLookupByLibrary.simpleMessage("Overfør fil"), - "Use Camera" : MessageLookupByLibrary.simpleMessage("Brug kamera"), - "Use Dark Theme in Web Content" : MessageLookupByLibrary.simpleMessage("Brug mørkt tema i webindhold"), - "User ID" : MessageLookupByLibrary.simpleMessage("Bruger-id"), - "User ID:" : MessageLookupByLibrary.simpleMessage("Bruger ID:"), - "Version Number" : MessageLookupByLibrary.simpleMessage("Versionsnummer"), - "View Description" : MessageLookupByLibrary.simpleMessage("Vis beskrivelse"), - "View error details" : MessageLookupByLibrary.simpleMessage("Vis fejldetaljer"), - "View the Privacy Policy" : MessageLookupByLibrary.simpleMessage("Vis datapolitikken"), - "We are currently building this feature for your viewing pleasure." : MessageLookupByLibrary.simpleMessage("Vi er i øjeblikket ved at bygge denne funktion."), - "We are unable to display this link, it may belong to an institution you currently aren\'t logged in to." : MessageLookupByLibrary.simpleMessage("Vi kan ikke vise dette link, måske hører det til en institution, som du i øjeblikket ikke er logget ind på."), - "We couldn\'t find any students associated with this account" : MessageLookupByLibrary.simpleMessage("Vi kunne ikke finde nogen elever tilknyttet den konto."), - "We were unable to verify the server for use with this app." : MessageLookupByLibrary.simpleMessage("Vi kunne ikke bekræfte serveren til brug med denne app."), - "We’re not sure what happened, but it wasn’t good. Contact us if this keeps happening." : MessageLookupByLibrary.simpleMessage("Vi ved ikke helt, hvad der skete, men det var ikke godt. Kontakt os, hvis dette fortsætter."), - "What can we do better?" : MessageLookupByLibrary.simpleMessage("Hvad kan vi gøre bedre?"), - "Yes" : MessageLookupByLibrary.simpleMessage("Ja"), - "You are not observing any students." : MessageLookupByLibrary.simpleMessage("Du observerer ikke nogen elever."), - "You may only choose 10 calendars to display" : MessageLookupByLibrary.simpleMessage("Du kan kun vælge at vise 10 kalendere"), - "You must enter a user id" : MessageLookupByLibrary.simpleMessage("Du skal indtaste et bruger-ID"), - "You must enter a valid domain" : MessageLookupByLibrary.simpleMessage("Du skal indtaste et gyldigt domæne"), - "You must select at least one calendar to display" : MessageLookupByLibrary.simpleMessage("Du skal vælge mindst en kalender at vise"), - "You will be notified about this assignment on…" : MessageLookupByLibrary.simpleMessage("Du får besked om denne opgave den …"), - "You will be notified about this event on…" : MessageLookupByLibrary.simpleMessage("Du får besked om denne begivenhed den ..."), - "You\'ll find the QR code on the web in your account profile. Click \'QR for Mobile Login\' in the list." : MessageLookupByLibrary.simpleMessage("Du finder QR-koden på nettet i din kontoprofil. Klik på \'QR for mobil login\' på listen."), - "You\'ll need to open your student\'s Canvas Student app to continue. Go into Main Menu > Settings > Pair with Observer and scan the QR code you see there." : MessageLookupByLibrary.simpleMessage("Du skal åbne elevens Åbn Canvas-appen for elev for at fortsætte. Gå til Hovedmenu > Indstillinger> Par med observatør, og scan den QR-kode, du ser der."), - "Your code is incorrect or expired." : MessageLookupByLibrary.simpleMessage("Din kode er forkert eller udløbet."), - "Your student’s courses might not be published yet." : MessageLookupByLibrary.simpleMessage("Din elevs fag kan muligvis ikke offentliggøres endnu."), - "You’re all caught up!" : MessageLookupByLibrary.simpleMessage("Du har set det hele!"), - "actingAsUser" : m0, - "alertsLabel" : MessageLookupByLibrary.simpleMessage("Varslinger"), - "appVersion" : m1, - "assignmentGradeAboveThreshold" : m2, - "assignmentGradeBelowThreshold" : m3, - "assignmentLockedModule" : m4, - "assignmentSubjectMessage" : m5, - "assignmentTotalPoints" : m6, - "assignmentTotalPointsAccessible" : m7, - "authorToNOthers" : m8, - "authorToRecipient" : m9, - "authorToRecipientAndNOthers" : m10, - "badgeNumberPlus" : m11, - "calendarLabel" : MessageLookupByLibrary.simpleMessage("Kalender"), - "canvasGuides" : MessageLookupByLibrary.simpleMessage("Canvas-vejledningerne"), - "canvasLogoLabel" : MessageLookupByLibrary.simpleMessage("Canvas-logo"), - "canvasSupport" : MessageLookupByLibrary.simpleMessage("Canvas-support"), - "changeStudentColorLabel" : m12, - "collapse" : MessageLookupByLibrary.simpleMessage("skjul"), - "collapsed" : MessageLookupByLibrary.simpleMessage("skjult"), - "contentDescriptionScoreOutOfPointsPossible" : m13, - "courseForWhom" : m14, - "courseGradeAboveThreshold" : m15, - "courseGradeBelowThreshold" : m16, - "coursesLabel" : MessageLookupByLibrary.simpleMessage("Fag"), - "dateAtTime" : m17, - "dismissAlertLabel" : m18, - "domainSearchHelpBody" : m19, - "domainSearchHelpLabel" : MessageLookupByLibrary.simpleMessage("Hvordan finder jeg min skole eller distrikt?"), - "domainSearchInputHint" : MessageLookupByLibrary.simpleMessage("Indtast skolens navn eller distrikt ..."), - "dueDateAtTime" : m20, - "endMasqueradeLogoutMessage" : m21, - "endMasqueradeMessage" : m22, - "eventSubjectMessage" : m23, - "eventTime" : m24, - "expand" : MessageLookupByLibrary.simpleMessage("udvid"), - "expanded" : MessageLookupByLibrary.simpleMessage("udvidet"), - "finalGrade" : m25, - "findSchool" : MessageLookupByLibrary.simpleMessage("Find skole"), - "frontPageSubjectMessage" : m26, - "gradeFormatScoreOutOfPointsPossible" : m27, - "gradesSubjectMessage" : m28, - "latePenalty" : m29, - "me" : MessageLookupByLibrary.simpleMessage("mig"), - "messageLinkPostscript" : m30, - "minus" : MessageLookupByLibrary.simpleMessage("minus"), - "mustBeAboveN" : m31, - "mustBeBelowN" : m32, - "next" : MessageLookupByLibrary.simpleMessage("Næste"), - "nextMonth" : m33, - "nextWeek" : m34, - "noDomainResults" : m35, - "ok" : MessageLookupByLibrary.simpleMessage("OK"), - "outOfPoints" : m36, - "plusRecipientCount" : m37, - "pointsPossible" : m38, - "previousMonth" : m39, - "previousWeek" : m40, - "qrCreateAccountTos" : m41, - "ratingDialogEmailSubject" : m42, - "selectedMonthLabel" : m43, - "send" : MessageLookupByLibrary.simpleMessage("send"), - "starRating" : m44, - "submissionStatusSuccessSubtitle" : m45, - "syllabusSubjectMessage" : m46, - "unread" : MessageLookupByLibrary.simpleMessage("ulæst"), - "unreadCount" : m47 - }; -} diff --git a/apps/flutter_parent/lib/l10n/generated/messages_de.dart b/apps/flutter_parent/lib/l10n/generated/messages_de.dart deleted file mode 100644 index 1252428dac..0000000000 --- a/apps/flutter_parent/lib/l10n/generated/messages_de.dart +++ /dev/null @@ -1,473 +0,0 @@ -// DO NOT EDIT. This is code generated via package:intl/generate_localized.dart -// This is a library that provides messages for a de locale. All the -// messages from the main program should be duplicated here with the same -// function name. - -// Ignore issues from commonly used lints in this file. -// ignore_for_file:unnecessary_brace_in_string_interps, unnecessary_new -// ignore_for_file:prefer_single_quotes,comment_references, directives_ordering -// ignore_for_file:annotate_overrides,prefer_generic_function_type_aliases -// ignore_for_file:unused_import, file_names - -import 'package:intl/intl.dart'; -import 'package:intl/message_lookup_by_library.dart'; - -final messages = new MessageLookup(); - -typedef String MessageIfAbsent(String messageStr, List args); - -class MessageLookup extends MessageLookupByLibrary { - String get localeName => 'de'; - - static m0(userName) => "Sie handeln als ${userName}."; - - static m1(version) => "v. ${version}"; - - static m2(threshold) => "Aufgabennote über ${threshold}"; - - static m3(threshold) => "Aufgabennote unter ${threshold}"; - - static m4(moduleName) => "Diese Aufgabe wird durch das Modul „${moduleName}“ gesperrt."; - - static m5(studentName, assignmentName) => "Betreffend: ${studentName}, Aufgabe – ${assignmentName}"; - - static m6(points) => "${points} Pkte."; - - static m7(points) => "${points} Punkte"; - - static m8(authorName, howMany) => "${Intl.plural(howMany, one: '${authorName} zu 1 anderen', other: '${authorName} zu ${howMany} anderen')}"; - - static m9(authorName, recipientName) => "${authorName} bis ${recipientName}"; - - static m10(authorName, recipientName, howMany) => "${Intl.plural(howMany, one: '${authorName} zu ${recipientName} & 1 anderen', other: '${authorName} zu ${recipientName} & ${howMany} anderen')}"; - - static m11(count) => "${count}+"; - - static m12(studentName) => "Farbe ändern für ${studentName}"; - - static m13(score, pointsPossible) => "${score} von ${pointsPossible} Punkten"; - - static m14(studentShortName) => "für ${studentShortName}"; - - static m15(threshold) => "Kursnote über ${threshold}"; - - static m16(threshold) => "Kursnote unter ${threshold}"; - - static m17(date, time) => "Am ${date} um ${time}"; - - static m18(alertTitle) => "${alertTitle} verwerfen"; - - static m19(canvasGuides, canvasSupport) => "Suchen Sie den Namen der Schule oder des Bezirks, z. B. „Private Kant-Schule“ oder „Goethe-Gymnasium“. Sie können auch direkt eine Canvas-Domäne eingeben, z. B. „kant.instructure.com“.\n\nUm weitere Informationen zum Auffinden des Canvas-Kontos Ihrer Institution zu erhalten, nutzen Sie die ${canvasGuides}, wenden Sie sich an den ${canvasSupport} oder an Ihre Schule."; - - static m20(date, time) => "Fällig am ${date} um ${time}"; - - static m21(userName) => "Sie hören auf, zu handeln als ${userName} und werden abgemeldet."; - - static m22(userName) => "Sie hören auf, zu handeln als ${userName} und kehren zu Ihrem ursprünglichen Konto zurück."; - - static m23(studentName, eventTitle) => "Betreffend: ${studentName}, Ereignis – ${eventTitle}"; - - static m24(startAt, endAt) => "${startAt} - ${endAt}"; - - static m25(grade) => "Gesamtnote: ${grade}"; - - static m26(studentName) => "Betreffend: ${studentName}, Frontseite"; - - static m27(score, pointsPossible) => "${score} / ${pointsPossible}"; - - static m28(studentName) => "Betreffend: ${studentName}, Noten"; - - static m29(pointsLost) => "Strafe für Verspätung (-${pointsLost})"; - - static m30(studentName, linkUrl) => "Betreffend: ${studentName}, ${linkUrl}"; - - static m31(percentage) => "Muss über ${percentage} liegen"; - - static m32(percentage) => "Muss unter ${percentage} liegen"; - - static m33(month) => "Nächster Monat: ${month}"; - - static m34(date) => "Nächste Woche, beginnend am ${date}"; - - static m35(query) => "Es konnte keine mit „${query}“ übereinstimmende Schule gefunden werden"; - - static m36(points, howMany) => "${Intl.plural(howMany, one: 'von 1 Punkt', other: 'von ${points} Punkten')}"; - - static m37(count) => "+${count}"; - - static m38(points) => "${points} Punkte möglich"; - - static m39(month) => "Vorheriger Monat: ${month}"; - - static m40(date) => "Vorherige Woche, beginnend am ${date}"; - - static m41(termsOfService, privacyPolicy) => "Durch Tippen auf „Konto erstellen“ erklären Sie sich mit den ${termsOfService} und den ${privacyPolicy} einverstanden."; - - static m42(version) => "Vorschläge für Android - Canvas Parent ${version}"; - - static m43(month) => "Monat ${month}"; - - static m44(position) => "${Intl.plural(position, one: '${position} Stern', other: '${position} Sterne')}"; - - static m45(date, time) => "Diese Aufgabe wurde am ${date} um ${time} abgegeben und wartet auf die Benotung"; - - static m46(studentName) => "Betreffend: ${studentName}, Kursplan"; - - static m47(count) => "${count} ungelesen"; - - final messages = _notInlinedMessages(_notInlinedMessages); - static _notInlinedMessages(_) => { - "\"Act as\" is essentially logging in as this user without a password. You will be able to take any action as if you were this user, and from other users\' points of views, it will be as if this user performed them. However, audit logs record that you were the one who performed the actions on behalf of this user." : MessageLookupByLibrary.simpleMessage("„Handeln als“ heißt im Grunde sich als dieser Benutzer ohne Kennwort die anzumelden. Sie können beliebige Maßnahmen ergreifen, als wären Sie dieser Benutzer, und aus der Sicht anderer Benutzer wird es sein, als ob sie dieser Benutzer ausführt. Die Audit-Protokolle zeichnen auf, dass Sie die Aktionen im Namen des Benutzers durchgeführt haben."), - "-" : MessageLookupByLibrary.simpleMessage("-"), - "A description is required." : MessageLookupByLibrary.simpleMessage("Eine Beschreibung ist erforderlich."), - "A network error occurred when adding this student. Check your connection and try again." : MessageLookupByLibrary.simpleMessage("Beim Hinzufügen dieses Studenten ist ein Netzwerkfehler aufgetreten. Überprüfen Sie Ihre Verbindung, und versuchen Sie es erneut."), - "A subject is required." : MessageLookupByLibrary.simpleMessage("Ein Betreff ist erforderlich."), - "Act As User" : MessageLookupByLibrary.simpleMessage("Handeln als Benutzer"), - "Add Student" : MessageLookupByLibrary.simpleMessage("Teilnehmer hinzufügen"), - "Add attachment" : MessageLookupByLibrary.simpleMessage("Anhang hinzufügen"), - "Add new student" : MessageLookupByLibrary.simpleMessage("Neuen Studenten hinzufügen"), - "Add student with…" : MessageLookupByLibrary.simpleMessage("Teilnehmer hinzufügen mit ..."), - "Alert Settings" : MessageLookupByLibrary.simpleMessage("Alarmeinstellungen"), - "Alert me when…" : MessageLookupByLibrary.simpleMessage("Mich warnen, wenn …"), - "All Grading Periods" : MessageLookupByLibrary.simpleMessage("Alle Benotungszeiträume"), - "Already have an account? " : MessageLookupByLibrary.simpleMessage("Sie haben bereits ein Konto? "), - "An email address is required." : MessageLookupByLibrary.simpleMessage("Eine E-Mail-Adresse ist erforderlich."), - "An error occurred when trying to display this link" : MessageLookupByLibrary.simpleMessage("Beim Versuch diesen Link anzuzeigen, ist ein Fehler aufgetreten:"), - "An error occurred while saving your selection. Please try again." : MessageLookupByLibrary.simpleMessage("Fehler beim Speichern Ihrer Auswahl. Bitte versuchen Sie es noch einmal."), - "An unexpected error occurred" : MessageLookupByLibrary.simpleMessage("Es ist ein unerwarteter Fehler aufgetreten"), - "Android OS version" : MessageLookupByLibrary.simpleMessage("Android OS-Version"), - "Appearance" : MessageLookupByLibrary.simpleMessage("Aussehen"), - "Application version" : MessageLookupByLibrary.simpleMessage("Anwendungsversion"), - "Are you a student or teacher?" : MessageLookupByLibrary.simpleMessage("Sie sind Student oder Lehrer?"), - "Are you sure you want to log out?" : MessageLookupByLibrary.simpleMessage("Möchten Sie sich wirklich abmelden?"), - "Are you sure you wish to close this page? Your unsent message will be lost." : MessageLookupByLibrary.simpleMessage("Möchten Sie diese Seite wirklich schließen? Die nicht gesendete Nachricht geht verloren."), - "Assignment Details" : MessageLookupByLibrary.simpleMessage("Aufgabendetails"), - "Assignment grade above" : MessageLookupByLibrary.simpleMessage("Aufgabennote über"), - "Assignment grade below" : MessageLookupByLibrary.simpleMessage("Aufgabennote unter"), - "Assignment missing" : MessageLookupByLibrary.simpleMessage("Aufgabe fehlt"), - "Barney, Fuschia" : MessageLookupByLibrary.simpleMessage("Fuchsienrot"), - "Calendars" : MessageLookupByLibrary.simpleMessage("Kalender"), - "Camera Permission" : MessageLookupByLibrary.simpleMessage("Kameraberechtigung"), - "Cancel" : MessageLookupByLibrary.simpleMessage("Abbrechen"), - "Canvas Student" : MessageLookupByLibrary.simpleMessage("Canvas-Student"), - "Canvas Teacher" : MessageLookupByLibrary.simpleMessage("Canvas-Lehrer"), - "Canvas on GitHub" : MessageLookupByLibrary.simpleMessage("Canvas bei GitHub"), - "Choose a course to message" : MessageLookupByLibrary.simpleMessage("Einen Kurs zur Benachrichtigung wählen"), - "Choose from Gallery" : MessageLookupByLibrary.simpleMessage("Aus Galerie auswählen"), - "Complete" : MessageLookupByLibrary.simpleMessage("Fertigstellen"), - "Contact Support" : MessageLookupByLibrary.simpleMessage("Den Support kontaktieren"), - "Course Announcement" : MessageLookupByLibrary.simpleMessage("Kursankündigung"), - "Course Announcements" : MessageLookupByLibrary.simpleMessage("Kursankündigungen"), - "Course grade above" : MessageLookupByLibrary.simpleMessage("Kursnote über"), - "Course grade below" : MessageLookupByLibrary.simpleMessage("Kursnote unter"), - "Create Account" : MessageLookupByLibrary.simpleMessage("Konto erstellen"), - "Dark Mode" : MessageLookupByLibrary.simpleMessage("Dunkel-Modus"), - "Date" : MessageLookupByLibrary.simpleMessage("Datum"), - "Delete" : MessageLookupByLibrary.simpleMessage("Löschen"), - "Description" : MessageLookupByLibrary.simpleMessage("Beschreibung"), - "Device" : MessageLookupByLibrary.simpleMessage("Gerät"), - "Device model" : MessageLookupByLibrary.simpleMessage("Gerätemodell"), - "Domain" : MessageLookupByLibrary.simpleMessage("Domäne"), - "Domain:" : MessageLookupByLibrary.simpleMessage("Domäne:"), - "Don\'t show again" : MessageLookupByLibrary.simpleMessage("Nicht nochmal zeigen"), - "Done" : MessageLookupByLibrary.simpleMessage("Fertig"), - "Download" : MessageLookupByLibrary.simpleMessage("Herunterladen"), - "Due" : MessageLookupByLibrary.simpleMessage("Fällig"), - "EXTREME CRITICAL EMERGENCY!!" : MessageLookupByLibrary.simpleMessage("ÄUSSERST KRITISCHER NOTFALL!"), - "Electric, blue" : MessageLookupByLibrary.simpleMessage("Elektrisch, blau"), - "Email Address" : MessageLookupByLibrary.simpleMessage("E-Mail-Adresse"), - "Email:" : MessageLookupByLibrary.simpleMessage("E-Mail:"), - "Email…" : MessageLookupByLibrary.simpleMessage("E-Mail ..."), - "Enter the student pairing code provided to you. If the pairing code doesn\'t work, it may have expired" : MessageLookupByLibrary.simpleMessage("Geben Sie den Studenten-Pairing-Code ein, den Sie erhalten haben. Falls der Pairing-Code nicht funktioniert, ist er möglicherweise abgelaufen"), - "Event" : MessageLookupByLibrary.simpleMessage("Ereignis"), - "Excused" : MessageLookupByLibrary.simpleMessage("Entschuldigt"), - "Expired QR Code" : MessageLookupByLibrary.simpleMessage("Abgelaufener QR-Code"), - "Failed. Tap for options." : MessageLookupByLibrary.simpleMessage("Fehlgeschlagen. Für Optionen antippen."), - "Filter" : MessageLookupByLibrary.simpleMessage("Filter"), - "Filter by" : MessageLookupByLibrary.simpleMessage("Filtern nach"), - "Fire, Orange" : MessageLookupByLibrary.simpleMessage("Feuerrot, orange"), - "Front Page" : MessageLookupByLibrary.simpleMessage("Frontseite"), - "Full Name" : MessageLookupByLibrary.simpleMessage("Vollständiger Name"), - "Full Name…" : MessageLookupByLibrary.simpleMessage("Vollständiger Name ..."), - "Full error message" : MessageLookupByLibrary.simpleMessage("Vollständige Fehlermeldung"), - "Go to today" : MessageLookupByLibrary.simpleMessage("Zu „heute“ gehen"), - "Grade" : MessageLookupByLibrary.simpleMessage("Note"), - "Grade percentage" : MessageLookupByLibrary.simpleMessage("Noten-Prozentsatz"), - "Graded" : MessageLookupByLibrary.simpleMessage("Benotet"), - "Grades" : MessageLookupByLibrary.simpleMessage("Noten"), - "Help" : MessageLookupByLibrary.simpleMessage("Hilfe"), - "Hide Password" : MessageLookupByLibrary.simpleMessage("Kennwort ausblenden"), - "High Contrast Mode" : MessageLookupByLibrary.simpleMessage("Hochkontrastmodus"), - "How are we doing?" : MessageLookupByLibrary.simpleMessage("Wie sieht\'s aus?"), - "How is this affecting you?" : MessageLookupByLibrary.simpleMessage("Welche Auswirkung hat dies auf Sie?"), - "I can\'t get things done until I hear back from you." : MessageLookupByLibrary.simpleMessage("Ich kann nicht weitermachen, bevor ich keine Antwort von euch habe."), - "I don\'t have a Canvas account" : MessageLookupByLibrary.simpleMessage("Ich besitze kein Canvas-Konto"), - "I have a Canvas account" : MessageLookupByLibrary.simpleMessage("Ich besitze ein Canvas-Konto"), - "I need some help but it\'s not urgent." : MessageLookupByLibrary.simpleMessage("Ich brauche Hilfe, aber es eilt nicht."), - "I\'m having trouble logging in" : MessageLookupByLibrary.simpleMessage("Ich habe Probleme bei der Anmeldung"), - "Idea for Canvas Parent App [Android]" : MessageLookupByLibrary.simpleMessage("Idee für Canvas-Parent-App [Android]"), - "In order to provide you with a better experience, we have updated how reminders work. You can add new reminders by viewing an assignment or calendar event and tapping the switch under the \"Remind Me\" section.\n\nBe aware that any reminders created with older versions of this app will not be compatible with the new changes and you will need to create them again." : MessageLookupByLibrary.simpleMessage("Um Ihnen ein besseres Erlebnis zu bieten, haben wir die Funktionsweise von Erinnerungen aktualisiert. Sie können neue Erinnerungen hinzufügen, indem Sie sich eine Aufgabe oder ein Kalenderereignis ansehen und auf den Schalter unter dem Abschnitt „Mich erinnern“ tippen.\n\nBeachten Sie, dass alle Erinnerungen, die mit älteren Versionen dieser App erstellt wurden, nicht mit den neuen Änderungen kompatibel sind und neu erstellt werden müssen."), - "Inbox" : MessageLookupByLibrary.simpleMessage("Posteingang"), - "Inbox Zero" : MessageLookupByLibrary.simpleMessage("Posteingang Zero"), - "Incomplete" : MessageLookupByLibrary.simpleMessage("Unvollständig"), - "Incorrect Domain" : MessageLookupByLibrary.simpleMessage("Falsche Domain"), - "Institution Announcement" : MessageLookupByLibrary.simpleMessage("Institutsankündigung"), - "Institution Announcements" : MessageLookupByLibrary.simpleMessage("Institutsankündigungen"), - "Instructions" : MessageLookupByLibrary.simpleMessage("Anweisungen"), - "Interactions on this page are limited by your institution." : MessageLookupByLibrary.simpleMessage("Interaktionen auf dieser Seite sind durch ihre Institution eingeschränkt."), - "Invalid QR Code" : MessageLookupByLibrary.simpleMessage("Ungültiger QR-Code"), - "It looks like a great day to rest, relax, and recharge." : MessageLookupByLibrary.simpleMessage("Scheinbar ein großartiger Tag für Ruhe, Entspannung und Energie tanken.."), - "It looks like assignments haven\'t been created in this space yet." : MessageLookupByLibrary.simpleMessage("Wie es aussieht, wurden in diesem Raum noch keine Aufgaben erstellt."), - "Just a casual question, comment, idea, suggestion…" : MessageLookupByLibrary.simpleMessage("Nur zwanglos eine Frage, ein Kommentar, eine Idee, ein Vorschlag ..."), - "Late" : MessageLookupByLibrary.simpleMessage("Verspätet"), - "Launch External Tool" : MessageLookupByLibrary.simpleMessage("Externes Tool starten"), - "Legal" : MessageLookupByLibrary.simpleMessage("Rechtliches"), - "Light Mode" : MessageLookupByLibrary.simpleMessage("Heller Modus"), - "Link Error" : MessageLookupByLibrary.simpleMessage("Link-Fehler"), - "Locale:" : MessageLookupByLibrary.simpleMessage("Umgebung:"), - "Locate QR Code" : MessageLookupByLibrary.simpleMessage("QR-Code finden"), - "Location" : MessageLookupByLibrary.simpleMessage("Standort"), - "Locked" : MessageLookupByLibrary.simpleMessage("Gesperrt"), - "Log Out" : MessageLookupByLibrary.simpleMessage("Abmelden"), - "Login flow: Canvas" : MessageLookupByLibrary.simpleMessage("Anmeldung Flow: Canvas"), - "Login flow: Normal" : MessageLookupByLibrary.simpleMessage("Anmeldung Flow: Normal"), - "Login flow: Site Admin" : MessageLookupByLibrary.simpleMessage("Anmeldung Flow: Website-Administrator"), - "Login flow: Skip mobile verify" : MessageLookupByLibrary.simpleMessage("Anmeldung Flow: Mobile Prüfung überspringen"), - "Manage Students" : MessageLookupByLibrary.simpleMessage("Teilnehmer verwalten"), - "Message" : MessageLookupByLibrary.simpleMessage("Nachricht"), - "Message subject" : MessageLookupByLibrary.simpleMessage("Betreff der Nachricht"), - "Missing" : MessageLookupByLibrary.simpleMessage("Fehlt"), - "Must be below 100" : MessageLookupByLibrary.simpleMessage("Muss unter 100 liegen"), - "Network error" : MessageLookupByLibrary.simpleMessage("Netzwerkfehler"), - "Never" : MessageLookupByLibrary.simpleMessage("Nie"), - "New message" : MessageLookupByLibrary.simpleMessage("Neue Nachricht"), - "No" : MessageLookupByLibrary.simpleMessage("Nein"), - "No Alerts" : MessageLookupByLibrary.simpleMessage("Keine Benachrichtigungen"), - "No Assignments" : MessageLookupByLibrary.simpleMessage("Keine Aufgaben"), - "No Courses" : MessageLookupByLibrary.simpleMessage("Keine Kurse"), - "No Due Date" : MessageLookupByLibrary.simpleMessage("Kein Abgabetermin"), - "No Events Today!" : MessageLookupByLibrary.simpleMessage("Heute keine Ereignisse!"), - "No Grade" : MessageLookupByLibrary.simpleMessage("Keine Note"), - "No Location Specified" : MessageLookupByLibrary.simpleMessage("Kein Standort angegeben"), - "No Students" : MessageLookupByLibrary.simpleMessage("Keine Studenten"), - "No Subject" : MessageLookupByLibrary.simpleMessage("Kein Betreff"), - "No Summary" : MessageLookupByLibrary.simpleMessage("Keine Übersicht"), - "No description" : MessageLookupByLibrary.simpleMessage("Keine Beschreibung"), - "No recipients selected" : MessageLookupByLibrary.simpleMessage("Es wurden keine Empfänger ausgewählt"), - "Not Graded" : MessageLookupByLibrary.simpleMessage("Unbenotet"), - "Not Submitted" : MessageLookupByLibrary.simpleMessage("Nicht abgegeben"), - "Not a parent?" : MessageLookupByLibrary.simpleMessage("Kein Elternteil?"), - "Notifications for reminders about assignments and calendar events" : MessageLookupByLibrary.simpleMessage("Benachrichtigungen zu Erinnerungen über Zuweisungen und Kalenderereignisse"), - "OS Version" : MessageLookupByLibrary.simpleMessage("BS-Version"), - "Observer" : MessageLookupByLibrary.simpleMessage("Beobachter"), - "One of our other apps might be a better fit. Tap one to visit the Play Store." : MessageLookupByLibrary.simpleMessage("Eine unserer anderen Apps passt möglicherweise besser. Tippen Sie auf eine, um den Play Store zu besuchen."), - "Open Canvas Student" : MessageLookupByLibrary.simpleMessage("Canvas Student öffnen"), - "Open In Browser" : MessageLookupByLibrary.simpleMessage("Im Browser öffnen"), - "Open with another app" : MessageLookupByLibrary.simpleMessage("Mit einer anderen Anwendung öffnen"), - "Pairing Code" : MessageLookupByLibrary.simpleMessage("Pairing-Code"), - "Password" : MessageLookupByLibrary.simpleMessage("Kennwort"), - "Password is required" : MessageLookupByLibrary.simpleMessage("Passwort ist erforderlich"), - "Password must contain at least 8 characters" : MessageLookupByLibrary.simpleMessage("Das Kennwort muss mindestens 8 Zeichen lang sein."), - "Password…" : MessageLookupByLibrary.simpleMessage("Kennwort ..."), - "Planner Note" : MessageLookupByLibrary.simpleMessage("Planerhinweis"), - "Please enter a valid email address" : MessageLookupByLibrary.simpleMessage("Geben Sie bitte eine gültige E-Mail-Adresse sein."), - "Please enter an email address" : MessageLookupByLibrary.simpleMessage("Bitte geben Sie eine E-Mail-Adresse an."), - "Please enter full name" : MessageLookupByLibrary.simpleMessage("Bitte geben Sie Ihren vollständigen Namen ein."), - "Please scan a QR code generated by Canvas" : MessageLookupByLibrary.simpleMessage("Bitte scannen Sie einen von Canvas generierten QR-Code"), - "Plum, Purple" : MessageLookupByLibrary.simpleMessage("Pflaume, violett"), - "Preparing…" : MessageLookupByLibrary.simpleMessage("Vorbereiten ..."), - "Previous Logins" : MessageLookupByLibrary.simpleMessage("Frühere Anmeldungen"), - "Privacy Policy" : MessageLookupByLibrary.simpleMessage("Datenschutzrichtlinien"), - "Privacy Policy Link" : MessageLookupByLibrary.simpleMessage("Datenschutzrichtlinien (Link)"), - "Privacy policy, terms of use, open source" : MessageLookupByLibrary.simpleMessage("Datenschutz, Nutzungsbedingungen, Open-Source"), - "QR Code" : MessageLookupByLibrary.simpleMessage("QR-Code"), - "QR scanning requires camera access" : MessageLookupByLibrary.simpleMessage("QR-Scan erfordert Zugriff auf die Kamera"), - "Raspberry, Red" : MessageLookupByLibrary.simpleMessage("Himbeerrot"), - "Recipients" : MessageLookupByLibrary.simpleMessage("Empfänger"), - "Refresh" : MessageLookupByLibrary.simpleMessage("Aktualisieren"), - "Remind Me" : MessageLookupByLibrary.simpleMessage("Erinnerung"), - "Reminders" : MessageLookupByLibrary.simpleMessage("Erinnerungen"), - "Reminders have changed!" : MessageLookupByLibrary.simpleMessage("Erinnerungen haben sich geändert!"), - "Reply" : MessageLookupByLibrary.simpleMessage("Antworten"), - "Reply All" : MessageLookupByLibrary.simpleMessage("Allen antworten"), - "Report A Problem" : MessageLookupByLibrary.simpleMessage("Ein Problem melden"), - "Request Login Help" : MessageLookupByLibrary.simpleMessage("Hilfe für Anmeldung erbitten"), - "Request Login Help Button" : MessageLookupByLibrary.simpleMessage("Schaltfläche „Hilfe für Anmeldung erbitten“"), - "Restart app" : MessageLookupByLibrary.simpleMessage("Anwendung neustarten"), - "Retry" : MessageLookupByLibrary.simpleMessage("Erneut versuchen"), - "Return to Login" : MessageLookupByLibrary.simpleMessage("Zurück zur Anmeldung"), - "STUDENT" : MessageLookupByLibrary.simpleMessage("STUDENT"), - "Screenshot showing location of QR code generation in browser" : MessageLookupByLibrary.simpleMessage("Screenshot mit der Position der QR-Code-Generierung im Browser"), - "Screenshot showing location of pairing QR code generation in the Canvas Student app" : MessageLookupByLibrary.simpleMessage("Screenshot des Ortes der Erzeugung des Pairing-QR-Codes in der Canvas Studenten-App"), - "Select" : MessageLookupByLibrary.simpleMessage("Auswählen"), - "Select Student Color" : MessageLookupByLibrary.simpleMessage("Studentenfarbe auswählen"), - "Select recipients" : MessageLookupByLibrary.simpleMessage("Empfänger auswählen"), - "Send Feedback" : MessageLookupByLibrary.simpleMessage("Feedback senden"), - "Send a message about this assignment" : MessageLookupByLibrary.simpleMessage("Nachricht über diese Aufgabe senden"), - "Send a message about this course" : MessageLookupByLibrary.simpleMessage("Nachricht über diesen Kurs senden"), - "Send message" : MessageLookupByLibrary.simpleMessage("Nachricht senden"), - "Set a date and time to be notified of this event." : MessageLookupByLibrary.simpleMessage("Datum und Uhrzeit zur Benachrichtigung über dieses Ereignis einstellen."), - "Set a date and time to be notified of this specific assignment." : MessageLookupByLibrary.simpleMessage("Datum und Uhrzeit für die Benachrichtigung über diese spezifische Aufgabe einstellen."), - "Settings" : MessageLookupByLibrary.simpleMessage("Einstellungen"), - "Shamrock, Green" : MessageLookupByLibrary.simpleMessage("Kleeblatt, grün"), - "Share Your Love for the App" : MessageLookupByLibrary.simpleMessage("Teilen Sie Ihre Liebe für die App anderen mit"), - "Show Password" : MessageLookupByLibrary.simpleMessage("Kennwort anzeigen"), - "Sign In" : MessageLookupByLibrary.simpleMessage("Anmelden"), - "Something went wrong trying to create your account, please reach out to your school for assistance." : MessageLookupByLibrary.simpleMessage("Beim Erstellen Ihres Kontos ging etwas schief. Wenden Sie sich bitte an Ihre Schule."), - "Something\'s broken but I can work around it to get what I need done." : MessageLookupByLibrary.simpleMessage("Irgend etwas ist kaputt. Aber ich kann auch ohne das fertigstellen, was ich noch machen muss."), - "Stop Acting as User" : MessageLookupByLibrary.simpleMessage("Nicht mehr handeln als Benutzer"), - "Student" : MessageLookupByLibrary.simpleMessage("Student"), - "Student Pairing" : MessageLookupByLibrary.simpleMessage("Studenten-Pairing"), - "Students can create a QR code using the Canvas Student app on their mobile device" : MessageLookupByLibrary.simpleMessage("Studenten können einen QR-Code mit der Canvas Studenten-App auf ihrem Mobilgerät erstellen"), - "Students can obtain a pairing code through the Canvas website" : MessageLookupByLibrary.simpleMessage("Studenten können einen Pairing-Code über die Canvas-Website erhalten"), - "Subject" : MessageLookupByLibrary.simpleMessage("Betreff"), - "Submitted" : MessageLookupByLibrary.simpleMessage("Abgegeben"), - "Successfully submitted!" : MessageLookupByLibrary.simpleMessage("Wurde abgegeben!"), - "Summary" : MessageLookupByLibrary.simpleMessage("Übersicht"), - "Switch Users" : MessageLookupByLibrary.simpleMessage("Benutzer wechseln"), - "Syllabus" : MessageLookupByLibrary.simpleMessage("Kursplan"), - "TA" : MessageLookupByLibrary.simpleMessage("Lehrassistent"), - "TEACHER" : MessageLookupByLibrary.simpleMessage("LEHRER"), - "Tap to favorite the courses you want to see on the Calendar. Select up to 10." : MessageLookupByLibrary.simpleMessage("Tippen Sie, um die Kurse, die Sie im Kalender sehen möchten, in die Favoritenliste aufzunehmen. Wählen Sie bis zu 10"), - "Tap to pair with a new student" : MessageLookupByLibrary.simpleMessage("Zum Koppeln mit einem neuen Studenten antippen"), - "Tap to select this student" : MessageLookupByLibrary.simpleMessage("Zum Auswählen dieses Studenten antippen"), - "Tap to show student selector" : MessageLookupByLibrary.simpleMessage("Zum Anzeigen des Studentenwählers antippen"), - "Teacher" : MessageLookupByLibrary.simpleMessage("Lehrer"), - "Tell us about your favorite parts of the app" : MessageLookupByLibrary.simpleMessage("Sagen Sie uns, was Sie an der App besonders mögen"), - "Terms of Service" : MessageLookupByLibrary.simpleMessage("Servicebedingungen"), - "Terms of Service Link" : MessageLookupByLibrary.simpleMessage("Servicebedingungen (Link)"), - "Terms of Use" : MessageLookupByLibrary.simpleMessage("Nutzungsbedingungen"), - "The QR code you scanned may have expired. Refresh the code on the student\'s device and try again." : MessageLookupByLibrary.simpleMessage("Der von Ihnen gescannte QR-Code ist möglicherweise abgelaufen. Aktualisieren Sie den Code auf dem Gerät des Studenten und versuchen Sie es erneut."), - "The following information will help us better understand your idea:" : MessageLookupByLibrary.simpleMessage("Die folgende Information hilft uns, Ihre Idee besser zu verstehen:"), - "The server you entered is not authorized for this app." : MessageLookupByLibrary.simpleMessage("Der Server, den Sie eingegeben haben, hat keine Berechtigung für diese App."), - "The student you are trying to add belongs to a different school. Log in or create an account with that school to scan this code." : MessageLookupByLibrary.simpleMessage("Der Student, den Sie hinzufügen möchten, gehört zu einer anderen Schule. Melden Sie sich an oder erstellen Sie ein Konto bei dieser Einrichtung, um diesen Code zu scannen."), - "The user agent for this app is not authorized." : MessageLookupByLibrary.simpleMessage("Der Benutzeragent für diese App hat keine Berechtigung."), - "Theme" : MessageLookupByLibrary.simpleMessage("Design"), - "There are no installed applications that can open this file" : MessageLookupByLibrary.simpleMessage("Diese Datei kann mit keiner installierten Anwendung geöffnet werden"), - "There is no page information available." : MessageLookupByLibrary.simpleMessage("Es steht keine Seiteninformation zur Verfügung."), - "There was a problem loading the Terms of Use" : MessageLookupByLibrary.simpleMessage("Es gab ein Problem beim Laden der Nutzungsbedingungen."), - "There was a problem removing this student from your account. Please check your connection and try again." : MessageLookupByLibrary.simpleMessage("Beim Entfernen des Studenten aus Ihrem Konto ist ein Problem aufgetreten. Bitte überprüfen Sie Ihre Verbindung, und versuchen Sie es erneut."), - "There was an error loading recipients for this course" : MessageLookupByLibrary.simpleMessage("Beim Laden der Empfänger für diesen Kurs ist ein Fehler aufgetreten"), - "There was an error loading the summary details for this course." : MessageLookupByLibrary.simpleMessage("Beim Laden der Übersichtsdetails für diesen Kurs ist ein Fehler aufgetreten."), - "There was an error loading this announcement" : MessageLookupByLibrary.simpleMessage("Beim Laden dieser Ankündigung ist ein Fehler aufgetreten"), - "There was an error loading this conversation" : MessageLookupByLibrary.simpleMessage("Beim Laden dieses Gesprächs ist ein Fehler aufgetreten"), - "There was an error loading this file" : MessageLookupByLibrary.simpleMessage("Beim Laden dieser Datei ist ein Fehler aufgetreten"), - "There was an error loading your inbox messages." : MessageLookupByLibrary.simpleMessage("Fehler beim Laden Ihrer Posteingangsmeldungen."), - "There was an error loading your student\'s alerts." : MessageLookupByLibrary.simpleMessage("Fehler beim Laden der Studentenalarme."), - "There was an error loading your student\'s calendar" : MessageLookupByLibrary.simpleMessage("Fehler beim Laden Ihres Studentenkalenders"), - "There was an error loading your students." : MessageLookupByLibrary.simpleMessage("Fehler beim Laden Ihrer Studenten."), - "There was an error loading your student’s courses." : MessageLookupByLibrary.simpleMessage("Fehler beim Laden der Kurse Ihres Studenten."), - "There was an error logging in. Please generate another QR Code and try again." : MessageLookupByLibrary.simpleMessage("Es gab einen Fehler bei der Anmeldung. Bitte generieren Sie einen weiteren QR-Code und versuchen Sie es erneut."), - "There was an error trying to act as this user. Please check the Domain and User ID and try again." : MessageLookupByLibrary.simpleMessage("Beim Handeln als dieser Benutzer ist ein Fehler aufgetreten. Bitte überprüfen Sie die Domäne und die Benutzer-ID, und versuchen Sie es erneut."), - "There’s nothing to be notified of yet." : MessageLookupByLibrary.simpleMessage("Es gibt noch nichts, an das erinnert werden kann."), - "This app is not authorized for use." : MessageLookupByLibrary.simpleMessage("Keine Autorisierung, um diese App zu verwenden."), - "This course does not have any assignments or calendar events yet." : MessageLookupByLibrary.simpleMessage("Für diesen Kurs gibt es noch keine Aufgaben oder Kalenderereignisse."), - "This file is unsupported and can’t be viewed through the app" : MessageLookupByLibrary.simpleMessage("Diese Datei wird nicht unterstützt und kann mit der App nicht angezeigt werden"), - "This will unpair and remove all enrollments for this student from your account." : MessageLookupByLibrary.simpleMessage("Dadurch werden alle Pairings für Einschreibungen für diesen Studenten aufgehoben und die Einschreibungen werden von Ihrem Konto entfernt."), - "Total Grade" : MessageLookupByLibrary.simpleMessage("Endnote"), - "Uh oh!" : MessageLookupByLibrary.simpleMessage("Oh je!"), - "Unable to fetch courses. Please check your connection and try again." : MessageLookupByLibrary.simpleMessage("Kurse konnten nicht abgerufen werden. Bitte überprüfen Sie Ihre Verbindung, und versuchen Sie es erneut."), - "Unable to load this image" : MessageLookupByLibrary.simpleMessage("Dieses Bild kann nicht geladen werden"), - "Unable to play this media file" : MessageLookupByLibrary.simpleMessage("Diese Mediendatei kann nicht wiedergegeben werden"), - "Unable to send message. Check your connection and try again." : MessageLookupByLibrary.simpleMessage("Die Nachricht kann nicht gesendet werden. Überprüfen Sie Ihre Verbindung, und versuchen Sie es erneut."), - "Under Construction" : MessageLookupByLibrary.simpleMessage("In Bau"), - "Unknown User" : MessageLookupByLibrary.simpleMessage("Unbekannter Benutzer"), - "Unsaved changes" : MessageLookupByLibrary.simpleMessage("Nicht gespeicherte Änderungen"), - "Unsupported File" : MessageLookupByLibrary.simpleMessage("Nichtunterstützte Datei"), - "Upload File" : MessageLookupByLibrary.simpleMessage("Datei hochladen"), - "Use Camera" : MessageLookupByLibrary.simpleMessage("Kamera verwenden"), - "Use Dark Theme in Web Content" : MessageLookupByLibrary.simpleMessage("Dunkles Design für Web-Inhalte verwenden"), - "User ID" : MessageLookupByLibrary.simpleMessage("Benutzer-ID"), - "User ID:" : MessageLookupByLibrary.simpleMessage("Benutzer-ID:"), - "Version Number" : MessageLookupByLibrary.simpleMessage("Versionsnummer"), - "View Description" : MessageLookupByLibrary.simpleMessage("Beschreibung anzeigen"), - "View error details" : MessageLookupByLibrary.simpleMessage("Fehlerdetails anzeigen"), - "View the Privacy Policy" : MessageLookupByLibrary.simpleMessage("Datenschutzrichtlinien anzeigen"), - "We are currently building this feature for your viewing pleasure." : MessageLookupByLibrary.simpleMessage("Wir bauen derzeit an dieser Funktion für Sie."), - "We are unable to display this link, it may belong to an institution you currently aren\'t logged in to." : MessageLookupByLibrary.simpleMessage("Wir können diesen Link nicht anzeigen. Er könnte zu einer Institution gehören, bei der Sie derzeit nicht angemeldet sind."), - "We couldn\'t find any students associated with this account" : MessageLookupByLibrary.simpleMessage("Es wurden keine mit diesem Konto verknüpfte Studenten gefunden"), - "We were unable to verify the server for use with this app." : MessageLookupByLibrary.simpleMessage("Der Server konnte für die Verwendung mit dieser App nicht verifiziert werden."), - "We’re not sure what happened, but it wasn’t good. Contact us if this keeps happening." : MessageLookupByLibrary.simpleMessage("Wir sind nicht sicher, was passiert ist, aber es war nicht gut. Kontaktieren Sie uns, falls dies wieder passiert."), - "What can we do better?" : MessageLookupByLibrary.simpleMessage("Was können wir besser machen?"), - "Yes" : MessageLookupByLibrary.simpleMessage("Ja"), - "You are not observing any students." : MessageLookupByLibrary.simpleMessage("Sie beobachten keine Studenten."), - "You may only choose 10 calendars to display" : MessageLookupByLibrary.simpleMessage("Sie dürfen nur max. 10 Kalender für die Anzeige auswählen"), - "You must enter a user id" : MessageLookupByLibrary.simpleMessage("Sie müssen eine Benutzer-ID eingeben"), - "You must enter a valid domain" : MessageLookupByLibrary.simpleMessage("Sie müssen eine gültige Domäne eingeben"), - "You must select at least one calendar to display" : MessageLookupByLibrary.simpleMessage("Sie müssen mindestens einen Kalender anzeigen"), - "You will be notified about this assignment on…" : MessageLookupByLibrary.simpleMessage("Sie werden über diese Aufgabe benachrichtigt am …"), - "You will be notified about this event on…" : MessageLookupByLibrary.simpleMessage("Sie werden benachrichtigt über dieses Ereignis am …"), - "You\'ll find the QR code on the web in your account profile. Click \'QR for Mobile Login\' in the list." : MessageLookupByLibrary.simpleMessage("Sie finden den QR-Code im Internet in Ihrem Kontoprofil. Klicken Sie in der Liste auf \'QR für mobiles Login\'."), - "You\'ll need to open your student\'s Canvas Student app to continue. Go into Main Menu > Settings > Pair with Observer and scan the QR code you see there." : MessageLookupByLibrary.simpleMessage("Um fortzufahren, müssen Sie die Canvas Studenten-App Ihres Studenten öffnen. Gehen Sie zu Hauptmenü > Einstellungen > Pairing mit Beobachter und scannen Sie den QR-Code, den Sie dort sehen."), - "Your code is incorrect or expired." : MessageLookupByLibrary.simpleMessage("Ihr Code ist falsch oder abgelaufen."), - "Your student’s courses might not be published yet." : MessageLookupByLibrary.simpleMessage("Die Kurse sind möglicherweise noch nicht veröffentlicht."), - "You’re all caught up!" : MessageLookupByLibrary.simpleMessage("Sie werden alle erfasst!"), - "actingAsUser" : m0, - "alertsLabel" : MessageLookupByLibrary.simpleMessage("Benachrichtigungen"), - "appVersion" : m1, - "assignmentGradeAboveThreshold" : m2, - "assignmentGradeBelowThreshold" : m3, - "assignmentLockedModule" : m4, - "assignmentSubjectMessage" : m5, - "assignmentTotalPoints" : m6, - "assignmentTotalPointsAccessible" : m7, - "authorToNOthers" : m8, - "authorToRecipient" : m9, - "authorToRecipientAndNOthers" : m10, - "badgeNumberPlus" : m11, - "calendarLabel" : MessageLookupByLibrary.simpleMessage("Kalender"), - "canvasGuides" : MessageLookupByLibrary.simpleMessage("Canvas-Leitfäden"), - "canvasLogoLabel" : MessageLookupByLibrary.simpleMessage("Canvas-Logo"), - "canvasSupport" : MessageLookupByLibrary.simpleMessage("Canvas-Support"), - "changeStudentColorLabel" : m12, - "collapse" : MessageLookupByLibrary.simpleMessage("reduzieren"), - "collapsed" : MessageLookupByLibrary.simpleMessage("reduziert"), - "contentDescriptionScoreOutOfPointsPossible" : m13, - "courseForWhom" : m14, - "courseGradeAboveThreshold" : m15, - "courseGradeBelowThreshold" : m16, - "coursesLabel" : MessageLookupByLibrary.simpleMessage("Kurse"), - "dateAtTime" : m17, - "dismissAlertLabel" : m18, - "domainSearchHelpBody" : m19, - "domainSearchHelpLabel" : MessageLookupByLibrary.simpleMessage("Wie finde ich meine Schule oder meinen Bezirk?"), - "domainSearchInputHint" : MessageLookupByLibrary.simpleMessage("Schulnamen oder Bezirk eingeben …"), - "dueDateAtTime" : m20, - "endMasqueradeLogoutMessage" : m21, - "endMasqueradeMessage" : m22, - "eventSubjectMessage" : m23, - "eventTime" : m24, - "expand" : MessageLookupByLibrary.simpleMessage("erweitern"), - "expanded" : MessageLookupByLibrary.simpleMessage("erweitert"), - "finalGrade" : m25, - "findSchool" : MessageLookupByLibrary.simpleMessage("Schule suchen"), - "frontPageSubjectMessage" : m26, - "gradeFormatScoreOutOfPointsPossible" : m27, - "gradesSubjectMessage" : m28, - "latePenalty" : m29, - "me" : MessageLookupByLibrary.simpleMessage("Ich"), - "messageLinkPostscript" : m30, - "minus" : MessageLookupByLibrary.simpleMessage("minus"), - "mustBeAboveN" : m31, - "mustBeBelowN" : m32, - "next" : MessageLookupByLibrary.simpleMessage("Weiter"), - "nextMonth" : m33, - "nextWeek" : m34, - "noDomainResults" : m35, - "ok" : MessageLookupByLibrary.simpleMessage("OK"), - "outOfPoints" : m36, - "plusRecipientCount" : m37, - "pointsPossible" : m38, - "previousMonth" : m39, - "previousWeek" : m40, - "qrCreateAccountTos" : m41, - "ratingDialogEmailSubject" : m42, - "selectedMonthLabel" : m43, - "send" : MessageLookupByLibrary.simpleMessage("senden"), - "starRating" : m44, - "submissionStatusSuccessSubtitle" : m45, - "syllabusSubjectMessage" : m46, - "unread" : MessageLookupByLibrary.simpleMessage("ungelesen"), - "unreadCount" : m47 - }; -} diff --git a/apps/flutter_parent/lib/l10n/generated/messages_en.dart b/apps/flutter_parent/lib/l10n/generated/messages_en.dart deleted file mode 100644 index 867e4358f5..0000000000 --- a/apps/flutter_parent/lib/l10n/generated/messages_en.dart +++ /dev/null @@ -1,473 +0,0 @@ -// DO NOT EDIT. This is code generated via package:intl/generate_localized.dart -// This is a library that provides messages for a en locale. All the -// messages from the main program should be duplicated here with the same -// function name. - -// Ignore issues from commonly used lints in this file. -// ignore_for_file:unnecessary_brace_in_string_interps, unnecessary_new -// ignore_for_file:prefer_single_quotes,comment_references, directives_ordering -// ignore_for_file:annotate_overrides,prefer_generic_function_type_aliases -// ignore_for_file:unused_import, file_names - -import 'package:intl/intl.dart'; -import 'package:intl/message_lookup_by_library.dart'; - -final messages = new MessageLookup(); - -typedef String MessageIfAbsent(String messageStr, List args); - -class MessageLookup extends MessageLookupByLibrary { - String get localeName => 'en'; - - static m0(userName) => "You are acting as ${userName}"; - - static m1(version) => "v. ${version}"; - - static m2(threshold) => "Assignment Grade Above ${threshold}"; - - static m3(threshold) => "Assignment Grade Below ${threshold}"; - - static m4(moduleName) => "This assignment is locked by the module \"${moduleName}\"."; - - static m5(studentName, assignmentName) => "Regarding: ${studentName}, Assignment - ${assignmentName}"; - - static m6(points) => "${points} pts"; - - static m7(points) => "${points} points"; - - static m8(authorName, howMany) => "${Intl.plural(howMany, one: '${authorName} to 1 other', other: '${authorName} to ${howMany} others')}"; - - static m9(authorName, recipientName) => "${authorName} to ${recipientName}"; - - static m10(authorName, recipientName, howMany) => "${Intl.plural(howMany, one: '${authorName} to ${recipientName} & 1 other', other: '${authorName} to ${recipientName} & ${howMany} others')}"; - - static m11(count) => "${count}+"; - - static m12(studentName) => "Change color for ${studentName}"; - - static m13(score, pointsPossible) => "${score} out of ${pointsPossible} points"; - - static m14(studentShortName) => "for ${studentShortName}"; - - static m15(threshold) => "Course Grade Above ${threshold}"; - - static m16(threshold) => "Course Grade Below ${threshold}"; - - static m17(date, time) => "${date} at ${time}"; - - static m18(alertTitle) => "Dismiss ${alertTitle}"; - - static m19(canvasGuides, canvasSupport) => "Try searching for the name of the school or district you’re attempting to access, like “Smith Private School” or “Smith County Schools.” You can also enter a Canvas domain directly, like “smith.instructure.com.”\n\nFor more information on finding your institution’s Canvas account, you can visit the ${canvasGuides}, reach out to ${canvasSupport}, or contact your school for assistance."; - - static m20(date, time) => "Due ${date} at ${time}"; - - static m21(userName) => "You will stop acting as ${userName} and will be logged out."; - - static m22(userName) => "You will stop acting as ${userName} and return to your original account."; - - static m23(studentName, eventTitle) => "Regarding: ${studentName}, Event - ${eventTitle}"; - - static m24(startAt, endAt) => "${startAt} - ${endAt}"; - - static m25(grade) => "Final Grade: ${grade}"; - - static m26(studentName) => "Regarding: ${studentName}, Front Page"; - - static m27(score, pointsPossible) => "${score} / ${pointsPossible}"; - - static m28(studentName) => "Regarding: ${studentName}, Grades"; - - static m29(pointsLost) => "Late penalty (-${pointsLost})"; - - static m30(studentName, linkUrl) => "Regarding: ${studentName}, ${linkUrl}"; - - static m31(percentage) => "Must be above ${percentage}"; - - static m32(percentage) => "Must be below ${percentage}"; - - static m33(month) => "Next month: ${month}"; - - static m34(date) => "Next week starting ${date}"; - - static m35(query) => "Unable to find schools matching \"${query}\""; - - static m36(points, howMany) => "${Intl.plural(howMany, one: 'Out of 1 point', other: 'Out of ${points} points')}"; - - static m37(count) => "+${count}"; - - static m38(points) => "${points} points possible"; - - static m39(month) => "Previous month: ${month}"; - - static m40(date) => "Previous week starting ${date}"; - - static m41(termsOfService, privacyPolicy) => "By tapping \'Create Account\', you agree to the ${termsOfService} and acknowledge the ${privacyPolicy}"; - - static m42(version) => "Suggestions for Android - Canvas Parent ${version}"; - - static m43(month) => "Month of ${month}"; - - static m44(position) => "${Intl.plural(position, one: '${position} star', other: '${position} stars')}"; - - static m45(date, time) => "This assignment was submitted on ${date} at ${time} and is waiting to be graded"; - - static m46(studentName) => "Regarding: ${studentName}, Syllabus"; - - static m47(count) => "${count} unread"; - - final messages = _notInlinedMessages(_notInlinedMessages); - static _notInlinedMessages(_) => { - "\"Act as\" is essentially logging in as this user without a password. You will be able to take any action as if you were this user, and from other users\' points of views, it will be as if this user performed them. However, audit logs record that you were the one who performed the actions on behalf of this user." : MessageLookupByLibrary.simpleMessage("\"Act as\" is essentially logging in as this user without a password. You will be able to take any action as if you were this user, and from other users\' points of views, it will be as if this user performed them. However, audit logs record that you were the one who performed the actions on behalf of this user."), - "-" : MessageLookupByLibrary.simpleMessage("-"), - "A description is required." : MessageLookupByLibrary.simpleMessage("A description is required."), - "A network error occurred when adding this student. Check your connection and try again." : MessageLookupByLibrary.simpleMessage("A network error occurred when adding this student. Check your connection and try again."), - "A subject is required." : MessageLookupByLibrary.simpleMessage("A subject is required."), - "Act As User" : MessageLookupByLibrary.simpleMessage("Act As User"), - "Add Student" : MessageLookupByLibrary.simpleMessage("Add Student"), - "Add attachment" : MessageLookupByLibrary.simpleMessage("Add attachment"), - "Add new student" : MessageLookupByLibrary.simpleMessage("Add new student"), - "Add student with…" : MessageLookupByLibrary.simpleMessage("Add student with…"), - "Alert Settings" : MessageLookupByLibrary.simpleMessage("Alert Settings"), - "Alert me when…" : MessageLookupByLibrary.simpleMessage("Alert me when…"), - "All Grading Periods" : MessageLookupByLibrary.simpleMessage("All Grading Periods"), - "Already have an account? " : MessageLookupByLibrary.simpleMessage("Already have an account? "), - "An email address is required." : MessageLookupByLibrary.simpleMessage("An email address is required."), - "An error occurred when trying to display this link" : MessageLookupByLibrary.simpleMessage("An error occurred when trying to display this link"), - "An error occurred while saving your selection. Please try again." : MessageLookupByLibrary.simpleMessage("An error occurred while saving your selection. Please try again."), - "An unexpected error occurred" : MessageLookupByLibrary.simpleMessage("An unexpected error occurred"), - "Android OS version" : MessageLookupByLibrary.simpleMessage("Android OS version"), - "Appearance" : MessageLookupByLibrary.simpleMessage("Appearance"), - "Application version" : MessageLookupByLibrary.simpleMessage("Application version"), - "Are you a student or teacher?" : MessageLookupByLibrary.simpleMessage("Are you a student or teacher?"), - "Are you sure you want to log out?" : MessageLookupByLibrary.simpleMessage("Are you sure you want to log out?"), - "Are you sure you wish to close this page? Your unsent message will be lost." : MessageLookupByLibrary.simpleMessage("Are you sure you wish to close this page? Your unsent message will be lost."), - "Assignment Details" : MessageLookupByLibrary.simpleMessage("Assignment Details"), - "Assignment grade above" : MessageLookupByLibrary.simpleMessage("Assignment grade above"), - "Assignment grade below" : MessageLookupByLibrary.simpleMessage("Assignment grade below"), - "Assignment missing" : MessageLookupByLibrary.simpleMessage("Assignment missing"), - "Barney, Fuschia" : MessageLookupByLibrary.simpleMessage("Barney, Fuschia"), - "Calendars" : MessageLookupByLibrary.simpleMessage("Calendars"), - "Camera Permission" : MessageLookupByLibrary.simpleMessage("Camera Permission"), - "Cancel" : MessageLookupByLibrary.simpleMessage("Cancel"), - "Canvas Student" : MessageLookupByLibrary.simpleMessage("Canvas Student"), - "Canvas Teacher" : MessageLookupByLibrary.simpleMessage("Canvas Teacher"), - "Canvas on GitHub" : MessageLookupByLibrary.simpleMessage("Canvas on GitHub"), - "Choose a course to message" : MessageLookupByLibrary.simpleMessage("Choose a course to message"), - "Choose from Gallery" : MessageLookupByLibrary.simpleMessage("Choose from Gallery"), - "Complete" : MessageLookupByLibrary.simpleMessage("Complete"), - "Contact Support" : MessageLookupByLibrary.simpleMessage("Contact Support"), - "Course Announcement" : MessageLookupByLibrary.simpleMessage("Course Announcement"), - "Course Announcements" : MessageLookupByLibrary.simpleMessage("Course Announcements"), - "Course grade above" : MessageLookupByLibrary.simpleMessage("Course grade above"), - "Course grade below" : MessageLookupByLibrary.simpleMessage("Course grade below"), - "Create Account" : MessageLookupByLibrary.simpleMessage("Create Account"), - "Dark Mode" : MessageLookupByLibrary.simpleMessage("Dark Mode"), - "Date" : MessageLookupByLibrary.simpleMessage("Date"), - "Delete" : MessageLookupByLibrary.simpleMessage("Delete"), - "Description" : MessageLookupByLibrary.simpleMessage("Description"), - "Device" : MessageLookupByLibrary.simpleMessage("Device"), - "Device model" : MessageLookupByLibrary.simpleMessage("Device model"), - "Domain" : MessageLookupByLibrary.simpleMessage("Domain"), - "Domain:" : MessageLookupByLibrary.simpleMessage("Domain:"), - "Don\'t show again" : MessageLookupByLibrary.simpleMessage("Don\'t show again"), - "Done" : MessageLookupByLibrary.simpleMessage("Done"), - "Download" : MessageLookupByLibrary.simpleMessage("Download"), - "Due" : MessageLookupByLibrary.simpleMessage("Due"), - "EXTREME CRITICAL EMERGENCY!!" : MessageLookupByLibrary.simpleMessage("EXTREME CRITICAL EMERGENCY!!"), - "Electric, blue" : MessageLookupByLibrary.simpleMessage("Electric, blue"), - "Email Address" : MessageLookupByLibrary.simpleMessage("Email Address"), - "Email:" : MessageLookupByLibrary.simpleMessage("Email:"), - "Email…" : MessageLookupByLibrary.simpleMessage("Email…"), - "Enter the student pairing code provided to you. If the pairing code doesn\'t work, it may have expired" : MessageLookupByLibrary.simpleMessage("Enter the student pairing code provided to you. If the pairing code doesn\'t work, it may have expired"), - "Event" : MessageLookupByLibrary.simpleMessage("Event"), - "Excused" : MessageLookupByLibrary.simpleMessage("Excused"), - "Expired QR Code" : MessageLookupByLibrary.simpleMessage("Expired QR Code"), - "Failed. Tap for options." : MessageLookupByLibrary.simpleMessage("Failed. Tap for options."), - "Filter" : MessageLookupByLibrary.simpleMessage("Filter"), - "Filter by" : MessageLookupByLibrary.simpleMessage("Filter by"), - "Fire, Orange" : MessageLookupByLibrary.simpleMessage("Fire, Orange"), - "Front Page" : MessageLookupByLibrary.simpleMessage("Front Page"), - "Full Name" : MessageLookupByLibrary.simpleMessage("Full Name"), - "Full Name…" : MessageLookupByLibrary.simpleMessage("Full Name…"), - "Full error message" : MessageLookupByLibrary.simpleMessage("Full error message"), - "Go to today" : MessageLookupByLibrary.simpleMessage("Go to today"), - "Grade" : MessageLookupByLibrary.simpleMessage("Grade"), - "Grade percentage" : MessageLookupByLibrary.simpleMessage("Grade percentage"), - "Graded" : MessageLookupByLibrary.simpleMessage("Graded"), - "Grades" : MessageLookupByLibrary.simpleMessage("Grades"), - "Help" : MessageLookupByLibrary.simpleMessage("Help"), - "Hide Password" : MessageLookupByLibrary.simpleMessage("Hide Password"), - "High Contrast Mode" : MessageLookupByLibrary.simpleMessage("High Contrast Mode"), - "How are we doing?" : MessageLookupByLibrary.simpleMessage("How are we doing?"), - "How is this affecting you?" : MessageLookupByLibrary.simpleMessage("How is this affecting you?"), - "I can\'t get things done until I hear back from you." : MessageLookupByLibrary.simpleMessage("I can\'t get things done until I hear back from you."), - "I don\'t have a Canvas account" : MessageLookupByLibrary.simpleMessage("I don\'t have a Canvas account"), - "I have a Canvas account" : MessageLookupByLibrary.simpleMessage("I have a Canvas account"), - "I need some help but it\'s not urgent." : MessageLookupByLibrary.simpleMessage("I need some help but it\'s not urgent."), - "I\'m having trouble logging in" : MessageLookupByLibrary.simpleMessage("I\'m having trouble logging in"), - "Idea for Canvas Parent App [Android]" : MessageLookupByLibrary.simpleMessage("Idea for Canvas Parent App [Android]"), - "In order to provide you with a better experience, we have updated how reminders work. You can add new reminders by viewing an assignment or calendar event and tapping the switch under the \"Remind Me\" section.\n\nBe aware that any reminders created with older versions of this app will not be compatible with the new changes and you will need to create them again." : MessageLookupByLibrary.simpleMessage("In order to provide you with a better experience, we have updated how reminders work. You can add new reminders by viewing an assignment or calendar event and tapping the switch under the \"Remind Me\" section.\n\nBe aware that any reminders created with older versions of this app will not be compatible with the new changes and you will need to create them again."), - "Inbox" : MessageLookupByLibrary.simpleMessage("Inbox"), - "Inbox Zero" : MessageLookupByLibrary.simpleMessage("Inbox Zero"), - "Incomplete" : MessageLookupByLibrary.simpleMessage("Incomplete"), - "Incorrect Domain" : MessageLookupByLibrary.simpleMessage("Incorrect Domain"), - "Institution Announcement" : MessageLookupByLibrary.simpleMessage("Institution Announcement"), - "Institution Announcements" : MessageLookupByLibrary.simpleMessage("Institution Announcements"), - "Instructions" : MessageLookupByLibrary.simpleMessage("Instructions"), - "Interactions on this page are limited by your institution." : MessageLookupByLibrary.simpleMessage("Interactions on this page are limited by your institution."), - "Invalid QR Code" : MessageLookupByLibrary.simpleMessage("Invalid QR Code"), - "It looks like a great day to rest, relax, and recharge." : MessageLookupByLibrary.simpleMessage("It looks like a great day to rest, relax, and recharge."), - "It looks like assignments haven\'t been created in this space yet." : MessageLookupByLibrary.simpleMessage("It looks like assignments haven\'t been created in this space yet."), - "Just a casual question, comment, idea, suggestion…" : MessageLookupByLibrary.simpleMessage("Just a casual question, comment, idea, suggestion…"), - "Late" : MessageLookupByLibrary.simpleMessage("Late"), - "Launch External Tool" : MessageLookupByLibrary.simpleMessage("Launch External Tool"), - "Legal" : MessageLookupByLibrary.simpleMessage("Legal"), - "Light Mode" : MessageLookupByLibrary.simpleMessage("Light Mode"), - "Link Error" : MessageLookupByLibrary.simpleMessage("Link Error"), - "Locale:" : MessageLookupByLibrary.simpleMessage("Locale:"), - "Locate QR Code" : MessageLookupByLibrary.simpleMessage("Locate QR Code"), - "Location" : MessageLookupByLibrary.simpleMessage("Location"), - "Locked" : MessageLookupByLibrary.simpleMessage("Locked"), - "Log Out" : MessageLookupByLibrary.simpleMessage("Log Out"), - "Login flow: Canvas" : MessageLookupByLibrary.simpleMessage("Login flow: Canvas"), - "Login flow: Normal" : MessageLookupByLibrary.simpleMessage("Login flow: Normal"), - "Login flow: Site Admin" : MessageLookupByLibrary.simpleMessage("Login flow: Site Admin"), - "Login flow: Skip mobile verify" : MessageLookupByLibrary.simpleMessage("Login flow: Skip mobile verify"), - "Manage Students" : MessageLookupByLibrary.simpleMessage("Manage Students"), - "Message" : MessageLookupByLibrary.simpleMessage("Message"), - "Message subject" : MessageLookupByLibrary.simpleMessage("Message subject"), - "Missing" : MessageLookupByLibrary.simpleMessage("Missing"), - "Must be below 100" : MessageLookupByLibrary.simpleMessage("Must be below 100"), - "Network error" : MessageLookupByLibrary.simpleMessage("Network error"), - "Never" : MessageLookupByLibrary.simpleMessage("Never"), - "New message" : MessageLookupByLibrary.simpleMessage("New message"), - "No" : MessageLookupByLibrary.simpleMessage("No"), - "No Alerts" : MessageLookupByLibrary.simpleMessage("No Alerts"), - "No Assignments" : MessageLookupByLibrary.simpleMessage("No Assignments"), - "No Courses" : MessageLookupByLibrary.simpleMessage("No Courses"), - "No Due Date" : MessageLookupByLibrary.simpleMessage("No Due Date"), - "No Events Today!" : MessageLookupByLibrary.simpleMessage("No Events Today!"), - "No Grade" : MessageLookupByLibrary.simpleMessage("No Grade"), - "No Location Specified" : MessageLookupByLibrary.simpleMessage("No Location Specified"), - "No Students" : MessageLookupByLibrary.simpleMessage("No Students"), - "No Subject" : MessageLookupByLibrary.simpleMessage("No Subject"), - "No Summary" : MessageLookupByLibrary.simpleMessage("No Summary"), - "No description" : MessageLookupByLibrary.simpleMessage("No description"), - "No recipients selected" : MessageLookupByLibrary.simpleMessage("No recipients selected"), - "Not Graded" : MessageLookupByLibrary.simpleMessage("Not Graded"), - "Not Submitted" : MessageLookupByLibrary.simpleMessage("Not Submitted"), - "Not a parent?" : MessageLookupByLibrary.simpleMessage("Not a parent?"), - "Notifications for reminders about assignments and calendar events" : MessageLookupByLibrary.simpleMessage("Notifications for reminders about assignments and calendar events"), - "OS Version" : MessageLookupByLibrary.simpleMessage("OS Version"), - "Observer" : MessageLookupByLibrary.simpleMessage("Observer"), - "One of our other apps might be a better fit. Tap one to visit the Play Store." : MessageLookupByLibrary.simpleMessage("One of our other apps might be a better fit. Tap one to visit the Play Store."), - "Open Canvas Student" : MessageLookupByLibrary.simpleMessage("Open Canvas Student"), - "Open In Browser" : MessageLookupByLibrary.simpleMessage("Open In Browser"), - "Open with another app" : MessageLookupByLibrary.simpleMessage("Open with another app"), - "Pairing Code" : MessageLookupByLibrary.simpleMessage("Pairing Code"), - "Password" : MessageLookupByLibrary.simpleMessage("Password"), - "Password is required" : MessageLookupByLibrary.simpleMessage("Password is required"), - "Password must contain at least 8 characters" : MessageLookupByLibrary.simpleMessage("Password must contain at least 8 characters"), - "Password…" : MessageLookupByLibrary.simpleMessage("Password…"), - "Planner Note" : MessageLookupByLibrary.simpleMessage("Planner Note"), - "Please enter a valid email address" : MessageLookupByLibrary.simpleMessage("Please enter a valid email address"), - "Please enter an email address" : MessageLookupByLibrary.simpleMessage("Please enter an email address"), - "Please enter full name" : MessageLookupByLibrary.simpleMessage("Please enter full name"), - "Please scan a QR code generated by Canvas" : MessageLookupByLibrary.simpleMessage("Please scan a QR code generated by Canvas"), - "Plum, Purple" : MessageLookupByLibrary.simpleMessage("Plum, Purple"), - "Preparing…" : MessageLookupByLibrary.simpleMessage("Preparing…"), - "Previous Logins" : MessageLookupByLibrary.simpleMessage("Previous Logins"), - "Privacy Policy" : MessageLookupByLibrary.simpleMessage("Privacy Policy"), - "Privacy Policy Link" : MessageLookupByLibrary.simpleMessage("Privacy Policy Link"), - "Privacy policy, terms of use, open source" : MessageLookupByLibrary.simpleMessage("Privacy policy, terms of use, open source"), - "QR Code" : MessageLookupByLibrary.simpleMessage("QR Code"), - "QR scanning requires camera access" : MessageLookupByLibrary.simpleMessage("QR scanning requires camera access"), - "Raspberry, Red" : MessageLookupByLibrary.simpleMessage("Raspberry, Red"), - "Recipients" : MessageLookupByLibrary.simpleMessage("Recipients"), - "Refresh" : MessageLookupByLibrary.simpleMessage("Refresh"), - "Remind Me" : MessageLookupByLibrary.simpleMessage("Remind Me"), - "Reminders" : MessageLookupByLibrary.simpleMessage("Reminders"), - "Reminders have changed!" : MessageLookupByLibrary.simpleMessage("Reminders have changed!"), - "Reply" : MessageLookupByLibrary.simpleMessage("Reply"), - "Reply All" : MessageLookupByLibrary.simpleMessage("Reply All"), - "Report A Problem" : MessageLookupByLibrary.simpleMessage("Report A Problem"), - "Request Login Help" : MessageLookupByLibrary.simpleMessage("Request Login Help"), - "Request Login Help Button" : MessageLookupByLibrary.simpleMessage("Request Login Help Button"), - "Restart app" : MessageLookupByLibrary.simpleMessage("Restart app"), - "Retry" : MessageLookupByLibrary.simpleMessage("Retry"), - "Return to Login" : MessageLookupByLibrary.simpleMessage("Return to Login"), - "STUDENT" : MessageLookupByLibrary.simpleMessage("STUDENT"), - "Screenshot showing location of QR code generation in browser" : MessageLookupByLibrary.simpleMessage("Screenshot showing location of QR code generation in browser"), - "Screenshot showing location of pairing QR code generation in the Canvas Student app" : MessageLookupByLibrary.simpleMessage("Screenshot showing location of pairing QR code generation in the Canvas Student app"), - "Select" : MessageLookupByLibrary.simpleMessage("Select"), - "Select Student Color" : MessageLookupByLibrary.simpleMessage("Select Student Color"), - "Select recipients" : MessageLookupByLibrary.simpleMessage("Select recipients"), - "Send Feedback" : MessageLookupByLibrary.simpleMessage("Send Feedback"), - "Send a message about this assignment" : MessageLookupByLibrary.simpleMessage("Send a message about this assignment"), - "Send a message about this course" : MessageLookupByLibrary.simpleMessage("Send a message about this course"), - "Send message" : MessageLookupByLibrary.simpleMessage("Send message"), - "Set a date and time to be notified of this event." : MessageLookupByLibrary.simpleMessage("Set a date and time to be notified of this event."), - "Set a date and time to be notified of this specific assignment." : MessageLookupByLibrary.simpleMessage("Set a date and time to be notified of this specific assignment."), - "Settings" : MessageLookupByLibrary.simpleMessage("Settings"), - "Shamrock, Green" : MessageLookupByLibrary.simpleMessage("Shamrock, Green"), - "Share Your Love for the App" : MessageLookupByLibrary.simpleMessage("Share Your Love for the App"), - "Show Password" : MessageLookupByLibrary.simpleMessage("Show Password"), - "Sign In" : MessageLookupByLibrary.simpleMessage("Sign In"), - "Something went wrong trying to create your account, please reach out to your school for assistance." : MessageLookupByLibrary.simpleMessage("Something went wrong trying to create your account, please reach out to your school for assistance."), - "Something\'s broken but I can work around it to get what I need done." : MessageLookupByLibrary.simpleMessage("Something\'s broken but I can work around it to get what I need done."), - "Stop Acting as User" : MessageLookupByLibrary.simpleMessage("Stop Acting as User"), - "Student" : MessageLookupByLibrary.simpleMessage("Student"), - "Student Pairing" : MessageLookupByLibrary.simpleMessage("Student Pairing"), - "Students can create a QR code using the Canvas Student app on their mobile device" : MessageLookupByLibrary.simpleMessage("Students can create a QR code using the Canvas Student app on their mobile device"), - "Students can obtain a pairing code through the Canvas website" : MessageLookupByLibrary.simpleMessage("Students can obtain a pairing code through the Canvas website"), - "Subject" : MessageLookupByLibrary.simpleMessage("Subject"), - "Submitted" : MessageLookupByLibrary.simpleMessage("Submitted"), - "Successfully submitted!" : MessageLookupByLibrary.simpleMessage("Successfully submitted!"), - "Summary" : MessageLookupByLibrary.simpleMessage("Summary"), - "Switch Users" : MessageLookupByLibrary.simpleMessage("Switch Users"), - "Syllabus" : MessageLookupByLibrary.simpleMessage("Syllabus"), - "TA" : MessageLookupByLibrary.simpleMessage("TA"), - "TEACHER" : MessageLookupByLibrary.simpleMessage("TEACHER"), - "Tap to favorite the courses you want to see on the Calendar. Select up to 10." : MessageLookupByLibrary.simpleMessage("Tap to favorite the courses you want to see on the Calendar. Select up to 10."), - "Tap to pair with a new student" : MessageLookupByLibrary.simpleMessage("Tap to pair with a new student"), - "Tap to select this student" : MessageLookupByLibrary.simpleMessage("Tap to select this student"), - "Tap to show student selector" : MessageLookupByLibrary.simpleMessage("Tap to show student selector"), - "Teacher" : MessageLookupByLibrary.simpleMessage("Teacher"), - "Tell us about your favorite parts of the app" : MessageLookupByLibrary.simpleMessage("Tell us about your favorite parts of the app"), - "Terms of Service" : MessageLookupByLibrary.simpleMessage("Terms of Service"), - "Terms of Service Link" : MessageLookupByLibrary.simpleMessage("Terms of Service Link"), - "Terms of Use" : MessageLookupByLibrary.simpleMessage("Terms of Use"), - "The QR code you scanned may have expired. Refresh the code on the student\'s device and try again." : MessageLookupByLibrary.simpleMessage("The QR code you scanned may have expired. Refresh the code on the student\'s device and try again."), - "The following information will help us better understand your idea:" : MessageLookupByLibrary.simpleMessage("The following information will help us better understand your idea:"), - "The server you entered is not authorized for this app." : MessageLookupByLibrary.simpleMessage("The server you entered is not authorized for this app."), - "The student you are trying to add belongs to a different school. Log in or create an account with that school to scan this code." : MessageLookupByLibrary.simpleMessage("The student you are trying to add belongs to a different school. Log in or create an account with that school to scan this code."), - "The user agent for this app is not authorized." : MessageLookupByLibrary.simpleMessage("The user agent for this app is not authorized."), - "Theme" : MessageLookupByLibrary.simpleMessage("Theme"), - "There are no installed applications that can open this file" : MessageLookupByLibrary.simpleMessage("There are no installed applications that can open this file"), - "There is no page information available." : MessageLookupByLibrary.simpleMessage("There is no page information available."), - "There was a problem loading the Terms of Use" : MessageLookupByLibrary.simpleMessage("There was a problem loading the Terms of Use"), - "There was a problem removing this student from your account. Please check your connection and try again." : MessageLookupByLibrary.simpleMessage("There was a problem removing this student from your account. Please check your connection and try again."), - "There was an error loading recipients for this course" : MessageLookupByLibrary.simpleMessage("There was an error loading recipients for this course"), - "There was an error loading the summary details for this course." : MessageLookupByLibrary.simpleMessage("There was an error loading the summary details for this course."), - "There was an error loading this announcement" : MessageLookupByLibrary.simpleMessage("There was an error loading this announcement"), - "There was an error loading this conversation" : MessageLookupByLibrary.simpleMessage("There was an error loading this conversation"), - "There was an error loading this file" : MessageLookupByLibrary.simpleMessage("There was an error loading this file"), - "There was an error loading your inbox messages." : MessageLookupByLibrary.simpleMessage("There was an error loading your inbox messages."), - "There was an error loading your student\'s alerts." : MessageLookupByLibrary.simpleMessage("There was an error loading your student\'s alerts."), - "There was an error loading your student\'s calendar" : MessageLookupByLibrary.simpleMessage("There was an error loading your student\'s calendar"), - "There was an error loading your students." : MessageLookupByLibrary.simpleMessage("There was an error loading your students."), - "There was an error loading your student’s courses." : MessageLookupByLibrary.simpleMessage("There was an error loading your student’s courses."), - "There was an error logging in. Please generate another QR Code and try again." : MessageLookupByLibrary.simpleMessage("There was an error logging in. Please generate another QR Code and try again."), - "There was an error trying to act as this user. Please check the Domain and User ID and try again." : MessageLookupByLibrary.simpleMessage("There was an error trying to act as this user. Please check the Domain and User ID and try again."), - "There’s nothing to be notified of yet." : MessageLookupByLibrary.simpleMessage("There’s nothing to be notified of yet."), - "This app is not authorized for use." : MessageLookupByLibrary.simpleMessage("This app is not authorized for use."), - "This course does not have any assignments or calendar events yet." : MessageLookupByLibrary.simpleMessage("This course does not have any assignments or calendar events yet."), - "This file is unsupported and can’t be viewed through the app" : MessageLookupByLibrary.simpleMessage("This file is unsupported and can’t be viewed through the app"), - "This will unpair and remove all enrollments for this student from your account." : MessageLookupByLibrary.simpleMessage("This will unpair and remove all enrollments for this student from your account."), - "Total Grade" : MessageLookupByLibrary.simpleMessage("Total Grade"), - "Uh oh!" : MessageLookupByLibrary.simpleMessage("Uh oh!"), - "Unable to fetch courses. Please check your connection and try again." : MessageLookupByLibrary.simpleMessage("Unable to fetch courses. Please check your connection and try again."), - "Unable to load this image" : MessageLookupByLibrary.simpleMessage("Unable to load this image"), - "Unable to play this media file" : MessageLookupByLibrary.simpleMessage("Unable to play this media file"), - "Unable to send message. Check your connection and try again." : MessageLookupByLibrary.simpleMessage("Unable to send message. Check your connection and try again."), - "Under Construction" : MessageLookupByLibrary.simpleMessage("Under Construction"), - "Unknown User" : MessageLookupByLibrary.simpleMessage("Unknown User"), - "Unsaved changes" : MessageLookupByLibrary.simpleMessage("Unsaved changes"), - "Unsupported File" : MessageLookupByLibrary.simpleMessage("Unsupported File"), - "Upload File" : MessageLookupByLibrary.simpleMessage("Upload File"), - "Use Camera" : MessageLookupByLibrary.simpleMessage("Use Camera"), - "Use Dark Theme in Web Content" : MessageLookupByLibrary.simpleMessage("Use Dark Theme in Web Content"), - "User ID" : MessageLookupByLibrary.simpleMessage("User ID"), - "User ID:" : MessageLookupByLibrary.simpleMessage("User ID:"), - "Version Number" : MessageLookupByLibrary.simpleMessage("Version Number"), - "View Description" : MessageLookupByLibrary.simpleMessage("View Description"), - "View error details" : MessageLookupByLibrary.simpleMessage("View error details"), - "View the Privacy Policy" : MessageLookupByLibrary.simpleMessage("View the Privacy Policy"), - "We are currently building this feature for your viewing pleasure." : MessageLookupByLibrary.simpleMessage("We are currently building this feature for your viewing pleasure."), - "We are unable to display this link, it may belong to an institution you currently aren\'t logged in to." : MessageLookupByLibrary.simpleMessage("We are unable to display this link, it may belong to an institution you currently aren\'t logged in to."), - "We couldn\'t find any students associated with this account" : MessageLookupByLibrary.simpleMessage("We couldn\'t find any students associated with this account"), - "We were unable to verify the server for use with this app." : MessageLookupByLibrary.simpleMessage("We were unable to verify the server for use with this app."), - "We’re not sure what happened, but it wasn’t good. Contact us if this keeps happening." : MessageLookupByLibrary.simpleMessage("We’re not sure what happened, but it wasn’t good. Contact us if this keeps happening."), - "What can we do better?" : MessageLookupByLibrary.simpleMessage("What can we do better?"), - "Yes" : MessageLookupByLibrary.simpleMessage("Yes"), - "You are not observing any students." : MessageLookupByLibrary.simpleMessage("You are not observing any students."), - "You may only choose 10 calendars to display" : MessageLookupByLibrary.simpleMessage("You may only choose 10 calendars to display"), - "You must enter a user id" : MessageLookupByLibrary.simpleMessage("You must enter a user id"), - "You must enter a valid domain" : MessageLookupByLibrary.simpleMessage("You must enter a valid domain"), - "You must select at least one calendar to display" : MessageLookupByLibrary.simpleMessage("You must select at least one calendar to display"), - "You will be notified about this assignment on…" : MessageLookupByLibrary.simpleMessage("You will be notified about this assignment on…"), - "You will be notified about this event on…" : MessageLookupByLibrary.simpleMessage("You will be notified about this event on…"), - "You\'ll find the QR code on the web in your account profile. Click \'QR for Mobile Login\' in the list." : MessageLookupByLibrary.simpleMessage("You\'ll find the QR code on the web in your account profile. Click \'QR for Mobile Login\' in the list."), - "You\'ll need to open your student\'s Canvas Student app to continue. Go into Main Menu > Settings > Pair with Observer and scan the QR code you see there." : MessageLookupByLibrary.simpleMessage("You\'ll need to open your student\'s Canvas Student app to continue. Go into Main Menu > Settings > Pair with Observer and scan the QR code you see there."), - "Your code is incorrect or expired." : MessageLookupByLibrary.simpleMessage("Your code is incorrect or expired."), - "Your student’s courses might not be published yet." : MessageLookupByLibrary.simpleMessage("Your student’s courses might not be published yet."), - "You’re all caught up!" : MessageLookupByLibrary.simpleMessage("You’re all caught up!"), - "actingAsUser" : m0, - "alertsLabel" : MessageLookupByLibrary.simpleMessage("Alerts"), - "appVersion" : m1, - "assignmentGradeAboveThreshold" : m2, - "assignmentGradeBelowThreshold" : m3, - "assignmentLockedModule" : m4, - "assignmentSubjectMessage" : m5, - "assignmentTotalPoints" : m6, - "assignmentTotalPointsAccessible" : m7, - "authorToNOthers" : m8, - "authorToRecipient" : m9, - "authorToRecipientAndNOthers" : m10, - "badgeNumberPlus" : m11, - "calendarLabel" : MessageLookupByLibrary.simpleMessage("Calendar"), - "canvasGuides" : MessageLookupByLibrary.simpleMessage("Canvas Guides"), - "canvasLogoLabel" : MessageLookupByLibrary.simpleMessage("Canvas logo"), - "canvasSupport" : MessageLookupByLibrary.simpleMessage("Canvas Support"), - "changeStudentColorLabel" : m12, - "collapse" : MessageLookupByLibrary.simpleMessage("collapse"), - "collapsed" : MessageLookupByLibrary.simpleMessage("collapsed"), - "contentDescriptionScoreOutOfPointsPossible" : m13, - "courseForWhom" : m14, - "courseGradeAboveThreshold" : m15, - "courseGradeBelowThreshold" : m16, - "coursesLabel" : MessageLookupByLibrary.simpleMessage("Courses"), - "dateAtTime" : m17, - "dismissAlertLabel" : m18, - "domainSearchHelpBody" : m19, - "domainSearchHelpLabel" : MessageLookupByLibrary.simpleMessage("How do I find my school or district?"), - "domainSearchInputHint" : MessageLookupByLibrary.simpleMessage("Enter school name or district…"), - "dueDateAtTime" : m20, - "endMasqueradeLogoutMessage" : m21, - "endMasqueradeMessage" : m22, - "eventSubjectMessage" : m23, - "eventTime" : m24, - "expand" : MessageLookupByLibrary.simpleMessage("expand"), - "expanded" : MessageLookupByLibrary.simpleMessage("expanded"), - "finalGrade" : m25, - "findSchool" : MessageLookupByLibrary.simpleMessage("Find School"), - "frontPageSubjectMessage" : m26, - "gradeFormatScoreOutOfPointsPossible" : m27, - "gradesSubjectMessage" : m28, - "latePenalty" : m29, - "me" : MessageLookupByLibrary.simpleMessage("me"), - "messageLinkPostscript" : m30, - "minus" : MessageLookupByLibrary.simpleMessage("minus"), - "mustBeAboveN" : m31, - "mustBeBelowN" : m32, - "next" : MessageLookupByLibrary.simpleMessage("Next"), - "nextMonth" : m33, - "nextWeek" : m34, - "noDomainResults" : m35, - "ok" : MessageLookupByLibrary.simpleMessage("OK"), - "outOfPoints" : m36, - "plusRecipientCount" : m37, - "pointsPossible" : m38, - "previousMonth" : m39, - "previousWeek" : m40, - "qrCreateAccountTos" : m41, - "ratingDialogEmailSubject" : m42, - "selectedMonthLabel" : m43, - "send" : MessageLookupByLibrary.simpleMessage("send"), - "starRating" : m44, - "submissionStatusSuccessSubtitle" : m45, - "syllabusSubjectMessage" : m46, - "unread" : MessageLookupByLibrary.simpleMessage("unread"), - "unreadCount" : m47 - }; -} diff --git a/apps/flutter_parent/lib/l10n/generated/messages_en_AU.dart b/apps/flutter_parent/lib/l10n/generated/messages_en_AU.dart deleted file mode 100644 index e3b6038af9..0000000000 --- a/apps/flutter_parent/lib/l10n/generated/messages_en_AU.dart +++ /dev/null @@ -1,473 +0,0 @@ -// DO NOT EDIT. This is code generated via package:intl/generate_localized.dart -// This is a library that provides messages for a en_AU locale. All the -// messages from the main program should be duplicated here with the same -// function name. - -// Ignore issues from commonly used lints in this file. -// ignore_for_file:unnecessary_brace_in_string_interps, unnecessary_new -// ignore_for_file:prefer_single_quotes,comment_references, directives_ordering -// ignore_for_file:annotate_overrides,prefer_generic_function_type_aliases -// ignore_for_file:unused_import, file_names - -import 'package:intl/intl.dart'; -import 'package:intl/message_lookup_by_library.dart'; - -final messages = new MessageLookup(); - -typedef String MessageIfAbsent(String messageStr, List args); - -class MessageLookup extends MessageLookupByLibrary { - String get localeName => 'en_AU'; - - static m0(userName) => "You are acting as ${userName}"; - - static m1(version) => "v. ${version}"; - - static m2(threshold) => "Assignment Grade Above ${threshold}"; - - static m3(threshold) => "Assignment Grade Below ${threshold}"; - - static m4(moduleName) => "This assignment is locked by the module \"${moduleName}\"."; - - static m5(studentName, assignmentName) => "Regarding: ${studentName}, Assignment - ${assignmentName}"; - - static m6(points) => "${points} pts"; - - static m7(points) => "${points} points"; - - static m8(authorName, howMany) => "${Intl.plural(howMany, one: '${authorName} to 1 other', other: '${authorName} to ${howMany} others')}"; - - static m9(authorName, recipientName) => "${authorName} to ${recipientName}"; - - static m10(authorName, recipientName, howMany) => "${Intl.plural(howMany, one: '${authorName} to ${recipientName} & 1 other', other: '${authorName} to ${recipientName} & ${howMany} others')}"; - - static m11(count) => "${count}+"; - - static m12(studentName) => "Change colour for ${studentName}"; - - static m13(score, pointsPossible) => "${score} out of ${pointsPossible} points"; - - static m14(studentShortName) => "for ${studentShortName}"; - - static m15(threshold) => "Course Grade Above ${threshold}"; - - static m16(threshold) => "Course Grade Below ${threshold}"; - - static m17(date, time) => "${date} at ${time}"; - - static m18(alertTitle) => "Dismiss ${alertTitle}"; - - static m19(canvasGuides, canvasSupport) => "Try searching for the name of the school or district you’re attempting to access, like “Smith Private School” or “Smith County Schools.” You can also enter a Canvas domain directly, like “smith.instructure.com.”\n\nFor more information on finding your institution’s Canvas account, you can visit the ${canvasGuides}, reach out to ${canvasSupport}, or contact your school for assistance."; - - static m20(date, time) => "Due ${date} at ${time}"; - - static m21(userName) => "You will stop acting as ${userName} and will be logged out."; - - static m22(userName) => "You will stop acting as ${userName} and return to your original account."; - - static m23(studentName, eventTitle) => "Regarding: ${studentName}, Event - ${eventTitle}"; - - static m24(startAt, endAt) => "${startAt} - ${endAt}"; - - static m25(grade) => "Final Mark: ${grade}"; - - static m26(studentName) => "Regarding: ${studentName}, Front Page"; - - static m27(score, pointsPossible) => "${score} / ${pointsPossible}"; - - static m28(studentName) => "Regarding: ${studentName}, Grades"; - - static m29(pointsLost) => "Late penalty (-${pointsLost})"; - - static m30(studentName, linkUrl) => "Regarding: ${studentName}, ${linkUrl}"; - - static m31(percentage) => "Must be above ${percentage}"; - - static m32(percentage) => "Must be below ${percentage}"; - - static m33(month) => "Next month: ${month}"; - - static m34(date) => "Next week starting ${date}"; - - static m35(query) => "Unable to find schools matching \"${query}\""; - - static m36(points, howMany) => "${Intl.plural(howMany, one: 'Out of 1 point', other: 'Out of ${points} points')}"; - - static m37(count) => "+${count}"; - - static m38(points) => "${points} points possible"; - - static m39(month) => "Previous month: ${month}"; - - static m40(date) => "Previous week starting ${date}"; - - static m41(termsOfService, privacyPolicy) => "By tapping \'Create Account\', you agree to the ${termsOfService} and acknowledge the ${privacyPolicy}"; - - static m42(version) => "Suggestions for Android - Canvas Parent ${version}"; - - static m43(month) => "Month of ${month}"; - - static m44(position) => "${Intl.plural(position, one: '${position} star', other: '${position} stars')}"; - - static m45(date, time) => "This assignment was submitted on ${date} at ${time} and is waiting to be graded"; - - static m46(studentName) => "Regarding: ${studentName}, Syllabus"; - - static m47(count) => "${count} unread"; - - final messages = _notInlinedMessages(_notInlinedMessages); - static _notInlinedMessages(_) => { - "\"Act as\" is essentially logging in as this user without a password. You will be able to take any action as if you were this user, and from other users\' points of views, it will be as if this user performed them. However, audit logs record that you were the one who performed the actions on behalf of this user." : MessageLookupByLibrary.simpleMessage("\"Act as\" is essentially logging in as this user without a password. You will be able to take any action as if you were this user, and from other users\' points of views, it will be as if this user performed them. However, audit logs record that you were the one who performed the actions on behalf of this user."), - "-" : MessageLookupByLibrary.simpleMessage("-"), - "A description is required." : MessageLookupByLibrary.simpleMessage("A description is required."), - "A network error occurred when adding this student. Check your connection and try again." : MessageLookupByLibrary.simpleMessage("A network error occurred when adding this student. Check your connection and try again."), - "A subject is required." : MessageLookupByLibrary.simpleMessage("A subject is required."), - "Act As User" : MessageLookupByLibrary.simpleMessage("Act As User"), - "Add Student" : MessageLookupByLibrary.simpleMessage("Add Student"), - "Add attachment" : MessageLookupByLibrary.simpleMessage("Add attachment"), - "Add new student" : MessageLookupByLibrary.simpleMessage("Add new student"), - "Add student with…" : MessageLookupByLibrary.simpleMessage("Add student with…"), - "Alert Settings" : MessageLookupByLibrary.simpleMessage("Alert Settings"), - "Alert me when…" : MessageLookupByLibrary.simpleMessage("Alert me when…"), - "All Grading Periods" : MessageLookupByLibrary.simpleMessage("All Grading Periods"), - "Already have an account? " : MessageLookupByLibrary.simpleMessage("Already have an account? "), - "An email address is required." : MessageLookupByLibrary.simpleMessage("An email address is required."), - "An error occurred when trying to display this link" : MessageLookupByLibrary.simpleMessage("An error occurred when trying to display this link"), - "An error occurred while saving your selection. Please try again." : MessageLookupByLibrary.simpleMessage("An error occurred while saving your selection. Please try again."), - "An unexpected error occurred" : MessageLookupByLibrary.simpleMessage("An unexpected error occurred"), - "Android OS version" : MessageLookupByLibrary.simpleMessage("Android OS version"), - "Appearance" : MessageLookupByLibrary.simpleMessage("Appearance"), - "Application version" : MessageLookupByLibrary.simpleMessage("Application version"), - "Are you a student or teacher?" : MessageLookupByLibrary.simpleMessage("Are you a student or teacher?"), - "Are you sure you want to log out?" : MessageLookupByLibrary.simpleMessage("Are you sure you want to log out?"), - "Are you sure you wish to close this page? Your unsent message will be lost." : MessageLookupByLibrary.simpleMessage("Are you sure you wish to close this page? Your unsent message will be lost."), - "Assignment Details" : MessageLookupByLibrary.simpleMessage("Assignment Details"), - "Assignment grade above" : MessageLookupByLibrary.simpleMessage("Assignment mark above"), - "Assignment grade below" : MessageLookupByLibrary.simpleMessage("Assignment mark below"), - "Assignment missing" : MessageLookupByLibrary.simpleMessage("Assignment missing"), - "Barney, Fuschia" : MessageLookupByLibrary.simpleMessage("Barney, Fuchsia"), - "Calendars" : MessageLookupByLibrary.simpleMessage("Calendars"), - "Camera Permission" : MessageLookupByLibrary.simpleMessage("Camera Permission"), - "Cancel" : MessageLookupByLibrary.simpleMessage("Cancel"), - "Canvas Student" : MessageLookupByLibrary.simpleMessage("Canvas Student"), - "Canvas Teacher" : MessageLookupByLibrary.simpleMessage("Canvas Teacher"), - "Canvas on GitHub" : MessageLookupByLibrary.simpleMessage("Canvas on GitHub"), - "Choose a course to message" : MessageLookupByLibrary.simpleMessage("Choose a course to message"), - "Choose from Gallery" : MessageLookupByLibrary.simpleMessage("Choose from Gallery"), - "Complete" : MessageLookupByLibrary.simpleMessage("Complete"), - "Contact Support" : MessageLookupByLibrary.simpleMessage("Contact Support"), - "Course Announcement" : MessageLookupByLibrary.simpleMessage("Course Announcement"), - "Course Announcements" : MessageLookupByLibrary.simpleMessage("Course Announcements"), - "Course grade above" : MessageLookupByLibrary.simpleMessage("Course mark above"), - "Course grade below" : MessageLookupByLibrary.simpleMessage("Course mark below"), - "Create Account" : MessageLookupByLibrary.simpleMessage("Create Account"), - "Dark Mode" : MessageLookupByLibrary.simpleMessage("Dark Mode"), - "Date" : MessageLookupByLibrary.simpleMessage("Date"), - "Delete" : MessageLookupByLibrary.simpleMessage("Delete"), - "Description" : MessageLookupByLibrary.simpleMessage("Description"), - "Device" : MessageLookupByLibrary.simpleMessage("Device"), - "Device model" : MessageLookupByLibrary.simpleMessage("Device model"), - "Domain" : MessageLookupByLibrary.simpleMessage("Domain"), - "Domain:" : MessageLookupByLibrary.simpleMessage("Domain:"), - "Don\'t show again" : MessageLookupByLibrary.simpleMessage("Don\'t show again"), - "Done" : MessageLookupByLibrary.simpleMessage("Done"), - "Download" : MessageLookupByLibrary.simpleMessage("Download"), - "Due" : MessageLookupByLibrary.simpleMessage("Due"), - "EXTREME CRITICAL EMERGENCY!!" : MessageLookupByLibrary.simpleMessage("EXTREME CRITICAL EMERGENCY!!"), - "Electric, blue" : MessageLookupByLibrary.simpleMessage("Electric, blue"), - "Email Address" : MessageLookupByLibrary.simpleMessage("Email Address"), - "Email:" : MessageLookupByLibrary.simpleMessage("Email:"), - "Email…" : MessageLookupByLibrary.simpleMessage("Email…"), - "Enter the student pairing code provided to you. If the pairing code doesn\'t work, it may have expired" : MessageLookupByLibrary.simpleMessage("Enter the student pairing code provided to you. If the pairing code doesn\'t work, it may have expired"), - "Event" : MessageLookupByLibrary.simpleMessage("Event"), - "Excused" : MessageLookupByLibrary.simpleMessage("Excused"), - "Expired QR Code" : MessageLookupByLibrary.simpleMessage("Expired QR Code"), - "Failed. Tap for options." : MessageLookupByLibrary.simpleMessage("Failed. Tap for options."), - "Filter" : MessageLookupByLibrary.simpleMessage("Filter"), - "Filter by" : MessageLookupByLibrary.simpleMessage("Filter by"), - "Fire, Orange" : MessageLookupByLibrary.simpleMessage("Fire, Orange"), - "Front Page" : MessageLookupByLibrary.simpleMessage("Front Page"), - "Full Name" : MessageLookupByLibrary.simpleMessage("Full Name"), - "Full Name…" : MessageLookupByLibrary.simpleMessage("Full Name…"), - "Full error message" : MessageLookupByLibrary.simpleMessage("Full error message"), - "Go to today" : MessageLookupByLibrary.simpleMessage("Go to today"), - "Grade" : MessageLookupByLibrary.simpleMessage("Mark"), - "Grade percentage" : MessageLookupByLibrary.simpleMessage("Grade percentage"), - "Graded" : MessageLookupByLibrary.simpleMessage("Marked"), - "Grades" : MessageLookupByLibrary.simpleMessage("Marks"), - "Help" : MessageLookupByLibrary.simpleMessage("Help"), - "Hide Password" : MessageLookupByLibrary.simpleMessage("Hide Password"), - "High Contrast Mode" : MessageLookupByLibrary.simpleMessage("High Contrast Mode"), - "How are we doing?" : MessageLookupByLibrary.simpleMessage("How are we doing?"), - "How is this affecting you?" : MessageLookupByLibrary.simpleMessage("How is this affecting you?"), - "I can\'t get things done until I hear back from you." : MessageLookupByLibrary.simpleMessage("I can\'t get things done until I hear back from you."), - "I don\'t have a Canvas account" : MessageLookupByLibrary.simpleMessage("I don\'t have a Canvas account"), - "I have a Canvas account" : MessageLookupByLibrary.simpleMessage("I have a Canvas account"), - "I need some help but it\'s not urgent." : MessageLookupByLibrary.simpleMessage("I need some help, but it\'s not urgent."), - "I\'m having trouble logging in" : MessageLookupByLibrary.simpleMessage("I\'m having trouble logging in"), - "Idea for Canvas Parent App [Android]" : MessageLookupByLibrary.simpleMessage("Idea for Canvas Parent App [Android]"), - "In order to provide you with a better experience, we have updated how reminders work. You can add new reminders by viewing an assignment or calendar event and tapping the switch under the \"Remind Me\" section.\n\nBe aware that any reminders created with older versions of this app will not be compatible with the new changes and you will need to create them again." : MessageLookupByLibrary.simpleMessage("In order to provide you with a better experience, we have updated how reminders work. You can add new reminders by viewing an assignment or calendar event and tapping the switch under the \"Remind Me\" section.\n\nBe aware that any reminders created with older versions of this app will not be compatible with the new changes and you will need to create them again."), - "Inbox" : MessageLookupByLibrary.simpleMessage("Inbox"), - "Inbox Zero" : MessageLookupByLibrary.simpleMessage("Inbox Zero"), - "Incomplete" : MessageLookupByLibrary.simpleMessage("Incomplete"), - "Incorrect Domain" : MessageLookupByLibrary.simpleMessage("Incorrect Domain"), - "Institution Announcement" : MessageLookupByLibrary.simpleMessage("Institution Announcement"), - "Institution Announcements" : MessageLookupByLibrary.simpleMessage("Institution Announcements"), - "Instructions" : MessageLookupByLibrary.simpleMessage("Instructions"), - "Interactions on this page are limited by your institution." : MessageLookupByLibrary.simpleMessage("Interactions on this page are limited by your institution."), - "Invalid QR Code" : MessageLookupByLibrary.simpleMessage("Invalid QR Code"), - "It looks like a great day to rest, relax, and recharge." : MessageLookupByLibrary.simpleMessage("It looks like a great day to rest, relax, and recharge."), - "It looks like assignments haven\'t been created in this space yet." : MessageLookupByLibrary.simpleMessage("It looks like assignments haven\'t been created in this space yet."), - "Just a casual question, comment, idea, suggestion…" : MessageLookupByLibrary.simpleMessage("Just a casual question, comment, idea, suggestion…"), - "Late" : MessageLookupByLibrary.simpleMessage("Late"), - "Launch External Tool" : MessageLookupByLibrary.simpleMessage("Launch External Tool"), - "Legal" : MessageLookupByLibrary.simpleMessage("Legal"), - "Light Mode" : MessageLookupByLibrary.simpleMessage("Light Mode"), - "Link Error" : MessageLookupByLibrary.simpleMessage("Link Error"), - "Locale:" : MessageLookupByLibrary.simpleMessage("Locale:"), - "Locate QR Code" : MessageLookupByLibrary.simpleMessage("Locate QR Code"), - "Location" : MessageLookupByLibrary.simpleMessage("Location"), - "Locked" : MessageLookupByLibrary.simpleMessage("Locked"), - "Log Out" : MessageLookupByLibrary.simpleMessage("Log Out"), - "Login flow: Canvas" : MessageLookupByLibrary.simpleMessage("Login flow: Canvas"), - "Login flow: Normal" : MessageLookupByLibrary.simpleMessage("Login flow: Normal"), - "Login flow: Site Admin" : MessageLookupByLibrary.simpleMessage("Login flow: Site Admin"), - "Login flow: Skip mobile verify" : MessageLookupByLibrary.simpleMessage("Login flow: Skip mobile verify"), - "Manage Students" : MessageLookupByLibrary.simpleMessage("Manage Students"), - "Message" : MessageLookupByLibrary.simpleMessage("Message"), - "Message subject" : MessageLookupByLibrary.simpleMessage("Message subject"), - "Missing" : MessageLookupByLibrary.simpleMessage("Missing"), - "Must be below 100" : MessageLookupByLibrary.simpleMessage("Must be below 100"), - "Network error" : MessageLookupByLibrary.simpleMessage("Network error"), - "Never" : MessageLookupByLibrary.simpleMessage("Never"), - "New message" : MessageLookupByLibrary.simpleMessage("New message"), - "No" : MessageLookupByLibrary.simpleMessage("No"), - "No Alerts" : MessageLookupByLibrary.simpleMessage("No Alerts"), - "No Assignments" : MessageLookupByLibrary.simpleMessage("No Assignments"), - "No Courses" : MessageLookupByLibrary.simpleMessage("No Courses"), - "No Due Date" : MessageLookupByLibrary.simpleMessage("No Due Date"), - "No Events Today!" : MessageLookupByLibrary.simpleMessage("No Events Today!"), - "No Grade" : MessageLookupByLibrary.simpleMessage("No Mark"), - "No Location Specified" : MessageLookupByLibrary.simpleMessage("No Location Specified"), - "No Students" : MessageLookupByLibrary.simpleMessage("No Students"), - "No Subject" : MessageLookupByLibrary.simpleMessage("No Subject"), - "No Summary" : MessageLookupByLibrary.simpleMessage("No Summary"), - "No description" : MessageLookupByLibrary.simpleMessage("No description"), - "No recipients selected" : MessageLookupByLibrary.simpleMessage("No recipients selected"), - "Not Graded" : MessageLookupByLibrary.simpleMessage("Not Marked"), - "Not Submitted" : MessageLookupByLibrary.simpleMessage("Not Submitted"), - "Not a parent?" : MessageLookupByLibrary.simpleMessage("Not a parent?"), - "Notifications for reminders about assignments and calendar events" : MessageLookupByLibrary.simpleMessage("Notifications for reminders about assignments and calendar events"), - "OS Version" : MessageLookupByLibrary.simpleMessage("OS Version"), - "Observer" : MessageLookupByLibrary.simpleMessage("Observer"), - "One of our other apps might be a better fit. Tap one to visit the Play Store." : MessageLookupByLibrary.simpleMessage("One of our other apps might be a better fit. Tap one to visit the Play Store."), - "Open Canvas Student" : MessageLookupByLibrary.simpleMessage("Open Canvas Student"), - "Open In Browser" : MessageLookupByLibrary.simpleMessage("Open In Browser"), - "Open with another app" : MessageLookupByLibrary.simpleMessage("Open with another app"), - "Pairing Code" : MessageLookupByLibrary.simpleMessage("Pairing Code"), - "Password" : MessageLookupByLibrary.simpleMessage("Password"), - "Password is required" : MessageLookupByLibrary.simpleMessage("Password is required"), - "Password must contain at least 8 characters" : MessageLookupByLibrary.simpleMessage("Password must contain at least 8 characters"), - "Password…" : MessageLookupByLibrary.simpleMessage("Password…"), - "Planner Note" : MessageLookupByLibrary.simpleMessage("Planner Note"), - "Please enter a valid email address" : MessageLookupByLibrary.simpleMessage("Please enter a valid email address"), - "Please enter an email address" : MessageLookupByLibrary.simpleMessage("Please enter an email address"), - "Please enter full name" : MessageLookupByLibrary.simpleMessage("Please enter full name"), - "Please scan a QR code generated by Canvas" : MessageLookupByLibrary.simpleMessage("Please scan a QR code generated by Canvas"), - "Plum, Purple" : MessageLookupByLibrary.simpleMessage("Plum, Purple"), - "Preparing…" : MessageLookupByLibrary.simpleMessage("Preparing…"), - "Previous Logins" : MessageLookupByLibrary.simpleMessage("Previous Logins"), - "Privacy Policy" : MessageLookupByLibrary.simpleMessage("Privacy Policy"), - "Privacy Policy Link" : MessageLookupByLibrary.simpleMessage("Privacy Policy Link"), - "Privacy policy, terms of use, open source" : MessageLookupByLibrary.simpleMessage("Privacy policy, terms of use, open source"), - "QR Code" : MessageLookupByLibrary.simpleMessage("QR Code"), - "QR scanning requires camera access" : MessageLookupByLibrary.simpleMessage("QR scanning requires camera access"), - "Raspberry, Red" : MessageLookupByLibrary.simpleMessage("Raspberry, Red"), - "Recipients" : MessageLookupByLibrary.simpleMessage("Recipients"), - "Refresh" : MessageLookupByLibrary.simpleMessage("Refresh"), - "Remind Me" : MessageLookupByLibrary.simpleMessage("Remind Me"), - "Reminders" : MessageLookupByLibrary.simpleMessage("Reminders"), - "Reminders have changed!" : MessageLookupByLibrary.simpleMessage("Reminders have changed!"), - "Reply" : MessageLookupByLibrary.simpleMessage("Reply"), - "Reply All" : MessageLookupByLibrary.simpleMessage("Reply All"), - "Report A Problem" : MessageLookupByLibrary.simpleMessage("Report A Problem"), - "Request Login Help" : MessageLookupByLibrary.simpleMessage("Request Login Help"), - "Request Login Help Button" : MessageLookupByLibrary.simpleMessage("Request Login Help Button"), - "Restart app" : MessageLookupByLibrary.simpleMessage("Restart app"), - "Retry" : MessageLookupByLibrary.simpleMessage("Retry"), - "Return to Login" : MessageLookupByLibrary.simpleMessage("Return to Login"), - "STUDENT" : MessageLookupByLibrary.simpleMessage("STUDENT"), - "Screenshot showing location of QR code generation in browser" : MessageLookupByLibrary.simpleMessage("Screenshot showing location of QR code generation in browser"), - "Screenshot showing location of pairing QR code generation in the Canvas Student app" : MessageLookupByLibrary.simpleMessage("Screenshot showing location of pairing QR code generation in the Canvas Student app"), - "Select" : MessageLookupByLibrary.simpleMessage("Select"), - "Select Student Color" : MessageLookupByLibrary.simpleMessage("Select Student Colour"), - "Select recipients" : MessageLookupByLibrary.simpleMessage("Select recipients"), - "Send Feedback" : MessageLookupByLibrary.simpleMessage("Send Feedback"), - "Send a message about this assignment" : MessageLookupByLibrary.simpleMessage("Send a message about this assignment"), - "Send a message about this course" : MessageLookupByLibrary.simpleMessage("Send a message about this course"), - "Send message" : MessageLookupByLibrary.simpleMessage("Send message"), - "Set a date and time to be notified of this event." : MessageLookupByLibrary.simpleMessage("Set a date and time to be notified of this event."), - "Set a date and time to be notified of this specific assignment." : MessageLookupByLibrary.simpleMessage("Set a date and time to be notified of this specific assignment."), - "Settings" : MessageLookupByLibrary.simpleMessage("Settings"), - "Shamrock, Green" : MessageLookupByLibrary.simpleMessage("Shamrock, Green"), - "Share Your Love for the App" : MessageLookupByLibrary.simpleMessage("Share Your Love for the App"), - "Show Password" : MessageLookupByLibrary.simpleMessage("Show Password"), - "Sign In" : MessageLookupByLibrary.simpleMessage("Sign In"), - "Something went wrong trying to create your account, please reach out to your school for assistance." : MessageLookupByLibrary.simpleMessage("Something went wrong trying to create your account, please reach out to your school for assistance."), - "Something\'s broken but I can work around it to get what I need done." : MessageLookupByLibrary.simpleMessage("Something\'s broken, but I can work around it to get what I need done."), - "Stop Acting as User" : MessageLookupByLibrary.simpleMessage("Stop Acting as User"), - "Student" : MessageLookupByLibrary.simpleMessage("Student"), - "Student Pairing" : MessageLookupByLibrary.simpleMessage("Student Pairing"), - "Students can create a QR code using the Canvas Student app on their mobile device" : MessageLookupByLibrary.simpleMessage("Students can create a QR code using the Canvas Student app on their mobile device"), - "Students can obtain a pairing code through the Canvas website" : MessageLookupByLibrary.simpleMessage("Students can obtain a pairing code through the Canvas website"), - "Subject" : MessageLookupByLibrary.simpleMessage("Subject"), - "Submitted" : MessageLookupByLibrary.simpleMessage("Submitted"), - "Successfully submitted!" : MessageLookupByLibrary.simpleMessage("Successfully submitted!"), - "Summary" : MessageLookupByLibrary.simpleMessage("Summary"), - "Switch Users" : MessageLookupByLibrary.simpleMessage("Switch Users"), - "Syllabus" : MessageLookupByLibrary.simpleMessage("Syllabus"), - "TA" : MessageLookupByLibrary.simpleMessage("TA"), - "TEACHER" : MessageLookupByLibrary.simpleMessage("TEACHER"), - "Tap to favorite the courses you want to see on the Calendar. Select up to 10." : MessageLookupByLibrary.simpleMessage("Tap to favourite the courses you want to see on the Calendar. Select up to 10."), - "Tap to pair with a new student" : MessageLookupByLibrary.simpleMessage("Tap to pair with a new student"), - "Tap to select this student" : MessageLookupByLibrary.simpleMessage("Tap to select this student"), - "Tap to show student selector" : MessageLookupByLibrary.simpleMessage("Tap to show student selector"), - "Teacher" : MessageLookupByLibrary.simpleMessage("Teacher"), - "Tell us about your favorite parts of the app" : MessageLookupByLibrary.simpleMessage("Tell us about your favourite parts of the app."), - "Terms of Service" : MessageLookupByLibrary.simpleMessage("Terms of Service"), - "Terms of Service Link" : MessageLookupByLibrary.simpleMessage("Terms of Service Link"), - "Terms of Use" : MessageLookupByLibrary.simpleMessage("Terms of Use"), - "The QR code you scanned may have expired. Refresh the code on the student\'s device and try again." : MessageLookupByLibrary.simpleMessage("The QR code you scanned may have expired. Refresh the code on the student\'s device and try again."), - "The following information will help us better understand your idea:" : MessageLookupByLibrary.simpleMessage("The following information will help us better understand your idea:"), - "The server you entered is not authorized for this app." : MessageLookupByLibrary.simpleMessage("The server you entered is not authorised for this app."), - "The student you are trying to add belongs to a different school. Log in or create an account with that school to scan this code." : MessageLookupByLibrary.simpleMessage("The student you are trying to add belongs to a different school. Log in or create an account with that school to scan this code."), - "The user agent for this app is not authorized." : MessageLookupByLibrary.simpleMessage("The user agent for this app is not authorised."), - "Theme" : MessageLookupByLibrary.simpleMessage("Theme"), - "There are no installed applications that can open this file" : MessageLookupByLibrary.simpleMessage("There are no installed applications that can open this file"), - "There is no page information available." : MessageLookupByLibrary.simpleMessage("There is no page information available."), - "There was a problem loading the Terms of Use" : MessageLookupByLibrary.simpleMessage("There was a problem loading the Terms of Use"), - "There was a problem removing this student from your account. Please check your connection and try again." : MessageLookupByLibrary.simpleMessage("There was a problem removing this student from your account. Please check your connection and try again."), - "There was an error loading recipients for this course" : MessageLookupByLibrary.simpleMessage("There was an error loading recipients for this course"), - "There was an error loading the summary details for this course." : MessageLookupByLibrary.simpleMessage("There was an error loading the summary details for this course."), - "There was an error loading this announcement" : MessageLookupByLibrary.simpleMessage("There was an error loading this announcement"), - "There was an error loading this conversation" : MessageLookupByLibrary.simpleMessage("There was an error loading this conversation"), - "There was an error loading this file" : MessageLookupByLibrary.simpleMessage("There was an error loading this file"), - "There was an error loading your inbox messages." : MessageLookupByLibrary.simpleMessage("There was an error loading your inbox messages."), - "There was an error loading your student\'s alerts." : MessageLookupByLibrary.simpleMessage("There was an error loading your students\' alerts."), - "There was an error loading your student\'s calendar" : MessageLookupByLibrary.simpleMessage("There was an error loading your student\'s calendar"), - "There was an error loading your students." : MessageLookupByLibrary.simpleMessage("There was an error loading your students."), - "There was an error loading your student’s courses." : MessageLookupByLibrary.simpleMessage("There was an error loading your student’s courses."), - "There was an error logging in. Please generate another QR Code and try again." : MessageLookupByLibrary.simpleMessage("There was an error logging in. Please generate another QR Code and try again."), - "There was an error trying to act as this user. Please check the Domain and User ID and try again." : MessageLookupByLibrary.simpleMessage("There was an error trying to act as this user. Please check the Domain and User ID and try again."), - "There’s nothing to be notified of yet." : MessageLookupByLibrary.simpleMessage("There’s nothing to be notified of yet."), - "This app is not authorized for use." : MessageLookupByLibrary.simpleMessage("This app is not authorised for use."), - "This course does not have any assignments or calendar events yet." : MessageLookupByLibrary.simpleMessage("This course does not have any assignments or calendar events yet."), - "This file is unsupported and can’t be viewed through the app" : MessageLookupByLibrary.simpleMessage("This file is unsupported and can’t be viewed through the app"), - "This will unpair and remove all enrollments for this student from your account." : MessageLookupByLibrary.simpleMessage("This will unpair and remove all enrolments for this student from your account."), - "Total Grade" : MessageLookupByLibrary.simpleMessage("Total Mark"), - "Uh oh!" : MessageLookupByLibrary.simpleMessage("Uh oh!"), - "Unable to fetch courses. Please check your connection and try again." : MessageLookupByLibrary.simpleMessage("Unable to fetch courses. Please check your connection and try again."), - "Unable to load this image" : MessageLookupByLibrary.simpleMessage("Unable to load this image"), - "Unable to play this media file" : MessageLookupByLibrary.simpleMessage("Unable to play this media file"), - "Unable to send message. Check your connection and try again." : MessageLookupByLibrary.simpleMessage("Unable to send message. Check your connection and try again."), - "Under Construction" : MessageLookupByLibrary.simpleMessage("Under Construction"), - "Unknown User" : MessageLookupByLibrary.simpleMessage("Unknown User"), - "Unsaved changes" : MessageLookupByLibrary.simpleMessage("Unsaved changes"), - "Unsupported File" : MessageLookupByLibrary.simpleMessage("Unsupported File"), - "Upload File" : MessageLookupByLibrary.simpleMessage("Upload File"), - "Use Camera" : MessageLookupByLibrary.simpleMessage("Use Camera"), - "Use Dark Theme in Web Content" : MessageLookupByLibrary.simpleMessage("Use Dark Theme in Web Content"), - "User ID" : MessageLookupByLibrary.simpleMessage("User ID"), - "User ID:" : MessageLookupByLibrary.simpleMessage("User ID:"), - "Version Number" : MessageLookupByLibrary.simpleMessage("Version Number"), - "View Description" : MessageLookupByLibrary.simpleMessage("View Description"), - "View error details" : MessageLookupByLibrary.simpleMessage("View error details"), - "View the Privacy Policy" : MessageLookupByLibrary.simpleMessage("View the Privacy Policy"), - "We are currently building this feature for your viewing pleasure." : MessageLookupByLibrary.simpleMessage("We are currently building this feature for your viewing pleasure."), - "We are unable to display this link, it may belong to an institution you currently aren\'t logged in to." : MessageLookupByLibrary.simpleMessage("We are unable to display this link; it may belong to an institution you currently aren\'t logged in to."), - "We couldn\'t find any students associated with this account" : MessageLookupByLibrary.simpleMessage("We couldn\'t find any students associated with this account"), - "We were unable to verify the server for use with this app." : MessageLookupByLibrary.simpleMessage("We were unable to verify the server for use with this app."), - "We’re not sure what happened, but it wasn’t good. Contact us if this keeps happening." : MessageLookupByLibrary.simpleMessage("We’re not sure what happened, but it wasn’t good. Contact us if this keeps happening."), - "What can we do better?" : MessageLookupByLibrary.simpleMessage("What can we do better?"), - "Yes" : MessageLookupByLibrary.simpleMessage("Yes"), - "You are not observing any students." : MessageLookupByLibrary.simpleMessage("You are not observing any students."), - "You may only choose 10 calendars to display" : MessageLookupByLibrary.simpleMessage("You may only choose 10 calendars to display"), - "You must enter a user id" : MessageLookupByLibrary.simpleMessage("You must enter a user id"), - "You must enter a valid domain" : MessageLookupByLibrary.simpleMessage("You must enter a valid domain"), - "You must select at least one calendar to display" : MessageLookupByLibrary.simpleMessage("You must select at least one calendar to display"), - "You will be notified about this assignment on…" : MessageLookupByLibrary.simpleMessage("You will be notified about this assignment on…"), - "You will be notified about this event on…" : MessageLookupByLibrary.simpleMessage("You will be notified about this event on…"), - "You\'ll find the QR code on the web in your account profile. Click \'QR for Mobile Login\' in the list." : MessageLookupByLibrary.simpleMessage("You\'ll find the QR code on the web in your account profile. Click \'QR for Mobile Login\' in the list."), - "You\'ll need to open your student\'s Canvas Student app to continue. Go into Main Menu > Settings > Pair with Observer and scan the QR code you see there." : MessageLookupByLibrary.simpleMessage("You\'ll need to open your student\'s Canvas Student app to continue. Go into Main Menu > Settings > Pair with Observer and scan the QR code you see there."), - "Your code is incorrect or expired." : MessageLookupByLibrary.simpleMessage("Your code is incorrect or expired."), - "Your student’s courses might not be published yet." : MessageLookupByLibrary.simpleMessage("Your students\' courses might not be published yet."), - "You’re all caught up!" : MessageLookupByLibrary.simpleMessage("You’re all caught up!"), - "actingAsUser" : m0, - "alertsLabel" : MessageLookupByLibrary.simpleMessage("Alerts"), - "appVersion" : m1, - "assignmentGradeAboveThreshold" : m2, - "assignmentGradeBelowThreshold" : m3, - "assignmentLockedModule" : m4, - "assignmentSubjectMessage" : m5, - "assignmentTotalPoints" : m6, - "assignmentTotalPointsAccessible" : m7, - "authorToNOthers" : m8, - "authorToRecipient" : m9, - "authorToRecipientAndNOthers" : m10, - "badgeNumberPlus" : m11, - "calendarLabel" : MessageLookupByLibrary.simpleMessage("Calendar"), - "canvasGuides" : MessageLookupByLibrary.simpleMessage("Canvas Guides"), - "canvasLogoLabel" : MessageLookupByLibrary.simpleMessage("Canvas logo"), - "canvasSupport" : MessageLookupByLibrary.simpleMessage("Canvas Support"), - "changeStudentColorLabel" : m12, - "collapse" : MessageLookupByLibrary.simpleMessage("collapse"), - "collapsed" : MessageLookupByLibrary.simpleMessage("collapsed"), - "contentDescriptionScoreOutOfPointsPossible" : m13, - "courseForWhom" : m14, - "courseGradeAboveThreshold" : m15, - "courseGradeBelowThreshold" : m16, - "coursesLabel" : MessageLookupByLibrary.simpleMessage("Courses"), - "dateAtTime" : m17, - "dismissAlertLabel" : m18, - "domainSearchHelpBody" : m19, - "domainSearchHelpLabel" : MessageLookupByLibrary.simpleMessage("How do I find my school or district?"), - "domainSearchInputHint" : MessageLookupByLibrary.simpleMessage("Enter school name or district…"), - "dueDateAtTime" : m20, - "endMasqueradeLogoutMessage" : m21, - "endMasqueradeMessage" : m22, - "eventSubjectMessage" : m23, - "eventTime" : m24, - "expand" : MessageLookupByLibrary.simpleMessage("expand"), - "expanded" : MessageLookupByLibrary.simpleMessage("expanded"), - "finalGrade" : m25, - "findSchool" : MessageLookupByLibrary.simpleMessage("Find School"), - "frontPageSubjectMessage" : m26, - "gradeFormatScoreOutOfPointsPossible" : m27, - "gradesSubjectMessage" : m28, - "latePenalty" : m29, - "me" : MessageLookupByLibrary.simpleMessage("me"), - "messageLinkPostscript" : m30, - "minus" : MessageLookupByLibrary.simpleMessage("minus"), - "mustBeAboveN" : m31, - "mustBeBelowN" : m32, - "next" : MessageLookupByLibrary.simpleMessage("Next"), - "nextMonth" : m33, - "nextWeek" : m34, - "noDomainResults" : m35, - "ok" : MessageLookupByLibrary.simpleMessage("OK"), - "outOfPoints" : m36, - "plusRecipientCount" : m37, - "pointsPossible" : m38, - "previousMonth" : m39, - "previousWeek" : m40, - "qrCreateAccountTos" : m41, - "ratingDialogEmailSubject" : m42, - "selectedMonthLabel" : m43, - "send" : MessageLookupByLibrary.simpleMessage("send"), - "starRating" : m44, - "submissionStatusSuccessSubtitle" : m45, - "syllabusSubjectMessage" : m46, - "unread" : MessageLookupByLibrary.simpleMessage("unread"), - "unreadCount" : m47 - }; -} diff --git a/apps/flutter_parent/lib/l10n/generated/messages_en_AU_unimelb.dart b/apps/flutter_parent/lib/l10n/generated/messages_en_AU_unimelb.dart deleted file mode 100644 index 478b8ede56..0000000000 --- a/apps/flutter_parent/lib/l10n/generated/messages_en_AU_unimelb.dart +++ /dev/null @@ -1,473 +0,0 @@ -// DO NOT EDIT. This is code generated via package:intl/generate_localized.dart -// This is a library that provides messages for a en_AU_unimelb locale. All the -// messages from the main program should be duplicated here with the same -// function name. - -// Ignore issues from commonly used lints in this file. -// ignore_for_file:unnecessary_brace_in_string_interps, unnecessary_new -// ignore_for_file:prefer_single_quotes,comment_references, directives_ordering -// ignore_for_file:annotate_overrides,prefer_generic_function_type_aliases -// ignore_for_file:unused_import, file_names - -import 'package:intl/intl.dart'; -import 'package:intl/message_lookup_by_library.dart'; - -final messages = new MessageLookup(); - -typedef String MessageIfAbsent(String messageStr, List args); - -class MessageLookup extends MessageLookupByLibrary { - String get localeName => 'en_AU_unimelb'; - - static m0(userName) => "You are acting as ${userName}"; - - static m1(version) => "v. ${version}"; - - static m2(threshold) => "Assignment Grade Above ${threshold}"; - - static m3(threshold) => "Assignment Grade Below ${threshold}"; - - static m4(moduleName) => "This assignment is locked by the module \"${moduleName}\"."; - - static m5(studentName, assignmentName) => "Regarding: ${studentName}, Assignment - ${assignmentName}"; - - static m6(points) => "${points} pts"; - - static m7(points) => "${points} points"; - - static m8(authorName, howMany) => "${Intl.plural(howMany, one: '${authorName} to 1 other', other: '${authorName} to ${howMany} others')}"; - - static m9(authorName, recipientName) => "${authorName} to ${recipientName}"; - - static m10(authorName, recipientName, howMany) => "${Intl.plural(howMany, one: '${authorName} to ${recipientName} & 1 other', other: '${authorName} to ${recipientName} & ${howMany} others')}"; - - static m11(count) => "${count}+"; - - static m12(studentName) => "Change colour for ${studentName}"; - - static m13(score, pointsPossible) => "${score} out of ${pointsPossible} points"; - - static m14(studentShortName) => "for ${studentShortName}"; - - static m15(threshold) => "Subject Grade Above ${threshold}"; - - static m16(threshold) => "Subject Grade Below ${threshold}"; - - static m17(date, time) => "${date} at ${time}"; - - static m18(alertTitle) => "Dismiss ${alertTitle}"; - - static m19(canvasGuides, canvasSupport) => "Try searching for the name of the school or district you’re attempting to access, like “Smith Private School” or “Smith County Schools.” You can also enter a Canvas domain directly, like “smith.instructure.com.”\n\nFor more information on finding your institution’s Canvas account, you can visit the ${canvasGuides}, reach out to ${canvasSupport}, or contact your school for assistance."; - - static m20(date, time) => "Due ${date} at ${time}"; - - static m21(userName) => "You will stop acting as ${userName} and will be logged out."; - - static m22(userName) => "You will stop acting as ${userName} and return to your original account."; - - static m23(studentName, eventTitle) => "Regarding: ${studentName}, Event - ${eventTitle}"; - - static m24(startAt, endAt) => "${startAt} - ${endAt}"; - - static m25(grade) => "Final Grade: ${grade}"; - - static m26(studentName) => "Regarding: ${studentName}, Front Page"; - - static m27(score, pointsPossible) => "${score} / ${pointsPossible}"; - - static m28(studentName) => "Regarding: ${studentName}, Grades"; - - static m29(pointsLost) => "Late penalty (-${pointsLost})"; - - static m30(studentName, linkUrl) => "Regarding: ${studentName}, ${linkUrl}"; - - static m31(percentage) => "Must be above ${percentage}"; - - static m32(percentage) => "Must be below ${percentage}"; - - static m33(month) => "Next month: ${month}"; - - static m34(date) => "Next week starting ${date}"; - - static m35(query) => "Unable to find schools matching \"${query}\""; - - static m36(points, howMany) => "${Intl.plural(howMany, one: 'Out of 1 point', other: 'Out of ${points} points')}"; - - static m37(count) => "+${count}"; - - static m38(points) => "${points} points possible"; - - static m39(month) => "Previous month: ${month}"; - - static m40(date) => "Previous week starting ${date}"; - - static m41(termsOfService, privacyPolicy) => "By tapping \'Create Account\', you agree to the ${termsOfService} and acknowledge the ${privacyPolicy}"; - - static m42(version) => "Suggestions for Android - Canvas Parent ${version}"; - - static m43(month) => "Month of ${month}"; - - static m44(position) => "${Intl.plural(position, one: '${position} star', other: '${position} stars')}"; - - static m45(date, time) => "This assignment was submitted on ${date} at ${time} and is waiting to be graded"; - - static m46(studentName) => "Regarding: ${studentName}, Subject Overview"; - - static m47(count) => "${count} unread"; - - final messages = _notInlinedMessages(_notInlinedMessages); - static _notInlinedMessages(_) => { - "\"Act as\" is essentially logging in as this user without a password. You will be able to take any action as if you were this user, and from other users\' points of views, it will be as if this user performed them. However, audit logs record that you were the one who performed the actions on behalf of this user." : MessageLookupByLibrary.simpleMessage("\"Act as\" is essentially logging in as this user without a password. You will be able to take any action as if you were this user, and from other users\' points of views, it will be as if this user performed them. However, audit logs record that you were the one who performed the actions on behalf of this user."), - "-" : MessageLookupByLibrary.simpleMessage("-"), - "A description is required." : MessageLookupByLibrary.simpleMessage("A description is required."), - "A network error occurred when adding this student. Check your connection and try again." : MessageLookupByLibrary.simpleMessage("A network error occurred when adding this student. Check your connection and try again."), - "A subject is required." : MessageLookupByLibrary.simpleMessage("A topic is required."), - "Act As User" : MessageLookupByLibrary.simpleMessage("Act As User"), - "Add Student" : MessageLookupByLibrary.simpleMessage("Add Student"), - "Add attachment" : MessageLookupByLibrary.simpleMessage("Add attachment"), - "Add new student" : MessageLookupByLibrary.simpleMessage("Add new student"), - "Add student with…" : MessageLookupByLibrary.simpleMessage("Add student with…"), - "Alert Settings" : MessageLookupByLibrary.simpleMessage("Alert Settings"), - "Alert me when…" : MessageLookupByLibrary.simpleMessage("Alert me when…"), - "All Grading Periods" : MessageLookupByLibrary.simpleMessage("All Grading Periods"), - "Already have an account? " : MessageLookupByLibrary.simpleMessage("Already have an account? "), - "An email address is required." : MessageLookupByLibrary.simpleMessage("An email address is required."), - "An error occurred when trying to display this link" : MessageLookupByLibrary.simpleMessage("An error occurred when trying to display this link"), - "An error occurred while saving your selection. Please try again." : MessageLookupByLibrary.simpleMessage("An error occurred while saving your selection. Please try again."), - "An unexpected error occurred" : MessageLookupByLibrary.simpleMessage("An unexpected error occurred"), - "Android OS version" : MessageLookupByLibrary.simpleMessage("Android OS version"), - "Appearance" : MessageLookupByLibrary.simpleMessage("Appearance"), - "Application version" : MessageLookupByLibrary.simpleMessage("Application version"), - "Are you a student or teacher?" : MessageLookupByLibrary.simpleMessage("Are you a student or instructor?"), - "Are you sure you want to log out?" : MessageLookupByLibrary.simpleMessage("Are you sure you want to log out?"), - "Are you sure you wish to close this page? Your unsent message will be lost." : MessageLookupByLibrary.simpleMessage("Are you sure you wish to close this page? Your unsent message will be lost."), - "Assignment Details" : MessageLookupByLibrary.simpleMessage("Assignment Details"), - "Assignment grade above" : MessageLookupByLibrary.simpleMessage("Assignment grade above"), - "Assignment grade below" : MessageLookupByLibrary.simpleMessage("Assignment grade below"), - "Assignment missing" : MessageLookupByLibrary.simpleMessage("Assignment missing"), - "Barney, Fuschia" : MessageLookupByLibrary.simpleMessage("Barney, Fuchsia"), - "Calendars" : MessageLookupByLibrary.simpleMessage("Calendars"), - "Camera Permission" : MessageLookupByLibrary.simpleMessage("Camera Permission"), - "Cancel" : MessageLookupByLibrary.simpleMessage("Cancel"), - "Canvas Student" : MessageLookupByLibrary.simpleMessage("Canvas Student"), - "Canvas Teacher" : MessageLookupByLibrary.simpleMessage("Canvas Instructor"), - "Canvas on GitHub" : MessageLookupByLibrary.simpleMessage("Canvas on GitHub"), - "Choose a course to message" : MessageLookupByLibrary.simpleMessage("Choose a subject to message"), - "Choose from Gallery" : MessageLookupByLibrary.simpleMessage("Choose from Gallery"), - "Complete" : MessageLookupByLibrary.simpleMessage("Complete"), - "Contact Support" : MessageLookupByLibrary.simpleMessage("Contact Support"), - "Course Announcement" : MessageLookupByLibrary.simpleMessage("Subject Announcement"), - "Course Announcements" : MessageLookupByLibrary.simpleMessage("Subject Announcements"), - "Course grade above" : MessageLookupByLibrary.simpleMessage("Subject grade above"), - "Course grade below" : MessageLookupByLibrary.simpleMessage("Subject grade below"), - "Create Account" : MessageLookupByLibrary.simpleMessage("Create Account"), - "Dark Mode" : MessageLookupByLibrary.simpleMessage("Dark Mode"), - "Date" : MessageLookupByLibrary.simpleMessage("Date"), - "Delete" : MessageLookupByLibrary.simpleMessage("Delete"), - "Description" : MessageLookupByLibrary.simpleMessage("Description"), - "Device" : MessageLookupByLibrary.simpleMessage("Device"), - "Device model" : MessageLookupByLibrary.simpleMessage("Device model"), - "Domain" : MessageLookupByLibrary.simpleMessage("Domain"), - "Domain:" : MessageLookupByLibrary.simpleMessage("Domain:"), - "Don\'t show again" : MessageLookupByLibrary.simpleMessage("Don\'t show again"), - "Done" : MessageLookupByLibrary.simpleMessage("Done"), - "Download" : MessageLookupByLibrary.simpleMessage("Download"), - "Due" : MessageLookupByLibrary.simpleMessage("Due"), - "EXTREME CRITICAL EMERGENCY!!" : MessageLookupByLibrary.simpleMessage("EXTREME CRITICAL EMERGENCY!!"), - "Electric, blue" : MessageLookupByLibrary.simpleMessage("Electric, blue"), - "Email Address" : MessageLookupByLibrary.simpleMessage("Email Address"), - "Email:" : MessageLookupByLibrary.simpleMessage("Email:"), - "Email…" : MessageLookupByLibrary.simpleMessage("Email…"), - "Enter the student pairing code provided to you. If the pairing code doesn\'t work, it may have expired" : MessageLookupByLibrary.simpleMessage("Enter the student pairing code provided to you. If the pairing code doesn\'t work, it may have expired"), - "Event" : MessageLookupByLibrary.simpleMessage("Event"), - "Excused" : MessageLookupByLibrary.simpleMessage("Excused"), - "Expired QR Code" : MessageLookupByLibrary.simpleMessage("Expired QR Code"), - "Failed. Tap for options." : MessageLookupByLibrary.simpleMessage("Failed. Tap for options."), - "Filter" : MessageLookupByLibrary.simpleMessage("Filter"), - "Filter by" : MessageLookupByLibrary.simpleMessage("Filter by"), - "Fire, Orange" : MessageLookupByLibrary.simpleMessage("Fire, Orange"), - "Front Page" : MessageLookupByLibrary.simpleMessage("Front Page"), - "Full Name" : MessageLookupByLibrary.simpleMessage("Full Name"), - "Full Name…" : MessageLookupByLibrary.simpleMessage("Full Name…"), - "Full error message" : MessageLookupByLibrary.simpleMessage("Full error message"), - "Go to today" : MessageLookupByLibrary.simpleMessage("Go to today"), - "Grade" : MessageLookupByLibrary.simpleMessage("Grade"), - "Grade percentage" : MessageLookupByLibrary.simpleMessage("Grade percentage"), - "Graded" : MessageLookupByLibrary.simpleMessage("Graded"), - "Grades" : MessageLookupByLibrary.simpleMessage("Grades"), - "Help" : MessageLookupByLibrary.simpleMessage("Help"), - "Hide Password" : MessageLookupByLibrary.simpleMessage("Hide Password"), - "High Contrast Mode" : MessageLookupByLibrary.simpleMessage("High Contrast Mode"), - "How are we doing?" : MessageLookupByLibrary.simpleMessage("How are we doing?"), - "How is this affecting you?" : MessageLookupByLibrary.simpleMessage("How is this affecting you?"), - "I can\'t get things done until I hear back from you." : MessageLookupByLibrary.simpleMessage("I can\'t get things done until I hear back from you."), - "I don\'t have a Canvas account" : MessageLookupByLibrary.simpleMessage("I don\'t have a Canvas account"), - "I have a Canvas account" : MessageLookupByLibrary.simpleMessage("I have a Canvas account"), - "I need some help but it\'s not urgent." : MessageLookupByLibrary.simpleMessage("I need some help, but it\'s not urgent."), - "I\'m having trouble logging in" : MessageLookupByLibrary.simpleMessage("I\'m having trouble logging in"), - "Idea for Canvas Parent App [Android]" : MessageLookupByLibrary.simpleMessage("Idea for Canvas Parent App [Android]"), - "In order to provide you with a better experience, we have updated how reminders work. You can add new reminders by viewing an assignment or calendar event and tapping the switch under the \"Remind Me\" section.\n\nBe aware that any reminders created with older versions of this app will not be compatible with the new changes and you will need to create them again." : MessageLookupByLibrary.simpleMessage("In order to provide you with a better experience, we have updated how reminders work. You can add new reminders by viewing an assignment or calendar event and tapping the switch under the \"Remind Me\" section.\n\nBe aware that any reminders created with older versions of this app will not be compatible with the new changes and you will need to create them again."), - "Inbox" : MessageLookupByLibrary.simpleMessage("Inbox"), - "Inbox Zero" : MessageLookupByLibrary.simpleMessage("Inbox Zero"), - "Incomplete" : MessageLookupByLibrary.simpleMessage("Incomplete"), - "Incorrect Domain" : MessageLookupByLibrary.simpleMessage("Incorrect Domain"), - "Institution Announcement" : MessageLookupByLibrary.simpleMessage("Institution Announcement"), - "Institution Announcements" : MessageLookupByLibrary.simpleMessage("Institution Announcements"), - "Instructions" : MessageLookupByLibrary.simpleMessage("Instructions"), - "Interactions on this page are limited by your institution." : MessageLookupByLibrary.simpleMessage("Interactions on this page are limited by your institution."), - "Invalid QR Code" : MessageLookupByLibrary.simpleMessage("Invalid QR Code"), - "It looks like a great day to rest, relax, and recharge." : MessageLookupByLibrary.simpleMessage("It looks like a great day to rest, relax, and recharge."), - "It looks like assignments haven\'t been created in this space yet." : MessageLookupByLibrary.simpleMessage("It looks like assignments haven\'t been created in this space yet."), - "Just a casual question, comment, idea, suggestion…" : MessageLookupByLibrary.simpleMessage("Just a casual question, comment, idea, suggestion…"), - "Late" : MessageLookupByLibrary.simpleMessage("Late"), - "Launch External Tool" : MessageLookupByLibrary.simpleMessage("Launch External Tool"), - "Legal" : MessageLookupByLibrary.simpleMessage("Legal"), - "Light Mode" : MessageLookupByLibrary.simpleMessage("Light Mode"), - "Link Error" : MessageLookupByLibrary.simpleMessage("Link Error"), - "Locale:" : MessageLookupByLibrary.simpleMessage("Locale:"), - "Locate QR Code" : MessageLookupByLibrary.simpleMessage("Locate QR Code"), - "Location" : MessageLookupByLibrary.simpleMessage("Location"), - "Locked" : MessageLookupByLibrary.simpleMessage("Locked"), - "Log Out" : MessageLookupByLibrary.simpleMessage("Log Out"), - "Login flow: Canvas" : MessageLookupByLibrary.simpleMessage("Login flow: Canvas"), - "Login flow: Normal" : MessageLookupByLibrary.simpleMessage("Login flow: Normal"), - "Login flow: Site Admin" : MessageLookupByLibrary.simpleMessage("Login flow: Site Admin"), - "Login flow: Skip mobile verify" : MessageLookupByLibrary.simpleMessage("Login flow: Skip mobile verify"), - "Manage Students" : MessageLookupByLibrary.simpleMessage("Manage Students"), - "Message" : MessageLookupByLibrary.simpleMessage("Message"), - "Message subject" : MessageLookupByLibrary.simpleMessage("Message topic"), - "Missing" : MessageLookupByLibrary.simpleMessage("Missing"), - "Must be below 100" : MessageLookupByLibrary.simpleMessage("Must be below 100"), - "Network error" : MessageLookupByLibrary.simpleMessage("Network error"), - "Never" : MessageLookupByLibrary.simpleMessage("Never"), - "New message" : MessageLookupByLibrary.simpleMessage("New message"), - "No" : MessageLookupByLibrary.simpleMessage("No"), - "No Alerts" : MessageLookupByLibrary.simpleMessage("No Alerts"), - "No Assignments" : MessageLookupByLibrary.simpleMessage("No Assignments"), - "No Courses" : MessageLookupByLibrary.simpleMessage("No Subjects"), - "No Due Date" : MessageLookupByLibrary.simpleMessage("No Due Date"), - "No Events Today!" : MessageLookupByLibrary.simpleMessage("No Events Today!"), - "No Grade" : MessageLookupByLibrary.simpleMessage("No Grade"), - "No Location Specified" : MessageLookupByLibrary.simpleMessage("No Location Specified"), - "No Students" : MessageLookupByLibrary.simpleMessage("No Students"), - "No Subject" : MessageLookupByLibrary.simpleMessage("No Topic"), - "No Summary" : MessageLookupByLibrary.simpleMessage("No Summary"), - "No description" : MessageLookupByLibrary.simpleMessage("No description"), - "No recipients selected" : MessageLookupByLibrary.simpleMessage("No recipients selected"), - "Not Graded" : MessageLookupByLibrary.simpleMessage("Not Graded"), - "Not Submitted" : MessageLookupByLibrary.simpleMessage("Not Submitted"), - "Not a parent?" : MessageLookupByLibrary.simpleMessage("Not a parent?"), - "Notifications for reminders about assignments and calendar events" : MessageLookupByLibrary.simpleMessage("Notifications for reminders about assignments and calendar events"), - "OS Version" : MessageLookupByLibrary.simpleMessage("OS Version"), - "Observer" : MessageLookupByLibrary.simpleMessage("Auditor"), - "One of our other apps might be a better fit. Tap one to visit the Play Store." : MessageLookupByLibrary.simpleMessage("One of our other apps might be a better fit. Tap one to visit the Play Store."), - "Open Canvas Student" : MessageLookupByLibrary.simpleMessage("Open Canvas Student"), - "Open In Browser" : MessageLookupByLibrary.simpleMessage("Open In Browser"), - "Open with another app" : MessageLookupByLibrary.simpleMessage("Open with another app"), - "Pairing Code" : MessageLookupByLibrary.simpleMessage("Pairing Code"), - "Password" : MessageLookupByLibrary.simpleMessage("Password"), - "Password is required" : MessageLookupByLibrary.simpleMessage("Password is required"), - "Password must contain at least 8 characters" : MessageLookupByLibrary.simpleMessage("Password must contain at least 8 characters"), - "Password…" : MessageLookupByLibrary.simpleMessage("Password…"), - "Planner Note" : MessageLookupByLibrary.simpleMessage("Planner Note"), - "Please enter a valid email address" : MessageLookupByLibrary.simpleMessage("Please enter a valid email address"), - "Please enter an email address" : MessageLookupByLibrary.simpleMessage("Please enter an email address"), - "Please enter full name" : MessageLookupByLibrary.simpleMessage("Please enter full name"), - "Please scan a QR code generated by Canvas" : MessageLookupByLibrary.simpleMessage("Please scan a QR code generated by Canvas"), - "Plum, Purple" : MessageLookupByLibrary.simpleMessage("Plum, Purple"), - "Preparing…" : MessageLookupByLibrary.simpleMessage("Preparing…"), - "Previous Logins" : MessageLookupByLibrary.simpleMessage("Previous Logins"), - "Privacy Policy" : MessageLookupByLibrary.simpleMessage("Privacy Policy"), - "Privacy Policy Link" : MessageLookupByLibrary.simpleMessage("Privacy Policy Link"), - "Privacy policy, terms of use, open source" : MessageLookupByLibrary.simpleMessage("Privacy policy, terms of use, open source"), - "QR Code" : MessageLookupByLibrary.simpleMessage("QR Code"), - "QR scanning requires camera access" : MessageLookupByLibrary.simpleMessage("QR scanning requires camera access"), - "Raspberry, Red" : MessageLookupByLibrary.simpleMessage("Raspberry, Red"), - "Recipients" : MessageLookupByLibrary.simpleMessage("Recipients"), - "Refresh" : MessageLookupByLibrary.simpleMessage("Refresh"), - "Remind Me" : MessageLookupByLibrary.simpleMessage("Remind Me"), - "Reminders" : MessageLookupByLibrary.simpleMessage("Reminders"), - "Reminders have changed!" : MessageLookupByLibrary.simpleMessage("Reminders have changed!"), - "Reply" : MessageLookupByLibrary.simpleMessage("Reply"), - "Reply All" : MessageLookupByLibrary.simpleMessage("Reply All"), - "Report A Problem" : MessageLookupByLibrary.simpleMessage("Report A Problem"), - "Request Login Help" : MessageLookupByLibrary.simpleMessage("Request Login Help"), - "Request Login Help Button" : MessageLookupByLibrary.simpleMessage("Request Login Help Button"), - "Restart app" : MessageLookupByLibrary.simpleMessage("Restart app"), - "Retry" : MessageLookupByLibrary.simpleMessage("Retry"), - "Return to Login" : MessageLookupByLibrary.simpleMessage("Return to Login"), - "STUDENT" : MessageLookupByLibrary.simpleMessage("STUDENT"), - "Screenshot showing location of QR code generation in browser" : MessageLookupByLibrary.simpleMessage("Screenshot showing location of QR code generation in browser"), - "Screenshot showing location of pairing QR code generation in the Canvas Student app" : MessageLookupByLibrary.simpleMessage("Screenshot showing location of pairing QR code generation in the Canvas Student app"), - "Select" : MessageLookupByLibrary.simpleMessage("Select"), - "Select Student Color" : MessageLookupByLibrary.simpleMessage("Select Student Colour"), - "Select recipients" : MessageLookupByLibrary.simpleMessage("Select recipients"), - "Send Feedback" : MessageLookupByLibrary.simpleMessage("Send Feedback"), - "Send a message about this assignment" : MessageLookupByLibrary.simpleMessage("Send a message about this assignment"), - "Send a message about this course" : MessageLookupByLibrary.simpleMessage("Send a message about this subject"), - "Send message" : MessageLookupByLibrary.simpleMessage("Send message"), - "Set a date and time to be notified of this event." : MessageLookupByLibrary.simpleMessage("Set a date and time to be notified of this event."), - "Set a date and time to be notified of this specific assignment." : MessageLookupByLibrary.simpleMessage("Set a date and time to be notified of this specific assignment."), - "Settings" : MessageLookupByLibrary.simpleMessage("Settings"), - "Shamrock, Green" : MessageLookupByLibrary.simpleMessage("Shamrock, Green"), - "Share Your Love for the App" : MessageLookupByLibrary.simpleMessage("Share Your Love for the App"), - "Show Password" : MessageLookupByLibrary.simpleMessage("Show Password"), - "Sign In" : MessageLookupByLibrary.simpleMessage("Sign In"), - "Something went wrong trying to create your account, please reach out to your school for assistance." : MessageLookupByLibrary.simpleMessage("Something went wrong trying to create your account, please reach out to your school for assistance."), - "Something\'s broken but I can work around it to get what I need done." : MessageLookupByLibrary.simpleMessage("Something\'s broken, but I can work around it to get what I need done."), - "Stop Acting as User" : MessageLookupByLibrary.simpleMessage("Stop Acting as User"), - "Student" : MessageLookupByLibrary.simpleMessage("Student"), - "Student Pairing" : MessageLookupByLibrary.simpleMessage("Student Pairing"), - "Students can create a QR code using the Canvas Student app on their mobile device" : MessageLookupByLibrary.simpleMessage("Students can create a QR code using the Canvas Student app on their mobile device"), - "Students can obtain a pairing code through the Canvas website" : MessageLookupByLibrary.simpleMessage("Students can obtain a pairing code through the Canvas website"), - "Subject" : MessageLookupByLibrary.simpleMessage("Topic"), - "Submitted" : MessageLookupByLibrary.simpleMessage("Submitted"), - "Successfully submitted!" : MessageLookupByLibrary.simpleMessage("Successfully submitted!"), - "Summary" : MessageLookupByLibrary.simpleMessage("Summary"), - "Switch Users" : MessageLookupByLibrary.simpleMessage("Switch Users"), - "Syllabus" : MessageLookupByLibrary.simpleMessage("Subject Overview"), - "TA" : MessageLookupByLibrary.simpleMessage("Tutor"), - "TEACHER" : MessageLookupByLibrary.simpleMessage("INSTRUCTOR"), - "Tap to favorite the courses you want to see on the Calendar. Select up to 10." : MessageLookupByLibrary.simpleMessage("Tap to favourite the subjects you want to see on the Calendar. Select up to 10."), - "Tap to pair with a new student" : MessageLookupByLibrary.simpleMessage("Tap to pair with a new student"), - "Tap to select this student" : MessageLookupByLibrary.simpleMessage("Tap to select this student"), - "Tap to show student selector" : MessageLookupByLibrary.simpleMessage("Tap to show student selector"), - "Teacher" : MessageLookupByLibrary.simpleMessage("Instructor"), - "Tell us about your favorite parts of the app" : MessageLookupByLibrary.simpleMessage("Tell us about your favourite parts of the app."), - "Terms of Service" : MessageLookupByLibrary.simpleMessage("Terms of Service"), - "Terms of Service Link" : MessageLookupByLibrary.simpleMessage("Terms of Service Link"), - "Terms of Use" : MessageLookupByLibrary.simpleMessage("Terms of Use"), - "The QR code you scanned may have expired. Refresh the code on the student\'s device and try again." : MessageLookupByLibrary.simpleMessage("The QR code you scanned may have expired. Refresh the code on the student\'s device and try again."), - "The following information will help us better understand your idea:" : MessageLookupByLibrary.simpleMessage("The following information will help us better understand your idea:"), - "The server you entered is not authorized for this app." : MessageLookupByLibrary.simpleMessage("The server you entered is not authorised for this app."), - "The student you are trying to add belongs to a different school. Log in or create an account with that school to scan this code." : MessageLookupByLibrary.simpleMessage("The student you are trying to add belongs to a different school. Log in or create an account with that school to scan this code."), - "The user agent for this app is not authorized." : MessageLookupByLibrary.simpleMessage("The user agent for this app is not authorised."), - "Theme" : MessageLookupByLibrary.simpleMessage("Theme"), - "There are no installed applications that can open this file" : MessageLookupByLibrary.simpleMessage("There are no installed applications that can open this file"), - "There is no page information available." : MessageLookupByLibrary.simpleMessage("There is no page information available."), - "There was a problem loading the Terms of Use" : MessageLookupByLibrary.simpleMessage("There was a problem loading the Terms of Use"), - "There was a problem removing this student from your account. Please check your connection and try again." : MessageLookupByLibrary.simpleMessage("There was a problem removing this student from your account. Please check your connection and try again."), - "There was an error loading recipients for this course" : MessageLookupByLibrary.simpleMessage("There was an error loading recipients for this subject"), - "There was an error loading the summary details for this course." : MessageLookupByLibrary.simpleMessage("There was an error loading the summary details for this subject."), - "There was an error loading this announcement" : MessageLookupByLibrary.simpleMessage("There was an error loading this announcement"), - "There was an error loading this conversation" : MessageLookupByLibrary.simpleMessage("There was an error loading this conversation"), - "There was an error loading this file" : MessageLookupByLibrary.simpleMessage("There was an error loading this file"), - "There was an error loading your inbox messages." : MessageLookupByLibrary.simpleMessage("There was an error loading your inbox messages."), - "There was an error loading your student\'s alerts." : MessageLookupByLibrary.simpleMessage("There was an error loading your students\' alerts."), - "There was an error loading your student\'s calendar" : MessageLookupByLibrary.simpleMessage("There was an error loading your student\'s calendar"), - "There was an error loading your students." : MessageLookupByLibrary.simpleMessage("There was an error loading your students."), - "There was an error loading your student’s courses." : MessageLookupByLibrary.simpleMessage("There was an error loading your student’s subjects."), - "There was an error logging in. Please generate another QR Code and try again." : MessageLookupByLibrary.simpleMessage("There was an error logging in. Please generate another QR Code and try again."), - "There was an error trying to act as this user. Please check the Domain and User ID and try again." : MessageLookupByLibrary.simpleMessage("There was an error trying to act as this user. Please check the Domain and User ID and try again."), - "There’s nothing to be notified of yet." : MessageLookupByLibrary.simpleMessage("There’s nothing to be notified of yet."), - "This app is not authorized for use." : MessageLookupByLibrary.simpleMessage("This app is not authorised for use."), - "This course does not have any assignments or calendar events yet." : MessageLookupByLibrary.simpleMessage("This subject does not have any assignments or calendar events yet."), - "This file is unsupported and can’t be viewed through the app" : MessageLookupByLibrary.simpleMessage("This file is unsupported and can’t be viewed through the app"), - "This will unpair and remove all enrollments for this student from your account." : MessageLookupByLibrary.simpleMessage("This will unpair and remove all enrolments for this student from your account."), - "Total Grade" : MessageLookupByLibrary.simpleMessage("Total Grade"), - "Uh oh!" : MessageLookupByLibrary.simpleMessage("Uh oh!"), - "Unable to fetch courses. Please check your connection and try again." : MessageLookupByLibrary.simpleMessage("Unable to fetch subjects. Please check your connection and try again."), - "Unable to load this image" : MessageLookupByLibrary.simpleMessage("Unable to load this image"), - "Unable to play this media file" : MessageLookupByLibrary.simpleMessage("Unable to play this media file"), - "Unable to send message. Check your connection and try again." : MessageLookupByLibrary.simpleMessage("Unable to send message. Check your connection and try again."), - "Under Construction" : MessageLookupByLibrary.simpleMessage("Under Construction"), - "Unknown User" : MessageLookupByLibrary.simpleMessage("Unknown User"), - "Unsaved changes" : MessageLookupByLibrary.simpleMessage("Unsaved changes"), - "Unsupported File" : MessageLookupByLibrary.simpleMessage("Unsupported File"), - "Upload File" : MessageLookupByLibrary.simpleMessage("Upload File"), - "Use Camera" : MessageLookupByLibrary.simpleMessage("Use Camera"), - "Use Dark Theme in Web Content" : MessageLookupByLibrary.simpleMessage("Use Dark Theme in Web Content"), - "User ID" : MessageLookupByLibrary.simpleMessage("User ID"), - "User ID:" : MessageLookupByLibrary.simpleMessage("User ID:"), - "Version Number" : MessageLookupByLibrary.simpleMessage("Version Number"), - "View Description" : MessageLookupByLibrary.simpleMessage("View Description"), - "View error details" : MessageLookupByLibrary.simpleMessage("View error details"), - "View the Privacy Policy" : MessageLookupByLibrary.simpleMessage("View the Privacy Policy"), - "We are currently building this feature for your viewing pleasure." : MessageLookupByLibrary.simpleMessage("We are currently building this feature for your viewing pleasure."), - "We are unable to display this link, it may belong to an institution you currently aren\'t logged in to." : MessageLookupByLibrary.simpleMessage("We are unable to display this link; it may belong to an institution you currently aren\'t logged in to."), - "We couldn\'t find any students associated with this account" : MessageLookupByLibrary.simpleMessage("We couldn\'t find any students associated with this account"), - "We were unable to verify the server for use with this app." : MessageLookupByLibrary.simpleMessage("We were unable to verify the server for use with this app."), - "We’re not sure what happened, but it wasn’t good. Contact us if this keeps happening." : MessageLookupByLibrary.simpleMessage("We’re not sure what happened, but it wasn’t good. Contact us if this keeps happening."), - "What can we do better?" : MessageLookupByLibrary.simpleMessage("What can we do better?"), - "Yes" : MessageLookupByLibrary.simpleMessage("Yes"), - "You are not observing any students." : MessageLookupByLibrary.simpleMessage("You are not auditing any students."), - "You may only choose 10 calendars to display" : MessageLookupByLibrary.simpleMessage("You may only choose 10 calendars to display"), - "You must enter a user id" : MessageLookupByLibrary.simpleMessage("You must enter a user id"), - "You must enter a valid domain" : MessageLookupByLibrary.simpleMessage("You must enter a valid domain"), - "You must select at least one calendar to display" : MessageLookupByLibrary.simpleMessage("You must select at least one calendar to display"), - "You will be notified about this assignment on…" : MessageLookupByLibrary.simpleMessage("You will be notified about this assignment on…"), - "You will be notified about this event on…" : MessageLookupByLibrary.simpleMessage("You will be notified about this event on…"), - "You\'ll find the QR code on the web in your account profile. Click \'QR for Mobile Login\' in the list." : MessageLookupByLibrary.simpleMessage("You\'ll find the QR code on the web in your account profile. Click \'QR for Mobile Login\' in the list."), - "You\'ll need to open your student\'s Canvas Student app to continue. Go into Main Menu > Settings > Pair with Observer and scan the QR code you see there." : MessageLookupByLibrary.simpleMessage("You\'ll need to open your student\'s Canvas Student app to continue. Go into Main Menu > Settings > Pair with Auditor and scan the QR code you see there."), - "Your code is incorrect or expired." : MessageLookupByLibrary.simpleMessage("Your code is incorrect or expired."), - "Your student’s courses might not be published yet." : MessageLookupByLibrary.simpleMessage("Your students\' subjects might not be published yet."), - "You’re all caught up!" : MessageLookupByLibrary.simpleMessage("You’re all caught up!"), - "actingAsUser" : m0, - "alertsLabel" : MessageLookupByLibrary.simpleMessage("Alerts"), - "appVersion" : m1, - "assignmentGradeAboveThreshold" : m2, - "assignmentGradeBelowThreshold" : m3, - "assignmentLockedModule" : m4, - "assignmentSubjectMessage" : m5, - "assignmentTotalPoints" : m6, - "assignmentTotalPointsAccessible" : m7, - "authorToNOthers" : m8, - "authorToRecipient" : m9, - "authorToRecipientAndNOthers" : m10, - "badgeNumberPlus" : m11, - "calendarLabel" : MessageLookupByLibrary.simpleMessage("Calendar"), - "canvasGuides" : MessageLookupByLibrary.simpleMessage("Canvas Guides"), - "canvasLogoLabel" : MessageLookupByLibrary.simpleMessage("Canvas logo"), - "canvasSupport" : MessageLookupByLibrary.simpleMessage("Canvas Support"), - "changeStudentColorLabel" : m12, - "collapse" : MessageLookupByLibrary.simpleMessage("collapse"), - "collapsed" : MessageLookupByLibrary.simpleMessage("collapsed"), - "contentDescriptionScoreOutOfPointsPossible" : m13, - "courseForWhom" : m14, - "courseGradeAboveThreshold" : m15, - "courseGradeBelowThreshold" : m16, - "coursesLabel" : MessageLookupByLibrary.simpleMessage("Subjects"), - "dateAtTime" : m17, - "dismissAlertLabel" : m18, - "domainSearchHelpBody" : m19, - "domainSearchHelpLabel" : MessageLookupByLibrary.simpleMessage("How do I find my school or district?"), - "domainSearchInputHint" : MessageLookupByLibrary.simpleMessage("Enter school name or district…"), - "dueDateAtTime" : m20, - "endMasqueradeLogoutMessage" : m21, - "endMasqueradeMessage" : m22, - "eventSubjectMessage" : m23, - "eventTime" : m24, - "expand" : MessageLookupByLibrary.simpleMessage("expand"), - "expanded" : MessageLookupByLibrary.simpleMessage("expanded"), - "finalGrade" : m25, - "findSchool" : MessageLookupByLibrary.simpleMessage("Find School"), - "frontPageSubjectMessage" : m26, - "gradeFormatScoreOutOfPointsPossible" : m27, - "gradesSubjectMessage" : m28, - "latePenalty" : m29, - "me" : MessageLookupByLibrary.simpleMessage("me"), - "messageLinkPostscript" : m30, - "minus" : MessageLookupByLibrary.simpleMessage("minus"), - "mustBeAboveN" : m31, - "mustBeBelowN" : m32, - "next" : MessageLookupByLibrary.simpleMessage("Next"), - "nextMonth" : m33, - "nextWeek" : m34, - "noDomainResults" : m35, - "ok" : MessageLookupByLibrary.simpleMessage("OK"), - "outOfPoints" : m36, - "plusRecipientCount" : m37, - "pointsPossible" : m38, - "previousMonth" : m39, - "previousWeek" : m40, - "qrCreateAccountTos" : m41, - "ratingDialogEmailSubject" : m42, - "selectedMonthLabel" : m43, - "send" : MessageLookupByLibrary.simpleMessage("send"), - "starRating" : m44, - "submissionStatusSuccessSubtitle" : m45, - "syllabusSubjectMessage" : m46, - "unread" : MessageLookupByLibrary.simpleMessage("unread"), - "unreadCount" : m47 - }; -} diff --git a/apps/flutter_parent/lib/l10n/generated/messages_en_CA.dart b/apps/flutter_parent/lib/l10n/generated/messages_en_CA.dart deleted file mode 100644 index 5c2830544a..0000000000 --- a/apps/flutter_parent/lib/l10n/generated/messages_en_CA.dart +++ /dev/null @@ -1,473 +0,0 @@ -// DO NOT EDIT. This is code generated via package:intl/generate_localized.dart -// This is a library that provides messages for a en_CA locale. All the -// messages from the main program should be duplicated here with the same -// function name. - -// Ignore issues from commonly used lints in this file. -// ignore_for_file:unnecessary_brace_in_string_interps, unnecessary_new -// ignore_for_file:prefer_single_quotes,comment_references, directives_ordering -// ignore_for_file:annotate_overrides,prefer_generic_function_type_aliases -// ignore_for_file:unused_import, file_names - -import 'package:intl/intl.dart'; -import 'package:intl/message_lookup_by_library.dart'; - -final messages = new MessageLookup(); - -typedef String MessageIfAbsent(String messageStr, List args); - -class MessageLookup extends MessageLookupByLibrary { - String get localeName => 'en_CA'; - - static m0(userName) => "You are acting as ${userName}"; - - static m1(version) => "v. ${version}"; - - static m2(threshold) => "Assignment Grade Above ${threshold}"; - - static m3(threshold) => "Assignment Grade Below ${threshold}"; - - static m4(moduleName) => "This assignment is locked by the module \"${moduleName}\"."; - - static m5(studentName, assignmentName) => "Regarding: ${studentName}, Assignment - ${assignmentName}"; - - static m6(points) => "${points} pts"; - - static m7(points) => "${points} points"; - - static m8(authorName, howMany) => "${Intl.plural(howMany, one: '${authorName} to 1 other', other: '${authorName} to ${howMany} others')}"; - - static m9(authorName, recipientName) => "${authorName} to ${recipientName}"; - - static m10(authorName, recipientName, howMany) => "${Intl.plural(howMany, one: '${authorName} to ${recipientName} & 1 other', other: '${authorName} to ${recipientName} & ${howMany} others')}"; - - static m11(count) => "${count}+"; - - static m12(studentName) => "Change color for ${studentName}"; - - static m13(score, pointsPossible) => "${score} out of ${pointsPossible} points"; - - static m14(studentShortName) => "for ${studentShortName}"; - - static m15(threshold) => "Course Grade Above ${threshold}"; - - static m16(threshold) => "Course Grade Below ${threshold}"; - - static m17(date, time) => "${date} at ${time}"; - - static m18(alertTitle) => "Dismiss ${alertTitle}"; - - static m19(canvasGuides, canvasSupport) => "Try searching for the name of the school or district you’re attempting to access, like “Smith Private School” or “Smith County Schools.” You can also enter a Canvas domain directly, like “smith.instructure.com.”\n\nFor more information on finding your institution’s Canvas account, you can visit the ${canvasGuides}, reach out to ${canvasSupport}, or contact your school for assistance."; - - static m20(date, time) => "Due ${date} at ${time}"; - - static m21(userName) => "You will stop acting as ${userName} and will be logged out."; - - static m22(userName) => "You will stop acting as ${userName} and return to your original account."; - - static m23(studentName, eventTitle) => "Regarding: ${studentName}, Event - ${eventTitle}"; - - static m24(startAt, endAt) => "${startAt} - ${endAt}"; - - static m25(grade) => "Final Grade: ${grade}"; - - static m26(studentName) => "Regarding: ${studentName}, Front Page"; - - static m27(score, pointsPossible) => "${score} / ${pointsPossible}"; - - static m28(studentName) => "Regarding: ${studentName}, Grades"; - - static m29(pointsLost) => "Late penalty (-${pointsLost})"; - - static m30(studentName, linkUrl) => "Regarding: ${studentName}, ${linkUrl}"; - - static m31(percentage) => "Must be above ${percentage}"; - - static m32(percentage) => "Must be below ${percentage}"; - - static m33(month) => "Next month: ${month}"; - - static m34(date) => "Next week starting ${date}"; - - static m35(query) => "Unable to find schools matching \"${query}\""; - - static m36(points, howMany) => "${Intl.plural(howMany, one: 'Out of 1 point', other: 'Out of ${points} points')}"; - - static m37(count) => "+${count}"; - - static m38(points) => "${points} points possible"; - - static m39(month) => "Previous month: ${month}"; - - static m40(date) => "Previous week starting ${date}"; - - static m41(termsOfService, privacyPolicy) => "By tapping \'Create Account\', you agree to the ${termsOfService} and acknowledge the ${privacyPolicy}"; - - static m42(version) => "Suggestions for Android - Canvas Parent ${version}"; - - static m43(month) => "Month of ${month}"; - - static m44(position) => "${Intl.plural(position, one: '${position} star', other: '${position} stars')}"; - - static m45(date, time) => "This assignment was submitted on ${date} at ${time} and is waiting to be graded"; - - static m46(studentName) => "Regarding: ${studentName}, Syllabus"; - - static m47(count) => "${count} unread"; - - final messages = _notInlinedMessages(_notInlinedMessages); - static _notInlinedMessages(_) => { - "\"Act as\" is essentially logging in as this user without a password. You will be able to take any action as if you were this user, and from other users\' points of views, it will be as if this user performed them. However, audit logs record that you were the one who performed the actions on behalf of this user." : MessageLookupByLibrary.simpleMessage("\"Act as\" is essentially logging in as this user without a password. You will be able to take any action as if you were this user, and from other users\' points of views, it will be as if this user performed them. However, audit logs record that you were the one who performed the actions on behalf of this user."), - "-" : MessageLookupByLibrary.simpleMessage("-"), - "A description is required." : MessageLookupByLibrary.simpleMessage("A description is required."), - "A network error occurred when adding this student. Check your connection and try again." : MessageLookupByLibrary.simpleMessage("A network error occurred when adding this student. Check your connection and try again."), - "A subject is required." : MessageLookupByLibrary.simpleMessage("A subject is required."), - "Act As User" : MessageLookupByLibrary.simpleMessage("Act As User"), - "Add Student" : MessageLookupByLibrary.simpleMessage("Add Student"), - "Add attachment" : MessageLookupByLibrary.simpleMessage("Add attachment"), - "Add new student" : MessageLookupByLibrary.simpleMessage("Add new student"), - "Add student with…" : MessageLookupByLibrary.simpleMessage("Add student with…"), - "Alert Settings" : MessageLookupByLibrary.simpleMessage("Alert Settings"), - "Alert me when…" : MessageLookupByLibrary.simpleMessage("Alert me when…"), - "All Grading Periods" : MessageLookupByLibrary.simpleMessage("All Grading Periods"), - "Already have an account? " : MessageLookupByLibrary.simpleMessage("Already have an account? "), - "An email address is required." : MessageLookupByLibrary.simpleMessage("An email address is required."), - "An error occurred when trying to display this link" : MessageLookupByLibrary.simpleMessage("An error occurred when trying to display this link"), - "An error occurred while saving your selection. Please try again." : MessageLookupByLibrary.simpleMessage("An error occurred while saving your selection. Please try again."), - "An unexpected error occurred" : MessageLookupByLibrary.simpleMessage("An unexpected error occurred"), - "Android OS version" : MessageLookupByLibrary.simpleMessage("Android OS version"), - "Appearance" : MessageLookupByLibrary.simpleMessage("Appearance"), - "Application version" : MessageLookupByLibrary.simpleMessage("Application version"), - "Are you a student or teacher?" : MessageLookupByLibrary.simpleMessage("Are you a student or teacher?"), - "Are you sure you want to log out?" : MessageLookupByLibrary.simpleMessage("Are you sure you want to log out?"), - "Are you sure you wish to close this page? Your unsent message will be lost." : MessageLookupByLibrary.simpleMessage("Are you sure you wish to close this page? Your unsent message will be lost."), - "Assignment Details" : MessageLookupByLibrary.simpleMessage("Assignment Details"), - "Assignment grade above" : MessageLookupByLibrary.simpleMessage("Assignment grade above"), - "Assignment grade below" : MessageLookupByLibrary.simpleMessage("Assignment grade below"), - "Assignment missing" : MessageLookupByLibrary.simpleMessage("Assignment missing"), - "Barney, Fuschia" : MessageLookupByLibrary.simpleMessage("Barney, Fuschia"), - "Calendars" : MessageLookupByLibrary.simpleMessage("Calendars"), - "Camera Permission" : MessageLookupByLibrary.simpleMessage("Camera Permission"), - "Cancel" : MessageLookupByLibrary.simpleMessage("Cancel"), - "Canvas Student" : MessageLookupByLibrary.simpleMessage("Canvas Student"), - "Canvas Teacher" : MessageLookupByLibrary.simpleMessage("Canvas Teacher"), - "Canvas on GitHub" : MessageLookupByLibrary.simpleMessage("Canvas on GitHub"), - "Choose a course to message" : MessageLookupByLibrary.simpleMessage("Choose a course to message"), - "Choose from Gallery" : MessageLookupByLibrary.simpleMessage("Choose from Gallery"), - "Complete" : MessageLookupByLibrary.simpleMessage("Complete"), - "Contact Support" : MessageLookupByLibrary.simpleMessage("Contact Support"), - "Course Announcement" : MessageLookupByLibrary.simpleMessage("Course Announcement"), - "Course Announcements" : MessageLookupByLibrary.simpleMessage("Course Announcements"), - "Course grade above" : MessageLookupByLibrary.simpleMessage("Course grade above"), - "Course grade below" : MessageLookupByLibrary.simpleMessage("Course grade below"), - "Create Account" : MessageLookupByLibrary.simpleMessage("Create Account"), - "Dark Mode" : MessageLookupByLibrary.simpleMessage("Dark Mode"), - "Date" : MessageLookupByLibrary.simpleMessage("Date"), - "Delete" : MessageLookupByLibrary.simpleMessage("Delete"), - "Description" : MessageLookupByLibrary.simpleMessage("Description"), - "Device" : MessageLookupByLibrary.simpleMessage("Device"), - "Device model" : MessageLookupByLibrary.simpleMessage("Device model"), - "Domain" : MessageLookupByLibrary.simpleMessage("Domain"), - "Domain:" : MessageLookupByLibrary.simpleMessage("Domain:"), - "Don\'t show again" : MessageLookupByLibrary.simpleMessage("Don\'t show again"), - "Done" : MessageLookupByLibrary.simpleMessage("Done"), - "Download" : MessageLookupByLibrary.simpleMessage("Download"), - "Due" : MessageLookupByLibrary.simpleMessage("Due"), - "EXTREME CRITICAL EMERGENCY!!" : MessageLookupByLibrary.simpleMessage("EXTREME CRITICAL EMERGENCY!!"), - "Electric, blue" : MessageLookupByLibrary.simpleMessage("Electric, blue"), - "Email Address" : MessageLookupByLibrary.simpleMessage("Email Address"), - "Email:" : MessageLookupByLibrary.simpleMessage("Email:"), - "Email…" : MessageLookupByLibrary.simpleMessage("Email…"), - "Enter the student pairing code provided to you. If the pairing code doesn\'t work, it may have expired" : MessageLookupByLibrary.simpleMessage("Enter the student pairing code provided to you. If the pairing code doesn\'t work, it may have expired"), - "Event" : MessageLookupByLibrary.simpleMessage("Event"), - "Excused" : MessageLookupByLibrary.simpleMessage("Excused"), - "Expired QR Code" : MessageLookupByLibrary.simpleMessage("Expired QR Code"), - "Failed. Tap for options." : MessageLookupByLibrary.simpleMessage("Failed. Tap for options."), - "Filter" : MessageLookupByLibrary.simpleMessage("Filter"), - "Filter by" : MessageLookupByLibrary.simpleMessage("Filter by"), - "Fire, Orange" : MessageLookupByLibrary.simpleMessage("Fire, Orange"), - "Front Page" : MessageLookupByLibrary.simpleMessage("Front Page"), - "Full Name" : MessageLookupByLibrary.simpleMessage("Full Name"), - "Full Name…" : MessageLookupByLibrary.simpleMessage("Full Name…"), - "Full error message" : MessageLookupByLibrary.simpleMessage("Full error message"), - "Go to today" : MessageLookupByLibrary.simpleMessage("Go to today"), - "Grade" : MessageLookupByLibrary.simpleMessage("Grade"), - "Grade percentage" : MessageLookupByLibrary.simpleMessage("Grade percentage"), - "Graded" : MessageLookupByLibrary.simpleMessage("Graded"), - "Grades" : MessageLookupByLibrary.simpleMessage("Grades"), - "Help" : MessageLookupByLibrary.simpleMessage("Help"), - "Hide Password" : MessageLookupByLibrary.simpleMessage("Hide Password"), - "High Contrast Mode" : MessageLookupByLibrary.simpleMessage("High Contrast Mode"), - "How are we doing?" : MessageLookupByLibrary.simpleMessage("How are we doing?"), - "How is this affecting you?" : MessageLookupByLibrary.simpleMessage("How is this affecting you?"), - "I can\'t get things done until I hear back from you." : MessageLookupByLibrary.simpleMessage("I can\'t get things done until I hear back from you."), - "I don\'t have a Canvas account" : MessageLookupByLibrary.simpleMessage("I don\'t have a Canvas account"), - "I have a Canvas account" : MessageLookupByLibrary.simpleMessage("I have a Canvas account"), - "I need some help but it\'s not urgent." : MessageLookupByLibrary.simpleMessage("I need some help but it\'s not urgent."), - "I\'m having trouble logging in" : MessageLookupByLibrary.simpleMessage("I\'m having trouble logging in"), - "Idea for Canvas Parent App [Android]" : MessageLookupByLibrary.simpleMessage("Idea for Canvas Parent App [Android]"), - "In order to provide you with a better experience, we have updated how reminders work. You can add new reminders by viewing an assignment or calendar event and tapping the switch under the \"Remind Me\" section.\n\nBe aware that any reminders created with older versions of this app will not be compatible with the new changes and you will need to create them again." : MessageLookupByLibrary.simpleMessage("In order to provide you with a better experience, we have updated how reminders work. You can add new reminders by viewing an assignment or calendar event and tapping the switch under the \"Remind Me\" section.\n\nBe aware that any reminders created with older versions of this app will not be compatible with the new changes and you will need to create them again."), - "Inbox" : MessageLookupByLibrary.simpleMessage("Inbox"), - "Inbox Zero" : MessageLookupByLibrary.simpleMessage("Inbox Zero"), - "Incomplete" : MessageLookupByLibrary.simpleMessage("Incomplete"), - "Incorrect Domain" : MessageLookupByLibrary.simpleMessage("Incorrect Domain"), - "Institution Announcement" : MessageLookupByLibrary.simpleMessage("Institution Announcement"), - "Institution Announcements" : MessageLookupByLibrary.simpleMessage("Institution Announcements"), - "Instructions" : MessageLookupByLibrary.simpleMessage("Instructions"), - "Interactions on this page are limited by your institution." : MessageLookupByLibrary.simpleMessage("Interactions on this page are limited by your institution."), - "Invalid QR Code" : MessageLookupByLibrary.simpleMessage("Invalid QR Code"), - "It looks like a great day to rest, relax, and recharge." : MessageLookupByLibrary.simpleMessage("It looks like a great day to rest, relax, and recharge."), - "It looks like assignments haven\'t been created in this space yet." : MessageLookupByLibrary.simpleMessage("It looks like assignments haven\'t been created in this space yet."), - "Just a casual question, comment, idea, suggestion…" : MessageLookupByLibrary.simpleMessage("Just a casual question, comment, idea, suggestion…"), - "Late" : MessageLookupByLibrary.simpleMessage("Late"), - "Launch External Tool" : MessageLookupByLibrary.simpleMessage("Launch External Tool"), - "Legal" : MessageLookupByLibrary.simpleMessage("Legal"), - "Light Mode" : MessageLookupByLibrary.simpleMessage("Light Mode"), - "Link Error" : MessageLookupByLibrary.simpleMessage("Link Error"), - "Locale:" : MessageLookupByLibrary.simpleMessage("Locale:"), - "Locate QR Code" : MessageLookupByLibrary.simpleMessage("Locate QR Code"), - "Location" : MessageLookupByLibrary.simpleMessage("Location"), - "Locked" : MessageLookupByLibrary.simpleMessage("Locked"), - "Log Out" : MessageLookupByLibrary.simpleMessage("Log Out"), - "Login flow: Canvas" : MessageLookupByLibrary.simpleMessage("Login flow: Canvas"), - "Login flow: Normal" : MessageLookupByLibrary.simpleMessage("Login flow: Normal"), - "Login flow: Site Admin" : MessageLookupByLibrary.simpleMessage("Login flow: Site Admin"), - "Login flow: Skip mobile verify" : MessageLookupByLibrary.simpleMessage("Login flow: Skip mobile verify"), - "Manage Students" : MessageLookupByLibrary.simpleMessage("Manage Students"), - "Message" : MessageLookupByLibrary.simpleMessage("Message"), - "Message subject" : MessageLookupByLibrary.simpleMessage("Message subject"), - "Missing" : MessageLookupByLibrary.simpleMessage("Missing"), - "Must be below 100" : MessageLookupByLibrary.simpleMessage("Must be below 100"), - "Network error" : MessageLookupByLibrary.simpleMessage("Network error"), - "Never" : MessageLookupByLibrary.simpleMessage("Never"), - "New message" : MessageLookupByLibrary.simpleMessage("New message"), - "No" : MessageLookupByLibrary.simpleMessage("No"), - "No Alerts" : MessageLookupByLibrary.simpleMessage("No Alerts"), - "No Assignments" : MessageLookupByLibrary.simpleMessage("No Assignments"), - "No Courses" : MessageLookupByLibrary.simpleMessage("No Courses"), - "No Due Date" : MessageLookupByLibrary.simpleMessage("No Due Date"), - "No Events Today!" : MessageLookupByLibrary.simpleMessage("No Events Today!"), - "No Grade" : MessageLookupByLibrary.simpleMessage("No Grade"), - "No Location Specified" : MessageLookupByLibrary.simpleMessage("No Location Specified"), - "No Students" : MessageLookupByLibrary.simpleMessage("No Students"), - "No Subject" : MessageLookupByLibrary.simpleMessage("No Subject"), - "No Summary" : MessageLookupByLibrary.simpleMessage("No Summary"), - "No description" : MessageLookupByLibrary.simpleMessage("No description"), - "No recipients selected" : MessageLookupByLibrary.simpleMessage("No recipients selected"), - "Not Graded" : MessageLookupByLibrary.simpleMessage("Not Graded"), - "Not Submitted" : MessageLookupByLibrary.simpleMessage("Not Submitted"), - "Not a parent?" : MessageLookupByLibrary.simpleMessage("Not a parent?"), - "Notifications for reminders about assignments and calendar events" : MessageLookupByLibrary.simpleMessage("Notifications for reminders about assignments and calendar events"), - "OS Version" : MessageLookupByLibrary.simpleMessage("OS Version"), - "Observer" : MessageLookupByLibrary.simpleMessage("Observer"), - "One of our other apps might be a better fit. Tap one to visit the Play Store." : MessageLookupByLibrary.simpleMessage("One of our other apps might be a better fit. Tap one to visit the Play Store."), - "Open Canvas Student" : MessageLookupByLibrary.simpleMessage("Open Canvas Student"), - "Open In Browser" : MessageLookupByLibrary.simpleMessage("Open In Browser"), - "Open with another app" : MessageLookupByLibrary.simpleMessage("Open with another app"), - "Pairing Code" : MessageLookupByLibrary.simpleMessage("Pairing Code"), - "Password" : MessageLookupByLibrary.simpleMessage("Password"), - "Password is required" : MessageLookupByLibrary.simpleMessage("Password is required"), - "Password must contain at least 8 characters" : MessageLookupByLibrary.simpleMessage("Password must contain at least 8 characters"), - "Password…" : MessageLookupByLibrary.simpleMessage("Password…"), - "Planner Note" : MessageLookupByLibrary.simpleMessage("Planner Note"), - "Please enter a valid email address" : MessageLookupByLibrary.simpleMessage("Please enter a valid email address"), - "Please enter an email address" : MessageLookupByLibrary.simpleMessage("Please enter an email address"), - "Please enter full name" : MessageLookupByLibrary.simpleMessage("Please enter full name"), - "Please scan a QR code generated by Canvas" : MessageLookupByLibrary.simpleMessage("Please scan a QR code generated by Canvas"), - "Plum, Purple" : MessageLookupByLibrary.simpleMessage("Plum, Purple"), - "Preparing…" : MessageLookupByLibrary.simpleMessage("Preparing…"), - "Previous Logins" : MessageLookupByLibrary.simpleMessage("Previous Logins"), - "Privacy Policy" : MessageLookupByLibrary.simpleMessage("Privacy Policy"), - "Privacy Policy Link" : MessageLookupByLibrary.simpleMessage("Privacy Policy Link"), - "Privacy policy, terms of use, open source" : MessageLookupByLibrary.simpleMessage("Privacy policy, terms of use, open source"), - "QR Code" : MessageLookupByLibrary.simpleMessage("QR Code"), - "QR scanning requires camera access" : MessageLookupByLibrary.simpleMessage("QR scanning requires camera access"), - "Raspberry, Red" : MessageLookupByLibrary.simpleMessage("Raspberry, Red"), - "Recipients" : MessageLookupByLibrary.simpleMessage("Recipients"), - "Refresh" : MessageLookupByLibrary.simpleMessage("Refresh"), - "Remind Me" : MessageLookupByLibrary.simpleMessage("Remind Me"), - "Reminders" : MessageLookupByLibrary.simpleMessage("Reminders"), - "Reminders have changed!" : MessageLookupByLibrary.simpleMessage("Reminders have changed!"), - "Reply" : MessageLookupByLibrary.simpleMessage("Reply"), - "Reply All" : MessageLookupByLibrary.simpleMessage("Reply All"), - "Report A Problem" : MessageLookupByLibrary.simpleMessage("Report A Problem"), - "Request Login Help" : MessageLookupByLibrary.simpleMessage("Request Login Help"), - "Request Login Help Button" : MessageLookupByLibrary.simpleMessage("Request Login Help Button"), - "Restart app" : MessageLookupByLibrary.simpleMessage("Restart app"), - "Retry" : MessageLookupByLibrary.simpleMessage("Retry"), - "Return to Login" : MessageLookupByLibrary.simpleMessage("Return to Login"), - "STUDENT" : MessageLookupByLibrary.simpleMessage("STUDENT"), - "Screenshot showing location of QR code generation in browser" : MessageLookupByLibrary.simpleMessage("Screenshot showing location of QR code generation in browser"), - "Screenshot showing location of pairing QR code generation in the Canvas Student app" : MessageLookupByLibrary.simpleMessage("Screenshot showing location of pairing QR code generation in the Canvas Student app"), - "Select" : MessageLookupByLibrary.simpleMessage("Select"), - "Select Student Color" : MessageLookupByLibrary.simpleMessage("Select Student Color"), - "Select recipients" : MessageLookupByLibrary.simpleMessage("Select recipients"), - "Send Feedback" : MessageLookupByLibrary.simpleMessage("Send Feedback"), - "Send a message about this assignment" : MessageLookupByLibrary.simpleMessage("Send a message about this assignment"), - "Send a message about this course" : MessageLookupByLibrary.simpleMessage("Send a message about this course"), - "Send message" : MessageLookupByLibrary.simpleMessage("Send message"), - "Set a date and time to be notified of this event." : MessageLookupByLibrary.simpleMessage("Set a date and time to be notified of this event."), - "Set a date and time to be notified of this specific assignment." : MessageLookupByLibrary.simpleMessage("Set a date and time to be notified of this specific assignment."), - "Settings" : MessageLookupByLibrary.simpleMessage("Settings"), - "Shamrock, Green" : MessageLookupByLibrary.simpleMessage("Shamrock, Green"), - "Share Your Love for the App" : MessageLookupByLibrary.simpleMessage("Share Your Love for the App"), - "Show Password" : MessageLookupByLibrary.simpleMessage("Show Password"), - "Sign In" : MessageLookupByLibrary.simpleMessage("Sign In"), - "Something went wrong trying to create your account, please reach out to your school for assistance." : MessageLookupByLibrary.simpleMessage("Something went wrong trying to create your account, please reach out to your school for assistance."), - "Something\'s broken but I can work around it to get what I need done." : MessageLookupByLibrary.simpleMessage("Something\'s broken but I can work around it to get what I need done."), - "Stop Acting as User" : MessageLookupByLibrary.simpleMessage("Stop Acting as User"), - "Student" : MessageLookupByLibrary.simpleMessage("Student"), - "Student Pairing" : MessageLookupByLibrary.simpleMessage("Student Pairing"), - "Students can create a QR code using the Canvas Student app on their mobile device" : MessageLookupByLibrary.simpleMessage("Students can create a QR code using the Canvas Student app on their mobile device"), - "Students can obtain a pairing code through the Canvas website" : MessageLookupByLibrary.simpleMessage("Students can obtain a pairing code through the Canvas website"), - "Subject" : MessageLookupByLibrary.simpleMessage("Subject"), - "Submitted" : MessageLookupByLibrary.simpleMessage("Submitted"), - "Successfully submitted!" : MessageLookupByLibrary.simpleMessage("Successfully submitted!"), - "Summary" : MessageLookupByLibrary.simpleMessage("Summary"), - "Switch Users" : MessageLookupByLibrary.simpleMessage("Switch Users"), - "Syllabus" : MessageLookupByLibrary.simpleMessage("Syllabus"), - "TA" : MessageLookupByLibrary.simpleMessage("TA"), - "TEACHER" : MessageLookupByLibrary.simpleMessage("TEACHER"), - "Tap to favorite the courses you want to see on the Calendar. Select up to 10." : MessageLookupByLibrary.simpleMessage("Tap to favorite the courses you want to see on the Calendar. Select up to 10."), - "Tap to pair with a new student" : MessageLookupByLibrary.simpleMessage("Tap to pair with a new student"), - "Tap to select this student" : MessageLookupByLibrary.simpleMessage("Tap to select this student"), - "Tap to show student selector" : MessageLookupByLibrary.simpleMessage("Tap to show student selector"), - "Teacher" : MessageLookupByLibrary.simpleMessage("Teacher"), - "Tell us about your favorite parts of the app" : MessageLookupByLibrary.simpleMessage("Tell us about your favorite parts of the app"), - "Terms of Service" : MessageLookupByLibrary.simpleMessage("Terms of Service"), - "Terms of Service Link" : MessageLookupByLibrary.simpleMessage("Terms of Service Link"), - "Terms of Use" : MessageLookupByLibrary.simpleMessage("Terms of Use"), - "The QR code you scanned may have expired. Refresh the code on the student\'s device and try again." : MessageLookupByLibrary.simpleMessage("The QR code you scanned may have expired. Refresh the code on the student\'s device and try again."), - "The following information will help us better understand your idea:" : MessageLookupByLibrary.simpleMessage("The following information will help us better understand your idea:"), - "The server you entered is not authorized for this app." : MessageLookupByLibrary.simpleMessage("The server you entered is not authorized for this app."), - "The student you are trying to add belongs to a different school. Log in or create an account with that school to scan this code." : MessageLookupByLibrary.simpleMessage("The student you are trying to add belongs to a different school. Log in or create an account with that school to scan this code."), - "The user agent for this app is not authorized." : MessageLookupByLibrary.simpleMessage("The user agent for this app is not authorized."), - "Theme" : MessageLookupByLibrary.simpleMessage("Theme"), - "There are no installed applications that can open this file" : MessageLookupByLibrary.simpleMessage("There are no installed applications that can open this file"), - "There is no page information available." : MessageLookupByLibrary.simpleMessage("There is no page information available."), - "There was a problem loading the Terms of Use" : MessageLookupByLibrary.simpleMessage("There was a problem loading the Terms of Use"), - "There was a problem removing this student from your account. Please check your connection and try again." : MessageLookupByLibrary.simpleMessage("There was a problem removing this student from your account. Please check your connection and try again."), - "There was an error loading recipients for this course" : MessageLookupByLibrary.simpleMessage("There was an error loading recipients for this course"), - "There was an error loading the summary details for this course." : MessageLookupByLibrary.simpleMessage("There was an error loading the summary details for this course."), - "There was an error loading this announcement" : MessageLookupByLibrary.simpleMessage("There was an error loading this announcement"), - "There was an error loading this conversation" : MessageLookupByLibrary.simpleMessage("There was an error loading this conversation"), - "There was an error loading this file" : MessageLookupByLibrary.simpleMessage("There was an error loading this file"), - "There was an error loading your inbox messages." : MessageLookupByLibrary.simpleMessage("There was an error loading your inbox messages."), - "There was an error loading your student\'s alerts." : MessageLookupByLibrary.simpleMessage("There was an error loading your student\'s alerts."), - "There was an error loading your student\'s calendar" : MessageLookupByLibrary.simpleMessage("There was an error loading your student\'s calendar"), - "There was an error loading your students." : MessageLookupByLibrary.simpleMessage("There was an error loading your students."), - "There was an error loading your student’s courses." : MessageLookupByLibrary.simpleMessage("There was an error loading your student’s courses."), - "There was an error logging in. Please generate another QR Code and try again." : MessageLookupByLibrary.simpleMessage("There was an error logging in. Please generate another QR Code and try again."), - "There was an error trying to act as this user. Please check the Domain and User ID and try again." : MessageLookupByLibrary.simpleMessage("There was an error trying to act as this user. Please check the Domain and User ID and try again."), - "There’s nothing to be notified of yet." : MessageLookupByLibrary.simpleMessage("There’s nothing to be notified of yet."), - "This app is not authorized for use." : MessageLookupByLibrary.simpleMessage("This app is not authorized for use."), - "This course does not have any assignments or calendar events yet." : MessageLookupByLibrary.simpleMessage("This course does not have any assignments or calendar events yet."), - "This file is unsupported and can’t be viewed through the app" : MessageLookupByLibrary.simpleMessage("This file is unsupported and can’t be viewed through the app"), - "This will unpair and remove all enrollments for this student from your account." : MessageLookupByLibrary.simpleMessage("This will unpair and remove all enrollments for this student from your account."), - "Total Grade" : MessageLookupByLibrary.simpleMessage("Total Grade"), - "Uh oh!" : MessageLookupByLibrary.simpleMessage("Uh oh!"), - "Unable to fetch courses. Please check your connection and try again." : MessageLookupByLibrary.simpleMessage("Unable to fetch courses. Please check your connection and try again."), - "Unable to load this image" : MessageLookupByLibrary.simpleMessage("Unable to load this image"), - "Unable to play this media file" : MessageLookupByLibrary.simpleMessage("Unable to play this media file"), - "Unable to send message. Check your connection and try again." : MessageLookupByLibrary.simpleMessage("Unable to send message. Check your connection and try again."), - "Under Construction" : MessageLookupByLibrary.simpleMessage("Under Construction"), - "Unknown User" : MessageLookupByLibrary.simpleMessage("Unknown User"), - "Unsaved changes" : MessageLookupByLibrary.simpleMessage("Unsaved changes"), - "Unsupported File" : MessageLookupByLibrary.simpleMessage("Unsupported File"), - "Upload File" : MessageLookupByLibrary.simpleMessage("Upload File"), - "Use Camera" : MessageLookupByLibrary.simpleMessage("Use Camera"), - "Use Dark Theme in Web Content" : MessageLookupByLibrary.simpleMessage("Use Dark Theme in Web Content"), - "User ID" : MessageLookupByLibrary.simpleMessage("User ID"), - "User ID:" : MessageLookupByLibrary.simpleMessage("User ID:"), - "Version Number" : MessageLookupByLibrary.simpleMessage("Version Number"), - "View Description" : MessageLookupByLibrary.simpleMessage("View Description"), - "View error details" : MessageLookupByLibrary.simpleMessage("View error details"), - "View the Privacy Policy" : MessageLookupByLibrary.simpleMessage("View the Privacy Policy"), - "We are currently building this feature for your viewing pleasure." : MessageLookupByLibrary.simpleMessage("We are currently building this feature for your viewing pleasure."), - "We are unable to display this link, it may belong to an institution you currently aren\'t logged in to." : MessageLookupByLibrary.simpleMessage("We are unable to display this link, it may belong to an institution you currently aren\'t logged in to."), - "We couldn\'t find any students associated with this account" : MessageLookupByLibrary.simpleMessage("We couldn\'t find any students associated with this account"), - "We were unable to verify the server for use with this app." : MessageLookupByLibrary.simpleMessage("We were unable to verify the server for use with this app."), - "We’re not sure what happened, but it wasn’t good. Contact us if this keeps happening." : MessageLookupByLibrary.simpleMessage("We’re not sure what happened, but it wasn’t good. Contact us if this keeps happening."), - "What can we do better?" : MessageLookupByLibrary.simpleMessage("What can we do better?"), - "Yes" : MessageLookupByLibrary.simpleMessage("Yes"), - "You are not observing any students." : MessageLookupByLibrary.simpleMessage("You are not observing any students."), - "You may only choose 10 calendars to display" : MessageLookupByLibrary.simpleMessage("You may only choose 10 calendars to display"), - "You must enter a user id" : MessageLookupByLibrary.simpleMessage("You must enter a user id"), - "You must enter a valid domain" : MessageLookupByLibrary.simpleMessage("You must enter a valid domain"), - "You must select at least one calendar to display" : MessageLookupByLibrary.simpleMessage("You must select at least one calendar to display"), - "You will be notified about this assignment on…" : MessageLookupByLibrary.simpleMessage("You will be notified about this assignment on…"), - "You will be notified about this event on…" : MessageLookupByLibrary.simpleMessage("You will be notified about this event on…"), - "You\'ll find the QR code on the web in your account profile. Click \'QR for Mobile Login\' in the list." : MessageLookupByLibrary.simpleMessage("You\'ll find the QR code on the web in your account profile. Click \'QR for Mobile Login\' in the list."), - "You\'ll need to open your student\'s Canvas Student app to continue. Go into Main Menu > Settings > Pair with Observer and scan the QR code you see there." : MessageLookupByLibrary.simpleMessage("You\'ll need to open your student\'s Canvas Student app to continue. Go into Main Menu > Settings > Pair with Observer and scan the QR code you see there."), - "Your code is incorrect or expired." : MessageLookupByLibrary.simpleMessage("Your code is incorrect or expired."), - "Your student’s courses might not be published yet." : MessageLookupByLibrary.simpleMessage("Your student’s courses might not be published yet."), - "You’re all caught up!" : MessageLookupByLibrary.simpleMessage("You’re all caught up!"), - "actingAsUser" : m0, - "alertsLabel" : MessageLookupByLibrary.simpleMessage("Alerts"), - "appVersion" : m1, - "assignmentGradeAboveThreshold" : m2, - "assignmentGradeBelowThreshold" : m3, - "assignmentLockedModule" : m4, - "assignmentSubjectMessage" : m5, - "assignmentTotalPoints" : m6, - "assignmentTotalPointsAccessible" : m7, - "authorToNOthers" : m8, - "authorToRecipient" : m9, - "authorToRecipientAndNOthers" : m10, - "badgeNumberPlus" : m11, - "calendarLabel" : MessageLookupByLibrary.simpleMessage("Calendar"), - "canvasGuides" : MessageLookupByLibrary.simpleMessage("Canvas Guides"), - "canvasLogoLabel" : MessageLookupByLibrary.simpleMessage("Canvas logo"), - "canvasSupport" : MessageLookupByLibrary.simpleMessage("Canvas Support"), - "changeStudentColorLabel" : m12, - "collapse" : MessageLookupByLibrary.simpleMessage("collapse"), - "collapsed" : MessageLookupByLibrary.simpleMessage("collapsed"), - "contentDescriptionScoreOutOfPointsPossible" : m13, - "courseForWhom" : m14, - "courseGradeAboveThreshold" : m15, - "courseGradeBelowThreshold" : m16, - "coursesLabel" : MessageLookupByLibrary.simpleMessage("Courses"), - "dateAtTime" : m17, - "dismissAlertLabel" : m18, - "domainSearchHelpBody" : m19, - "domainSearchHelpLabel" : MessageLookupByLibrary.simpleMessage("How do I find my school or district?"), - "domainSearchInputHint" : MessageLookupByLibrary.simpleMessage("Enter school name or district…"), - "dueDateAtTime" : m20, - "endMasqueradeLogoutMessage" : m21, - "endMasqueradeMessage" : m22, - "eventSubjectMessage" : m23, - "eventTime" : m24, - "expand" : MessageLookupByLibrary.simpleMessage("expand"), - "expanded" : MessageLookupByLibrary.simpleMessage("expanded"), - "finalGrade" : m25, - "findSchool" : MessageLookupByLibrary.simpleMessage("Find School"), - "frontPageSubjectMessage" : m26, - "gradeFormatScoreOutOfPointsPossible" : m27, - "gradesSubjectMessage" : m28, - "latePenalty" : m29, - "me" : MessageLookupByLibrary.simpleMessage("me"), - "messageLinkPostscript" : m30, - "minus" : MessageLookupByLibrary.simpleMessage("minus"), - "mustBeAboveN" : m31, - "mustBeBelowN" : m32, - "next" : MessageLookupByLibrary.simpleMessage("Next"), - "nextMonth" : m33, - "nextWeek" : m34, - "noDomainResults" : m35, - "ok" : MessageLookupByLibrary.simpleMessage("OK"), - "outOfPoints" : m36, - "plusRecipientCount" : m37, - "pointsPossible" : m38, - "previousMonth" : m39, - "previousWeek" : m40, - "qrCreateAccountTos" : m41, - "ratingDialogEmailSubject" : m42, - "selectedMonthLabel" : m43, - "send" : MessageLookupByLibrary.simpleMessage("send"), - "starRating" : m44, - "submissionStatusSuccessSubtitle" : m45, - "syllabusSubjectMessage" : m46, - "unread" : MessageLookupByLibrary.simpleMessage("unread"), - "unreadCount" : m47 - }; -} diff --git a/apps/flutter_parent/lib/l10n/generated/messages_en_CY.dart b/apps/flutter_parent/lib/l10n/generated/messages_en_CY.dart deleted file mode 100644 index b25f77c3aa..0000000000 --- a/apps/flutter_parent/lib/l10n/generated/messages_en_CY.dart +++ /dev/null @@ -1,473 +0,0 @@ -// DO NOT EDIT. This is code generated via package:intl/generate_localized.dart -// This is a library that provides messages for a en_CY locale. All the -// messages from the main program should be duplicated here with the same -// function name. - -// Ignore issues from commonly used lints in this file. -// ignore_for_file:unnecessary_brace_in_string_interps, unnecessary_new -// ignore_for_file:prefer_single_quotes,comment_references, directives_ordering -// ignore_for_file:annotate_overrides,prefer_generic_function_type_aliases -// ignore_for_file:unused_import, file_names - -import 'package:intl/intl.dart'; -import 'package:intl/message_lookup_by_library.dart'; - -final messages = new MessageLookup(); - -typedef String MessageIfAbsent(String messageStr, List args); - -class MessageLookup extends MessageLookupByLibrary { - String get localeName => 'en_CY'; - - static m0(userName) => "You are acting as ${userName}"; - - static m1(version) => "v. ${version}"; - - static m2(threshold) => "Assignment Grade Above ${threshold}"; - - static m3(threshold) => "Assignment Grade Below ${threshold}"; - - static m4(moduleName) => "This assignment is locked by the unit \"${moduleName}\"."; - - static m5(studentName, assignmentName) => "Regarding: ${studentName}, Assignment - ${assignmentName}"; - - static m6(points) => "${points} pts"; - - static m7(points) => "${points} points"; - - static m8(authorName, howMany) => "${Intl.plural(howMany, one: '${authorName} to 1 other', other: '${authorName} to ${howMany} others')}"; - - static m9(authorName, recipientName) => "${authorName} to ${recipientName}"; - - static m10(authorName, recipientName, howMany) => "${Intl.plural(howMany, one: '${authorName} to ${recipientName} & 1 other', other: '${authorName} to ${recipientName} & ${howMany} others')}"; - - static m11(count) => "${count}+"; - - static m12(studentName) => "Change colour for ${studentName}"; - - static m13(score, pointsPossible) => "${score} out of ${pointsPossible} points"; - - static m14(studentShortName) => "for ${studentShortName}"; - - static m15(threshold) => "Module Grade Above ${threshold}"; - - static m16(threshold) => "Module Grade Below ${threshold}"; - - static m17(date, time) => "${date} at ${time}"; - - static m18(alertTitle) => "Dismiss ${alertTitle}"; - - static m19(canvasGuides, canvasSupport) => "Try searching for the name of the school or district you’re attempting to access, like “Smith Private School” or “Smith County Schools.” You can also enter a Canvas domain directly, like “smith.instructure.com.”\n\nFor more information on finding your institution’s Canvas account, you can visit the ${canvasGuides}, reach out to ${canvasSupport}, or contact your school for assistance."; - - static m20(date, time) => "Due ${date} at ${time}"; - - static m21(userName) => "You will stop acting as ${userName} and will be logged out."; - - static m22(userName) => "You will stop acting as ${userName} and return to your original account."; - - static m23(studentName, eventTitle) => "Regarding: ${studentName}, Event - ${eventTitle}"; - - static m24(startAt, endAt) => "${startAt} - ${endAt}"; - - static m25(grade) => "Final grade: ${grade}"; - - static m26(studentName) => "Regarding: ${studentName}, Front Page"; - - static m27(score, pointsPossible) => "${score} / ${pointsPossible}"; - - static m28(studentName) => "Regarding: ${studentName}, Grades"; - - static m29(pointsLost) => "Late penalty (-${pointsLost})"; - - static m30(studentName, linkUrl) => "Regarding: ${studentName}, ${linkUrl}"; - - static m31(percentage) => "Must be above ${percentage}"; - - static m32(percentage) => "Must be below ${percentage}"; - - static m33(month) => "Next month: ${month}"; - - static m34(date) => "Next week starting ${date}"; - - static m35(query) => "Unable to find schools matching \"${query}\""; - - static m36(points, howMany) => "${Intl.plural(howMany, one: 'Out of 1 point', other: 'Out of ${points} points')}"; - - static m37(count) => "+${count}"; - - static m38(points) => "${points} points possible"; - - static m39(month) => "Previous month: ${month}"; - - static m40(date) => "Previous week starting ${date}"; - - static m41(termsOfService, privacyPolicy) => "By tapping \'Create Account\', you agree to the ${termsOfService} and acknowledge the ${privacyPolicy}"; - - static m42(version) => "Suggestions for Android - Canvas Parent ${version}"; - - static m43(month) => "Month of ${month}"; - - static m44(position) => "${Intl.plural(position, one: '${position} star', other: '${position} stars')}"; - - static m45(date, time) => "This assignment was submitted on ${date} at ${time} and is waiting to be graded"; - - static m46(studentName) => "Regarding: ${studentName}, Syllabus"; - - static m47(count) => "${count} unread"; - - final messages = _notInlinedMessages(_notInlinedMessages); - static _notInlinedMessages(_) => { - "\"Act as\" is essentially logging in as this user without a password. You will be able to take any action as if you were this user, and from other users\' points of views, it will be as if this user performed them. However, audit logs record that you were the one who performed the actions on behalf of this user." : MessageLookupByLibrary.simpleMessage("\"Act as\" is essentially logging in as this user without a password. You will be able to take any action as if you were this user, and from other users\' points of views, it will be as if this user performed them. However, audit logs record that you were the one who performed the actions on behalf of this user."), - "-" : MessageLookupByLibrary.simpleMessage("-"), - "A description is required." : MessageLookupByLibrary.simpleMessage("A description is required."), - "A network error occurred when adding this student. Check your connection and try again." : MessageLookupByLibrary.simpleMessage("A network error occurred when adding this student. Check your connection and try again."), - "A subject is required." : MessageLookupByLibrary.simpleMessage("A subject is required."), - "Act As User" : MessageLookupByLibrary.simpleMessage("Act As User"), - "Add Student" : MessageLookupByLibrary.simpleMessage("Add student"), - "Add attachment" : MessageLookupByLibrary.simpleMessage("Add attachment"), - "Add new student" : MessageLookupByLibrary.simpleMessage("Add new student"), - "Add student with…" : MessageLookupByLibrary.simpleMessage("Add student with…"), - "Alert Settings" : MessageLookupByLibrary.simpleMessage("Alert Settings"), - "Alert me when…" : MessageLookupByLibrary.simpleMessage("Alert me when…"), - "All Grading Periods" : MessageLookupByLibrary.simpleMessage("All Grading Periods"), - "Already have an account? " : MessageLookupByLibrary.simpleMessage("Already have an account? "), - "An email address is required." : MessageLookupByLibrary.simpleMessage("An email address is required."), - "An error occurred when trying to display this link" : MessageLookupByLibrary.simpleMessage("An error occurred when trying to display this link"), - "An error occurred while saving your selection. Please try again." : MessageLookupByLibrary.simpleMessage("An error occurred while saving your selection. Please try again."), - "An unexpected error occurred" : MessageLookupByLibrary.simpleMessage("An unexpected error occurred"), - "Android OS version" : MessageLookupByLibrary.simpleMessage("Android OS version"), - "Appearance" : MessageLookupByLibrary.simpleMessage("Appearance"), - "Application version" : MessageLookupByLibrary.simpleMessage("Application version"), - "Are you a student or teacher?" : MessageLookupByLibrary.simpleMessage("Are you a student or teacher?"), - "Are you sure you want to log out?" : MessageLookupByLibrary.simpleMessage("Are you sure you want to log out?"), - "Are you sure you wish to close this page? Your unsent message will be lost." : MessageLookupByLibrary.simpleMessage("Are you sure you wish to close this page? Your unsent message will be lost."), - "Assignment Details" : MessageLookupByLibrary.simpleMessage("Assignment details"), - "Assignment grade above" : MessageLookupByLibrary.simpleMessage("Assignment mark above"), - "Assignment grade below" : MessageLookupByLibrary.simpleMessage("Assignment mark below"), - "Assignment missing" : MessageLookupByLibrary.simpleMessage("Assignment missing"), - "Barney, Fuschia" : MessageLookupByLibrary.simpleMessage("Barney, Fuchsia"), - "Calendars" : MessageLookupByLibrary.simpleMessage("Calendars"), - "Camera Permission" : MessageLookupByLibrary.simpleMessage("Camera Permission"), - "Cancel" : MessageLookupByLibrary.simpleMessage("Cancel"), - "Canvas Student" : MessageLookupByLibrary.simpleMessage("Canvas student"), - "Canvas Teacher" : MessageLookupByLibrary.simpleMessage("Canvas teacher"), - "Canvas on GitHub" : MessageLookupByLibrary.simpleMessage("Canvas on GitHub"), - "Choose a course to message" : MessageLookupByLibrary.simpleMessage("Choose a module to message"), - "Choose from Gallery" : MessageLookupByLibrary.simpleMessage("Choose from Gallery"), - "Complete" : MessageLookupByLibrary.simpleMessage("Complete"), - "Contact Support" : MessageLookupByLibrary.simpleMessage("Contact support"), - "Course Announcement" : MessageLookupByLibrary.simpleMessage("Module announcement"), - "Course Announcements" : MessageLookupByLibrary.simpleMessage("Module announcements"), - "Course grade above" : MessageLookupByLibrary.simpleMessage("Module mark above"), - "Course grade below" : MessageLookupByLibrary.simpleMessage("Module mark below"), - "Create Account" : MessageLookupByLibrary.simpleMessage("Create account"), - "Dark Mode" : MessageLookupByLibrary.simpleMessage("Dark mode"), - "Date" : MessageLookupByLibrary.simpleMessage("Date"), - "Delete" : MessageLookupByLibrary.simpleMessage("Delete"), - "Description" : MessageLookupByLibrary.simpleMessage("Description"), - "Device" : MessageLookupByLibrary.simpleMessage("Device"), - "Device model" : MessageLookupByLibrary.simpleMessage("Device model"), - "Domain" : MessageLookupByLibrary.simpleMessage("Domain"), - "Domain:" : MessageLookupByLibrary.simpleMessage("Domain:"), - "Don\'t show again" : MessageLookupByLibrary.simpleMessage("Don\'t show again"), - "Done" : MessageLookupByLibrary.simpleMessage("Done"), - "Download" : MessageLookupByLibrary.simpleMessage("Download"), - "Due" : MessageLookupByLibrary.simpleMessage("Due"), - "EXTREME CRITICAL EMERGENCY!!" : MessageLookupByLibrary.simpleMessage("EXTREME CRITICAL EMERGENCY!!"), - "Electric, blue" : MessageLookupByLibrary.simpleMessage("Electric, blue"), - "Email Address" : MessageLookupByLibrary.simpleMessage("Email address"), - "Email:" : MessageLookupByLibrary.simpleMessage("Email"), - "Email…" : MessageLookupByLibrary.simpleMessage("Email…"), - "Enter the student pairing code provided to you. If the pairing code doesn\'t work, it may have expired" : MessageLookupByLibrary.simpleMessage("Enter the student pairing code provided to you. If the pairing code doesn\'t work, it may have expired"), - "Event" : MessageLookupByLibrary.simpleMessage("Event"), - "Excused" : MessageLookupByLibrary.simpleMessage("Excused"), - "Expired QR Code" : MessageLookupByLibrary.simpleMessage("Expired QR Code"), - "Failed. Tap for options." : MessageLookupByLibrary.simpleMessage("Failed. Tap for options."), - "Filter" : MessageLookupByLibrary.simpleMessage("Filter"), - "Filter by" : MessageLookupByLibrary.simpleMessage("Filter by"), - "Fire, Orange" : MessageLookupByLibrary.simpleMessage("Fire, Orange"), - "Front Page" : MessageLookupByLibrary.simpleMessage("Front page"), - "Full Name" : MessageLookupByLibrary.simpleMessage("Full name"), - "Full Name…" : MessageLookupByLibrary.simpleMessage("Full Name…"), - "Full error message" : MessageLookupByLibrary.simpleMessage("Full error message"), - "Go to today" : MessageLookupByLibrary.simpleMessage("Go to today"), - "Grade" : MessageLookupByLibrary.simpleMessage("Grade"), - "Grade percentage" : MessageLookupByLibrary.simpleMessage("Grade percentage"), - "Graded" : MessageLookupByLibrary.simpleMessage("Graded"), - "Grades" : MessageLookupByLibrary.simpleMessage("Grades"), - "Help" : MessageLookupByLibrary.simpleMessage("Help"), - "Hide Password" : MessageLookupByLibrary.simpleMessage("Hide Password"), - "High Contrast Mode" : MessageLookupByLibrary.simpleMessage("High Contrast Mode"), - "How are we doing?" : MessageLookupByLibrary.simpleMessage("How are we doing?"), - "How is this affecting you?" : MessageLookupByLibrary.simpleMessage("How is this affecting you?"), - "I can\'t get things done until I hear back from you." : MessageLookupByLibrary.simpleMessage("I can\'t finish what I need to do until I hear back from you."), - "I don\'t have a Canvas account" : MessageLookupByLibrary.simpleMessage("I don\'t have a Canvas account"), - "I have a Canvas account" : MessageLookupByLibrary.simpleMessage("I have a Canvas account"), - "I need some help but it\'s not urgent." : MessageLookupByLibrary.simpleMessage("I need some help but it\'s not urgent."), - "I\'m having trouble logging in" : MessageLookupByLibrary.simpleMessage("I\'m having trouble logging in"), - "Idea for Canvas Parent App [Android]" : MessageLookupByLibrary.simpleMessage("Idea for Canvas Parent App [Android]"), - "In order to provide you with a better experience, we have updated how reminders work. You can add new reminders by viewing an assignment or calendar event and tapping the switch under the \"Remind Me\" section.\n\nBe aware that any reminders created with older versions of this app will not be compatible with the new changes and you will need to create them again." : MessageLookupByLibrary.simpleMessage("In order to provide you with a better experience, we have updated how reminders work. You can add new reminders by viewing an assignment or calendar event and tapping the switch under the \"Remind Me\" section.\n\nBe aware that any reminders created with older versions of this app will not be compatible with the new changes and you will need to create them again."), - "Inbox" : MessageLookupByLibrary.simpleMessage("Inbox"), - "Inbox Zero" : MessageLookupByLibrary.simpleMessage("Inbox zero"), - "Incomplete" : MessageLookupByLibrary.simpleMessage("Incomplete"), - "Incorrect Domain" : MessageLookupByLibrary.simpleMessage("Incorrect Domain"), - "Institution Announcement" : MessageLookupByLibrary.simpleMessage("Institution announcement"), - "Institution Announcements" : MessageLookupByLibrary.simpleMessage("Institution announcements"), - "Instructions" : MessageLookupByLibrary.simpleMessage("Instructions"), - "Interactions on this page are limited by your institution." : MessageLookupByLibrary.simpleMessage("Interactions on this page are limited by your institution."), - "Invalid QR Code" : MessageLookupByLibrary.simpleMessage("Invalid QR Code"), - "It looks like a great day to rest, relax, and recharge." : MessageLookupByLibrary.simpleMessage("It looks like a great day to rest, relax, and recharge."), - "It looks like assignments haven\'t been created in this space yet." : MessageLookupByLibrary.simpleMessage("It looks like assignments haven\'t been created in this space yet."), - "Just a casual question, comment, idea, suggestion…" : MessageLookupByLibrary.simpleMessage("Just a casual question, comment, idea, suggestion…"), - "Late" : MessageLookupByLibrary.simpleMessage("Late"), - "Launch External Tool" : MessageLookupByLibrary.simpleMessage("Launch external tool"), - "Legal" : MessageLookupByLibrary.simpleMessage("Legal"), - "Light Mode" : MessageLookupByLibrary.simpleMessage("Light Mode"), - "Link Error" : MessageLookupByLibrary.simpleMessage("Link Error"), - "Locale:" : MessageLookupByLibrary.simpleMessage("Locale:"), - "Locate QR Code" : MessageLookupByLibrary.simpleMessage("Locate QR Code"), - "Location" : MessageLookupByLibrary.simpleMessage("Location"), - "Locked" : MessageLookupByLibrary.simpleMessage("Locked"), - "Log Out" : MessageLookupByLibrary.simpleMessage("Log out"), - "Login flow: Canvas" : MessageLookupByLibrary.simpleMessage("Login flow: Canvas"), - "Login flow: Normal" : MessageLookupByLibrary.simpleMessage("Login flow: Normal"), - "Login flow: Site Admin" : MessageLookupByLibrary.simpleMessage("Login flow: Site admin"), - "Login flow: Skip mobile verify" : MessageLookupByLibrary.simpleMessage("Login flow: Skip mobile verify"), - "Manage Students" : MessageLookupByLibrary.simpleMessage("Manage Students"), - "Message" : MessageLookupByLibrary.simpleMessage("Message"), - "Message subject" : MessageLookupByLibrary.simpleMessage("Message subject"), - "Missing" : MessageLookupByLibrary.simpleMessage("Missing"), - "Must be below 100" : MessageLookupByLibrary.simpleMessage("Must be below 100"), - "Network error" : MessageLookupByLibrary.simpleMessage("Network error"), - "Never" : MessageLookupByLibrary.simpleMessage("Never"), - "New message" : MessageLookupByLibrary.simpleMessage("New message"), - "No" : MessageLookupByLibrary.simpleMessage("No"), - "No Alerts" : MessageLookupByLibrary.simpleMessage("No Alerts"), - "No Assignments" : MessageLookupByLibrary.simpleMessage("No assignments"), - "No Courses" : MessageLookupByLibrary.simpleMessage("No modules"), - "No Due Date" : MessageLookupByLibrary.simpleMessage("No due date"), - "No Events Today!" : MessageLookupByLibrary.simpleMessage("No events today!"), - "No Grade" : MessageLookupByLibrary.simpleMessage("No mark"), - "No Location Specified" : MessageLookupByLibrary.simpleMessage("No location specified"), - "No Students" : MessageLookupByLibrary.simpleMessage("No Students"), - "No Subject" : MessageLookupByLibrary.simpleMessage("No Subject"), - "No Summary" : MessageLookupByLibrary.simpleMessage("No Summary"), - "No description" : MessageLookupByLibrary.simpleMessage("No description"), - "No recipients selected" : MessageLookupByLibrary.simpleMessage("No recipients selected"), - "Not Graded" : MessageLookupByLibrary.simpleMessage("Not graded"), - "Not Submitted" : MessageLookupByLibrary.simpleMessage("Not submitted"), - "Not a parent?" : MessageLookupByLibrary.simpleMessage("Not a parent?"), - "Notifications for reminders about assignments and calendar events" : MessageLookupByLibrary.simpleMessage("Notifications for reminders about assignments and calendar events"), - "OS Version" : MessageLookupByLibrary.simpleMessage("OS version"), - "Observer" : MessageLookupByLibrary.simpleMessage("Observer"), - "One of our other apps might be a better fit. Tap one to visit the Play Store." : MessageLookupByLibrary.simpleMessage("One of our other apps may be a better fit. Tap one to visit the Play Store."), - "Open Canvas Student" : MessageLookupByLibrary.simpleMessage("Open Canvas Student"), - "Open In Browser" : MessageLookupByLibrary.simpleMessage("Open In browser"), - "Open with another app" : MessageLookupByLibrary.simpleMessage("Open with another app"), - "Pairing Code" : MessageLookupByLibrary.simpleMessage("Pairing Code"), - "Password" : MessageLookupByLibrary.simpleMessage("Password"), - "Password is required" : MessageLookupByLibrary.simpleMessage("Password is required"), - "Password must contain at least 8 characters" : MessageLookupByLibrary.simpleMessage("Password must contain at least 8 characters"), - "Password…" : MessageLookupByLibrary.simpleMessage("Password…"), - "Planner Note" : MessageLookupByLibrary.simpleMessage("Planner note"), - "Please enter a valid email address" : MessageLookupByLibrary.simpleMessage("Please enter a valid email address"), - "Please enter an email address" : MessageLookupByLibrary.simpleMessage("Please enter an email address"), - "Please enter full name" : MessageLookupByLibrary.simpleMessage("Please enter full name"), - "Please scan a QR code generated by Canvas" : MessageLookupByLibrary.simpleMessage("Please scan a QR code generated by Canvas"), - "Plum, Purple" : MessageLookupByLibrary.simpleMessage("Plum, Purple"), - "Preparing…" : MessageLookupByLibrary.simpleMessage("Preparing…"), - "Previous Logins" : MessageLookupByLibrary.simpleMessage("Previous logins"), - "Privacy Policy" : MessageLookupByLibrary.simpleMessage("Privacy Policy"), - "Privacy Policy Link" : MessageLookupByLibrary.simpleMessage("Privacy Policy Link"), - "Privacy policy, terms of use, open source" : MessageLookupByLibrary.simpleMessage("Privacy policy, terms of use, open source"), - "QR Code" : MessageLookupByLibrary.simpleMessage("QR Code"), - "QR scanning requires camera access" : MessageLookupByLibrary.simpleMessage("QR scanning requires camera access"), - "Raspberry, Red" : MessageLookupByLibrary.simpleMessage("Raspberry, Red"), - "Recipients" : MessageLookupByLibrary.simpleMessage("Recipients"), - "Refresh" : MessageLookupByLibrary.simpleMessage("Refresh"), - "Remind Me" : MessageLookupByLibrary.simpleMessage("Remind Me"), - "Reminders" : MessageLookupByLibrary.simpleMessage("Reminders"), - "Reminders have changed!" : MessageLookupByLibrary.simpleMessage("Reminders have changed!"), - "Reply" : MessageLookupByLibrary.simpleMessage("Reply"), - "Reply All" : MessageLookupByLibrary.simpleMessage("Reply all"), - "Report A Problem" : MessageLookupByLibrary.simpleMessage("Report a problem"), - "Request Login Help" : MessageLookupByLibrary.simpleMessage("Request Login Help"), - "Request Login Help Button" : MessageLookupByLibrary.simpleMessage("Request Login Help Button"), - "Restart app" : MessageLookupByLibrary.simpleMessage("Restart app"), - "Retry" : MessageLookupByLibrary.simpleMessage("Retry"), - "Return to Login" : MessageLookupByLibrary.simpleMessage("Return to login"), - "STUDENT" : MessageLookupByLibrary.simpleMessage("STUDENT"), - "Screenshot showing location of QR code generation in browser" : MessageLookupByLibrary.simpleMessage("Screenshot showing location of QR code generation in browser"), - "Screenshot showing location of pairing QR code generation in the Canvas Student app" : MessageLookupByLibrary.simpleMessage("Screenshot showing location of pairing QR code generation in the Canvas Student app"), - "Select" : MessageLookupByLibrary.simpleMessage("Select"), - "Select Student Color" : MessageLookupByLibrary.simpleMessage("Select Student Colour"), - "Select recipients" : MessageLookupByLibrary.simpleMessage("Select recipients"), - "Send Feedback" : MessageLookupByLibrary.simpleMessage("Send feedback"), - "Send a message about this assignment" : MessageLookupByLibrary.simpleMessage("Send a message about this assignment"), - "Send a message about this course" : MessageLookupByLibrary.simpleMessage("Send a message about this module"), - "Send message" : MessageLookupByLibrary.simpleMessage("Send message"), - "Set a date and time to be notified of this event." : MessageLookupByLibrary.simpleMessage("Set a date and time to be notified of this event."), - "Set a date and time to be notified of this specific assignment." : MessageLookupByLibrary.simpleMessage("Set a date and time to be notified of this specific assignment."), - "Settings" : MessageLookupByLibrary.simpleMessage("Settings"), - "Shamrock, Green" : MessageLookupByLibrary.simpleMessage("Shamrock, Green"), - "Share Your Love for the App" : MessageLookupByLibrary.simpleMessage("Share your love for the app"), - "Show Password" : MessageLookupByLibrary.simpleMessage("Show Password"), - "Sign In" : MessageLookupByLibrary.simpleMessage("Sign in"), - "Something went wrong trying to create your account, please reach out to your school for assistance." : MessageLookupByLibrary.simpleMessage("Something went wrong trying to create your account, please reach out to your school for assistance."), - "Something\'s broken but I can work around it to get what I need done." : MessageLookupByLibrary.simpleMessage("Something\'s broken, but I can work around it to finish what I need to do."), - "Stop Acting as User" : MessageLookupByLibrary.simpleMessage("Stop acting as user"), - "Student" : MessageLookupByLibrary.simpleMessage("Student"), - "Student Pairing" : MessageLookupByLibrary.simpleMessage("Student Pairing"), - "Students can create a QR code using the Canvas Student app on their mobile device" : MessageLookupByLibrary.simpleMessage("Students can create a QR code using the Canvas Student app on their mobile device"), - "Students can obtain a pairing code through the Canvas website" : MessageLookupByLibrary.simpleMessage("Students can obtain a pairing code through the Canvas website"), - "Subject" : MessageLookupByLibrary.simpleMessage("Subject"), - "Submitted" : MessageLookupByLibrary.simpleMessage("Submitted"), - "Successfully submitted!" : MessageLookupByLibrary.simpleMessage("Successfully submitted!"), - "Summary" : MessageLookupByLibrary.simpleMessage("Summary"), - "Switch Users" : MessageLookupByLibrary.simpleMessage("Switch users"), - "Syllabus" : MessageLookupByLibrary.simpleMessage("Syllabus"), - "TA" : MessageLookupByLibrary.simpleMessage("TA"), - "TEACHER" : MessageLookupByLibrary.simpleMessage("TEACHER"), - "Tap to favorite the courses you want to see on the Calendar. Select up to 10." : MessageLookupByLibrary.simpleMessage("Tap to favourite the modules you want to see on the Calendar. Select up to 10."), - "Tap to pair with a new student" : MessageLookupByLibrary.simpleMessage("Tap to pair with a new student"), - "Tap to select this student" : MessageLookupByLibrary.simpleMessage("Tap to select this student"), - "Tap to show student selector" : MessageLookupByLibrary.simpleMessage("Tap to show student selector"), - "Teacher" : MessageLookupByLibrary.simpleMessage("Teacher"), - "Tell us about your favorite parts of the app" : MessageLookupByLibrary.simpleMessage("Tell us about your favourite parts of the app"), - "Terms of Service" : MessageLookupByLibrary.simpleMessage("Terms of Service"), - "Terms of Service Link" : MessageLookupByLibrary.simpleMessage("Terms of Service Link"), - "Terms of Use" : MessageLookupByLibrary.simpleMessage("Terms of Use"), - "The QR code you scanned may have expired. Refresh the code on the student\'s device and try again." : MessageLookupByLibrary.simpleMessage("The QR code you scanned may have expired. Refresh the code on the student\'s device and try again."), - "The following information will help us better understand your idea:" : MessageLookupByLibrary.simpleMessage("The following information will help us better understand your idea:"), - "The server you entered is not authorized for this app." : MessageLookupByLibrary.simpleMessage("The server you entered is not authorised for this app."), - "The student you are trying to add belongs to a different school. Log in or create an account with that school to scan this code." : MessageLookupByLibrary.simpleMessage("The student you are trying to add belongs to a different school. Log in or create an account with that school to scan this code."), - "The user agent for this app is not authorized." : MessageLookupByLibrary.simpleMessage("The user agent for this app is not authorised."), - "Theme" : MessageLookupByLibrary.simpleMessage("Theme"), - "There are no installed applications that can open this file" : MessageLookupByLibrary.simpleMessage("There are no installed applications that can open this file"), - "There is no page information available." : MessageLookupByLibrary.simpleMessage("There is no page information available."), - "There was a problem loading the Terms of Use" : MessageLookupByLibrary.simpleMessage("There was a problem loading the Terms of Use"), - "There was a problem removing this student from your account. Please check your connection and try again." : MessageLookupByLibrary.simpleMessage("There was a problem removing this student from your account. Please check your connection and try again."), - "There was an error loading recipients for this course" : MessageLookupByLibrary.simpleMessage("There was an error loading recipients for this module"), - "There was an error loading the summary details for this course." : MessageLookupByLibrary.simpleMessage("There was an error loading the summary details for this module."), - "There was an error loading this announcement" : MessageLookupByLibrary.simpleMessage("There was an error loading this announcement"), - "There was an error loading this conversation" : MessageLookupByLibrary.simpleMessage("There was an error loading this conversation"), - "There was an error loading this file" : MessageLookupByLibrary.simpleMessage("There was an error loading this file"), - "There was an error loading your inbox messages." : MessageLookupByLibrary.simpleMessage("There was an error loading your inbox messages."), - "There was an error loading your student\'s alerts." : MessageLookupByLibrary.simpleMessage("There was an error loading your student\'s alerts."), - "There was an error loading your student\'s calendar" : MessageLookupByLibrary.simpleMessage("There was an error loading your student\'s calendar"), - "There was an error loading your students." : MessageLookupByLibrary.simpleMessage("There was an error loading your students."), - "There was an error loading your student’s courses." : MessageLookupByLibrary.simpleMessage("There was an error loading your student’s modules."), - "There was an error logging in. Please generate another QR Code and try again." : MessageLookupByLibrary.simpleMessage("There was an error logging in. Please generate another QR Code and try again."), - "There was an error trying to act as this user. Please check the Domain and User ID and try again." : MessageLookupByLibrary.simpleMessage("There was an error trying to act as this user. Please check the Domain and User ID and try again."), - "There’s nothing to be notified of yet." : MessageLookupByLibrary.simpleMessage("There’s nothing to be notified of yet."), - "This app is not authorized for use." : MessageLookupByLibrary.simpleMessage("This app is not authorised for use."), - "This course does not have any assignments or calendar events yet." : MessageLookupByLibrary.simpleMessage("This module does not have any assignments or calendar events yet."), - "This file is unsupported and can’t be viewed through the app" : MessageLookupByLibrary.simpleMessage("This file is unsupported and can’t be viewed through the app"), - "This will unpair and remove all enrollments for this student from your account." : MessageLookupByLibrary.simpleMessage("This will unpair and remove all enrolments for this student from your account."), - "Total Grade" : MessageLookupByLibrary.simpleMessage("Total mark"), - "Uh oh!" : MessageLookupByLibrary.simpleMessage("Uh oh!"), - "Unable to fetch courses. Please check your connection and try again." : MessageLookupByLibrary.simpleMessage("Unable to fetch modules. Please check your connection and try again."), - "Unable to load this image" : MessageLookupByLibrary.simpleMessage("Unable to load this image"), - "Unable to play this media file" : MessageLookupByLibrary.simpleMessage("Unable to play this media file"), - "Unable to send message. Check your connection and try again." : MessageLookupByLibrary.simpleMessage("Unable to send message. Check your connection and try again."), - "Under Construction" : MessageLookupByLibrary.simpleMessage("Under Construction"), - "Unknown User" : MessageLookupByLibrary.simpleMessage("Unknown user"), - "Unsaved changes" : MessageLookupByLibrary.simpleMessage("Unsaved changes"), - "Unsupported File" : MessageLookupByLibrary.simpleMessage("Unsupported File"), - "Upload File" : MessageLookupByLibrary.simpleMessage("Upload file"), - "Use Camera" : MessageLookupByLibrary.simpleMessage("Use Camera"), - "Use Dark Theme in Web Content" : MessageLookupByLibrary.simpleMessage("Use Dark Theme in Web Content"), - "User ID" : MessageLookupByLibrary.simpleMessage("User ID"), - "User ID:" : MessageLookupByLibrary.simpleMessage("User ID"), - "Version Number" : MessageLookupByLibrary.simpleMessage("Version number"), - "View Description" : MessageLookupByLibrary.simpleMessage("View Description"), - "View error details" : MessageLookupByLibrary.simpleMessage("View error details"), - "View the Privacy Policy" : MessageLookupByLibrary.simpleMessage("View the Privacy Policy"), - "We are currently building this feature for your viewing pleasure." : MessageLookupByLibrary.simpleMessage("We are currently building this feature for your viewing pleasure."), - "We are unable to display this link, it may belong to an institution you currently aren\'t logged in to." : MessageLookupByLibrary.simpleMessage("We are unable to display this link, it may belong to an institution you currently aren\'t logged in to."), - "We couldn\'t find any students associated with this account" : MessageLookupByLibrary.simpleMessage("We couldn\'t find any students associated with this account"), - "We were unable to verify the server for use with this app." : MessageLookupByLibrary.simpleMessage("We were unable to verify the server for use with this app."), - "We’re not sure what happened, but it wasn’t good. Contact us if this keeps happening." : MessageLookupByLibrary.simpleMessage("We’re not sure what happened, but it wasn’t good. Contact us if this keeps happening."), - "What can we do better?" : MessageLookupByLibrary.simpleMessage("What can we do better?"), - "Yes" : MessageLookupByLibrary.simpleMessage("Yes"), - "You are not observing any students." : MessageLookupByLibrary.simpleMessage("You are not observing any students."), - "You may only choose 10 calendars to display" : MessageLookupByLibrary.simpleMessage("You may only choose 10 calendars to display"), - "You must enter a user id" : MessageLookupByLibrary.simpleMessage("You must enter a user id"), - "You must enter a valid domain" : MessageLookupByLibrary.simpleMessage("You must enter a valid domain"), - "You must select at least one calendar to display" : MessageLookupByLibrary.simpleMessage("You must select at least one calendar to display"), - "You will be notified about this assignment on…" : MessageLookupByLibrary.simpleMessage("You will be notified about this assignment on…"), - "You will be notified about this event on…" : MessageLookupByLibrary.simpleMessage("You will be notified about this event on…"), - "You\'ll find the QR code on the web in your account profile. Click \'QR for Mobile Login\' in the list." : MessageLookupByLibrary.simpleMessage("You\'ll find the QR code on the web in your account profile. Click \'QR for Mobile Login\' in the list."), - "You\'ll need to open your student\'s Canvas Student app to continue. Go into Main Menu > Settings > Pair with Observer and scan the QR code you see there." : MessageLookupByLibrary.simpleMessage("You\'ll need to open your student\'s Canvas Student app to continue. Go into Main Menu > Settings > Pair with Observer and scan the QR code you see there."), - "Your code is incorrect or expired." : MessageLookupByLibrary.simpleMessage("Your code is incorrect or expired."), - "Your student’s courses might not be published yet." : MessageLookupByLibrary.simpleMessage("Your student’s modules might not be published yet."), - "You’re all caught up!" : MessageLookupByLibrary.simpleMessage("You’re all caught up!"), - "actingAsUser" : m0, - "alertsLabel" : MessageLookupByLibrary.simpleMessage("Alerts"), - "appVersion" : m1, - "assignmentGradeAboveThreshold" : m2, - "assignmentGradeBelowThreshold" : m3, - "assignmentLockedModule" : m4, - "assignmentSubjectMessage" : m5, - "assignmentTotalPoints" : m6, - "assignmentTotalPointsAccessible" : m7, - "authorToNOthers" : m8, - "authorToRecipient" : m9, - "authorToRecipientAndNOthers" : m10, - "badgeNumberPlus" : m11, - "calendarLabel" : MessageLookupByLibrary.simpleMessage("Calendar"), - "canvasGuides" : MessageLookupByLibrary.simpleMessage("Canvas Guides"), - "canvasLogoLabel" : MessageLookupByLibrary.simpleMessage("Canvas logo"), - "canvasSupport" : MessageLookupByLibrary.simpleMessage("Canvas Support"), - "changeStudentColorLabel" : m12, - "collapse" : MessageLookupByLibrary.simpleMessage("collapse"), - "collapsed" : MessageLookupByLibrary.simpleMessage("collapsed"), - "contentDescriptionScoreOutOfPointsPossible" : m13, - "courseForWhom" : m14, - "courseGradeAboveThreshold" : m15, - "courseGradeBelowThreshold" : m16, - "coursesLabel" : MessageLookupByLibrary.simpleMessage("Modules"), - "dateAtTime" : m17, - "dismissAlertLabel" : m18, - "domainSearchHelpBody" : m19, - "domainSearchHelpLabel" : MessageLookupByLibrary.simpleMessage("How do I find my school or district?"), - "domainSearchInputHint" : MessageLookupByLibrary.simpleMessage("Enter school name or district…"), - "dueDateAtTime" : m20, - "endMasqueradeLogoutMessage" : m21, - "endMasqueradeMessage" : m22, - "eventSubjectMessage" : m23, - "eventTime" : m24, - "expand" : MessageLookupByLibrary.simpleMessage("expand"), - "expanded" : MessageLookupByLibrary.simpleMessage("expanded"), - "finalGrade" : m25, - "findSchool" : MessageLookupByLibrary.simpleMessage("Find School"), - "frontPageSubjectMessage" : m26, - "gradeFormatScoreOutOfPointsPossible" : m27, - "gradesSubjectMessage" : m28, - "latePenalty" : m29, - "me" : MessageLookupByLibrary.simpleMessage("me"), - "messageLinkPostscript" : m30, - "minus" : MessageLookupByLibrary.simpleMessage("minus"), - "mustBeAboveN" : m31, - "mustBeBelowN" : m32, - "next" : MessageLookupByLibrary.simpleMessage("Next"), - "nextMonth" : m33, - "nextWeek" : m34, - "noDomainResults" : m35, - "ok" : MessageLookupByLibrary.simpleMessage("OK"), - "outOfPoints" : m36, - "plusRecipientCount" : m37, - "pointsPossible" : m38, - "previousMonth" : m39, - "previousWeek" : m40, - "qrCreateAccountTos" : m41, - "ratingDialogEmailSubject" : m42, - "selectedMonthLabel" : m43, - "send" : MessageLookupByLibrary.simpleMessage("send"), - "starRating" : m44, - "submissionStatusSuccessSubtitle" : m45, - "syllabusSubjectMessage" : m46, - "unread" : MessageLookupByLibrary.simpleMessage("unread"), - "unreadCount" : m47 - }; -} diff --git a/apps/flutter_parent/lib/l10n/generated/messages_en_GB.dart b/apps/flutter_parent/lib/l10n/generated/messages_en_GB.dart deleted file mode 100644 index 3db8434fe9..0000000000 --- a/apps/flutter_parent/lib/l10n/generated/messages_en_GB.dart +++ /dev/null @@ -1,473 +0,0 @@ -// DO NOT EDIT. This is code generated via package:intl/generate_localized.dart -// This is a library that provides messages for a en_GB locale. All the -// messages from the main program should be duplicated here with the same -// function name. - -// Ignore issues from commonly used lints in this file. -// ignore_for_file:unnecessary_brace_in_string_interps, unnecessary_new -// ignore_for_file:prefer_single_quotes,comment_references, directives_ordering -// ignore_for_file:annotate_overrides,prefer_generic_function_type_aliases -// ignore_for_file:unused_import, file_names - -import 'package:intl/intl.dart'; -import 'package:intl/message_lookup_by_library.dart'; - -final messages = new MessageLookup(); - -typedef String MessageIfAbsent(String messageStr, List args); - -class MessageLookup extends MessageLookupByLibrary { - String get localeName => 'en_GB'; - - static m0(userName) => "You are acting as ${userName}"; - - static m1(version) => "v. ${version}"; - - static m2(threshold) => "Assignment Grade Above ${threshold}"; - - static m3(threshold) => "Assignment Grade Below ${threshold}"; - - static m4(moduleName) => "This assignment is locked by the module \"${moduleName}\"."; - - static m5(studentName, assignmentName) => "Regarding: ${studentName}, Assignment - ${assignmentName}"; - - static m6(points) => "${points} pts"; - - static m7(points) => "${points} points"; - - static m8(authorName, howMany) => "${Intl.plural(howMany, one: '${authorName} to 1 other', other: '${authorName} to ${howMany} others')}"; - - static m9(authorName, recipientName) => "${authorName} to ${recipientName}"; - - static m10(authorName, recipientName, howMany) => "${Intl.plural(howMany, one: '${authorName} to ${recipientName} & 1 other', other: '${authorName} to ${recipientName} & ${howMany} others')}"; - - static m11(count) => "${count}+"; - - static m12(studentName) => "Change colour for ${studentName}"; - - static m13(score, pointsPossible) => "${score} out of ${pointsPossible} points"; - - static m14(studentShortName) => "for ${studentShortName}"; - - static m15(threshold) => "Course Grade Above ${threshold}"; - - static m16(threshold) => "Course Grade Below ${threshold}"; - - static m17(date, time) => "${date} at ${time}"; - - static m18(alertTitle) => "Dismiss ${alertTitle}"; - - static m19(canvasGuides, canvasSupport) => "Try searching for the name of the school or district you’re attempting to access, like “Smith Private School” or “Smith County Schools.” You can also enter a Canvas domain directly, like “smith.instructure.com.”\n\nFor more information on finding your institution’s Canvas account, you can visit the ${canvasGuides}, reach out to ${canvasSupport}, or contact your school for assistance."; - - static m20(date, time) => "Due ${date} at ${time}"; - - static m21(userName) => "You will stop acting as ${userName} and will be logged out."; - - static m22(userName) => "You will stop acting as ${userName} and return to your original account."; - - static m23(studentName, eventTitle) => "Regarding: ${studentName}, Event - ${eventTitle}"; - - static m24(startAt, endAt) => "${startAt} - ${endAt}"; - - static m25(grade) => "Final grade: ${grade}"; - - static m26(studentName) => "Regarding: ${studentName}, Front Page"; - - static m27(score, pointsPossible) => "${score} / ${pointsPossible}"; - - static m28(studentName) => "Regarding: ${studentName}, Grades"; - - static m29(pointsLost) => "Late penalty (-${pointsLost})"; - - static m30(studentName, linkUrl) => "Regarding: ${studentName}, ${linkUrl}"; - - static m31(percentage) => "Must be above ${percentage}"; - - static m32(percentage) => "Must be below ${percentage}"; - - static m33(month) => "Next month: ${month}"; - - static m34(date) => "Next week starting ${date}"; - - static m35(query) => "Unable to find schools matching \"${query}\""; - - static m36(points, howMany) => "${Intl.plural(howMany, one: 'Out of 1 point', other: 'Out of ${points} points')}"; - - static m37(count) => "+${count}"; - - static m38(points) => "${points} points possible"; - - static m39(month) => "Previous month: ${month}"; - - static m40(date) => "Previous week starting ${date}"; - - static m41(termsOfService, privacyPolicy) => "By tapping \'Create Account\', you agree to the ${termsOfService} and acknowledge the ${privacyPolicy}"; - - static m42(version) => "Suggestions for Android - Canvas Parent ${version}"; - - static m43(month) => "Month of ${month}"; - - static m44(position) => "${Intl.plural(position, one: '${position} star', other: '${position} stars')}"; - - static m45(date, time) => "This assignment was submitted on ${date} at ${time} and is waiting to be graded"; - - static m46(studentName) => "Regarding: ${studentName}, Syllabus"; - - static m47(count) => "${count} unread"; - - final messages = _notInlinedMessages(_notInlinedMessages); - static _notInlinedMessages(_) => { - "\"Act as\" is essentially logging in as this user without a password. You will be able to take any action as if you were this user, and from other users\' points of views, it will be as if this user performed them. However, audit logs record that you were the one who performed the actions on behalf of this user." : MessageLookupByLibrary.simpleMessage("\"Act as\" is essentially logging in as this user without a password. You will be able to take any action as if you were this user, and from other users\' points of views, it will be as if this user performed them. However, audit logs record that you were the one who performed the actions on behalf of this user."), - "-" : MessageLookupByLibrary.simpleMessage("-"), - "A description is required." : MessageLookupByLibrary.simpleMessage("A description is required."), - "A network error occurred when adding this student. Check your connection and try again." : MessageLookupByLibrary.simpleMessage("A network error occurred when adding this student. Check your connection and try again."), - "A subject is required." : MessageLookupByLibrary.simpleMessage("A subject is required."), - "Act As User" : MessageLookupByLibrary.simpleMessage("Act As User"), - "Add Student" : MessageLookupByLibrary.simpleMessage("Add student"), - "Add attachment" : MessageLookupByLibrary.simpleMessage("Add attachment"), - "Add new student" : MessageLookupByLibrary.simpleMessage("Add new student"), - "Add student with…" : MessageLookupByLibrary.simpleMessage("Add student with…"), - "Alert Settings" : MessageLookupByLibrary.simpleMessage("Alert Settings"), - "Alert me when…" : MessageLookupByLibrary.simpleMessage("Alert me when…"), - "All Grading Periods" : MessageLookupByLibrary.simpleMessage("All Grading Periods"), - "Already have an account? " : MessageLookupByLibrary.simpleMessage("Already have an account? "), - "An email address is required." : MessageLookupByLibrary.simpleMessage("An email address is required."), - "An error occurred when trying to display this link" : MessageLookupByLibrary.simpleMessage("An error occurred when trying to display this link"), - "An error occurred while saving your selection. Please try again." : MessageLookupByLibrary.simpleMessage("An error occurred while saving your selection. Please try again."), - "An unexpected error occurred" : MessageLookupByLibrary.simpleMessage("An unexpected error occurred"), - "Android OS version" : MessageLookupByLibrary.simpleMessage("Android OS version"), - "Appearance" : MessageLookupByLibrary.simpleMessage("Appearance"), - "Application version" : MessageLookupByLibrary.simpleMessage("Application version"), - "Are you a student or teacher?" : MessageLookupByLibrary.simpleMessage("Are you a student or teacher?"), - "Are you sure you want to log out?" : MessageLookupByLibrary.simpleMessage("Are you sure you want to log out?"), - "Are you sure you wish to close this page? Your unsent message will be lost." : MessageLookupByLibrary.simpleMessage("Are you sure you wish to close this page? Your unsent message will be lost."), - "Assignment Details" : MessageLookupByLibrary.simpleMessage("Assignment details"), - "Assignment grade above" : MessageLookupByLibrary.simpleMessage("Assignment mark above"), - "Assignment grade below" : MessageLookupByLibrary.simpleMessage("Assignment mark below"), - "Assignment missing" : MessageLookupByLibrary.simpleMessage("Assignment missing"), - "Barney, Fuschia" : MessageLookupByLibrary.simpleMessage("Barney, Fuchsia"), - "Calendars" : MessageLookupByLibrary.simpleMessage("Calendars"), - "Camera Permission" : MessageLookupByLibrary.simpleMessage("Camera Permission"), - "Cancel" : MessageLookupByLibrary.simpleMessage("Cancel"), - "Canvas Student" : MessageLookupByLibrary.simpleMessage("Canvas student"), - "Canvas Teacher" : MessageLookupByLibrary.simpleMessage("Canvas teacher"), - "Canvas on GitHub" : MessageLookupByLibrary.simpleMessage("Canvas on GitHub"), - "Choose a course to message" : MessageLookupByLibrary.simpleMessage("Choose a course to message"), - "Choose from Gallery" : MessageLookupByLibrary.simpleMessage("Choose from Gallery"), - "Complete" : MessageLookupByLibrary.simpleMessage("Complete"), - "Contact Support" : MessageLookupByLibrary.simpleMessage("Contact support"), - "Course Announcement" : MessageLookupByLibrary.simpleMessage("Course announcement"), - "Course Announcements" : MessageLookupByLibrary.simpleMessage("Course announcements"), - "Course grade above" : MessageLookupByLibrary.simpleMessage("Course mark above"), - "Course grade below" : MessageLookupByLibrary.simpleMessage("Course mark below"), - "Create Account" : MessageLookupByLibrary.simpleMessage("Create account"), - "Dark Mode" : MessageLookupByLibrary.simpleMessage("Dark mode"), - "Date" : MessageLookupByLibrary.simpleMessage("Date"), - "Delete" : MessageLookupByLibrary.simpleMessage("Delete"), - "Description" : MessageLookupByLibrary.simpleMessage("Description"), - "Device" : MessageLookupByLibrary.simpleMessage("Device"), - "Device model" : MessageLookupByLibrary.simpleMessage("Device model"), - "Domain" : MessageLookupByLibrary.simpleMessage("Domain"), - "Domain:" : MessageLookupByLibrary.simpleMessage("Domain:"), - "Don\'t show again" : MessageLookupByLibrary.simpleMessage("Don\'t show again"), - "Done" : MessageLookupByLibrary.simpleMessage("Done"), - "Download" : MessageLookupByLibrary.simpleMessage("Download"), - "Due" : MessageLookupByLibrary.simpleMessage("Due"), - "EXTREME CRITICAL EMERGENCY!!" : MessageLookupByLibrary.simpleMessage("EXTREME CRITICAL EMERGENCY!!"), - "Electric, blue" : MessageLookupByLibrary.simpleMessage("Electric, blue"), - "Email Address" : MessageLookupByLibrary.simpleMessage("Email address"), - "Email:" : MessageLookupByLibrary.simpleMessage("Email"), - "Email…" : MessageLookupByLibrary.simpleMessage("Email…"), - "Enter the student pairing code provided to you. If the pairing code doesn\'t work, it may have expired" : MessageLookupByLibrary.simpleMessage("Enter the student pairing code provided to you. If the pairing code doesn\'t work, it may have expired"), - "Event" : MessageLookupByLibrary.simpleMessage("Event"), - "Excused" : MessageLookupByLibrary.simpleMessage("Excused"), - "Expired QR Code" : MessageLookupByLibrary.simpleMessage("Expired QR Code"), - "Failed. Tap for options." : MessageLookupByLibrary.simpleMessage("Failed. Tap for options."), - "Filter" : MessageLookupByLibrary.simpleMessage("Filter"), - "Filter by" : MessageLookupByLibrary.simpleMessage("Filter by"), - "Fire, Orange" : MessageLookupByLibrary.simpleMessage("Fire, Orange"), - "Front Page" : MessageLookupByLibrary.simpleMessage("Front page"), - "Full Name" : MessageLookupByLibrary.simpleMessage("Full name"), - "Full Name…" : MessageLookupByLibrary.simpleMessage("Full Name…"), - "Full error message" : MessageLookupByLibrary.simpleMessage("Full error message"), - "Go to today" : MessageLookupByLibrary.simpleMessage("Go to today"), - "Grade" : MessageLookupByLibrary.simpleMessage("Grade"), - "Grade percentage" : MessageLookupByLibrary.simpleMessage("Grade percentage"), - "Graded" : MessageLookupByLibrary.simpleMessage("Graded"), - "Grades" : MessageLookupByLibrary.simpleMessage("Grades"), - "Help" : MessageLookupByLibrary.simpleMessage("Help"), - "Hide Password" : MessageLookupByLibrary.simpleMessage("Hide Password"), - "High Contrast Mode" : MessageLookupByLibrary.simpleMessage("High Contrast Mode"), - "How are we doing?" : MessageLookupByLibrary.simpleMessage("How are we doing?"), - "How is this affecting you?" : MessageLookupByLibrary.simpleMessage("How is this affecting you?"), - "I can\'t get things done until I hear back from you." : MessageLookupByLibrary.simpleMessage("I can\'t finish what I need to do until I hear back from you."), - "I don\'t have a Canvas account" : MessageLookupByLibrary.simpleMessage("I don\'t have a Canvas account"), - "I have a Canvas account" : MessageLookupByLibrary.simpleMessage("I have a Canvas account"), - "I need some help but it\'s not urgent." : MessageLookupByLibrary.simpleMessage("I need some help but it\'s not urgent."), - "I\'m having trouble logging in" : MessageLookupByLibrary.simpleMessage("I\'m having trouble logging in"), - "Idea for Canvas Parent App [Android]" : MessageLookupByLibrary.simpleMessage("Idea for Canvas Parent App [Android]"), - "In order to provide you with a better experience, we have updated how reminders work. You can add new reminders by viewing an assignment or calendar event and tapping the switch under the \"Remind Me\" section.\n\nBe aware that any reminders created with older versions of this app will not be compatible with the new changes and you will need to create them again." : MessageLookupByLibrary.simpleMessage("In order to provide you with a better experience, we have updated how reminders work. You can add new reminders by viewing an assignment or calendar event and tapping the switch under the \"Remind Me\" section.\n\nBe aware that any reminders created with older versions of this app will not be compatible with the new changes and you will need to create them again."), - "Inbox" : MessageLookupByLibrary.simpleMessage("Inbox"), - "Inbox Zero" : MessageLookupByLibrary.simpleMessage("Inbox zero"), - "Incomplete" : MessageLookupByLibrary.simpleMessage("Incomplete"), - "Incorrect Domain" : MessageLookupByLibrary.simpleMessage("Incorrect Domain"), - "Institution Announcement" : MessageLookupByLibrary.simpleMessage("Institution announcement"), - "Institution Announcements" : MessageLookupByLibrary.simpleMessage("Institution announcements"), - "Instructions" : MessageLookupByLibrary.simpleMessage("Instructions"), - "Interactions on this page are limited by your institution." : MessageLookupByLibrary.simpleMessage("Interactions on this page are limited by your institution."), - "Invalid QR Code" : MessageLookupByLibrary.simpleMessage("Invalid QR Code"), - "It looks like a great day to rest, relax, and recharge." : MessageLookupByLibrary.simpleMessage("It looks like a great day to rest, relax, and recharge."), - "It looks like assignments haven\'t been created in this space yet." : MessageLookupByLibrary.simpleMessage("It looks like assignments haven\'t been created in this space yet."), - "Just a casual question, comment, idea, suggestion…" : MessageLookupByLibrary.simpleMessage("Just a casual question, comment, idea, suggestion…"), - "Late" : MessageLookupByLibrary.simpleMessage("Late"), - "Launch External Tool" : MessageLookupByLibrary.simpleMessage("Launch external tool"), - "Legal" : MessageLookupByLibrary.simpleMessage("Legal"), - "Light Mode" : MessageLookupByLibrary.simpleMessage("Light Mode"), - "Link Error" : MessageLookupByLibrary.simpleMessage("Link Error"), - "Locale:" : MessageLookupByLibrary.simpleMessage("Locale:"), - "Locate QR Code" : MessageLookupByLibrary.simpleMessage("Locate QR Code"), - "Location" : MessageLookupByLibrary.simpleMessage("Location"), - "Locked" : MessageLookupByLibrary.simpleMessage("Locked"), - "Log Out" : MessageLookupByLibrary.simpleMessage("Log out"), - "Login flow: Canvas" : MessageLookupByLibrary.simpleMessage("Login flow: Canvas"), - "Login flow: Normal" : MessageLookupByLibrary.simpleMessage("Login flow: Normal"), - "Login flow: Site Admin" : MessageLookupByLibrary.simpleMessage("Login flow: Site admin"), - "Login flow: Skip mobile verify" : MessageLookupByLibrary.simpleMessage("Login flow: Skip mobile verify"), - "Manage Students" : MessageLookupByLibrary.simpleMessage("Manage Students"), - "Message" : MessageLookupByLibrary.simpleMessage("Message"), - "Message subject" : MessageLookupByLibrary.simpleMessage("Message subject"), - "Missing" : MessageLookupByLibrary.simpleMessage("Missing"), - "Must be below 100" : MessageLookupByLibrary.simpleMessage("Must be below 100"), - "Network error" : MessageLookupByLibrary.simpleMessage("Network error"), - "Never" : MessageLookupByLibrary.simpleMessage("Never"), - "New message" : MessageLookupByLibrary.simpleMessage("New message"), - "No" : MessageLookupByLibrary.simpleMessage("No"), - "No Alerts" : MessageLookupByLibrary.simpleMessage("No Alerts"), - "No Assignments" : MessageLookupByLibrary.simpleMessage("No assignments"), - "No Courses" : MessageLookupByLibrary.simpleMessage("No courses"), - "No Due Date" : MessageLookupByLibrary.simpleMessage("No due date"), - "No Events Today!" : MessageLookupByLibrary.simpleMessage("No events today!"), - "No Grade" : MessageLookupByLibrary.simpleMessage("No mark"), - "No Location Specified" : MessageLookupByLibrary.simpleMessage("No location specified"), - "No Students" : MessageLookupByLibrary.simpleMessage("No Students"), - "No Subject" : MessageLookupByLibrary.simpleMessage("No Subject"), - "No Summary" : MessageLookupByLibrary.simpleMessage("No Summary"), - "No description" : MessageLookupByLibrary.simpleMessage("No description"), - "No recipients selected" : MessageLookupByLibrary.simpleMessage("No recipients selected"), - "Not Graded" : MessageLookupByLibrary.simpleMessage("Not graded"), - "Not Submitted" : MessageLookupByLibrary.simpleMessage("Not submitted"), - "Not a parent?" : MessageLookupByLibrary.simpleMessage("Not a parent?"), - "Notifications for reminders about assignments and calendar events" : MessageLookupByLibrary.simpleMessage("Notifications for reminders about assignments and calendar events"), - "OS Version" : MessageLookupByLibrary.simpleMessage("OS version"), - "Observer" : MessageLookupByLibrary.simpleMessage("Observer"), - "One of our other apps might be a better fit. Tap one to visit the Play Store." : MessageLookupByLibrary.simpleMessage("One of our other apps may be a better fit. Tap one to visit the Play Store."), - "Open Canvas Student" : MessageLookupByLibrary.simpleMessage("Open Canvas Student"), - "Open In Browser" : MessageLookupByLibrary.simpleMessage("Open In browser"), - "Open with another app" : MessageLookupByLibrary.simpleMessage("Open with another app"), - "Pairing Code" : MessageLookupByLibrary.simpleMessage("Pairing Code"), - "Password" : MessageLookupByLibrary.simpleMessage("Password"), - "Password is required" : MessageLookupByLibrary.simpleMessage("Password is required"), - "Password must contain at least 8 characters" : MessageLookupByLibrary.simpleMessage("Password must contain at least 8 characters"), - "Password…" : MessageLookupByLibrary.simpleMessage("Password…"), - "Planner Note" : MessageLookupByLibrary.simpleMessage("Planner note"), - "Please enter a valid email address" : MessageLookupByLibrary.simpleMessage("Please enter a valid email address"), - "Please enter an email address" : MessageLookupByLibrary.simpleMessage("Please enter an email address"), - "Please enter full name" : MessageLookupByLibrary.simpleMessage("Please enter full name"), - "Please scan a QR code generated by Canvas" : MessageLookupByLibrary.simpleMessage("Please scan a QR code generated by Canvas"), - "Plum, Purple" : MessageLookupByLibrary.simpleMessage("Plum, Purple"), - "Preparing…" : MessageLookupByLibrary.simpleMessage("Preparing…"), - "Previous Logins" : MessageLookupByLibrary.simpleMessage("Previous logins"), - "Privacy Policy" : MessageLookupByLibrary.simpleMessage("Privacy Policy"), - "Privacy Policy Link" : MessageLookupByLibrary.simpleMessage("Privacy Policy Link"), - "Privacy policy, terms of use, open source" : MessageLookupByLibrary.simpleMessage("Privacy policy, terms of use, open source"), - "QR Code" : MessageLookupByLibrary.simpleMessage("QR Code"), - "QR scanning requires camera access" : MessageLookupByLibrary.simpleMessage("QR scanning requires camera access"), - "Raspberry, Red" : MessageLookupByLibrary.simpleMessage("Raspberry, Red"), - "Recipients" : MessageLookupByLibrary.simpleMessage("Recipients"), - "Refresh" : MessageLookupByLibrary.simpleMessage("Refresh"), - "Remind Me" : MessageLookupByLibrary.simpleMessage("Remind Me"), - "Reminders" : MessageLookupByLibrary.simpleMessage("Reminders"), - "Reminders have changed!" : MessageLookupByLibrary.simpleMessage("Reminders have changed!"), - "Reply" : MessageLookupByLibrary.simpleMessage("Reply"), - "Reply All" : MessageLookupByLibrary.simpleMessage("Reply all"), - "Report A Problem" : MessageLookupByLibrary.simpleMessage("Report a problem"), - "Request Login Help" : MessageLookupByLibrary.simpleMessage("Request Login Help"), - "Request Login Help Button" : MessageLookupByLibrary.simpleMessage("Request Login Help Button"), - "Restart app" : MessageLookupByLibrary.simpleMessage("Restart app"), - "Retry" : MessageLookupByLibrary.simpleMessage("Retry"), - "Return to Login" : MessageLookupByLibrary.simpleMessage("Return to login"), - "STUDENT" : MessageLookupByLibrary.simpleMessage("STUDENT"), - "Screenshot showing location of QR code generation in browser" : MessageLookupByLibrary.simpleMessage("Screenshot showing location of QR code generation in browser"), - "Screenshot showing location of pairing QR code generation in the Canvas Student app" : MessageLookupByLibrary.simpleMessage("Screenshot showing location of pairing QR code generation in the Canvas Student app"), - "Select" : MessageLookupByLibrary.simpleMessage("Select"), - "Select Student Color" : MessageLookupByLibrary.simpleMessage("Select Student Colour"), - "Select recipients" : MessageLookupByLibrary.simpleMessage("Select recipients"), - "Send Feedback" : MessageLookupByLibrary.simpleMessage("Send feedback"), - "Send a message about this assignment" : MessageLookupByLibrary.simpleMessage("Send a message about this assignment"), - "Send a message about this course" : MessageLookupByLibrary.simpleMessage("Send a message about this course"), - "Send message" : MessageLookupByLibrary.simpleMessage("Send message"), - "Set a date and time to be notified of this event." : MessageLookupByLibrary.simpleMessage("Set a date and time to be notified of this event."), - "Set a date and time to be notified of this specific assignment." : MessageLookupByLibrary.simpleMessage("Set a date and time to be notified of this specific assignment."), - "Settings" : MessageLookupByLibrary.simpleMessage("Settings"), - "Shamrock, Green" : MessageLookupByLibrary.simpleMessage("Shamrock, Green"), - "Share Your Love for the App" : MessageLookupByLibrary.simpleMessage("Share your love for the app"), - "Show Password" : MessageLookupByLibrary.simpleMessage("Show Password"), - "Sign In" : MessageLookupByLibrary.simpleMessage("Sign in"), - "Something went wrong trying to create your account, please reach out to your school for assistance." : MessageLookupByLibrary.simpleMessage("Something went wrong trying to create your account, please reach out to your school for assistance."), - "Something\'s broken but I can work around it to get what I need done." : MessageLookupByLibrary.simpleMessage("Something\'s broken, but I can work around it to finish what I need to do."), - "Stop Acting as User" : MessageLookupByLibrary.simpleMessage("Stop acting as user"), - "Student" : MessageLookupByLibrary.simpleMessage("Student"), - "Student Pairing" : MessageLookupByLibrary.simpleMessage("Student Pairing"), - "Students can create a QR code using the Canvas Student app on their mobile device" : MessageLookupByLibrary.simpleMessage("Students can create a QR code using the Canvas Student app on their mobile device"), - "Students can obtain a pairing code through the Canvas website" : MessageLookupByLibrary.simpleMessage("Students can obtain a pairing code through the Canvas website"), - "Subject" : MessageLookupByLibrary.simpleMessage("Subject"), - "Submitted" : MessageLookupByLibrary.simpleMessage("Submitted"), - "Successfully submitted!" : MessageLookupByLibrary.simpleMessage("Successfully submitted!"), - "Summary" : MessageLookupByLibrary.simpleMessage("Summary"), - "Switch Users" : MessageLookupByLibrary.simpleMessage("Switch users"), - "Syllabus" : MessageLookupByLibrary.simpleMessage("Syllabus"), - "TA" : MessageLookupByLibrary.simpleMessage("TA"), - "TEACHER" : MessageLookupByLibrary.simpleMessage("TEACHER"), - "Tap to favorite the courses you want to see on the Calendar. Select up to 10." : MessageLookupByLibrary.simpleMessage("Tap to favourite the courses you want to see on the Calendar. Select up to 10."), - "Tap to pair with a new student" : MessageLookupByLibrary.simpleMessage("Tap to pair with a new student"), - "Tap to select this student" : MessageLookupByLibrary.simpleMessage("Tap to select this student"), - "Tap to show student selector" : MessageLookupByLibrary.simpleMessage("Tap to show student selector"), - "Teacher" : MessageLookupByLibrary.simpleMessage("Teacher"), - "Tell us about your favorite parts of the app" : MessageLookupByLibrary.simpleMessage("Tell us about your favourite parts of the app"), - "Terms of Service" : MessageLookupByLibrary.simpleMessage("Terms of Service"), - "Terms of Service Link" : MessageLookupByLibrary.simpleMessage("Terms of Service Link"), - "Terms of Use" : MessageLookupByLibrary.simpleMessage("Terms of Use"), - "The QR code you scanned may have expired. Refresh the code on the student\'s device and try again." : MessageLookupByLibrary.simpleMessage("The QR code you scanned may have expired. Refresh the code on the student\'s device and try again."), - "The following information will help us better understand your idea:" : MessageLookupByLibrary.simpleMessage("The following information will help us better understand your idea:"), - "The server you entered is not authorized for this app." : MessageLookupByLibrary.simpleMessage("The server you entered is not authorised for this app."), - "The student you are trying to add belongs to a different school. Log in or create an account with that school to scan this code." : MessageLookupByLibrary.simpleMessage("The student you are trying to add belongs to a different school. Log in or create an account with that school to scan this code."), - "The user agent for this app is not authorized." : MessageLookupByLibrary.simpleMessage("The user agent for this app is not authorised."), - "Theme" : MessageLookupByLibrary.simpleMessage("Theme"), - "There are no installed applications that can open this file" : MessageLookupByLibrary.simpleMessage("There are no installed applications that can open this file"), - "There is no page information available." : MessageLookupByLibrary.simpleMessage("There is no page information available."), - "There was a problem loading the Terms of Use" : MessageLookupByLibrary.simpleMessage("There was a problem loading the Terms of Use"), - "There was a problem removing this student from your account. Please check your connection and try again." : MessageLookupByLibrary.simpleMessage("There was a problem removing this student from your account. Please check your connection and try again."), - "There was an error loading recipients for this course" : MessageLookupByLibrary.simpleMessage("There was an error loading recipients for this course"), - "There was an error loading the summary details for this course." : MessageLookupByLibrary.simpleMessage("There was an error loading the summary details for this course."), - "There was an error loading this announcement" : MessageLookupByLibrary.simpleMessage("There was an error loading this announcement"), - "There was an error loading this conversation" : MessageLookupByLibrary.simpleMessage("There was an error loading this conversation"), - "There was an error loading this file" : MessageLookupByLibrary.simpleMessage("There was an error loading this file"), - "There was an error loading your inbox messages." : MessageLookupByLibrary.simpleMessage("There was an error loading your inbox messages."), - "There was an error loading your student\'s alerts." : MessageLookupByLibrary.simpleMessage("There was an error loading your student\'s alerts."), - "There was an error loading your student\'s calendar" : MessageLookupByLibrary.simpleMessage("There was an error loading your student\'s calendar"), - "There was an error loading your students." : MessageLookupByLibrary.simpleMessage("There was an error loading your students."), - "There was an error loading your student’s courses." : MessageLookupByLibrary.simpleMessage("There was an error loading your student’s courses."), - "There was an error logging in. Please generate another QR Code and try again." : MessageLookupByLibrary.simpleMessage("There was an error logging in. Please generate another QR Code and try again."), - "There was an error trying to act as this user. Please check the Domain and User ID and try again." : MessageLookupByLibrary.simpleMessage("There was an error trying to act as this user. Please check the Domain and User ID and try again."), - "There’s nothing to be notified of yet." : MessageLookupByLibrary.simpleMessage("There’s nothing to be notified of yet."), - "This app is not authorized for use." : MessageLookupByLibrary.simpleMessage("This app is not authorised for use."), - "This course does not have any assignments or calendar events yet." : MessageLookupByLibrary.simpleMessage("This course does not have any assignments or calendar events yet."), - "This file is unsupported and can’t be viewed through the app" : MessageLookupByLibrary.simpleMessage("This file is unsupported and can’t be viewed through the app"), - "This will unpair and remove all enrollments for this student from your account." : MessageLookupByLibrary.simpleMessage("This will unpair and remove all enrolments for this student from your account."), - "Total Grade" : MessageLookupByLibrary.simpleMessage("Total mark"), - "Uh oh!" : MessageLookupByLibrary.simpleMessage("Uh oh!"), - "Unable to fetch courses. Please check your connection and try again." : MessageLookupByLibrary.simpleMessage("Unable to fetch courses. Please check your connection and try again."), - "Unable to load this image" : MessageLookupByLibrary.simpleMessage("Unable to load this image"), - "Unable to play this media file" : MessageLookupByLibrary.simpleMessage("Unable to play this media file"), - "Unable to send message. Check your connection and try again." : MessageLookupByLibrary.simpleMessage("Unable to send message. Check your connection and try again."), - "Under Construction" : MessageLookupByLibrary.simpleMessage("Under Construction"), - "Unknown User" : MessageLookupByLibrary.simpleMessage("Unknown user"), - "Unsaved changes" : MessageLookupByLibrary.simpleMessage("Unsaved changes"), - "Unsupported File" : MessageLookupByLibrary.simpleMessage("Unsupported File"), - "Upload File" : MessageLookupByLibrary.simpleMessage("Upload file"), - "Use Camera" : MessageLookupByLibrary.simpleMessage("Use Camera"), - "Use Dark Theme in Web Content" : MessageLookupByLibrary.simpleMessage("Use Dark Theme in Web Content"), - "User ID" : MessageLookupByLibrary.simpleMessage("User ID"), - "User ID:" : MessageLookupByLibrary.simpleMessage("User ID"), - "Version Number" : MessageLookupByLibrary.simpleMessage("Version number"), - "View Description" : MessageLookupByLibrary.simpleMessage("View Description"), - "View error details" : MessageLookupByLibrary.simpleMessage("View error details"), - "View the Privacy Policy" : MessageLookupByLibrary.simpleMessage("View the Privacy Policy"), - "We are currently building this feature for your viewing pleasure." : MessageLookupByLibrary.simpleMessage("We are currently building this feature for your viewing pleasure."), - "We are unable to display this link, it may belong to an institution you currently aren\'t logged in to." : MessageLookupByLibrary.simpleMessage("We are unable to display this link, it may belong to an institution you currently aren\'t logged in to."), - "We couldn\'t find any students associated with this account" : MessageLookupByLibrary.simpleMessage("We couldn\'t find any students associated with this account"), - "We were unable to verify the server for use with this app." : MessageLookupByLibrary.simpleMessage("We were unable to verify the server for use with this app."), - "We’re not sure what happened, but it wasn’t good. Contact us if this keeps happening." : MessageLookupByLibrary.simpleMessage("We’re not sure what happened, but it wasn’t good. Contact us if this keeps happening."), - "What can we do better?" : MessageLookupByLibrary.simpleMessage("What can we do better?"), - "Yes" : MessageLookupByLibrary.simpleMessage("Yes"), - "You are not observing any students." : MessageLookupByLibrary.simpleMessage("You are not observing any students."), - "You may only choose 10 calendars to display" : MessageLookupByLibrary.simpleMessage("You may only choose 10 calendars to display"), - "You must enter a user id" : MessageLookupByLibrary.simpleMessage("You must enter a user id"), - "You must enter a valid domain" : MessageLookupByLibrary.simpleMessage("You must enter a valid domain"), - "You must select at least one calendar to display" : MessageLookupByLibrary.simpleMessage("You must select at least one calendar to display"), - "You will be notified about this assignment on…" : MessageLookupByLibrary.simpleMessage("You will be notified about this assignment on…"), - "You will be notified about this event on…" : MessageLookupByLibrary.simpleMessage("You will be notified about this event on…"), - "You\'ll find the QR code on the web in your account profile. Click \'QR for Mobile Login\' in the list." : MessageLookupByLibrary.simpleMessage("You\'ll find the QR code on the web in your account profile. Click \'QR for Mobile Login\' in the list."), - "You\'ll need to open your student\'s Canvas Student app to continue. Go into Main Menu > Settings > Pair with Observer and scan the QR code you see there." : MessageLookupByLibrary.simpleMessage("You\'ll need to open your student\'s Canvas Student app to continue. Go into Main Menu > Settings > Pair with Observer and scan the QR code you see there."), - "Your code is incorrect or expired." : MessageLookupByLibrary.simpleMessage("Your code is incorrect or expired."), - "Your student’s courses might not be published yet." : MessageLookupByLibrary.simpleMessage("Your student’s courses might not be published yet."), - "You’re all caught up!" : MessageLookupByLibrary.simpleMessage("You’re all caught up!"), - "actingAsUser" : m0, - "alertsLabel" : MessageLookupByLibrary.simpleMessage("Alerts"), - "appVersion" : m1, - "assignmentGradeAboveThreshold" : m2, - "assignmentGradeBelowThreshold" : m3, - "assignmentLockedModule" : m4, - "assignmentSubjectMessage" : m5, - "assignmentTotalPoints" : m6, - "assignmentTotalPointsAccessible" : m7, - "authorToNOthers" : m8, - "authorToRecipient" : m9, - "authorToRecipientAndNOthers" : m10, - "badgeNumberPlus" : m11, - "calendarLabel" : MessageLookupByLibrary.simpleMessage("Calendar"), - "canvasGuides" : MessageLookupByLibrary.simpleMessage("Canvas Guides"), - "canvasLogoLabel" : MessageLookupByLibrary.simpleMessage("Canvas logo"), - "canvasSupport" : MessageLookupByLibrary.simpleMessage("Canvas Support"), - "changeStudentColorLabel" : m12, - "collapse" : MessageLookupByLibrary.simpleMessage("collapse"), - "collapsed" : MessageLookupByLibrary.simpleMessage("collapsed"), - "contentDescriptionScoreOutOfPointsPossible" : m13, - "courseForWhom" : m14, - "courseGradeAboveThreshold" : m15, - "courseGradeBelowThreshold" : m16, - "coursesLabel" : MessageLookupByLibrary.simpleMessage("Courses"), - "dateAtTime" : m17, - "dismissAlertLabel" : m18, - "domainSearchHelpBody" : m19, - "domainSearchHelpLabel" : MessageLookupByLibrary.simpleMessage("How do I find my school or district?"), - "domainSearchInputHint" : MessageLookupByLibrary.simpleMessage("Enter school name or district…"), - "dueDateAtTime" : m20, - "endMasqueradeLogoutMessage" : m21, - "endMasqueradeMessage" : m22, - "eventSubjectMessage" : m23, - "eventTime" : m24, - "expand" : MessageLookupByLibrary.simpleMessage("expand"), - "expanded" : MessageLookupByLibrary.simpleMessage("expanded"), - "finalGrade" : m25, - "findSchool" : MessageLookupByLibrary.simpleMessage("Find School"), - "frontPageSubjectMessage" : m26, - "gradeFormatScoreOutOfPointsPossible" : m27, - "gradesSubjectMessage" : m28, - "latePenalty" : m29, - "me" : MessageLookupByLibrary.simpleMessage("me"), - "messageLinkPostscript" : m30, - "minus" : MessageLookupByLibrary.simpleMessage("minus"), - "mustBeAboveN" : m31, - "mustBeBelowN" : m32, - "next" : MessageLookupByLibrary.simpleMessage("Next"), - "nextMonth" : m33, - "nextWeek" : m34, - "noDomainResults" : m35, - "ok" : MessageLookupByLibrary.simpleMessage("OK"), - "outOfPoints" : m36, - "plusRecipientCount" : m37, - "pointsPossible" : m38, - "previousMonth" : m39, - "previousWeek" : m40, - "qrCreateAccountTos" : m41, - "ratingDialogEmailSubject" : m42, - "selectedMonthLabel" : m43, - "send" : MessageLookupByLibrary.simpleMessage("send"), - "starRating" : m44, - "submissionStatusSuccessSubtitle" : m45, - "syllabusSubjectMessage" : m46, - "unread" : MessageLookupByLibrary.simpleMessage("unread"), - "unreadCount" : m47 - }; -} diff --git a/apps/flutter_parent/lib/l10n/generated/messages_en_GB_instukhe.dart b/apps/flutter_parent/lib/l10n/generated/messages_en_GB_instukhe.dart deleted file mode 100644 index e9271e18dc..0000000000 --- a/apps/flutter_parent/lib/l10n/generated/messages_en_GB_instukhe.dart +++ /dev/null @@ -1,335 +0,0 @@ -// DO NOT EDIT. This is code generated via package:intl/generate_localized.dart -// This is a library that provides messages for a en_GB_instukhe locale. All the -// messages from the main program should be duplicated here with the same -// function name. - -// Ignore issues from commonly used lints in this file. -// ignore_for_file:unnecessary_brace_in_string_interps, unnecessary_new -// ignore_for_file:prefer_single_quotes,comment_references, directives_ordering -// ignore_for_file:annotate_overrides,prefer_generic_function_type_aliases -// ignore_for_file:unused_import, file_names - -import 'package:intl/intl.dart'; -import 'package:intl/message_lookup_by_library.dart'; - -final messages = new MessageLookup(); - -typedef String MessageIfAbsent(String messageStr, List args); - -class MessageLookup extends MessageLookupByLibrary { - String get localeName => 'en_GB_instukhe'; - - static m1(version) => "v. ${version}"; - - static m2(threshold) => "Uppgiftsbedömning över ${threshold}"; - - static m3(threshold) => "Uppgiftsbedömning under ${threshold}"; - - static m4(moduleName) => "Den här uppgiften har låsts av modulen \"${moduleName}\"."; - - static m5(studentName, assignmentName) => "Angående : ${studentName}, uppgift – ${assignmentName}"; - - static m6(points) => "${points} poäng"; - - static m7(points) => "${points} poäng"; - - static m8(authorName, howMany) => "${Intl.plural(howMany, one: '${authorName} till 1 annan', other: '${authorName} till ${howMany} andra')}"; - - static m9(authorName, recipientName) => "${authorName} till ${recipientName}"; - - static m10(authorName, recipientName, howMany) => "${Intl.plural(howMany, one: '${authorName} till ${recipientName} och 1 annan', other: '${authorName} till ${recipientName} och ${howMany} andra')}"; - - static m11(count) => "${count}+"; - - static m13(score, pointsPossible) => "${score} av ${pointsPossible} poäng"; - - static m14(studentShortName) => "för ${studentShortName}"; - - static m15(threshold) => "Kursbedömning över ${threshold}"; - - static m16(threshold) => "Kursbedömning under ${threshold}"; - - static m17(date, time) => "${date} kl. ${time}"; - - static m19(canvasGuides, canvasSupport) => "Försök med att söka efter namnet på skolan eller distrikten du vill ansluta till, t.ex. “Allmänna skolan” eller “Skolor i Skåne”. Du kan även ange en Canvas-domän direkt, t.ex. “smith.instructure.com.”\n\nMer information om hur du kan hitta din institutions Canvas-konto finns på ${canvasGuides} eller kontakta ${canvasSupport} eller din skola för att få hjälp."; - - static m20(date, time) => "Ska lämnas in ${date} klockan ${time}"; - - static m23(studentName, eventTitle) => "Angående : ${studentName}, händelse – ${eventTitle}"; - - static m24(startAt, endAt) => "${startAt}/${endAt}"; - - static m25(grade) => "Slutbedömning: ${grade}"; - - static m26(studentName) => "Angående : ${studentName}, framsida"; - - static m27(score, pointsPossible) => "${score} / ${pointsPossible}"; - - static m28(studentName) => "Angående : ${studentName}, bedömningar"; - - static m29(pointsLost) => "Förseningsbestraffning (-${pointsLost})"; - - static m30(studentName, linkUrl) => "Angående : ${studentName}, ${linkUrl}"; - - static m31(percentage) => "Måste vara över ${percentage}"; - - static m32(percentage) => "Måste vara under ${percentage}"; - - static m35(query) => "Det gick inte att hitta skolar som matchar \"${query}\""; - - static m36(points, howMany) => "${Intl.plural(howMany, one: 'En av 1 poäng', other: 'En av ${points} poäng')}"; - - static m37(count) => "+${count}"; - - static m45(date, time) => "Uppgiften lämnades in ${date} kl. ${time} och väntar på bedömning"; - - static m46(studentName) => "Angående : ${studentName}, kursöversikt"; - - static m47(count) => "${count} olästa"; - - final messages = _notInlinedMessages(_notInlinedMessages); - static _notInlinedMessages(_) => { - "-" : MessageLookupByLibrary.simpleMessage("-"), - "A description is required." : MessageLookupByLibrary.simpleMessage("Beskrivning är obligatorisk."), - "A subject is required." : MessageLookupByLibrary.simpleMessage("Ämne är obligatoriskt."), - "Add Student" : MessageLookupByLibrary.simpleMessage("Lägg till elev"), - "Add attachment" : MessageLookupByLibrary.simpleMessage("Lägg till bilaga"), - "Add new student" : MessageLookupByLibrary.simpleMessage("Lägg till ny elev"), - "Add student with…" : MessageLookupByLibrary.simpleMessage("Lägg till elev med..."), - "Alert Settings" : MessageLookupByLibrary.simpleMessage("Notisinställningar"), - "Alert me when…" : MessageLookupByLibrary.simpleMessage("Notifiera mig om..."), - "All Grading Periods" : MessageLookupByLibrary.simpleMessage("Alla bedömningsperioder"), - "An email address is required." : MessageLookupByLibrary.simpleMessage("E-postadressen är obligatorisk."), - "An unexpected error occurred" : MessageLookupByLibrary.simpleMessage("Ett oväntat fel inträffade"), - "Android OS version" : MessageLookupByLibrary.simpleMessage("Android AS-version"), - "Appearance" : MessageLookupByLibrary.simpleMessage("Utseende"), - "Application version" : MessageLookupByLibrary.simpleMessage("Programversion"), - "Are you a student or teacher?" : MessageLookupByLibrary.simpleMessage("Är du elev eller lärare?"), - "Are you sure you want to log out?" : MessageLookupByLibrary.simpleMessage("Vill du logga ut?"), - "Are you sure you wish to close this page? Your unsent message will be lost." : MessageLookupByLibrary.simpleMessage("Är du säker på att du vill stänga den här sidan? Ditt meddelande du ännu inte skickat kommer att tas bort."), - "Assignment Details" : MessageLookupByLibrary.simpleMessage("Uppgiftens detaljer"), - "Assignment grade above" : MessageLookupByLibrary.simpleMessage("Uppgiftsbedömning över"), - "Assignment grade below" : MessageLookupByLibrary.simpleMessage("Uppgiftsbedömning under"), - "Assignment missing" : MessageLookupByLibrary.simpleMessage("Uppgift saknas"), - "Cancel" : MessageLookupByLibrary.simpleMessage("Avbryt"), - "Canvas Student" : MessageLookupByLibrary.simpleMessage("Canvas-elev"), - "Canvas Teacher" : MessageLookupByLibrary.simpleMessage("Canvas-lärare"), - "Choose a course to message" : MessageLookupByLibrary.simpleMessage("Välj en kurs att skicka meddelande till"), - "Choose from Gallery" : MessageLookupByLibrary.simpleMessage("Välj från galleri"), - "Complete" : MessageLookupByLibrary.simpleMessage("Fullgjord"), - "Contact Support" : MessageLookupByLibrary.simpleMessage("Kontakta support"), - "Course Announcement" : MessageLookupByLibrary.simpleMessage("Kursmeddelande"), - "Course Announcements" : MessageLookupByLibrary.simpleMessage("Kursmeddelande"), - "Course grade above" : MessageLookupByLibrary.simpleMessage("Kursbedömning över"), - "Course grade below" : MessageLookupByLibrary.simpleMessage("Kursbedömning under"), - "Dark Mode" : MessageLookupByLibrary.simpleMessage("Mörkt läge"), - "Date" : MessageLookupByLibrary.simpleMessage("Datum"), - "Delete" : MessageLookupByLibrary.simpleMessage("Ta bort"), - "Description" : MessageLookupByLibrary.simpleMessage("Beskrivning"), - "Device" : MessageLookupByLibrary.simpleMessage("Enhet"), - "Device model" : MessageLookupByLibrary.simpleMessage("Enhetsmodell"), - "Domain:" : MessageLookupByLibrary.simpleMessage("Domän:"), - "Done" : MessageLookupByLibrary.simpleMessage("Klar"), - "Download" : MessageLookupByLibrary.simpleMessage("Ladda ned"), - "Due" : MessageLookupByLibrary.simpleMessage("Inlämningsdatum"), - "EXTREME CRITICAL EMERGENCY!!" : MessageLookupByLibrary.simpleMessage("EXTREMT KRITISKT NÖDFALL!!"), - "Email Address" : MessageLookupByLibrary.simpleMessage("E-postadress"), - "Email:" : MessageLookupByLibrary.simpleMessage("E-post:"), - "Enter the student pairing code provided to you. If the pairing code doesn\'t work, it may have expired" : MessageLookupByLibrary.simpleMessage("Ange den elevparkopplingskod du har fått. Om parkopplingskoden inte fungerar kan den ha gått ut"), - "Event" : MessageLookupByLibrary.simpleMessage("Händelse"), - "Excused" : MessageLookupByLibrary.simpleMessage("Ursäktad"), - "Failed. Tap for options." : MessageLookupByLibrary.simpleMessage("Misslyckades. Tryck för alternativ."), - "Filter" : MessageLookupByLibrary.simpleMessage("Filtrera"), - "Filter by" : MessageLookupByLibrary.simpleMessage("Filtrera efter"), - "Front Page" : MessageLookupByLibrary.simpleMessage("Framsida"), - "Full error message" : MessageLookupByLibrary.simpleMessage("Fullständigt felmeddelande"), - "Grade" : MessageLookupByLibrary.simpleMessage("Bedömning"), - "Grade percentage" : MessageLookupByLibrary.simpleMessage("Bedömningsprocent"), - "Graded" : MessageLookupByLibrary.simpleMessage("Har bedömts"), - "Grades" : MessageLookupByLibrary.simpleMessage("Bedömningar"), - "Help" : MessageLookupByLibrary.simpleMessage("Hjälp"), - "High Contrast Mode" : MessageLookupByLibrary.simpleMessage("Högt kontrastläge"), - "How is this affecting you?" : MessageLookupByLibrary.simpleMessage("Hur påverkar detta dig?"), - "I can\'t get things done until I hear back from you." : MessageLookupByLibrary.simpleMessage("Jag kan inte göra något tills jag hör ifrån er."), - "I need some help but it\'s not urgent." : MessageLookupByLibrary.simpleMessage("Jag behöver hjälp men det är inte bråttom."), - "I\'m having trouble logging in" : MessageLookupByLibrary.simpleMessage("Jag kan inte logga in"), - "Idea for Canvas Parent App [Android]" : MessageLookupByLibrary.simpleMessage("Idéer för appen Canvas Parent [Android]"), - "Inbox" : MessageLookupByLibrary.simpleMessage("Inkorg"), - "Inbox Zero" : MessageLookupByLibrary.simpleMessage("Inkorg noll"), - "Incomplete" : MessageLookupByLibrary.simpleMessage("Ej fullständig"), - "Institution Announcement" : MessageLookupByLibrary.simpleMessage("Institutionsmeddelande"), - "Institution Announcements" : MessageLookupByLibrary.simpleMessage("Institutionsmeddelande"), - "Instructions" : MessageLookupByLibrary.simpleMessage("Instruktioner"), - "It looks like assignments haven\'t been created in this space yet." : MessageLookupByLibrary.simpleMessage("Det verkar som om inga uppgifter har skapats för den här platsen än."), - "Just a casual question, comment, idea, suggestion…" : MessageLookupByLibrary.simpleMessage("Bara en vanlig fråga, kommentar, idé, förslag ..."), - "Late" : MessageLookupByLibrary.simpleMessage("Sen"), - "Legal" : MessageLookupByLibrary.simpleMessage("Juridik"), - "Light Mode" : MessageLookupByLibrary.simpleMessage("Ljust läge"), - "Locale:" : MessageLookupByLibrary.simpleMessage("Plats:"), - "Location" : MessageLookupByLibrary.simpleMessage("Plats"), - "Locked" : MessageLookupByLibrary.simpleMessage("Låst"), - "Log Out" : MessageLookupByLibrary.simpleMessage("Logga ut"), - "Manage Students" : MessageLookupByLibrary.simpleMessage("Hantera elever"), - "Message" : MessageLookupByLibrary.simpleMessage("Meddelande"), - "Message subject" : MessageLookupByLibrary.simpleMessage("Meddelandeämne"), - "Missing" : MessageLookupByLibrary.simpleMessage("Saknad"), - "Must be below 100" : MessageLookupByLibrary.simpleMessage("Måste vara under 100"), - "Network error" : MessageLookupByLibrary.simpleMessage("Nätverksfel"), - "Never" : MessageLookupByLibrary.simpleMessage("Aldrig"), - "New message" : MessageLookupByLibrary.simpleMessage("Nytt meddelande"), - "No" : MessageLookupByLibrary.simpleMessage("Nej"), - "No Alerts" : MessageLookupByLibrary.simpleMessage("Inga notiser"), - "No Assignments" : MessageLookupByLibrary.simpleMessage("Inga uppgifter"), - "No Courses" : MessageLookupByLibrary.simpleMessage("Inga kurser"), - "No Due Date" : MessageLookupByLibrary.simpleMessage("Inget inlämningsdatum"), - "No Grade" : MessageLookupByLibrary.simpleMessage("Ingen bedömning"), - "No Location Specified" : MessageLookupByLibrary.simpleMessage("Ingen plats specificerad"), - "No Students" : MessageLookupByLibrary.simpleMessage("Inga elever"), - "No Subject" : MessageLookupByLibrary.simpleMessage("Inget ämne"), - "No Summary" : MessageLookupByLibrary.simpleMessage("Ingen sammanfattning"), - "No description" : MessageLookupByLibrary.simpleMessage("Ingen beskrivning"), - "No recipients selected" : MessageLookupByLibrary.simpleMessage("Inga mottagare har valts"), - "Not Submitted" : MessageLookupByLibrary.simpleMessage("Inte inlämnad"), - "Not a parent?" : MessageLookupByLibrary.simpleMessage("Är du inte vårdnadshavare?"), - "Notifications for reminders about assignments and calendar events" : MessageLookupByLibrary.simpleMessage("Påminnelsenotiser om uppgifter och kalenderhändelser"), - "OS Version" : MessageLookupByLibrary.simpleMessage("Operativsystemets version"), - "Observer" : MessageLookupByLibrary.simpleMessage("Observatör"), - "One of our other apps might be a better fit. Tap one to visit the Play Store." : MessageLookupByLibrary.simpleMessage("Någon av våra andra appar kan vara bättre lämpade. Tryck på en för att besöka Play Store."), - "Open with another app" : MessageLookupByLibrary.simpleMessage("Öppna med en annan app"), - "Pairing Code" : MessageLookupByLibrary.simpleMessage("Parkopplingskod"), - "Preparing…" : MessageLookupByLibrary.simpleMessage("Förbereder..."), - "Previous Logins" : MessageLookupByLibrary.simpleMessage("Tidigare inloggningar"), - "Privacy policy, terms of use, open source" : MessageLookupByLibrary.simpleMessage("Integritetspolicy, användarvillkor, öppen källkod"), - "QR Code" : MessageLookupByLibrary.simpleMessage("QR-kod"), - "Recipients" : MessageLookupByLibrary.simpleMessage("Mottagare"), - "Remind Me" : MessageLookupByLibrary.simpleMessage("Påminn mig"), - "Reminders" : MessageLookupByLibrary.simpleMessage("Påminnelser"), - "Reply" : MessageLookupByLibrary.simpleMessage("Svara"), - "Reply All" : MessageLookupByLibrary.simpleMessage("Svara alla"), - "Report A Problem" : MessageLookupByLibrary.simpleMessage("Rapportera ett problem"), - "Request Login Help" : MessageLookupByLibrary.simpleMessage("Begär hjälp med inloggning"), - "Request Login Help Button" : MessageLookupByLibrary.simpleMessage("Hjälpknapp för inloggningsförfrågningar"), - "Restart app" : MessageLookupByLibrary.simpleMessage("Starta om appen"), - "Retry" : MessageLookupByLibrary.simpleMessage("Försök igen"), - "Return to Login" : MessageLookupByLibrary.simpleMessage("Gå tillbaka till inloggning"), - "STUDENT" : MessageLookupByLibrary.simpleMessage("ELEV"), - "Select recipients" : MessageLookupByLibrary.simpleMessage("Välj mottagare"), - "Send a message about this assignment" : MessageLookupByLibrary.simpleMessage("Skicka ett meddelande om den här kursen"), - "Send a message about this course" : MessageLookupByLibrary.simpleMessage("Skicka ett meddelande om den här kursen"), - "Send message" : MessageLookupByLibrary.simpleMessage("Skicka meddelandet"), - "Set a date and time to be notified of this event." : MessageLookupByLibrary.simpleMessage("Ange ett datum och tid för att få en notis för den här händelsen."), - "Set a date and time to be notified of this specific assignment." : MessageLookupByLibrary.simpleMessage("Ange ett datum och tid för att få en notis för den här specifika uppgiften."), - "Settings" : MessageLookupByLibrary.simpleMessage("Inställningar"), - "Share Your Love for the App" : MessageLookupByLibrary.simpleMessage("Dela din kärlek till appen"), - "Something\'s broken but I can work around it to get what I need done." : MessageLookupByLibrary.simpleMessage("Det är något som inte fungerar men jag kan göra det jag ska ändå."), - "Student" : MessageLookupByLibrary.simpleMessage("Elev"), - "Subject" : MessageLookupByLibrary.simpleMessage("Ämne"), - "Submitted" : MessageLookupByLibrary.simpleMessage("Inskickad"), - "Successfully submitted!" : MessageLookupByLibrary.simpleMessage("Uppgiften har skickats in!"), - "Summary" : MessageLookupByLibrary.simpleMessage("Sammanfattning"), - "Switch Users" : MessageLookupByLibrary.simpleMessage("Växla användare"), - "Syllabus" : MessageLookupByLibrary.simpleMessage("Kursöversikt"), - "TA" : MessageLookupByLibrary.simpleMessage("Lärarassistent"), - "TEACHER" : MessageLookupByLibrary.simpleMessage("LÄRARE"), - "Tap to pair with a new student" : MessageLookupByLibrary.simpleMessage("Tryck för att koppla samman med en ny elev"), - "Tap to select this student" : MessageLookupByLibrary.simpleMessage("Tryck för att välja den här eleven"), - "Tap to show student selector" : MessageLookupByLibrary.simpleMessage("Tryck för att visa elevväljare"), - "Teacher" : MessageLookupByLibrary.simpleMessage("Lärare"), - "Tell us about your favorite parts of the app" : MessageLookupByLibrary.simpleMessage("Berätta vad du tycker om mest med appen"), - "The following information will help us better understand your idea:" : MessageLookupByLibrary.simpleMessage("Följande information kommer att hjälpa oss att förstå din idé bättre:"), - "The server you entered is not authorized for this app." : MessageLookupByLibrary.simpleMessage("Den server du har angett har inte auktoriserats för den här appen."), - "The user agent for this app is not authorized." : MessageLookupByLibrary.simpleMessage("Användaragenten för den här appen är inte auktoriserad."), - "Theme" : MessageLookupByLibrary.simpleMessage("Tema"), - "There are no installed applications that can open this file" : MessageLookupByLibrary.simpleMessage("Det finns inga installerade program som kan öppna den här filen"), - "There is no page information available." : MessageLookupByLibrary.simpleMessage("Det finns ingen sidinformation tillgänglig."), - "There was an error loading recipients for this course" : MessageLookupByLibrary.simpleMessage("Det gick inte att läsa in mottagare för den här kursen"), - "There was an error loading the summary details for this course." : MessageLookupByLibrary.simpleMessage("Det gick inte att läsa in sammanfattningsinformationen för den här kursen."), - "There was an error loading this announcement" : MessageLookupByLibrary.simpleMessage("Det gick inte att läsa in det här meddelandet"), - "There was an error loading this conversation" : MessageLookupByLibrary.simpleMessage("Det gick inte att läsa in den här konversationen"), - "There was an error loading this file" : MessageLookupByLibrary.simpleMessage("Det gick inte att läsa in den här filen"), - "There was an error loading your inbox messages." : MessageLookupByLibrary.simpleMessage("Det gick inte att läsa in dina meddelanden i inkorgen."), - "There was an error loading your student\'s alerts." : MessageLookupByLibrary.simpleMessage("Det gick inte att läsa in din elevs notiser."), - "There was an error loading your students." : MessageLookupByLibrary.simpleMessage("Det gick inte att läsa in dina elever."), - "There’s nothing to be notified of yet." : MessageLookupByLibrary.simpleMessage("Det finns inget att avisera om än."), - "This app is not authorized for use." : MessageLookupByLibrary.simpleMessage("Den här appen har inte auktoriserats för användning."), - "This course does not have any assignments or calendar events yet." : MessageLookupByLibrary.simpleMessage("Den här kursen har inga uppgifter eller kalenderhändelser än."), - "This file is unsupported and can’t be viewed through the app" : MessageLookupByLibrary.simpleMessage("Den här filen stöds inte och kan inte visas i appen"), - "Total Grade" : MessageLookupByLibrary.simpleMessage("Totalt bedömning"), - "Uh oh!" : MessageLookupByLibrary.simpleMessage("Oj då!"), - "Unable to fetch courses. Please check your connection and try again." : MessageLookupByLibrary.simpleMessage("Det gick inte att hämta kurser. Kontrollera din anslutning och försök igen."), - "Unable to load this image" : MessageLookupByLibrary.simpleMessage("Det går inte att läsa in den här bilden"), - "Unable to play this media file" : MessageLookupByLibrary.simpleMessage("Det går inte att spela upp den här mediefilen"), - "Unable to send message. Check your connection and try again." : MessageLookupByLibrary.simpleMessage("Det gick inte att skicka meddelandet. Kontrollera din anslutning och försök igen."), - "Under Construction" : MessageLookupByLibrary.simpleMessage("Under uppbyggnad"), - "Unknown User" : MessageLookupByLibrary.simpleMessage("Okänd användare"), - "Unsaved changes" : MessageLookupByLibrary.simpleMessage("Osparade ändringar"), - "Unsupported File" : MessageLookupByLibrary.simpleMessage("Filtyp som inte stöds"), - "Upload File" : MessageLookupByLibrary.simpleMessage("Ladda upp fil"), - "Use Camera" : MessageLookupByLibrary.simpleMessage("Använd kamera"), - "User ID:" : MessageLookupByLibrary.simpleMessage("Användar-ID:"), - "Version Number" : MessageLookupByLibrary.simpleMessage("Versionsnummer"), - "View error details" : MessageLookupByLibrary.simpleMessage("Visa felinformation"), - "We are currently building this feature for your viewing pleasure." : MessageLookupByLibrary.simpleMessage("Vi bygger den här funktionen för dig."), - "We couldn\'t find any students associated with this account" : MessageLookupByLibrary.simpleMessage("Det gick inte att hitta elever kopplade till det här kontot"), - "We were unable to verify the server for use with this app." : MessageLookupByLibrary.simpleMessage("Vi kunde inte verifiera servern för användning med den här appen."), - "We’re not sure what happened, but it wasn’t good. Contact us if this keeps happening." : MessageLookupByLibrary.simpleMessage("Vi vet inte vad som hände, men det fungerar inte. Kontakta oss om detta fortsätter att inträffa."), - "Yes" : MessageLookupByLibrary.simpleMessage("Ja"), - "You are not observing any students." : MessageLookupByLibrary.simpleMessage("Du observerar inga elever."), - "You will be notified about this assignment on…" : MessageLookupByLibrary.simpleMessage("Du kommer att få en notis om den här uppgiften på..."), - "You will be notified about this event on…" : MessageLookupByLibrary.simpleMessage("Du kommer att få en notis om den här händelsen den..."), - "Your code is incorrect or expired." : MessageLookupByLibrary.simpleMessage("Din kod är fel eller har gått ut."), - "Your student’s courses might not be published yet." : MessageLookupByLibrary.simpleMessage("Dina elevkurser kanske inte publicerats än."), - "You’re all caught up!" : MessageLookupByLibrary.simpleMessage("Du är helt i kapp!"), - "alertsLabel" : MessageLookupByLibrary.simpleMessage("Notiser"), - "appVersion" : m1, - "assignmentGradeAboveThreshold" : m2, - "assignmentGradeBelowThreshold" : m3, - "assignmentLockedModule" : m4, - "assignmentSubjectMessage" : m5, - "assignmentTotalPoints" : m6, - "assignmentTotalPointsAccessible" : m7, - "authorToNOthers" : m8, - "authorToRecipient" : m9, - "authorToRecipientAndNOthers" : m10, - "badgeNumberPlus" : m11, - "calendarLabel" : MessageLookupByLibrary.simpleMessage("Kalender"), - "canvasGuides" : MessageLookupByLibrary.simpleMessage("Canvas-guider"), - "canvasLogoLabel" : MessageLookupByLibrary.simpleMessage("Canvas-logotyp"), - "canvasSupport" : MessageLookupByLibrary.simpleMessage("Canvas Support"), - "collapsed" : MessageLookupByLibrary.simpleMessage("minimerad"), - "contentDescriptionScoreOutOfPointsPossible" : m13, - "courseForWhom" : m14, - "courseGradeAboveThreshold" : m15, - "courseGradeBelowThreshold" : m16, - "coursesLabel" : MessageLookupByLibrary.simpleMessage("Kurser"), - "dateAtTime" : m17, - "domainSearchHelpBody" : m19, - "domainSearchHelpLabel" : MessageLookupByLibrary.simpleMessage("Hur hittar jag min skola eller distrikt?"), - "domainSearchInputHint" : MessageLookupByLibrary.simpleMessage("Ange skolans namn eller distrikt..."), - "dueDateAtTime" : m20, - "eventSubjectMessage" : m23, - "eventTime" : m24, - "expanded" : MessageLookupByLibrary.simpleMessage("expanderad"), - "finalGrade" : m25, - "findSchool" : MessageLookupByLibrary.simpleMessage("Sök skola"), - "frontPageSubjectMessage" : m26, - "gradeFormatScoreOutOfPointsPossible" : m27, - "gradesSubjectMessage" : m28, - "latePenalty" : m29, - "me" : MessageLookupByLibrary.simpleMessage("jag"), - "messageLinkPostscript" : m30, - "minus" : MessageLookupByLibrary.simpleMessage("minus"), - "mustBeAboveN" : m31, - "mustBeBelowN" : m32, - "next" : MessageLookupByLibrary.simpleMessage("Nästa"), - "noDomainResults" : m35, - "ok" : MessageLookupByLibrary.simpleMessage("OK"), - "outOfPoints" : m36, - "plusRecipientCount" : m37, - "send" : MessageLookupByLibrary.simpleMessage("skicka"), - "submissionStatusSuccessSubtitle" : m45, - "syllabusSubjectMessage" : m46, - "unread" : MessageLookupByLibrary.simpleMessage("olästa"), - "unreadCount" : m47 - }; -} diff --git a/apps/flutter_parent/lib/l10n/generated/messages_es.dart b/apps/flutter_parent/lib/l10n/generated/messages_es.dart deleted file mode 100644 index 3ab034f576..0000000000 --- a/apps/flutter_parent/lib/l10n/generated/messages_es.dart +++ /dev/null @@ -1,473 +0,0 @@ -// DO NOT EDIT. This is code generated via package:intl/generate_localized.dart -// This is a library that provides messages for a es locale. All the -// messages from the main program should be duplicated here with the same -// function name. - -// Ignore issues from commonly used lints in this file. -// ignore_for_file:unnecessary_brace_in_string_interps, unnecessary_new -// ignore_for_file:prefer_single_quotes,comment_references, directives_ordering -// ignore_for_file:annotate_overrides,prefer_generic_function_type_aliases -// ignore_for_file:unused_import, file_names - -import 'package:intl/intl.dart'; -import 'package:intl/message_lookup_by_library.dart'; - -final messages = new MessageLookup(); - -typedef String MessageIfAbsent(String messageStr, List args); - -class MessageLookup extends MessageLookupByLibrary { - String get localeName => 'es'; - - static m0(userName) => "Está actuando en nombre de ${userName}"; - - static m1(version) => "v. ${version}"; - - static m2(threshold) => "Calificación de la tarea superior a ${threshold}"; - - static m3(threshold) => "Calificación de la tarea inferior a ${threshold}"; - - static m4(moduleName) => "Esta tarea está bloqueada por el módulo \"${moduleName}\"."; - - static m5(studentName, assignmentName) => "Asunto: ${studentName}, Tarea: ${assignmentName}"; - - static m6(points) => "${points} ptos."; - - static m7(points) => "${points} puntos"; - - static m8(authorName, howMany) => "${Intl.plural(howMany, one: '${authorName} a 1 otro', other: '${authorName} a ${howMany} otros')}"; - - static m9(authorName, recipientName) => "${authorName} a ${recipientName}"; - - static m10(authorName, recipientName, howMany) => "${Intl.plural(howMany, one: '${authorName} a ${recipientName} y 1 otro', other: '${authorName} a ${recipientName} y ${howMany} otros')}"; - - static m11(count) => "${count}+"; - - static m12(studentName) => "Cambiar color para ${studentName}"; - - static m13(score, pointsPossible) => "${score} de ${pointsPossible} puntos"; - - static m14(studentShortName) => "para ${studentShortName}"; - - static m15(threshold) => "Calificación del curso superior a ${threshold}"; - - static m16(threshold) => "Calificación del curso inferior a ${threshold}"; - - static m17(date, time) => "${date} a las ${time}"; - - static m18(alertTitle) => "Descartar ${alertTitle}"; - - static m19(canvasGuides, canvasSupport) => "Intente buscar el nombre de la escuela o el distrito al que intenta acceder, como “Smith Private School” o “Smith County Schools”. También puede ingresar directamente a un dominio de Canvas, como “smith.instructure.com”.\n\nA fin de obtener más información sobre cómo encontrar la cuenta de Canvas de su institución, puede visitar ${canvasGuides}, comunicarse con ${canvasSupport} o ponerse en contacto con su escuela para recibir asistencia."; - - static m20(date, time) => "Fecha límite el ${date} a las ${time}"; - - static m21(userName) => "Dejará de actuar en nombre de ${userName} y cerrará la sesión."; - - static m22(userName) => "Dejará de actuar en nombre de ${userName} y regresará a su cuenta original."; - - static m23(studentName, eventTitle) => "Asunto: ${studentName}, Evento: ${eventTitle}"; - - static m24(startAt, endAt) => "${startAt} - ${endAt}"; - - static m25(grade) => "Calificación final: ${grade}"; - - static m26(studentName) => "Asunto: ${studentName}, Página de inicio"; - - static m27(score, pointsPossible) => "${score} / ${pointsPossible}"; - - static m28(studentName) => "Asunto: ${studentName}, Calificaciones"; - - static m29(pointsLost) => "Sanción por presentación con atraso (-${pointsLost})"; - - static m30(studentName, linkUrl) => "Asunto: ${studentName}, ${linkUrl}"; - - static m31(percentage) => "Debe ser superior a ${percentage}"; - - static m32(percentage) => "Debe ser inferior a ${percentage}"; - - static m33(month) => "Próximo mes: ${month}"; - - static m34(date) => "La próxima semana comienza el ${date}"; - - static m35(query) => "No se pudieron encontrar escuelas que coincidan con \"${query}\"."; - - static m36(points, howMany) => "${Intl.plural(howMany, one: 'De 1 punto', other: 'De ${points} puntos')}"; - - static m37(count) => "+${count}"; - - static m38(points) => "${points} puntos posibles"; - - static m39(month) => "Mes anterior: ${month}"; - - static m40(date) => "La semana anterior comienza el ${date}"; - - static m41(termsOfService, privacyPolicy) => "Al pulsar en ‘Crear cuenta’ (Create Account), acepta los ${termsOfService} y la ${privacyPolicy}"; - - static m42(version) => "Sugerencias para Android: Canvas Parent ${version}"; - - static m43(month) => "Mes de ${month}"; - - static m44(position) => "${Intl.plural(position, one: '${position} estrella', other: '${position} estrellas')}"; - - static m45(date, time) => "Esta tarea se envió el ${date} a las ${time} y está a la espera de su calificación"; - - static m46(studentName) => "Asunto: ${studentName}, Programa del curso"; - - static m47(count) => "${count} no leído"; - - final messages = _notInlinedMessages(_notInlinedMessages); - static _notInlinedMessages(_) => { - "\"Act as\" is essentially logging in as this user without a password. You will be able to take any action as if you were this user, and from other users\' points of views, it will be as if this user performed them. However, audit logs record that you were the one who performed the actions on behalf of this user." : MessageLookupByLibrary.simpleMessage("\"Actuar en nombre de\" es esencialmente iniciar sesión como este usuario sin una contraseña. Podrá realizar cualquier acción como si fuera este usuario y, desde el punto de vista de los demás usuarios, será como si este usuario las hubiera realizado. Sin embargo, los registros de auditoría indican que usted es quien realizó las acciones en representación de este usuario."), - "-" : MessageLookupByLibrary.simpleMessage("-"), - "A description is required." : MessageLookupByLibrary.simpleMessage("La descripción es obligatoria."), - "A network error occurred when adding this student. Check your connection and try again." : MessageLookupByLibrary.simpleMessage("Hubo un error de la red al agregar a este estudiante. Compruebe su conexión y vuelva a intentarlo."), - "A subject is required." : MessageLookupByLibrary.simpleMessage("El asunto es obligatorio."), - "Act As User" : MessageLookupByLibrary.simpleMessage("Actuar en nombre de Usuario"), - "Add Student" : MessageLookupByLibrary.simpleMessage("Agregar estudiante"), - "Add attachment" : MessageLookupByLibrary.simpleMessage("Agregar adjunto"), - "Add new student" : MessageLookupByLibrary.simpleMessage("Agregar nuevo estudiante"), - "Add student with…" : MessageLookupByLibrary.simpleMessage("Agregar estudiante con..."), - "Alert Settings" : MessageLookupByLibrary.simpleMessage("Configuraciones de alertas"), - "Alert me when…" : MessageLookupByLibrary.simpleMessage("Enviarme una alerta cuando..."), - "All Grading Periods" : MessageLookupByLibrary.simpleMessage("Todos los períodos de calificación"), - "Already have an account? " : MessageLookupByLibrary.simpleMessage("¿Ya tiene una cuenta? "), - "An email address is required." : MessageLookupByLibrary.simpleMessage("La dirección de correo electrónico es obligatoria."), - "An error occurred when trying to display this link" : MessageLookupByLibrary.simpleMessage("Se produjo un error al intentar mostrar este enlace"), - "An error occurred while saving your selection. Please try again." : MessageLookupByLibrary.simpleMessage("Ocurrió un error al guardar su selección. Inténtelo de nuevo."), - "An unexpected error occurred" : MessageLookupByLibrary.simpleMessage("Ha ocurrido un error inesperado"), - "Android OS version" : MessageLookupByLibrary.simpleMessage("Versión del SO de Android"), - "Appearance" : MessageLookupByLibrary.simpleMessage("Apariencia"), - "Application version" : MessageLookupByLibrary.simpleMessage("Versión de la aplicación"), - "Are you a student or teacher?" : MessageLookupByLibrary.simpleMessage("¿Es estudiante o profesor?"), - "Are you sure you want to log out?" : MessageLookupByLibrary.simpleMessage("¿Está seguro de que desea salir?"), - "Are you sure you wish to close this page? Your unsent message will be lost." : MessageLookupByLibrary.simpleMessage("¿Está seguro de que desea cerrar esta página? Su mensaje no enviado se perderá."), - "Assignment Details" : MessageLookupByLibrary.simpleMessage("Detalles de la tarea"), - "Assignment grade above" : MessageLookupByLibrary.simpleMessage("Calificación de la tarea superior a"), - "Assignment grade below" : MessageLookupByLibrary.simpleMessage("Calificación de la tarea inferior a"), - "Assignment missing" : MessageLookupByLibrary.simpleMessage("Tarea faltante"), - "Barney, Fuschia" : MessageLookupByLibrary.simpleMessage("Fucsia tipo Barney"), - "Calendars" : MessageLookupByLibrary.simpleMessage("Calendarios"), - "Camera Permission" : MessageLookupByLibrary.simpleMessage("Permiso de la cámara"), - "Cancel" : MessageLookupByLibrary.simpleMessage("Cancelar"), - "Canvas Student" : MessageLookupByLibrary.simpleMessage("Estudiante de Canvas"), - "Canvas Teacher" : MessageLookupByLibrary.simpleMessage("Canvas Teacher"), - "Canvas on GitHub" : MessageLookupByLibrary.simpleMessage("Canvas en GitHub"), - "Choose a course to message" : MessageLookupByLibrary.simpleMessage("Elija un curso para enviar un mensaje"), - "Choose from Gallery" : MessageLookupByLibrary.simpleMessage("Elegir de la galería"), - "Complete" : MessageLookupByLibrary.simpleMessage("Completa"), - "Contact Support" : MessageLookupByLibrary.simpleMessage("Póngase en contacto con el Soporte técnico"), - "Course Announcement" : MessageLookupByLibrary.simpleMessage("Anuncio del curso"), - "Course Announcements" : MessageLookupByLibrary.simpleMessage("Anuncios del curso"), - "Course grade above" : MessageLookupByLibrary.simpleMessage("Calificación del curso superior a"), - "Course grade below" : MessageLookupByLibrary.simpleMessage("Calificación del curso inferior a"), - "Create Account" : MessageLookupByLibrary.simpleMessage("Crear cuenta"), - "Dark Mode" : MessageLookupByLibrary.simpleMessage("Modo oscuro"), - "Date" : MessageLookupByLibrary.simpleMessage("Fecha"), - "Delete" : MessageLookupByLibrary.simpleMessage("Eliminar"), - "Description" : MessageLookupByLibrary.simpleMessage("Descripción"), - "Device" : MessageLookupByLibrary.simpleMessage("Dispositivo"), - "Device model" : MessageLookupByLibrary.simpleMessage("Modelo del dispositivo"), - "Domain" : MessageLookupByLibrary.simpleMessage("Dominio"), - "Domain:" : MessageLookupByLibrary.simpleMessage("Dominio:"), - "Don\'t show again" : MessageLookupByLibrary.simpleMessage("No mostrar nuevamente"), - "Done" : MessageLookupByLibrary.simpleMessage("Listo"), - "Download" : MessageLookupByLibrary.simpleMessage("Descargar"), - "Due" : MessageLookupByLibrary.simpleMessage("Fecha de entrega"), - "EXTREME CRITICAL EMERGENCY!!" : MessageLookupByLibrary.simpleMessage("EMERGENCIA CRÍTICA"), - "Electric, blue" : MessageLookupByLibrary.simpleMessage("Azul eléctrico"), - "Email Address" : MessageLookupByLibrary.simpleMessage("Dirección de correo electrónico"), - "Email:" : MessageLookupByLibrary.simpleMessage("Correo electrónico:"), - "Email…" : MessageLookupByLibrary.simpleMessage("Correo electrónico…"), - "Enter the student pairing code provided to you. If the pairing code doesn\'t work, it may have expired" : MessageLookupByLibrary.simpleMessage("Ingrese el código de emparejamiento de estudiantes que se le proporcionó. Si el código de emparejamiento no funciona, es posible que haya caducado"), - "Event" : MessageLookupByLibrary.simpleMessage("Evento"), - "Excused" : MessageLookupByLibrary.simpleMessage("Justificado"), - "Expired QR Code" : MessageLookupByLibrary.simpleMessage("Código QR vencido"), - "Failed. Tap for options." : MessageLookupByLibrary.simpleMessage("Se produjo un error. Pulse para ver las opciones."), - "Filter" : MessageLookupByLibrary.simpleMessage("Filtrar"), - "Filter by" : MessageLookupByLibrary.simpleMessage("Filtrar por"), - "Fire, Orange" : MessageLookupByLibrary.simpleMessage("Naranja tipo fuego"), - "Front Page" : MessageLookupByLibrary.simpleMessage("Página de inicio"), - "Full Name" : MessageLookupByLibrary.simpleMessage("Nombre completo"), - "Full Name…" : MessageLookupByLibrary.simpleMessage("Nombre completo…"), - "Full error message" : MessageLookupByLibrary.simpleMessage("Mensaje de error completo"), - "Go to today" : MessageLookupByLibrary.simpleMessage("Ir a la fecha de hoy"), - "Grade" : MessageLookupByLibrary.simpleMessage("Calificación"), - "Grade percentage" : MessageLookupByLibrary.simpleMessage("Porcentaje de calificación"), - "Graded" : MessageLookupByLibrary.simpleMessage("Calificado"), - "Grades" : MessageLookupByLibrary.simpleMessage("Calificaciones"), - "Help" : MessageLookupByLibrary.simpleMessage("Ayuda"), - "Hide Password" : MessageLookupByLibrary.simpleMessage("Ocultar contraseña"), - "High Contrast Mode" : MessageLookupByLibrary.simpleMessage("Modo de alto contraste"), - "How are we doing?" : MessageLookupByLibrary.simpleMessage("¿Cómo está?"), - "How is this affecting you?" : MessageLookupByLibrary.simpleMessage("¿Cómo le afecta esto?"), - "I can\'t get things done until I hear back from you." : MessageLookupByLibrary.simpleMessage("No puedo terminar mis asuntos hasta que reciba una respuesta suya."), - "I don\'t have a Canvas account" : MessageLookupByLibrary.simpleMessage("No tengo cuenta de Canvas"), - "I have a Canvas account" : MessageLookupByLibrary.simpleMessage("Tengo una cuenta de Canvas"), - "I need some help but it\'s not urgent." : MessageLookupByLibrary.simpleMessage("Necesito un poco de ayuda, pero no es urgente."), - "I\'m having trouble logging in" : MessageLookupByLibrary.simpleMessage("Tengo problemas para iniciar sesión"), - "Idea for Canvas Parent App [Android]" : MessageLookupByLibrary.simpleMessage("Ideas para la aplicación de Canvas Parent [Android]"), - "In order to provide you with a better experience, we have updated how reminders work. You can add new reminders by viewing an assignment or calendar event and tapping the switch under the \"Remind Me\" section.\n\nBe aware that any reminders created with older versions of this app will not be compatible with the new changes and you will need to create them again." : MessageLookupByLibrary.simpleMessage("Para brindarle una mejor experiencia, hemos actualizado el funcionamiento de los recordatorios. Para agregar nuevos recordatorios, vea una tarea o evento del calendario y pulse el botón en la sección \"Recordarme\" (\"Remind Me\").\n\nTenga presente que cualquier recordatorio creado con versiones anteriores de esta aplicación no será compatible con los nuevos cambios, y deberá volver a crearlo."), - "Inbox" : MessageLookupByLibrary.simpleMessage("Buzón de entrada"), - "Inbox Zero" : MessageLookupByLibrary.simpleMessage("Bandeja de entrada vacía"), - "Incomplete" : MessageLookupByLibrary.simpleMessage("Incompleta"), - "Incorrect Domain" : MessageLookupByLibrary.simpleMessage("Dominio incorrecto"), - "Institution Announcement" : MessageLookupByLibrary.simpleMessage("Anuncio de la institución"), - "Institution Announcements" : MessageLookupByLibrary.simpleMessage("Anuncios de la institución"), - "Instructions" : MessageLookupByLibrary.simpleMessage("Instrucciones"), - "Interactions on this page are limited by your institution." : MessageLookupByLibrary.simpleMessage("Las interacciones en esta página están limitadas por su institución."), - "Invalid QR Code" : MessageLookupByLibrary.simpleMessage("Código QR inválido"), - "It looks like a great day to rest, relax, and recharge." : MessageLookupByLibrary.simpleMessage("Este parece ser un día excelente para descansar, relajarse y recargar energías."), - "It looks like assignments haven\'t been created in this space yet." : MessageLookupByLibrary.simpleMessage("Parece que aún no se han creado tareas en este espacio."), - "Just a casual question, comment, idea, suggestion…" : MessageLookupByLibrary.simpleMessage("Sólo una pregunta, comentario, idea, sugerencia casual..."), - "Late" : MessageLookupByLibrary.simpleMessage("Atrasado"), - "Launch External Tool" : MessageLookupByLibrary.simpleMessage("Iniciar la herramienta externa"), - "Legal" : MessageLookupByLibrary.simpleMessage("Legal"), - "Light Mode" : MessageLookupByLibrary.simpleMessage("Modo claro"), - "Link Error" : MessageLookupByLibrary.simpleMessage("Error de enlace"), - "Locale:" : MessageLookupByLibrary.simpleMessage("Lugar:"), - "Locate QR Code" : MessageLookupByLibrary.simpleMessage("Ubicar código QR"), - "Location" : MessageLookupByLibrary.simpleMessage("Ubicación"), - "Locked" : MessageLookupByLibrary.simpleMessage("Bloqueado"), - "Log Out" : MessageLookupByLibrary.simpleMessage("Cerrar sesión"), - "Login flow: Canvas" : MessageLookupByLibrary.simpleMessage("Flujo de inicio de sesión: Canvas"), - "Login flow: Normal" : MessageLookupByLibrary.simpleMessage("Flujo de inicio de sesión: Normal"), - "Login flow: Site Admin" : MessageLookupByLibrary.simpleMessage("Flujo de inicio de sesión: Administrador del sitio"), - "Login flow: Skip mobile verify" : MessageLookupByLibrary.simpleMessage("Flujo de inicio de sesión: Saltear verificación móvil"), - "Manage Students" : MessageLookupByLibrary.simpleMessage("Administrar estudiantes"), - "Message" : MessageLookupByLibrary.simpleMessage("Mensaje"), - "Message subject" : MessageLookupByLibrary.simpleMessage("Asunto del mensaje"), - "Missing" : MessageLookupByLibrary.simpleMessage("Faltante"), - "Must be below 100" : MessageLookupByLibrary.simpleMessage("Debe ser inferior a 100"), - "Network error" : MessageLookupByLibrary.simpleMessage("Error de red"), - "Never" : MessageLookupByLibrary.simpleMessage("Nunca"), - "New message" : MessageLookupByLibrary.simpleMessage("Nuevo mensaje"), - "No" : MessageLookupByLibrary.simpleMessage("No"), - "No Alerts" : MessageLookupByLibrary.simpleMessage("Sin alertas"), - "No Assignments" : MessageLookupByLibrary.simpleMessage("No hay tareas"), - "No Courses" : MessageLookupByLibrary.simpleMessage("Sin cursos"), - "No Due Date" : MessageLookupByLibrary.simpleMessage("No hay fecha de entrega"), - "No Events Today!" : MessageLookupByLibrary.simpleMessage("¡No hay ningún evento hoy!"), - "No Grade" : MessageLookupByLibrary.simpleMessage("Sin calificación"), - "No Location Specified" : MessageLookupByLibrary.simpleMessage("Sin ubicación especificada"), - "No Students" : MessageLookupByLibrary.simpleMessage("No hay estudiantes"), - "No Subject" : MessageLookupByLibrary.simpleMessage("Sin asunto"), - "No Summary" : MessageLookupByLibrary.simpleMessage("Sin resumen"), - "No description" : MessageLookupByLibrary.simpleMessage("Sin descripción"), - "No recipients selected" : MessageLookupByLibrary.simpleMessage("No seleccionó ningún destinatario"), - "Not Graded" : MessageLookupByLibrary.simpleMessage("Sin calificar"), - "Not Submitted" : MessageLookupByLibrary.simpleMessage("No entregado"), - "Not a parent?" : MessageLookupByLibrary.simpleMessage("¿No es padre?"), - "Notifications for reminders about assignments and calendar events" : MessageLookupByLibrary.simpleMessage("Notificaciones de recordatorios de tareas y eventos en el calendario"), - "OS Version" : MessageLookupByLibrary.simpleMessage("Versión del SO"), - "Observer" : MessageLookupByLibrary.simpleMessage("Observador"), - "One of our other apps might be a better fit. Tap one to visit the Play Store." : MessageLookupByLibrary.simpleMessage("Una de nuestras otras aplicaciones podría ser más adecuada. Toque una para visitar la Play Store."), - "Open Canvas Student" : MessageLookupByLibrary.simpleMessage("Abrir Canvas Student"), - "Open In Browser" : MessageLookupByLibrary.simpleMessage("Abrir en el navegador"), - "Open with another app" : MessageLookupByLibrary.simpleMessage("Abrir con otra aplicación"), - "Pairing Code" : MessageLookupByLibrary.simpleMessage("Código de emparejamiento"), - "Password" : MessageLookupByLibrary.simpleMessage("Contraseña"), - "Password is required" : MessageLookupByLibrary.simpleMessage("La contraseña es obligatoria"), - "Password must contain at least 8 characters" : MessageLookupByLibrary.simpleMessage("La contraseña debe contener 8 caracteres como mínimo"), - "Password…" : MessageLookupByLibrary.simpleMessage("Contraseña…"), - "Planner Note" : MessageLookupByLibrary.simpleMessage("Nota de la agenda organizadora"), - "Please enter a valid email address" : MessageLookupByLibrary.simpleMessage("Ingrese una dirección de correo electrónico válida"), - "Please enter an email address" : MessageLookupByLibrary.simpleMessage("Ingrese una dirección de correo electrónico"), - "Please enter full name" : MessageLookupByLibrary.simpleMessage("Ingrese el nombre completo"), - "Please scan a QR code generated by Canvas" : MessageLookupByLibrary.simpleMessage("Escanee un código QR generado por Canvas"), - "Plum, Purple" : MessageLookupByLibrary.simpleMessage("Morado tipo ciruela"), - "Preparing…" : MessageLookupByLibrary.simpleMessage("En preparación..."), - "Previous Logins" : MessageLookupByLibrary.simpleMessage("Inicios de sesión anteriores"), - "Privacy Policy" : MessageLookupByLibrary.simpleMessage("Política de privacidad"), - "Privacy Policy Link" : MessageLookupByLibrary.simpleMessage("Enlace a la política de privacidad"), - "Privacy policy, terms of use, open source" : MessageLookupByLibrary.simpleMessage("Política de privacidad, términos de uso, código abierto"), - "QR Code" : MessageLookupByLibrary.simpleMessage("Código QR"), - "QR scanning requires camera access" : MessageLookupByLibrary.simpleMessage("Se requiere acceso a la cámara para escanear el código QR"), - "Raspberry, Red" : MessageLookupByLibrary.simpleMessage("Rojo tipo mora"), - "Recipients" : MessageLookupByLibrary.simpleMessage("Destinatarios"), - "Refresh" : MessageLookupByLibrary.simpleMessage("Actualizar"), - "Remind Me" : MessageLookupByLibrary.simpleMessage("Recordármelo"), - "Reminders" : MessageLookupByLibrary.simpleMessage("Recordatorios"), - "Reminders have changed!" : MessageLookupByLibrary.simpleMessage("¡Se cambiaron los recordatorios!"), - "Reply" : MessageLookupByLibrary.simpleMessage("Responder"), - "Reply All" : MessageLookupByLibrary.simpleMessage("Responder a todos"), - "Report A Problem" : MessageLookupByLibrary.simpleMessage("Reportar un problema"), - "Request Login Help" : MessageLookupByLibrary.simpleMessage("Solicitar ayuda para iniciar sesión"), - "Request Login Help Button" : MessageLookupByLibrary.simpleMessage("Botón Solicitar ayuda para iniciar sesión"), - "Restart app" : MessageLookupByLibrary.simpleMessage("Reiniciar aplicación"), - "Retry" : MessageLookupByLibrary.simpleMessage("Reintentar"), - "Return to Login" : MessageLookupByLibrary.simpleMessage("Volver al inicio de sesión"), - "STUDENT" : MessageLookupByLibrary.simpleMessage("ESTUDIANTE"), - "Screenshot showing location of QR code generation in browser" : MessageLookupByLibrary.simpleMessage("Captura de pantalla en la que se muestra la ubicación de la generación del código QR en el navegador"), - "Screenshot showing location of pairing QR code generation in the Canvas Student app" : MessageLookupByLibrary.simpleMessage("Captura de pantalla en la que se muestra la ubicación de la generación del código QR de emparejamiento en la aplicación Canvas Student"), - "Select" : MessageLookupByLibrary.simpleMessage("Seleccionar"), - "Select Student Color" : MessageLookupByLibrary.simpleMessage("Seleccionar color del estudiante"), - "Select recipients" : MessageLookupByLibrary.simpleMessage("Seleccionar destinatarios"), - "Send Feedback" : MessageLookupByLibrary.simpleMessage("Enviar retroalimentación"), - "Send a message about this assignment" : MessageLookupByLibrary.simpleMessage("Enviar un mensaje acerca de esta tarea"), - "Send a message about this course" : MessageLookupByLibrary.simpleMessage("Enviar un mensaje acerca de este curso"), - "Send message" : MessageLookupByLibrary.simpleMessage("Enviar mensaje"), - "Set a date and time to be notified of this event." : MessageLookupByLibrary.simpleMessage("Establecer una fecha y un horario para que se me notifique este evento."), - "Set a date and time to be notified of this specific assignment." : MessageLookupByLibrary.simpleMessage("Establecer una fecha y un horario para que se me notifique esta tarea específica."), - "Settings" : MessageLookupByLibrary.simpleMessage("Configuraciones"), - "Shamrock, Green" : MessageLookupByLibrary.simpleMessage("Verde tipo trébol"), - "Share Your Love for the App" : MessageLookupByLibrary.simpleMessage("Comparta su amor por la aplicación"), - "Show Password" : MessageLookupByLibrary.simpleMessage("Mostrar contraseña"), - "Sign In" : MessageLookupByLibrary.simpleMessage("Iniciar sesión"), - "Something went wrong trying to create your account, please reach out to your school for assistance." : MessageLookupByLibrary.simpleMessage("Algo salió mal al intentar crear su cuenta; comuníquese con su escuela para obtener asistencia."), - "Something\'s broken but I can work around it to get what I need done." : MessageLookupByLibrary.simpleMessage("Algo no funciona pero puedo trabajar sin ello para terminar lo que necesito."), - "Stop Acting as User" : MessageLookupByLibrary.simpleMessage("Dejar de actuar en nombre de Usuario"), - "Student" : MessageLookupByLibrary.simpleMessage("Estudiante"), - "Student Pairing" : MessageLookupByLibrary.simpleMessage("Emparejamiento del estudiante"), - "Students can create a QR code using the Canvas Student app on their mobile device" : MessageLookupByLibrary.simpleMessage("Los estudiantes pueden crear un código QR mediante la aplicación Canvas Student en sus dispositivos móviles"), - "Students can obtain a pairing code through the Canvas website" : MessageLookupByLibrary.simpleMessage("Los estudiantes pueden obtener un código de emparejamiento a través del sitio web de Canvas"), - "Subject" : MessageLookupByLibrary.simpleMessage("Asunto"), - "Submitted" : MessageLookupByLibrary.simpleMessage("Entregado"), - "Successfully submitted!" : MessageLookupByLibrary.simpleMessage("¡Enviada correctamente!"), - "Summary" : MessageLookupByLibrary.simpleMessage("Resumen"), - "Switch Users" : MessageLookupByLibrary.simpleMessage("Intercambiar usuarios"), - "Syllabus" : MessageLookupByLibrary.simpleMessage("Programa del curso"), - "TA" : MessageLookupByLibrary.simpleMessage("Profesor asistente"), - "TEACHER" : MessageLookupByLibrary.simpleMessage("PROFESOR"), - "Tap to favorite the courses you want to see on the Calendar. Select up to 10." : MessageLookupByLibrary.simpleMessage("Pulse para marcar los cursos que desea ver en el Calendario como favoritos. Seleccione hasta 10."), - "Tap to pair with a new student" : MessageLookupByLibrary.simpleMessage("Pulse para emparejar con un nuevo estudiante"), - "Tap to select this student" : MessageLookupByLibrary.simpleMessage("Pulse para seleccionar este estudiante"), - "Tap to show student selector" : MessageLookupByLibrary.simpleMessage("Pulse para ver el selector de estudiantes"), - "Teacher" : MessageLookupByLibrary.simpleMessage("Profesor"), - "Tell us about your favorite parts of the app" : MessageLookupByLibrary.simpleMessage("Cuéntenos sobre sus partes favoritas de la aplicación"), - "Terms of Service" : MessageLookupByLibrary.simpleMessage("Términos de servicio"), - "Terms of Service Link" : MessageLookupByLibrary.simpleMessage("Enlace a los términos de servicio"), - "Terms of Use" : MessageLookupByLibrary.simpleMessage("Términos de uso"), - "The QR code you scanned may have expired. Refresh the code on the student\'s device and try again." : MessageLookupByLibrary.simpleMessage("Es posible que el código QR que escaneó haya vencido. Actualice el código en el dispositivo del estudiante y vuelva a intentarlo."), - "The following information will help us better understand your idea:" : MessageLookupByLibrary.simpleMessage("La siguiente información nos ayudará a comprender mejor su idea:"), - "The server you entered is not authorized for this app." : MessageLookupByLibrary.simpleMessage("El servidor ingresado no está autorizado para esta aplicación."), - "The student you are trying to add belongs to a different school. Log in or create an account with that school to scan this code." : MessageLookupByLibrary.simpleMessage("El estudiante que está intentando agregar pertenece a una escuela diferente. Inicie sesión o cree una cuenta con esa escuela para escanear el código."), - "The user agent for this app is not authorized." : MessageLookupByLibrary.simpleMessage("El agente de usuario de esta aplicación no está autorizado."), - "Theme" : MessageLookupByLibrary.simpleMessage("Tema"), - "There are no installed applications that can open this file" : MessageLookupByLibrary.simpleMessage("No hay aplicaciones instaladas que puedan abrir este archivo"), - "There is no page information available." : MessageLookupByLibrary.simpleMessage("No hay información disponible de la página."), - "There was a problem loading the Terms of Use" : MessageLookupByLibrary.simpleMessage("Hubo un problema al cargar los Términos de uso"), - "There was a problem removing this student from your account. Please check your connection and try again." : MessageLookupByLibrary.simpleMessage("Ocurrió un problema al eliminar a este estudiante de su cuenta. Compruebe su conexión y vuelva a intentarlo."), - "There was an error loading recipients for this course" : MessageLookupByLibrary.simpleMessage("Hubo un error al cargar los destinatarios de este curso"), - "There was an error loading the summary details for this course." : MessageLookupByLibrary.simpleMessage("Hubo un error al cargar los detalles del resumen de este curso."), - "There was an error loading this announcement" : MessageLookupByLibrary.simpleMessage("Hubo un error al cargar este anuncio"), - "There was an error loading this conversation" : MessageLookupByLibrary.simpleMessage("Hubo un error al cargar esta conversación"), - "There was an error loading this file" : MessageLookupByLibrary.simpleMessage("Hubo un error al cargar este archivo"), - "There was an error loading your inbox messages." : MessageLookupByLibrary.simpleMessage("Hubo un error al cargar sus mensajes del buzón de entrada."), - "There was an error loading your student\'s alerts." : MessageLookupByLibrary.simpleMessage("Hubo un error al cargar las alertas de sus estudiantes."), - "There was an error loading your student\'s calendar" : MessageLookupByLibrary.simpleMessage("Hubo un error al cargar el calendario de su estudiante"), - "There was an error loading your students." : MessageLookupByLibrary.simpleMessage("Hubo un error al cargar sus estudiantes."), - "There was an error loading your student’s courses." : MessageLookupByLibrary.simpleMessage("Hubo un error al cargar los cursos de su estudiante."), - "There was an error logging in. Please generate another QR Code and try again." : MessageLookupByLibrary.simpleMessage("Hubo un error al iniciar sesión. Genere otro código QR y vuelva a intentarlo."), - "There was an error trying to act as this user. Please check the Domain and User ID and try again." : MessageLookupByLibrary.simpleMessage("Hubo un error al intentar actuar en nombre de este usuario. Revise el dominio y la identificación de usuario y vuelva a intentarlo."), - "There’s nothing to be notified of yet." : MessageLookupByLibrary.simpleMessage("Aún no hay ninguna notificación."), - "This app is not authorized for use." : MessageLookupByLibrary.simpleMessage("Esta aplicación no está autorizada para usarse."), - "This course does not have any assignments or calendar events yet." : MessageLookupByLibrary.simpleMessage("Este curso aún no tiene ninguna tarea ni eventos en el calendario."), - "This file is unsupported and can’t be viewed through the app" : MessageLookupByLibrary.simpleMessage("Este archivo no está admitido y no se puede ver con la aplicación"), - "This will unpair and remove all enrollments for this student from your account." : MessageLookupByLibrary.simpleMessage("Deshará el emparejamiento y eliminará todas las inscripciones de este estudiante en su cuenta."), - "Total Grade" : MessageLookupByLibrary.simpleMessage("Calificación total"), - "Uh oh!" : MessageLookupByLibrary.simpleMessage("¡Ay, no!"), - "Unable to fetch courses. Please check your connection and try again." : MessageLookupByLibrary.simpleMessage("No se pueden recuperar los cursos. Compruebe su conexión y vuelva a intentarlo."), - "Unable to load this image" : MessageLookupByLibrary.simpleMessage("No se puede cargar esta imagen"), - "Unable to play this media file" : MessageLookupByLibrary.simpleMessage("No se puede reproducir este archivo multimedia"), - "Unable to send message. Check your connection and try again." : MessageLookupByLibrary.simpleMessage("No se puede enviar el mensaje. Compruebe su conexión y vuelva a intentarlo."), - "Under Construction" : MessageLookupByLibrary.simpleMessage("En construcción"), - "Unknown User" : MessageLookupByLibrary.simpleMessage("Usuario desconocido"), - "Unsaved changes" : MessageLookupByLibrary.simpleMessage("Cambios no guardados"), - "Unsupported File" : MessageLookupByLibrary.simpleMessage("Archivo no admitido"), - "Upload File" : MessageLookupByLibrary.simpleMessage("Cargar archivo"), - "Use Camera" : MessageLookupByLibrary.simpleMessage("Usar cámara"), - "Use Dark Theme in Web Content" : MessageLookupByLibrary.simpleMessage("Usar tema oscuro en el contenido web"), - "User ID" : MessageLookupByLibrary.simpleMessage("Identificación de usuario"), - "User ID:" : MessageLookupByLibrary.simpleMessage("Identificación del usuario:"), - "Version Number" : MessageLookupByLibrary.simpleMessage("Número de versión"), - "View Description" : MessageLookupByLibrary.simpleMessage("Ver descripción"), - "View error details" : MessageLookupByLibrary.simpleMessage("Ver detalles del error"), - "View the Privacy Policy" : MessageLookupByLibrary.simpleMessage("Ver la Política de privacidad"), - "We are currently building this feature for your viewing pleasure." : MessageLookupByLibrary.simpleMessage("Actualmente estamos desarrollando esta función para que pueda disfrutarla."), - "We are unable to display this link, it may belong to an institution you currently aren\'t logged in to." : MessageLookupByLibrary.simpleMessage("No podemos mostrar este enlace; es posible que pertenezca a una institución en la que no tiene sesión abierta actualmente."), - "We couldn\'t find any students associated with this account" : MessageLookupByLibrary.simpleMessage("No pudimos encontrar ningún estudiante relacionado con esta cuenta"), - "We were unable to verify the server for use with this app." : MessageLookupByLibrary.simpleMessage("No pudimos verificar el servidor para su uso con esta aplicación."), - "We’re not sure what happened, but it wasn’t good. Contact us if this keeps happening." : MessageLookupByLibrary.simpleMessage("No sabemos bien qué sucedió, pero no fue bueno. Comuníquese con nosotros si esto sigue sucediendo."), - "What can we do better?" : MessageLookupByLibrary.simpleMessage("¿Qué podemos mejorar?"), - "Yes" : MessageLookupByLibrary.simpleMessage("Sí"), - "You are not observing any students." : MessageLookupByLibrary.simpleMessage("No está observando a ningún estudiante."), - "You may only choose 10 calendars to display" : MessageLookupByLibrary.simpleMessage("Solo puede elegir 10 calendarios para mostrar"), - "You must enter a user id" : MessageLookupByLibrary.simpleMessage("Debe ingresar una identificación de usuario"), - "You must enter a valid domain" : MessageLookupByLibrary.simpleMessage("Debe ingresar un dominio válido"), - "You must select at least one calendar to display" : MessageLookupByLibrary.simpleMessage("Debe seleccionar al menos un calendario para mostrar"), - "You will be notified about this assignment on…" : MessageLookupByLibrary.simpleMessage("Se le notificará acerca de esta tarea el..."), - "You will be notified about this event on…" : MessageLookupByLibrary.simpleMessage("Se le notificará acerca de este evento el..."), - "You\'ll find the QR code on the web in your account profile. Click \'QR for Mobile Login\' in the list." : MessageLookupByLibrary.simpleMessage("Encontrará el código QR en el sitio web, en su perfil de la cuenta. Hacer clic en \"QR para inicio de sesión móvil\" (\"QR for Mobile Login\") en la lista."), - "You\'ll need to open your student\'s Canvas Student app to continue. Go into Main Menu > Settings > Pair with Observer and scan the QR code you see there." : MessageLookupByLibrary.simpleMessage("Para continuar, debe abrir la aplicación Canvas Student de su estudiante. Diríjase a Menú Principal > Configuraciones > Emparejar con Observador (Main Menu > Settings > Pair with Observer) y escanee el código QR que aparece allí."), - "Your code is incorrect or expired." : MessageLookupByLibrary.simpleMessage("Su código es incorrecto o ha caducado."), - "Your student’s courses might not be published yet." : MessageLookupByLibrary.simpleMessage("Es posible que los cursos de sus estudiantes aún no estén publicados."), - "You’re all caught up!" : MessageLookupByLibrary.simpleMessage("¡Ya está al día!"), - "actingAsUser" : m0, - "alertsLabel" : MessageLookupByLibrary.simpleMessage("Alertas"), - "appVersion" : m1, - "assignmentGradeAboveThreshold" : m2, - "assignmentGradeBelowThreshold" : m3, - "assignmentLockedModule" : m4, - "assignmentSubjectMessage" : m5, - "assignmentTotalPoints" : m6, - "assignmentTotalPointsAccessible" : m7, - "authorToNOthers" : m8, - "authorToRecipient" : m9, - "authorToRecipientAndNOthers" : m10, - "badgeNumberPlus" : m11, - "calendarLabel" : MessageLookupByLibrary.simpleMessage("Calendario"), - "canvasGuides" : MessageLookupByLibrary.simpleMessage("Guías de Canvas"), - "canvasLogoLabel" : MessageLookupByLibrary.simpleMessage("Logotipo de Canvas"), - "canvasSupport" : MessageLookupByLibrary.simpleMessage("Soporte técnico de Canvas"), - "changeStudentColorLabel" : m12, - "collapse" : MessageLookupByLibrary.simpleMessage("colapsar"), - "collapsed" : MessageLookupByLibrary.simpleMessage("colapsado"), - "contentDescriptionScoreOutOfPointsPossible" : m13, - "courseForWhom" : m14, - "courseGradeAboveThreshold" : m15, - "courseGradeBelowThreshold" : m16, - "coursesLabel" : MessageLookupByLibrary.simpleMessage("Cursos"), - "dateAtTime" : m17, - "dismissAlertLabel" : m18, - "domainSearchHelpBody" : m19, - "domainSearchHelpLabel" : MessageLookupByLibrary.simpleMessage("¿Cómo encuentro mi escuela o distrito?"), - "domainSearchInputHint" : MessageLookupByLibrary.simpleMessage("Ingresar el nombre de la escuela o el distrito..."), - "dueDateAtTime" : m20, - "endMasqueradeLogoutMessage" : m21, - "endMasqueradeMessage" : m22, - "eventSubjectMessage" : m23, - "eventTime" : m24, - "expand" : MessageLookupByLibrary.simpleMessage("expandir"), - "expanded" : MessageLookupByLibrary.simpleMessage("expandido"), - "finalGrade" : m25, - "findSchool" : MessageLookupByLibrary.simpleMessage("Buscar escuela"), - "frontPageSubjectMessage" : m26, - "gradeFormatScoreOutOfPointsPossible" : m27, - "gradesSubjectMessage" : m28, - "latePenalty" : m29, - "me" : MessageLookupByLibrary.simpleMessage("yo"), - "messageLinkPostscript" : m30, - "minus" : MessageLookupByLibrary.simpleMessage("menos"), - "mustBeAboveN" : m31, - "mustBeBelowN" : m32, - "next" : MessageLookupByLibrary.simpleMessage("Siguiente"), - "nextMonth" : m33, - "nextWeek" : m34, - "noDomainResults" : m35, - "ok" : MessageLookupByLibrary.simpleMessage("Aceptar"), - "outOfPoints" : m36, - "plusRecipientCount" : m37, - "pointsPossible" : m38, - "previousMonth" : m39, - "previousWeek" : m40, - "qrCreateAccountTos" : m41, - "ratingDialogEmailSubject" : m42, - "selectedMonthLabel" : m43, - "send" : MessageLookupByLibrary.simpleMessage("enviar"), - "starRating" : m44, - "submissionStatusSuccessSubtitle" : m45, - "syllabusSubjectMessage" : m46, - "unread" : MessageLookupByLibrary.simpleMessage("no leído"), - "unreadCount" : m47 - }; -} diff --git a/apps/flutter_parent/lib/l10n/generated/messages_fi.dart b/apps/flutter_parent/lib/l10n/generated/messages_fi.dart deleted file mode 100644 index 58fae2d4d2..0000000000 --- a/apps/flutter_parent/lib/l10n/generated/messages_fi.dart +++ /dev/null @@ -1,473 +0,0 @@ -// DO NOT EDIT. This is code generated via package:intl/generate_localized.dart -// This is a library that provides messages for a fi locale. All the -// messages from the main program should be duplicated here with the same -// function name. - -// Ignore issues from commonly used lints in this file. -// ignore_for_file:unnecessary_brace_in_string_interps, unnecessary_new -// ignore_for_file:prefer_single_quotes,comment_references, directives_ordering -// ignore_for_file:annotate_overrides,prefer_generic_function_type_aliases -// ignore_for_file:unused_import, file_names - -import 'package:intl/intl.dart'; -import 'package:intl/message_lookup_by_library.dart'; - -final messages = new MessageLookup(); - -typedef String MessageIfAbsent(String messageStr, List args); - -class MessageLookup extends MessageLookupByLibrary { - String get localeName => 'fi'; - - static m0(userName) => "Toimit käyttäjänä ${userName}"; - - static m1(version) => "v. ${version}"; - - static m2(threshold) => "Tehtävän arvosana yllä ${threshold}"; - - static m3(threshold) => "Tehtävän arvosana alla ${threshold}"; - - static m4(moduleName) => "Tehtävä on lukittu moduulilla \"${moduleName}\"."; - - static m5(studentName, assignmentName) => "Koskee: ${studentName}, Tehtävä - ${assignmentName}"; - - static m6(points) => "${points} pistettä"; - - static m7(points) => "${points} pistettä"; - - static m8(authorName, howMany) => "${Intl.plural(howMany, one: '${authorName} 1 muu', other: '${authorName} ${howMany} muuhun')}"; - - static m9(authorName, recipientName) => "${authorName} - ${recipientName}"; - - static m10(authorName, recipientName, howMany) => "${Intl.plural(howMany, one: '${authorName} ${recipientName} ja 1 muu', other: '${authorName} ${recipientName} ja ${howMany} muuta')}"; - - static m11(count) => "${count}+"; - - static m12(studentName) => "Vaihda väri kohteelle ${studentName}"; - - static m13(score, pointsPossible) => "${score}/${pointsPossible} pistettä"; - - static m14(studentShortName) => "${studentShortName}"; - - static m15(threshold) => "Kurssin arvosana yllä ${threshold}"; - - static m16(threshold) => "Kurssin arvosana alla ${threshold}"; - - static m17(date, time) => "${date} kohteessa ${time}"; - - static m18(alertTitle) => "Ohita ${alertTitle}"; - - static m19(canvasGuides, canvasSupport) => "Yritä etsiä sen koulun tai alueen nimeä, jolle yrität mennä, kuten “Smithin yksityiskoulu” tai “Smithin kunnan koulut”. Voit myös syöttää Canvasin verkko-osoitteen suoraan, kuten “smith.instructure.com”.\n\nLisätietoja laitoksesi Canvas-tilin etsimisestä löytyy seuraavasta ${canvasGuides}, ota yhteyttä ${canvasSupport}, tai pyydä apua koulustasi."; - - static m20(date, time) => "Määräpäivä ${date} kohteessa ${time}"; - - static m21(userName) => "Lopetat toimimasta käyttäjänä ${userName} ja sinut kirjataan ulos."; - - static m22(userName) => "Lopetat toimimasta käyttäjänä ${userName} ja palaat alkuperäiselle tilillesi."; - - static m23(studentName, eventTitle) => "Koskee: ${studentName}, Tapahtuma - ${eventTitle}"; - - static m24(startAt, endAt) => "${startAt} - ${endAt}"; - - static m25(grade) => "Lopullinen arvosana: ${grade}"; - - static m26(studentName) => "Koskee: ${studentName}, Etusivu"; - - static m27(score, pointsPossible) => "${score}/${pointsPossible}"; - - static m28(studentName) => "Koskee: ${studentName}, Arvosanat"; - - static m29(pointsLost) => "Rangaistus myöhästymisestä (-${pointsLost})"; - - static m30(studentName, linkUrl) => "Koskee: ${studentName}, ${linkUrl}"; - - static m31(percentage) => "Täytyy olla yli ${percentage}"; - - static m32(percentage) => "Täytyy olla alle ${percentage}"; - - static m33(month) => "Seuraava kuukausi: ${month}"; - - static m34(date) => "Seuraava viikko alkaen ${date}"; - - static m35(query) => "Ei löydy kouluja, jotka täsmäävät haun \"${query}\" kanssa"; - - static m36(points, howMany) => "${Intl.plural(howMany, one: '/1 piste', other: '/${points} pistettä')}"; - - static m37(count) => "+${count}"; - - static m38(points) => "${points} pistettä mahdollista"; - - static m39(month) => "Edellinen kuukausi: ${month}"; - - static m40(date) => "Edellinen viikko alkaen ${date}"; - - static m41(termsOfService, privacyPolicy) => "Kun napautat ”Luo tili”, hyväksyt ${termsOfService} ja ${privacyPolicy}"; - - static m42(version) => "Ehdotuksia Androidille - Canvas Parent ${version}"; - - static m43(month) => "Kuukausi ${month}"; - - static m44(position) => "${Intl.plural(position, one: '${position} tähti', other: '${position} tähteä')}"; - - static m45(date, time) => "Tämä tehtävä lähetettiin ${date} ${time} ja odottaa arvosanan antoa"; - - static m46(studentName) => "Koskee: ${studentName}, Opinto-ohjelma"; - - static m47(count) => "${count} lukematon"; - - final messages = _notInlinedMessages(_notInlinedMessages); - static _notInlinedMessages(_) => { - "\"Act as\" is essentially logging in as this user without a password. You will be able to take any action as if you were this user, and from other users\' points of views, it will be as if this user performed them. However, audit logs record that you were the one who performed the actions on behalf of this user." : MessageLookupByLibrary.simpleMessage("\"Toimi käyttäjänä\" kirjautuu periaatteessa sisään tänä käyttäjänä ilman salasanaa. Voit ryhtyä mihin tahansa toimenpiteeseen ikään kuin olisit tämä käyttäjä, ja muiden käyttäjien näkökulmasta näyttäisi siltä, että sinä olisit suorittanut nämä toimenpiteet. Tarkistuslokeihin kuitenkin kirjataan kuitenkin, että sinä suoritit toimenpiteet tämän käyttäjän puolesta."), - "-" : MessageLookupByLibrary.simpleMessage("-"), - "A description is required." : MessageLookupByLibrary.simpleMessage("Kuvaus vaaditaan."), - "A network error occurred when adding this student. Check your connection and try again." : MessageLookupByLibrary.simpleMessage("Ilmeni verkkovirhe lisättäessä tätä opiskelijaa. Tarkasta verkkoyhteys ja yritä uudelleen."), - "A subject is required." : MessageLookupByLibrary.simpleMessage("Vaaditaan aihe."), - "Act As User" : MessageLookupByLibrary.simpleMessage("Toimi käyttäjänä"), - "Add Student" : MessageLookupByLibrary.simpleMessage("Lisää opiskelija"), - "Add attachment" : MessageLookupByLibrary.simpleMessage("Lisää liite"), - "Add new student" : MessageLookupByLibrary.simpleMessage("Lisää uusi opiskelija"), - "Add student with…" : MessageLookupByLibrary.simpleMessage("Lisää opiskelija, jolla on..."), - "Alert Settings" : MessageLookupByLibrary.simpleMessage("Hälytykse asetukset"), - "Alert me when…" : MessageLookupByLibrary.simpleMessage("Hälytä minua, kun..."), - "All Grading Periods" : MessageLookupByLibrary.simpleMessage("Kaikki arvosanojen antojaksot"), - "Already have an account? " : MessageLookupByLibrary.simpleMessage("Onko sinulla jo tili? "), - "An email address is required." : MessageLookupByLibrary.simpleMessage("Sähköpostiosoite vaaditaan."), - "An error occurred when trying to display this link" : MessageLookupByLibrary.simpleMessage("Ilmeni virhe yritettäessä näyttää tätä linkkiä."), - "An error occurred while saving your selection. Please try again." : MessageLookupByLibrary.simpleMessage("Valintaasi tallennettaessa tapahtui virhe. Yritä uudelleen."), - "An unexpected error occurred" : MessageLookupByLibrary.simpleMessage("Ilmeni odottamaton virhe"), - "Android OS version" : MessageLookupByLibrary.simpleMessage("Android-käyttöjärjestelmän versio"), - "Appearance" : MessageLookupByLibrary.simpleMessage("Ulkoasu"), - "Application version" : MessageLookupByLibrary.simpleMessage("Sovelluksen versio"), - "Are you a student or teacher?" : MessageLookupByLibrary.simpleMessage("Oletko opiskelija vai opettaja?"), - "Are you sure you want to log out?" : MessageLookupByLibrary.simpleMessage("Haluatko varmasti kirjautua ulos?"), - "Are you sure you wish to close this page? Your unsent message will be lost." : MessageLookupByLibrary.simpleMessage("Haluatko varmasti sulkea tämän sivun? Lähettämätön viestisi menetetään."), - "Assignment Details" : MessageLookupByLibrary.simpleMessage("Tehtävän tiedot"), - "Assignment grade above" : MessageLookupByLibrary.simpleMessage("Tehtävän arvosana yllä"), - "Assignment grade below" : MessageLookupByLibrary.simpleMessage("Tehtävän arvosana alla"), - "Assignment missing" : MessageLookupByLibrary.simpleMessage("Tehtävä puuttuu"), - "Barney, Fuschia" : MessageLookupByLibrary.simpleMessage("Violetti, fuksia"), - "Calendars" : MessageLookupByLibrary.simpleMessage("Kalenterit"), - "Camera Permission" : MessageLookupByLibrary.simpleMessage("Kameran käyttöoikeudet"), - "Cancel" : MessageLookupByLibrary.simpleMessage("Peruuta"), - "Canvas Student" : MessageLookupByLibrary.simpleMessage("Canvas-opiskelija"), - "Canvas Teacher" : MessageLookupByLibrary.simpleMessage("Canvas-opettaja"), - "Canvas on GitHub" : MessageLookupByLibrary.simpleMessage("Canvas GitHubissa"), - "Choose a course to message" : MessageLookupByLibrary.simpleMessage("Valitse kurssi, jolle lähetetään viesti"), - "Choose from Gallery" : MessageLookupByLibrary.simpleMessage("Valitse galleriasta"), - "Complete" : MessageLookupByLibrary.simpleMessage("Valmis"), - "Contact Support" : MessageLookupByLibrary.simpleMessage("Ota yhteyttä tukeen"), - "Course Announcement" : MessageLookupByLibrary.simpleMessage("Kurssin ilmoitus"), - "Course Announcements" : MessageLookupByLibrary.simpleMessage("Kurssin ilmoitukset"), - "Course grade above" : MessageLookupByLibrary.simpleMessage("Kurssin arvosana yläpuolella"), - "Course grade below" : MessageLookupByLibrary.simpleMessage("Kurssin arvosana alapuolella"), - "Create Account" : MessageLookupByLibrary.simpleMessage("Luo tili"), - "Dark Mode" : MessageLookupByLibrary.simpleMessage("Tumma tila"), - "Date" : MessageLookupByLibrary.simpleMessage("Päivämäärä"), - "Delete" : MessageLookupByLibrary.simpleMessage("Poista"), - "Description" : MessageLookupByLibrary.simpleMessage("Kuvaus"), - "Device" : MessageLookupByLibrary.simpleMessage("Laite"), - "Device model" : MessageLookupByLibrary.simpleMessage("Laitteen malli"), - "Domain" : MessageLookupByLibrary.simpleMessage("Verkkotunnus"), - "Domain:" : MessageLookupByLibrary.simpleMessage("Verkkotunnus:"), - "Don\'t show again" : MessageLookupByLibrary.simpleMessage("Älä näytä uudelleen"), - "Done" : MessageLookupByLibrary.simpleMessage("Valmis"), - "Download" : MessageLookupByLibrary.simpleMessage("Lataa"), - "Due" : MessageLookupByLibrary.simpleMessage("Määräpäivä"), - "EXTREME CRITICAL EMERGENCY!!" : MessageLookupByLibrary.simpleMessage("ERITTÄIN KIIREELLINEN HÄTÄTAPAUS!"), - "Electric, blue" : MessageLookupByLibrary.simpleMessage("Sähkönsininen"), - "Email Address" : MessageLookupByLibrary.simpleMessage("Sähköpostiosoite"), - "Email:" : MessageLookupByLibrary.simpleMessage("Sähköposti:"), - "Email…" : MessageLookupByLibrary.simpleMessage("Sähköposti..."), - "Enter the student pairing code provided to you. If the pairing code doesn\'t work, it may have expired" : MessageLookupByLibrary.simpleMessage("Kirjoita opiskelijan parinmuodostuskoodi, joka on toimitettu sinulle. Jos parinmuodostuskoodi ei toimi, se saattaa olla vanhentunut"), - "Event" : MessageLookupByLibrary.simpleMessage("Tapahtuma"), - "Excused" : MessageLookupByLibrary.simpleMessage("Annettu anteeksi"), - "Expired QR Code" : MessageLookupByLibrary.simpleMessage("Vanhentunut viivakoodi"), - "Failed. Tap for options." : MessageLookupByLibrary.simpleMessage("Epäonnistui. Asetukset napauttamalla."), - "Filter" : MessageLookupByLibrary.simpleMessage("Suodatin"), - "Filter by" : MessageLookupByLibrary.simpleMessage("Suodatusperuste"), - "Fire, Orange" : MessageLookupByLibrary.simpleMessage("Tulenoranssi"), - "Front Page" : MessageLookupByLibrary.simpleMessage("Etusivu"), - "Full Name" : MessageLookupByLibrary.simpleMessage("Koko nimi"), - "Full Name…" : MessageLookupByLibrary.simpleMessage("Koko nimi..."), - "Full error message" : MessageLookupByLibrary.simpleMessage("Koko virhesanoma"), - "Go to today" : MessageLookupByLibrary.simpleMessage("Siirry tähän päivään"), - "Grade" : MessageLookupByLibrary.simpleMessage("Arvosana"), - "Grade percentage" : MessageLookupByLibrary.simpleMessage("Arvosanan prosenttiosuus"), - "Graded" : MessageLookupByLibrary.simpleMessage("Arvosteltu"), - "Grades" : MessageLookupByLibrary.simpleMessage("Arvosanat"), - "Help" : MessageLookupByLibrary.simpleMessage("Ohje"), - "Hide Password" : MessageLookupByLibrary.simpleMessage("Piilota salasana"), - "High Contrast Mode" : MessageLookupByLibrary.simpleMessage("Korkean kontrastin tila"), - "How are we doing?" : MessageLookupByLibrary.simpleMessage("Miten menestymme?"), - "How is this affecting you?" : MessageLookupByLibrary.simpleMessage("Kuinka tämä vaikuttaa sinuun?"), - "I can\'t get things done until I hear back from you." : MessageLookupByLibrary.simpleMessage("En saa asioita tehtyä, ennen kuin kuulen sinusta."), - "I don\'t have a Canvas account" : MessageLookupByLibrary.simpleMessage("Minulla ei ole Canvas-tiliä"), - "I have a Canvas account" : MessageLookupByLibrary.simpleMessage("Minulla on jo Canvas-tili"), - "I need some help but it\'s not urgent." : MessageLookupByLibrary.simpleMessage("Tarvitsen apua, mutta tämä ei ele kiireellistä."), - "I\'m having trouble logging in" : MessageLookupByLibrary.simpleMessage("Sisäänkirjautumisessani on ongelma"), - "Idea for Canvas Parent App [Android]" : MessageLookupByLibrary.simpleMessage("Idea Canvas Parent App -sovellukselle [Android]"), - "In order to provide you with a better experience, we have updated how reminders work. You can add new reminders by viewing an assignment or calendar event and tapping the switch under the \"Remind Me\" section.\n\nBe aware that any reminders created with older versions of this app will not be compatible with the new changes and you will need to create them again." : MessageLookupByLibrary.simpleMessage("Jotta voimme tarjota sinulle paremman kokemuksen, olemme päivittäneet sitä, miten muistutukset toimivat. Voit lisätä uusia muistutuksia tarkastelemalla tehtävää tai kalenteritapahtumaa ja napauttamalla kytkintä \"Muistuta minua\" -osassa.\n\nOle tietoinen, että kaikki muistutukset, jotka on luotu tämän sovelluksen vanhemmilla versioilla, eivät ole yhteensopivia uusien muutosten kanssa ja sinun täytyy luoda ne uudelleen."), - "Inbox" : MessageLookupByLibrary.simpleMessage("Tulevien laatikko"), - "Inbox Zero" : MessageLookupByLibrary.simpleMessage("Saapuvia posteja nolla!"), - "Incomplete" : MessageLookupByLibrary.simpleMessage("Keskeneräinen"), - "Incorrect Domain" : MessageLookupByLibrary.simpleMessage("Virheellinen verkkotunnus"), - "Institution Announcement" : MessageLookupByLibrary.simpleMessage("Laitoksen ilmoitus"), - "Institution Announcements" : MessageLookupByLibrary.simpleMessage("Laitoksen ilmoitukset"), - "Instructions" : MessageLookupByLibrary.simpleMessage("Rubriikki"), - "Interactions on this page are limited by your institution." : MessageLookupByLibrary.simpleMessage("Vuorovaikutukset on rajoitettu tällä sivulla laitoksesi puolesta."), - "Invalid QR Code" : MessageLookupByLibrary.simpleMessage("Viivakoodi ei kelpaa"), - "It looks like a great day to rest, relax, and recharge." : MessageLookupByLibrary.simpleMessage("Näyttää olevan hyvä päivä levätä, rentoutua ja latautua."), - "It looks like assignments haven\'t been created in this space yet." : MessageLookupByLibrary.simpleMessage("Näyttää siltä kuin tehtäviä ei vielä olisi luotu tässä tilassa."), - "Just a casual question, comment, idea, suggestion…" : MessageLookupByLibrary.simpleMessage("Vain satunnainen kysymys, kommentti, idea, ehdotus..."), - "Late" : MessageLookupByLibrary.simpleMessage("Myöhään"), - "Launch External Tool" : MessageLookupByLibrary.simpleMessage("Käynnistä ulkoinen työkalu"), - "Legal" : MessageLookupByLibrary.simpleMessage("Lakitiedot"), - "Light Mode" : MessageLookupByLibrary.simpleMessage("Vaalea tila"), - "Link Error" : MessageLookupByLibrary.simpleMessage("Linkin virhe"), - "Locale:" : MessageLookupByLibrary.simpleMessage("Kielialue:"), - "Locate QR Code" : MessageLookupByLibrary.simpleMessage("Etsi viivakoodi"), - "Location" : MessageLookupByLibrary.simpleMessage("Sijainti"), - "Locked" : MessageLookupByLibrary.simpleMessage("Lukittu"), - "Log Out" : MessageLookupByLibrary.simpleMessage("Kirjaudu ulos"), - "Login flow: Canvas" : MessageLookupByLibrary.simpleMessage("Sisäänkirjautumisen kulku: Canvas"), - "Login flow: Normal" : MessageLookupByLibrary.simpleMessage("Sisäänkirjautumisen kulku: Normaali"), - "Login flow: Site Admin" : MessageLookupByLibrary.simpleMessage("Sisäänkirjautumisen kulku: Sivuston pääkäyttäjä"), - "Login flow: Skip mobile verify" : MessageLookupByLibrary.simpleMessage("Sisäänkirjautumisen kulku: Ohita mobiilivahvistus"), - "Manage Students" : MessageLookupByLibrary.simpleMessage("Hallitse opiskelijoita"), - "Message" : MessageLookupByLibrary.simpleMessage("Viesti"), - "Message subject" : MessageLookupByLibrary.simpleMessage("Viestin otsikko"), - "Missing" : MessageLookupByLibrary.simpleMessage("Puuttuu"), - "Must be below 100" : MessageLookupByLibrary.simpleMessage("Täytyy olla alle 100"), - "Network error" : MessageLookupByLibrary.simpleMessage("Verkkovirhe."), - "Never" : MessageLookupByLibrary.simpleMessage("Ei koskaan"), - "New message" : MessageLookupByLibrary.simpleMessage("Uusi viesti"), - "No" : MessageLookupByLibrary.simpleMessage("Ei"), - "No Alerts" : MessageLookupByLibrary.simpleMessage("Ei hälytyksiä"), - "No Assignments" : MessageLookupByLibrary.simpleMessage("Ei tehtäviä"), - "No Courses" : MessageLookupByLibrary.simpleMessage("Ei kursseja"), - "No Due Date" : MessageLookupByLibrary.simpleMessage("Ei määräpäivää"), - "No Events Today!" : MessageLookupByLibrary.simpleMessage("Ei tapahtumia tänään!"), - "No Grade" : MessageLookupByLibrary.simpleMessage("Ei arvosanaa"), - "No Location Specified" : MessageLookupByLibrary.simpleMessage("Sijaintia ei ole määritetty"), - "No Students" : MessageLookupByLibrary.simpleMessage("Ei opiskelijoita"), - "No Subject" : MessageLookupByLibrary.simpleMessage("Ei aihetta"), - "No Summary" : MessageLookupByLibrary.simpleMessage("Ei yhteenvetoa"), - "No description" : MessageLookupByLibrary.simpleMessage("Ei kuvausta"), - "No recipients selected" : MessageLookupByLibrary.simpleMessage("Vastaanottajia ei valittu"), - "Not Graded" : MessageLookupByLibrary.simpleMessage("Ei arvosteltu"), - "Not Submitted" : MessageLookupByLibrary.simpleMessage("Ei lähetetty"), - "Not a parent?" : MessageLookupByLibrary.simpleMessage("Et ole vanhempi?"), - "Notifications for reminders about assignments and calendar events" : MessageLookupByLibrary.simpleMessage("Muistutusilmoitukset tehtävistä ja kalenteritapahtumista"), - "OS Version" : MessageLookupByLibrary.simpleMessage("Käyttöjärjestelmäversio"), - "Observer" : MessageLookupByLibrary.simpleMessage("Havainnoija"), - "One of our other apps might be a better fit. Tap one to visit the Play Store." : MessageLookupByLibrary.simpleMessage("Yksi muista sovelluksistamme saattaa olla paremmin sopiva. Napsauta yhtä vieraillaksesi Play Storessa."), - "Open Canvas Student" : MessageLookupByLibrary.simpleMessage("Avaa Canvas Student"), - "Open In Browser" : MessageLookupByLibrary.simpleMessage("Avaa selaimessa"), - "Open with another app" : MessageLookupByLibrary.simpleMessage("Avaa toisella sovelluksella"), - "Pairing Code" : MessageLookupByLibrary.simpleMessage("Parinmuodostuskoodi"), - "Password" : MessageLookupByLibrary.simpleMessage("Salasana"), - "Password is required" : MessageLookupByLibrary.simpleMessage("Salasana vaaditaan"), - "Password must contain at least 8 characters" : MessageLookupByLibrary.simpleMessage("Salasanassa on oltava vähintään 8 merkkiä"), - "Password…" : MessageLookupByLibrary.simpleMessage("Salasana..."), - "Planner Note" : MessageLookupByLibrary.simpleMessage("Kalenterin merkintä"), - "Please enter a valid email address" : MessageLookupByLibrary.simpleMessage("Anna voimassa oleva sähköpostiosoite"), - "Please enter an email address" : MessageLookupByLibrary.simpleMessage("Anna sähköpostiosoite."), - "Please enter full name" : MessageLookupByLibrary.simpleMessage("Anna koko nimesi"), - "Please scan a QR code generated by Canvas" : MessageLookupByLibrary.simpleMessage("Skannaa Canvasin luoma viivakoodi."), - "Plum, Purple" : MessageLookupByLibrary.simpleMessage("Luumu, purppura"), - "Preparing…" : MessageLookupByLibrary.simpleMessage("Valmistellaan..."), - "Previous Logins" : MessageLookupByLibrary.simpleMessage("Edelliset kirjautumiset"), - "Privacy Policy" : MessageLookupByLibrary.simpleMessage("Tietosuojakäytäntö"), - "Privacy Policy Link" : MessageLookupByLibrary.simpleMessage("Tietosuojakäytäntö-linkki"), - "Privacy policy, terms of use, open source" : MessageLookupByLibrary.simpleMessage("Tietosuojakäytäntö, käyttöehdot, avoin lähde"), - "QR Code" : MessageLookupByLibrary.simpleMessage("Viivakoodi"), - "QR scanning requires camera access" : MessageLookupByLibrary.simpleMessage("Viivakoodin skannaukseen tarvitaan pääsy kameraan."), - "Raspberry, Red" : MessageLookupByLibrary.simpleMessage("Vadelmanpunainen"), - "Recipients" : MessageLookupByLibrary.simpleMessage("Vastaanottajat"), - "Refresh" : MessageLookupByLibrary.simpleMessage("Virkistä"), - "Remind Me" : MessageLookupByLibrary.simpleMessage("Muistuta minua"), - "Reminders" : MessageLookupByLibrary.simpleMessage("Muistutukset"), - "Reminders have changed!" : MessageLookupByLibrary.simpleMessage("Muistutukset ovat muuttuneet!"), - "Reply" : MessageLookupByLibrary.simpleMessage("Vastaus"), - "Reply All" : MessageLookupByLibrary.simpleMessage("Vastaa kaikille"), - "Report A Problem" : MessageLookupByLibrary.simpleMessage("Raportoi ongelma"), - "Request Login Help" : MessageLookupByLibrary.simpleMessage("Pyydä sisäänkirjautumisohje"), - "Request Login Help Button" : MessageLookupByLibrary.simpleMessage("Pyydä sisäänkirjautumisohje -painike"), - "Restart app" : MessageLookupByLibrary.simpleMessage("Käynnistä sovellus uudelleen"), - "Retry" : MessageLookupByLibrary.simpleMessage("Yritä uudelleen"), - "Return to Login" : MessageLookupByLibrary.simpleMessage("Palaa kirjautumiseen"), - "STUDENT" : MessageLookupByLibrary.simpleMessage("OPISKELIJA"), - "Screenshot showing location of QR code generation in browser" : MessageLookupByLibrary.simpleMessage("Leikekuva, joka näyttää viivakoodin sijainnin selaimessa."), - "Screenshot showing location of pairing QR code generation in the Canvas Student app" : MessageLookupByLibrary.simpleMessage("Kuvakaappaus, joka näyttää parinmuodostuskoodin luonnin sijainnin Canvas Student -sovelluksessa."), - "Select" : MessageLookupByLibrary.simpleMessage("Valitse"), - "Select Student Color" : MessageLookupByLibrary.simpleMessage("Valitse Student-sovelluksen väri"), - "Select recipients" : MessageLookupByLibrary.simpleMessage("Valitse vastaanottajat"), - "Send Feedback" : MessageLookupByLibrary.simpleMessage("Lähetä palautetta"), - "Send a message about this assignment" : MessageLookupByLibrary.simpleMessage("Lähetä viesti tästä tehtävästä"), - "Send a message about this course" : MessageLookupByLibrary.simpleMessage("Lähetä viesti tästä kurssista"), - "Send message" : MessageLookupByLibrary.simpleMessage("Lähetä viesti"), - "Set a date and time to be notified of this event." : MessageLookupByLibrary.simpleMessage("Määritä päivämäärä ja aika, jolloin sinulle ilmoitetaan tästä tapahtumasta."), - "Set a date and time to be notified of this specific assignment." : MessageLookupByLibrary.simpleMessage("Määritä päivämäärä ja aika, jolloin sinulle ilmoitetaan tästä määrätystä tehtävästä."), - "Settings" : MessageLookupByLibrary.simpleMessage("Asetukset"), - "Shamrock, Green" : MessageLookupByLibrary.simpleMessage("Apilanvihreä"), - "Share Your Love for the App" : MessageLookupByLibrary.simpleMessage("Jaa rakkautesi sovellusta kohtaan"), - "Show Password" : MessageLookupByLibrary.simpleMessage("Näytä salasana"), - "Sign In" : MessageLookupByLibrary.simpleMessage("Kirjaudu sisään"), - "Something went wrong trying to create your account, please reach out to your school for assistance." : MessageLookupByLibrary.simpleMessage("Ilmeni virhe, kun tiliäsi yritettiin luoda. Pyydä apua koulultasi."), - "Something\'s broken but I can work around it to get what I need done." : MessageLookupByLibrary.simpleMessage("Jotakin on rikki, mutta löydän tavan saada tehdyksi, mitä minun pitää saada tehdyksi."), - "Stop Acting as User" : MessageLookupByLibrary.simpleMessage("Lopeta toimiminen käyttäjänä"), - "Student" : MessageLookupByLibrary.simpleMessage("Opiskelija"), - "Student Pairing" : MessageLookupByLibrary.simpleMessage("Opiskelijan parinmuodostus"), - "Students can create a QR code using the Canvas Student app on their mobile device" : MessageLookupByLibrary.simpleMessage("Opiskelijat voivat luoda viivakoodin Canvas Student -sovelluksen avulla mobiililaitteellaan."), - "Students can obtain a pairing code through the Canvas website" : MessageLookupByLibrary.simpleMessage("Opiskelijat voivat hankkia parinmuodostuskoodin Canvasin verkkosivustolta."), - "Subject" : MessageLookupByLibrary.simpleMessage("Aihe"), - "Submitted" : MessageLookupByLibrary.simpleMessage("Lähetetty"), - "Successfully submitted!" : MessageLookupByLibrary.simpleMessage("Lähetetty onnistuneesti!"), - "Summary" : MessageLookupByLibrary.simpleMessage("Yhteenveto"), - "Switch Users" : MessageLookupByLibrary.simpleMessage("Vaihda käyttäjiä"), - "Syllabus" : MessageLookupByLibrary.simpleMessage("Opinto-ohjelma"), - "TA" : MessageLookupByLibrary.simpleMessage("Apuopettaja"), - "TEACHER" : MessageLookupByLibrary.simpleMessage("OPETTAJA"), - "Tap to favorite the courses you want to see on the Calendar. Select up to 10." : MessageLookupByLibrary.simpleMessage("Valitse napauttamalla kurssit, jotka haluat nähdä kalenterissa. Valitse enintään 10."), - "Tap to pair with a new student" : MessageLookupByLibrary.simpleMessage("Muodosta yhteys uuden opiskelijan kanssa napauttamalla"), - "Tap to select this student" : MessageLookupByLibrary.simpleMessage("Valitse tämä opiskelija napauttamalla"), - "Tap to show student selector" : MessageLookupByLibrary.simpleMessage("Näytä opiskelijan valintatoiminto napauttamalla"), - "Teacher" : MessageLookupByLibrary.simpleMessage("Opettaja"), - "Tell us about your favorite parts of the app" : MessageLookupByLibrary.simpleMessage("Kerro meille sovelluksen suosikkiosista"), - "Terms of Service" : MessageLookupByLibrary.simpleMessage("Käyttöehdot"), - "Terms of Service Link" : MessageLookupByLibrary.simpleMessage("Käyttöehdot-linkki"), - "Terms of Use" : MessageLookupByLibrary.simpleMessage("Käyttöehdot"), - "The QR code you scanned may have expired. Refresh the code on the student\'s device and try again." : MessageLookupByLibrary.simpleMessage("Skanaamasi viivakoodi on ehkä vanhentunut. Virkistä koodi opiskelijan laitteessa ja yritä uudelleen."), - "The following information will help us better understand your idea:" : MessageLookupByLibrary.simpleMessage("Seuraavat tiedot auttavat meitä ymmärtämään ideasi paremmin:"), - "The server you entered is not authorized for this app." : MessageLookupByLibrary.simpleMessage("Syöttämääsi palvelinta ei ole valtuutettu tälle sovellukselle."), - "The student you are trying to add belongs to a different school. Log in or create an account with that school to scan this code." : MessageLookupByLibrary.simpleMessage("Opiskelija, jota yrität lisätä, kuuluu toiseen kouluun! Kirjaudu sisään tai luo tili kyseisen koulun kanssa skannataksesi tämä koodi."), - "The user agent for this app is not authorized." : MessageLookupByLibrary.simpleMessage("Tämän sovelluksen käyttäjän edustajalle ei ole annettu valtuutuksia."), - "Theme" : MessageLookupByLibrary.simpleMessage("Teema"), - "There are no installed applications that can open this file" : MessageLookupByLibrary.simpleMessage("Ei ole asennettuna sovelluksia, joilla tämä tiedosto voidaan avata"), - "There is no page information available." : MessageLookupByLibrary.simpleMessage("Sivutietoja ei ole saatavilla."), - "There was a problem loading the Terms of Use" : MessageLookupByLibrary.simpleMessage("Ilmeni ongelma käyttöehtoja ladattaessa"), - "There was a problem removing this student from your account. Please check your connection and try again." : MessageLookupByLibrary.simpleMessage("Ilmeni ongelma tämän opiskelijan siirtämisessä tililtäsi. Tarkasta yhteytesi ja yritä uudelleen."), - "There was an error loading recipients for this course" : MessageLookupByLibrary.simpleMessage("Tämän kurssin vastaanottajien lataamisessa ilmeni virhe"), - "There was an error loading the summary details for this course." : MessageLookupByLibrary.simpleMessage("Tämän kurssin yhteenvetotietojen lataamisessa ilmeni virhe."), - "There was an error loading this announcement" : MessageLookupByLibrary.simpleMessage("Tämän ilmoituksen latauksessa ilmeni virhe"), - "There was an error loading this conversation" : MessageLookupByLibrary.simpleMessage("Tämän keskustelun latauksessa ilmeni virhe"), - "There was an error loading this file" : MessageLookupByLibrary.simpleMessage("Tämän tiedoston latauksessa ilmeni virhe"), - "There was an error loading your inbox messages." : MessageLookupByLibrary.simpleMessage("Tulevien laatikon latauksessa ilmeni virhe."), - "There was an error loading your student\'s alerts." : MessageLookupByLibrary.simpleMessage("Opiskelijahälytysten latauksessa ilmeni virhe."), - "There was an error loading your student\'s calendar" : MessageLookupByLibrary.simpleMessage("Opiskelijakalenterin latauksessa ilmeni virhe"), - "There was an error loading your students." : MessageLookupByLibrary.simpleMessage("Opiskelijoidesi latauksessa ilmeni virhe."), - "There was an error loading your student’s courses." : MessageLookupByLibrary.simpleMessage("Opiskelijasi kurssien latauksessa ilmeni virhe."), - "There was an error logging in. Please generate another QR Code and try again." : MessageLookupByLibrary.simpleMessage("Sisäänkirjautumisessa tapahtui virhe. Luo toinen viivakoodi ja yritä uudelleen."), - "There was an error trying to act as this user. Please check the Domain and User ID and try again." : MessageLookupByLibrary.simpleMessage("Ilmeni virhe yritettäessä toimia tänä käyttäjänä. Tarkista verkkotunnus ja käyttäjän tunnus ja yritä uudelleen."), - "There’s nothing to be notified of yet." : MessageLookupByLibrary.simpleMessage("Ei ole vielä mitään ilmoitettavaa."), - "This app is not authorized for use." : MessageLookupByLibrary.simpleMessage("Tätä sovellusta ei ole valtuutettu käyttöön."), - "This course does not have any assignments or calendar events yet." : MessageLookupByLibrary.simpleMessage("Kurssilla ei ole vielä tehtäviä tai kalenterin tehtäviä."), - "This file is unsupported and can’t be viewed through the app" : MessageLookupByLibrary.simpleMessage("Tätä tiedostoa ei tueta eikä sitä voida tarkastella sovelluksen läpi"), - "This will unpair and remove all enrollments for this student from your account." : MessageLookupByLibrary.simpleMessage("Tämä kumoaa parinmuodostuksen ja poistaa kaikki rekisteröitymiset tällel opiskelijalle tililtäsi."), - "Total Grade" : MessageLookupByLibrary.simpleMessage("Kokonaisarvosana"), - "Uh oh!" : MessageLookupByLibrary.simpleMessage("Voi ei!"), - "Unable to fetch courses. Please check your connection and try again." : MessageLookupByLibrary.simpleMessage("Ei voida noutaa kursseja. Tarkasta yhteytesi ja yritä uudelleen."), - "Unable to load this image" : MessageLookupByLibrary.simpleMessage("Tätä kuvaa ei voida ladata"), - "Unable to play this media file" : MessageLookupByLibrary.simpleMessage("Tätä mediatiedostoa ei voida toistaa"), - "Unable to send message. Check your connection and try again." : MessageLookupByLibrary.simpleMessage("Viestin lähetys ei onnistunut. Tarkasta verkkoyhteys ja yritä uudelleen."), - "Under Construction" : MessageLookupByLibrary.simpleMessage("Rakenteilla"), - "Unknown User" : MessageLookupByLibrary.simpleMessage("Tuntematon käyttäjä"), - "Unsaved changes" : MessageLookupByLibrary.simpleMessage("Tallentamattomat muutokset"), - "Unsupported File" : MessageLookupByLibrary.simpleMessage("Tukematon tiedosto"), - "Upload File" : MessageLookupByLibrary.simpleMessage("Lataa tiedosto"), - "Use Camera" : MessageLookupByLibrary.simpleMessage("Käytä kameraa"), - "Use Dark Theme in Web Content" : MessageLookupByLibrary.simpleMessage("Käytä pimeää teemaa verkon sisällössä"), - "User ID" : MessageLookupByLibrary.simpleMessage("Käyttäjätunnus"), - "User ID:" : MessageLookupByLibrary.simpleMessage("Käyttäjätunnus:"), - "Version Number" : MessageLookupByLibrary.simpleMessage("Version numero"), - "View Description" : MessageLookupByLibrary.simpleMessage("Näytä kuvaus"), - "View error details" : MessageLookupByLibrary.simpleMessage("Näytä virhetiedot"), - "View the Privacy Policy" : MessageLookupByLibrary.simpleMessage("Näytä tietosuojakäytäntö"), - "We are currently building this feature for your viewing pleasure." : MessageLookupByLibrary.simpleMessage("Rakennamme tätä ominaisuutta tarkastelun käytännöllisyyden vuoksi."), - "We are unable to display this link, it may belong to an institution you currently aren\'t logged in to." : MessageLookupByLibrary.simpleMessage("Emme pysty näyttämään tätä linkkiä. Se saattaa kuulua laitokselle, johon et ole parhaillaan kirjautuneena sisään."), - "We couldn\'t find any students associated with this account" : MessageLookupByLibrary.simpleMessage("Emme löytäneet opiskelijoita, jotka liittyisivät tähän tiliin"), - "We were unable to verify the server for use with this app." : MessageLookupByLibrary.simpleMessage("Emme voineet vahvistaa tämän sovelluksen kanssa käytettävää palvelinta."), - "We’re not sure what happened, but it wasn’t good. Contact us if this keeps happening." : MessageLookupByLibrary.simpleMessage("Emme ole varmoja, mitä tapahtui, mutta se ei ollut hyvä. Ota meihin yhteyttä, jos tätä tapahtuu edelleen."), - "What can we do better?" : MessageLookupByLibrary.simpleMessage("Mitä voimme parantaa?"), - "Yes" : MessageLookupByLibrary.simpleMessage("Kyllä"), - "You are not observing any students." : MessageLookupByLibrary.simpleMessage("Et tarkkaile yhtään opiskelijaa."), - "You may only choose 10 calendars to display" : MessageLookupByLibrary.simpleMessage("Voit valita vain 10 kalenteria näytettäväksi"), - "You must enter a user id" : MessageLookupByLibrary.simpleMessage("Sinun on annettava voimassa oleva tunnus"), - "You must enter a valid domain" : MessageLookupByLibrary.simpleMessage("Määritä kelvollinen toimialue"), - "You must select at least one calendar to display" : MessageLookupByLibrary.simpleMessage("Sinun täytyy valita vähintään yksi kalenteri näytettäväksi"), - "You will be notified about this assignment on…" : MessageLookupByLibrary.simpleMessage("Saat ilmoituksen tästä tehtävästä..."), - "You will be notified about this event on…" : MessageLookupByLibrary.simpleMessage("Saat ilmoituksen tästä tapahtumasta..."), - "You\'ll find the QR code on the web in your account profile. Click \'QR for Mobile Login\' in the list." : MessageLookupByLibrary.simpleMessage("Löydät viivakoodin verkosta tiliprofiilistasi. Napsauta luettelosta ”Mobiilikirjautumistunnuksen viivakoodi”."), - "You\'ll need to open your student\'s Canvas Student app to continue. Go into Main Menu > Settings > Pair with Observer and scan the QR code you see there." : MessageLookupByLibrary.simpleMessage("Sinun täytyy avata opiskelijan Canvas Student -sovellus jatkaaksesi. Siirry Päävlikkoon > Asetukset > Muodosta laitepari havaitsijan kanssa ja skannaa siellä näkemäsi viivakoodi."), - "Your code is incorrect or expired." : MessageLookupByLibrary.simpleMessage("Koodisi on virheellinen tai vanhentunut."), - "Your student’s courses might not be published yet." : MessageLookupByLibrary.simpleMessage("Tämän opiskelijan kursseja ei ehkä ole vielä julkaistu."), - "You’re all caught up!" : MessageLookupByLibrary.simpleMessage("Olet ajan tasalla!"), - "actingAsUser" : m0, - "alertsLabel" : MessageLookupByLibrary.simpleMessage("Hälytykset"), - "appVersion" : m1, - "assignmentGradeAboveThreshold" : m2, - "assignmentGradeBelowThreshold" : m3, - "assignmentLockedModule" : m4, - "assignmentSubjectMessage" : m5, - "assignmentTotalPoints" : m6, - "assignmentTotalPointsAccessible" : m7, - "authorToNOthers" : m8, - "authorToRecipient" : m9, - "authorToRecipientAndNOthers" : m10, - "badgeNumberPlus" : m11, - "calendarLabel" : MessageLookupByLibrary.simpleMessage("Kalenteri"), - "canvasGuides" : MessageLookupByLibrary.simpleMessage("Canvas-oppaat"), - "canvasLogoLabel" : MessageLookupByLibrary.simpleMessage("Canvas-logo"), - "canvasSupport" : MessageLookupByLibrary.simpleMessage("Canvas-tuki"), - "changeStudentColorLabel" : m12, - "collapse" : MessageLookupByLibrary.simpleMessage("kutista"), - "collapsed" : MessageLookupByLibrary.simpleMessage("kutistettu"), - "contentDescriptionScoreOutOfPointsPossible" : m13, - "courseForWhom" : m14, - "courseGradeAboveThreshold" : m15, - "courseGradeBelowThreshold" : m16, - "coursesLabel" : MessageLookupByLibrary.simpleMessage("Kurssit"), - "dateAtTime" : m17, - "dismissAlertLabel" : m18, - "domainSearchHelpBody" : m19, - "domainSearchHelpLabel" : MessageLookupByLibrary.simpleMessage("Miten löydän kouluni tai alueeni?"), - "domainSearchInputHint" : MessageLookupByLibrary.simpleMessage("Kirjoita koulun nimi tai alue..."), - "dueDateAtTime" : m20, - "endMasqueradeLogoutMessage" : m21, - "endMasqueradeMessage" : m22, - "eventSubjectMessage" : m23, - "eventTime" : m24, - "expand" : MessageLookupByLibrary.simpleMessage("laajenna"), - "expanded" : MessageLookupByLibrary.simpleMessage("laajennettu"), - "finalGrade" : m25, - "findSchool" : MessageLookupByLibrary.simpleMessage("Etsi koulu"), - "frontPageSubjectMessage" : m26, - "gradeFormatScoreOutOfPointsPossible" : m27, - "gradesSubjectMessage" : m28, - "latePenalty" : m29, - "me" : MessageLookupByLibrary.simpleMessage("minä"), - "messageLinkPostscript" : m30, - "minus" : MessageLookupByLibrary.simpleMessage("miinus"), - "mustBeAboveN" : m31, - "mustBeBelowN" : m32, - "next" : MessageLookupByLibrary.simpleMessage("Seuraava"), - "nextMonth" : m33, - "nextWeek" : m34, - "noDomainResults" : m35, - "ok" : MessageLookupByLibrary.simpleMessage("OK"), - "outOfPoints" : m36, - "plusRecipientCount" : m37, - "pointsPossible" : m38, - "previousMonth" : m39, - "previousWeek" : m40, - "qrCreateAccountTos" : m41, - "ratingDialogEmailSubject" : m42, - "selectedMonthLabel" : m43, - "send" : MessageLookupByLibrary.simpleMessage("lähettää"), - "starRating" : m44, - "submissionStatusSuccessSubtitle" : m45, - "syllabusSubjectMessage" : m46, - "unread" : MessageLookupByLibrary.simpleMessage("lukematon"), - "unreadCount" : m47 - }; -} diff --git a/apps/flutter_parent/lib/l10n/generated/messages_fr.dart b/apps/flutter_parent/lib/l10n/generated/messages_fr.dart deleted file mode 100644 index 35f7c66bc4..0000000000 --- a/apps/flutter_parent/lib/l10n/generated/messages_fr.dart +++ /dev/null @@ -1,473 +0,0 @@ -// DO NOT EDIT. This is code generated via package:intl/generate_localized.dart -// This is a library that provides messages for a fr locale. All the -// messages from the main program should be duplicated here with the same -// function name. - -// Ignore issues from commonly used lints in this file. -// ignore_for_file:unnecessary_brace_in_string_interps, unnecessary_new -// ignore_for_file:prefer_single_quotes,comment_references, directives_ordering -// ignore_for_file:annotate_overrides,prefer_generic_function_type_aliases -// ignore_for_file:unused_import, file_names - -import 'package:intl/intl.dart'; -import 'package:intl/message_lookup_by_library.dart'; - -final messages = new MessageLookup(); - -typedef String MessageIfAbsent(String messageStr, List args); - -class MessageLookup extends MessageLookupByLibrary { - String get localeName => 'fr'; - - static m0(userName) => "Vous agissez en tant que ${userName}"; - - static m1(version) => "v. ${version}"; - - static m2(threshold) => "Note du devoir supérieure à ${threshold}"; - - static m3(threshold) => "Note du devoir inférieure à ${threshold}"; - - static m4(moduleName) => "Ce travail est verrouillé par le module « ${moduleName}. »"; - - static m5(studentName, assignmentName) => "À propos : ${studentName}, Travaux - ${assignmentName}"; - - static m6(points) => "${points} pts"; - - static m7(points) => "${points} points"; - - static m8(authorName, howMany) => "${Intl.plural(howMany, one: '${authorName} à 1 autre', other: '${authorName} à ${howMany} autres')}"; - - static m9(authorName, recipientName) => "${authorName} à ${recipientName}"; - - static m10(authorName, recipientName, howMany) => "${Intl.plural(howMany, one: '${authorName} à ${recipientName} et 1 autre', other: '${authorName} à ${recipientName} et ${howMany} autres')}"; - - static m11(count) => "${count}+"; - - static m12(studentName) => "Changer la couleur à ${studentName}"; - - static m13(score, pointsPossible) => "${score} sur ${pointsPossible} points"; - - static m14(studentShortName) => "pour ${studentShortName}"; - - static m15(threshold) => "Note de cours supérieure à ${threshold}"; - - static m16(threshold) => "Note de cours inférieure à ${threshold}"; - - static m17(date, time) => "le ${date} à ${time}"; - - static m18(alertTitle) => "Rejeter ${alertTitle}"; - - static m19(canvasGuides, canvasSupport) => "Essayez de rechercher le nom de l’école ou du district auquel vous essayez d\'accéder, par ex. « École privée Smith » ou « Écoles du comté de Smith ». Vous pouvez également saisir directement un domaine Canvas, par ex. « smith.instructure.com ».\n\nPour de plus amples informations sur la recherche du compte Canvas de votre établissement, vous pouvez consulter le ${canvasGuides}, contacter ${canvasSupport}, ou encore contacter votre école pour recevoir de l\'aide."; - - static m20(date, time) => "Dû le ${date} à ${time}"; - - static m21(userName) => "Vous n’agirez plus en tant que ${userName} et serez déconnecté."; - - static m22(userName) => "Vous n’agirez plus en tant que ${userName} et reprendrez votre compte original."; - - static m23(studentName, eventTitle) => "À propos : ${studentName}, Événement - ${eventTitle}"; - - static m24(startAt, endAt) => "${startAt} - ${endAt}"; - - static m25(grade) => "Note finale : ${grade}"; - - static m26(studentName) => "À propos : ${studentName}, Première page"; - - static m27(score, pointsPossible) => "${score} / ${pointsPossible}"; - - static m28(studentName) => "À propos : ${studentName}, Notes"; - - static m29(pointsLost) => "Pénalité de retard (-${pointsLost})"; - - static m30(studentName, linkUrl) => "À propos : ${studentName}, ${linkUrl}"; - - static m31(percentage) => "Doit être supérieur à ${percentage}"; - - static m32(percentage) => "Doit être inférieur à ${percentage}"; - - static m33(month) => "Mois suivant : ${month}"; - - static m34(date) => "La semaine suivante démarre le ${date}"; - - static m35(query) => "Impossible de trouver une école correspondant à « ${query} »"; - - static m36(points, howMany) => "${Intl.plural(howMany, one: 'Sur 1 point', other: 'Sur ${points} points')}"; - - static m37(count) => "+${count}"; - - static m38(points) => "${points} points possibles"; - - static m39(month) => "Mois précédent : ${month}"; - - static m40(date) => "La semaine précédente démarrait le ${date}"; - - static m41(termsOfService, privacyPolicy) => "En cliquant sur \"Créer un compte\", vous acceptez les ${termsOfService} et confirmez la ${privacyPolicy}"; - - static m42(version) => "Suggestions pour Android - Canvas Parent ${version}"; - - static m43(month) => "Mois de ${month}"; - - static m44(position) => "${Intl.plural(position, one: '${position} étoile', other: '${position} étoiles')}"; - - static m45(date, time) => "Ce travail a été soumis le ${date} à ${time} et attend sa note."; - - static m46(studentName) => "À propos : ${studentName}, Programme"; - - static m47(count) => "${count} non lu"; - - final messages = _notInlinedMessages(_notInlinedMessages); - static _notInlinedMessages(_) => { - "\"Act as\" is essentially logging in as this user without a password. You will be able to take any action as if you were this user, and from other users\' points of views, it will be as if this user performed them. However, audit logs record that you were the one who performed the actions on behalf of this user." : MessageLookupByLibrary.simpleMessage("\"Agir comme\" permet essentiellement de se connecter en tant qu\'utilisateur sans mot de passe. Vous pourrez effectuer toutes les actions que vous voulez comme si vous étiez cet utilisateur et, vu des autres utilisateurs, tout paraîtra comme si c’était cet utilisateur qui avait agi. Cependant, les journaux d’audit enregistrent le fait que c’est vous qui avez effectué ces actions au nom de l’utilisateur."), - "-" : MessageLookupByLibrary.simpleMessage("-"), - "A description is required." : MessageLookupByLibrary.simpleMessage("Une description est requise."), - "A network error occurred when adding this student. Check your connection and try again." : MessageLookupByLibrary.simpleMessage("Une erreur réseau est survenue lors de l\'ajout de l’élève. Vérifiez votre connexion, puis réessayez."), - "A subject is required." : MessageLookupByLibrary.simpleMessage("Un sujet est requis."), - "Act As User" : MessageLookupByLibrary.simpleMessage("Agir en tant qu\'utilisateur"), - "Add Student" : MessageLookupByLibrary.simpleMessage("Ajouter un élève"), - "Add attachment" : MessageLookupByLibrary.simpleMessage("Ajouter une pièce jointe"), - "Add new student" : MessageLookupByLibrary.simpleMessage("Ajouter un nouvel élève"), - "Add student with…" : MessageLookupByLibrary.simpleMessage("Ajouter un élève avec..."), - "Alert Settings" : MessageLookupByLibrary.simpleMessage("Paramètres d\'alertes"), - "Alert me when…" : MessageLookupByLibrary.simpleMessage("M\'alerter quand..."), - "All Grading Periods" : MessageLookupByLibrary.simpleMessage("Toutes les périodes de notation"), - "Already have an account? " : MessageLookupByLibrary.simpleMessage("Vous possédez déjà un compte ? "), - "An email address is required." : MessageLookupByLibrary.simpleMessage("Une adresse e-mail est requise."), - "An error occurred when trying to display this link" : MessageLookupByLibrary.simpleMessage("Une erreur est survenue lors de la tentative d’affichage de ce lien"), - "An error occurred while saving your selection. Please try again." : MessageLookupByLibrary.simpleMessage("Une erreur est survenue pendant l’enregistrement de votre sélection. Veuillez réessayer."), - "An unexpected error occurred" : MessageLookupByLibrary.simpleMessage("Une erreur inattendue s\'est produite"), - "Android OS version" : MessageLookupByLibrary.simpleMessage("Version de l’OS Android"), - "Appearance" : MessageLookupByLibrary.simpleMessage("Apparence"), - "Application version" : MessageLookupByLibrary.simpleMessage("Version de l\'application"), - "Are you a student or teacher?" : MessageLookupByLibrary.simpleMessage("Êtes-vous un élève ou bien un enseignant ?"), - "Are you sure you want to log out?" : MessageLookupByLibrary.simpleMessage("Voulez-vous vraiment vous déconnecter ?"), - "Are you sure you wish to close this page? Your unsent message will be lost." : MessageLookupByLibrary.simpleMessage("Voulez-vous vraiment fermer cette page ? Votre message n\'a pas été envoyé et sera perdu."), - "Assignment Details" : MessageLookupByLibrary.simpleMessage("Informations sur le devoir"), - "Assignment grade above" : MessageLookupByLibrary.simpleMessage("Note du devoir au dessus de"), - "Assignment grade below" : MessageLookupByLibrary.simpleMessage("Note du devoir en dessous de"), - "Assignment missing" : MessageLookupByLibrary.simpleMessage("Devoir manquant"), - "Barney, Fuschia" : MessageLookupByLibrary.simpleMessage("Barney, Fuschia"), - "Calendars" : MessageLookupByLibrary.simpleMessage("Calendriers"), - "Camera Permission" : MessageLookupByLibrary.simpleMessage("Autorisations d\'appareil photo"), - "Cancel" : MessageLookupByLibrary.simpleMessage("Annuler"), - "Canvas Student" : MessageLookupByLibrary.simpleMessage("Canvas Élève"), - "Canvas Teacher" : MessageLookupByLibrary.simpleMessage("Canvas Enseignant"), - "Canvas on GitHub" : MessageLookupByLibrary.simpleMessage("Canvas sur GitHub"), - "Choose a course to message" : MessageLookupByLibrary.simpleMessage("Sélectionnez un cours à envoyer en message"), - "Choose from Gallery" : MessageLookupByLibrary.simpleMessage("Choisir dans la galerie"), - "Complete" : MessageLookupByLibrary.simpleMessage("Terminé"), - "Contact Support" : MessageLookupByLibrary.simpleMessage("Contacter l’assistance"), - "Course Announcement" : MessageLookupByLibrary.simpleMessage("Annonce de cours"), - "Course Announcements" : MessageLookupByLibrary.simpleMessage("Annonces de cours"), - "Course grade above" : MessageLookupByLibrary.simpleMessage("Note du cours au dessus de"), - "Course grade below" : MessageLookupByLibrary.simpleMessage("Note du cours en dessous de"), - "Create Account" : MessageLookupByLibrary.simpleMessage("Créer un compte"), - "Dark Mode" : MessageLookupByLibrary.simpleMessage("Mode de couleur foncée"), - "Date" : MessageLookupByLibrary.simpleMessage("Date"), - "Delete" : MessageLookupByLibrary.simpleMessage("Supprimer"), - "Description" : MessageLookupByLibrary.simpleMessage("Description"), - "Device" : MessageLookupByLibrary.simpleMessage("Appareil"), - "Device model" : MessageLookupByLibrary.simpleMessage("Modèle d\'appareil"), - "Domain" : MessageLookupByLibrary.simpleMessage("Domaine"), - "Domain:" : MessageLookupByLibrary.simpleMessage("Domaine :"), - "Don\'t show again" : MessageLookupByLibrary.simpleMessage("Ne plus montrer à nouveau"), - "Done" : MessageLookupByLibrary.simpleMessage("Terminé"), - "Download" : MessageLookupByLibrary.simpleMessage("Télécharger"), - "Due" : MessageLookupByLibrary.simpleMessage("À rendre le"), - "EXTREME CRITICAL EMERGENCY!!" : MessageLookupByLibrary.simpleMessage("URGENCE CRITIQUE EXTRÊME !!!"), - "Electric, blue" : MessageLookupByLibrary.simpleMessage("Électrique, bleu"), - "Email Address" : MessageLookupByLibrary.simpleMessage("Adresse électronique"), - "Email:" : MessageLookupByLibrary.simpleMessage("Courriel :"), - "Email…" : MessageLookupByLibrary.simpleMessage("Courriel..."), - "Enter the student pairing code provided to you. If the pairing code doesn\'t work, it may have expired" : MessageLookupByLibrary.simpleMessage("Saisissez le code d’appariement élève qui vous a été transmis. Si le code ne fonctionne pas, il a peut-être expiré."), - "Event" : MessageLookupByLibrary.simpleMessage("Événement"), - "Excused" : MessageLookupByLibrary.simpleMessage("Excusé"), - "Expired QR Code" : MessageLookupByLibrary.simpleMessage("Code QR expiré"), - "Failed. Tap for options." : MessageLookupByLibrary.simpleMessage("Échec. Appuyez pour les options"), - "Filter" : MessageLookupByLibrary.simpleMessage("Filtre"), - "Filter by" : MessageLookupByLibrary.simpleMessage("Filtrer par"), - "Fire, Orange" : MessageLookupByLibrary.simpleMessage("Feu, Orange"), - "Front Page" : MessageLookupByLibrary.simpleMessage("Première page"), - "Full Name" : MessageLookupByLibrary.simpleMessage("Nom complet"), - "Full Name…" : MessageLookupByLibrary.simpleMessage("Nom complet..."), - "Full error message" : MessageLookupByLibrary.simpleMessage("Message d’erreur complet"), - "Go to today" : MessageLookupByLibrary.simpleMessage("Aller à « Aujourd\'hui »"), - "Grade" : MessageLookupByLibrary.simpleMessage("Note"), - "Grade percentage" : MessageLookupByLibrary.simpleMessage("Note en pourcentage"), - "Graded" : MessageLookupByLibrary.simpleMessage("Noté"), - "Grades" : MessageLookupByLibrary.simpleMessage("Notes"), - "Help" : MessageLookupByLibrary.simpleMessage("Aide"), - "Hide Password" : MessageLookupByLibrary.simpleMessage("Cacher le mot de passe"), - "High Contrast Mode" : MessageLookupByLibrary.simpleMessage("Mode contraste élevé"), - "How are we doing?" : MessageLookupByLibrary.simpleMessage("Comment nous débrouillons-nous ?"), - "How is this affecting you?" : MessageLookupByLibrary.simpleMessage("Comment cela vous affecte-t-il ?"), - "I can\'t get things done until I hear back from you." : MessageLookupByLibrary.simpleMessage("Je ne peux plus rien faire jusqu\'à ce que vous me contactiez."), - "I don\'t have a Canvas account" : MessageLookupByLibrary.simpleMessage("Je n’ai pas de compte Canvas"), - "I have a Canvas account" : MessageLookupByLibrary.simpleMessage("J’ai un compte Canvas"), - "I need some help but it\'s not urgent." : MessageLookupByLibrary.simpleMessage("J\'ai besoin d\'aide mais ce n\'est pas urgent."), - "I\'m having trouble logging in" : MessageLookupByLibrary.simpleMessage("J\'ai du mal à me connecter"), - "Idea for Canvas Parent App [Android]" : MessageLookupByLibrary.simpleMessage("Idée pour l\'application Canvas Parent [Android]"), - "In order to provide you with a better experience, we have updated how reminders work. You can add new reminders by viewing an assignment or calendar event and tapping the switch under the \"Remind Me\" section.\n\nBe aware that any reminders created with older versions of this app will not be compatible with the new changes and you will need to create them again." : MessageLookupByLibrary.simpleMessage("Afin de vous fournir une meilleure expérience utilisateur, nous avons changé la façon dont les rappels fonctionnent : Vous pouvez ajouter de nouveaux rappels en affichant un travail ou un événement de calendrier, puis en appuyant sur l’interrupteur situé dans la section « Rappelez-moi » (Remind Me).\n\nAttention, tout rappel créé avec d\'anciennes versions de l’application sera incompatible avec les nouveaux changements. Vous devrez donc créer à nouveau ces rappels."), - "Inbox" : MessageLookupByLibrary.simpleMessage("Boîte de réception"), - "Inbox Zero" : MessageLookupByLibrary.simpleMessage("Boîte de réception Zéro"), - "Incomplete" : MessageLookupByLibrary.simpleMessage("Incomplet"), - "Incorrect Domain" : MessageLookupByLibrary.simpleMessage("Domaine incorrect"), - "Institution Announcement" : MessageLookupByLibrary.simpleMessage("Annonce d\'institution"), - "Institution Announcements" : MessageLookupByLibrary.simpleMessage("Annonces de l\'institution"), - "Instructions" : MessageLookupByLibrary.simpleMessage("Instructions"), - "Interactions on this page are limited by your institution." : MessageLookupByLibrary.simpleMessage("Les interactions sur cette page sont limités par votre institution."), - "Invalid QR Code" : MessageLookupByLibrary.simpleMessage("Code QR non valide"), - "It looks like a great day to rest, relax, and recharge." : MessageLookupByLibrary.simpleMessage("Voilà une bien belle journée pour se reposer, se relaxer et faire le plein d\'énergie."), - "It looks like assignments haven\'t been created in this space yet." : MessageLookupByLibrary.simpleMessage("Il semble qu\'aucun travail n’a été créé à cet endroit pour le moment."), - "Just a casual question, comment, idea, suggestion…" : MessageLookupByLibrary.simpleMessage("Juste une question informelle, un commentaire, une idée, une suggestion..."), - "Late" : MessageLookupByLibrary.simpleMessage("En retard"), - "Launch External Tool" : MessageLookupByLibrary.simpleMessage("Lancer l\'outil externe"), - "Legal" : MessageLookupByLibrary.simpleMessage("Légal"), - "Light Mode" : MessageLookupByLibrary.simpleMessage("Mode de couleur claire"), - "Link Error" : MessageLookupByLibrary.simpleMessage("Erreur de lien"), - "Locale:" : MessageLookupByLibrary.simpleMessage("Langue :"), - "Locate QR Code" : MessageLookupByLibrary.simpleMessage("Localiser un code QR"), - "Location" : MessageLookupByLibrary.simpleMessage("Lieu"), - "Locked" : MessageLookupByLibrary.simpleMessage("Verrouillé"), - "Log Out" : MessageLookupByLibrary.simpleMessage("Se déconnecter"), - "Login flow: Canvas" : MessageLookupByLibrary.simpleMessage("Flux d’identification : Canvas"), - "Login flow: Normal" : MessageLookupByLibrary.simpleMessage("Flux d’identification : Normal"), - "Login flow: Site Admin" : MessageLookupByLibrary.simpleMessage("Flux d’identification : Administrateur du site"), - "Login flow: Skip mobile verify" : MessageLookupByLibrary.simpleMessage("Flux d’identification : Passer la vérification par mobile"), - "Manage Students" : MessageLookupByLibrary.simpleMessage("Gérer les élèves"), - "Message" : MessageLookupByLibrary.simpleMessage("Message"), - "Message subject" : MessageLookupByLibrary.simpleMessage("Sujet du message"), - "Missing" : MessageLookupByLibrary.simpleMessage("Manquant"), - "Must be below 100" : MessageLookupByLibrary.simpleMessage("Doit être inférieur à 100"), - "Network error" : MessageLookupByLibrary.simpleMessage("Erreur de réseau"), - "Never" : MessageLookupByLibrary.simpleMessage("Jamais"), - "New message" : MessageLookupByLibrary.simpleMessage("Nouveau message"), - "No" : MessageLookupByLibrary.simpleMessage("Non"), - "No Alerts" : MessageLookupByLibrary.simpleMessage("Pas d’alerte"), - "No Assignments" : MessageLookupByLibrary.simpleMessage("Aucun travail"), - "No Courses" : MessageLookupByLibrary.simpleMessage("Aucun cours"), - "No Due Date" : MessageLookupByLibrary.simpleMessage("Pas de date limite de rendu"), - "No Events Today!" : MessageLookupByLibrary.simpleMessage("Aucun événement aujourd\'hui !"), - "No Grade" : MessageLookupByLibrary.simpleMessage("Aucune note"), - "No Location Specified" : MessageLookupByLibrary.simpleMessage("Aucun lieu spécifié"), - "No Students" : MessageLookupByLibrary.simpleMessage("Pas d\'étudiants"), - "No Subject" : MessageLookupByLibrary.simpleMessage("Aucun sujet"), - "No Summary" : MessageLookupByLibrary.simpleMessage("Pas de résumé"), - "No description" : MessageLookupByLibrary.simpleMessage("Aucune description"), - "No recipients selected" : MessageLookupByLibrary.simpleMessage("Aucun destinataire sélectionné"), - "Not Graded" : MessageLookupByLibrary.simpleMessage("Non noté"), - "Not Submitted" : MessageLookupByLibrary.simpleMessage("Non soumis"), - "Not a parent?" : MessageLookupByLibrary.simpleMessage("Vous n\'êtes pas un parent ?"), - "Notifications for reminders about assignments and calendar events" : MessageLookupByLibrary.simpleMessage("Notifications de rappels de travaux et d\'événement de calendrier"), - "OS Version" : MessageLookupByLibrary.simpleMessage("Version de l\'OS"), - "Observer" : MessageLookupByLibrary.simpleMessage("Observateur"), - "One of our other apps might be a better fit. Tap one to visit the Play Store." : MessageLookupByLibrary.simpleMessage("Une autre de nos applications conviendrait sans doute davantage. Appuyez une fois pour vous rendre sur le Play Store"), - "Open Canvas Student" : MessageLookupByLibrary.simpleMessage("Ouvrir Canvas Student"), - "Open In Browser" : MessageLookupByLibrary.simpleMessage("Ouvrir dans le navigateur"), - "Open with another app" : MessageLookupByLibrary.simpleMessage("Ouvrir avec une autre application"), - "Pairing Code" : MessageLookupByLibrary.simpleMessage("Code d\'appariement"), - "Password" : MessageLookupByLibrary.simpleMessage("Mot de passe"), - "Password is required" : MessageLookupByLibrary.simpleMessage("Un mot de passe est requis."), - "Password must contain at least 8 characters" : MessageLookupByLibrary.simpleMessage("Le mot de passe doit contenir au moins 8 caractères."), - "Password…" : MessageLookupByLibrary.simpleMessage("Mot de passe..."), - "Planner Note" : MessageLookupByLibrary.simpleMessage("Note à l\'intention du planificateur"), - "Please enter a valid email address" : MessageLookupByLibrary.simpleMessage("Veuillez saisir une adresse électronique valide"), - "Please enter an email address" : MessageLookupByLibrary.simpleMessage("Veuillez saisir une adresse email"), - "Please enter full name" : MessageLookupByLibrary.simpleMessage("Veuillez saisir un nom complet."), - "Please scan a QR code generated by Canvas" : MessageLookupByLibrary.simpleMessage("Veuillez scanner un code QR généré par Canvas."), - "Plum, Purple" : MessageLookupByLibrary.simpleMessage("Prune, violet"), - "Preparing…" : MessageLookupByLibrary.simpleMessage("Préparation..."), - "Previous Logins" : MessageLookupByLibrary.simpleMessage("Identifiants précédents"), - "Privacy Policy" : MessageLookupByLibrary.simpleMessage("Politique de confidentialité"), - "Privacy Policy Link" : MessageLookupByLibrary.simpleMessage("Lien vers la Politique de confidentialité"), - "Privacy policy, terms of use, open source" : MessageLookupByLibrary.simpleMessage("Vie privée, conditions d’utilisation, open source"), - "QR Code" : MessageLookupByLibrary.simpleMessage("QR Code"), - "QR scanning requires camera access" : MessageLookupByLibrary.simpleMessage("Le scan de code QR nécessite l’accès à l\'appareil photo."), - "Raspberry, Red" : MessageLookupByLibrary.simpleMessage("Framboise, Rouge"), - "Recipients" : MessageLookupByLibrary.simpleMessage("Destinataires"), - "Refresh" : MessageLookupByLibrary.simpleMessage("Actualiser"), - "Remind Me" : MessageLookupByLibrary.simpleMessage("Me le rappeler"), - "Reminders" : MessageLookupByLibrary.simpleMessage("Rappels"), - "Reminders have changed!" : MessageLookupByLibrary.simpleMessage("Les rappels ont été modifiés !"), - "Reply" : MessageLookupByLibrary.simpleMessage("Répondre"), - "Reply All" : MessageLookupByLibrary.simpleMessage("Répondre à tous"), - "Report A Problem" : MessageLookupByLibrary.simpleMessage("Signaler un problème"), - "Request Login Help" : MessageLookupByLibrary.simpleMessage("Demander une assistance pour la connexion"), - "Request Login Help Button" : MessageLookupByLibrary.simpleMessage("Bouton « Demander une assistance pour la connexion »"), - "Restart app" : MessageLookupByLibrary.simpleMessage("Redémarrer l’application"), - "Retry" : MessageLookupByLibrary.simpleMessage("Réessayer"), - "Return to Login" : MessageLookupByLibrary.simpleMessage("Retourner à la page de connexion"), - "STUDENT" : MessageLookupByLibrary.simpleMessage("ÉLÈVE"), - "Screenshot showing location of QR code generation in browser" : MessageLookupByLibrary.simpleMessage("Capture d\'écran montrant l’emplacement du générateur de code QR dans le navigateur."), - "Screenshot showing location of pairing QR code generation in the Canvas Student app" : MessageLookupByLibrary.simpleMessage("Capture d\'écran montrant l’emplacement où est généré le code QR de jumelage dans l’application Canvas Student"), - "Select" : MessageLookupByLibrary.simpleMessage("Sélectionner"), - "Select Student Color" : MessageLookupByLibrary.simpleMessage("Sélectionner la couleur de l’élève"), - "Select recipients" : MessageLookupByLibrary.simpleMessage("Sélectionner des destinataires"), - "Send Feedback" : MessageLookupByLibrary.simpleMessage("Envoyer un avis"), - "Send a message about this assignment" : MessageLookupByLibrary.simpleMessage("Envoyer un message à propos de ce travail"), - "Send a message about this course" : MessageLookupByLibrary.simpleMessage("Envoyer un message à propos de ce cours"), - "Send message" : MessageLookupByLibrary.simpleMessage("Envoyer un message"), - "Set a date and time to be notified of this event." : MessageLookupByLibrary.simpleMessage("Paramétrez une date et une heure à laquelle vous notifier de cet événement."), - "Set a date and time to be notified of this specific assignment." : MessageLookupByLibrary.simpleMessage("Paramétrez une date et une heure à laquelle être informé de ce travail spécifique."), - "Settings" : MessageLookupByLibrary.simpleMessage("Paramètres"), - "Shamrock, Green" : MessageLookupByLibrary.simpleMessage("Trèfle, vert"), - "Share Your Love for the App" : MessageLookupByLibrary.simpleMessage("Partager votre engouement pour l\'application"), - "Show Password" : MessageLookupByLibrary.simpleMessage("Afficher le mot de passe"), - "Sign In" : MessageLookupByLibrary.simpleMessage("Se connecter"), - "Something went wrong trying to create your account, please reach out to your school for assistance." : MessageLookupByLibrary.simpleMessage("Un problème est survenu lors de la création de votre compte, veuillez contacter votre école pour obtenir de l\'aide."), - "Something\'s broken but I can work around it to get what I need done." : MessageLookupByLibrary.simpleMessage("Quelque chose ne fonctionne plus mais je peux quand même réaliser ce que je dois faire."), - "Stop Acting as User" : MessageLookupByLibrary.simpleMessage("Cesser d\'agir en tant qu\'utilisateur"), - "Student" : MessageLookupByLibrary.simpleMessage("Élève"), - "Student Pairing" : MessageLookupByLibrary.simpleMessage("Jumelage élève"), - "Students can create a QR code using the Canvas Student app on their mobile device" : MessageLookupByLibrary.simpleMessage("Les élèves peuvent créer un code QR à l’aide de l’application Canvas Student sur leur appareil mobile."), - "Students can obtain a pairing code through the Canvas website" : MessageLookupByLibrary.simpleMessage("Les élèves peuvent obtenir un code de jumelage via le site Web de Canvas."), - "Subject" : MessageLookupByLibrary.simpleMessage("Sujet"), - "Submitted" : MessageLookupByLibrary.simpleMessage("Soumis"), - "Successfully submitted!" : MessageLookupByLibrary.simpleMessage("Soumission effectuée avec succès !"), - "Summary" : MessageLookupByLibrary.simpleMessage("Résumé"), - "Switch Users" : MessageLookupByLibrary.simpleMessage("Changer d\'utilisateurs"), - "Syllabus" : MessageLookupByLibrary.simpleMessage("Programme"), - "TA" : MessageLookupByLibrary.simpleMessage("TA"), - "TEACHER" : MessageLookupByLibrary.simpleMessage("ENSEIGNANT"), - "Tap to favorite the courses you want to see on the Calendar. Select up to 10." : MessageLookupByLibrary.simpleMessage("Appuyez pour mettre en favoris les cours que vous souhaitez afficher sur le calendrier. Sélectionnez-en jusqu\'à 10"), - "Tap to pair with a new student" : MessageLookupByLibrary.simpleMessage("Appuyez pour apparier à un nouvel élève"), - "Tap to select this student" : MessageLookupByLibrary.simpleMessage("Appuyez pour sélectionner cet élève"), - "Tap to show student selector" : MessageLookupByLibrary.simpleMessage("Appuyez pour afficher le sélecteur d\'élève"), - "Teacher" : MessageLookupByLibrary.simpleMessage("Enseignant"), - "Tell us about your favorite parts of the app" : MessageLookupByLibrary.simpleMessage("Dites-nous quelles fonctions de l\'application vous plaisent le plus"), - "Terms of Service" : MessageLookupByLibrary.simpleMessage("Conditions d’utilisation"), - "Terms of Service Link" : MessageLookupByLibrary.simpleMessage("Lien vers les Conditions d’utilisation"), - "Terms of Use" : MessageLookupByLibrary.simpleMessage("Conditions d’utilisation"), - "The QR code you scanned may have expired. Refresh the code on the student\'s device and try again." : MessageLookupByLibrary.simpleMessage("Le code QR que vous avez scanné a probablement expiré. Veuillez réactualiser le code depuis l’appareil de l\'élève, puis réessayez."), - "The following information will help us better understand your idea:" : MessageLookupByLibrary.simpleMessage("Les informations suivantes nous aideront à mieux comprendre votre idée :"), - "The server you entered is not authorized for this app." : MessageLookupByLibrary.simpleMessage("Le serveur que vous avez saisi n\'est pas autorisé pour cette application."), - "The student you are trying to add belongs to a different school. Log in or create an account with that school to scan this code." : MessageLookupByLibrary.simpleMessage("L\'élève que vous essayez d\'ajouter appartient à une autre école. Connectez-vous ou créez un compte auprès de cette école pour scanner ce code."), - "The user agent for this app is not authorized." : MessageLookupByLibrary.simpleMessage("Cet agent utilisateur pour cette application n’est pas autorisé."), - "Theme" : MessageLookupByLibrary.simpleMessage("Thème"), - "There are no installed applications that can open this file" : MessageLookupByLibrary.simpleMessage("Aucune application installée ne sait ouvrir ce fichier"), - "There is no page information available." : MessageLookupByLibrary.simpleMessage("Il n\'y a aucune information de page disponible."), - "There was a problem loading the Terms of Use" : MessageLookupByLibrary.simpleMessage("Un problème est survenu lors du chargement des Conditions d’utilisation."), - "There was a problem removing this student from your account. Please check your connection and try again." : MessageLookupByLibrary.simpleMessage("Un problème est survenu lors de la suppression de l\'élève de votre compte. Veuillez vérifier votre connexion, puis réessayez."), - "There was an error loading recipients for this course" : MessageLookupByLibrary.simpleMessage("Une erreur est survenue lors du chargement des destinataires de ce cours."), - "There was an error loading the summary details for this course." : MessageLookupByLibrary.simpleMessage("Une erreur est survenue lors du chargement du résumé de ce cours."), - "There was an error loading this announcement" : MessageLookupByLibrary.simpleMessage("Une erreur est survenue lors du chargement de cette annonce."), - "There was an error loading this conversation" : MessageLookupByLibrary.simpleMessage("Une erreur est survenue lors du chargement de cette conversation."), - "There was an error loading this file" : MessageLookupByLibrary.simpleMessage("Une erreur est survenue au chargement de ce fichier"), - "There was an error loading your inbox messages." : MessageLookupByLibrary.simpleMessage("Une erreur est survenue lors du chargement des messages de votre boîte de réception."), - "There was an error loading your student\'s alerts." : MessageLookupByLibrary.simpleMessage("Une erreur est survenue lors du chargement des alertes de votre élève."), - "There was an error loading your student\'s calendar" : MessageLookupByLibrary.simpleMessage("Une erreur est survenue lors du chargement du calendrier d\'élève"), - "There was an error loading your students." : MessageLookupByLibrary.simpleMessage("Une erreur est survenue lors du chargement de vos élèves."), - "There was an error loading your student’s courses." : MessageLookupByLibrary.simpleMessage("Une erreur est survenue lors du chargement des cours de l’élève."), - "There was an error logging in. Please generate another QR Code and try again." : MessageLookupByLibrary.simpleMessage("Une erreur est survenue pendant la connexion. Veuillez générer un autre code QR, puis réessayez."), - "There was an error trying to act as this user. Please check the Domain and User ID and try again." : MessageLookupByLibrary.simpleMessage("Une erreur est survenue lors de la tentative d\'agir au nom de cet utilisateur. Veuillez vérifier le domaine et l’identifiant utilisateur, puis réessayez."), - "There’s nothing to be notified of yet." : MessageLookupByLibrary.simpleMessage("Nous n’avons rien à vous notifier."), - "This app is not authorized for use." : MessageLookupByLibrary.simpleMessage("Cette application n\'est pas autorisée à l\'utilisation."), - "This course does not have any assignments or calendar events yet." : MessageLookupByLibrary.simpleMessage("Ce cours ne possède pas encore de travaux ni d\'événements de calendrier."), - "This file is unsupported and can’t be viewed through the app" : MessageLookupByLibrary.simpleMessage("Ce fichier n’est pas pris en charge et ne peut être visualisé depuis l’application."), - "This will unpair and remove all enrollments for this student from your account." : MessageLookupByLibrary.simpleMessage("Cette action annulera le jumelage et supprimera toutes les inscriptions pour cet élève de votre compte."), - "Total Grade" : MessageLookupByLibrary.simpleMessage("Note totale"), - "Uh oh!" : MessageLookupByLibrary.simpleMessage("Euh... oups !"), - "Unable to fetch courses. Please check your connection and try again." : MessageLookupByLibrary.simpleMessage("Impossible de récupérer les cours. Veuillez vérifier votre et réessayer."), - "Unable to load this image" : MessageLookupByLibrary.simpleMessage("Impossible de charger cette image"), - "Unable to play this media file" : MessageLookupByLibrary.simpleMessage("Impossible de lire ce fichier multimédia"), - "Unable to send message. Check your connection and try again." : MessageLookupByLibrary.simpleMessage("Impossible d’envoyer le message. Vérifiez votre connexion, puis réessayez."), - "Under Construction" : MessageLookupByLibrary.simpleMessage("En construction"), - "Unknown User" : MessageLookupByLibrary.simpleMessage("Utilisateur inconnu"), - "Unsaved changes" : MessageLookupByLibrary.simpleMessage("Changements non enregistrés"), - "Unsupported File" : MessageLookupByLibrary.simpleMessage("Fichier non pris en charge"), - "Upload File" : MessageLookupByLibrary.simpleMessage("Envoyer fichier"), - "Use Camera" : MessageLookupByLibrary.simpleMessage("Utiliser l’appareil photo"), - "Use Dark Theme in Web Content" : MessageLookupByLibrary.simpleMessage("Utiliser le thème sombre pour le contenu Web."), - "User ID" : MessageLookupByLibrary.simpleMessage("ID utilisateur"), - "User ID:" : MessageLookupByLibrary.simpleMessage("ID d\'utilisateur"), - "Version Number" : MessageLookupByLibrary.simpleMessage("Numéro de version"), - "View Description" : MessageLookupByLibrary.simpleMessage("Afficher la description"), - "View error details" : MessageLookupByLibrary.simpleMessage("Afficher les détails de l’erreur"), - "View the Privacy Policy" : MessageLookupByLibrary.simpleMessage("Afficher la politique de confidentialité"), - "We are currently building this feature for your viewing pleasure." : MessageLookupByLibrary.simpleMessage("Nous sommes actuellement en train de travailler sur cette fonctionnalité, rien que pour vous."), - "We are unable to display this link, it may belong to an institution you currently aren\'t logged in to." : MessageLookupByLibrary.simpleMessage("Nous n’avons pas pu afficher ce lien. Il appartient peut-être à un établissement auquel vous n’êtes pas connecté."), - "We couldn\'t find any students associated with this account" : MessageLookupByLibrary.simpleMessage("Nous n’avons pas trouvé d\'élève associé à ce compte"), - "We were unable to verify the server for use with this app." : MessageLookupByLibrary.simpleMessage("Nous n’avons pas pu vérifier que ce serveur est autorisé à utiliser cette application."), - "We’re not sure what happened, but it wasn’t good. Contact us if this keeps happening." : MessageLookupByLibrary.simpleMessage("On ne sait pas trop ce qui s’est passé, mais ça a mal fini. Contactez-nous si le problème persiste."), - "What can we do better?" : MessageLookupByLibrary.simpleMessage("En quoi pouvons-nous nous améliorer ?"), - "Yes" : MessageLookupByLibrary.simpleMessage("Oui"), - "You are not observing any students." : MessageLookupByLibrary.simpleMessage("Vous n’observez aucun élève."), - "You may only choose 10 calendars to display" : MessageLookupByLibrary.simpleMessage("Vous pouvez seulement choisir 10 calendriers à afficher"), - "You must enter a user id" : MessageLookupByLibrary.simpleMessage("Vous devez entrer un identifiant utilisateur."), - "You must enter a valid domain" : MessageLookupByLibrary.simpleMessage("Vous devez entrer un domaine valide."), - "You must select at least one calendar to display" : MessageLookupByLibrary.simpleMessage("Vous devez sélectionner au moins un calendrier à afficher."), - "You will be notified about this assignment on…" : MessageLookupByLibrary.simpleMessage("Vous serez prévenu de ce travail le..."), - "You will be notified about this event on…" : MessageLookupByLibrary.simpleMessage("Vous serez notifié de cet événement le..."), - "You\'ll find the QR code on the web in your account profile. Click \'QR for Mobile Login\' in the list." : MessageLookupByLibrary.simpleMessage("Vous trouverez le code QR sur le Web dans votre profil. Cliquez sur « QR pour connexion mobile » dans la liste."), - "You\'ll need to open your student\'s Canvas Student app to continue. Go into Main Menu > Settings > Pair with Observer and scan the QR code you see there." : MessageLookupByLibrary.simpleMessage("Vous devrez ouvrir votre application pour élèves Canvas Student pour continuer. Rendez-vous dans Menu Principal > Paramètres > Jumelage avec un observateur et scannez le code QR qui y apparaît."), - "Your code is incorrect or expired." : MessageLookupByLibrary.simpleMessage("Votre code n’est pas correct, ou bien il a expiré."), - "Your student’s courses might not be published yet." : MessageLookupByLibrary.simpleMessage("Il est possible que les cours de l\'élève n\'aient pas encore été publiés."), - "You’re all caught up!" : MessageLookupByLibrary.simpleMessage("Vous êtes à jour !"), - "actingAsUser" : m0, - "alertsLabel" : MessageLookupByLibrary.simpleMessage("Alertes"), - "appVersion" : m1, - "assignmentGradeAboveThreshold" : m2, - "assignmentGradeBelowThreshold" : m3, - "assignmentLockedModule" : m4, - "assignmentSubjectMessage" : m5, - "assignmentTotalPoints" : m6, - "assignmentTotalPointsAccessible" : m7, - "authorToNOthers" : m8, - "authorToRecipient" : m9, - "authorToRecipientAndNOthers" : m10, - "badgeNumberPlus" : m11, - "calendarLabel" : MessageLookupByLibrary.simpleMessage("Agenda"), - "canvasGuides" : MessageLookupByLibrary.simpleMessage("Guides de Canvas"), - "canvasLogoLabel" : MessageLookupByLibrary.simpleMessage("Logo Canvas"), - "canvasSupport" : MessageLookupByLibrary.simpleMessage("Assistance Canvas"), - "changeStudentColorLabel" : m12, - "collapse" : MessageLookupByLibrary.simpleMessage("réduire"), - "collapsed" : MessageLookupByLibrary.simpleMessage("réduit"), - "contentDescriptionScoreOutOfPointsPossible" : m13, - "courseForWhom" : m14, - "courseGradeAboveThreshold" : m15, - "courseGradeBelowThreshold" : m16, - "coursesLabel" : MessageLookupByLibrary.simpleMessage("Cours"), - "dateAtTime" : m17, - "dismissAlertLabel" : m18, - "domainSearchHelpBody" : m19, - "domainSearchHelpLabel" : MessageLookupByLibrary.simpleMessage("Comment trouver mon école ou mon district ?"), - "domainSearchInputHint" : MessageLookupByLibrary.simpleMessage("Saisissez le district ou le nom de l\'école..."), - "dueDateAtTime" : m20, - "endMasqueradeLogoutMessage" : m21, - "endMasqueradeMessage" : m22, - "eventSubjectMessage" : m23, - "eventTime" : m24, - "expand" : MessageLookupByLibrary.simpleMessage("étendre"), - "expanded" : MessageLookupByLibrary.simpleMessage("étendu"), - "finalGrade" : m25, - "findSchool" : MessageLookupByLibrary.simpleMessage("Trouver une école"), - "frontPageSubjectMessage" : m26, - "gradeFormatScoreOutOfPointsPossible" : m27, - "gradesSubjectMessage" : m28, - "latePenalty" : m29, - "me" : MessageLookupByLibrary.simpleMessage("moi"), - "messageLinkPostscript" : m30, - "minus" : MessageLookupByLibrary.simpleMessage("moins"), - "mustBeAboveN" : m31, - "mustBeBelowN" : m32, - "next" : MessageLookupByLibrary.simpleMessage("Suivant"), - "nextMonth" : m33, - "nextWeek" : m34, - "noDomainResults" : m35, - "ok" : MessageLookupByLibrary.simpleMessage("OK"), - "outOfPoints" : m36, - "plusRecipientCount" : m37, - "pointsPossible" : m38, - "previousMonth" : m39, - "previousWeek" : m40, - "qrCreateAccountTos" : m41, - "ratingDialogEmailSubject" : m42, - "selectedMonthLabel" : m43, - "send" : MessageLookupByLibrary.simpleMessage("envoyer"), - "starRating" : m44, - "submissionStatusSuccessSubtitle" : m45, - "syllabusSubjectMessage" : m46, - "unread" : MessageLookupByLibrary.simpleMessage("non lu"), - "unreadCount" : m47 - }; -} diff --git a/apps/flutter_parent/lib/l10n/generated/messages_fr_CA.dart b/apps/flutter_parent/lib/l10n/generated/messages_fr_CA.dart deleted file mode 100644 index 69bd42c186..0000000000 --- a/apps/flutter_parent/lib/l10n/generated/messages_fr_CA.dart +++ /dev/null @@ -1,473 +0,0 @@ -// DO NOT EDIT. This is code generated via package:intl/generate_localized.dart -// This is a library that provides messages for a fr_CA locale. All the -// messages from the main program should be duplicated here with the same -// function name. - -// Ignore issues from commonly used lints in this file. -// ignore_for_file:unnecessary_brace_in_string_interps, unnecessary_new -// ignore_for_file:prefer_single_quotes,comment_references, directives_ordering -// ignore_for_file:annotate_overrides,prefer_generic_function_type_aliases -// ignore_for_file:unused_import, file_names - -import 'package:intl/intl.dart'; -import 'package:intl/message_lookup_by_library.dart'; - -final messages = new MessageLookup(); - -typedef String MessageIfAbsent(String messageStr, List args); - -class MessageLookup extends MessageLookupByLibrary { - String get localeName => 'fr_CA'; - - static m0(userName) => "Vous agissez en tant que ${userName}"; - - static m1(version) => "v. ${version}"; - - static m2(threshold) => "Note de la tâche supérieure à ${threshold}"; - - static m3(threshold) => "Note de la tâche inférieure à ${threshold}"; - - static m4(moduleName) => "Cette tâche est verrouillée par le module « ${moduleName} »."; - - static m5(studentName, assignmentName) => "En ce qui concerne : ${studentName}, tâche — ${assignmentName}"; - - static m6(points) => "${points} pts"; - - static m7(points) => "${points} points"; - - static m8(authorName, howMany) => "${Intl.plural(howMany, one: '${authorName} à un autre', other: '${authorName} à ${howMany} autres')}"; - - static m9(authorName, recipientName) => "${authorName} à ${recipientName}"; - - static m10(authorName, recipientName, howMany) => "${Intl.plural(howMany, one: '${authorName} à ${recipientName} et un autre', other: '${authorName} à ${recipientName} et ${howMany} autres')}"; - - static m11(count) => "${count}+"; - - static m12(studentName) => "Changer la couleur pour ${studentName}"; - - static m13(score, pointsPossible) => "${score} de ${pointsPossible} points"; - - static m14(studentShortName) => "pour ${studentShortName}"; - - static m15(threshold) => "Note du cours supérieure à ${threshold}"; - - static m16(threshold) => "Note du cours inférieure à ${threshold}"; - - static m17(date, time) => "${date} à ${time}"; - - static m18(alertTitle) => "Ignorer ${alertTitle}"; - - static m19(canvasGuides, canvasSupport) => "Essayez de rechercher le nom de l’école ou du district auquel vous tentez d’accéder, comme « École privée Smith » ou « Écoles régionales Smith ». Vous pouvez également saisir un domaine Canvas directement, comme « smith.instructure.com. »\n\nPour obtenir de plus amples renseignements sur la façon de trouver le compte Canvas de votre établissement, vous pouvez consulter ${canvasGuides}, communiquer avec ${canvasSupport}, ou contacter votre école pour obtenir de l’aide."; - - static m20(date, time) => "Dû le ${date} à ${time}"; - - static m21(userName) => "Vous allez cesser d’agir comme ${userName} et serez déconnecté."; - - static m22(userName) => "Vous allez cesser d’agir comme ${userName} et retournerez à votre compte original."; - - static m23(studentName, eventTitle) => "En ce qui concerne : ${studentName}, événement — ${eventTitle}"; - - static m24(startAt, endAt) => "${startAt} — ${endAt}"; - - static m25(grade) => "Note finale : ${grade}"; - - static m26(studentName) => "En ce qui concerne : ${studentName}, page de couverture"; - - static m27(score, pointsPossible) => "${score} / ${pointsPossible}"; - - static m28(studentName) => "En ce qui concerne : ${studentName}, notes"; - - static m29(pointsLost) => "Pénalité de retard (-${pointsLost})"; - - static m30(studentName, linkUrl) => "En ce qui concerne : ${studentName}, ${linkUrl}"; - - static m31(percentage) => "Doit être supérieure à ${percentage}"; - - static m32(percentage) => "Doit être inférieure à ${percentage}"; - - static m33(month) => "Mois suivant : ${month}"; - - static m34(date) => "Semaine prochaine commençant le ${date}"; - - static m35(query) => "Impossible de trouver les écoles correspondant à « ${query} »"; - - static m36(points, howMany) => "${Intl.plural(howMany, one: 'Sur 1 point', other: 'Sur ${points} points')}"; - - static m37(count) => "+${count}"; - - static m38(points) => "${points} points possibles"; - - static m39(month) => "Mois précédent : ${month}"; - - static m40(date) => "Semaine précédente commençant le ${date}"; - - static m41(termsOfService, privacyPolicy) => "En tapotant sur « Créer un compte », vous acceptez les ${termsOfService} ainsi que ${privacyPolicy}"; - - static m42(version) => "Suggestions pour Android - Canvas Parent ${version}"; - - static m43(month) => "Mois de ${month}"; - - static m44(position) => "${Intl.plural(position, one: '${position} étoile', other: '${position} étoiles')}"; - - static m45(date, time) => "Cette tâche a été soumise le ${date} à ${time} et attend d’être notée"; - - static m46(studentName) => "En ce qui concerne : ${studentName}, programme"; - - static m47(count) => "${count} non lu"; - - final messages = _notInlinedMessages(_notInlinedMessages); - static _notInlinedMessages(_) => { - "\"Act as\" is essentially logging in as this user without a password. You will be able to take any action as if you were this user, and from other users\' points of views, it will be as if this user performed them. However, audit logs record that you were the one who performed the actions on behalf of this user." : MessageLookupByLibrary.simpleMessage("« Agir en tant que » (Act as) est essentiellement d\'ouvrir une session en tant que cet utilisateur sans mot de passe. Vous serez en mesure de prendre toute action comme si vous étiez cet utilisateur, et selon les points de vue des autres utilisateurs, ce sera comme si cet utilisateur aurait effectué ces actions. Toutefois, le journal d\'événements a identifié que vous étiez celui qui a effectué les actions au nom de cet étudiant."), - "-" : MessageLookupByLibrary.simpleMessage("-"), - "A description is required." : MessageLookupByLibrary.simpleMessage("Description obligatoire."), - "A network error occurred when adding this student. Check your connection and try again." : MessageLookupByLibrary.simpleMessage("Une erreur réseau s’est produite lors de l’ajout de cet étudiant. Vérifiez votre connexion puis réessayez."), - "A subject is required." : MessageLookupByLibrary.simpleMessage("Un objet est requis."), - "Act As User" : MessageLookupByLibrary.simpleMessage("Agir en tant qu\'utilisateur"), - "Add Student" : MessageLookupByLibrary.simpleMessage("Ajouter un étudiant"), - "Add attachment" : MessageLookupByLibrary.simpleMessage("Ajouter une pièce jointe"), - "Add new student" : MessageLookupByLibrary.simpleMessage("Ajouter un nouvel étudiant"), - "Add student with…" : MessageLookupByLibrary.simpleMessage("Ajouter étudiant avec…"), - "Alert Settings" : MessageLookupByLibrary.simpleMessage("Réglages de l’alerte"), - "Alert me when…" : MessageLookupByLibrary.simpleMessage("M’alerter lorsque…"), - "All Grading Periods" : MessageLookupByLibrary.simpleMessage("Toutes les périodes de notation"), - "Already have an account? " : MessageLookupByLibrary.simpleMessage("Vous possédez déjà un compte? "), - "An email address is required." : MessageLookupByLibrary.simpleMessage("Adresse de courriel nécessaire."), - "An error occurred when trying to display this link" : MessageLookupByLibrary.simpleMessage("Une erreur s\'est produite au moment de l’affichage de ce lien"), - "An error occurred while saving your selection. Please try again." : MessageLookupByLibrary.simpleMessage("Une erreur s\'est produite lors de l’enregistrement de votre sélection. Veuillez réessayer."), - "An unexpected error occurred" : MessageLookupByLibrary.simpleMessage("Une erreur inattendue s’est produite"), - "Android OS version" : MessageLookupByLibrary.simpleMessage("Version du SE Android"), - "Appearance" : MessageLookupByLibrary.simpleMessage("Apparence"), - "Application version" : MessageLookupByLibrary.simpleMessage("Version de l’application"), - "Are you a student or teacher?" : MessageLookupByLibrary.simpleMessage("Êtes-vous étudiant ou enseignant?"), - "Are you sure you want to log out?" : MessageLookupByLibrary.simpleMessage("Voulez-vous vraiment vous déconnecter?"), - "Are you sure you wish to close this page? Your unsent message will be lost." : MessageLookupByLibrary.simpleMessage("Voulez-vous vraiment fermer cette page? Vos messages non envoyés seront perdus."), - "Assignment Details" : MessageLookupByLibrary.simpleMessage("Détails de la tâche"), - "Assignment grade above" : MessageLookupByLibrary.simpleMessage("Note de la tâche supérieure à"), - "Assignment grade below" : MessageLookupByLibrary.simpleMessage("Note de la tâche inférieure à"), - "Assignment missing" : MessageLookupByLibrary.simpleMessage("Tâche manquante"), - "Barney, Fuschia" : MessageLookupByLibrary.simpleMessage("Fuschia Barney"), - "Calendars" : MessageLookupByLibrary.simpleMessage("Calendriers"), - "Camera Permission" : MessageLookupByLibrary.simpleMessage("Autorisation de caméra"), - "Cancel" : MessageLookupByLibrary.simpleMessage("Annuler"), - "Canvas Student" : MessageLookupByLibrary.simpleMessage("Étudiant Canvas"), - "Canvas Teacher" : MessageLookupByLibrary.simpleMessage("Enseignant Canvas"), - "Canvas on GitHub" : MessageLookupByLibrary.simpleMessage("Canvas sur GitHub"), - "Choose a course to message" : MessageLookupByLibrary.simpleMessage("Choisissez un cours pour lequel envoyer un message"), - "Choose from Gallery" : MessageLookupByLibrary.simpleMessage("Choisir dans la galerie"), - "Complete" : MessageLookupByLibrary.simpleMessage("Terminé"), - "Contact Support" : MessageLookupByLibrary.simpleMessage("Contacter l’équipe de soutien"), - "Course Announcement" : MessageLookupByLibrary.simpleMessage("Annonce du cours"), - "Course Announcements" : MessageLookupByLibrary.simpleMessage("Annonces de cours"), - "Course grade above" : MessageLookupByLibrary.simpleMessage("Note du cours supérieure à"), - "Course grade below" : MessageLookupByLibrary.simpleMessage("Note du cours inférieure à"), - "Create Account" : MessageLookupByLibrary.simpleMessage("Créer un compte"), - "Dark Mode" : MessageLookupByLibrary.simpleMessage("Mode de couleur foncée"), - "Date" : MessageLookupByLibrary.simpleMessage("Date"), - "Delete" : MessageLookupByLibrary.simpleMessage("Supprimer"), - "Description" : MessageLookupByLibrary.simpleMessage("Description"), - "Device" : MessageLookupByLibrary.simpleMessage("Dispositif"), - "Device model" : MessageLookupByLibrary.simpleMessage("Modèle de l’appareil"), - "Domain" : MessageLookupByLibrary.simpleMessage("Domaine"), - "Domain:" : MessageLookupByLibrary.simpleMessage("Domaine :"), - "Don\'t show again" : MessageLookupByLibrary.simpleMessage("Ne plus afficher à nouveau"), - "Done" : MessageLookupByLibrary.simpleMessage("Terminé"), - "Download" : MessageLookupByLibrary.simpleMessage("Télécharger"), - "Due" : MessageLookupByLibrary.simpleMessage("Échéance"), - "EXTREME CRITICAL EMERGENCY!!" : MessageLookupByLibrary.simpleMessage("ÉTAT D’URGENCE EXTRÊMEMENT SÉRIEUX!!"), - "Electric, blue" : MessageLookupByLibrary.simpleMessage("Bleu électrique"), - "Email Address" : MessageLookupByLibrary.simpleMessage("Adresse de courriel"), - "Email:" : MessageLookupByLibrary.simpleMessage("Courriel :"), - "Email…" : MessageLookupByLibrary.simpleMessage("Adresse courriel..."), - "Enter the student pairing code provided to you. If the pairing code doesn\'t work, it may have expired" : MessageLookupByLibrary.simpleMessage("Saisir le code d’appariement de l’étudiant qui vous a été fourni. Si le code d’appariement ne fonctionne pas, il peut avoir expiré"), - "Event" : MessageLookupByLibrary.simpleMessage("Événement"), - "Excused" : MessageLookupByLibrary.simpleMessage("Exempté"), - "Expired QR Code" : MessageLookupByLibrary.simpleMessage("Code QR expiré"), - "Failed. Tap for options." : MessageLookupByLibrary.simpleMessage("Échec. Appuyez pour des options."), - "Filter" : MessageLookupByLibrary.simpleMessage("Filtre"), - "Filter by" : MessageLookupByLibrary.simpleMessage("Filtrer par"), - "Fire, Orange" : MessageLookupByLibrary.simpleMessage("Orange feu"), - "Front Page" : MessageLookupByLibrary.simpleMessage("Page de couverture"), - "Full Name" : MessageLookupByLibrary.simpleMessage("Nom complet"), - "Full Name…" : MessageLookupByLibrary.simpleMessage("Nom complet..."), - "Full error message" : MessageLookupByLibrary.simpleMessage("Message d’erreur complet"), - "Go to today" : MessageLookupByLibrary.simpleMessage("Aller à aujourd\'hui"), - "Grade" : MessageLookupByLibrary.simpleMessage("Note"), - "Grade percentage" : MessageLookupByLibrary.simpleMessage("Pourcentage de notes"), - "Graded" : MessageLookupByLibrary.simpleMessage("Noté"), - "Grades" : MessageLookupByLibrary.simpleMessage("Notes"), - "Help" : MessageLookupByLibrary.simpleMessage("Aide"), - "Hide Password" : MessageLookupByLibrary.simpleMessage("Cacher le mot de passe"), - "High Contrast Mode" : MessageLookupByLibrary.simpleMessage("Mode haut contraste"), - "How are we doing?" : MessageLookupByLibrary.simpleMessage("Comment nous débrouillons-nous?"), - "How is this affecting you?" : MessageLookupByLibrary.simpleMessage("Comment cela vous affecte-t-il?"), - "I can\'t get things done until I hear back from you." : MessageLookupByLibrary.simpleMessage("Je ne peux plus rien faire jusqu’à ce que vous me contactiez."), - "I don\'t have a Canvas account" : MessageLookupByLibrary.simpleMessage("Je n’ai pas de compte Canvas"), - "I have a Canvas account" : MessageLookupByLibrary.simpleMessage("J’ai un compte Canvas"), - "I need some help but it\'s not urgent." : MessageLookupByLibrary.simpleMessage("J’ai besoin d’aide, mais ce n’est pas urgent"), - "I\'m having trouble logging in" : MessageLookupByLibrary.simpleMessage("J’ai des problèmes à me connecter"), - "Idea for Canvas Parent App [Android]" : MessageLookupByLibrary.simpleMessage("Idée pour l’application Canvas Parent [Android]"), - "In order to provide you with a better experience, we have updated how reminders work. You can add new reminders by viewing an assignment or calendar event and tapping the switch under the \"Remind Me\" section.\n\nBe aware that any reminders created with older versions of this app will not be compatible with the new changes and you will need to create them again." : MessageLookupByLibrary.simpleMessage("Afin de vous offrir une meilleure expérience, nous avons mis à jour le fonctionnement des rappels. Vous pouvez ajouter de nouveaux rappels en visualisant une tâche ou un événement de calendrier et en appuyant sur le curseur dans la section « Me rappeler ».\n\nSachez que les rappels créés avec les anciennes versions de cette application ne seront pas compatibles avec les nouvelles modifications et que vous devrez les créer à nouveau."), - "Inbox" : MessageLookupByLibrary.simpleMessage("Boîte de réception"), - "Inbox Zero" : MessageLookupByLibrary.simpleMessage("Boîte de réception Zéro"), - "Incomplete" : MessageLookupByLibrary.simpleMessage("Incomplet"), - "Incorrect Domain" : MessageLookupByLibrary.simpleMessage("Domaine incorrect"), - "Institution Announcement" : MessageLookupByLibrary.simpleMessage("Annonce de l’institution"), - "Institution Announcements" : MessageLookupByLibrary.simpleMessage("Annonces de l’institution"), - "Instructions" : MessageLookupByLibrary.simpleMessage("Instructions"), - "Interactions on this page are limited by your institution." : MessageLookupByLibrary.simpleMessage("Les interactions sur cette page sont limitées par votre institution."), - "Invalid QR Code" : MessageLookupByLibrary.simpleMessage("Code QR non valide"), - "It looks like a great day to rest, relax, and recharge." : MessageLookupByLibrary.simpleMessage("C\'est une belle journée pour se reposer, se détendre et recharger nos batteries."), - "It looks like assignments haven\'t been created in this space yet." : MessageLookupByLibrary.simpleMessage("Il semblerait qu’il n’y ait pas encore de tâche créée dans cet espace."), - "Just a casual question, comment, idea, suggestion…" : MessageLookupByLibrary.simpleMessage("Juste une question informelle, commentaire, idée, suggestion…"), - "Late" : MessageLookupByLibrary.simpleMessage("En retard"), - "Launch External Tool" : MessageLookupByLibrary.simpleMessage("Lancer l\'outil externe"), - "Legal" : MessageLookupByLibrary.simpleMessage("Légal"), - "Light Mode" : MessageLookupByLibrary.simpleMessage("Mode Jour"), - "Link Error" : MessageLookupByLibrary.simpleMessage("Erreur de lien"), - "Locale:" : MessageLookupByLibrary.simpleMessage("Paramètres régionaux :"), - "Locate QR Code" : MessageLookupByLibrary.simpleMessage("Trouvez le code QR"), - "Location" : MessageLookupByLibrary.simpleMessage("Emplacement"), - "Locked" : MessageLookupByLibrary.simpleMessage("Verrouillé"), - "Log Out" : MessageLookupByLibrary.simpleMessage("Déconnexion"), - "Login flow: Canvas" : MessageLookupByLibrary.simpleMessage("Flux de connexion : Canvas"), - "Login flow: Normal" : MessageLookupByLibrary.simpleMessage("Flux de connexion : Normal"), - "Login flow: Site Admin" : MessageLookupByLibrary.simpleMessage("Flux de connexion : Administrateur du site"), - "Login flow: Skip mobile verify" : MessageLookupByLibrary.simpleMessage("Flux de connexion : Ignorer la vérification mobile"), - "Manage Students" : MessageLookupByLibrary.simpleMessage("Gestion des participants"), - "Message" : MessageLookupByLibrary.simpleMessage("Message"), - "Message subject" : MessageLookupByLibrary.simpleMessage("Objet du message"), - "Missing" : MessageLookupByLibrary.simpleMessage("Manquant"), - "Must be below 100" : MessageLookupByLibrary.simpleMessage("Moins de 100"), - "Network error" : MessageLookupByLibrary.simpleMessage("Erreur de réseau"), - "Never" : MessageLookupByLibrary.simpleMessage("Jamais"), - "New message" : MessageLookupByLibrary.simpleMessage("Nouveau message"), - "No" : MessageLookupByLibrary.simpleMessage("Non"), - "No Alerts" : MessageLookupByLibrary.simpleMessage("Aucune alerte"), - "No Assignments" : MessageLookupByLibrary.simpleMessage("Aucune tâche"), - "No Courses" : MessageLookupByLibrary.simpleMessage("Aucun cours"), - "No Due Date" : MessageLookupByLibrary.simpleMessage("Aucune date d’échéance"), - "No Events Today!" : MessageLookupByLibrary.simpleMessage("Aucun événement d\'aujourd\'hui!"), - "No Grade" : MessageLookupByLibrary.simpleMessage("Non noté"), - "No Location Specified" : MessageLookupByLibrary.simpleMessage("Aucun lieu spécifié"), - "No Students" : MessageLookupByLibrary.simpleMessage("Aucun étudiant"), - "No Subject" : MessageLookupByLibrary.simpleMessage("Aucun sujet"), - "No Summary" : MessageLookupByLibrary.simpleMessage("Aucun résumé"), - "No description" : MessageLookupByLibrary.simpleMessage("Aucune description"), - "No recipients selected" : MessageLookupByLibrary.simpleMessage("Aucun destinataire sélectionné pour l’instant"), - "Not Graded" : MessageLookupByLibrary.simpleMessage("Non noté"), - "Not Submitted" : MessageLookupByLibrary.simpleMessage("Non soumis"), - "Not a parent?" : MessageLookupByLibrary.simpleMessage("Pas un parent?"), - "Notifications for reminders about assignments and calendar events" : MessageLookupByLibrary.simpleMessage("Notifications pour les rappels sur les tâches et les événements du calendrier"), - "OS Version" : MessageLookupByLibrary.simpleMessage("Version du SE"), - "Observer" : MessageLookupByLibrary.simpleMessage("Observateur"), - "One of our other apps might be a better fit. Tap one to visit the Play Store." : MessageLookupByLibrary.simpleMessage("L’une de nos autres applis pourrait mieux convenir. Tapoter sur l’une d’entre elles pour vous rendre sur l’App Store."), - "Open Canvas Student" : MessageLookupByLibrary.simpleMessage("Ouvrir Canvas Student"), - "Open In Browser" : MessageLookupByLibrary.simpleMessage("Ouvrir dans le navigateur"), - "Open with another app" : MessageLookupByLibrary.simpleMessage("Ouvrir avec une autre application"), - "Pairing Code" : MessageLookupByLibrary.simpleMessage("Jumelage du code"), - "Password" : MessageLookupByLibrary.simpleMessage("Mot de passe"), - "Password is required" : MessageLookupByLibrary.simpleMessage("Le mot de passe est requis"), - "Password must contain at least 8 characters" : MessageLookupByLibrary.simpleMessage("Le mot de passe doit contenir moins de 8 caractères"), - "Password…" : MessageLookupByLibrary.simpleMessage("Mot de passe..."), - "Planner Note" : MessageLookupByLibrary.simpleMessage("Remarque du planificateur"), - "Please enter a valid email address" : MessageLookupByLibrary.simpleMessage("Veuillez saisir une adresse courriel valide"), - "Please enter an email address" : MessageLookupByLibrary.simpleMessage("Veuillez saisir une adresse courriel."), - "Please enter full name" : MessageLookupByLibrary.simpleMessage("Veuillez saisir votre nom complet"), - "Please scan a QR code generated by Canvas" : MessageLookupByLibrary.simpleMessage("Veuillez scanner un code QR généré par Canvas"), - "Plum, Purple" : MessageLookupByLibrary.simpleMessage("Prune, violet"), - "Preparing…" : MessageLookupByLibrary.simpleMessage("En préparation…"), - "Previous Logins" : MessageLookupByLibrary.simpleMessage("Connexions précédentes"), - "Privacy Policy" : MessageLookupByLibrary.simpleMessage("Politique de confidentialité"), - "Privacy Policy Link" : MessageLookupByLibrary.simpleMessage("Lien vers la politique de confidentialité"), - "Privacy policy, terms of use, open source" : MessageLookupByLibrary.simpleMessage("Politique de confidentialité, conditions d’utilisation, source ouverte"), - "QR Code" : MessageLookupByLibrary.simpleMessage("Code QR"), - "QR scanning requires camera access" : MessageLookupByLibrary.simpleMessage("La numérisation par balayage du code QR nécessite un accès à la caméra"), - "Raspberry, Red" : MessageLookupByLibrary.simpleMessage("Framboise rouge"), - "Recipients" : MessageLookupByLibrary.simpleMessage("Destinataires"), - "Refresh" : MessageLookupByLibrary.simpleMessage("Actualiser"), - "Remind Me" : MessageLookupByLibrary.simpleMessage("Me prévenir"), - "Reminders" : MessageLookupByLibrary.simpleMessage("Rappels"), - "Reminders have changed!" : MessageLookupByLibrary.simpleMessage("Les rappels ont changé!"), - "Reply" : MessageLookupByLibrary.simpleMessage("Répondre"), - "Reply All" : MessageLookupByLibrary.simpleMessage("Répondre à tous"), - "Report A Problem" : MessageLookupByLibrary.simpleMessage("Signaler un problème"), - "Request Login Help" : MessageLookupByLibrary.simpleMessage("Demander de l’aide pour se connecter"), - "Request Login Help Button" : MessageLookupByLibrary.simpleMessage("Demander de l’aide pour le bouton de connexion"), - "Restart app" : MessageLookupByLibrary.simpleMessage("Redémarrer l’application"), - "Retry" : MessageLookupByLibrary.simpleMessage("Réessayer"), - "Return to Login" : MessageLookupByLibrary.simpleMessage("Revenir à l’ouverture de session"), - "STUDENT" : MessageLookupByLibrary.simpleMessage("ÉTUDIANT"), - "Screenshot showing location of QR code generation in browser" : MessageLookupByLibrary.simpleMessage("Capture d\'écran montrant l\'emplacement de la génération de code QR dans le navigateur"), - "Screenshot showing location of pairing QR code generation in the Canvas Student app" : MessageLookupByLibrary.simpleMessage("Capture d’écran montrant l’emplacement du jumelage de la génération de code QR dans l’application Canvas Student"), - "Select" : MessageLookupByLibrary.simpleMessage("Sélectionner"), - "Select Student Color" : MessageLookupByLibrary.simpleMessage("Sélectionner la couleur de l’étudiant"), - "Select recipients" : MessageLookupByLibrary.simpleMessage("Sélectionner les destinataires"), - "Send Feedback" : MessageLookupByLibrary.simpleMessage("Envoyer une rétroaction"), - "Send a message about this assignment" : MessageLookupByLibrary.simpleMessage("Envoyer un message à propos de cette tâche"), - "Send a message about this course" : MessageLookupByLibrary.simpleMessage("Envoyer un message à propos de ce cours"), - "Send message" : MessageLookupByLibrary.simpleMessage("Envoyer un message"), - "Set a date and time to be notified of this event." : MessageLookupByLibrary.simpleMessage("Définissez une date et une heure afin d’être averti de cet événement."), - "Set a date and time to be notified of this specific assignment." : MessageLookupByLibrary.simpleMessage("Définissez une date et une heure afin d’être averti de cette tâche spécifique."), - "Settings" : MessageLookupByLibrary.simpleMessage("Paramètres"), - "Shamrock, Green" : MessageLookupByLibrary.simpleMessage("Vert Shamrock"), - "Share Your Love for the App" : MessageLookupByLibrary.simpleMessage("Partager votre engouement pour l’application"), - "Show Password" : MessageLookupByLibrary.simpleMessage("Afficher mot de passe"), - "Sign In" : MessageLookupByLibrary.simpleMessage("Se connecter"), - "Something went wrong trying to create your account, please reach out to your school for assistance." : MessageLookupByLibrary.simpleMessage("Une erreur s\'est produite lors de la création de votre compte, veuillez contacter votre école pour obtenir de l\'aide."), - "Something\'s broken but I can work around it to get what I need done." : MessageLookupByLibrary.simpleMessage("Quelque chose ne fonctionne plus, mais je peux quand même réaliser ce que je dois faire."), - "Stop Acting as User" : MessageLookupByLibrary.simpleMessage("Arrêter d\'agir en tant qu\'utilisateur"), - "Student" : MessageLookupByLibrary.simpleMessage("Étudiant"), - "Student Pairing" : MessageLookupByLibrary.simpleMessage("Jumelage de l’étudiant"), - "Students can create a QR code using the Canvas Student app on their mobile device" : MessageLookupByLibrary.simpleMessage("Les étudiants peuvent créer un code QR à l’aide de l’application Canvas Student sur leur appareil mobile"), - "Students can obtain a pairing code through the Canvas website" : MessageLookupByLibrary.simpleMessage("Les étudiants peuvent obtenir un code de jumelage sur le site Web de Canvas"), - "Subject" : MessageLookupByLibrary.simpleMessage("Objet"), - "Submitted" : MessageLookupByLibrary.simpleMessage("Envoyé"), - "Successfully submitted!" : MessageLookupByLibrary.simpleMessage("Envoyé avec succès!"), - "Summary" : MessageLookupByLibrary.simpleMessage("Résumé"), - "Switch Users" : MessageLookupByLibrary.simpleMessage("Changer d’utilisateurs"), - "Syllabus" : MessageLookupByLibrary.simpleMessage("Programme"), - "TA" : MessageLookupByLibrary.simpleMessage("Instructeur-assistant"), - "TEACHER" : MessageLookupByLibrary.simpleMessage("ENSEIGNANT"), - "Tap to favorite the courses you want to see on the Calendar. Select up to 10." : MessageLookupByLibrary.simpleMessage("Appuyez pour mettre dans les favori les cours que vous souhaitez voir sur le calendrier. Sélectionnez-en jusqu\'à 10."), - "Tap to pair with a new student" : MessageLookupByLibrary.simpleMessage("Appuyez pour apparier avec un nouvel étudiant"), - "Tap to select this student" : MessageLookupByLibrary.simpleMessage("Appuyez pour sélectionner cet étudiant"), - "Tap to show student selector" : MessageLookupByLibrary.simpleMessage("Appuyez pour afficher le sélecteur d’étudiant"), - "Teacher" : MessageLookupByLibrary.simpleMessage("Enseignant"), - "Tell us about your favorite parts of the app" : MessageLookupByLibrary.simpleMessage("Dites-nous quelles fonctions de l’application vous plaisent le plus"), - "Terms of Service" : MessageLookupByLibrary.simpleMessage("Conditions d\'utilisation"), - "Terms of Service Link" : MessageLookupByLibrary.simpleMessage("Lien vers les conditions d\'utilisation"), - "Terms of Use" : MessageLookupByLibrary.simpleMessage("Conditions d\'utilisation"), - "The QR code you scanned may have expired. Refresh the code on the student\'s device and try again." : MessageLookupByLibrary.simpleMessage("Le code QR que vous avez scanné peut avoir expiré. Actualisez le code sur l’appareil de l’étudiant et essayez de nouveau."), - "The following information will help us better understand your idea:" : MessageLookupByLibrary.simpleMessage("Les informations suivantes nous aideront à mieux comprendre votre idée :"), - "The server you entered is not authorized for this app." : MessageLookupByLibrary.simpleMessage("Le serveur que vous avez saisi n’est pas autorisé pour cette application."), - "The student you are trying to add belongs to a different school. Log in or create an account with that school to scan this code." : MessageLookupByLibrary.simpleMessage("L’étudiant que vous tentez d’ajouter appartient à une autre école. Connectez-vous ou créez un compte auprès de cette école pour scanner ce code."), - "The user agent for this app is not authorized." : MessageLookupByLibrary.simpleMessage("L’agent utilisateur de cette application n’est pas autorisé."), - "Theme" : MessageLookupByLibrary.simpleMessage("Thème"), - "There are no installed applications that can open this file" : MessageLookupByLibrary.simpleMessage("Aucune application installée ne peut ouvrir ce fichier"), - "There is no page information available." : MessageLookupByLibrary.simpleMessage("Il n’y a aucune information de page disponible."), - "There was a problem loading the Terms of Use" : MessageLookupByLibrary.simpleMessage("Un problème est survenu lors du chargement des conditions d’utilisation"), - "There was a problem removing this student from your account. Please check your connection and try again." : MessageLookupByLibrary.simpleMessage("Un problème est survenu lors du retrait de cet étudiant de votre compte. Veuillez vérifier votre connexion et réessayer."), - "There was an error loading recipients for this course" : MessageLookupByLibrary.simpleMessage("Une erreur est survenue lors du chargement des destinataires de ce cours."), - "There was an error loading the summary details for this course." : MessageLookupByLibrary.simpleMessage("Une erreur est survenue lors du chargement des détails de résumé de ce cours."), - "There was an error loading this announcement" : MessageLookupByLibrary.simpleMessage("Une erreur est survenue lors du chargement de cette annonce"), - "There was an error loading this conversation" : MessageLookupByLibrary.simpleMessage("Une erreur est survenue lors du chargement de cette conversation"), - "There was an error loading this file" : MessageLookupByLibrary.simpleMessage("Une erreur est survenue lors du chargement de ce fichier"), - "There was an error loading your inbox messages." : MessageLookupByLibrary.simpleMessage("Une erreur est survenue lors du chargement de votre boîte de réception."), - "There was an error loading your student\'s alerts." : MessageLookupByLibrary.simpleMessage("Une erreur est survenue lors du chargement des alertes de votre étudiant."), - "There was an error loading your student\'s calendar" : MessageLookupByLibrary.simpleMessage("Une erreur est survenue lors du chargement du calendrier de vos étudiants."), - "There was an error loading your students." : MessageLookupByLibrary.simpleMessage("Une erreur est survenue lors du chargement de vos étudiants."), - "There was an error loading your student’s courses." : MessageLookupByLibrary.simpleMessage("Une erreur est survenue lors du chargement des cours de votre étudiant."), - "There was an error logging in. Please generate another QR Code and try again." : MessageLookupByLibrary.simpleMessage("Une erreur est survenue lors de la connexion. Veuillez générer un autre code QR et réessayer."), - "There was an error trying to act as this user. Please check the Domain and User ID and try again." : MessageLookupByLibrary.simpleMessage("Une erreur s\'est produite lors de la tentative d’agir en tant que cet utilisateur. Veuillez vérifier le domaine et l\'ID utilisateur et réessayer."), - "There’s nothing to be notified of yet." : MessageLookupByLibrary.simpleMessage("Il n’y a encore rien à signaler."), - "This app is not authorized for use." : MessageLookupByLibrary.simpleMessage("Cette application n’est pas autorisée à l’utilisation."), - "This course does not have any assignments or calendar events yet." : MessageLookupByLibrary.simpleMessage("Ce cours n’a pas encore de tâches ou d’événements de calendrier."), - "This file is unsupported and can’t be viewed through the app" : MessageLookupByLibrary.simpleMessage("Ce fichier n’est pas pris en charge et ne peut pas être consulté par l’application"), - "This will unpair and remove all enrollments for this student from your account." : MessageLookupByLibrary.simpleMessage("Cela éliminera le jumelage et supprimera toutes les inscriptions de cet étudiant de votre compte."), - "Total Grade" : MessageLookupByLibrary.simpleMessage("Note totale"), - "Uh oh!" : MessageLookupByLibrary.simpleMessage("Oh oh!"), - "Unable to fetch courses. Please check your connection and try again." : MessageLookupByLibrary.simpleMessage("Impossible de récupérer les cours. Veuillez vérifier votre connexion et réessayer."), - "Unable to load this image" : MessageLookupByLibrary.simpleMessage("Impossible de charger cette image"), - "Unable to play this media file" : MessageLookupByLibrary.simpleMessage("Impossible de lire ce fichier multimédia"), - "Unable to send message. Check your connection and try again." : MessageLookupByLibrary.simpleMessage("Impossible d’envoyer un message. Vérifiez votre connexion puis réessayez."), - "Under Construction" : MessageLookupByLibrary.simpleMessage("En construction"), - "Unknown User" : MessageLookupByLibrary.simpleMessage("Utilisateur inconnu"), - "Unsaved changes" : MessageLookupByLibrary.simpleMessage("Changements non enregistrés"), - "Unsupported File" : MessageLookupByLibrary.simpleMessage("Type de fichier non pris en charge"), - "Upload File" : MessageLookupByLibrary.simpleMessage("Téléverser le fichier"), - "Use Camera" : MessageLookupByLibrary.simpleMessage("Utiliser la caméra"), - "Use Dark Theme in Web Content" : MessageLookupByLibrary.simpleMessage("Utiliser le thème sombre dans le contenu Web"), - "User ID" : MessageLookupByLibrary.simpleMessage("ID utilisateur"), - "User ID:" : MessageLookupByLibrary.simpleMessage("Identifiant de l’utilisateur :"), - "Version Number" : MessageLookupByLibrary.simpleMessage("Numéro de version"), - "View Description" : MessageLookupByLibrary.simpleMessage("Voir la description"), - "View error details" : MessageLookupByLibrary.simpleMessage("Afficher les détails de l’erreur"), - "View the Privacy Policy" : MessageLookupByLibrary.simpleMessage("Voir la politique de confidentialité"), - "We are currently building this feature for your viewing pleasure." : MessageLookupByLibrary.simpleMessage("Nous construisons actuellement cette fonctionnalité pour votre plaisir de visionnement."), - "We are unable to display this link, it may belong to an institution you currently aren\'t logged in to." : MessageLookupByLibrary.simpleMessage("Nous sommes dans l\'impossibilité d\'afficher ce lien, il peut appartenir à une institution à laquelle vous n\'êtes pas actuellement connecté."), - "We couldn\'t find any students associated with this account" : MessageLookupByLibrary.simpleMessage("Nous n’avons pas pu trouver d’étudiant associé à ce compte"), - "We were unable to verify the server for use with this app." : MessageLookupByLibrary.simpleMessage("Nous n’avons pas pu vérifier le serveur pour son utilisation avec cette application."), - "We’re not sure what happened, but it wasn’t good. Contact us if this keeps happening." : MessageLookupByLibrary.simpleMessage("Nous ne sommes pas sûrs de ce qui s’est passé, mais ce n’était pas bon. Contactez-nous si cela continue."), - "What can we do better?" : MessageLookupByLibrary.simpleMessage("Que pourrions-nous faire plus efficacement?"), - "Yes" : MessageLookupByLibrary.simpleMessage("Oui"), - "You are not observing any students." : MessageLookupByLibrary.simpleMessage("Vous n’observez aucun étudiant."), - "You may only choose 10 calendars to display" : MessageLookupByLibrary.simpleMessage("Vous pouvez seulement choisir 10 calendriers à afficher"), - "You must enter a user id" : MessageLookupByLibrary.simpleMessage("Vous devez saisir un ID d’utilisateur"), - "You must enter a valid domain" : MessageLookupByLibrary.simpleMessage("Vous devez saisir un nom de domaine valide"), - "You must select at least one calendar to display" : MessageLookupByLibrary.simpleMessage("Vous devez sélectionner au moins un calendrier à afficher."), - "You will be notified about this assignment on…" : MessageLookupByLibrary.simpleMessage("Vous serez informé de cette tâche le…"), - "You will be notified about this event on…" : MessageLookupByLibrary.simpleMessage("Vous serez informé de cet événement le…"), - "You\'ll find the QR code on the web in your account profile. Click \'QR for Mobile Login\' in the list." : MessageLookupByLibrary.simpleMessage("Vous trouverez le code QR sur le Web dans votre profil de compte. Cliquez sur « \'QR for Mobile Login » (QR pour connexion mobile) dans la liste."), - "You\'ll need to open your student\'s Canvas Student app to continue. Go into Main Menu > Settings > Pair with Observer and scan the QR code you see there." : MessageLookupByLibrary.simpleMessage("Vous devez ouvrir l’application Canvas Student de votre étudiant pour continuer. Allez dans Menu principal > Paramètres > Jumeler avec l’observateur et scannez le code QR que vous y voyez."), - "Your code is incorrect or expired." : MessageLookupByLibrary.simpleMessage("Votre code est incorrect ou expiré."), - "Your student’s courses might not be published yet." : MessageLookupByLibrary.simpleMessage("Les cours de votre étudiant peuvent ne pas être encore publiés."), - "You’re all caught up!" : MessageLookupByLibrary.simpleMessage("Vous êtes coincé!"), - "actingAsUser" : m0, - "alertsLabel" : MessageLookupByLibrary.simpleMessage("Alertes"), - "appVersion" : m1, - "assignmentGradeAboveThreshold" : m2, - "assignmentGradeBelowThreshold" : m3, - "assignmentLockedModule" : m4, - "assignmentSubjectMessage" : m5, - "assignmentTotalPoints" : m6, - "assignmentTotalPointsAccessible" : m7, - "authorToNOthers" : m8, - "authorToRecipient" : m9, - "authorToRecipientAndNOthers" : m10, - "badgeNumberPlus" : m11, - "calendarLabel" : MessageLookupByLibrary.simpleMessage("Calendrier"), - "canvasGuides" : MessageLookupByLibrary.simpleMessage("Guides de Canvas"), - "canvasLogoLabel" : MessageLookupByLibrary.simpleMessage("Logo de Canvas"), - "canvasSupport" : MessageLookupByLibrary.simpleMessage("Soutien technique de Canvas"), - "changeStudentColorLabel" : m12, - "collapse" : MessageLookupByLibrary.simpleMessage("réduire"), - "collapsed" : MessageLookupByLibrary.simpleMessage("réduit"), - "contentDescriptionScoreOutOfPointsPossible" : m13, - "courseForWhom" : m14, - "courseGradeAboveThreshold" : m15, - "courseGradeBelowThreshold" : m16, - "coursesLabel" : MessageLookupByLibrary.simpleMessage("Cours"), - "dateAtTime" : m17, - "dismissAlertLabel" : m18, - "domainSearchHelpBody" : m19, - "domainSearchHelpLabel" : MessageLookupByLibrary.simpleMessage("Comment puis-je trouver mon école ou district?"), - "domainSearchInputHint" : MessageLookupByLibrary.simpleMessage("Saisir le nom de l’établissement scolaire ou du district…"), - "dueDateAtTime" : m20, - "endMasqueradeLogoutMessage" : m21, - "endMasqueradeMessage" : m22, - "eventSubjectMessage" : m23, - "eventTime" : m24, - "expand" : MessageLookupByLibrary.simpleMessage("développer"), - "expanded" : MessageLookupByLibrary.simpleMessage("développé"), - "finalGrade" : m25, - "findSchool" : MessageLookupByLibrary.simpleMessage("Trouver une école"), - "frontPageSubjectMessage" : m26, - "gradeFormatScoreOutOfPointsPossible" : m27, - "gradesSubjectMessage" : m28, - "latePenalty" : m29, - "me" : MessageLookupByLibrary.simpleMessage("moi"), - "messageLinkPostscript" : m30, - "minus" : MessageLookupByLibrary.simpleMessage("moins"), - "mustBeAboveN" : m31, - "mustBeBelowN" : m32, - "next" : MessageLookupByLibrary.simpleMessage("Suivant"), - "nextMonth" : m33, - "nextWeek" : m34, - "noDomainResults" : m35, - "ok" : MessageLookupByLibrary.simpleMessage("OK"), - "outOfPoints" : m36, - "plusRecipientCount" : m37, - "pointsPossible" : m38, - "previousMonth" : m39, - "previousWeek" : m40, - "qrCreateAccountTos" : m41, - "ratingDialogEmailSubject" : m42, - "selectedMonthLabel" : m43, - "send" : MessageLookupByLibrary.simpleMessage("envoyer"), - "starRating" : m44, - "submissionStatusSuccessSubtitle" : m45, - "syllabusSubjectMessage" : m46, - "unread" : MessageLookupByLibrary.simpleMessage("non lu"), - "unreadCount" : m47 - }; -} diff --git a/apps/flutter_parent/lib/l10n/generated/messages_ht.dart b/apps/flutter_parent/lib/l10n/generated/messages_ht.dart deleted file mode 100644 index 82dee3ddb9..0000000000 --- a/apps/flutter_parent/lib/l10n/generated/messages_ht.dart +++ /dev/null @@ -1,473 +0,0 @@ -// DO NOT EDIT. This is code generated via package:intl/generate_localized.dart -// This is a library that provides messages for a ht locale. All the -// messages from the main program should be duplicated here with the same -// function name. - -// Ignore issues from commonly used lints in this file. -// ignore_for_file:unnecessary_brace_in_string_interps, unnecessary_new -// ignore_for_file:prefer_single_quotes,comment_references, directives_ordering -// ignore_for_file:annotate_overrides,prefer_generic_function_type_aliases -// ignore_for_file:unused_import, file_names - -import 'package:intl/intl.dart'; -import 'package:intl/message_lookup_by_library.dart'; - -final messages = new MessageLookup(); - -typedef String MessageIfAbsent(String messageStr, List args); - -class MessageLookup extends MessageLookupByLibrary { - String get localeName => 'ht'; - - static m0(userName) => "W ap aji tankou ${userName}"; - - static m1(version) => "v. ${version}"; - - static m2(threshold) => "Nòt Devwa Plis Pase ${threshold}"; - - static m3(threshold) => "Nòt Devwa Mwens Pase ${threshold}"; - - static m4(moduleName) => "Modil \"${moduleName}\" bloke devwa sa a."; - - static m5(studentName, assignmentName) => "Konsènan: ${studentName}, Devwa - ${assignmentName}"; - - static m6(points) => "${points} pwen"; - - static m7(points) => "${points} pwen"; - - static m8(authorName, howMany) => "${Intl.plural(howMany, one: '${authorName} a 1 lòt', other: '${authorName} a ${howMany} lòt')}"; - - static m9(authorName, recipientName) => "${authorName} a ${recipientName}"; - - static m10(authorName, recipientName, howMany) => "${Intl.plural(howMany, one: '${authorName} a ${recipientName} & 1 lòt', other: '${authorName} a ${recipientName} & ${howMany} lòt')}"; - - static m11(count) => "${count}+"; - - static m12(studentName) => "Chanje koulè pou ${studentName}"; - - static m13(score, pointsPossible) => "${score} sou ${pointsPossible} pwen"; - - static m14(studentShortName) => "pou ${studentShortName}"; - - static m15(threshold) => "Nòt Kou Plis Pase ${threshold}"; - - static m16(threshold) => "Nòt Kou Mwens Pase ${threshold}"; - - static m17(date, time) => "${date} a ${time}"; - - static m18(alertTitle) => "Rejte ${alertTitle}"; - - static m19(canvasGuides, canvasSupport) => "Eseye chèche non lekòl oswa distri ou vle ale sou li a, pa egzanp “Smith Private School” or “Smith County Schools.” Ou kapab antre yon domèn Canvas dirèkteman, tankou pa egzanp “smith.instructure.com.”\n\nPou plis enfòmasyon pou jwenn kont Canvas enstitisyon ou an, ou ka vizite ${canvasGuides}, ale sou ${canvasSupport}, oswa pran kontak ak lekòl ou a pou plis asistans."; - - static m20(date, time) => "Delè ${date} a ${time}"; - - static m21(userName) => "W ap sispann pase pou ${userName} epi w ap dekonekte."; - - static m22(userName) => "W ap sispann pase pou ${userName} epi retounen sou kont orijinal ou."; - - static m23(studentName, eventTitle) => "Konsènan: ${studentName}, Aktivite - ${eventTitle}"; - - static m24(startAt, endAt) => "${startAt} - ${endAt}"; - - static m25(grade) => "Nòt Final: ${grade}"; - - static m26(studentName) => "Konsènan: ${studentName}, Premye Paj"; - - static m27(score, pointsPossible) => "${score} / ${pointsPossible}"; - - static m28(studentName) => "Konsènan: ${studentName}, Nòt"; - - static m29(pointsLost) => "Penalite pou reta (-${pointsLost})"; - - static m30(studentName, linkUrl) => "Konsènan: ${studentName}, ${linkUrl}"; - - static m31(percentage) => "Dwe siperyè a ${percentage}"; - - static m32(percentage) => "Dwe enferyè a ${percentage}"; - - static m33(month) => "Pwochen mwa: ${month}"; - - static m34(date) => "Semenn pwochen kòmanse ${date}"; - - static m35(query) => "Nou paka jwenn lekòl ki koresponn a \"${query}\""; - - static m36(points, howMany) => "${Intl.plural(howMany, one: 'Sou 1 pwen', other: 'Sou ${points} pwen')}"; - - static m37(count) => "+${count}"; - - static m38(points) => "${points} pwen posib"; - - static m39(month) => "Mwa pase: ${month}"; - - static m40(date) => "Semenn pase kòmanse ${date}"; - - static m41(termsOfService, privacyPolicy) => "Lè w tape \'Kreye Kont\', ou dakò Tèm ak Kondisyon yo ${termsOfService} epi ou rekonèt ${privacyPolicy}"; - - static m42(version) => "Sijesyon pou Android - Canvas Parent ${version}"; - - static m43(month) => "Mwa ${month}"; - - static m44(position) => "${Intl.plural(position, one: '${position} etwal', other: '${position} etwal')}"; - - static m45(date, time) => "Devwa sa a te soumèt nan dat ${date} a ${time} li an atant pou yo evalye li"; - - static m46(studentName) => "Konsènan: ${studentName}, Pwogram"; - - static m47(count) => "${count} poko li"; - - final messages = _notInlinedMessages(_notInlinedMessages); - static _notInlinedMessages(_) => { - "\"Act as\" is essentially logging in as this user without a password. You will be able to take any action as if you were this user, and from other users\' points of views, it will be as if this user performed them. However, audit logs record that you were the one who performed the actions on behalf of this user." : MessageLookupByLibrary.simpleMessage("\"Aji tankou\" se koneksyon an tan ke moun sa a san modpas. W ap kapab fè nenpòt bagay kòmsi ou te itilizatè sa a, e pou lòt moun yo, se kòmsi se itilizatè sa a ki t ap fè yo. Men, jounal odit yo endike ke se te ou menm ki te fè aksyon yo nan non itilizatè sa a."), - "-" : MessageLookupByLibrary.simpleMessage("-"), - "A description is required." : MessageLookupByLibrary.simpleMessage("Yon deskripsyon obligatwa."), - "A network error occurred when adding this student. Check your connection and try again." : MessageLookupByLibrary.simpleMessage("Gen yon erè rezo ki fèt pandan w ap ajoute elèv la. Verifye koneksyon ou a epi eseye ankò."), - "A subject is required." : MessageLookupByLibrary.simpleMessage("Yon sijè obligatwa."), - "Act As User" : MessageLookupByLibrary.simpleMessage("Pase pou Itilizatè"), - "Add Student" : MessageLookupByLibrary.simpleMessage("Ajoute Elèv"), - "Add attachment" : MessageLookupByLibrary.simpleMessage("Ajoute atachman"), - "Add new student" : MessageLookupByLibrary.simpleMessage("Ajoute nouvo elèv"), - "Add student with…" : MessageLookupByLibrary.simpleMessage("Ajoute elèv ak..."), - "Alert Settings" : MessageLookupByLibrary.simpleMessage("Paramèt Alèt"), - "Alert me when…" : MessageLookupByLibrary.simpleMessage("Alète m lè..."), - "All Grading Periods" : MessageLookupByLibrary.simpleMessage("Tout Peryòd Klasman"), - "Already have an account? " : MessageLookupByLibrary.simpleMessage("Ou gen yon kont deja? "), - "An email address is required." : MessageLookupByLibrary.simpleMessage("Yon adrès imèl obligatwa."), - "An error occurred when trying to display this link" : MessageLookupByLibrary.simpleMessage("Gen yon erè ki fèt pandan w ap eseye afiche lyen sa a"), - "An error occurred while saving your selection. Please try again." : MessageLookupByLibrary.simpleMessage("Te gen yon erè ki fpet pandan anrejistreman seleksyone ou an, Tanpri eseye ankò."), - "An unexpected error occurred" : MessageLookupByLibrary.simpleMessage("Yon erè fèt sanzatann"), - "Android OS version" : MessageLookupByLibrary.simpleMessage("Vèsyon OS Android"), - "Appearance" : MessageLookupByLibrary.simpleMessage("Aparans"), - "Application version" : MessageLookupByLibrary.simpleMessage("Vèsyon aplikasyon"), - "Are you a student or teacher?" : MessageLookupByLibrary.simpleMessage("Ou se pwofesè oswa elèv?"), - "Are you sure you want to log out?" : MessageLookupByLibrary.simpleMessage("Ou kwè vrèman ou vle dekonekte?"), - "Are you sure you wish to close this page? Your unsent message will be lost." : MessageLookupByLibrary.simpleMessage("Ou kwè vrèman ou vle fèmen paj sa a? Mesaj ou genyen ki pa delivre yo ap elimine."), - "Assignment Details" : MessageLookupByLibrary.simpleMessage("Detay Sesyon"), - "Assignment grade above" : MessageLookupByLibrary.simpleMessage("Npot sesyon pi wo a"), - "Assignment grade below" : MessageLookupByLibrary.simpleMessage("Npot sesyon pi ba a"), - "Assignment missing" : MessageLookupByLibrary.simpleMessage("Sesyon ki manke"), - "Barney, Fuschia" : MessageLookupByLibrary.simpleMessage("Barney, Fuschia"), - "Calendars" : MessageLookupByLibrary.simpleMessage("Kalandriye"), - "Camera Permission" : MessageLookupByLibrary.simpleMessage("Pèmisyon Kamera"), - "Cancel" : MessageLookupByLibrary.simpleMessage("Anile"), - "Canvas Student" : MessageLookupByLibrary.simpleMessage("Canvas Student"), - "Canvas Teacher" : MessageLookupByLibrary.simpleMessage("Pwofesè Canvas"), - "Canvas on GitHub" : MessageLookupByLibrary.simpleMessage("Canvas sou GitHub"), - "Choose a course to message" : MessageLookupByLibrary.simpleMessage("Chwazi yon kou pou voye mesaj"), - "Choose from Gallery" : MessageLookupByLibrary.simpleMessage("Chwazi nan Galri"), - "Complete" : MessageLookupByLibrary.simpleMessage("Fini"), - "Contact Support" : MessageLookupByLibrary.simpleMessage("Kontakte Sipò"), - "Course Announcement" : MessageLookupByLibrary.simpleMessage("Anons Kou"), - "Course Announcements" : MessageLookupByLibrary.simpleMessage("Anons Kou"), - "Course grade above" : MessageLookupByLibrary.simpleMessage("Nòt kou pi wo a"), - "Course grade below" : MessageLookupByLibrary.simpleMessage("Nòt kou pi ba a"), - "Create Account" : MessageLookupByLibrary.simpleMessage("Kreye Kont"), - "Dark Mode" : MessageLookupByLibrary.simpleMessage("Mòd Fonse"), - "Date" : MessageLookupByLibrary.simpleMessage("Dat"), - "Delete" : MessageLookupByLibrary.simpleMessage("Efase"), - "Description" : MessageLookupByLibrary.simpleMessage("Deskripsyon"), - "Device" : MessageLookupByLibrary.simpleMessage("Aparèy"), - "Device model" : MessageLookupByLibrary.simpleMessage("Modèl aparèy"), - "Domain" : MessageLookupByLibrary.simpleMessage("Domèn"), - "Domain:" : MessageLookupByLibrary.simpleMessage("Domèn:"), - "Don\'t show again" : MessageLookupByLibrary.simpleMessage("Pa afiche ankò"), - "Done" : MessageLookupByLibrary.simpleMessage("Fini"), - "Download" : MessageLookupByLibrary.simpleMessage("Telechaje"), - "Due" : MessageLookupByLibrary.simpleMessage("Delè"), - "EXTREME CRITICAL EMERGENCY!!" : MessageLookupByLibrary.simpleMessage("IJANS KRITIK EKSTRÈM!!"), - "Electric, blue" : MessageLookupByLibrary.simpleMessage("Elektrik, ble"), - "Email Address" : MessageLookupByLibrary.simpleMessage("Adrès Imèl"), - "Email:" : MessageLookupByLibrary.simpleMessage("Imèl:"), - "Email…" : MessageLookupByLibrary.simpleMessage("Imèl..."), - "Enter the student pairing code provided to you. If the pairing code doesn\'t work, it may have expired" : MessageLookupByLibrary.simpleMessage("Antre kòd kouplaj yo ba ou pou elèv la. Si kòd kouplaj la pa fonksyone, li kapab ekspire"), - "Event" : MessageLookupByLibrary.simpleMessage("Aktivite"), - "Excused" : MessageLookupByLibrary.simpleMessage("Egzante"), - "Expired QR Code" : MessageLookupByLibrary.simpleMessage("Kòd QR ekspire"), - "Failed. Tap for options." : MessageLookupByLibrary.simpleMessage("Echwe. Tape pou opsyon."), - "Filter" : MessageLookupByLibrary.simpleMessage("Filtè"), - "Filter by" : MessageLookupByLibrary.simpleMessage("Klase pa"), - "Fire, Orange" : MessageLookupByLibrary.simpleMessage("Dife, Zoranj"), - "Front Page" : MessageLookupByLibrary.simpleMessage("Premye Paj"), - "Full Name" : MessageLookupByLibrary.simpleMessage("Non Konplè"), - "Full Name…" : MessageLookupByLibrary.simpleMessage("Non Konplè..."), - "Full error message" : MessageLookupByLibrary.simpleMessage("Erè mesaj konplè"), - "Go to today" : MessageLookupByLibrary.simpleMessage("Ale nan jodi a"), - "Grade" : MessageLookupByLibrary.simpleMessage("Klas"), - "Grade percentage" : MessageLookupByLibrary.simpleMessage("Pousantaj nòt"), - "Graded" : MessageLookupByLibrary.simpleMessage("Klase"), - "Grades" : MessageLookupByLibrary.simpleMessage("Nòt"), - "Help" : MessageLookupByLibrary.simpleMessage("Èd"), - "Hide Password" : MessageLookupByLibrary.simpleMessage("Kache Modpas"), - "High Contrast Mode" : MessageLookupByLibrary.simpleMessage("Mòd Kontras Elve"), - "How are we doing?" : MessageLookupByLibrary.simpleMessage("Kisa w ap fè la a?"), - "How is this affecting you?" : MessageLookupByLibrary.simpleMessage("Nan ki sans sa afekte w?"), - "I can\'t get things done until I hear back from you." : MessageLookupByLibrary.simpleMessage("Mwen paka fè bagay yo jiskaske mwen tounen tande w."), - "I don\'t have a Canvas account" : MessageLookupByLibrary.simpleMessage("Mwen pa gen yon kont Canvas"), - "I have a Canvas account" : MessageLookupByLibrary.simpleMessage("Mwen gen yon kont Canvas"), - "I need some help but it\'s not urgent." : MessageLookupByLibrary.simpleMessage("Mwen bezwen èd men se pa ijan."), - "I\'m having trouble logging in" : MessageLookupByLibrary.simpleMessage("Mwen gen difikilte pou konekte"), - "Idea for Canvas Parent App [Android]" : MessageLookupByLibrary.simpleMessage("Ide pou app Canvas Parent [Android]"), - "In order to provide you with a better experience, we have updated how reminders work. You can add new reminders by viewing an assignment or calendar event and tapping the switch under the \"Remind Me\" section.\n\nBe aware that any reminders created with older versions of this app will not be compatible with the new changes and you will need to create them again." : MessageLookupByLibrary.simpleMessage("Pou nouka ofri w pi bon eksperyans, nou aktyalize mòd fonksyonman rapèl yo. Ou ka ajoute nouvo rapèl, pou fè sa w ap afiche yon devwa oswa yon aktivite ki nan kalandriye a epi peze bouton ki nan seksyon \"Raple m\" nan.\n\nSonje tout rapèl ki kreye ak ansyen vèsyon aplikasyon sa a pa p konpatib a nouvo chanjman yo, kidonk w ap gen pou kreye yo ankò."), - "Inbox" : MessageLookupByLibrary.simpleMessage("Bwat resepsyon"), - "Inbox Zero" : MessageLookupByLibrary.simpleMessage("Bwat Resepsyon Zewo"), - "Incomplete" : MessageLookupByLibrary.simpleMessage("Enkonplè"), - "Incorrect Domain" : MessageLookupByLibrary.simpleMessage("Domèn Enkòrèk"), - "Institution Announcement" : MessageLookupByLibrary.simpleMessage("Anons Enstitisyon"), - "Institution Announcements" : MessageLookupByLibrary.simpleMessage("Anons Enstitisyon"), - "Instructions" : MessageLookupByLibrary.simpleMessage("Enstriksyon"), - "Interactions on this page are limited by your institution." : MessageLookupByLibrary.simpleMessage("Enstitisyon ou an limite entèaksyon sou paj sa a."), - "Invalid QR Code" : MessageLookupByLibrary.simpleMessage("Kòd QR envalid"), - "It looks like a great day to rest, relax, and recharge." : MessageLookupByLibrary.simpleMessage("Sanble yon bon jou pou repoze w, amize w epi mete enèji.."), - "It looks like assignments haven\'t been created in this space yet." : MessageLookupByLibrary.simpleMessage("Ta sanble poko gen devwa ki kreye nan espas sa a."), - "Just a casual question, comment, idea, suggestion…" : MessageLookupByLibrary.simpleMessage("Sèlman yon kesyon, yon kòmantè, yon ide... enfòmèl"), - "Late" : MessageLookupByLibrary.simpleMessage("An reta"), - "Launch External Tool" : MessageLookupByLibrary.simpleMessage("Lanse Zouti Eksteryè"), - "Legal" : MessageLookupByLibrary.simpleMessage("Legal"), - "Light Mode" : MessageLookupByLibrary.simpleMessage("Mòd Klè"), - "Link Error" : MessageLookupByLibrary.simpleMessage("Lyen Erè"), - "Locale:" : MessageLookupByLibrary.simpleMessage("Lokal:"), - "Locate QR Code" : MessageLookupByLibrary.simpleMessage("Jwenn Kòd QR"), - "Location" : MessageLookupByLibrary.simpleMessage("Anplasman"), - "Locked" : MessageLookupByLibrary.simpleMessage("Bloke"), - "Log Out" : MessageLookupByLibrary.simpleMessage("Dekonekte"), - "Login flow: Canvas" : MessageLookupByLibrary.simpleMessage("Flux koneksyon: Canvas"), - "Login flow: Normal" : MessageLookupByLibrary.simpleMessage("Flux koneksyon: Nòmal"), - "Login flow: Site Admin" : MessageLookupByLibrary.simpleMessage("Flux koneksyon: Administratè Sit"), - "Login flow: Skip mobile verify" : MessageLookupByLibrary.simpleMessage("Flux koneksyon: Sote verifikasyon mobil"), - "Manage Students" : MessageLookupByLibrary.simpleMessage("Jere Elèv"), - "Message" : MessageLookupByLibrary.simpleMessage("Mesaj"), - "Message subject" : MessageLookupByLibrary.simpleMessage("Sijè mesaj"), - "Missing" : MessageLookupByLibrary.simpleMessage("Manke"), - "Must be below 100" : MessageLookupByLibrary.simpleMessage("Dwe enferyè a 100"), - "Network error" : MessageLookupByLibrary.simpleMessage("Erè Rezo"), - "Never" : MessageLookupByLibrary.simpleMessage("Jamè"), - "New message" : MessageLookupByLibrary.simpleMessage("Nouvo mesaj"), - "No" : MessageLookupByLibrary.simpleMessage("Non"), - "No Alerts" : MessageLookupByLibrary.simpleMessage("Pa gen Alèt"), - "No Assignments" : MessageLookupByLibrary.simpleMessage("Okenn Sesyon"), - "No Courses" : MessageLookupByLibrary.simpleMessage("Pa gen Kou"), - "No Due Date" : MessageLookupByLibrary.simpleMessage("San Delè"), - "No Events Today!" : MessageLookupByLibrary.simpleMessage("Pa gen Aktivite Jodi a!"), - "No Grade" : MessageLookupByLibrary.simpleMessage("Pa gen Klas"), - "No Location Specified" : MessageLookupByLibrary.simpleMessage("Okenn Anplasman Espesyal"), - "No Students" : MessageLookupByLibrary.simpleMessage("Pa gen Elèv"), - "No Subject" : MessageLookupByLibrary.simpleMessage("Pa gen Sijè"), - "No Summary" : MessageLookupByLibrary.simpleMessage("Okenn Rezime"), - "No description" : MessageLookupByLibrary.simpleMessage("Pa gen deskripsyon"), - "No recipients selected" : MessageLookupByLibrary.simpleMessage("Okenn destinatè seleksyone"), - "Not Graded" : MessageLookupByLibrary.simpleMessage("Pa Klase"), - "Not Submitted" : MessageLookupByLibrary.simpleMessage("Pa Soumèt"), - "Not a parent?" : MessageLookupByLibrary.simpleMessage("Ou pa yon paran?"), - "Notifications for reminders about assignments and calendar events" : MessageLookupByLibrary.simpleMessage("Notifikasyon pou rapèl osijè de devwa ak kalandriye aktivite yo"), - "OS Version" : MessageLookupByLibrary.simpleMessage("Vèsyon OS"), - "Observer" : MessageLookupByLibrary.simpleMessage("Obsèvatè"), - "One of our other apps might be a better fit. Tap one to visit the Play Store." : MessageLookupByLibrary.simpleMessage("Yonn nan lòt aplikasyon nou yo kapab pi bon. Tape sou li pou vizite Play Store la."), - "Open Canvas Student" : MessageLookupByLibrary.simpleMessage("Ouvri Canvas Student"), - "Open In Browser" : MessageLookupByLibrary.simpleMessage("Ouvri nan Navigatè"), - "Open with another app" : MessageLookupByLibrary.simpleMessage("Ouvri ak yon lòt app"), - "Pairing Code" : MessageLookupByLibrary.simpleMessage("Kòd Kouplaj"), - "Password" : MessageLookupByLibrary.simpleMessage("Modpas"), - "Password is required" : MessageLookupByLibrary.simpleMessage("Modpas obligatwa"), - "Password must contain at least 8 characters" : MessageLookupByLibrary.simpleMessage("Modpas la dwe genyen omwen 8 karaktè"), - "Password…" : MessageLookupByLibrary.simpleMessage("Modpas..."), - "Planner Note" : MessageLookupByLibrary.simpleMessage("Nòt Planifikatè"), - "Please enter a valid email address" : MessageLookupByLibrary.simpleMessage("Tanpri antre yon adrès imèl valid"), - "Please enter an email address" : MessageLookupByLibrary.simpleMessage("Tanpri ekri yon adrès imèl"), - "Please enter full name" : MessageLookupByLibrary.simpleMessage("Tanpri antre non konplè a"), - "Please scan a QR code generated by Canvas" : MessageLookupByLibrary.simpleMessage("Tanpri eskane yon kòd QR Canvas jenere"), - "Plum, Purple" : MessageLookupByLibrary.simpleMessage("Prin, vyolèt"), - "Preparing…" : MessageLookupByLibrary.simpleMessage("Preparasyon..."), - "Previous Logins" : MessageLookupByLibrary.simpleMessage("Ansyen Koneksyon"), - "Privacy Policy" : MessageLookupByLibrary.simpleMessage("Politik Konfidansyalite"), - "Privacy Policy Link" : MessageLookupByLibrary.simpleMessage("Lyen Politik Konfidansyalite"), - "Privacy policy, terms of use, open source" : MessageLookupByLibrary.simpleMessage("Politik konfidansyalite, kondisyon itilizasyon, open source"), - "QR Code" : MessageLookupByLibrary.simpleMessage("Kòd QR"), - "QR scanning requires camera access" : MessageLookupByLibrary.simpleMessage("Eske kòd QR la mande pou l gen aksè a kamera a"), - "Raspberry, Red" : MessageLookupByLibrary.simpleMessage("Franbwaz, Wouj"), - "Recipients" : MessageLookupByLibrary.simpleMessage("Destinatè"), - "Refresh" : MessageLookupByLibrary.simpleMessage("Aktyalize"), - "Remind Me" : MessageLookupByLibrary.simpleMessage("Raple m"), - "Reminders" : MessageLookupByLibrary.simpleMessage("Rapèl"), - "Reminders have changed!" : MessageLookupByLibrary.simpleMessage("Rapèl la chanje!"), - "Reply" : MessageLookupByLibrary.simpleMessage("Reponn"), - "Reply All" : MessageLookupByLibrary.simpleMessage("Reponn Tout"), - "Report A Problem" : MessageLookupByLibrary.simpleMessage("Rapòte yon Pwoblèm"), - "Request Login Help" : MessageLookupByLibrary.simpleMessage("Mande Èd pou Koneksyon"), - "Request Login Help Button" : MessageLookupByLibrary.simpleMessage("Bouton pou Mande Èd pou Koneksyon"), - "Restart app" : MessageLookupByLibrary.simpleMessage("Reinisyalize app"), - "Retry" : MessageLookupByLibrary.simpleMessage("Re eseye"), - "Return to Login" : MessageLookupByLibrary.simpleMessage("Retounen nan Koneksyon"), - "STUDENT" : MessageLookupByLibrary.simpleMessage("ELÈV"), - "Screenshot showing location of QR code generation in browser" : MessageLookupByLibrary.simpleMessage("Kapti ekran ki montre anplasman jenerasyon kòd QR nan navigatè"), - "Screenshot showing location of pairing QR code generation in the Canvas Student app" : MessageLookupByLibrary.simpleMessage("Kapti ekran ki montre anplasman jenerasyon kòd kouplaj QR la nan aplikasyon Canvas Student lan."), - "Select" : MessageLookupByLibrary.simpleMessage("Seleksyone"), - "Select Student Color" : MessageLookupByLibrary.simpleMessage("Seleksyone Koulè Elèv"), - "Select recipients" : MessageLookupByLibrary.simpleMessage("Seleksyone destinatè"), - "Send Feedback" : MessageLookupByLibrary.simpleMessage("Voye Kòmantè"), - "Send a message about this assignment" : MessageLookupByLibrary.simpleMessage("Voye yon mesaj osijè de devwa sa a"), - "Send a message about this course" : MessageLookupByLibrary.simpleMessage("Voye yon mesaj osijè e kou sa a"), - "Send message" : MessageLookupByLibrary.simpleMessage("Voye mesaj"), - "Set a date and time to be notified of this event." : MessageLookupByLibrary.simpleMessage("Antre yon dat ak yon lè pou yo raple w aktivite sa a."), - "Set a date and time to be notified of this specific assignment." : MessageLookupByLibrary.simpleMessage("Antre yon dat ak yon lè pou yo raple w devwa espesyal sa a."), - "Settings" : MessageLookupByLibrary.simpleMessage("Paramèt"), - "Shamrock, Green" : MessageLookupByLibrary.simpleMessage("Trèf, Vèt"), - "Share Your Love for the App" : MessageLookupByLibrary.simpleMessage("Pataje lanmou ou genyen pou App la"), - "Show Password" : MessageLookupByLibrary.simpleMessage("Afiche Modpas"), - "Sign In" : MessageLookupByLibrary.simpleMessage("Konekte"), - "Something went wrong trying to create your account, please reach out to your school for assistance." : MessageLookupByLibrary.simpleMessage("Gen yon bagay ki pase mal pandan w ap eseye kreye kont ou a, tanpri kontakte lekòl ou a pou yo ka ede w."), - "Something\'s broken but I can work around it to get what I need done." : MessageLookupByLibrary.simpleMessage("Gen yon entèripsyon men mwen ka kontounen li pou mwen jwenn sa mwen bezwen an."), - "Stop Acting as User" : MessageLookupByLibrary.simpleMessage("Sispann Pase pou Itilizatè"), - "Student" : MessageLookupByLibrary.simpleMessage("Elèv"), - "Student Pairing" : MessageLookupByLibrary.simpleMessage("Kouplaj Elèv"), - "Students can create a QR code using the Canvas Student app on their mobile device" : MessageLookupByLibrary.simpleMessage("Elèv yo kapab kreye yon kòd QR, pou fè sa y ap itilize aplikasyon Canvas Student lan sou pòtab yo."), - "Students can obtain a pairing code through the Canvas website" : MessageLookupByLibrary.simpleMessage("Elèv yo ka jwenn yon kòd kouplaj sou sit entènèt Canvas la"), - "Subject" : MessageLookupByLibrary.simpleMessage("Sijè"), - "Submitted" : MessageLookupByLibrary.simpleMessage("Soumèt"), - "Successfully submitted!" : MessageLookupByLibrary.simpleMessage("Ale avèk siksè!"), - "Summary" : MessageLookupByLibrary.simpleMessage("Rezime"), - "Switch Users" : MessageLookupByLibrary.simpleMessage("Chanje Itilizatè"), - "Syllabus" : MessageLookupByLibrary.simpleMessage("Pwogram"), - "TA" : MessageLookupByLibrary.simpleMessage("TA"), - "TEACHER" : MessageLookupByLibrary.simpleMessage("PWOFESÈ"), - "Tap to favorite the courses you want to see on the Calendar. Select up to 10." : MessageLookupByLibrary.simpleMessage("Tape pou pou ajoute kou ou vle wè nan Kalandriye yo nan favori. Seleksyone jiska 10."), - "Tap to pair with a new student" : MessageLookupByLibrary.simpleMessage("Tape pou kapab asosye ak yon nouvo elèv"), - "Tap to select this student" : MessageLookupByLibrary.simpleMessage("Tape pou ka seleksyone elèv sa a"), - "Tap to show student selector" : MessageLookupByLibrary.simpleMessage("Tape pou afiche seleksyonè elèv"), - "Teacher" : MessageLookupByLibrary.simpleMessage("Pwofesè"), - "Tell us about your favorite parts of the app" : MessageLookupByLibrary.simpleMessage("Di nou kisa w pi renmen nan app la"), - "Terms of Service" : MessageLookupByLibrary.simpleMessage("Kondisyon Itilizasyon"), - "Terms of Service Link" : MessageLookupByLibrary.simpleMessage("Lyen Kondisyon Itilizasyon"), - "Terms of Use" : MessageLookupByLibrary.simpleMessage("Kondisyon Itilizasyon"), - "The QR code you scanned may have expired. Refresh the code on the student\'s device and try again." : MessageLookupByLibrary.simpleMessage("Ta sanble kòd QR ou eskane a ekspire. Aktyalize kòd QR sou telefòn elèv la epi eseye ankò."), - "The following information will help us better understand your idea:" : MessageLookupByLibrary.simpleMessage("Enfòmasyon annapre yo ap ede nou konprann ide ou a pi byen:"), - "The server you entered is not authorized for this app." : MessageLookupByLibrary.simpleMessage("Sèvè w antre a pa otorize pou app sa a."), - "The student you are trying to add belongs to a different school. Log in or create an account with that school to scan this code." : MessageLookupByLibrary.simpleMessage("Elèv w ap eseye ajoute a nan yon lòt lekòl. Konekte oswa kreye yon kont nan lekòl sa a pou w kapab eskane kòd sa a."), - "The user agent for this app is not authorized." : MessageLookupByLibrary.simpleMessage("Ajan itilizatè app sa a pa otorize."), - "Theme" : MessageLookupByLibrary.simpleMessage("Tèm"), - "There are no installed applications that can open this file" : MessageLookupByLibrary.simpleMessage("Pa gen aplikasyon nan sa ki enstale yo ki kapab ouvri fichye sa a"), - "There is no page information available." : MessageLookupByLibrary.simpleMessage("Pa gen oken enfòmasyon paj disponib."), - "There was a problem loading the Terms of Use" : MessageLookupByLibrary.simpleMessage("Te gen yon pwoblèm nan chajman Kondisyon Itilizasyon yo"), - "There was a problem removing this student from your account. Please check your connection and try again." : MessageLookupByLibrary.simpleMessage("TE gen yon pwoblèm pou retire elèv sa a sou kont ou. Tanpri verifye koneksyon ou a epi eseye ankò."), - "There was an error loading recipients for this course" : MessageLookupByLibrary.simpleMessage("Te gen yon erè nan chajman destinatè pou kou sa a"), - "There was an error loading the summary details for this course." : MessageLookupByLibrary.simpleMessage("Te gen yon erè nan chajman rezime detay kou sa a."), - "There was an error loading this announcement" : MessageLookupByLibrary.simpleMessage("Te gen yon erè nan chajman anons sa a"), - "There was an error loading this conversation" : MessageLookupByLibrary.simpleMessage("Te gen yon erè nan chajman konvèsasyon sa a"), - "There was an error loading this file" : MessageLookupByLibrary.simpleMessage("Te gen yon erè nan chajman fichye sa a"), - "There was an error loading your inbox messages." : MessageLookupByLibrary.simpleMessage("Te gen yo erè pandan chajman mesaj ki nan bwat resepsyon w yo."), - "There was an error loading your student\'s alerts." : MessageLookupByLibrary.simpleMessage("Te gen yon erè nan chajman alèt elèv ou a."), - "There was an error loading your student\'s calendar" : MessageLookupByLibrary.simpleMessage("Te gen yon erè nan chajman kalandriye elèv ou a"), - "There was an error loading your students." : MessageLookupByLibrary.simpleMessage("Te gen yon erè nan chajman elèv ou yo."), - "There was an error loading your student’s courses." : MessageLookupByLibrary.simpleMessage("Te gen yon erè nan chajman kou elèv ou a"), - "There was an error logging in. Please generate another QR Code and try again." : MessageLookupByLibrary.simpleMessage("Te gen yon erè pandan koneksyon an. Tanpri jenere yon lòt Kòd QR epi eseye ankò."), - "There was an error trying to act as this user. Please check the Domain and User ID and try again." : MessageLookupByLibrary.simpleMessage("Te gen yon erè pandan w ap eseye pase pou itilizatè sa a. Tanpri verifye Domèn nan ak ID Itilizatè a epi eseye ankò."), - "There’s nothing to be notified of yet." : MessageLookupByLibrary.simpleMessage("Poko gen anyen ki merite pou yo avèti w."), - "This app is not authorized for use." : MessageLookupByLibrary.simpleMessage("Pa gen otorizasyon pou itilize app sa a."), - "This course does not have any assignments or calendar events yet." : MessageLookupByLibrary.simpleMessage("Kou sa a poko gen devwa oswa kalandriye aktivite."), - "This file is unsupported and can’t be viewed through the app" : MessageLookupByLibrary.simpleMessage("Nou pa pran fichye sa a an chaj e li pa kapab afiche nan app la"), - "This will unpair and remove all enrollments for this student from your account." : MessageLookupByLibrary.simpleMessage("Aksyon sa a ap dekonekte epi elimine tout enskripsyon elèv sa a te fè sou kont ou."), - "Total Grade" : MessageLookupByLibrary.simpleMessage("Klas Total"), - "Uh oh!" : MessageLookupByLibrary.simpleMessage("Uh oh!"), - "Unable to fetch courses. Please check your connection and try again." : MessageLookupByLibrary.simpleMessage("Enposib pou ale chèche kou. Tanpri verifye koneksyon ou a epi eseye ankò."), - "Unable to load this image" : MessageLookupByLibrary.simpleMessage("Enposib pou chaje imaj sa a"), - "Unable to play this media file" : MessageLookupByLibrary.simpleMessage("Enposib pou jwe fichye miltimedya sa a"), - "Unable to send message. Check your connection and try again." : MessageLookupByLibrary.simpleMessage("Enposib pou voye mesaj. Verifye koneksyon ou a epi eseye ankò."), - "Under Construction" : MessageLookupByLibrary.simpleMessage("An Konstriksyon"), - "Unknown User" : MessageLookupByLibrary.simpleMessage("Itilizatè Enkoni"), - "Unsaved changes" : MessageLookupByLibrary.simpleMessage("Chanjman ki pa anrejistre"), - "Unsupported File" : MessageLookupByLibrary.simpleMessage("Fichye pa pran an chaj"), - "Upload File" : MessageLookupByLibrary.simpleMessage("Transfere Fichye"), - "Use Camera" : MessageLookupByLibrary.simpleMessage("Itilize Kamera"), - "Use Dark Theme in Web Content" : MessageLookupByLibrary.simpleMessage("Itilize Motif Fonse nan Kontni Web"), - "User ID" : MessageLookupByLibrary.simpleMessage("ID Itilizatè"), - "User ID:" : MessageLookupByLibrary.simpleMessage("Non Itilizatè:"), - "Version Number" : MessageLookupByLibrary.simpleMessage("Nimewo Vèsyon"), - "View Description" : MessageLookupByLibrary.simpleMessage("Afiche Deskripsyon"), - "View error details" : MessageLookupByLibrary.simpleMessage("Afiche detay erè"), - "View the Privacy Policy" : MessageLookupByLibrary.simpleMessage("Afiche Politik Konfidansyalite a"), - "We are currently building this feature for your viewing pleasure." : MessageLookupByLibrary.simpleMessage("Pou kounye a n ap devlope fonksyon sa a pou nou ka fè w plezi."), - "We are unable to display this link, it may belong to an institution you currently aren\'t logged in to." : MessageLookupByLibrary.simpleMessage("Nou pa kapab afiche lyen sa a, petèt ke li se pou yon enstitisyon ke ou pa konekte sou li nan moman an."), - "We couldn\'t find any students associated with this account" : MessageLookupByLibrary.simpleMessage("Nou paka jwenn okenn elèv ki asosye a kont sa a"), - "We were unable to verify the server for use with this app." : MessageLookupByLibrary.simpleMessage("Nou pa kapab verifye sèvè a pou li ka itilize ak app sa a."), - "We’re not sure what happened, but it wasn’t good. Contact us if this keeps happening." : MessageLookupByLibrary.simpleMessage("Nou pa twò konnen kisa k pase a, men li pa enteresan. Pran kontak ak nou si sa repwodui."), - "What can we do better?" : MessageLookupByLibrary.simpleMessage("Kisa nou ka amelyore?"), - "Yes" : MessageLookupByLibrary.simpleMessage("Wi"), - "You are not observing any students." : MessageLookupByLibrary.simpleMessage("Ou pa p obsève okenn elèv."), - "You may only choose 10 calendars to display" : MessageLookupByLibrary.simpleMessage("Ou ka chwazi sèlman 10 kalandriye pou afiche"), - "You must enter a user id" : MessageLookupByLibrary.simpleMessage("Ou dwe antre yon ID itilizatè"), - "You must enter a valid domain" : MessageLookupByLibrary.simpleMessage("Ou dwe antre yon domèn valid"), - "You must select at least one calendar to display" : MessageLookupByLibrary.simpleMessage("Ou dwe seleksyone omwen yon kalandriye pou afiche"), - "You will be notified about this assignment on…" : MessageLookupByLibrary.simpleMessage("Y ap raple w devwa sa a le..."), - "You will be notified about this event on…" : MessageLookupByLibrary.simpleMessage("Y ap raple w de aktivite sa a le..."), - "You\'ll find the QR code on the web in your account profile. Click \'QR for Mobile Login\' in the list." : MessageLookupByLibrary.simpleMessage("W ap jwenn kòd QR la sou entènèt nan pwofil ou. Klike sou \'QR pou Koneksyon Mobil\' nan lis la."), - "You\'ll need to open your student\'s Canvas Student app to continue. Go into Main Menu > Settings > Pair with Observer and scan the QR code you see there." : MessageLookupByLibrary.simpleMessage("Ou dwe ouvri aplikasyon Canvas Student lan elèv ou a pou w ka kontinye. Ale nan Meni Prensipal > Paramèt > Asosye ak Obsèvatè a epi eskane kòd QR ou wè a."), - "Your code is incorrect or expired." : MessageLookupByLibrary.simpleMessage("Kòd ou a enkòrèk oswa li ekspire."), - "Your student’s courses might not be published yet." : MessageLookupByLibrary.simpleMessage("Kou elèv ou a ta dwe gentan pibliye."), - "You’re all caught up!" : MessageLookupByLibrary.simpleMessage("Yo pran w!"), - "actingAsUser" : m0, - "alertsLabel" : MessageLookupByLibrary.simpleMessage("Alèt"), - "appVersion" : m1, - "assignmentGradeAboveThreshold" : m2, - "assignmentGradeBelowThreshold" : m3, - "assignmentLockedModule" : m4, - "assignmentSubjectMessage" : m5, - "assignmentTotalPoints" : m6, - "assignmentTotalPointsAccessible" : m7, - "authorToNOthers" : m8, - "authorToRecipient" : m9, - "authorToRecipientAndNOthers" : m10, - "badgeNumberPlus" : m11, - "calendarLabel" : MessageLookupByLibrary.simpleMessage("Kalandriye"), - "canvasGuides" : MessageLookupByLibrary.simpleMessage("Gid Canvas"), - "canvasLogoLabel" : MessageLookupByLibrary.simpleMessage("Logo Canvas"), - "canvasSupport" : MessageLookupByLibrary.simpleMessage("Sipò Canvas"), - "changeStudentColorLabel" : m12, - "collapse" : MessageLookupByLibrary.simpleMessage("ratresi"), - "collapsed" : MessageLookupByLibrary.simpleMessage("retresi"), - "contentDescriptionScoreOutOfPointsPossible" : m13, - "courseForWhom" : m14, - "courseGradeAboveThreshold" : m15, - "courseGradeBelowThreshold" : m16, - "coursesLabel" : MessageLookupByLibrary.simpleMessage("Kou"), - "dateAtTime" : m17, - "dismissAlertLabel" : m18, - "domainSearchHelpBody" : m19, - "domainSearchHelpLabel" : MessageLookupByLibrary.simpleMessage("Kijan mwen kapab jwenn lekòl oswa distri mwen an?"), - "domainSearchInputHint" : MessageLookupByLibrary.simpleMessage("Antre non lekòl la oswa distri a..."), - "dueDateAtTime" : m20, - "endMasqueradeLogoutMessage" : m21, - "endMasqueradeMessage" : m22, - "eventSubjectMessage" : m23, - "eventTime" : m24, - "expand" : MessageLookupByLibrary.simpleMessage("elaji"), - "expanded" : MessageLookupByLibrary.simpleMessage("elaji"), - "finalGrade" : m25, - "findSchool" : MessageLookupByLibrary.simpleMessage("Jwenn Lekòl"), - "frontPageSubjectMessage" : m26, - "gradeFormatScoreOutOfPointsPossible" : m27, - "gradesSubjectMessage" : m28, - "latePenalty" : m29, - "me" : MessageLookupByLibrary.simpleMessage("mwen menm"), - "messageLinkPostscript" : m30, - "minus" : MessageLookupByLibrary.simpleMessage("mwens"), - "mustBeAboveN" : m31, - "mustBeBelowN" : m32, - "next" : MessageLookupByLibrary.simpleMessage("Pwochen"), - "nextMonth" : m33, - "nextWeek" : m34, - "noDomainResults" : m35, - "ok" : MessageLookupByLibrary.simpleMessage("DAKO"), - "outOfPoints" : m36, - "plusRecipientCount" : m37, - "pointsPossible" : m38, - "previousMonth" : m39, - "previousWeek" : m40, - "qrCreateAccountTos" : m41, - "ratingDialogEmailSubject" : m42, - "selectedMonthLabel" : m43, - "send" : MessageLookupByLibrary.simpleMessage("voye"), - "starRating" : m44, - "submissionStatusSuccessSubtitle" : m45, - "syllabusSubjectMessage" : m46, - "unread" : MessageLookupByLibrary.simpleMessage("poko li"), - "unreadCount" : m47 - }; -} diff --git a/apps/flutter_parent/lib/l10n/generated/messages_is.dart b/apps/flutter_parent/lib/l10n/generated/messages_is.dart deleted file mode 100644 index e2dec65ff5..0000000000 --- a/apps/flutter_parent/lib/l10n/generated/messages_is.dart +++ /dev/null @@ -1,473 +0,0 @@ -// DO NOT EDIT. This is code generated via package:intl/generate_localized.dart -// This is a library that provides messages for a is locale. All the -// messages from the main program should be duplicated here with the same -// function name. - -// Ignore issues from commonly used lints in this file. -// ignore_for_file:unnecessary_brace_in_string_interps, unnecessary_new -// ignore_for_file:prefer_single_quotes,comment_references, directives_ordering -// ignore_for_file:annotate_overrides,prefer_generic_function_type_aliases -// ignore_for_file:unused_import, file_names - -import 'package:intl/intl.dart'; -import 'package:intl/message_lookup_by_library.dart'; - -final messages = new MessageLookup(); - -typedef String MessageIfAbsent(String messageStr, List args); - -class MessageLookup extends MessageLookupByLibrary { - String get localeName => 'is'; - - static m0(userName) => "Þú virkar sem ${userName}"; - - static m1(version) => "útg. ${version}"; - - static m2(threshold) => "Verkefnaeinkunn fyrir ofan ${threshold}"; - - static m3(threshold) => "Verkefnaeinkunn fyrir neðan ${threshold}"; - - static m4(moduleName) => "Verkefninu er læst af einingu \"${moduleName}\"."; - - static m5(studentName, assignmentName) => "Varðandi: ${studentName}, Verkefni - ${assignmentName}"; - - static m6(points) => "${points} punktar"; - - static m7(points) => "${points} punktar"; - - static m8(authorName, howMany) => "${Intl.plural(howMany, one: '${authorName} til 1 annars', other: '${authorName} til ${howMany} annarra')}"; - - static m9(authorName, recipientName) => "${authorName} til ${recipientName}"; - - static m10(authorName, recipientName, howMany) => "${Intl.plural(howMany, one: '${authorName} til ${recipientName} og 1 annars', other: '${authorName} til ${recipientName} og ${howMany} annarra')}"; - - static m11(count) => "${count}+"; - - static m12(studentName) => "Breyta lit fyrir ${studentName}"; - - static m13(score, pointsPossible) => "${score} af ${pointsPossible} stigum"; - - static m14(studentShortName) => "fyrir ${studentShortName}"; - - static m15(threshold) => "Námskeiðseinkunn fyrir ofan ${threshold}"; - - static m16(threshold) => "Námskeiðseinkunn fyrir neðan ${threshold}"; - - static m17(date, time) => "${date} klukkan ${time}"; - - static m18(alertTitle) => "Hafna ${alertTitle}"; - - static m19(canvasGuides, canvasSupport) => "Prufaðu að leita að nafni skólans eða umdæmisins sem þú reyndir að opna, eins og „Smith Private School“ eða „Smith County Schools.“ Þú getur einnig sett inn Canvas-lén beint, eins og “smith.instructure.com.”\n\nFyrir frekari upplýsingar um hvernig þú finnur Canvas reikning stofnunar þinnar, geturðu farið á ${canvasGuides}, haft samband við ${canvasSupport}, eða hafðu samband við skólann þinn til að fá aðstoð."; - - static m20(date, time) => "Skiladagur ${date} þann ${time}"; - - static m21(userName) => "Þú hættir að bregðast við sem ${userName} og verður skráð(ur) út."; - - static m22(userName) => "Þú hættir að bregðast við sem ${userName} og ferð aftur í upprunalegan reikning þinn."; - - static m23(studentName, eventTitle) => "Varðandi: ${studentName}, Viðburður - ${eventTitle}"; - - static m24(startAt, endAt) => "${startAt} - ${endAt}"; - - static m25(grade) => "Lokaeinkunn: ${grade}"; - - static m26(studentName) => "Varðandi: ${studentName}, Forsíða"; - - static m27(score, pointsPossible) => "${score} / ${pointsPossible}"; - - static m28(studentName) => "Varðandi: ${studentName}, Einkunnir"; - - static m29(pointsLost) => "Viðurlög vegna of seinna skila (-${pointsLost})"; - - static m30(studentName, linkUrl) => "Varðandi: ${studentName}, ${linkUrl}"; - - static m31(percentage) => "Verður að vera yfir ${percentage}"; - - static m32(percentage) => "Verður að vera undir ${percentage}"; - - static m33(month) => "Næsti mánuður: ${month}"; - - static m34(date) => "Næsta vika hefst ${date}"; - - static m35(query) => "Ekki tókst að finna skóla sem pössuðu við \"${query}\""; - - static m36(points, howMany) => "${Intl.plural(howMany, one: 'Af 1 stigi', other: 'Af ${points} stigum')}"; - - static m37(count) => "+${count}"; - - static m38(points) => "${points} punktar mögulegir"; - - static m39(month) => "Fyrri mánuður: ${month}"; - - static m40(date) => "Fyrri vika hefst ${date}"; - - static m41(termsOfService, privacyPolicy) => "Með því að pikka á „Búa til reikning“ samþykkir þú ${termsOfService} og staðfestir ${privacyPolicy}"; - - static m42(version) => "Uppástungur fyrir Android - Canvas Parent ${version}"; - - static m43(month) => "${month} mánuði"; - - static m44(position) => "${Intl.plural(position, one: '${position} stjarna', other: '${position} stjörnur')}"; - - static m45(date, time) => "Þetta verkefni var sent inn þann ${date} klukkan ${time} og bíður einkunnar"; - - static m46(studentName) => "Varðandi: ${studentName}, Kennsluáætlun"; - - static m47(count) => "${count} ólesið"; - - final messages = _notInlinedMessages(_notInlinedMessages); - static _notInlinedMessages(_) => { - "\"Act as\" is essentially logging in as this user without a password. You will be able to take any action as if you were this user, and from other users\' points of views, it will be as if this user performed them. However, audit logs record that you were the one who performed the actions on behalf of this user." : MessageLookupByLibrary.simpleMessage("\"Bregðast við sem\" er í raun og veru að skrá sig inn sem þessi notandi án lykilorðs. Þú munt getað gripið til allra aðgerða eins og að þú værir viðkomandi notandi, frá sjónarhóli annarra notenda, þá mun það vera eins og þessi notandi hafi framkvæmt viðkomandi aðgerðir. Samt sem áður sýna endurskoðaðar skrár að það varst þú sem framkvæmdir aðgerðirnar fyrir hönd þessa notanda."), - "-" : MessageLookupByLibrary.simpleMessage("-"), - "A description is required." : MessageLookupByLibrary.simpleMessage("Lýsingar er krafist."), - "A network error occurred when adding this student. Check your connection and try again." : MessageLookupByLibrary.simpleMessage("Netvilla kom upp þegar verið var að bæta þessum nemanda við. Athugaðu tengingu þína og reyndu aftur."), - "A subject is required." : MessageLookupByLibrary.simpleMessage("Efni er áskilið."), - "Act As User" : MessageLookupByLibrary.simpleMessage("Bregðast við sem notandi"), - "Add Student" : MessageLookupByLibrary.simpleMessage("Bæta við nemanda"), - "Add attachment" : MessageLookupByLibrary.simpleMessage("Bæta við viðhengi"), - "Add new student" : MessageLookupByLibrary.simpleMessage("Bæta við nýjum nemanda"), - "Add student with…" : MessageLookupByLibrary.simpleMessage("Bæta nemanda við…"), - "Alert Settings" : MessageLookupByLibrary.simpleMessage("Viðvörunarstillingar"), - "Alert me when…" : MessageLookupByLibrary.simpleMessage("Vara mig við þegar…"), - "All Grading Periods" : MessageLookupByLibrary.simpleMessage("Öll einkunnatímabil"), - "Already have an account? " : MessageLookupByLibrary.simpleMessage("Áttu nú þegar reikning? "), - "An email address is required." : MessageLookupByLibrary.simpleMessage("Netfang er áskilið."), - "An error occurred when trying to display this link" : MessageLookupByLibrary.simpleMessage("Villa kom upp við að sýna þennan tengil"), - "An error occurred while saving your selection. Please try again." : MessageLookupByLibrary.simpleMessage("Villa kom upp við að vista valið þitt. Vinsamlegast reyndu aftur."), - "An unexpected error occurred" : MessageLookupByLibrary.simpleMessage("Óvænt villa kom upp"), - "Android OS version" : MessageLookupByLibrary.simpleMessage("Útgáfa Android stýrikerfis"), - "Appearance" : MessageLookupByLibrary.simpleMessage("Útlit"), - "Application version" : MessageLookupByLibrary.simpleMessage("Útgáfa forrits"), - "Are you a student or teacher?" : MessageLookupByLibrary.simpleMessage("Ertu nemandi eða kennari?"), - "Are you sure you want to log out?" : MessageLookupByLibrary.simpleMessage("Viltu örugglega skrá þig út?"), - "Are you sure you wish to close this page? Your unsent message will be lost." : MessageLookupByLibrary.simpleMessage("Viltu örugglega loka þessari síðu? Ósend skilaboð tapast."), - "Assignment Details" : MessageLookupByLibrary.simpleMessage("Upplýsingar um verkefni"), - "Assignment grade above" : MessageLookupByLibrary.simpleMessage("Verkefnaeinkunn fyrir ofan"), - "Assignment grade below" : MessageLookupByLibrary.simpleMessage("Verkefnaeinkunn fyrir neðan"), - "Assignment missing" : MessageLookupByLibrary.simpleMessage("Verkefni vantar"), - "Barney, Fuschia" : MessageLookupByLibrary.simpleMessage("Barney, purpuralitur"), - "Calendars" : MessageLookupByLibrary.simpleMessage("Dagatöl"), - "Camera Permission" : MessageLookupByLibrary.simpleMessage("Heimild fyrir myndavél"), - "Cancel" : MessageLookupByLibrary.simpleMessage("Hætta við"), - "Canvas Student" : MessageLookupByLibrary.simpleMessage("Canvas nemandi"), - "Canvas Teacher" : MessageLookupByLibrary.simpleMessage("Canvas kennari"), - "Canvas on GitHub" : MessageLookupByLibrary.simpleMessage("Canvas á GitHub"), - "Choose a course to message" : MessageLookupByLibrary.simpleMessage("Veldu námskeið til að senda skilaboð til"), - "Choose from Gallery" : MessageLookupByLibrary.simpleMessage("Velja úr galleríi"), - "Complete" : MessageLookupByLibrary.simpleMessage("Lokið"), - "Contact Support" : MessageLookupByLibrary.simpleMessage("Hafa samband við aðstoð"), - "Course Announcement" : MessageLookupByLibrary.simpleMessage("Tilkynning námskeiðs"), - "Course Announcements" : MessageLookupByLibrary.simpleMessage("Tilkynningar námskeiðs"), - "Course grade above" : MessageLookupByLibrary.simpleMessage("Námskeiðseinkunn fyrir ofan"), - "Course grade below" : MessageLookupByLibrary.simpleMessage("Námskeiðseinkunn fyrir neðan"), - "Create Account" : MessageLookupByLibrary.simpleMessage("Stofna reikning"), - "Dark Mode" : MessageLookupByLibrary.simpleMessage("Dökk stilling"), - "Date" : MessageLookupByLibrary.simpleMessage("Dagsetning"), - "Delete" : MessageLookupByLibrary.simpleMessage("Eyða"), - "Description" : MessageLookupByLibrary.simpleMessage("Lýsing"), - "Device" : MessageLookupByLibrary.simpleMessage("Tæki"), - "Device model" : MessageLookupByLibrary.simpleMessage("Gerð tækis"), - "Domain" : MessageLookupByLibrary.simpleMessage("Lén"), - "Domain:" : MessageLookupByLibrary.simpleMessage("Lén:"), - "Don\'t show again" : MessageLookupByLibrary.simpleMessage("Ekki sýna aftur"), - "Done" : MessageLookupByLibrary.simpleMessage("Lokið"), - "Download" : MessageLookupByLibrary.simpleMessage("Hlaða niður"), - "Due" : MessageLookupByLibrary.simpleMessage("Skilafrestur"), - "EXTREME CRITICAL EMERGENCY!!" : MessageLookupByLibrary.simpleMessage("GÍFURLEGT NEYÐARÁSTAND!!"), - "Electric, blue" : MessageLookupByLibrary.simpleMessage("Rafmagn, blár"), - "Email Address" : MessageLookupByLibrary.simpleMessage("Netfang"), - "Email:" : MessageLookupByLibrary.simpleMessage("Netfang:"), - "Email…" : MessageLookupByLibrary.simpleMessage("Netfang..."), - "Enter the student pairing code provided to you. If the pairing code doesn\'t work, it may have expired" : MessageLookupByLibrary.simpleMessage("Settu inn pörunarkóða nemanda sem þú fékkst. Ef pörunarkóðinn virkar ekki gæti hann verið útrunninn"), - "Event" : MessageLookupByLibrary.simpleMessage("Viðburður"), - "Excused" : MessageLookupByLibrary.simpleMessage("Undanþegið"), - "Expired QR Code" : MessageLookupByLibrary.simpleMessage("Útrunninn QR-kóði"), - "Failed. Tap for options." : MessageLookupByLibrary.simpleMessage("Tókst ekki. Smelltu fyrir valkosti."), - "Filter" : MessageLookupByLibrary.simpleMessage("Sía"), - "Filter by" : MessageLookupByLibrary.simpleMessage("Sía eftir"), - "Fire, Orange" : MessageLookupByLibrary.simpleMessage("Eldur, appelsínugulur"), - "Front Page" : MessageLookupByLibrary.simpleMessage("Forsíða"), - "Full Name" : MessageLookupByLibrary.simpleMessage("Fullt nafn"), - "Full Name…" : MessageLookupByLibrary.simpleMessage("Fullt nafn..."), - "Full error message" : MessageLookupByLibrary.simpleMessage("Heildar villuskilaboð"), - "Go to today" : MessageLookupByLibrary.simpleMessage("Fara í daginn í dag"), - "Grade" : MessageLookupByLibrary.simpleMessage("Einkunn"), - "Grade percentage" : MessageLookupByLibrary.simpleMessage("Einkunnahlutfall"), - "Graded" : MessageLookupByLibrary.simpleMessage("Metið"), - "Grades" : MessageLookupByLibrary.simpleMessage("Einkunnir"), - "Help" : MessageLookupByLibrary.simpleMessage("Hjálp"), - "Hide Password" : MessageLookupByLibrary.simpleMessage("Fela lykilorð"), - "High Contrast Mode" : MessageLookupByLibrary.simpleMessage("Háskerpu stilling"), - "How are we doing?" : MessageLookupByLibrary.simpleMessage("Hvernig gengur okkur?"), - "How is this affecting you?" : MessageLookupByLibrary.simpleMessage("Hvaða áhrif hefur þetta á þig?"), - "I can\'t get things done until I hear back from you." : MessageLookupByLibrary.simpleMessage("Ég get ekkert gert fyrr en þú svarar mér."), - "I don\'t have a Canvas account" : MessageLookupByLibrary.simpleMessage("Ég er ekki með Canvas-reikning"), - "I have a Canvas account" : MessageLookupByLibrary.simpleMessage("Ég er með Canvas-reikning"), - "I need some help but it\'s not urgent." : MessageLookupByLibrary.simpleMessage("Ég þarf smá aðstoð en það liggur ekki á."), - "I\'m having trouble logging in" : MessageLookupByLibrary.simpleMessage("Ég á í vandræðum við að skrá mig inn"), - "Idea for Canvas Parent App [Android]" : MessageLookupByLibrary.simpleMessage("Hugmynd að Canvas foreldraappi [Android]"), - "In order to provide you with a better experience, we have updated how reminders work. You can add new reminders by viewing an assignment or calendar event and tapping the switch under the \"Remind Me\" section.\n\nBe aware that any reminders created with older versions of this app will not be compatible with the new changes and you will need to create them again." : MessageLookupByLibrary.simpleMessage("Til þess að veita þér betri upplifun höfum við breytt því hvernig áminningar virka. Þú getur bætt nýjum áminningum við með því að skoða verkefni eða dagatalsviðburð og smella á rofann undir \"minna mig á\" hlutanum.\n\nHafðu í huga að hverskonar áminning sem sem var stofnuð með gömlum útgáfum þessa forrits verða ekki samhæfðar við nýju breytingarnar og þú þarft að stofna þær aftur."), - "Inbox" : MessageLookupByLibrary.simpleMessage("Innhólf"), - "Inbox Zero" : MessageLookupByLibrary.simpleMessage("Innhólf Núll"), - "Incomplete" : MessageLookupByLibrary.simpleMessage("Ólokið"), - "Incorrect Domain" : MessageLookupByLibrary.simpleMessage("Rangt lén"), - "Institution Announcement" : MessageLookupByLibrary.simpleMessage("Stofnana tilkynning"), - "Institution Announcements" : MessageLookupByLibrary.simpleMessage("Stofnana tilkynningar"), - "Instructions" : MessageLookupByLibrary.simpleMessage("Fyrirmæli"), - "Interactions on this page are limited by your institution." : MessageLookupByLibrary.simpleMessage("Samskipti á þessari síðu eru takmörkuð af stofnun þinni."), - "Invalid QR Code" : MessageLookupByLibrary.simpleMessage("Ógildur QR-kóði"), - "It looks like a great day to rest, relax, and recharge." : MessageLookupByLibrary.simpleMessage("Þetta virðist vera góður dagur til að hvílast, slaka á og hlaða batteríin."), - "It looks like assignments haven\'t been created in this space yet." : MessageLookupByLibrary.simpleMessage("Það virðast ekki vera nein verkefni búin til í þessu rými enn."), - "Just a casual question, comment, idea, suggestion…" : MessageLookupByLibrary.simpleMessage("Bara almenn spurning, athugasemd, hugmynd, tillaga…"), - "Late" : MessageLookupByLibrary.simpleMessage("Seint"), - "Launch External Tool" : MessageLookupByLibrary.simpleMessage("Nota ytra verkfæri"), - "Legal" : MessageLookupByLibrary.simpleMessage("Lögfræði"), - "Light Mode" : MessageLookupByLibrary.simpleMessage("Ljós stilling"), - "Link Error" : MessageLookupByLibrary.simpleMessage("Tengils villa"), - "Locale:" : MessageLookupByLibrary.simpleMessage("Staður:"), - "Locate QR Code" : MessageLookupByLibrary.simpleMessage("Finna QR kóða"), - "Location" : MessageLookupByLibrary.simpleMessage("Staðsetning"), - "Locked" : MessageLookupByLibrary.simpleMessage("Læst"), - "Log Out" : MessageLookupByLibrary.simpleMessage("Útskráning"), - "Login flow: Canvas" : MessageLookupByLibrary.simpleMessage("Innskráningarflæði: Canvas"), - "Login flow: Normal" : MessageLookupByLibrary.simpleMessage("Innskráningarflæði: Venjulegt"), - "Login flow: Site Admin" : MessageLookupByLibrary.simpleMessage("Innskráningarflæði: Svæðisstjórnandi"), - "Login flow: Skip mobile verify" : MessageLookupByLibrary.simpleMessage("Innskráningarflæði: Sleppa sannreyningu farsíma"), - "Manage Students" : MessageLookupByLibrary.simpleMessage("Stjórna nemendum"), - "Message" : MessageLookupByLibrary.simpleMessage("Skilaboð"), - "Message subject" : MessageLookupByLibrary.simpleMessage("Efni skilaboða"), - "Missing" : MessageLookupByLibrary.simpleMessage("Vantar"), - "Must be below 100" : MessageLookupByLibrary.simpleMessage("Verður að vera undir 100"), - "Network error" : MessageLookupByLibrary.simpleMessage("Netkerfisvilla"), - "Never" : MessageLookupByLibrary.simpleMessage("Aldrei"), - "New message" : MessageLookupByLibrary.simpleMessage("Ný skilaboð"), - "No" : MessageLookupByLibrary.simpleMessage("Nei"), - "No Alerts" : MessageLookupByLibrary.simpleMessage("Engar viðvaranir"), - "No Assignments" : MessageLookupByLibrary.simpleMessage("Engin verkefni"), - "No Courses" : MessageLookupByLibrary.simpleMessage("Engin námskeið"), - "No Due Date" : MessageLookupByLibrary.simpleMessage("Enginn skiladagur"), - "No Events Today!" : MessageLookupByLibrary.simpleMessage("Engir viðburðir í dag!"), - "No Grade" : MessageLookupByLibrary.simpleMessage("Engin einkunn"), - "No Location Specified" : MessageLookupByLibrary.simpleMessage("Engin staðsetning tiltekin"), - "No Students" : MessageLookupByLibrary.simpleMessage("Engir nemendur"), - "No Subject" : MessageLookupByLibrary.simpleMessage("Ekkert efnisheiti"), - "No Summary" : MessageLookupByLibrary.simpleMessage("Engin samantekt"), - "No description" : MessageLookupByLibrary.simpleMessage("Engin lýsing"), - "No recipients selected" : MessageLookupByLibrary.simpleMessage("Engir móttakendur valdir"), - "Not Graded" : MessageLookupByLibrary.simpleMessage("Ekki metið"), - "Not Submitted" : MessageLookupByLibrary.simpleMessage("Ekki lagt fram"), - "Not a parent?" : MessageLookupByLibrary.simpleMessage("Ekki foreldri?"), - "Notifications for reminders about assignments and calendar events" : MessageLookupByLibrary.simpleMessage("Tilkynningar fyrir áminningar um verkefni og dagatalsviðburði"), - "OS Version" : MessageLookupByLibrary.simpleMessage("Útgáfa stýrikerfis"), - "Observer" : MessageLookupByLibrary.simpleMessage("Skoðandi"), - "One of our other apps might be a better fit. Tap one to visit the Play Store." : MessageLookupByLibrary.simpleMessage("Eitthvað að hinum öppunum okkar gæti hentað betur. Smelltu á eitt þeirra til að fara í Play Store."), - "Open Canvas Student" : MessageLookupByLibrary.simpleMessage("Opnaðu Canvas Student"), - "Open In Browser" : MessageLookupByLibrary.simpleMessage("Opna í vafra"), - "Open with another app" : MessageLookupByLibrary.simpleMessage("Opna með öðru appi"), - "Pairing Code" : MessageLookupByLibrary.simpleMessage("Pörunarkóði"), - "Password" : MessageLookupByLibrary.simpleMessage("Lykilorð"), - "Password is required" : MessageLookupByLibrary.simpleMessage("Lykilorðs er krafist"), - "Password must contain at least 8 characters" : MessageLookupByLibrary.simpleMessage("Lykilorðið þarf að hafa a.m.k. 8 stafi"), - "Password…" : MessageLookupByLibrary.simpleMessage("Lykilorð..."), - "Planner Note" : MessageLookupByLibrary.simpleMessage("Minnismiði skipuleggjara"), - "Please enter a valid email address" : MessageLookupByLibrary.simpleMessage("Settu inn gilt netfang"), - "Please enter an email address" : MessageLookupByLibrary.simpleMessage("Settu inn netfang"), - "Please enter full name" : MessageLookupByLibrary.simpleMessage("Settu inn fullt nafn"), - "Please scan a QR code generated by Canvas" : MessageLookupByLibrary.simpleMessage("Skannaðu QR kóða sem Canvas bjó til"), - "Plum, Purple" : MessageLookupByLibrary.simpleMessage("Plóma, fjólublár"), - "Preparing…" : MessageLookupByLibrary.simpleMessage("Undirbý…"), - "Previous Logins" : MessageLookupByLibrary.simpleMessage("Fyrri innskráningar"), - "Privacy Policy" : MessageLookupByLibrary.simpleMessage("Persónuverndarstefna"), - "Privacy Policy Link" : MessageLookupByLibrary.simpleMessage("Tengill á persónuverndarstefnu"), - "Privacy policy, terms of use, open source" : MessageLookupByLibrary.simpleMessage("Persónuverndarstefna, notkunarskilmálar, opinn hugbúnaður"), - "QR Code" : MessageLookupByLibrary.simpleMessage("QR kóði"), - "QR scanning requires camera access" : MessageLookupByLibrary.simpleMessage("Til að skanna QR-kóða þarf aðgang að myndavél"), - "Raspberry, Red" : MessageLookupByLibrary.simpleMessage("Hindber, rauður"), - "Recipients" : MessageLookupByLibrary.simpleMessage("Viðtakendur"), - "Refresh" : MessageLookupByLibrary.simpleMessage("Glæða"), - "Remind Me" : MessageLookupByLibrary.simpleMessage("Minntu mig á"), - "Reminders" : MessageLookupByLibrary.simpleMessage("Áminningar"), - "Reminders have changed!" : MessageLookupByLibrary.simpleMessage("Áminningar hafa breyst!"), - "Reply" : MessageLookupByLibrary.simpleMessage("Svara"), - "Reply All" : MessageLookupByLibrary.simpleMessage("Svara öllum"), - "Report A Problem" : MessageLookupByLibrary.simpleMessage("Tilkynna vandamál"), - "Request Login Help" : MessageLookupByLibrary.simpleMessage("Biðja um aðstoð við innskráningu"), - "Request Login Help Button" : MessageLookupByLibrary.simpleMessage("Biðja um aðstoð við innskráningu hnappur"), - "Restart app" : MessageLookupByLibrary.simpleMessage("Endurræstu forritið"), - "Retry" : MessageLookupByLibrary.simpleMessage("Reyna aftur"), - "Return to Login" : MessageLookupByLibrary.simpleMessage("Fara aftur í innskráningu"), - "STUDENT" : MessageLookupByLibrary.simpleMessage("NEMANDI"), - "Screenshot showing location of QR code generation in browser" : MessageLookupByLibrary.simpleMessage("Skjáskot sem sýnir hvar QR kóði er myndaður í vafra"), - "Screenshot showing location of pairing QR code generation in the Canvas Student app" : MessageLookupByLibrary.simpleMessage("Skjáskot sem sýnir hvar hægt er að framkalla pörunar QR-kóða í Canvas Student forritinu"), - "Select" : MessageLookupByLibrary.simpleMessage("Velja"), - "Select Student Color" : MessageLookupByLibrary.simpleMessage("Veldu lit nemanda"), - "Select recipients" : MessageLookupByLibrary.simpleMessage("Velja móttakendur"), - "Send Feedback" : MessageLookupByLibrary.simpleMessage("Senda endurgjöf"), - "Send a message about this assignment" : MessageLookupByLibrary.simpleMessage("Sendu skilaboð um þetta verkefni"), - "Send a message about this course" : MessageLookupByLibrary.simpleMessage("Sendu skilaboð um þetta námskeið"), - "Send message" : MessageLookupByLibrary.simpleMessage("Senda skilaboð"), - "Set a date and time to be notified of this event." : MessageLookupByLibrary.simpleMessage("Stilltu inn dagsetningu og tíma til að fá áminningu um þennan viðburð."), - "Set a date and time to be notified of this specific assignment." : MessageLookupByLibrary.simpleMessage("Stilltu inn dagsetningu og tíma til að fá áminningu um þetta tiltekna verkefni."), - "Settings" : MessageLookupByLibrary.simpleMessage("Stillingar"), - "Shamrock, Green" : MessageLookupByLibrary.simpleMessage("Músasmári, grænn"), - "Share Your Love for the App" : MessageLookupByLibrary.simpleMessage("Deildu ást þinni á appinu"), - "Show Password" : MessageLookupByLibrary.simpleMessage("Sýna lykilorð"), - "Sign In" : MessageLookupByLibrary.simpleMessage("Innskráning"), - "Something went wrong trying to create your account, please reach out to your school for assistance." : MessageLookupByLibrary.simpleMessage("Eitthvað fór úrskeiðis þegar verið var að búa til reikninginn þinn, hafðu samband við skólann þinn til að fá aðstoð."), - "Something\'s broken but I can work around it to get what I need done." : MessageLookupByLibrary.simpleMessage("Eitthvað er í ólagi en ég get samt unnið í kringum það til að ljúka því sem ég þarf að ljúka."), - "Stop Acting as User" : MessageLookupByLibrary.simpleMessage("Hætta að bregðast við sem notandi"), - "Student" : MessageLookupByLibrary.simpleMessage("Nemandi"), - "Student Pairing" : MessageLookupByLibrary.simpleMessage("Pörun nemenda"), - "Students can create a QR code using the Canvas Student app on their mobile device" : MessageLookupByLibrary.simpleMessage("Nemendur geta búið til QR-kóða með því að nota Canvas Student forritið á fartæki sínu"), - "Students can obtain a pairing code through the Canvas website" : MessageLookupByLibrary.simpleMessage("Nemendur geta fengið pörunarkóða í gegnum vefsíðu Canvas"), - "Subject" : MessageLookupByLibrary.simpleMessage("Efni"), - "Submitted" : MessageLookupByLibrary.simpleMessage("Skilað"), - "Successfully submitted!" : MessageLookupByLibrary.simpleMessage("Skil tókust!"), - "Summary" : MessageLookupByLibrary.simpleMessage("Samantekt"), - "Switch Users" : MessageLookupByLibrary.simpleMessage("Skipta um notendur"), - "Syllabus" : MessageLookupByLibrary.simpleMessage("Kennsluáætlun"), - "TA" : MessageLookupByLibrary.simpleMessage("Aðstoðarkennari"), - "TEACHER" : MessageLookupByLibrary.simpleMessage("KENNARI"), - "Tap to favorite the courses you want to see on the Calendar. Select up to 10." : MessageLookupByLibrary.simpleMessage("Smelltu til að setja námskeiðin sem þú vilt sjá á dagatalinu sem eftirlæti. Veldu allt að tíu."), - "Tap to pair with a new student" : MessageLookupByLibrary.simpleMessage("Smelltu til að para við nýjan nemanda"), - "Tap to select this student" : MessageLookupByLibrary.simpleMessage("Smelltu til að velja þennan nemanda"), - "Tap to show student selector" : MessageLookupByLibrary.simpleMessage("Smelltu til að sýna nemendaval"), - "Teacher" : MessageLookupByLibrary.simpleMessage("Kennari"), - "Tell us about your favorite parts of the app" : MessageLookupByLibrary.simpleMessage("Segðu okkur um uppáhalds hluta þína í appinu"), - "Terms of Service" : MessageLookupByLibrary.simpleMessage("Þjónustuskilmálar"), - "Terms of Service Link" : MessageLookupByLibrary.simpleMessage("Tengill á þjónustuskilmála"), - "Terms of Use" : MessageLookupByLibrary.simpleMessage("Notandaskilmálar"), - "The QR code you scanned may have expired. Refresh the code on the student\'s device and try again." : MessageLookupByLibrary.simpleMessage("QR-kóðinn sem þú skannaðir gæti verið útrunninn. Endurnýjaðu kóðann á tæki nemandans og reyndu aftur."), - "The following information will help us better understand your idea:" : MessageLookupByLibrary.simpleMessage("Eftirfarandi upplýsingar munu hjálpa okkur að skilja hugmynd þína betur:"), - "The server you entered is not authorized for this app." : MessageLookupByLibrary.simpleMessage("Miðillinn sem þú settir inn er ekki heimill fyrir þetta app."), - "The student you are trying to add belongs to a different school. Log in or create an account with that school to scan this code." : MessageLookupByLibrary.simpleMessage("Nemandinn sem þú ert að reyna að bæta við tilheyrir öðrum skóla. Skráðu þig inn eða búðu til reikning með þeim skóla til að skanna þennan kóða."), - "The user agent for this app is not authorized." : MessageLookupByLibrary.simpleMessage("Fulltrúi notanda fyrir þetta app er óheimill."), - "Theme" : MessageLookupByLibrary.simpleMessage("Þema"), - "There are no installed applications that can open this file" : MessageLookupByLibrary.simpleMessage("Það eru engin uppsett öpp sem geta opnað þessar skrár"), - "There is no page information available." : MessageLookupByLibrary.simpleMessage("Það eru engar síðuupplýsingar tiltækar."), - "There was a problem loading the Terms of Use" : MessageLookupByLibrary.simpleMessage("Villa kom upp við að sækja notkunarskilmála"), - "There was a problem removing this student from your account. Please check your connection and try again." : MessageLookupByLibrary.simpleMessage("Upp kom vandamál við að fjarlægja þennan nemanda af reikningnum þínum. Athugaðu tengingu þína og reyndu aftur."), - "There was an error loading recipients for this course" : MessageLookupByLibrary.simpleMessage("Villa varð við að sækja móttakendur fyrir þetta námskeið"), - "There was an error loading the summary details for this course." : MessageLookupByLibrary.simpleMessage("Villa varð við að sækja yfirlitsnámskeið fyrir þetta námskeið."), - "There was an error loading this announcement" : MessageLookupByLibrary.simpleMessage("Villa varð við að sækja þessa tilkynningu"), - "There was an error loading this conversation" : MessageLookupByLibrary.simpleMessage("Villa varð við að sækja þessar samræður"), - "There was an error loading this file" : MessageLookupByLibrary.simpleMessage("Villa varð við að sækja þessa skrá"), - "There was an error loading your inbox messages." : MessageLookupByLibrary.simpleMessage("Villa kom upp við að sækja skilaboðin þín."), - "There was an error loading your student\'s alerts." : MessageLookupByLibrary.simpleMessage("Villa kom upp við að sækja viðvaranir nemanda þíns."), - "There was an error loading your student\'s calendar" : MessageLookupByLibrary.simpleMessage("Villa kom upp við að sækja dagatal nemanda"), - "There was an error loading your students." : MessageLookupByLibrary.simpleMessage("Villa kom upp við að sækja nemendur þína."), - "There was an error loading your student’s courses." : MessageLookupByLibrary.simpleMessage("Villa kom upp við að sækja námskeið nemanda."), - "There was an error logging in. Please generate another QR Code and try again." : MessageLookupByLibrary.simpleMessage("Villa kom upp við innskráningu. Búðu til annan QR kóða og reyndu aftur."), - "There was an error trying to act as this user. Please check the Domain and User ID and try again." : MessageLookupByLibrary.simpleMessage("Villa kom upp við að bregðast við sem þessi notandi. Athugaðu lén og auðkenni notanda og reyndu aftur."), - "There’s nothing to be notified of yet." : MessageLookupByLibrary.simpleMessage("Það er ekkert tilkynningavert enn."), - "This app is not authorized for use." : MessageLookupByLibrary.simpleMessage("Þetta app er ekki heimilt til notkunar."), - "This course does not have any assignments or calendar events yet." : MessageLookupByLibrary.simpleMessage("Þetta námskeið er ekki með nein verkefni eða dagatalsviðburði enn."), - "This file is unsupported and can’t be viewed through the app" : MessageLookupByLibrary.simpleMessage("Þessi skrá er óstudd og er ekki hægt að skoða í þessu appi"), - "This will unpair and remove all enrollments for this student from your account." : MessageLookupByLibrary.simpleMessage("Þetta mun aftengja og fjarlægja allar skráningar fyrir þennan nemanda af reikningnum þínum."), - "Total Grade" : MessageLookupByLibrary.simpleMessage("Heildareinkunn"), - "Uh oh!" : MessageLookupByLibrary.simpleMessage("Æi!"), - "Unable to fetch courses. Please check your connection and try again." : MessageLookupByLibrary.simpleMessage("Ekki tókst að ná í námskeið. Athugaðu tengingu þína og reyndu aftur."), - "Unable to load this image" : MessageLookupByLibrary.simpleMessage("Ekki hægt að sækja þessa mynd"), - "Unable to play this media file" : MessageLookupByLibrary.simpleMessage("Ekki er hægt að spila þessa miðlaskrá"), - "Unable to send message. Check your connection and try again." : MessageLookupByLibrary.simpleMessage("ekki var hægt að senda skilaboð. Athugaðu tengingu þína og reyndu aftur."), - "Under Construction" : MessageLookupByLibrary.simpleMessage("Í byggingu"), - "Unknown User" : MessageLookupByLibrary.simpleMessage("Óþekktur notandi"), - "Unsaved changes" : MessageLookupByLibrary.simpleMessage("Óvistaðar breytingar"), - "Unsupported File" : MessageLookupByLibrary.simpleMessage("Óstudd skrá"), - "Upload File" : MessageLookupByLibrary.simpleMessage("Hlaða upp skrá"), - "Use Camera" : MessageLookupByLibrary.simpleMessage("Nota myndavél"), - "Use Dark Theme in Web Content" : MessageLookupByLibrary.simpleMessage("Nota dökkt þema í vefefni"), - "User ID" : MessageLookupByLibrary.simpleMessage("Auðkenni notanda"), - "User ID:" : MessageLookupByLibrary.simpleMessage("Auðkenni notanda:"), - "Version Number" : MessageLookupByLibrary.simpleMessage("Útgáfa númer"), - "View Description" : MessageLookupByLibrary.simpleMessage("Skoða lýsingu"), - "View error details" : MessageLookupByLibrary.simpleMessage("Skoða upplýsingar um villu"), - "View the Privacy Policy" : MessageLookupByLibrary.simpleMessage("Skoða persónuverndarstefnuna"), - "We are currently building this feature for your viewing pleasure." : MessageLookupByLibrary.simpleMessage("Núna byggjum við þennan eiginleika þér til hægðarauka."), - "We are unable to display this link, it may belong to an institution you currently aren\'t logged in to." : MessageLookupByLibrary.simpleMessage("Við getum ekki sýnt þennan tengil, hann gæti tilheyrt stofnun sem þú ert ekki innskráð(ur) hjá."), - "We couldn\'t find any students associated with this account" : MessageLookupByLibrary.simpleMessage("Við fundum enga nemendur sem tengjast þessum reikningi"), - "We were unable to verify the server for use with this app." : MessageLookupByLibrary.simpleMessage("Við gátum ekki sannreynt miðilinn fyrir notkun með þessu appi."), - "We’re not sure what happened, but it wasn’t good. Contact us if this keeps happening." : MessageLookupByLibrary.simpleMessage("Við erum ekki viss um hvað gerðist, en það var ekki gott. Hafðu samband við okkur ef þetta heldur áfram að gerast."), - "What can we do better?" : MessageLookupByLibrary.simpleMessage("Hvernig getum við bætt okkur?"), - "Yes" : MessageLookupByLibrary.simpleMessage("Já"), - "You are not observing any students." : MessageLookupByLibrary.simpleMessage("Þú fylgist ekki með neinum nemendum."), - "You may only choose 10 calendars to display" : MessageLookupByLibrary.simpleMessage("Aðeins er hægt að velja tíu dagatöl til að sýna"), - "You must enter a user id" : MessageLookupByLibrary.simpleMessage("Þú verður að setja inn auðkenni notanda"), - "You must enter a valid domain" : MessageLookupByLibrary.simpleMessage("Þú verður að setja inn rétt lén"), - "You must select at least one calendar to display" : MessageLookupByLibrary.simpleMessage("Velja þarf að minnsta kosti eitt dagatal til að sýna"), - "You will be notified about this assignment on…" : MessageLookupByLibrary.simpleMessage("Þú færð áminningu um þetta verkefni þann…"), - "You will be notified about this event on…" : MessageLookupByLibrary.simpleMessage("Þú færð áminningu um þennan viðburð þann…"), - "You\'ll find the QR code on the web in your account profile. Click \'QR for Mobile Login\' in the list." : MessageLookupByLibrary.simpleMessage("Þú finnur QR kóðann á vefnum á reikningssíðu þinni. Smelltu á ‘QR fyrir innskráningu með snjalltæki‘ í listanum."), - "You\'ll need to open your student\'s Canvas Student app to continue. Go into Main Menu > Settings > Pair with Observer and scan the QR code you see there." : MessageLookupByLibrary.simpleMessage("Þú þarft að opna Canvas Student forrit nemanda þíns til að halda áfram. Farðu í aðalvalmyndina > Stillingar > Para við eftirlitsaðila og skannaðu QR-kóðann sem þú sérð þar."), - "Your code is incorrect or expired." : MessageLookupByLibrary.simpleMessage("Kóðinn þinn er rangur eða útrunninn."), - "Your student’s courses might not be published yet." : MessageLookupByLibrary.simpleMessage("Námskeið nemanda þíns eru ef til vill ekki birt enn."), - "You’re all caught up!" : MessageLookupByLibrary.simpleMessage("Þú ert búin(n) með allt!"), - "actingAsUser" : m0, - "alertsLabel" : MessageLookupByLibrary.simpleMessage("Viðvaranir"), - "appVersion" : m1, - "assignmentGradeAboveThreshold" : m2, - "assignmentGradeBelowThreshold" : m3, - "assignmentLockedModule" : m4, - "assignmentSubjectMessage" : m5, - "assignmentTotalPoints" : m6, - "assignmentTotalPointsAccessible" : m7, - "authorToNOthers" : m8, - "authorToRecipient" : m9, - "authorToRecipientAndNOthers" : m10, - "badgeNumberPlus" : m11, - "calendarLabel" : MessageLookupByLibrary.simpleMessage("Dagatal"), - "canvasGuides" : MessageLookupByLibrary.simpleMessage("Canvas leiðarvísar"), - "canvasLogoLabel" : MessageLookupByLibrary.simpleMessage("Canvas myndmerki"), - "canvasSupport" : MessageLookupByLibrary.simpleMessage("Canvas stuðningur"), - "changeStudentColorLabel" : m12, - "collapse" : MessageLookupByLibrary.simpleMessage("fella saman"), - "collapsed" : MessageLookupByLibrary.simpleMessage("fellt saman"), - "contentDescriptionScoreOutOfPointsPossible" : m13, - "courseForWhom" : m14, - "courseGradeAboveThreshold" : m15, - "courseGradeBelowThreshold" : m16, - "coursesLabel" : MessageLookupByLibrary.simpleMessage("Námskeið"), - "dateAtTime" : m17, - "dismissAlertLabel" : m18, - "domainSearchHelpBody" : m19, - "domainSearchHelpLabel" : MessageLookupByLibrary.simpleMessage("Hvernig finn ég skólann minn eða umdæmið?"), - "domainSearchInputHint" : MessageLookupByLibrary.simpleMessage("Settu inn nafn skóla eða umdæmis…"), - "dueDateAtTime" : m20, - "endMasqueradeLogoutMessage" : m21, - "endMasqueradeMessage" : m22, - "eventSubjectMessage" : m23, - "eventTime" : m24, - "expand" : MessageLookupByLibrary.simpleMessage("víkka"), - "expanded" : MessageLookupByLibrary.simpleMessage("víkkað"), - "finalGrade" : m25, - "findSchool" : MessageLookupByLibrary.simpleMessage("Finna skóla"), - "frontPageSubjectMessage" : m26, - "gradeFormatScoreOutOfPointsPossible" : m27, - "gradesSubjectMessage" : m28, - "latePenalty" : m29, - "me" : MessageLookupByLibrary.simpleMessage("ég"), - "messageLinkPostscript" : m30, - "minus" : MessageLookupByLibrary.simpleMessage("mínus"), - "mustBeAboveN" : m31, - "mustBeBelowN" : m32, - "next" : MessageLookupByLibrary.simpleMessage("Næsti"), - "nextMonth" : m33, - "nextWeek" : m34, - "noDomainResults" : m35, - "ok" : MessageLookupByLibrary.simpleMessage("Í lagi"), - "outOfPoints" : m36, - "plusRecipientCount" : m37, - "pointsPossible" : m38, - "previousMonth" : m39, - "previousWeek" : m40, - "qrCreateAccountTos" : m41, - "ratingDialogEmailSubject" : m42, - "selectedMonthLabel" : m43, - "send" : MessageLookupByLibrary.simpleMessage("sendi"), - "starRating" : m44, - "submissionStatusSuccessSubtitle" : m45, - "syllabusSubjectMessage" : m46, - "unread" : MessageLookupByLibrary.simpleMessage("ólesið"), - "unreadCount" : m47 - }; -} diff --git a/apps/flutter_parent/lib/l10n/generated/messages_it.dart b/apps/flutter_parent/lib/l10n/generated/messages_it.dart deleted file mode 100644 index 5c0d1e045f..0000000000 --- a/apps/flutter_parent/lib/l10n/generated/messages_it.dart +++ /dev/null @@ -1,473 +0,0 @@ -// DO NOT EDIT. This is code generated via package:intl/generate_localized.dart -// This is a library that provides messages for a it locale. All the -// messages from the main program should be duplicated here with the same -// function name. - -// Ignore issues from commonly used lints in this file. -// ignore_for_file:unnecessary_brace_in_string_interps, unnecessary_new -// ignore_for_file:prefer_single_quotes,comment_references, directives_ordering -// ignore_for_file:annotate_overrides,prefer_generic_function_type_aliases -// ignore_for_file:unused_import, file_names - -import 'package:intl/intl.dart'; -import 'package:intl/message_lookup_by_library.dart'; - -final messages = new MessageLookup(); - -typedef String MessageIfAbsent(String messageStr, List args); - -class MessageLookup extends MessageLookupByLibrary { - String get localeName => 'it'; - - static m0(userName) => "Stai agendo come ${userName}"; - - static m1(version) => "v. ${version}"; - - static m2(threshold) => "Voto compito sopra ${threshold}"; - - static m3(threshold) => "Voto compito sotto ${threshold}"; - - static m4(moduleName) => "Questo compito è bloccato dal modulo \"${moduleName}\"."; - - static m5(studentName, assignmentName) => "Su: ${studentName}, Compito - ${assignmentName}"; - - static m6(points) => "${points} pt."; - - static m7(points) => "${points} punti"; - - static m8(authorName, howMany) => "${Intl.plural(howMany, one: '${authorName} a 1 altro', other: '${authorName} ad altri ${howMany}')}"; - - static m9(authorName, recipientName) => "${authorName} a ${recipientName}"; - - static m10(authorName, recipientName, howMany) => "${Intl.plural(howMany, one: '${authorName} a ${recipientName} e 1 altro', other: '${authorName} a ${recipientName} e altri ${howMany}')}"; - - static m11(count) => "${count}+"; - - static m12(studentName) => "Cambia colore per ${studentName}"; - - static m13(score, pointsPossible) => "${score} su ${pointsPossible} punti"; - - static m14(studentShortName) => "per ${studentShortName}"; - - static m15(threshold) => "Voto corso sopra ${threshold}"; - - static m16(threshold) => "Voto corso sotto ${threshold}"; - - static m17(date, time) => "Il ${date} alle ${time}"; - - static m18(alertTitle) => "Ignora ${alertTitle}"; - - static m19(canvasGuides, canvasSupport) => "Prova a cercare il nome della scuola o del distretto a cui stai tentando di accedere, ad esempio “Scuola privata Rossi” o “Scuole statali Rossi”. Puoi anche entrare direttamente in un dominio Canvas, ad esempio “rossi.instructure.com.”\n\nPer ulteriori informazioni su come trovare l’account Canvas del tuo istituto, puoi visitare le ${canvasGuides}, contattare l’${canvasSupport} o la scuola per assistenza."; - - static m20(date, time) => "Scade il ${date} alle ${time}"; - - static m21(userName) => "Non agirai più come ${userName} e sarai disconnesso."; - - static m22(userName) => "Non agirai più come ${userName} e tornerai al tuo account originale."; - - static m23(studentName, eventTitle) => "Su: ${studentName}, Evento - ${eventTitle}"; - - static m24(startAt, endAt) => "${startAt} - ${endAt}"; - - static m25(grade) => "Voto finale: ${grade}"; - - static m26(studentName) => "Su: ${studentName}, Pagina iniziale"; - - static m27(score, pointsPossible) => "${score} / ${pointsPossible}"; - - static m28(studentName) => "Su: ${studentName}, Voti"; - - static m29(pointsLost) => "Penale ritardo (-${pointsLost})"; - - static m30(studentName, linkUrl) => "Su: ${studentName}, ${linkUrl}"; - - static m31(percentage) => "Deve essere sopra ${percentage}"; - - static m32(percentage) => "Deve essere sotto ${percentage}"; - - static m33(month) => "Prossimo mese: ${month}"; - - static m34(date) => "Prossima settimana a partire da ${date}"; - - static m35(query) => "Impossibile trovare delle scuole corrispondenti a \"${query}\""; - - static m36(points, howMany) => "${Intl.plural(howMany, one: 'Di 1 punto', other: 'Di ${points} punti')}"; - - static m37(count) => "+${count}"; - - static m38(points) => "${points} punti possibili"; - - static m39(month) => "Mese precedente: ${month}"; - - static m40(date) => "Settimana precedente a partire da ${date}"; - - static m41(termsOfService, privacyPolicy) => "Toccando “Crea account”, accetti i ${termsOfService} e confermi l’${privacyPolicy}"; - - static m42(version) => "Suggerimenti per Android - Canvas Parent ${version}"; - - static m43(month) => "Mese di ${month}"; - - static m44(position) => "${Intl.plural(position, one: '${position} stella', other: '${position} stelle')}"; - - static m45(date, time) => "Questo compito è stato inviato il ${date} alle ${time} ed è in attesa della valutazione"; - - static m46(studentName) => "Su: ${studentName}, Piano di studio"; - - static m47(count) => "${count} non letto"; - - final messages = _notInlinedMessages(_notInlinedMessages); - static _notInlinedMessages(_) => { - "\"Act as\" is essentially logging in as this user without a password. You will be able to take any action as if you were this user, and from other users\' points of views, it will be as if this user performed them. However, audit logs record that you were the one who performed the actions on behalf of this user." : MessageLookupByLibrary.simpleMessage("\"Agisci come\" consiste sostanzialmente nell\'effettuare l\'accesso assumendo l\'identità di questo utente senza inserire alcuna password. Potrai eseguire qualsiasi azione come se fossi questo utente e, dal punto di vista degli altri utenti, sarà come se queste azioni fossero state eseguite da questo utente. Tuttavia, i log di controllo registrano che sei stato tu a eseguire le azioni per conto di questo utente."), - "-" : MessageLookupByLibrary.simpleMessage("-"), - "A description is required." : MessageLookupByLibrary.simpleMessage("La descrizione è obbligatoria."), - "A network error occurred when adding this student. Check your connection and try again." : MessageLookupByLibrary.simpleMessage("Durante l’aggiunta di questo studente, si è verificato un errore di rete. Verifica la tua connessione e riprova."), - "A subject is required." : MessageLookupByLibrary.simpleMessage("L’argomento è obbligatorio."), - "Act As User" : MessageLookupByLibrary.simpleMessage("Agisci come utente"), - "Add Student" : MessageLookupByLibrary.simpleMessage("Aggiungi studente"), - "Add attachment" : MessageLookupByLibrary.simpleMessage("Aggiungi allegato"), - "Add new student" : MessageLookupByLibrary.simpleMessage("Aggiungi nuovo studente"), - "Add student with…" : MessageLookupByLibrary.simpleMessage("Aggiungi studente con…"), - "Alert Settings" : MessageLookupByLibrary.simpleMessage("Impostazioni avviso"), - "Alert me when…" : MessageLookupByLibrary.simpleMessage("Avvisami quando…"), - "All Grading Periods" : MessageLookupByLibrary.simpleMessage("Tutti i periodi di valutazione"), - "Already have an account? " : MessageLookupByLibrary.simpleMessage("Hai già un account? "), - "An email address is required." : MessageLookupByLibrary.simpleMessage("L’indirizzo e-mail è obbligatorio."), - "An error occurred when trying to display this link" : MessageLookupByLibrary.simpleMessage("Si è verificato un errore durante il tentativo di visualizzare questo link"), - "An error occurred while saving your selection. Please try again." : MessageLookupByLibrary.simpleMessage("Si è verificato un errore durante il salvataggio della selezione. Riprova."), - "An unexpected error occurred" : MessageLookupByLibrary.simpleMessage("Si verificato un errore imprevisto"), - "Android OS version" : MessageLookupByLibrary.simpleMessage("Versione SO Android"), - "Appearance" : MessageLookupByLibrary.simpleMessage("Aspetto"), - "Application version" : MessageLookupByLibrary.simpleMessage("Versione applicazione"), - "Are you a student or teacher?" : MessageLookupByLibrary.simpleMessage("Sei uno studente o un insegnante?"), - "Are you sure you want to log out?" : MessageLookupByLibrary.simpleMessage("Disconnettersi?"), - "Are you sure you wish to close this page? Your unsent message will be lost." : MessageLookupByLibrary.simpleMessage("Vuoi chiudere questa pagina? Il messaggio non inviato andrà perso."), - "Assignment Details" : MessageLookupByLibrary.simpleMessage("Dettagli compiti"), - "Assignment grade above" : MessageLookupByLibrary.simpleMessage("Voto compito sopra"), - "Assignment grade below" : MessageLookupByLibrary.simpleMessage("Voto compito sotto"), - "Assignment missing" : MessageLookupByLibrary.simpleMessage("Compito mancante"), - "Barney, Fuschia" : MessageLookupByLibrary.simpleMessage("Barney, fucsia"), - "Calendars" : MessageLookupByLibrary.simpleMessage("Calendari"), - "Camera Permission" : MessageLookupByLibrary.simpleMessage("Autorizzazione della fotocamera"), - "Cancel" : MessageLookupByLibrary.simpleMessage("Annulla"), - "Canvas Student" : MessageLookupByLibrary.simpleMessage("Studente Canvas"), - "Canvas Teacher" : MessageLookupByLibrary.simpleMessage("Insegnante Canvas"), - "Canvas on GitHub" : MessageLookupByLibrary.simpleMessage("Canvas su GitHub"), - "Choose a course to message" : MessageLookupByLibrary.simpleMessage("Scegli un corso da messaggiare"), - "Choose from Gallery" : MessageLookupByLibrary.simpleMessage("Scegli da galleria"), - "Complete" : MessageLookupByLibrary.simpleMessage("Completa"), - "Contact Support" : MessageLookupByLibrary.simpleMessage("Contatta l’assistenza"), - "Course Announcement" : MessageLookupByLibrary.simpleMessage("Annuncio corso"), - "Course Announcements" : MessageLookupByLibrary.simpleMessage("Annunci corso"), - "Course grade above" : MessageLookupByLibrary.simpleMessage("Voto corso sopra"), - "Course grade below" : MessageLookupByLibrary.simpleMessage("Voto corso sotto"), - "Create Account" : MessageLookupByLibrary.simpleMessage("Crea account"), - "Dark Mode" : MessageLookupByLibrary.simpleMessage("Modalità Scura"), - "Date" : MessageLookupByLibrary.simpleMessage("Data"), - "Delete" : MessageLookupByLibrary.simpleMessage("Elimina"), - "Description" : MessageLookupByLibrary.simpleMessage("Descrizione"), - "Device" : MessageLookupByLibrary.simpleMessage("Dispositivo"), - "Device model" : MessageLookupByLibrary.simpleMessage("Modello dispositivo"), - "Domain" : MessageLookupByLibrary.simpleMessage("Dominio"), - "Domain:" : MessageLookupByLibrary.simpleMessage("Dominio:"), - "Don\'t show again" : MessageLookupByLibrary.simpleMessage("Non mostrarlo di nuovo"), - "Done" : MessageLookupByLibrary.simpleMessage("Fatto"), - "Download" : MessageLookupByLibrary.simpleMessage("Download"), - "Due" : MessageLookupByLibrary.simpleMessage("Scadenza"), - "EXTREME CRITICAL EMERGENCY!!" : MessageLookupByLibrary.simpleMessage("EMERGENZA CRITICA."), - "Electric, blue" : MessageLookupByLibrary.simpleMessage("Elettrico, blu"), - "Email Address" : MessageLookupByLibrary.simpleMessage("Indirizzo e-mail"), - "Email:" : MessageLookupByLibrary.simpleMessage("E-mail:"), - "Email…" : MessageLookupByLibrary.simpleMessage("E-mail..."), - "Enter the student pairing code provided to you. If the pairing code doesn\'t work, it may have expired" : MessageLookupByLibrary.simpleMessage("Inserisci il codice accoppiamento studente fornito. Se il codice accoppiamento non funziona, potrebbe essere scaduto"), - "Event" : MessageLookupByLibrary.simpleMessage("Evento"), - "Excused" : MessageLookupByLibrary.simpleMessage("Giustificato"), - "Expired QR Code" : MessageLookupByLibrary.simpleMessage("Codice QR scaduto"), - "Failed. Tap for options." : MessageLookupByLibrary.simpleMessage("Non riuscito. Tocca per le opzioni."), - "Filter" : MessageLookupByLibrary.simpleMessage("Filtra"), - "Filter by" : MessageLookupByLibrary.simpleMessage("Filtra per"), - "Fire, Orange" : MessageLookupByLibrary.simpleMessage("Fuoco, arancione"), - "Front Page" : MessageLookupByLibrary.simpleMessage("Pagina iniziale"), - "Full Name" : MessageLookupByLibrary.simpleMessage("Nome completo"), - "Full Name…" : MessageLookupByLibrary.simpleMessage("Nome completo..."), - "Full error message" : MessageLookupByLibrary.simpleMessage("Messaggio di errore pieno"), - "Go to today" : MessageLookupByLibrary.simpleMessage("Vai a oggi"), - "Grade" : MessageLookupByLibrary.simpleMessage("Voto"), - "Grade percentage" : MessageLookupByLibrary.simpleMessage("Percentuale voto"), - "Graded" : MessageLookupByLibrary.simpleMessage("Valutato"), - "Grades" : MessageLookupByLibrary.simpleMessage("Voti"), - "Help" : MessageLookupByLibrary.simpleMessage("Guida"), - "Hide Password" : MessageLookupByLibrary.simpleMessage("Nascondi password"), - "High Contrast Mode" : MessageLookupByLibrary.simpleMessage("Modalità alto contrasto"), - "How are we doing?" : MessageLookupByLibrary.simpleMessage("Come stiamo andando?"), - "How is this affecting you?" : MessageLookupByLibrary.simpleMessage("Quali sono le ripercussioni per te?"), - "I can\'t get things done until I hear back from you." : MessageLookupByLibrary.simpleMessage("Non riesco a terminare il lavoro finché non ricevo una tua risposta."), - "I don\'t have a Canvas account" : MessageLookupByLibrary.simpleMessage("Non ho un account Canvas"), - "I have a Canvas account" : MessageLookupByLibrary.simpleMessage("Ho un account Canvas"), - "I need some help but it\'s not urgent." : MessageLookupByLibrary.simpleMessage("Ho bisogno di aiuto ma non è urgente."), - "I\'m having trouble logging in" : MessageLookupByLibrary.simpleMessage("Ho dei problemi di login"), - "Idea for Canvas Parent App [Android]" : MessageLookupByLibrary.simpleMessage("Idea per l’app Canvas Parent [Android]"), - "In order to provide you with a better experience, we have updated how reminders work. You can add new reminders by viewing an assignment or calendar event and tapping the switch under the \"Remind Me\" section.\n\nBe aware that any reminders created with older versions of this app will not be compatible with the new changes and you will need to create them again." : MessageLookupByLibrary.simpleMessage("Per fornirti un’esperienza migliore, abbiamo aggiornato il modo in cui funzionano i promemoria. Puoi aggiungere nuovi promemoria visualizzando un compito o un evento del calendario e toccando l’interruttore sotto la sezione \"Promemoria\".\n\nNon dimenticare che tutti i promemoria creati con le versioni precedenti di questa app non saranno compatibili con le nuove modifiche e sarà necessario ricrearli."), - "Inbox" : MessageLookupByLibrary.simpleMessage("Posta in arrivo"), - "Inbox Zero" : MessageLookupByLibrary.simpleMessage("Zero in posta in arrivo"), - "Incomplete" : MessageLookupByLibrary.simpleMessage("Non completato"), - "Incorrect Domain" : MessageLookupByLibrary.simpleMessage("Dominio errato"), - "Institution Announcement" : MessageLookupByLibrary.simpleMessage("Annuncio istituto"), - "Institution Announcements" : MessageLookupByLibrary.simpleMessage("Annunci istituto"), - "Instructions" : MessageLookupByLibrary.simpleMessage("Istruzioni"), - "Interactions on this page are limited by your institution." : MessageLookupByLibrary.simpleMessage("Le interazioni su questa pagina sono limitate dal tuo istituto."), - "Invalid QR Code" : MessageLookupByLibrary.simpleMessage("Codice QR non valido"), - "It looks like a great day to rest, relax, and recharge." : MessageLookupByLibrary.simpleMessage("Ottima occasione per riposarsi, rilassarsi e ricaricare le batterie."), - "It looks like assignments haven\'t been created in this space yet." : MessageLookupByLibrary.simpleMessage("Sembra che i compiti non siano ancora stati creati in questo spazio."), - "Just a casual question, comment, idea, suggestion…" : MessageLookupByLibrary.simpleMessage("Solo una domanda casuale, un commento, un\'idea, un suggerimento…"), - "Late" : MessageLookupByLibrary.simpleMessage("In ritardo"), - "Launch External Tool" : MessageLookupByLibrary.simpleMessage("Avvia strumento esterno"), - "Legal" : MessageLookupByLibrary.simpleMessage("Legale"), - "Light Mode" : MessageLookupByLibrary.simpleMessage("Modalità chiara"), - "Link Error" : MessageLookupByLibrary.simpleMessage("Errore link"), - "Locale:" : MessageLookupByLibrary.simpleMessage("Impostazioni internazionali:"), - "Locate QR Code" : MessageLookupByLibrary.simpleMessage("Individua codice QR"), - "Location" : MessageLookupByLibrary.simpleMessage("Posizione"), - "Locked" : MessageLookupByLibrary.simpleMessage("Bloccato"), - "Log Out" : MessageLookupByLibrary.simpleMessage("Disconnetti"), - "Login flow: Canvas" : MessageLookupByLibrary.simpleMessage("Flusso di login: Canvas"), - "Login flow: Normal" : MessageLookupByLibrary.simpleMessage("Flusso di login: Normale"), - "Login flow: Site Admin" : MessageLookupByLibrary.simpleMessage("Flusso di login: Amministratore del sito"), - "Login flow: Skip mobile verify" : MessageLookupByLibrary.simpleMessage("Flusso di login: Salta verifica dispositivo mobile"), - "Manage Students" : MessageLookupByLibrary.simpleMessage("Gestisci studenti"), - "Message" : MessageLookupByLibrary.simpleMessage("Messaggio"), - "Message subject" : MessageLookupByLibrary.simpleMessage("Oggetto del messaggio"), - "Missing" : MessageLookupByLibrary.simpleMessage("Mancante"), - "Must be below 100" : MessageLookupByLibrary.simpleMessage("Deve essere sotto 100"), - "Network error" : MessageLookupByLibrary.simpleMessage("Errore di rete"), - "Never" : MessageLookupByLibrary.simpleMessage("Mai"), - "New message" : MessageLookupByLibrary.simpleMessage("Nuovo messaggio"), - "No" : MessageLookupByLibrary.simpleMessage("No"), - "No Alerts" : MessageLookupByLibrary.simpleMessage("Nessun avviso"), - "No Assignments" : MessageLookupByLibrary.simpleMessage("Nessun compito"), - "No Courses" : MessageLookupByLibrary.simpleMessage("Nessun corso"), - "No Due Date" : MessageLookupByLibrary.simpleMessage("Nessuna data di scadenza"), - "No Events Today!" : MessageLookupByLibrary.simpleMessage("Nessun evento oggi!"), - "No Grade" : MessageLookupByLibrary.simpleMessage("Nessun voto"), - "No Location Specified" : MessageLookupByLibrary.simpleMessage("Nessuna posizione specificata"), - "No Students" : MessageLookupByLibrary.simpleMessage("Nessuno studente"), - "No Subject" : MessageLookupByLibrary.simpleMessage("Nessun oggetto"), - "No Summary" : MessageLookupByLibrary.simpleMessage("Nessun riepilogo"), - "No description" : MessageLookupByLibrary.simpleMessage("Nessuna descrizione"), - "No recipients selected" : MessageLookupByLibrary.simpleMessage("Nessun destinatario selezionato"), - "Not Graded" : MessageLookupByLibrary.simpleMessage("Non valutato"), - "Not Submitted" : MessageLookupByLibrary.simpleMessage("Non inviato"), - "Not a parent?" : MessageLookupByLibrary.simpleMessage("Non è principale?"), - "Notifications for reminders about assignments and calendar events" : MessageLookupByLibrary.simpleMessage("Notifiche per i promemoria sui compiti e gli eventi di calendario"), - "OS Version" : MessageLookupByLibrary.simpleMessage("Versione SO"), - "Observer" : MessageLookupByLibrary.simpleMessage("Osservatore"), - "One of our other apps might be a better fit. Tap one to visit the Play Store." : MessageLookupByLibrary.simpleMessage("Una delle altre nostre app potrebbe essere la scelta migliore. Toccane una per visitare Play Store."), - "Open Canvas Student" : MessageLookupByLibrary.simpleMessage("Apri Canvas Student"), - "Open In Browser" : MessageLookupByLibrary.simpleMessage("Apri nel browser"), - "Open with another app" : MessageLookupByLibrary.simpleMessage("Apri con un’altra app"), - "Pairing Code" : MessageLookupByLibrary.simpleMessage("Codice accoppiamento"), - "Password" : MessageLookupByLibrary.simpleMessage("Password"), - "Password is required" : MessageLookupByLibrary.simpleMessage("Password obbligatoria"), - "Password must contain at least 8 characters" : MessageLookupByLibrary.simpleMessage("La password deve contenere almeno 8 caratteri"), - "Password…" : MessageLookupByLibrary.simpleMessage("Password..."), - "Planner Note" : MessageLookupByLibrary.simpleMessage("Nota agenda"), - "Please enter a valid email address" : MessageLookupByLibrary.simpleMessage("Inserisci un indirizzo e-mail valido"), - "Please enter an email address" : MessageLookupByLibrary.simpleMessage("Inserisci un indirizzo e-mail"), - "Please enter full name" : MessageLookupByLibrary.simpleMessage("Inserisci il nome completo"), - "Please scan a QR code generated by Canvas" : MessageLookupByLibrary.simpleMessage("Acquisisci un codice QR generato da Canvas"), - "Plum, Purple" : MessageLookupByLibrary.simpleMessage("Prugna, viola"), - "Preparing…" : MessageLookupByLibrary.simpleMessage("Preparazione in corso..."), - "Previous Logins" : MessageLookupByLibrary.simpleMessage("Login precedenti"), - "Privacy Policy" : MessageLookupByLibrary.simpleMessage("Informativa sulla privacy"), - "Privacy Policy Link" : MessageLookupByLibrary.simpleMessage("Link dell’informativa sulla privacy"), - "Privacy policy, terms of use, open source" : MessageLookupByLibrary.simpleMessage("Informativa sulla privacy, termini di utilizzo, open source"), - "QR Code" : MessageLookupByLibrary.simpleMessage("Codice QR"), - "QR scanning requires camera access" : MessageLookupByLibrary.simpleMessage("Per la scansione QR è necessario l’accesso alla fotocamera"), - "Raspberry, Red" : MessageLookupByLibrary.simpleMessage("Lampone, rosso"), - "Recipients" : MessageLookupByLibrary.simpleMessage("Destinatari"), - "Refresh" : MessageLookupByLibrary.simpleMessage("Aggiorna"), - "Remind Me" : MessageLookupByLibrary.simpleMessage("Promemoria"), - "Reminders" : MessageLookupByLibrary.simpleMessage("Promemoria"), - "Reminders have changed!" : MessageLookupByLibrary.simpleMessage("I promemoria sono cambiati!"), - "Reply" : MessageLookupByLibrary.simpleMessage("Rispondi"), - "Reply All" : MessageLookupByLibrary.simpleMessage("Rispondi a tutti"), - "Report A Problem" : MessageLookupByLibrary.simpleMessage("Segnala un problema"), - "Request Login Help" : MessageLookupByLibrary.simpleMessage("Richiedi aiuto per login"), - "Request Login Help Button" : MessageLookupByLibrary.simpleMessage("Pulsante Richiedi aiuto per login"), - "Restart app" : MessageLookupByLibrary.simpleMessage("Riavvia app"), - "Retry" : MessageLookupByLibrary.simpleMessage("Riprova"), - "Return to Login" : MessageLookupByLibrary.simpleMessage("Torna alla pagina di login"), - "STUDENT" : MessageLookupByLibrary.simpleMessage("STUDENTE"), - "Screenshot showing location of QR code generation in browser" : MessageLookupByLibrary.simpleMessage("Screenshot che mostra la posizione della generazione del codice QR nel browser"), - "Screenshot showing location of pairing QR code generation in the Canvas Student app" : MessageLookupByLibrary.simpleMessage("Schermata che mostra la posizione per la generazione del codice QR di abbinamento nell\'applicazione Canvas Student"), - "Select" : MessageLookupByLibrary.simpleMessage("Seleziona"), - "Select Student Color" : MessageLookupByLibrary.simpleMessage("Seleziona colore studente"), - "Select recipients" : MessageLookupByLibrary.simpleMessage("Seleziona destinatari"), - "Send Feedback" : MessageLookupByLibrary.simpleMessage("Invia feedback"), - "Send a message about this assignment" : MessageLookupByLibrary.simpleMessage("Invia un messaggio su questo compito"), - "Send a message about this course" : MessageLookupByLibrary.simpleMessage("Invia un messaggio su questo corso"), - "Send message" : MessageLookupByLibrary.simpleMessage("Invia messaggio"), - "Set a date and time to be notified of this event." : MessageLookupByLibrary.simpleMessage("Imposta una data e un’ora per ricevere la notifica su questo evento."), - "Set a date and time to be notified of this specific assignment." : MessageLookupByLibrary.simpleMessage("Imposta una data e un’ora per ricevere la notifica su questo compito specifico."), - "Settings" : MessageLookupByLibrary.simpleMessage("Impostazioni"), - "Shamrock, Green" : MessageLookupByLibrary.simpleMessage("Trifoglio, verde"), - "Share Your Love for the App" : MessageLookupByLibrary.simpleMessage("Condividi cosa ti piace dell’app"), - "Show Password" : MessageLookupByLibrary.simpleMessage("Mostra password"), - "Sign In" : MessageLookupByLibrary.simpleMessage("Accedi"), - "Something went wrong trying to create your account, please reach out to your school for assistance." : MessageLookupByLibrary.simpleMessage("Si è verificato un errore durante il tentativo di creare il tuo account, contatta la scuola per assistenza."), - "Something\'s broken but I can work around it to get what I need done." : MessageLookupByLibrary.simpleMessage("Si è verificato un problema ma posso aggirarlo e fare ciò che devo."), - "Stop Acting as User" : MessageLookupByLibrary.simpleMessage("Non agire più come utente"), - "Student" : MessageLookupByLibrary.simpleMessage("Studente"), - "Student Pairing" : MessageLookupByLibrary.simpleMessage("Abbinamento studente"), - "Students can create a QR code using the Canvas Student app on their mobile device" : MessageLookupByLibrary.simpleMessage("Gli studenti possono creare un codice QR tramite l\'applicazione Canvas Student sul loro dispositivo mobile"), - "Students can obtain a pairing code through the Canvas website" : MessageLookupByLibrary.simpleMessage("Gli studenti possono ricevere un codice di abbinamento sul sito web Canvas"), - "Subject" : MessageLookupByLibrary.simpleMessage("Oggetto"), - "Submitted" : MessageLookupByLibrary.simpleMessage("Inviato"), - "Successfully submitted!" : MessageLookupByLibrary.simpleMessage("Inviato correttamente!"), - "Summary" : MessageLookupByLibrary.simpleMessage("Riepilogo"), - "Switch Users" : MessageLookupByLibrary.simpleMessage("Cambia studenti"), - "Syllabus" : MessageLookupByLibrary.simpleMessage("Piano di studio"), - "TA" : MessageLookupByLibrary.simpleMessage("Assistente"), - "TEACHER" : MessageLookupByLibrary.simpleMessage("INSEGNANTE"), - "Tap to favorite the courses you want to see on the Calendar. Select up to 10." : MessageLookupByLibrary.simpleMessage("Tocca per mettere nei preferiti i corsi che vuoi vedere sul calendario. Seleziona fino a 10."), - "Tap to pair with a new student" : MessageLookupByLibrary.simpleMessage("Tocca per accoppiare con un nuovo studente"), - "Tap to select this student" : MessageLookupByLibrary.simpleMessage("Tocca per selezionare questo studente"), - "Tap to show student selector" : MessageLookupByLibrary.simpleMessage("Tocca per mostrare il selettore studente"), - "Teacher" : MessageLookupByLibrary.simpleMessage("Insegnante"), - "Tell us about your favorite parts of the app" : MessageLookupByLibrary.simpleMessage("Raccontaci quali sono le tue parti preferite dell’app"), - "Terms of Service" : MessageLookupByLibrary.simpleMessage("Termini di servizio"), - "Terms of Service Link" : MessageLookupByLibrary.simpleMessage("Link dei termini di servizio"), - "Terms of Use" : MessageLookupByLibrary.simpleMessage("Termini di utilizzo"), - "The QR code you scanned may have expired. Refresh the code on the student\'s device and try again." : MessageLookupByLibrary.simpleMessage("Il codice QR scansionato potrebbe essere scaduto. Aggiorna il codice sul dispositivo dello studente e riprova."), - "The following information will help us better understand your idea:" : MessageLookupByLibrary.simpleMessage("Le seguenti informazioni ci aiutano a comprendere meglio la tua idea:"), - "The server you entered is not authorized for this app." : MessageLookupByLibrary.simpleMessage("Il server in cui sei entrato non è autorizzato per questa app."), - "The student you are trying to add belongs to a different school. Log in or create an account with that school to scan this code." : MessageLookupByLibrary.simpleMessage("Lo studente che stai cercando di aggiungere fa parte di un\'altra scuola. Per scansionare il codice, accedi o crea un account per quella scuola."), - "The user agent for this app is not authorized." : MessageLookupByLibrary.simpleMessage("L’agente utente per questa app non è autorizzata."), - "Theme" : MessageLookupByLibrary.simpleMessage("Tema"), - "There are no installed applications that can open this file" : MessageLookupByLibrary.simpleMessage("Non ci sono applicazioni installate per aprire questo file"), - "There is no page information available." : MessageLookupByLibrary.simpleMessage("Non ci sono informazioni pagina disponibili."), - "There was a problem loading the Terms of Use" : MessageLookupByLibrary.simpleMessage("Si è verificato un problema durante il caricamento delle Condizioni d’uso"), - "There was a problem removing this student from your account. Please check your connection and try again." : MessageLookupByLibrary.simpleMessage("Si è verificato un problema durante la rimozione di questo studente dall’account. Verifica la connessione e riprova."), - "There was an error loading recipients for this course" : MessageLookupByLibrary.simpleMessage("Si è verificato un errore durante il caricamento dei destinatari per questo corso"), - "There was an error loading the summary details for this course." : MessageLookupByLibrary.simpleMessage("Si è verificato un errore durante il caricamento dei dettagli di riepilogo per questo corso."), - "There was an error loading this announcement" : MessageLookupByLibrary.simpleMessage("Si è verificato un errore durante il caricamento di questo annuncio"), - "There was an error loading this conversation" : MessageLookupByLibrary.simpleMessage("Si è verificato un errore durante il caricamento di questa conversazione"), - "There was an error loading this file" : MessageLookupByLibrary.simpleMessage("Si è verificato un errore durante il caricamento di questo file"), - "There was an error loading your inbox messages." : MessageLookupByLibrary.simpleMessage("Si è verificato un errore durante il caricamento dei messaggi di posta in arrivo."), - "There was an error loading your student\'s alerts." : MessageLookupByLibrary.simpleMessage("Si è verificato un errore durante il caricamento degli avvisi dello studente."), - "There was an error loading your student\'s calendar" : MessageLookupByLibrary.simpleMessage("Si è verificato un errore di caricamento del calendario del tuo studente"), - "There was an error loading your students." : MessageLookupByLibrary.simpleMessage("Si è verificato un errore durante il caricamento dei tuoi studenti."), - "There was an error loading your student’s courses." : MessageLookupByLibrary.simpleMessage("Si è verificato un errore durante il caricamento dei corsi dello studente."), - "There was an error logging in. Please generate another QR Code and try again." : MessageLookupByLibrary.simpleMessage("Si è verificato un errore di login. Genera un altro codice QR e riprova."), - "There was an error trying to act as this user. Please check the Domain and User ID and try again." : MessageLookupByLibrary.simpleMessage("Si è verificato un errore durante il tentativo di agire come questo utente. Controlla il dominio e l’ID utente e riprova."), - "There’s nothing to be notified of yet." : MessageLookupByLibrary.simpleMessage("Non c’è ancora nulla su cui ricevere delle notifiche."), - "This app is not authorized for use." : MessageLookupByLibrary.simpleMessage("Questa app non è autorizzata per l’uso."), - "This course does not have any assignments or calendar events yet." : MessageLookupByLibrary.simpleMessage("Questo corso non ha ancora alcun compito o eventi di calendario."), - "This file is unsupported and can’t be viewed through the app" : MessageLookupByLibrary.simpleMessage("Questo file non è supportato e non può essere visualizzato attraverso l’app"), - "This will unpair and remove all enrollments for this student from your account." : MessageLookupByLibrary.simpleMessage("Quest’azione disassocierà e rimuoverà tutte le iscrizioni per questo studente dal tuo account."), - "Total Grade" : MessageLookupByLibrary.simpleMessage("Voto totale"), - "Uh oh!" : MessageLookupByLibrary.simpleMessage("Spiacenti."), - "Unable to fetch courses. Please check your connection and try again." : MessageLookupByLibrary.simpleMessage("Impossibile recuperare i corsi. Verificare la connessione e riprovare."), - "Unable to load this image" : MessageLookupByLibrary.simpleMessage("Impossibile caricare questa immagine"), - "Unable to play this media file" : MessageLookupByLibrary.simpleMessage("Impossibile riprodurre questo file multimediale"), - "Unable to send message. Check your connection and try again." : MessageLookupByLibrary.simpleMessage("Impossibile inviare il messaggio. Verifica la tua connessione e riprova."), - "Under Construction" : MessageLookupByLibrary.simpleMessage("In costruzione"), - "Unknown User" : MessageLookupByLibrary.simpleMessage("Utente sconosciuto"), - "Unsaved changes" : MessageLookupByLibrary.simpleMessage("Modifiche non salvate"), - "Unsupported File" : MessageLookupByLibrary.simpleMessage("File non supportato"), - "Upload File" : MessageLookupByLibrary.simpleMessage("Carica File"), - "Use Camera" : MessageLookupByLibrary.simpleMessage("Usa videocamera"), - "Use Dark Theme in Web Content" : MessageLookupByLibrary.simpleMessage("Usa tema scuro nel contenuto web"), - "User ID" : MessageLookupByLibrary.simpleMessage("ID utente"), - "User ID:" : MessageLookupByLibrary.simpleMessage("ID utente:"), - "Version Number" : MessageLookupByLibrary.simpleMessage("Numero versione"), - "View Description" : MessageLookupByLibrary.simpleMessage("Visualizza descrizione"), - "View error details" : MessageLookupByLibrary.simpleMessage("Visualizza dettagli errori"), - "View the Privacy Policy" : MessageLookupByLibrary.simpleMessage("Visualizza informativa sulla privacy"), - "We are currently building this feature for your viewing pleasure." : MessageLookupByLibrary.simpleMessage("Stiamo attualmente realizzando questa funzione che puoi visualizzare."), - "We are unable to display this link, it may belong to an institution you currently aren\'t logged in to." : MessageLookupByLibrary.simpleMessage("Impossibile visualizzare questo link, può appartenere ad un istituto a cui non sei attualmente connesso."), - "We couldn\'t find any students associated with this account" : MessageLookupByLibrary.simpleMessage("Impossibile trovare alcuno studente associato con questo account"), - "We were unable to verify the server for use with this app." : MessageLookupByLibrary.simpleMessage("Non siamo riusciti a verificare il server per l’uso con questa app."), - "We’re not sure what happened, but it wasn’t good. Contact us if this keeps happening." : MessageLookupByLibrary.simpleMessage("Non siamo sicuri di cos’è successo, ma non è stata una cosa positiva. Contattaci se continua a succedere."), - "What can we do better?" : MessageLookupByLibrary.simpleMessage("Cosa possiamo migliorare?"), - "Yes" : MessageLookupByLibrary.simpleMessage("Sì"), - "You are not observing any students." : MessageLookupByLibrary.simpleMessage("Non stati monitorando alcuno studente."), - "You may only choose 10 calendars to display" : MessageLookupByLibrary.simpleMessage("Puoi scegliere solo 10 calendari da visualizzare"), - "You must enter a user id" : MessageLookupByLibrary.simpleMessage("Devi inserire un ID utente"), - "You must enter a valid domain" : MessageLookupByLibrary.simpleMessage("Devi inserire un dominio valido"), - "You must select at least one calendar to display" : MessageLookupByLibrary.simpleMessage("Devi selezionare almeno un calendario da visualizzare"), - "You will be notified about this assignment on…" : MessageLookupByLibrary.simpleMessage("Riceverai una notifica su questo compito il…"), - "You will be notified about this event on…" : MessageLookupByLibrary.simpleMessage("Riceverai una notifica su questo evento il…"), - "You\'ll find the QR code on the web in your account profile. Click \'QR for Mobile Login\' in the list." : MessageLookupByLibrary.simpleMessage("Troverai il codice QR sul web nel tuo profilo account. Fai clic su “QR per login da dispositivo mobile” nell’elenco."), - "You\'ll need to open your student\'s Canvas Student app to continue. Go into Main Menu > Settings > Pair with Observer and scan the QR code you see there." : MessageLookupByLibrary.simpleMessage("Per continuare, devi aprire l\'applicazione Canvas Student del tuo studente. Vai in Menu principale > Impostazioni > Abbina con l\'Osservatore e scansiona il codice QR che vedi."), - "Your code is incorrect or expired." : MessageLookupByLibrary.simpleMessage("Il tuo codice non è corretto o è scaduto."), - "Your student’s courses might not be published yet." : MessageLookupByLibrary.simpleMessage("I corsi dello studente potrebbero non essere stati ancora pubblicati."), - "You’re all caught up!" : MessageLookupByLibrary.simpleMessage("Sei in pari!"), - "actingAsUser" : m0, - "alertsLabel" : MessageLookupByLibrary.simpleMessage("Avvisi"), - "appVersion" : m1, - "assignmentGradeAboveThreshold" : m2, - "assignmentGradeBelowThreshold" : m3, - "assignmentLockedModule" : m4, - "assignmentSubjectMessage" : m5, - "assignmentTotalPoints" : m6, - "assignmentTotalPointsAccessible" : m7, - "authorToNOthers" : m8, - "authorToRecipient" : m9, - "authorToRecipientAndNOthers" : m10, - "badgeNumberPlus" : m11, - "calendarLabel" : MessageLookupByLibrary.simpleMessage("Calendario"), - "canvasGuides" : MessageLookupByLibrary.simpleMessage("Guide Canvas"), - "canvasLogoLabel" : MessageLookupByLibrary.simpleMessage("Logo Canvas"), - "canvasSupport" : MessageLookupByLibrary.simpleMessage("Assistenza Canvas"), - "changeStudentColorLabel" : m12, - "collapse" : MessageLookupByLibrary.simpleMessage("comprimi"), - "collapsed" : MessageLookupByLibrary.simpleMessage("compresso"), - "contentDescriptionScoreOutOfPointsPossible" : m13, - "courseForWhom" : m14, - "courseGradeAboveThreshold" : m15, - "courseGradeBelowThreshold" : m16, - "coursesLabel" : MessageLookupByLibrary.simpleMessage("Corsi"), - "dateAtTime" : m17, - "dismissAlertLabel" : m18, - "domainSearchHelpBody" : m19, - "domainSearchHelpLabel" : MessageLookupByLibrary.simpleMessage("Come posso trovare la mia scuola o il mio distretto?"), - "domainSearchInputHint" : MessageLookupByLibrary.simpleMessage("Inserisci nome scuola o distretto…"), - "dueDateAtTime" : m20, - "endMasqueradeLogoutMessage" : m21, - "endMasqueradeMessage" : m22, - "eventSubjectMessage" : m23, - "eventTime" : m24, - "expand" : MessageLookupByLibrary.simpleMessage("estendi"), - "expanded" : MessageLookupByLibrary.simpleMessage("esteso"), - "finalGrade" : m25, - "findSchool" : MessageLookupByLibrary.simpleMessage("Trova scuola"), - "frontPageSubjectMessage" : m26, - "gradeFormatScoreOutOfPointsPossible" : m27, - "gradesSubjectMessage" : m28, - "latePenalty" : m29, - "me" : MessageLookupByLibrary.simpleMessage("me"), - "messageLinkPostscript" : m30, - "minus" : MessageLookupByLibrary.simpleMessage("meno"), - "mustBeAboveN" : m31, - "mustBeBelowN" : m32, - "next" : MessageLookupByLibrary.simpleMessage("Successivo"), - "nextMonth" : m33, - "nextWeek" : m34, - "noDomainResults" : m35, - "ok" : MessageLookupByLibrary.simpleMessage("OK"), - "outOfPoints" : m36, - "plusRecipientCount" : m37, - "pointsPossible" : m38, - "previousMonth" : m39, - "previousWeek" : m40, - "qrCreateAccountTos" : m41, - "ratingDialogEmailSubject" : m42, - "selectedMonthLabel" : m43, - "send" : MessageLookupByLibrary.simpleMessage("invia"), - "starRating" : m44, - "submissionStatusSuccessSubtitle" : m45, - "syllabusSubjectMessage" : m46, - "unread" : MessageLookupByLibrary.simpleMessage("non letto"), - "unreadCount" : m47 - }; -} diff --git a/apps/flutter_parent/lib/l10n/generated/messages_ja.dart b/apps/flutter_parent/lib/l10n/generated/messages_ja.dart deleted file mode 100644 index 9244fdbcff..0000000000 --- a/apps/flutter_parent/lib/l10n/generated/messages_ja.dart +++ /dev/null @@ -1,473 +0,0 @@ -// DO NOT EDIT. This is code generated via package:intl/generate_localized.dart -// This is a library that provides messages for a ja locale. All the -// messages from the main program should be duplicated here with the same -// function name. - -// Ignore issues from commonly used lints in this file. -// ignore_for_file:unnecessary_brace_in_string_interps, unnecessary_new -// ignore_for_file:prefer_single_quotes,comment_references, directives_ordering -// ignore_for_file:annotate_overrides,prefer_generic_function_type_aliases -// ignore_for_file:unused_import, file_names - -import 'package:intl/intl.dart'; -import 'package:intl/message_lookup_by_library.dart'; - -final messages = new MessageLookup(); - -typedef String MessageIfAbsent(String messageStr, List args); - -class MessageLookup extends MessageLookupByLibrary { - String get localeName => 'ja'; - - static m0(userName) => "あなたは${userName}として機能しています"; - - static m1(version) => "バージョン ${version}"; - - static m2(threshold) => "${threshold} 点を超える課題成績"; - - static m3(threshold) => "${threshold} 点未満の課題成績"; - - static m4(moduleName) => "この課題はモジュール \"${moduleName}\" によってロックされています。"; - - static m5(studentName, assignmentName) => "Re:${studentName}、課題 - ${assignmentName}"; - - static m6(points) => "${points} 点"; - - static m7(points) => "${points} 点"; - - static m8(authorName, howMany) => "${Intl.plural(howMany, one: '${authorName}から他 1 人', other: '${authorName}から他 ${howMany} 人')}"; - - static m9(authorName, recipientName) => "${authorName}から${recipientName}"; - - static m10(authorName, recipientName, howMany) => "${Intl.plural(howMany, one: '${authorName}から${recipientName}と他 1 人', other: '${authorName} から${recipientName}と他 ${howMany} 人')}"; - - static m11(count) => "${count}+"; - - static m12(studentName) => "${studentName}の色を変更する"; - - static m13(score, pointsPossible) => "${pointsPossible} 点中 ${score} 点"; - - static m14(studentShortName) => "${studentShortName}用"; - - static m15(threshold) => "${threshold} 点を超えるコース成績"; - - static m16(threshold) => "${threshold} 点未満のコース成績"; - - static m17(date, time) => "${date}、${time}"; - - static m18(alertTitle) => "${alertTitle}を却下する"; - - static m19(canvasGuides, canvasSupport) => "アクセスしようとしている学校または学区の名前を検索してみてください (「Smith Private School」または「Smith County Schools」など)。「Smith.instructure.com」などの Canvas ドメインを直接入力することもできます。\n\n教育機関の Canvas アカウントの検索に関する詳細については、${canvasGuides}にアクセスする、${canvasSupport}に問い合わせる、または学校に問い合わせてサポートを受けることができます。"; - - static m20(date, time) => "${date}、${time} 期限"; - - static m21(userName) => "${userName}として機能することを停止して、ログアウトされます。"; - - static m22(userName) => "${userName}として機能することを停止して、元のアカウントに戻ります。"; - - static m23(studentName, eventTitle) => "Re:${studentName}、イベント - ${eventTitle}"; - - static m24(startAt, endAt) => "${startAt} ~ ${endAt}"; - - static m25(grade) => "最終成績:${grade}"; - - static m26(studentName) => "Re:${studentName}、フロントページ"; - - static m27(score, pointsPossible) => "${score} / ${pointsPossible}"; - - static m28(studentName) => "Re:${studentName}、成績"; - - static m29(pointsLost) => "提出遅れペナルティ (-${pointsLost})"; - - static m30(studentName, linkUrl) => "Re:${studentName}さん、${linkUrl}"; - - static m31(percentage) => "${percentage} を超える必要があります"; - - static m32(percentage) => "${percentage} 未満にする必要があります"; - - static m33(month) => "来月:${month}"; - - static m34(date) => "${date} から始まる翌週"; - - static m35(query) => "\"${query}\"に一致する学校が見つかりません"; - - static m36(points, howMany) => "${Intl.plural(howMany, one: '1 ポイントから', other: '${points} ポイントから')}"; - - static m37(count) => "+${count}"; - - static m38(points) => "${points} の可能なポイント"; - - static m39(month) => "前月:${month}"; - - static m40(date) => "${date} から始まる前週"; - - static m41(termsOfService, privacyPolicy) => "[アカウントを作成]をタップすると、${termsOfService}に同意し、${privacyPolicy}を受け入れたことになります"; - - static m42(version) => "Android への提案 - Canvas Parent${version}"; - - static m43(month) => "${month} 月"; - - static m44(position) => "${Intl.plural(position, one: '${position} 星', other: '${position}星')}"; - - static m45(date, time) => "この課題は ${date} の ${time} に提出され、採点中です"; - - static m46(studentName) => "Re:${studentName}、シラバス"; - - static m47(count) => "未読 ${count} 件"; - - final messages = _notInlinedMessages(_notInlinedMessages); - static _notInlinedMessages(_) => { - "\"Act as\" is essentially logging in as this user without a password. You will be able to take any action as if you were this user, and from other users\' points of views, it will be as if this user performed them. However, audit logs record that you were the one who performed the actions on behalf of this user." : MessageLookupByLibrary.simpleMessage("\"機能する\"とは、基本的にパスワードなしでこのユーザーとしてログインすることです。このユーザーであるかのようにアクションを実行することができ、他のユーザーからは、このユーザーがそれらを実行したように見えますが、監査ログには、あなたがこのユーザーの代わりにアクションを実行したことが記録されます。"), - "-" : MessageLookupByLibrary.simpleMessage("-"), - "A description is required." : MessageLookupByLibrary.simpleMessage("説明は必須です。"), - "A network error occurred when adding this student. Check your connection and try again." : MessageLookupByLibrary.simpleMessage("この受講生を追加中にネットワークエラーが発生しました。接続をチェックして、もう一度やり直してください。"), - "A subject is required." : MessageLookupByLibrary.simpleMessage("件名は必須です。"), - "Act As User" : MessageLookupByLibrary.simpleMessage("ユーザーとして機能する"), - "Add Student" : MessageLookupByLibrary.simpleMessage("受講生を追加"), - "Add attachment" : MessageLookupByLibrary.simpleMessage("添付ファイルを追加する"), - "Add new student" : MessageLookupByLibrary.simpleMessage("新しい受講生を追加する"), - "Add student with…" : MessageLookupByLibrary.simpleMessage("次を使って受講生を追加します…"), - "Alert Settings" : MessageLookupByLibrary.simpleMessage("アラート設定"), - "Alert me when…" : MessageLookupByLibrary.simpleMessage("次の場合にアラートを送信…"), - "All Grading Periods" : MessageLookupByLibrary.simpleMessage("すべての採点期間"), - "Already have an account? " : MessageLookupByLibrary.simpleMessage("アカウントをすでにお持ちですか? "), - "An email address is required." : MessageLookupByLibrary.simpleMessage("E メールアドレスは必須です。"), - "An error occurred when trying to display this link" : MessageLookupByLibrary.simpleMessage("このリンクを表示しようとしてエラーが発生しました"), - "An error occurred while saving your selection. Please try again." : MessageLookupByLibrary.simpleMessage("選択の保存中にエラーが発生しました。再度試してください。"), - "An unexpected error occurred" : MessageLookupByLibrary.simpleMessage("予期しないエラーが発生しました"), - "Android OS version" : MessageLookupByLibrary.simpleMessage("Android OS バージョン"), - "Appearance" : MessageLookupByLibrary.simpleMessage("外観"), - "Application version" : MessageLookupByLibrary.simpleMessage("アプリケーションのバージョン"), - "Are you a student or teacher?" : MessageLookupByLibrary.simpleMessage("受講生と講師のどちらですか?"), - "Are you sure you want to log out?" : MessageLookupByLibrary.simpleMessage("ログアウトしてもよろしいですか?"), - "Are you sure you wish to close this page? Your unsent message will be lost." : MessageLookupByLibrary.simpleMessage("このページを閉じてもよろしいですか?送信されていないメッセージは失われます。"), - "Assignment Details" : MessageLookupByLibrary.simpleMessage("課題の詳細"), - "Assignment grade above" : MessageLookupByLibrary.simpleMessage("未満の課題成績"), - "Assignment grade below" : MessageLookupByLibrary.simpleMessage("を超える課題成績"), - "Assignment missing" : MessageLookupByLibrary.simpleMessage("課題がありません"), - "Barney, Fuschia" : MessageLookupByLibrary.simpleMessage("バーニー、フューシャ"), - "Calendars" : MessageLookupByLibrary.simpleMessage("予定表"), - "Camera Permission" : MessageLookupByLibrary.simpleMessage("カメラ許可"), - "Cancel" : MessageLookupByLibrary.simpleMessage("キャンセル"), - "Canvas Student" : MessageLookupByLibrary.simpleMessage("Canvas 受講生"), - "Canvas Teacher" : MessageLookupByLibrary.simpleMessage("Canvas 講師"), - "Canvas on GitHub" : MessageLookupByLibrary.simpleMessage("GitHub 上のキャンバス"), - "Choose a course to message" : MessageLookupByLibrary.simpleMessage("メッセージを送るコースを選択する"), - "Choose from Gallery" : MessageLookupByLibrary.simpleMessage("ギャラリーから選択する"), - "Complete" : MessageLookupByLibrary.simpleMessage("完了"), - "Contact Support" : MessageLookupByLibrary.simpleMessage("サポートに問い合わせる"), - "Course Announcement" : MessageLookupByLibrary.simpleMessage("コースのお知らせ"), - "Course Announcements" : MessageLookupByLibrary.simpleMessage("コースのお知らせ"), - "Course grade above" : MessageLookupByLibrary.simpleMessage("未満のコース成績"), - "Course grade below" : MessageLookupByLibrary.simpleMessage("を超えるコース成績"), - "Create Account" : MessageLookupByLibrary.simpleMessage("アカウントを作成する"), - "Dark Mode" : MessageLookupByLibrary.simpleMessage("ダークモード"), - "Date" : MessageLookupByLibrary.simpleMessage("日付"), - "Delete" : MessageLookupByLibrary.simpleMessage("削除"), - "Description" : MessageLookupByLibrary.simpleMessage("説明"), - "Device" : MessageLookupByLibrary.simpleMessage("デバイス"), - "Device model" : MessageLookupByLibrary.simpleMessage("デバイスモデル"), - "Domain" : MessageLookupByLibrary.simpleMessage("ドメイン"), - "Domain:" : MessageLookupByLibrary.simpleMessage("ドメイン:"), - "Don\'t show again" : MessageLookupByLibrary.simpleMessage("これ以上表示しないでください"), - "Done" : MessageLookupByLibrary.simpleMessage("終了"), - "Download" : MessageLookupByLibrary.simpleMessage("ダウンロード"), - "Due" : MessageLookupByLibrary.simpleMessage("期限"), - "EXTREME CRITICAL EMERGENCY!!" : MessageLookupByLibrary.simpleMessage("緊急事態です!"), - "Electric, blue" : MessageLookupByLibrary.simpleMessage("エレクトリック、ブルー"), - "Email Address" : MessageLookupByLibrary.simpleMessage("E メールアドレス"), - "Email:" : MessageLookupByLibrary.simpleMessage("E メール:"), - "Email…" : MessageLookupByLibrary.simpleMessage("メールアドレス..."), - "Enter the student pairing code provided to you. If the pairing code doesn\'t work, it may have expired" : MessageLookupByLibrary.simpleMessage("提供されている受講生ペアリングコードを入力してください。ペアリングコードが機能しない場合は、有効期限が切れているかもしれません"), - "Event" : MessageLookupByLibrary.simpleMessage("イベント"), - "Excused" : MessageLookupByLibrary.simpleMessage("免除"), - "Expired QR Code" : MessageLookupByLibrary.simpleMessage("期限切れのQRコード"), - "Failed. Tap for options." : MessageLookupByLibrary.simpleMessage("失敗しました。タップしてオプションを表示してください。"), - "Filter" : MessageLookupByLibrary.simpleMessage("フィルタ"), - "Filter by" : MessageLookupByLibrary.simpleMessage("フィルタ条件"), - "Fire, Orange" : MessageLookupByLibrary.simpleMessage("ファイアー、オレンジ"), - "Front Page" : MessageLookupByLibrary.simpleMessage("フロントページ"), - "Full Name" : MessageLookupByLibrary.simpleMessage("フルネーム"), - "Full Name…" : MessageLookupByLibrary.simpleMessage("フルネーム..."), - "Full error message" : MessageLookupByLibrary.simpleMessage("完全なエラーメッセージ"), - "Go to today" : MessageLookupByLibrary.simpleMessage("今日に進む"), - "Grade" : MessageLookupByLibrary.simpleMessage("成績"), - "Grade percentage" : MessageLookupByLibrary.simpleMessage("成績パーセンテージ"), - "Graded" : MessageLookupByLibrary.simpleMessage("採点済み"), - "Grades" : MessageLookupByLibrary.simpleMessage("成績"), - "Help" : MessageLookupByLibrary.simpleMessage("ヘルプ"), - "Hide Password" : MessageLookupByLibrary.simpleMessage("パスワードを非表示にする"), - "High Contrast Mode" : MessageLookupByLibrary.simpleMessage("高コントラストモード"), - "How are we doing?" : MessageLookupByLibrary.simpleMessage("私たちはどうですか?"), - "How is this affecting you?" : MessageLookupByLibrary.simpleMessage("これはあなたにどのような影響を与えていますか?"), - "I can\'t get things done until I hear back from you." : MessageLookupByLibrary.simpleMessage("返事がくるまで何もできません。"), - "I don\'t have a Canvas account" : MessageLookupByLibrary.simpleMessage("Canvasアカウントを持っていません"), - "I have a Canvas account" : MessageLookupByLibrary.simpleMessage("Canvasアカウントを持っています"), - "I need some help but it\'s not urgent." : MessageLookupByLibrary.simpleMessage("急ぎではありませんが、サポートが必要です。"), - "I\'m having trouble logging in" : MessageLookupByLibrary.simpleMessage("ログインできません"), - "Idea for Canvas Parent App [Android]" : MessageLookupByLibrary.simpleMessage("Canvas Parent アプリ [Android] へのアイデア"), - "In order to provide you with a better experience, we have updated how reminders work. You can add new reminders by viewing an assignment or calendar event and tapping the switch under the \"Remind Me\" section.\n\nBe aware that any reminders created with older versions of this app will not be compatible with the new changes and you will need to create them again." : MessageLookupByLibrary.simpleMessage("より良いエクスペリエンスを提供できるように、リマインダの機能を更新しました。新しいリマインダを追加するには、課題またはカレンダーの予定を表示し、[リマインダ]セクションのスイッチをタップします。\n\nこのアプリの古いバージョンで作成されたリマインダは、新しい変更と互換性がなく、再度作成する必要があるので注意してください。"), - "Inbox" : MessageLookupByLibrary.simpleMessage("受信トレイ"), - "Inbox Zero" : MessageLookupByLibrary.simpleMessage("受信トレイゼロ"), - "Incomplete" : MessageLookupByLibrary.simpleMessage("未完了"), - "Incorrect Domain" : MessageLookupByLibrary.simpleMessage("不正なドメイン"), - "Institution Announcement" : MessageLookupByLibrary.simpleMessage("学校のお知らせ"), - "Institution Announcements" : MessageLookupByLibrary.simpleMessage("学校のお知らせ"), - "Instructions" : MessageLookupByLibrary.simpleMessage("指示"), - "Interactions on this page are limited by your institution." : MessageLookupByLibrary.simpleMessage("このページでのやり取りは、学校によって制限されています。"), - "Invalid QR Code" : MessageLookupByLibrary.simpleMessage("無効なQRコード"), - "It looks like a great day to rest, relax, and recharge." : MessageLookupByLibrary.simpleMessage("休息をとってリラックスし、充電するためにぴったりな日のようです。"), - "It looks like assignments haven\'t been created in this space yet." : MessageLookupByLibrary.simpleMessage("このスペースでは、まだ課題が作成されていないようです。"), - "Just a casual question, comment, idea, suggestion…" : MessageLookupByLibrary.simpleMessage("ちょっとした疑問、コメント、アイデア、提案です…"), - "Late" : MessageLookupByLibrary.simpleMessage("提出遅れ"), - "Launch External Tool" : MessageLookupByLibrary.simpleMessage("外部ツールを起動する"), - "Legal" : MessageLookupByLibrary.simpleMessage("法令"), - "Light Mode" : MessageLookupByLibrary.simpleMessage("ライトモード"), - "Link Error" : MessageLookupByLibrary.simpleMessage("リンクエラー"), - "Locale:" : MessageLookupByLibrary.simpleMessage("ロケール:"), - "Locate QR Code" : MessageLookupByLibrary.simpleMessage("QR コードを探す"), - "Location" : MessageLookupByLibrary.simpleMessage("場所"), - "Locked" : MessageLookupByLibrary.simpleMessage("ロックされています"), - "Log Out" : MessageLookupByLibrary.simpleMessage("ログアウト"), - "Login flow: Canvas" : MessageLookupByLibrary.simpleMessage("ログインフロー:Canvas"), - "Login flow: Normal" : MessageLookupByLibrary.simpleMessage("ログインフロー:標準"), - "Login flow: Site Admin" : MessageLookupByLibrary.simpleMessage("ログインフロー:サイト管理者"), - "Login flow: Skip mobile verify" : MessageLookupByLibrary.simpleMessage("ログインフロー:モバイル検証を省略する"), - "Manage Students" : MessageLookupByLibrary.simpleMessage("受講生を管理する"), - "Message" : MessageLookupByLibrary.simpleMessage("メッセージ"), - "Message subject" : MessageLookupByLibrary.simpleMessage("メッセージの件名"), - "Missing" : MessageLookupByLibrary.simpleMessage("提出なし"), - "Must be below 100" : MessageLookupByLibrary.simpleMessage("100 未満にする必要があります"), - "Network error" : MessageLookupByLibrary.simpleMessage("ネットワークエラー"), - "Never" : MessageLookupByLibrary.simpleMessage("今後実行しない"), - "New message" : MessageLookupByLibrary.simpleMessage("新規メッセージ"), - "No" : MessageLookupByLibrary.simpleMessage("いいえ"), - "No Alerts" : MessageLookupByLibrary.simpleMessage("アラートはありません"), - "No Assignments" : MessageLookupByLibrary.simpleMessage("課題はありません"), - "No Courses" : MessageLookupByLibrary.simpleMessage("コースはありません"), - "No Due Date" : MessageLookupByLibrary.simpleMessage("締切日なし"), - "No Events Today!" : MessageLookupByLibrary.simpleMessage("今日イベントはありません!"), - "No Grade" : MessageLookupByLibrary.simpleMessage("成績はありません"), - "No Location Specified" : MessageLookupByLibrary.simpleMessage("場所が指定されていません"), - "No Students" : MessageLookupByLibrary.simpleMessage("受講生はいません"), - "No Subject" : MessageLookupByLibrary.simpleMessage("件名なし"), - "No Summary" : MessageLookupByLibrary.simpleMessage("サマリーはありません"), - "No description" : MessageLookupByLibrary.simpleMessage("説明なし"), - "No recipients selected" : MessageLookupByLibrary.simpleMessage("受信者が選択されていません"), - "Not Graded" : MessageLookupByLibrary.simpleMessage("未採点"), - "Not Submitted" : MessageLookupByLibrary.simpleMessage("未提出"), - "Not a parent?" : MessageLookupByLibrary.simpleMessage("親ではありませんか?"), - "Notifications for reminders about assignments and calendar events" : MessageLookupByLibrary.simpleMessage("課題と予定表イベントに関するリマインダの通知"), - "OS Version" : MessageLookupByLibrary.simpleMessage("OS バージョン"), - "Observer" : MessageLookupByLibrary.simpleMessage("オブザーバー"), - "One of our other apps might be a better fit. Tap one to visit the Play Store." : MessageLookupByLibrary.simpleMessage("他のアプリのいずれかが、より適切かもしれません。ひとつをタップして Play Store にアクセスしてください。"), - "Open Canvas Student" : MessageLookupByLibrary.simpleMessage("Open Canvas受講生"), - "Open In Browser" : MessageLookupByLibrary.simpleMessage("ブラウザで開く"), - "Open with another app" : MessageLookupByLibrary.simpleMessage("別のアプリで開く"), - "Pairing Code" : MessageLookupByLibrary.simpleMessage("ペアリングコード"), - "Password" : MessageLookupByLibrary.simpleMessage("パスワード"), - "Password is required" : MessageLookupByLibrary.simpleMessage("パスワードは必須です"), - "Password must contain at least 8 characters" : MessageLookupByLibrary.simpleMessage("パスワードは最低8文字なければなりません"), - "Password…" : MessageLookupByLibrary.simpleMessage("パスワード..."), - "Planner Note" : MessageLookupByLibrary.simpleMessage("計画者メモ"), - "Please enter a valid email address" : MessageLookupByLibrary.simpleMessage("有効なメールアドレスを記入してください"), - "Please enter an email address" : MessageLookupByLibrary.simpleMessage("メールアドレスを入力してください"), - "Please enter full name" : MessageLookupByLibrary.simpleMessage("姓名を入力してください"), - "Please scan a QR code generated by Canvas" : MessageLookupByLibrary.simpleMessage("Canvas によって生成された QR コードをスキャンしてください"), - "Plum, Purple" : MessageLookupByLibrary.simpleMessage("プラム、パープル"), - "Preparing…" : MessageLookupByLibrary.simpleMessage("準備しています…"), - "Previous Logins" : MessageLookupByLibrary.simpleMessage("以前のログイン"), - "Privacy Policy" : MessageLookupByLibrary.simpleMessage("個人情報保護方針"), - "Privacy Policy Link" : MessageLookupByLibrary.simpleMessage("個人情報保護方針リンク"), - "Privacy policy, terms of use, open source" : MessageLookupByLibrary.simpleMessage("プライバシーポリシー、利用規約、オープンソース"), - "QR Code" : MessageLookupByLibrary.simpleMessage("QR コード"), - "QR scanning requires camera access" : MessageLookupByLibrary.simpleMessage("QRスキャンにはカメラへのアクセスが必要です"), - "Raspberry, Red" : MessageLookupByLibrary.simpleMessage("ラズベリー、レッド"), - "Recipients" : MessageLookupByLibrary.simpleMessage("受信者"), - "Refresh" : MessageLookupByLibrary.simpleMessage("更新"), - "Remind Me" : MessageLookupByLibrary.simpleMessage("リマインドする"), - "Reminders" : MessageLookupByLibrary.simpleMessage("リマインダ"), - "Reminders have changed!" : MessageLookupByLibrary.simpleMessage("リマインダが変更されました!"), - "Reply" : MessageLookupByLibrary.simpleMessage("返信"), - "Reply All" : MessageLookupByLibrary.simpleMessage("全員に返信"), - "Report A Problem" : MessageLookupByLibrary.simpleMessage("問題を報告する"), - "Request Login Help" : MessageLookupByLibrary.simpleMessage("ログインサポートをリクエストする"), - "Request Login Help Button" : MessageLookupByLibrary.simpleMessage("ログインサポートのリクエストボタン"), - "Restart app" : MessageLookupByLibrary.simpleMessage("アプリを再起動"), - "Retry" : MessageLookupByLibrary.simpleMessage("再試行"), - "Return to Login" : MessageLookupByLibrary.simpleMessage("ログインに戻る"), - "STUDENT" : MessageLookupByLibrary.simpleMessage("受講生"), - "Screenshot showing location of QR code generation in browser" : MessageLookupByLibrary.simpleMessage("ブラウザ内の QR コード生成の場所を示すスクリーンショット"), - "Screenshot showing location of pairing QR code generation in the Canvas Student app" : MessageLookupByLibrary.simpleMessage("Canvas StudentアプリでのQRコード生成のペアリングの場所を示すスクリーンショット"), - "Select" : MessageLookupByLibrary.simpleMessage("選択"), - "Select Student Color" : MessageLookupByLibrary.simpleMessage("受講生の色を選択する"), - "Select recipients" : MessageLookupByLibrary.simpleMessage("受信者を選択する"), - "Send Feedback" : MessageLookupByLibrary.simpleMessage("フィードバックを送信する"), - "Send a message about this assignment" : MessageLookupByLibrary.simpleMessage("この課題についてメッセージを送信する"), - "Send a message about this course" : MessageLookupByLibrary.simpleMessage("このコースに関するメッセージを送信する"), - "Send message" : MessageLookupByLibrary.simpleMessage("メッセージを送信する"), - "Set a date and time to be notified of this event." : MessageLookupByLibrary.simpleMessage("このイベントの通知を受ける日付と時間を設定します。"), - "Set a date and time to be notified of this specific assignment." : MessageLookupByLibrary.simpleMessage("この特定の課題について通知を受ける日付と時間を設定します。"), - "Settings" : MessageLookupByLibrary.simpleMessage("設定"), - "Shamrock, Green" : MessageLookupByLibrary.simpleMessage("シャムロック、グリーン"), - "Share Your Love for the App" : MessageLookupByLibrary.simpleMessage("アプリへの愛を共有しましょう"), - "Show Password" : MessageLookupByLibrary.simpleMessage("パスワードを表示する"), - "Sign In" : MessageLookupByLibrary.simpleMessage("サインイン"), - "Something went wrong trying to create your account, please reach out to your school for assistance." : MessageLookupByLibrary.simpleMessage("アカウントを作成しようとしたときに問題が発生しました。学校に連絡して支援を求めてください。"), - "Something\'s broken but I can work around it to get what I need done." : MessageLookupByLibrary.simpleMessage("何かが機能していないのですが、必要なことはそれを使わずに実行できます。"), - "Stop Acting as User" : MessageLookupByLibrary.simpleMessage("ユーザーとしての機能を停止する"), - "Student" : MessageLookupByLibrary.simpleMessage("受講者"), - "Student Pairing" : MessageLookupByLibrary.simpleMessage("受講生のペアリング"), - "Students can create a QR code using the Canvas Student app on their mobile device" : MessageLookupByLibrary.simpleMessage("受講生はモバイルデバイスのCanvas Studentアプリを使用してQRコードを作成できます"), - "Students can obtain a pairing code through the Canvas website" : MessageLookupByLibrary.simpleMessage("受講生はCanvas Webサイトからペアリングコードを取得できます"), - "Subject" : MessageLookupByLibrary.simpleMessage("件名"), - "Submitted" : MessageLookupByLibrary.simpleMessage("提出済み"), - "Successfully submitted!" : MessageLookupByLibrary.simpleMessage("正常に提出されました!"), - "Summary" : MessageLookupByLibrary.simpleMessage("概要"), - "Switch Users" : MessageLookupByLibrary.simpleMessage("ユーザーを切り替える"), - "Syllabus" : MessageLookupByLibrary.simpleMessage("シラバス"), - "TA" : MessageLookupByLibrary.simpleMessage("TA"), - "TEACHER" : MessageLookupByLibrary.simpleMessage("講師"), - "Tap to favorite the courses you want to see on the Calendar. Select up to 10." : MessageLookupByLibrary.simpleMessage("タップして予定表に表示したいコースをお気に入りにします。10まで選んでください。"), - "Tap to pair with a new student" : MessageLookupByLibrary.simpleMessage("タップして新しい受講生とペアにします"), - "Tap to select this student" : MessageLookupByLibrary.simpleMessage("タップしてこの受講生を選択します"), - "Tap to show student selector" : MessageLookupByLibrary.simpleMessage("タップして受講生セレクタを表示します"), - "Teacher" : MessageLookupByLibrary.simpleMessage("講師"), - "Tell us about your favorite parts of the app" : MessageLookupByLibrary.simpleMessage("このアプリの好きな部分を教えてください"), - "Terms of Service" : MessageLookupByLibrary.simpleMessage("サービス利用規約"), - "Terms of Service Link" : MessageLookupByLibrary.simpleMessage("サービス利用規約リンク"), - "Terms of Use" : MessageLookupByLibrary.simpleMessage("利用規約"), - "The QR code you scanned may have expired. Refresh the code on the student\'s device and try again." : MessageLookupByLibrary.simpleMessage("スキャンしたQRコードの有効期限が切れている可能性があります。受講生のデバイスでコードを更新して、もう一度やり直してください。"), - "The following information will help us better understand your idea:" : MessageLookupByLibrary.simpleMessage("次の情報は、Canvas があなたのアイデアをより良く理解するために役立ちます:"), - "The server you entered is not authorized for this app." : MessageLookupByLibrary.simpleMessage("入力されたサーバーは、このアプリ用に許可されていません。"), - "The student you are trying to add belongs to a different school. Log in or create an account with that school to scan this code." : MessageLookupByLibrary.simpleMessage("追加しようとしている受講生は、別の学校に所属しています。このコードをスキャンするには、その学校にログインするかアカウントを作成してください。"), - "The user agent for this app is not authorized." : MessageLookupByLibrary.simpleMessage("このアプリのユーザーエージェントは許可されていません。"), - "Theme" : MessageLookupByLibrary.simpleMessage("テーマ"), - "There are no installed applications that can open this file" : MessageLookupByLibrary.simpleMessage("このファイルを開くことができるアプリケーションがインストールされていません"), - "There is no page information available." : MessageLookupByLibrary.simpleMessage("利用できるページ情報はありません。"), - "There was a problem loading the Terms of Use" : MessageLookupByLibrary.simpleMessage("利用規約のロード中に問題が発生しました"), - "There was a problem removing this student from your account. Please check your connection and try again." : MessageLookupByLibrary.simpleMessage("この受講生をアカウントから削除する際に問題が発生しました。接続を確認して、もう一度お試しください。"), - "There was an error loading recipients for this course" : MessageLookupByLibrary.simpleMessage("このコースの受信者のロード中にエラーが発生しました。"), - "There was an error loading the summary details for this course." : MessageLookupByLibrary.simpleMessage("このコースのサマリー詳細のロード中にエラーが発生しました。"), - "There was an error loading this announcement" : MessageLookupByLibrary.simpleMessage("このお知らせのロード中にエラーが発生しました"), - "There was an error loading this conversation" : MessageLookupByLibrary.simpleMessage("この会話のロード中にエラーが発生しました"), - "There was an error loading this file" : MessageLookupByLibrary.simpleMessage("このファイルのロード中にエラーが発生しました"), - "There was an error loading your inbox messages." : MessageLookupByLibrary.simpleMessage("受信トレイメッセージのロード中にエラーが発生しました。"), - "There was an error loading your student\'s alerts." : MessageLookupByLibrary.simpleMessage("受講生のアラートのロード中にエラーが発生しました"), - "There was an error loading your student\'s calendar" : MessageLookupByLibrary.simpleMessage("受講生の予定表のロード中にエラーが発生しました"), - "There was an error loading your students." : MessageLookupByLibrary.simpleMessage("受講生のロード中にエラーが発生しました。"), - "There was an error loading your student’s courses." : MessageLookupByLibrary.simpleMessage("受講生のコースを読み込み中にエラーが発生しました。"), - "There was an error logging in. Please generate another QR Code and try again." : MessageLookupByLibrary.simpleMessage("ログイン中にエラーが発生しました。別の QR コードを生成して再試行してください。"), - "There was an error trying to act as this user. Please check the Domain and User ID and try again." : MessageLookupByLibrary.simpleMessage("このユーザーとして機能しようとしてエラーが発生しました。ドメインとユーザー ID をチェックしてから、再試行してください。"), - "There’s nothing to be notified of yet." : MessageLookupByLibrary.simpleMessage("通知する事柄はまだ何もありません。"), - "This app is not authorized for use." : MessageLookupByLibrary.simpleMessage("このアプリは使用を許可されていません。"), - "This course does not have any assignments or calendar events yet." : MessageLookupByLibrary.simpleMessage("このコースには、まだ課題または予定表イベントがありません。"), - "This file is unsupported and can’t be viewed through the app" : MessageLookupByLibrary.simpleMessage("このファイルはサポートされておらず、アプリで表示できません"), - "This will unpair and remove all enrollments for this student from your account." : MessageLookupByLibrary.simpleMessage("これにより、この受講生の登録がすべて解除され、アカウントから削除されます。"), - "Total Grade" : MessageLookupByLibrary.simpleMessage("合計成績"), - "Uh oh!" : MessageLookupByLibrary.simpleMessage("エラーです!"), - "Unable to fetch courses. Please check your connection and try again." : MessageLookupByLibrary.simpleMessage("コースを取得できません。接続を確認して、もう一度お試しください。"), - "Unable to load this image" : MessageLookupByLibrary.simpleMessage("このイメージをロードできません"), - "Unable to play this media file" : MessageLookupByLibrary.simpleMessage("このメディアファイルを再生できません"), - "Unable to send message. Check your connection and try again." : MessageLookupByLibrary.simpleMessage("メッセージを送信できません。接続をチェックして、もう一度やり直してください。"), - "Under Construction" : MessageLookupByLibrary.simpleMessage("工事中"), - "Unknown User" : MessageLookupByLibrary.simpleMessage("不明のユーザー"), - "Unsaved changes" : MessageLookupByLibrary.simpleMessage("変更が保存されていません"), - "Unsupported File" : MessageLookupByLibrary.simpleMessage("サポートされないファイル"), - "Upload File" : MessageLookupByLibrary.simpleMessage("ファイルをアップロードする"), - "Use Camera" : MessageLookupByLibrary.simpleMessage("カメラを使用する"), - "Use Dark Theme in Web Content" : MessageLookupByLibrary.simpleMessage("ウェブコンテンツでダークテーマを使用する"), - "User ID" : MessageLookupByLibrary.simpleMessage("ユーザー ID"), - "User ID:" : MessageLookupByLibrary.simpleMessage("ユーザー ID:"), - "Version Number" : MessageLookupByLibrary.simpleMessage("バージョン番号"), - "View Description" : MessageLookupByLibrary.simpleMessage("説明を表示"), - "View error details" : MessageLookupByLibrary.simpleMessage("エラーの詳細を表示"), - "View the Privacy Policy" : MessageLookupByLibrary.simpleMessage("プライバシーポリシーを表示する"), - "We are currently building this feature for your viewing pleasure." : MessageLookupByLibrary.simpleMessage("現在、皆さんにお楽しみいただく機能を構築中です。"), - "We are unable to display this link, it may belong to an institution you currently aren\'t logged in to." : MessageLookupByLibrary.simpleMessage("このリンクを表示することができません。このリンクは、現在ログインしていない学校のものである可能性があります。"), - "We couldn\'t find any students associated with this account" : MessageLookupByLibrary.simpleMessage("このアカウントに関連付けられている受講生を見つけることができませんでした"), - "We were unable to verify the server for use with this app." : MessageLookupByLibrary.simpleMessage("このアプリで使用するサーバーを検証できませんでした。"), - "We’re not sure what happened, but it wasn’t good. Contact us if this keeps happening." : MessageLookupByLibrary.simpleMessage("何が起こったかはわかりませんが、問題が発生したようです。問題が解決されない場合は、Canvas までお問い合わせください。"), - "What can we do better?" : MessageLookupByLibrary.simpleMessage("改善する余地はどこにあるでしょう?"), - "Yes" : MessageLookupByLibrary.simpleMessage("はい"), - "You are not observing any students." : MessageLookupByLibrary.simpleMessage("どの受講生もオブザーブしていません。"), - "You may only choose 10 calendars to display" : MessageLookupByLibrary.simpleMessage("表示するカレンダーは10個だけ選択できます"), - "You must enter a user id" : MessageLookupByLibrary.simpleMessage("ユーザー ID を入力する必要があります"), - "You must enter a valid domain" : MessageLookupByLibrary.simpleMessage("有効なドメインを入力する必要があります"), - "You must select at least one calendar to display" : MessageLookupByLibrary.simpleMessage("少なくともひとつのカレンダーを選択しなければなりません。"), - "You will be notified about this assignment on…" : MessageLookupByLibrary.simpleMessage("…にこの課題に関する通知を受けます。"), - "You will be notified about this event on…" : MessageLookupByLibrary.simpleMessage("次の予定でこのイベントに関する通知を受けます…"), - "You\'ll find the QR code on the web in your account profile. Click \'QR for Mobile Login\' in the list." : MessageLookupByLibrary.simpleMessage("QRコードは、アカウントプロファイルのウェブ上にあります。リストの[モバイルログインのQR]をクリックしてください。"), - "You\'ll need to open your student\'s Canvas Student app to continue. Go into Main Menu > Settings > Pair with Observer and scan the QR code you see there." : MessageLookupByLibrary.simpleMessage("続行するには、受講生のCanvas Studentアプリを開く必要があります。メインメニュー > [設定] > [オブザーバーとのペアリング]に移動し、そこに表示されるQRコードをスキャンしてください。"), - "Your code is incorrect or expired." : MessageLookupByLibrary.simpleMessage("コードが間違っているか、期限が切れています。"), - "Your student’s courses might not be published yet." : MessageLookupByLibrary.simpleMessage("受講生のコースはまだ公開されていない可能性があります"), - "You’re all caught up!" : MessageLookupByLibrary.simpleMessage("コンテンツは以上です!"), - "actingAsUser" : m0, - "alertsLabel" : MessageLookupByLibrary.simpleMessage("アラート"), - "appVersion" : m1, - "assignmentGradeAboveThreshold" : m2, - "assignmentGradeBelowThreshold" : m3, - "assignmentLockedModule" : m4, - "assignmentSubjectMessage" : m5, - "assignmentTotalPoints" : m6, - "assignmentTotalPointsAccessible" : m7, - "authorToNOthers" : m8, - "authorToRecipient" : m9, - "authorToRecipientAndNOthers" : m10, - "badgeNumberPlus" : m11, - "calendarLabel" : MessageLookupByLibrary.simpleMessage("予定表"), - "canvasGuides" : MessageLookupByLibrary.simpleMessage("Canvas ガイド"), - "canvasLogoLabel" : MessageLookupByLibrary.simpleMessage("Canvas ロゴ"), - "canvasSupport" : MessageLookupByLibrary.simpleMessage("Canvas サポート"), - "changeStudentColorLabel" : m12, - "collapse" : MessageLookupByLibrary.simpleMessage("折りたたむ"), - "collapsed" : MessageLookupByLibrary.simpleMessage("折りたたみ"), - "contentDescriptionScoreOutOfPointsPossible" : m13, - "courseForWhom" : m14, - "courseGradeAboveThreshold" : m15, - "courseGradeBelowThreshold" : m16, - "coursesLabel" : MessageLookupByLibrary.simpleMessage("コース"), - "dateAtTime" : m17, - "dismissAlertLabel" : m18, - "domainSearchHelpBody" : m19, - "domainSearchHelpLabel" : MessageLookupByLibrary.simpleMessage("私の学校または学区はどのように見つければよいですか?"), - "domainSearchInputHint" : MessageLookupByLibrary.simpleMessage("学校名または学区を入力してください…"), - "dueDateAtTime" : m20, - "endMasqueradeLogoutMessage" : m21, - "endMasqueradeMessage" : m22, - "eventSubjectMessage" : m23, - "eventTime" : m24, - "expand" : MessageLookupByLibrary.simpleMessage("さらに表示する"), - "expanded" : MessageLookupByLibrary.simpleMessage("拡大"), - "finalGrade" : m25, - "findSchool" : MessageLookupByLibrary.simpleMessage("学校を探す"), - "frontPageSubjectMessage" : m26, - "gradeFormatScoreOutOfPointsPossible" : m27, - "gradesSubjectMessage" : m28, - "latePenalty" : m29, - "me" : MessageLookupByLibrary.simpleMessage("私"), - "messageLinkPostscript" : m30, - "minus" : MessageLookupByLibrary.simpleMessage("マイナス"), - "mustBeAboveN" : m31, - "mustBeBelowN" : m32, - "next" : MessageLookupByLibrary.simpleMessage("次へ"), - "nextMonth" : m33, - "nextWeek" : m34, - "noDomainResults" : m35, - "ok" : MessageLookupByLibrary.simpleMessage("OK"), - "outOfPoints" : m36, - "plusRecipientCount" : m37, - "pointsPossible" : m38, - "previousMonth" : m39, - "previousWeek" : m40, - "qrCreateAccountTos" : m41, - "ratingDialogEmailSubject" : m42, - "selectedMonthLabel" : m43, - "send" : MessageLookupByLibrary.simpleMessage("送信"), - "starRating" : m44, - "submissionStatusSuccessSubtitle" : m45, - "syllabusSubjectMessage" : m46, - "unread" : MessageLookupByLibrary.simpleMessage("未読"), - "unreadCount" : m47 - }; -} diff --git a/apps/flutter_parent/lib/l10n/generated/messages_messages.dart b/apps/flutter_parent/lib/l10n/generated/messages_messages.dart deleted file mode 100644 index 69e3428c6a..0000000000 --- a/apps/flutter_parent/lib/l10n/generated/messages_messages.dart +++ /dev/null @@ -1,473 +0,0 @@ -// DO NOT EDIT. This is code generated via package:intl/generate_localized.dart -// This is a library that provides messages for a messages locale. All the -// messages from the main program should be duplicated here with the same -// function name. - -// Ignore issues from commonly used lints in this file. -// ignore_for_file:unnecessary_brace_in_string_interps, unnecessary_new -// ignore_for_file:prefer_single_quotes,comment_references, directives_ordering -// ignore_for_file:annotate_overrides,prefer_generic_function_type_aliases -// ignore_for_file:unused_import, file_names - -import 'package:intl/intl.dart'; -import 'package:intl/message_lookup_by_library.dart'; - -final messages = new MessageLookup(); - -typedef String MessageIfAbsent(String messageStr, List args); - -class MessageLookup extends MessageLookupByLibrary { - String get localeName => 'messages'; - - static m0(userName) => "You are acting as ${userName}"; - - static m1(version) => "v. ${version}"; - - static m2(threshold) => "Assignment Grade Above ${threshold}"; - - static m3(threshold) => "Assignment Grade Below ${threshold}"; - - static m4(moduleName) => "This assignment is locked by the module \"${moduleName}\"."; - - static m5(studentName, assignmentName) => "Regarding: ${studentName}, Assignment - ${assignmentName}"; - - static m6(points) => "${points} pts"; - - static m7(points) => "${points} points"; - - static m8(authorName, howMany) => "${Intl.plural(howMany, one: '${authorName} to 1 other', other: '${authorName} to ${howMany} others')}"; - - static m9(authorName, recipientName) => "${authorName} to ${recipientName}"; - - static m10(authorName, recipientName, howMany) => "${Intl.plural(howMany, one: '${authorName} to ${recipientName} & 1 other', other: '${authorName} to ${recipientName} & ${howMany} others')}"; - - static m11(count) => "${count}+"; - - static m12(studentName) => "Change color for ${studentName}"; - - static m13(score, pointsPossible) => "${score} out of ${pointsPossible} points"; - - static m14(studentShortName) => "for ${studentShortName}"; - - static m15(threshold) => "Course Grade Above ${threshold}"; - - static m16(threshold) => "Course Grade Below ${threshold}"; - - static m17(date, time) => "${date} at ${time}"; - - static m18(alertTitle) => "Dismiss ${alertTitle}"; - - static m19(canvasGuides, canvasSupport) => "Try searching for the name of the school or district you’re attempting to access, like “Smith Private School” or “Smith County Schools.” You can also enter a Canvas domain directly, like “smith.instructure.com.”\n\nFor more information on finding your institution’s Canvas account, you can visit the ${canvasGuides}, reach out to ${canvasSupport}, or contact your school for assistance."; - - static m20(date, time) => "Due ${date} at ${time}"; - - static m21(userName) => "You will stop acting as ${userName} and will be logged out."; - - static m22(userName) => "You will stop acting as ${userName} and return to your original account."; - - static m23(studentName, eventTitle) => "Regarding: ${studentName}, Event - ${eventTitle}"; - - static m24(startAt, endAt) => "${startAt} - ${endAt}"; - - static m25(grade) => "Final Grade: ${grade}"; - - static m26(studentName) => "Regarding: ${studentName}, Front Page"; - - static m27(score, pointsPossible) => "${score} / ${pointsPossible}"; - - static m28(studentName) => "Regarding: ${studentName}, Grades"; - - static m29(pointsLost) => "Late penalty (-${pointsLost})"; - - static m30(studentName, linkUrl) => "Regarding: ${studentName}, ${linkUrl}"; - - static m31(percentage) => "Must be above ${percentage}"; - - static m32(percentage) => "Must be below ${percentage}"; - - static m33(month) => "Next month: ${month}"; - - static m34(date) => "Next week starting ${date}"; - - static m35(query) => "Unable to find schools matching \"${query}\""; - - static m36(points, howMany) => "${Intl.plural(howMany, one: 'Out of 1 point', other: 'Out of ${points} points')}"; - - static m37(count) => "+${count}"; - - static m38(points) => "${points} points possible"; - - static m39(month) => "Previous month: ${month}"; - - static m40(date) => "Previous week starting ${date}"; - - static m41(termsOfService, privacyPolicy) => "By tapping \'Create Account\', you agree to the ${termsOfService} and acknowledge the ${privacyPolicy}"; - - static m42(version) => "Suggestions for Android - Canvas Parent ${version}"; - - static m43(month) => "Month of ${month}"; - - static m44(position) => "${Intl.plural(position, one: '${position} star', other: '${position} stars')}"; - - static m45(date, time) => "This assignment was submitted on ${date} at ${time} and is waiting to be graded"; - - static m46(studentName) => "Regarding: ${studentName}, Syllabus"; - - static m47(count) => "${count} unread"; - - final messages = _notInlinedMessages(_notInlinedMessages); - static _notInlinedMessages(_) => { - "\"Act as\" is essentially logging in as this user without a password. You will be able to take any action as if you were this user, and from other users\' points of views, it will be as if this user performed them. However, audit logs record that you were the one who performed the actions on behalf of this user." : MessageLookupByLibrary.simpleMessage("\"Act as\" is essentially logging in as this user without a password. You will be able to take any action as if you were this user, and from other users\' points of views, it will be as if this user performed them. However, audit logs record that you were the one who performed the actions on behalf of this user."), - "-" : MessageLookupByLibrary.simpleMessage("-"), - "A description is required." : MessageLookupByLibrary.simpleMessage("A description is required."), - "A network error occurred when adding this student. Check your connection and try again." : MessageLookupByLibrary.simpleMessage("A network error occurred when adding this student. Check your connection and try again."), - "A subject is required." : MessageLookupByLibrary.simpleMessage("A subject is required."), - "Act As User" : MessageLookupByLibrary.simpleMessage("Act As User"), - "Add Student" : MessageLookupByLibrary.simpleMessage("Add Student"), - "Add attachment" : MessageLookupByLibrary.simpleMessage("Add attachment"), - "Add new student" : MessageLookupByLibrary.simpleMessage("Add new student"), - "Add student with…" : MessageLookupByLibrary.simpleMessage("Add student with…"), - "Alert Settings" : MessageLookupByLibrary.simpleMessage("Alert Settings"), - "Alert me when…" : MessageLookupByLibrary.simpleMessage("Alert me when…"), - "All Grading Periods" : MessageLookupByLibrary.simpleMessage("All Grading Periods"), - "Already have an account? " : MessageLookupByLibrary.simpleMessage("Already have an account? "), - "An email address is required." : MessageLookupByLibrary.simpleMessage("An email address is required."), - "An error occurred when trying to display this link" : MessageLookupByLibrary.simpleMessage("An error occurred when trying to display this link"), - "An error occurred while saving your selection. Please try again." : MessageLookupByLibrary.simpleMessage("An error occurred while saving your selection. Please try again."), - "An unexpected error occurred" : MessageLookupByLibrary.simpleMessage("An unexpected error occurred"), - "Android OS version" : MessageLookupByLibrary.simpleMessage("Android OS version"), - "Appearance" : MessageLookupByLibrary.simpleMessage("Appearance"), - "Application version" : MessageLookupByLibrary.simpleMessage("Application version"), - "Are you a student or teacher?" : MessageLookupByLibrary.simpleMessage("Are you a student or teacher?"), - "Are you sure you want to log out?" : MessageLookupByLibrary.simpleMessage("Are you sure you want to log out?"), - "Are you sure you wish to close this page? Your unsent message will be lost." : MessageLookupByLibrary.simpleMessage("Are you sure you wish to close this page? Your unsent message will be lost."), - "Assignment Details" : MessageLookupByLibrary.simpleMessage("Assignment Details"), - "Assignment grade above" : MessageLookupByLibrary.simpleMessage("Assignment grade above"), - "Assignment grade below" : MessageLookupByLibrary.simpleMessage("Assignment grade below"), - "Assignment missing" : MessageLookupByLibrary.simpleMessage("Assignment missing"), - "Barney, Fuschia" : MessageLookupByLibrary.simpleMessage("Barney, Fuschia"), - "Calendars" : MessageLookupByLibrary.simpleMessage("Calendars"), - "Camera Permission" : MessageLookupByLibrary.simpleMessage("Camera Permission"), - "Cancel" : MessageLookupByLibrary.simpleMessage("Cancel"), - "Canvas Student" : MessageLookupByLibrary.simpleMessage("Canvas Student"), - "Canvas Teacher" : MessageLookupByLibrary.simpleMessage("Canvas Teacher"), - "Canvas on GitHub" : MessageLookupByLibrary.simpleMessage("Canvas on GitHub"), - "Choose a course to message" : MessageLookupByLibrary.simpleMessage("Choose a course to message"), - "Choose from Gallery" : MessageLookupByLibrary.simpleMessage("Choose from Gallery"), - "Complete" : MessageLookupByLibrary.simpleMessage("Complete"), - "Contact Support" : MessageLookupByLibrary.simpleMessage("Contact Support"), - "Course Announcement" : MessageLookupByLibrary.simpleMessage("Course Announcement"), - "Course Announcements" : MessageLookupByLibrary.simpleMessage("Course Announcements"), - "Course grade above" : MessageLookupByLibrary.simpleMessage("Course grade above"), - "Course grade below" : MessageLookupByLibrary.simpleMessage("Course grade below"), - "Create Account" : MessageLookupByLibrary.simpleMessage("Create Account"), - "Dark Mode" : MessageLookupByLibrary.simpleMessage("Dark Mode"), - "Date" : MessageLookupByLibrary.simpleMessage("Date"), - "Delete" : MessageLookupByLibrary.simpleMessage("Delete"), - "Description" : MessageLookupByLibrary.simpleMessage("Description"), - "Device" : MessageLookupByLibrary.simpleMessage("Device"), - "Device model" : MessageLookupByLibrary.simpleMessage("Device model"), - "Domain" : MessageLookupByLibrary.simpleMessage("Domain"), - "Domain:" : MessageLookupByLibrary.simpleMessage("Domain:"), - "Don\'t show again" : MessageLookupByLibrary.simpleMessage("Don\'t show again"), - "Done" : MessageLookupByLibrary.simpleMessage("Done"), - "Download" : MessageLookupByLibrary.simpleMessage("Download"), - "Due" : MessageLookupByLibrary.simpleMessage("Due"), - "EXTREME CRITICAL EMERGENCY!!" : MessageLookupByLibrary.simpleMessage("EXTREME CRITICAL EMERGENCY!!"), - "Electric, blue" : MessageLookupByLibrary.simpleMessage("Electric, blue"), - "Email Address" : MessageLookupByLibrary.simpleMessage("Email Address"), - "Email:" : MessageLookupByLibrary.simpleMessage("Email:"), - "Email…" : MessageLookupByLibrary.simpleMessage("Email…"), - "Enter the student pairing code provided to you. If the pairing code doesn\'t work, it may have expired" : MessageLookupByLibrary.simpleMessage("Enter the student pairing code provided to you. If the pairing code doesn\'t work, it may have expired"), - "Event" : MessageLookupByLibrary.simpleMessage("Event"), - "Excused" : MessageLookupByLibrary.simpleMessage("Excused"), - "Expired QR Code" : MessageLookupByLibrary.simpleMessage("Expired QR Code"), - "Failed. Tap for options." : MessageLookupByLibrary.simpleMessage("Failed. Tap for options."), - "Filter" : MessageLookupByLibrary.simpleMessage("Filter"), - "Filter by" : MessageLookupByLibrary.simpleMessage("Filter by"), - "Fire, Orange" : MessageLookupByLibrary.simpleMessage("Fire, Orange"), - "Front Page" : MessageLookupByLibrary.simpleMessage("Front Page"), - "Full Name" : MessageLookupByLibrary.simpleMessage("Full Name"), - "Full Name…" : MessageLookupByLibrary.simpleMessage("Full Name…"), - "Full error message" : MessageLookupByLibrary.simpleMessage("Full error message"), - "Go to today" : MessageLookupByLibrary.simpleMessage("Go to today"), - "Grade" : MessageLookupByLibrary.simpleMessage("Grade"), - "Grade percentage" : MessageLookupByLibrary.simpleMessage("Grade percentage"), - "Graded" : MessageLookupByLibrary.simpleMessage("Graded"), - "Grades" : MessageLookupByLibrary.simpleMessage("Grades"), - "Help" : MessageLookupByLibrary.simpleMessage("Help"), - "Hide Password" : MessageLookupByLibrary.simpleMessage("Hide Password"), - "High Contrast Mode" : MessageLookupByLibrary.simpleMessage("High Contrast Mode"), - "How are we doing?" : MessageLookupByLibrary.simpleMessage("How are we doing?"), - "How is this affecting you?" : MessageLookupByLibrary.simpleMessage("How is this affecting you?"), - "I can\'t get things done until I hear back from you." : MessageLookupByLibrary.simpleMessage("I can\'t get things done until I hear back from you."), - "I don\'t have a Canvas account" : MessageLookupByLibrary.simpleMessage("I don\'t have a Canvas account"), - "I have a Canvas account" : MessageLookupByLibrary.simpleMessage("I have a Canvas account"), - "I need some help but it\'s not urgent." : MessageLookupByLibrary.simpleMessage("I need some help but it\'s not urgent."), - "I\'m having trouble logging in" : MessageLookupByLibrary.simpleMessage("I\'m having trouble logging in"), - "Idea for Canvas Parent App [Android]" : MessageLookupByLibrary.simpleMessage("Idea for Canvas Parent App [Android]"), - "In order to provide you with a better experience, we have updated how reminders work. You can add new reminders by viewing an assignment or calendar event and tapping the switch under the \"Remind Me\" section.\n\nBe aware that any reminders created with older versions of this app will not be compatible with the new changes and you will need to create them again." : MessageLookupByLibrary.simpleMessage("In order to provide you with a better experience, we have updated how reminders work. You can add new reminders by viewing an assignment or calendar event and tapping the switch under the \"Remind Me\" section.\n\nBe aware that any reminders created with older versions of this app will not be compatible with the new changes and you will need to create them again."), - "Inbox" : MessageLookupByLibrary.simpleMessage("Inbox"), - "Inbox Zero" : MessageLookupByLibrary.simpleMessage("Inbox Zero"), - "Incomplete" : MessageLookupByLibrary.simpleMessage("Incomplete"), - "Incorrect Domain" : MessageLookupByLibrary.simpleMessage("Incorrect Domain"), - "Institution Announcement" : MessageLookupByLibrary.simpleMessage("Institution Announcement"), - "Institution Announcements" : MessageLookupByLibrary.simpleMessage("Institution Announcements"), - "Instructions" : MessageLookupByLibrary.simpleMessage("Instructions"), - "Interactions on this page are limited by your institution." : MessageLookupByLibrary.simpleMessage("Interactions on this page are limited by your institution."), - "Invalid QR Code" : MessageLookupByLibrary.simpleMessage("Invalid QR Code"), - "It looks like a great day to rest, relax, and recharge." : MessageLookupByLibrary.simpleMessage("It looks like a great day to rest, relax, and recharge."), - "It looks like assignments haven\'t been created in this space yet." : MessageLookupByLibrary.simpleMessage("It looks like assignments haven\'t been created in this space yet."), - "Just a casual question, comment, idea, suggestion…" : MessageLookupByLibrary.simpleMessage("Just a casual question, comment, idea, suggestion…"), - "Late" : MessageLookupByLibrary.simpleMessage("Late"), - "Launch External Tool" : MessageLookupByLibrary.simpleMessage("Launch External Tool"), - "Legal" : MessageLookupByLibrary.simpleMessage("Legal"), - "Light Mode" : MessageLookupByLibrary.simpleMessage("Light Mode"), - "Link Error" : MessageLookupByLibrary.simpleMessage("Link Error"), - "Locale:" : MessageLookupByLibrary.simpleMessage("Locale:"), - "Locate QR Code" : MessageLookupByLibrary.simpleMessage("Locate QR Code"), - "Location" : MessageLookupByLibrary.simpleMessage("Location"), - "Locked" : MessageLookupByLibrary.simpleMessage("Locked"), - "Log Out" : MessageLookupByLibrary.simpleMessage("Log Out"), - "Login flow: Canvas" : MessageLookupByLibrary.simpleMessage("Login flow: Canvas"), - "Login flow: Normal" : MessageLookupByLibrary.simpleMessage("Login flow: Normal"), - "Login flow: Site Admin" : MessageLookupByLibrary.simpleMessage("Login flow: Site Admin"), - "Login flow: Skip mobile verify" : MessageLookupByLibrary.simpleMessage("Login flow: Skip mobile verify"), - "Manage Students" : MessageLookupByLibrary.simpleMessage("Manage Students"), - "Message" : MessageLookupByLibrary.simpleMessage("Message"), - "Message subject" : MessageLookupByLibrary.simpleMessage("Message subject"), - "Missing" : MessageLookupByLibrary.simpleMessage("Missing"), - "Must be below 100" : MessageLookupByLibrary.simpleMessage("Must be below 100"), - "Network error" : MessageLookupByLibrary.simpleMessage("Network error"), - "Never" : MessageLookupByLibrary.simpleMessage("Never"), - "New message" : MessageLookupByLibrary.simpleMessage("New message"), - "No" : MessageLookupByLibrary.simpleMessage("No"), - "No Alerts" : MessageLookupByLibrary.simpleMessage("No Alerts"), - "No Assignments" : MessageLookupByLibrary.simpleMessage("No Assignments"), - "No Courses" : MessageLookupByLibrary.simpleMessage("No Courses"), - "No Due Date" : MessageLookupByLibrary.simpleMessage("No Due Date"), - "No Events Today!" : MessageLookupByLibrary.simpleMessage("No Events Today!"), - "No Grade" : MessageLookupByLibrary.simpleMessage("No Grade"), - "No Location Specified" : MessageLookupByLibrary.simpleMessage("No Location Specified"), - "No Students" : MessageLookupByLibrary.simpleMessage("No Students"), - "No Subject" : MessageLookupByLibrary.simpleMessage("No Subject"), - "No Summary" : MessageLookupByLibrary.simpleMessage("No Summary"), - "No description" : MessageLookupByLibrary.simpleMessage("No description"), - "No recipients selected" : MessageLookupByLibrary.simpleMessage("No recipients selected"), - "Not Graded" : MessageLookupByLibrary.simpleMessage("Not Graded"), - "Not Submitted" : MessageLookupByLibrary.simpleMessage("Not Submitted"), - "Not a parent?" : MessageLookupByLibrary.simpleMessage("Not a parent?"), - "Notifications for reminders about assignments and calendar events" : MessageLookupByLibrary.simpleMessage("Notifications for reminders about assignments and calendar events"), - "OS Version" : MessageLookupByLibrary.simpleMessage("OS Version"), - "Observer" : MessageLookupByLibrary.simpleMessage("Observer"), - "One of our other apps might be a better fit. Tap one to visit the Play Store." : MessageLookupByLibrary.simpleMessage("One of our other apps might be a better fit. Tap one to visit the Play Store."), - "Open Canvas Student" : MessageLookupByLibrary.simpleMessage("Open Canvas Student"), - "Open In Browser" : MessageLookupByLibrary.simpleMessage("Open In Browser"), - "Open with another app" : MessageLookupByLibrary.simpleMessage("Open with another app"), - "Pairing Code" : MessageLookupByLibrary.simpleMessage("Pairing Code"), - "Password" : MessageLookupByLibrary.simpleMessage("Password"), - "Password is required" : MessageLookupByLibrary.simpleMessage("Password is required"), - "Password must contain at least 8 characters" : MessageLookupByLibrary.simpleMessage("Password must contain at least 8 characters"), - "Password…" : MessageLookupByLibrary.simpleMessage("Password…"), - "Planner Note" : MessageLookupByLibrary.simpleMessage("Planner Note"), - "Please enter a valid email address" : MessageLookupByLibrary.simpleMessage("Please enter a valid email address"), - "Please enter an email address" : MessageLookupByLibrary.simpleMessage("Please enter an email address"), - "Please enter full name" : MessageLookupByLibrary.simpleMessage("Please enter full name"), - "Please scan a QR code generated by Canvas" : MessageLookupByLibrary.simpleMessage("Please scan a QR code generated by Canvas"), - "Plum, Purple" : MessageLookupByLibrary.simpleMessage("Plum, Purple"), - "Preparing…" : MessageLookupByLibrary.simpleMessage("Preparing…"), - "Previous Logins" : MessageLookupByLibrary.simpleMessage("Previous Logins"), - "Privacy Policy" : MessageLookupByLibrary.simpleMessage("Privacy Policy"), - "Privacy Policy Link" : MessageLookupByLibrary.simpleMessage("Privacy Policy Link"), - "Privacy policy, terms of use, open source" : MessageLookupByLibrary.simpleMessage("Privacy policy, terms of use, open source"), - "QR Code" : MessageLookupByLibrary.simpleMessage("QR Code"), - "QR scanning requires camera access" : MessageLookupByLibrary.simpleMessage("QR scanning requires camera access"), - "Raspberry, Red" : MessageLookupByLibrary.simpleMessage("Raspberry, Red"), - "Recipients" : MessageLookupByLibrary.simpleMessage("Recipients"), - "Refresh" : MessageLookupByLibrary.simpleMessage("Refresh"), - "Remind Me" : MessageLookupByLibrary.simpleMessage("Remind Me"), - "Reminders" : MessageLookupByLibrary.simpleMessage("Reminders"), - "Reminders have changed!" : MessageLookupByLibrary.simpleMessage("Reminders have changed!"), - "Reply" : MessageLookupByLibrary.simpleMessage("Reply"), - "Reply All" : MessageLookupByLibrary.simpleMessage("Reply All"), - "Report A Problem" : MessageLookupByLibrary.simpleMessage("Report A Problem"), - "Request Login Help" : MessageLookupByLibrary.simpleMessage("Request Login Help"), - "Request Login Help Button" : MessageLookupByLibrary.simpleMessage("Request Login Help Button"), - "Restart app" : MessageLookupByLibrary.simpleMessage("Restart app"), - "Retry" : MessageLookupByLibrary.simpleMessage("Retry"), - "Return to Login" : MessageLookupByLibrary.simpleMessage("Return to Login"), - "STUDENT" : MessageLookupByLibrary.simpleMessage("STUDENT"), - "Screenshot showing location of QR code generation in browser" : MessageLookupByLibrary.simpleMessage("Screenshot showing location of QR code generation in browser"), - "Screenshot showing location of pairing QR code generation in the Canvas Student app" : MessageLookupByLibrary.simpleMessage("Screenshot showing location of pairing QR code generation in the Canvas Student app"), - "Select" : MessageLookupByLibrary.simpleMessage("Select"), - "Select Student Color" : MessageLookupByLibrary.simpleMessage("Select Student Color"), - "Select recipients" : MessageLookupByLibrary.simpleMessage("Select recipients"), - "Send Feedback" : MessageLookupByLibrary.simpleMessage("Send Feedback"), - "Send a message about this assignment" : MessageLookupByLibrary.simpleMessage("Send a message about this assignment"), - "Send a message about this course" : MessageLookupByLibrary.simpleMessage("Send a message about this course"), - "Send message" : MessageLookupByLibrary.simpleMessage("Send message"), - "Set a date and time to be notified of this event." : MessageLookupByLibrary.simpleMessage("Set a date and time to be notified of this event."), - "Set a date and time to be notified of this specific assignment." : MessageLookupByLibrary.simpleMessage("Set a date and time to be notified of this specific assignment."), - "Settings" : MessageLookupByLibrary.simpleMessage("Settings"), - "Shamrock, Green" : MessageLookupByLibrary.simpleMessage("Shamrock, Green"), - "Share Your Love for the App" : MessageLookupByLibrary.simpleMessage("Share Your Love for the App"), - "Show Password" : MessageLookupByLibrary.simpleMessage("Show Password"), - "Sign In" : MessageLookupByLibrary.simpleMessage("Sign In"), - "Something went wrong trying to create your account, please reach out to your school for assistance." : MessageLookupByLibrary.simpleMessage("Something went wrong trying to create your account, please reach out to your school for assistance."), - "Something\'s broken but I can work around it to get what I need done." : MessageLookupByLibrary.simpleMessage("Something\'s broken but I can work around it to get what I need done."), - "Stop Acting as User" : MessageLookupByLibrary.simpleMessage("Stop Acting as User"), - "Student" : MessageLookupByLibrary.simpleMessage("Student"), - "Student Pairing" : MessageLookupByLibrary.simpleMessage("Student Pairing"), - "Students can create a QR code using the Canvas Student app on their mobile device" : MessageLookupByLibrary.simpleMessage("Students can create a QR code using the Canvas Student app on their mobile device"), - "Students can obtain a pairing code through the Canvas website" : MessageLookupByLibrary.simpleMessage("Students can obtain a pairing code through the Canvas website"), - "Subject" : MessageLookupByLibrary.simpleMessage("Subject"), - "Submitted" : MessageLookupByLibrary.simpleMessage("Submitted"), - "Successfully submitted!" : MessageLookupByLibrary.simpleMessage("Successfully submitted!"), - "Summary" : MessageLookupByLibrary.simpleMessage("Summary"), - "Switch Users" : MessageLookupByLibrary.simpleMessage("Switch Users"), - "Syllabus" : MessageLookupByLibrary.simpleMessage("Syllabus"), - "TA" : MessageLookupByLibrary.simpleMessage("TA"), - "TEACHER" : MessageLookupByLibrary.simpleMessage("TEACHER"), - "Tap to favorite the courses you want to see on the Calendar. Select up to 10." : MessageLookupByLibrary.simpleMessage("Tap to favorite the courses you want to see on the Calendar. Select up to 10."), - "Tap to pair with a new student" : MessageLookupByLibrary.simpleMessage("Tap to pair with a new student"), - "Tap to select this student" : MessageLookupByLibrary.simpleMessage("Tap to select this student"), - "Tap to show student selector" : MessageLookupByLibrary.simpleMessage("Tap to show student selector"), - "Teacher" : MessageLookupByLibrary.simpleMessage("Teacher"), - "Tell us about your favorite parts of the app" : MessageLookupByLibrary.simpleMessage("Tell us about your favorite parts of the app"), - "Terms of Service" : MessageLookupByLibrary.simpleMessage("Terms of Service"), - "Terms of Service Link" : MessageLookupByLibrary.simpleMessage("Terms of Service Link"), - "Terms of Use" : MessageLookupByLibrary.simpleMessage("Terms of Use"), - "The QR code you scanned may have expired. Refresh the code on the student\'s device and try again." : MessageLookupByLibrary.simpleMessage("The QR code you scanned may have expired. Refresh the code on the student\'s device and try again."), - "The following information will help us better understand your idea:" : MessageLookupByLibrary.simpleMessage("The following information will help us better understand your idea:"), - "The server you entered is not authorized for this app." : MessageLookupByLibrary.simpleMessage("The server you entered is not authorized for this app."), - "The student you are trying to add belongs to a different school. Log in or create an account with that school to scan this code." : MessageLookupByLibrary.simpleMessage("The student you are trying to add belongs to a different school. Log in or create an account with that school to scan this code."), - "The user agent for this app is not authorized." : MessageLookupByLibrary.simpleMessage("The user agent for this app is not authorized."), - "Theme" : MessageLookupByLibrary.simpleMessage("Theme"), - "There are no installed applications that can open this file" : MessageLookupByLibrary.simpleMessage("There are no installed applications that can open this file"), - "There is no page information available." : MessageLookupByLibrary.simpleMessage("There is no page information available."), - "There was a problem loading the Terms of Use" : MessageLookupByLibrary.simpleMessage("There was a problem loading the Terms of Use"), - "There was a problem removing this student from your account. Please check your connection and try again." : MessageLookupByLibrary.simpleMessage("There was a problem removing this student from your account. Please check your connection and try again."), - "There was an error loading recipients for this course" : MessageLookupByLibrary.simpleMessage("There was an error loading recipients for this course"), - "There was an error loading the summary details for this course." : MessageLookupByLibrary.simpleMessage("There was an error loading the summary details for this course."), - "There was an error loading this announcement" : MessageLookupByLibrary.simpleMessage("There was an error loading this announcement"), - "There was an error loading this conversation" : MessageLookupByLibrary.simpleMessage("There was an error loading this conversation"), - "There was an error loading this file" : MessageLookupByLibrary.simpleMessage("There was an error loading this file"), - "There was an error loading your inbox messages." : MessageLookupByLibrary.simpleMessage("There was an error loading your inbox messages."), - "There was an error loading your student\'s alerts." : MessageLookupByLibrary.simpleMessage("There was an error loading your student\'s alerts."), - "There was an error loading your student\'s calendar" : MessageLookupByLibrary.simpleMessage("There was an error loading your student\'s calendar"), - "There was an error loading your students." : MessageLookupByLibrary.simpleMessage("There was an error loading your students."), - "There was an error loading your student’s courses." : MessageLookupByLibrary.simpleMessage("There was an error loading your student’s courses."), - "There was an error logging in. Please generate another QR Code and try again." : MessageLookupByLibrary.simpleMessage("There was an error logging in. Please generate another QR Code and try again."), - "There was an error trying to act as this user. Please check the Domain and User ID and try again." : MessageLookupByLibrary.simpleMessage("There was an error trying to act as this user. Please check the Domain and User ID and try again."), - "There’s nothing to be notified of yet." : MessageLookupByLibrary.simpleMessage("There’s nothing to be notified of yet."), - "This app is not authorized for use." : MessageLookupByLibrary.simpleMessage("This app is not authorized for use."), - "This course does not have any assignments or calendar events yet." : MessageLookupByLibrary.simpleMessage("This course does not have any assignments or calendar events yet."), - "This file is unsupported and can’t be viewed through the app" : MessageLookupByLibrary.simpleMessage("This file is unsupported and can’t be viewed through the app"), - "This will unpair and remove all enrollments for this student from your account." : MessageLookupByLibrary.simpleMessage("This will unpair and remove all enrollments for this student from your account."), - "Total Grade" : MessageLookupByLibrary.simpleMessage("Total Grade"), - "Uh oh!" : MessageLookupByLibrary.simpleMessage("Uh oh!"), - "Unable to fetch courses. Please check your connection and try again." : MessageLookupByLibrary.simpleMessage("Unable to fetch courses. Please check your connection and try again."), - "Unable to load this image" : MessageLookupByLibrary.simpleMessage("Unable to load this image"), - "Unable to play this media file" : MessageLookupByLibrary.simpleMessage("Unable to play this media file"), - "Unable to send message. Check your connection and try again." : MessageLookupByLibrary.simpleMessage("Unable to send message. Check your connection and try again."), - "Under Construction" : MessageLookupByLibrary.simpleMessage("Under Construction"), - "Unknown User" : MessageLookupByLibrary.simpleMessage("Unknown User"), - "Unsaved changes" : MessageLookupByLibrary.simpleMessage("Unsaved changes"), - "Unsupported File" : MessageLookupByLibrary.simpleMessage("Unsupported File"), - "Upload File" : MessageLookupByLibrary.simpleMessage("Upload File"), - "Use Camera" : MessageLookupByLibrary.simpleMessage("Use Camera"), - "Use Dark Theme in Web Content" : MessageLookupByLibrary.simpleMessage("Use Dark Theme in Web Content"), - "User ID" : MessageLookupByLibrary.simpleMessage("User ID"), - "User ID:" : MessageLookupByLibrary.simpleMessage("User ID:"), - "Version Number" : MessageLookupByLibrary.simpleMessage("Version Number"), - "View Description" : MessageLookupByLibrary.simpleMessage("View Description"), - "View error details" : MessageLookupByLibrary.simpleMessage("View error details"), - "View the Privacy Policy" : MessageLookupByLibrary.simpleMessage("View the Privacy Policy"), - "We are currently building this feature for your viewing pleasure." : MessageLookupByLibrary.simpleMessage("We are currently building this feature for your viewing pleasure."), - "We are unable to display this link, it may belong to an institution you currently aren\'t logged in to." : MessageLookupByLibrary.simpleMessage("We are unable to display this link, it may belong to an institution you currently aren\'t logged in to."), - "We couldn\'t find any students associated with this account" : MessageLookupByLibrary.simpleMessage("We couldn\'t find any students associated with this account"), - "We were unable to verify the server for use with this app." : MessageLookupByLibrary.simpleMessage("We were unable to verify the server for use with this app."), - "We’re not sure what happened, but it wasn’t good. Contact us if this keeps happening." : MessageLookupByLibrary.simpleMessage("We’re not sure what happened, but it wasn’t good. Contact us if this keeps happening."), - "What can we do better?" : MessageLookupByLibrary.simpleMessage("What can we do better?"), - "Yes" : MessageLookupByLibrary.simpleMessage("Yes"), - "You are not observing any students." : MessageLookupByLibrary.simpleMessage("You are not observing any students."), - "You may only choose 10 calendars to display" : MessageLookupByLibrary.simpleMessage("You may only choose 10 calendars to display"), - "You must enter a user id" : MessageLookupByLibrary.simpleMessage("You must enter a user id"), - "You must enter a valid domain" : MessageLookupByLibrary.simpleMessage("You must enter a valid domain"), - "You must select at least one calendar to display" : MessageLookupByLibrary.simpleMessage("You must select at least one calendar to display"), - "You will be notified about this assignment on…" : MessageLookupByLibrary.simpleMessage("You will be notified about this assignment on…"), - "You will be notified about this event on…" : MessageLookupByLibrary.simpleMessage("You will be notified about this event on…"), - "You\'ll find the QR code on the web in your account profile. Click \'QR for Mobile Login\' in the list." : MessageLookupByLibrary.simpleMessage("You\'ll find the QR code on the web in your account profile. Click \'QR for Mobile Login\' in the list."), - "You\'ll need to open your student\'s Canvas Student app to continue. Go into Main Menu > Settings > Pair with Observer and scan the QR code you see there." : MessageLookupByLibrary.simpleMessage("You\'ll need to open your student\'s Canvas Student app to continue. Go into Main Menu > Settings > Pair with Observer and scan the QR code you see there."), - "Your code is incorrect or expired." : MessageLookupByLibrary.simpleMessage("Your code is incorrect or expired."), - "Your student’s courses might not be published yet." : MessageLookupByLibrary.simpleMessage("Your student’s courses might not be published yet."), - "You’re all caught up!" : MessageLookupByLibrary.simpleMessage("You’re all caught up!"), - "actingAsUser" : m0, - "alertsLabel" : MessageLookupByLibrary.simpleMessage("Alerts"), - "appVersion" : m1, - "assignmentGradeAboveThreshold" : m2, - "assignmentGradeBelowThreshold" : m3, - "assignmentLockedModule" : m4, - "assignmentSubjectMessage" : m5, - "assignmentTotalPoints" : m6, - "assignmentTotalPointsAccessible" : m7, - "authorToNOthers" : m8, - "authorToRecipient" : m9, - "authorToRecipientAndNOthers" : m10, - "badgeNumberPlus" : m11, - "calendarLabel" : MessageLookupByLibrary.simpleMessage("Calendar"), - "canvasGuides" : MessageLookupByLibrary.simpleMessage("Canvas Guides"), - "canvasLogoLabel" : MessageLookupByLibrary.simpleMessage("Canvas logo"), - "canvasSupport" : MessageLookupByLibrary.simpleMessage("Canvas Support"), - "changeStudentColorLabel" : m12, - "collapse" : MessageLookupByLibrary.simpleMessage("collapse"), - "collapsed" : MessageLookupByLibrary.simpleMessage("collapsed"), - "contentDescriptionScoreOutOfPointsPossible" : m13, - "courseForWhom" : m14, - "courseGradeAboveThreshold" : m15, - "courseGradeBelowThreshold" : m16, - "coursesLabel" : MessageLookupByLibrary.simpleMessage("Courses"), - "dateAtTime" : m17, - "dismissAlertLabel" : m18, - "domainSearchHelpBody" : m19, - "domainSearchHelpLabel" : MessageLookupByLibrary.simpleMessage("How do I find my school or district?"), - "domainSearchInputHint" : MessageLookupByLibrary.simpleMessage("Enter school name or district…"), - "dueDateAtTime" : m20, - "endMasqueradeLogoutMessage" : m21, - "endMasqueradeMessage" : m22, - "eventSubjectMessage" : m23, - "eventTime" : m24, - "expand" : MessageLookupByLibrary.simpleMessage("expand"), - "expanded" : MessageLookupByLibrary.simpleMessage("expanded"), - "finalGrade" : m25, - "findSchool" : MessageLookupByLibrary.simpleMessage("Find School"), - "frontPageSubjectMessage" : m26, - "gradeFormatScoreOutOfPointsPossible" : m27, - "gradesSubjectMessage" : m28, - "latePenalty" : m29, - "me" : MessageLookupByLibrary.simpleMessage("me"), - "messageLinkPostscript" : m30, - "minus" : MessageLookupByLibrary.simpleMessage("minus"), - "mustBeAboveN" : m31, - "mustBeBelowN" : m32, - "next" : MessageLookupByLibrary.simpleMessage("Next"), - "nextMonth" : m33, - "nextWeek" : m34, - "noDomainResults" : m35, - "ok" : MessageLookupByLibrary.simpleMessage("OK"), - "outOfPoints" : m36, - "plusRecipientCount" : m37, - "pointsPossible" : m38, - "previousMonth" : m39, - "previousWeek" : m40, - "qrCreateAccountTos" : m41, - "ratingDialogEmailSubject" : m42, - "selectedMonthLabel" : m43, - "send" : MessageLookupByLibrary.simpleMessage("send"), - "starRating" : m44, - "submissionStatusSuccessSubtitle" : m45, - "syllabusSubjectMessage" : m46, - "unread" : MessageLookupByLibrary.simpleMessage("unread"), - "unreadCount" : m47 - }; -} diff --git a/apps/flutter_parent/lib/l10n/generated/messages_mi.dart b/apps/flutter_parent/lib/l10n/generated/messages_mi.dart deleted file mode 100644 index 4ad4d981b9..0000000000 --- a/apps/flutter_parent/lib/l10n/generated/messages_mi.dart +++ /dev/null @@ -1,473 +0,0 @@ -// DO NOT EDIT. This is code generated via package:intl/generate_localized.dart -// This is a library that provides messages for a mi locale. All the -// messages from the main program should be duplicated here with the same -// function name. - -// Ignore issues from commonly used lints in this file. -// ignore_for_file:unnecessary_brace_in_string_interps, unnecessary_new -// ignore_for_file:prefer_single_quotes,comment_references, directives_ordering -// ignore_for_file:annotate_overrides,prefer_generic_function_type_aliases -// ignore_for_file:unused_import, file_names - -import 'package:intl/intl.dart'; -import 'package:intl/message_lookup_by_library.dart'; - -final messages = new MessageLookup(); - -typedef String MessageIfAbsent(String messageStr, List args); - -class MessageLookup extends MessageLookupByLibrary { - String get localeName => 'mi'; - - static m0(userName) => "Kei te mahi koe pēnei ${userName}"; - - static m1(version) => "v. ${version}"; - - static m2(threshold) => "Kōeke Whakataunga Runga ${threshold}"; - - static m3(threshold) => "Kōeke Whakataunga Raro ${threshold}"; - - static m4(moduleName) => "Kua rakaina tō whakataunga e te kōwai \"${moduleName}\"."; - - static m5(studentName, assignmentName) => "E pā ana: ${studentName}, Whakataunga: ${assignmentName}"; - - static m6(points) => "${points} ngā koinga"; - - static m7(points) => "${points} ngā koinga"; - - static m8(authorName, howMany) => "${Intl.plural(howMany, one: '${authorName} ki 1 tētahi atu', other: '${authorName} kī ${howMany} ētahi atu')}"; - - static m9(authorName, recipientName) => "${authorName} ki te ${recipientName}"; - - static m10(authorName, recipientName, howMany) => "${Intl.plural(howMany, one: '${authorName} kī ${recipientName} & 1 tētahi atu', other: '${authorName} kī ${recipientName} & ${howMany} ētahi atu')}"; - - static m11(count) => "${count}+"; - - static m12(studentName) => "Huria tae mō ${studentName}"; - - static m13(score, pointsPossible) => "${score} waho ō ${pointsPossible} ngā koinga"; - - static m14(studentShortName) => "mo ${studentShortName}"; - - static m15(threshold) => "Kōeke Akoranga Runga ${threshold}"; - - static m16(threshold) => "Kōeke Akoranga Raro ${threshold}"; - - static m17(date, time) => "${date} ī ${time}"; - - static m18(alertTitle) => "Whakakore ${alertTitle}"; - - static m19(canvasGuides, canvasSupport) => "Ngana ki te rapu haere te ingoa o te kura, rohe rānei e hiahia ana koe ki te whakauru, “Smith Kura Tūmataiti” “Smith Kura Rohe” rānei. Ka taea e koe te whwkauru he Canvas rohe hāngai tonu pēnei “smith.instructure.com”.\n\nMō ētahi atu pūrongo hei rapu i tō whakanōhanga pūkete Canvas, ka taea e koe te haere ki te ${canvasGuides} whakapā atu kī ${canvasSupport} are whakapā ki te kura hei āwhina."; - - static m20(date, time) => "Rā tika ${date} ī ${time}"; - - static m21(userName) => "Ka mutu tō mahi hei ${userName} ana ka takiwahotia."; - - static m22(userName) => "Ka mutu tō mahi hei ${userName} ka hoki ki tāu pūkete.ake."; - - static m23(studentName, eventTitle) => "E pā ana: ${studentName}, Tawhainga: ${eventTitle}"; - - static m24(startAt, endAt) => "${startAt} / ${endAt}"; - - static m25(grade) => "Kōeke whakamutunga: ${grade}"; - - static m26(studentName) => "E pā ana: ${studentName}, Whārangi Mua"; - - static m27(score, pointsPossible) => "${score} / ${pointsPossible}"; - - static m28(studentName) => "E pā ana: ${studentName}, Ngā Kōeke"; - - static m29(pointsLost) => "Whiu tōmuri (-${pointsLost})"; - - static m30(studentName, linkUrl) => "E pā ana: ${studentName}, ${linkUrl}"; - - static m31(percentage) => "Me runga ake ${percentage}"; - - static m32(percentage) => "Me raro iho ${percentage}"; - - static m33(month) => "Marama i muri mai: ${month}"; - - static m34(date) => "Tīmata te wiki e heke mai nei ${date}"; - - static m35(query) => "Kaore e taea te kitea ngā kura ōrite \"${query}\""; - - static m36(points, howMany) => "${Intl.plural(howMany, one: 'I waho i te 1 koinga', other: 'I waho i te ${points} ngā kōinga')}"; - - static m37(count) => "+${count}"; - - static m38(points) => "${points} ngā koinga e taea"; - - static m39(month) => "Marama o muri nei: ${month}"; - - static m40(date) => "Tīmata te wiki o muri ${date}"; - - static m41(termsOfService, privacyPolicy) => "Ma te patopato i \'Hanga Pūkete\', e whakāe ana koe ki te ${termsOfService} me te whakamihi te ${privacyPolicy}"; - - static m42(version) => "He whakāro pūaki mo Android - Canvas Matua ${version}"; - - static m43(month) => "Marama ō ${month}"; - - static m44(position) => "${Intl.plural(position, one: '${position} tīmataī', other: '${position} ngā whetu')}"; - - static m45(date, time) => "I tukuna tēnei whakataunga i runga i ${date} kī ${time} ana kei te tatari ki te kōeketia"; - - static m46(studentName) => "E pā ana: ${studentName}, Marautanga"; - - static m47(count) => "${count} kaore i pānuihia"; - - final messages = _notInlinedMessages(_notInlinedMessages); - static _notInlinedMessages(_) => { - "\"Act as\" is essentially logging in as this user without a password. You will be able to take any action as if you were this user, and from other users\' points of views, it will be as if this user performed them. However, audit logs record that you were the one who performed the actions on behalf of this user." : MessageLookupByLibrary.simpleMessage("\"Ko te Mahi hei\" kei te takiuru tēnei kaiwhakamahi me te kore kupuhipa. Ka taea e koe te mahi i tētahi mahi me te mea ko koe tēnei kaiwhakamahi, me ētahi atu whakaaro ō ngā kaiwhakamahi, \'ka mahia anō nei ngā te kaiwhakamahi i mahi. Heoi, ka tuhia e ngā kaute tuhinga ko koe te kaihanga i ngā mahi mo tēnei kaiwhakamahi."), - "-" : MessageLookupByLibrary.simpleMessage("-"), - "A description is required." : MessageLookupByLibrary.simpleMessage("E hiahia ana he whakāturanga."), - "A network error occurred when adding this student. Check your connection and try again." : MessageLookupByLibrary.simpleMessage("He hapa whatunga i puta i te wā e tāpiri ana ki tēnei ākonga Tirohia tō hononga ana ka ngana anō."), - "A subject is required." : MessageLookupByLibrary.simpleMessage("He kaupapa e hiahiatia ana."), - "Act As User" : MessageLookupByLibrary.simpleMessage("Mahi Rite Kaiwhakamahi"), - "Add Student" : MessageLookupByLibrary.simpleMessage("Tapiri ākonga"), - "Add attachment" : MessageLookupByLibrary.simpleMessage("Tāpiri āpitihanga"), - "Add new student" : MessageLookupByLibrary.simpleMessage("Tāpiri ākonga hou"), - "Add student with…" : MessageLookupByLibrary.simpleMessage("Tapiri ākonga me..."), - "Alert Settings" : MessageLookupByLibrary.simpleMessage("Matohi Tautuhinga"), - "Alert me when…" : MessageLookupByLibrary.simpleMessage("Matohi ahau ina..."), - "All Grading Periods" : MessageLookupByLibrary.simpleMessage("Takiwā kōeke katoa"), - "Already have an account? " : MessageLookupByLibrary.simpleMessage("He pūkete tāū? "), - "An email address is required." : MessageLookupByLibrary.simpleMessage("He whakaaturanga e hiahiatia ana."), - "An error occurred when trying to display this link" : MessageLookupByLibrary.simpleMessage("He hapa i puta i te wā e ngana ana ki te whakātu i tēnei whārangi.hono"), - "An error occurred while saving your selection. Please try again." : MessageLookupByLibrary.simpleMessage("He hapa i puta i te wā e tiaki ana i tō tīpako Tēnā koa ngana anō."), - "An unexpected error occurred" : MessageLookupByLibrary.simpleMessage("He hapa ohorere i puta"), - "Android OS version" : MessageLookupByLibrary.simpleMessage("Android OS Putanga"), - "Appearance" : MessageLookupByLibrary.simpleMessage("Āhua"), - "Application version" : MessageLookupByLibrary.simpleMessage("Taupānga whakāturanga"), - "Are you a student or teacher?" : MessageLookupByLibrary.simpleMessage("He ākonga he kaiako rānei koe?"), - "Are you sure you want to log out?" : MessageLookupByLibrary.simpleMessage("Kei te tino hiahia koe ki te takiuru atu?"), - "Are you sure you wish to close this page? Your unsent message will be lost." : MessageLookupByLibrary.simpleMessage("Kei te tino hiahia koe ki te kati i tēnei whārangi? Ka ngāro tō karere kaore anō nei i tukuna."), - "Assignment Details" : MessageLookupByLibrary.simpleMessage("Taipitopito whakataunga"), - "Assignment grade above" : MessageLookupByLibrary.simpleMessage("Kōeke whakataunga runga"), - "Assignment grade below" : MessageLookupByLibrary.simpleMessage("Kōeke whakataunga raro"), - "Assignment missing" : MessageLookupByLibrary.simpleMessage("E ngaro ana whakataunga"), - "Barney, Fuschia" : MessageLookupByLibrary.simpleMessage("Barney, Ngenge"), - "Calendars" : MessageLookupByLibrary.simpleMessage("Ngā Maramataka"), - "Camera Permission" : MessageLookupByLibrary.simpleMessage("Kāmera Whakaaetanga"), - "Cancel" : MessageLookupByLibrary.simpleMessage("Whakakore"), - "Canvas Student" : MessageLookupByLibrary.simpleMessage("Canvas Ākonga"), - "Canvas Teacher" : MessageLookupByLibrary.simpleMessage("Canvas Kaiako"), - "Canvas on GitHub" : MessageLookupByLibrary.simpleMessage("Canvas i runga GitHub"), - "Choose a course to message" : MessageLookupByLibrary.simpleMessage("Kōwhiri he akoranga hei karare"), - "Choose from Gallery" : MessageLookupByLibrary.simpleMessage("Kōwhiri mai i te Taiwhanga"), - "Complete" : MessageLookupByLibrary.simpleMessage("Oti"), - "Contact Support" : MessageLookupByLibrary.simpleMessage("Tautoko Whakapā"), - "Course Announcement" : MessageLookupByLibrary.simpleMessage("Akoranga Pānuitanga"), - "Course Announcements" : MessageLookupByLibrary.simpleMessage("Pānuitanga Akoranga"), - "Course grade above" : MessageLookupByLibrary.simpleMessage("Kōeke akoranga i runga"), - "Course grade below" : MessageLookupByLibrary.simpleMessage("Kōeke akoranga i raro"), - "Create Account" : MessageLookupByLibrary.simpleMessage("Waihanga Pūkete"), - "Dark Mode" : MessageLookupByLibrary.simpleMessage("Aratau Pouri"), - "Date" : MessageLookupByLibrary.simpleMessage("Rā"), - "Delete" : MessageLookupByLibrary.simpleMessage("Muku"), - "Description" : MessageLookupByLibrary.simpleMessage("Whakāhuatanga"), - "Device" : MessageLookupByLibrary.simpleMessage("Pūrere"), - "Device model" : MessageLookupByLibrary.simpleMessage("Pūrere tauira"), - "Domain" : MessageLookupByLibrary.simpleMessage("Rohe"), - "Domain:" : MessageLookupByLibrary.simpleMessage("Rohe:"), - "Don\'t show again" : MessageLookupByLibrary.simpleMessage("Kaua e whakātu anō"), - "Done" : MessageLookupByLibrary.simpleMessage("Kua mahia"), - "Download" : MessageLookupByLibrary.simpleMessage("Tikiake"), - "Due" : MessageLookupByLibrary.simpleMessage("E tika ana"), - "EXTREME CRITICAL EMERGENCY!!" : MessageLookupByLibrary.simpleMessage("TINO URUPARE NUI!!"), - "Electric, blue" : MessageLookupByLibrary.simpleMessage("Hikohiko, Kahurangi"), - "Email Address" : MessageLookupByLibrary.simpleMessage("Īmēra Wāhitau"), - "Email:" : MessageLookupByLibrary.simpleMessage("Īmēra:"), - "Email…" : MessageLookupByLibrary.simpleMessage("Īmēra ..."), - "Enter the student pairing code provided to you. If the pairing code doesn\'t work, it may have expired" : MessageLookupByLibrary.simpleMessage("Whakauru te ākonga waihere hono kua tukuna atu ki a koe. Mehema kaore te waihere hono e mahi; kua pau pea te wā"), - "Event" : MessageLookupByLibrary.simpleMessage("Tauwhāinga"), - "Excused" : MessageLookupByLibrary.simpleMessage("Whakawātea"), - "Expired QR Code" : MessageLookupByLibrary.simpleMessage("Kua pau QR Waehere"), - "Failed. Tap for options." : MessageLookupByLibrary.simpleMessage("I hapa. Pātō mo ngā kōwhiringa."), - "Filter" : MessageLookupByLibrary.simpleMessage("Tātari"), - "Filter by" : MessageLookupByLibrary.simpleMessage("Tātari mā"), - "Fire, Orange" : MessageLookupByLibrary.simpleMessage("Ahi, Ārani"), - "Front Page" : MessageLookupByLibrary.simpleMessage("Whārangi mua"), - "Full Name" : MessageLookupByLibrary.simpleMessage("Ingoa Katoa"), - "Full Name…" : MessageLookupByLibrary.simpleMessage("Ingoa Katoa ..."), - "Full error message" : MessageLookupByLibrary.simpleMessage("Nui karere Hapa"), - "Go to today" : MessageLookupByLibrary.simpleMessage("Haere ki te rā"), - "Grade" : MessageLookupByLibrary.simpleMessage("Kōeke"), - "Grade percentage" : MessageLookupByLibrary.simpleMessage("Kōeke pai hēneti"), - "Graded" : MessageLookupByLibrary.simpleMessage("Kōekehia"), - "Grades" : MessageLookupByLibrary.simpleMessage("Ngā Kōeke"), - "Help" : MessageLookupByLibrary.simpleMessage("Āwhina"), - "Hide Password" : MessageLookupByLibrary.simpleMessage("Huna Kupuhipa"), - "High Contrast Mode" : MessageLookupByLibrary.simpleMessage("Pūrata nui Aratau"), - "How are we doing?" : MessageLookupByLibrary.simpleMessage("E pēhea ana tātou?"), - "How is this affecting you?" : MessageLookupByLibrary.simpleMessage("Kia pehea e pa ana tenei ki a koe?"), - "I can\'t get things done until I hear back from you." : MessageLookupByLibrary.simpleMessage("Kaore e taea e ahau te whakaoti ki a hoki rongo rānō ahau mai ia koe."), - "I don\'t have a Canvas account" : MessageLookupByLibrary.simpleMessage("Kaore he pūkete Canvas tāku"), - "I have a Canvas account" : MessageLookupByLibrary.simpleMessage("He Pūkete Canvas tāku"), - "I need some help but it\'s not urgent." : MessageLookupByLibrary.simpleMessage("E hiahia ana ahau ētahi awhina ēngari e kore te kōhukihuki."), - "I\'m having trouble logging in" : MessageLookupByLibrary.simpleMessage("Kei te raru ahau ki te takiuru"), - "Idea for Canvas Parent App [Android]" : MessageLookupByLibrary.simpleMessage("Whakaaro mō te Taupānga Canvas Matua [Android]"), - "In order to provide you with a better experience, we have updated how reminders work. You can add new reminders by viewing an assignment or calendar event and tapping the switch under the \"Remind Me\" section.\n\nBe aware that any reminders created with older versions of this app will not be compatible with the new changes and you will need to create them again." : MessageLookupByLibrary.simpleMessage("I roto i te hoatu atu ki a koe he wheako pai, kua whakahoutia e mātou te whakamahi te pēhea te mahi ngā maumahara. Ka taea e koe te tāpiri maumahara hou ma te titiro he whakataunga ara maramataka Tauwhāinga rānei me te pātō te huringa i raro i te \"Maumahara Ahau\" wāhanga.\n\nKia matāra ngā mauamahara kua hangatia mai ngā wāhanga tawhito o tēnei taupānga kaore e uru atu ki ngā huringa hou ana me hanga e koe anō."), - "Inbox" : MessageLookupByLibrary.simpleMessage("Pouakauru"), - "Inbox Zero" : MessageLookupByLibrary.simpleMessage("Pouakaroto Kore"), - "Incomplete" : MessageLookupByLibrary.simpleMessage("Kaore i te oti"), - "Incorrect Domain" : MessageLookupByLibrary.simpleMessage("Rohe hē"), - "Institution Announcement" : MessageLookupByLibrary.simpleMessage("Panuitanga o te Whakanōhanga"), - "Institution Announcements" : MessageLookupByLibrary.simpleMessage("Whaaknōhanga pānutianga"), - "Instructions" : MessageLookupByLibrary.simpleMessage("Ngā Tohutohu"), - "Interactions on this page are limited by your institution." : MessageLookupByLibrary.simpleMessage("Ngā whakapā i runga i tēnei whārangi ka aukatitia e tō wharenōhanga."), - "Invalid QR Code" : MessageLookupByLibrary.simpleMessage("QR waehere koremana"), - "It looks like a great day to rest, relax, and recharge." : MessageLookupByLibrary.simpleMessage("Ko te āhua nei he rā pai ki te whakatā me te whakahou anō."), - "It looks like assignments haven\'t been created in this space yet." : MessageLookupByLibrary.simpleMessage("Ko te āhua nei kaore ngā whakataunga i hāngaia i roto i tēnei wāhi."), - "Just a casual question, comment, idea, suggestion…" : MessageLookupByLibrary.simpleMessage("He pātai tüao, kōrero, whakāro, whakāro pūaki..."), - "Late" : MessageLookupByLibrary.simpleMessage("Tūreiti"), - "Launch External Tool" : MessageLookupByLibrary.simpleMessage("Neke Taputapu Waho"), - "Legal" : MessageLookupByLibrary.simpleMessage("Ture"), - "Light Mode" : MessageLookupByLibrary.simpleMessage("Aratau Mārama"), - "Link Error" : MessageLookupByLibrary.simpleMessage("Hono Hapa"), - "Locale:" : MessageLookupByLibrary.simpleMessage("Tauwāhi:"), - "Locate QR Code" : MessageLookupByLibrary.simpleMessage("Kimihia QR Waehere"), - "Location" : MessageLookupByLibrary.simpleMessage("Wāhi"), - "Locked" : MessageLookupByLibrary.simpleMessage("Kua rakaina"), - "Log Out" : MessageLookupByLibrary.simpleMessage("Takiputa"), - "Login flow: Canvas" : MessageLookupByLibrary.simpleMessage("Rere o te takiuru: Canvas"), - "Login flow: Normal" : MessageLookupByLibrary.simpleMessage("Rere o te takiuru: Noa"), - "Login flow: Site Admin" : MessageLookupByLibrary.simpleMessage("Rere o te takiuru: Pae Whakahaere"), - "Login flow: Skip mobile verify" : MessageLookupByLibrary.simpleMessage("Rere o te takiuru: Peke tautoko i te waea haerēre"), - "Manage Students" : MessageLookupByLibrary.simpleMessage("Whakahaere ngā ākonga"), - "Message" : MessageLookupByLibrary.simpleMessage("Karere"), - "Message subject" : MessageLookupByLibrary.simpleMessage("Kaupapa karere"), - "Missing" : MessageLookupByLibrary.simpleMessage("Ngaro"), - "Must be below 100" : MessageLookupByLibrary.simpleMessage("Me raro iho i te 100"), - "Network error" : MessageLookupByLibrary.simpleMessage("Hapa whatunga"), - "Never" : MessageLookupByLibrary.simpleMessage("Kaua rawa"), - "New message" : MessageLookupByLibrary.simpleMessage("Karere hōu"), - "No" : MessageLookupByLibrary.simpleMessage("Kahore"), - "No Alerts" : MessageLookupByLibrary.simpleMessage("Kaore he whakamataara"), - "No Assignments" : MessageLookupByLibrary.simpleMessage("Kaore ngā whakataunga"), - "No Courses" : MessageLookupByLibrary.simpleMessage("Kāore he Akoranga"), - "No Due Date" : MessageLookupByLibrary.simpleMessage("Kaore He Rā Tika"), - "No Events Today!" : MessageLookupByLibrary.simpleMessage("Kaore he tauwhāinga i tēnei rā!"), - "No Grade" : MessageLookupByLibrary.simpleMessage("Kaore he Kōeke"), - "No Location Specified" : MessageLookupByLibrary.simpleMessage("Tauwhāititia Kāore he Wāhi"), - "No Students" : MessageLookupByLibrary.simpleMessage("Kāore he ākonga"), - "No Subject" : MessageLookupByLibrary.simpleMessage("Kāore he Kaupapa"), - "No Summary" : MessageLookupByLibrary.simpleMessage("Kaore he Whakarāpopototanga"), - "No description" : MessageLookupByLibrary.simpleMessage("Kāore he whakaahuatanga"), - "No recipients selected" : MessageLookupByLibrary.simpleMessage("Kaore ngā kaiwhiwhi i tīpakohia"), - "Not Graded" : MessageLookupByLibrary.simpleMessage("Kāore i kōekehia"), - "Not Submitted" : MessageLookupByLibrary.simpleMessage("E Kore E Tukua"), - "Not a parent?" : MessageLookupByLibrary.simpleMessage("Kaore i te matua?"), - "Notifications for reminders about assignments and calendar events" : MessageLookupByLibrary.simpleMessage("Ngā whakamōhiotanga mo ngā whakataunga me ngā tauwhāinga māramataka"), - "OS Version" : MessageLookupByLibrary.simpleMessage("OS Putanga"), - "Observer" : MessageLookupByLibrary.simpleMessage("Kaimātakitaki"), - "One of our other apps might be a better fit. Tap one to visit the Play Store." : MessageLookupByLibrary.simpleMessage("Ko tētahi atu o a mātou taupānga pea he pai ake te uru. Pātō kotahi ki te toro atu ki te Toa Tākaro."), - "Open Canvas Student" : MessageLookupByLibrary.simpleMessage("Huaki Canvas Ākonga"), - "Open In Browser" : MessageLookupByLibrary.simpleMessage("Tuwhera I roto i te Pūtirotiro"), - "Open with another app" : MessageLookupByLibrary.simpleMessage("Tuwhera me tētahi atu taupānga"), - "Pairing Code" : MessageLookupByLibrary.simpleMessage("Waihere Hono"), - "Password" : MessageLookupByLibrary.simpleMessage("Kupuhipa"), - "Password is required" : MessageLookupByLibrary.simpleMessage("E hiahiatia naa te kupuhipa"), - "Password must contain at least 8 characters" : MessageLookupByLibrary.simpleMessage("Me mau te kupuhipa iti atu i te 8 ngā pūāhua"), - "Password…" : MessageLookupByLibrary.simpleMessage("Kupuhipa ..."), - "Planner Note" : MessageLookupByLibrary.simpleMessage("Mahere Tuhipoka"), - "Please enter a valid email address" : MessageLookupByLibrary.simpleMessage("Tēnā koa whakauru he īmēra wāhitau whiwhi mana"), - "Please enter an email address" : MessageLookupByLibrary.simpleMessage("Tēnā koa whakauru he īmēra wāhitau"), - "Please enter full name" : MessageLookupByLibrary.simpleMessage("Tēnā koa whakauru he ingoa hou.tonu"), - "Please scan a QR code generated by Canvas" : MessageLookupByLibrary.simpleMessage("Tēnā koa mātai he QR Waehere kua whakamahia e Canvas"), - "Plum, Purple" : MessageLookupByLibrary.simpleMessage("Paramū, Waiporoporo"), - "Preparing…" : MessageLookupByLibrary.simpleMessage("E whakareri ana..."), - "Previous Logins" : MessageLookupByLibrary.simpleMessage("Ngā takiurunga o mua"), - "Privacy Policy" : MessageLookupByLibrary.simpleMessage("Kaupapahere Tūmataiti"), - "Privacy Policy Link" : MessageLookupByLibrary.simpleMessage("Kaupapahere Tūmataiti Hono"), - "Privacy policy, terms of use, open source" : MessageLookupByLibrary.simpleMessage("Kaupapahere tūmataitinga, tikanga whakamahi, puna tuwhera"), - "QR Code" : MessageLookupByLibrary.simpleMessage("QR Waehere"), - "QR scanning requires camera access" : MessageLookupByLibrary.simpleMessage("Ka hiahiatia te QR mātai i te whakauru ki te kāmera."), - "Raspberry, Red" : MessageLookupByLibrary.simpleMessage("Rāpere, Whero"), - "Recipients" : MessageLookupByLibrary.simpleMessage("Ngā Kaiwhiwhi"), - "Refresh" : MessageLookupByLibrary.simpleMessage("Whakahouhia"), - "Remind Me" : MessageLookupByLibrary.simpleMessage("Whakamaumahara mai ki au"), - "Reminders" : MessageLookupByLibrary.simpleMessage("Ngā Whakamaumahara"), - "Reminders have changed!" : MessageLookupByLibrary.simpleMessage("Kua huria ngā Maumahara!"), - "Reply" : MessageLookupByLibrary.simpleMessage("Whakautu"), - "Reply All" : MessageLookupByLibrary.simpleMessage("Whakautu ki te katoa"), - "Report A Problem" : MessageLookupByLibrary.simpleMessage("Pūrongo te raruraru"), - "Request Login Help" : MessageLookupByLibrary.simpleMessage("Tonoa Takiuru Awhina"), - "Request Login Help Button" : MessageLookupByLibrary.simpleMessage("Tonoa Takiuru Awhina Pātene"), - "Restart app" : MessageLookupByLibrary.simpleMessage("Whakamahi anō te taupanga"), - "Retry" : MessageLookupByLibrary.simpleMessage("Ngana anō"), - "Return to Login" : MessageLookupByLibrary.simpleMessage("Hoki ki te takiuru"), - "STUDENT" : MessageLookupByLibrary.simpleMessage("ĀKONGA"), - "Screenshot showing location of QR code generation in browser" : MessageLookupByLibrary.simpleMessage("Tangirua e whkātu ana rohe o te QR Waehere whakamahia i roto i te pūtirotiro"), - "Screenshot showing location of pairing QR code generation in the Canvas Student app" : MessageLookupByLibrary.simpleMessage("Pere mata e tohu ana te wāhi o te hono QR Waehere whakatupuranga i roto i te Canvas Ākonga Taupanga"), - "Select" : MessageLookupByLibrary.simpleMessage("Tīpakohia"), - "Select Student Color" : MessageLookupByLibrary.simpleMessage("Tīpakohia te Ākonga Rōpū"), - "Select recipients" : MessageLookupByLibrary.simpleMessage("Tīpako ngā kaiwhiwhi"), - "Send Feedback" : MessageLookupByLibrary.simpleMessage("Tuku Urupare"), - "Send a message about this assignment" : MessageLookupByLibrary.simpleMessage("Tukuna he karere mō tēnei whakataunga"), - "Send a message about this course" : MessageLookupByLibrary.simpleMessage("Tukuna he karere mō tēnei akoranga"), - "Send message" : MessageLookupByLibrary.simpleMessage("Tuku karere"), - "Set a date and time to be notified of this event." : MessageLookupByLibrary.simpleMessage("Whakatau he rā me te wā hei whakamōhiotia mo tēnei tauwhainga."), - "Set a date and time to be notified of this specific assignment." : MessageLookupByLibrary.simpleMessage("Whakatau he rā me te wā hei whakamōhiotia mo tēnei whakataunga ake."), - "Settings" : MessageLookupByLibrary.simpleMessage("Ngā Tautuhinga"), - "Shamrock, Green" : MessageLookupByLibrary.simpleMessage("Rangirua, Kākariki"), - "Share Your Love for the App" : MessageLookupByLibrary.simpleMessage("Tuari Tō Aroha mō te Taupānga"), - "Show Password" : MessageLookupByLibrary.simpleMessage("Whakatu Kupuhipa"), - "Sign In" : MessageLookupByLibrary.simpleMessage("Waitohu I roto i"), - "Something went wrong trying to create your account, please reach out to your school for assistance." : MessageLookupByLibrary.simpleMessage("I raruraru tētahi mea i te wā e ngāna ana ki te hanga i tō pūkete; tēnā koa toro atu ki tō kura hei āwhina."), - "Something\'s broken but I can work around it to get what I need done." : MessageLookupByLibrary.simpleMessage("Kua pakaru tētahi mea ēngari ka taea e ahau te mahi a tawhio noa ki a oti ai ngā mea e hiahia ana ahau."), - "Stop Acting as User" : MessageLookupByLibrary.simpleMessage("Kati te mahi rite tonu i te kaiwhakamahi"), - "Student" : MessageLookupByLibrary.simpleMessage("Ākonga"), - "Student Pairing" : MessageLookupByLibrary.simpleMessage("Akonga Hono"), - "Students can create a QR code using the Canvas Student app on their mobile device" : MessageLookupByLibrary.simpleMessage("Ka taea e ng aākonga te hanga he QR waehere ma te mahi i te Canvas Ākonga Taupanga i runga i tā rātou taonga haerēre"), - "Students can obtain a pairing code through the Canvas website" : MessageLookupByLibrary.simpleMessage("Ka taea e ngā ākonga te tiki waihere hono ma te mahi i te Canvas nipurangi"), - "Subject" : MessageLookupByLibrary.simpleMessage("Kaupapa"), - "Submitted" : MessageLookupByLibrary.simpleMessage("Kua Tukuna"), - "Successfully submitted!" : MessageLookupByLibrary.simpleMessage("Oti pai te tuku!"), - "Summary" : MessageLookupByLibrary.simpleMessage("Whakarāpopototanga"), - "Switch Users" : MessageLookupByLibrary.simpleMessage("Whakakā ngā Kaiwhakamahi"), - "Syllabus" : MessageLookupByLibrary.simpleMessage("Marautanga"), - "TA" : MessageLookupByLibrary.simpleMessage("TA"), - "TEACHER" : MessageLookupByLibrary.simpleMessage("KAIAKO"), - "Tap to favorite the courses you want to see on the Calendar. Select up to 10." : MessageLookupByLibrary.simpleMessage("Pātō ki te hiahia o te akoranga e hiahia ana koe ki te kite i runga i te Maramataka. Tīpakohia ki 10."), - "Tap to pair with a new student" : MessageLookupByLibrary.simpleMessage("Pātō ki te hono me tētahi ākonga hou"), - "Tap to select this student" : MessageLookupByLibrary.simpleMessage("Pātō ki te tīpako i tēnei ākonga"), - "Tap to show student selector" : MessageLookupByLibrary.simpleMessage("Pātō ki te whakātu te kaitīpako o te ākonga"), - "Teacher" : MessageLookupByLibrary.simpleMessage("Kaiako"), - "Tell us about your favorite parts of the app" : MessageLookupByLibrary.simpleMessage("Korerotia mai ki a matou ngā wahi tino makau o te taupānga ki a koe"), - "Terms of Service" : MessageLookupByLibrary.simpleMessage("Ngā Ture o te Ratonga"), - "Terms of Service Link" : MessageLookupByLibrary.simpleMessage("Ngā Ture o te Ratonga Hono"), - "Terms of Use" : MessageLookupByLibrary.simpleMessage("Ngā ritenga whakamahi"), - "The QR code you scanned may have expired. Refresh the code on the student\'s device and try again." : MessageLookupByLibrary.simpleMessage("Te QR Waehere kua matawaiatia e koe kua pau Whakahou te waeherre i runga i te taputapu a te ākonga ana ka ngana anō"), - "The following information will help us better understand your idea:" : MessageLookupByLibrary.simpleMessage("Ka awhinatia mātou ki te mōhio i tō whakāro i ngā mōhiohio e whai ake nei:"), - "The server you entered is not authorized for this app." : MessageLookupByLibrary.simpleMessage("E kore te tūmau kua whakauru koe te mana mo tenei taupānga."), - "The student you are trying to add belongs to a different school. Log in or create an account with that school to scan this code." : MessageLookupByLibrary.simpleMessage("Ko te akonga e ngana ana koe ki te tāpiri nō tētahi kura rerekē. Whakauru ara hanga rānei he pūkete me tēra kura ki te matawai ki tēnei waehere"), - "The user agent for this app is not authorized." : MessageLookupByLibrary.simpleMessage("Te kaihoko kaiwhakamahi mo tenei taupānga kaore i manatia."), - "Theme" : MessageLookupByLibrary.simpleMessage("Kaupapa"), - "There are no installed applications that can open this file" : MessageLookupByLibrary.simpleMessage("Kaore he taupānga kua whakaurutia ka taea te huaki i tēnei kōnae"), - "There is no page information available." : MessageLookupByLibrary.simpleMessage("Kāore he mōhiohio whārangi e wātea ana."), - "There was a problem loading the Terms of Use" : MessageLookupByLibrary.simpleMessage("He raruraru i te wā e uta ana i ngā Ture Whakamahia"), - "There was a problem removing this student from your account. Please check your connection and try again." : MessageLookupByLibrary.simpleMessage("He raruraru i te wā e tango ana i tēnei ākonga mai i tō pūkete Tēnā koa tirohia tō hononga ana ka tarai anō."), - "There was an error loading recipients for this course" : MessageLookupByLibrary.simpleMessage("He hapa i te wā e uta ana i ngā kaiwhiwhi mo tēnei akoranga"), - "There was an error loading the summary details for this course." : MessageLookupByLibrary.simpleMessage("He hapa i te wā e uta ana i ngā taipitopito whakarāpopotanga mo tēnei akoranga."), - "There was an error loading this announcement" : MessageLookupByLibrary.simpleMessage("He hapa i te wā e uta ana i tēnei pānui"), - "There was an error loading this conversation" : MessageLookupByLibrary.simpleMessage("He hapa i te wā e uta ana i tēnei kōrerorero"), - "There was an error loading this file" : MessageLookupByLibrary.simpleMessage("He hapa i te wā e uta ana i tēnei kōnae"), - "There was an error loading your inbox messages." : MessageLookupByLibrary.simpleMessage("He hapa i te wā e uta ana tō karere pouaka whakauru."), - "There was an error loading your student\'s alerts." : MessageLookupByLibrary.simpleMessage("He hapa i te wā e uta ana ngā matohi a tō ākonga."), - "There was an error loading your student\'s calendar" : MessageLookupByLibrary.simpleMessage("He hapa i te wā e uta ana te maramataka a tō ākonga"), - "There was an error loading your students." : MessageLookupByLibrary.simpleMessage("He hapa i te wā e uta ana i ō ākonga."), - "There was an error loading your student’s courses." : MessageLookupByLibrary.simpleMessage("He hapa i te wā e uta ana i tō ākonga akoranga."), - "There was an error logging in. Please generate another QR Code and try again." : MessageLookupByLibrary.simpleMessage("He hapa i puta i te wā e takiuru ana. Tēnā koa whakamahi he QR Waehere anō ka ngana anō."), - "There was an error trying to act as this user. Please check the Domain and User ID and try again." : MessageLookupByLibrary.simpleMessage("He hapa i te wā e ngana ana ki te mahi hei kaiwhakamahi. Tēnā koa āta titiro te Rohe me Kaiwhakamahi ID ana ka ngana anō."), - "There’s nothing to be notified of yet." : MessageLookupByLibrary.simpleMessage("Kaore he mea hei whakamōhio i tēnei wā."), - "This app is not authorized for use." : MessageLookupByLibrary.simpleMessage("Kaore e mana tēnei taupānga ki te whakamahi."), - "This course does not have any assignments or calendar events yet." : MessageLookupByLibrary.simpleMessage("Kaore he whakataunga mo tēnei akoranga ara maramataka tauwhainga rānei i tēnei wā."), - "This file is unsupported and can’t be viewed through the app" : MessageLookupByLibrary.simpleMessage("Kaore tēnei konae i te tautokotia ana kaore e taea te kitea ma te taupānga"), - "This will unpair and remove all enrollments for this student from your account." : MessageLookupByLibrary.simpleMessage("Ka kore hono tēnei ara ka tango ngā whakaurunga mo tēnei ākonga mai i tō pūkete"), - "Total Grade" : MessageLookupByLibrary.simpleMessage("Kōeke Tapeke"), - "Uh oh!" : MessageLookupByLibrary.simpleMessage("Aue!"), - "Unable to fetch courses. Please check your connection and try again." : MessageLookupByLibrary.simpleMessage("Kaore e taea te tiki i ngā akoranga. Tēnā koa tirohia tō hononga ana ka tarai anō."), - "Unable to load this image" : MessageLookupByLibrary.simpleMessage("Kaore e taea te uta tēnei āhua"), - "Unable to play this media file" : MessageLookupByLibrary.simpleMessage("Kaore e taea te whakamahi i tēnei kōnae Pāpāho"), - "Unable to send message. Check your connection and try again." : MessageLookupByLibrary.simpleMessage("Kaore e taea tuku Karere. Tirohia tō hononga ana ka ngana anō."), - "Under Construction" : MessageLookupByLibrary.simpleMessage("Kei raro i te hanga"), - "Unknown User" : MessageLookupByLibrary.simpleMessage("Kaiwhakamahi kaore e mōhiotia"), - "Unsaved changes" : MessageLookupByLibrary.simpleMessage("Ngā whakarerekētanga kaore i tiakina"), - "Unsupported File" : MessageLookupByLibrary.simpleMessage("Kaore e tautokotia kōnae"), - "Upload File" : MessageLookupByLibrary.simpleMessage("Tukuake Kōnae"), - "Use Camera" : MessageLookupByLibrary.simpleMessage("Whakamahi te Kāmera"), - "Use Dark Theme in Web Content" : MessageLookupByLibrary.simpleMessage("Whakamahia Kaupapa Pouri i roto i te Ipurangi Ihirangi"), - "User ID" : MessageLookupByLibrary.simpleMessage("Kaiwhakamahi ID"), - "User ID:" : MessageLookupByLibrary.simpleMessage("ID Kaiwhakamahi:"), - "Version Number" : MessageLookupByLibrary.simpleMessage("Whakāturanga Tau"), - "View Description" : MessageLookupByLibrary.simpleMessage("Tirohia te whakāturanga"), - "View error details" : MessageLookupByLibrary.simpleMessage("Tirohia ngā hapa taipitopito"), - "View the Privacy Policy" : MessageLookupByLibrary.simpleMessage("Tirohia te Kaupapahere Tūmataiti"), - "We are currently building this feature for your viewing pleasure." : MessageLookupByLibrary.simpleMessage("Kei te hanga mātou i tēnei āhuatanga kia pai ai tō mātakitaki."), - "We are unable to display this link, it may belong to an institution you currently aren\'t logged in to." : MessageLookupByLibrary.simpleMessage("Kaore e taea e mātou te whakātu i tēnei hono, ekene e mau ana ki tētahi whakanōhanga kaore koe i te takiuru i tēnei wā."), - "We couldn\'t find any students associated with this account" : MessageLookupByLibrary.simpleMessage("Kaore i kitea e mātou ngā ākonga e hono ana ki tēnei pūkete"), - "We were unable to verify the server for use with this app." : MessageLookupByLibrary.simpleMessage("I taea e mātou ki te manatoko i te tūmau mō te whakamahi ki tenei taupānga matou."), - "We’re not sure what happened, but it wasn’t good. Contact us if this keeps happening." : MessageLookupByLibrary.simpleMessage("Kaore mātou i te tino mōhio he aha te mahi, ngari kaore i te pai. Whakapā mai ki a mātou mehemea ka mahi pēnei tonu tēnei."), - "What can we do better?" : MessageLookupByLibrary.simpleMessage("Me pēhea e whakapiki ake ai te mahi e mātou?"), - "Yes" : MessageLookupByLibrary.simpleMessage("Ae"), - "You are not observing any students." : MessageLookupByLibrary.simpleMessage("Kaore koe e tirotiro ana ētahi ākonga."), - "You may only choose 10 calendars to display" : MessageLookupByLibrary.simpleMessage("Me kōwhiria e koe 10 maramataka anake ki te whakātu"), - "You must enter a user id" : MessageLookupByLibrary.simpleMessage("Me whakauru e koe he kaiwhakamahi id"), - "You must enter a valid domain" : MessageLookupByLibrary.simpleMessage("Me whakauru e koe i te rohe whaimana"), - "You must select at least one calendar to display" : MessageLookupByLibrary.simpleMessage("Me tīpako i te iti rawa tētahi maramataka ki te whakātu"), - "You will be notified about this assignment on…" : MessageLookupByLibrary.simpleMessage("Ka whakamōhiotia koe mo tēnei whakataunga i runga i..."), - "You will be notified about this event on…" : MessageLookupByLibrary.simpleMessage("Ka whakamōhiotia koe mo tēnei tauwhainga i runga i..."), - "You\'ll find the QR code on the web in your account profile. Click \'QR for Mobile Login\' in the list." : MessageLookupByLibrary.simpleMessage("Ka kitea e koe te QR waehere i runga i te ipurangi i roto i tō pūkete kōtaha. Pātō QR mo te Waea Haerēre Takiuru i roto i te rārangi."), - "You\'ll need to open your student\'s Canvas Student app to continue. Go into Main Menu > Settings > Pair with Observer and scan the QR code you see there." : MessageLookupByLibrary.simpleMessage("Me huakina tō Canvas Ākonga Taupanga ki te haere tonu Haere ki roto i te Tahua Matua > Ngā Tautuhinga me te Kaitirotiro me te matawai i te QR Waehere ka kitea e koe i reira"), - "Your code is incorrect or expired." : MessageLookupByLibrary.simpleMessage("Kei te hē kua pau rānei tō waihere."), - "Your student’s courses might not be published yet." : MessageLookupByLibrary.simpleMessage("Kaore e pānuitia ō ākonga akoranga i tēnei wā."), - "You’re all caught up!" : MessageLookupByLibrary.simpleMessage("Kua mau katoa koe!"), - "actingAsUser" : m0, - "alertsLabel" : MessageLookupByLibrary.simpleMessage("He whakamataara"), - "appVersion" : m1, - "assignmentGradeAboveThreshold" : m2, - "assignmentGradeBelowThreshold" : m3, - "assignmentLockedModule" : m4, - "assignmentSubjectMessage" : m5, - "assignmentTotalPoints" : m6, - "assignmentTotalPointsAccessible" : m7, - "authorToNOthers" : m8, - "authorToRecipient" : m9, - "authorToRecipientAndNOthers" : m10, - "badgeNumberPlus" : m11, - "calendarLabel" : MessageLookupByLibrary.simpleMessage("Maramataka"), - "canvasGuides" : MessageLookupByLibrary.simpleMessage("Canvas Kaiārahi"), - "canvasLogoLabel" : MessageLookupByLibrary.simpleMessage("Canvas moko"), - "canvasSupport" : MessageLookupByLibrary.simpleMessage("Canvas Tautoko"), - "changeStudentColorLabel" : m12, - "collapse" : MessageLookupByLibrary.simpleMessage("hinga"), - "collapsed" : MessageLookupByLibrary.simpleMessage("hinga"), - "contentDescriptionScoreOutOfPointsPossible" : m13, - "courseForWhom" : m14, - "courseGradeAboveThreshold" : m15, - "courseGradeBelowThreshold" : m16, - "coursesLabel" : MessageLookupByLibrary.simpleMessage("Ngā Akoranga"), - "dateAtTime" : m17, - "dismissAlertLabel" : m18, - "domainSearchHelpBody" : m19, - "domainSearchHelpLabel" : MessageLookupByLibrary.simpleMessage("Me pehea e kitea ai e ahau taku kura rohe rānei?"), - "domainSearchInputHint" : MessageLookupByLibrary.simpleMessage("Whakauru kura ingoa rohe rānei..."), - "dueDateAtTime" : m20, - "endMasqueradeLogoutMessage" : m21, - "endMasqueradeMessage" : m22, - "eventSubjectMessage" : m23, - "eventTime" : m24, - "expand" : MessageLookupByLibrary.simpleMessage("whakawhānui"), - "expanded" : MessageLookupByLibrary.simpleMessage("whakawhānui"), - "finalGrade" : m25, - "findSchool" : MessageLookupByLibrary.simpleMessage("Kimihia taku kura"), - "frontPageSubjectMessage" : m26, - "gradeFormatScoreOutOfPointsPossible" : m27, - "gradesSubjectMessage" : m28, - "latePenalty" : m29, - "me" : MessageLookupByLibrary.simpleMessage("ahau"), - "messageLinkPostscript" : m30, - "minus" : MessageLookupByLibrary.simpleMessage("tango"), - "mustBeAboveN" : m31, - "mustBeBelowN" : m32, - "next" : MessageLookupByLibrary.simpleMessage("E haere ake nei"), - "nextMonth" : m33, - "nextWeek" : m34, - "noDomainResults" : m35, - "ok" : MessageLookupByLibrary.simpleMessage("Ae"), - "outOfPoints" : m36, - "plusRecipientCount" : m37, - "pointsPossible" : m38, - "previousMonth" : m39, - "previousWeek" : m40, - "qrCreateAccountTos" : m41, - "ratingDialogEmailSubject" : m42, - "selectedMonthLabel" : m43, - "send" : MessageLookupByLibrary.simpleMessage("tukua"), - "starRating" : m44, - "submissionStatusSuccessSubtitle" : m45, - "syllabusSubjectMessage" : m46, - "unread" : MessageLookupByLibrary.simpleMessage("kaore i pānuitia"), - "unreadCount" : m47 - }; -} diff --git a/apps/flutter_parent/lib/l10n/generated/messages_nb.dart b/apps/flutter_parent/lib/l10n/generated/messages_nb.dart deleted file mode 100644 index 2a895d6542..0000000000 --- a/apps/flutter_parent/lib/l10n/generated/messages_nb.dart +++ /dev/null @@ -1,473 +0,0 @@ -// DO NOT EDIT. This is code generated via package:intl/generate_localized.dart -// This is a library that provides messages for a nb locale. All the -// messages from the main program should be duplicated here with the same -// function name. - -// Ignore issues from commonly used lints in this file. -// ignore_for_file:unnecessary_brace_in_string_interps, unnecessary_new -// ignore_for_file:prefer_single_quotes,comment_references, directives_ordering -// ignore_for_file:annotate_overrides,prefer_generic_function_type_aliases -// ignore_for_file:unused_import, file_names - -import 'package:intl/intl.dart'; -import 'package:intl/message_lookup_by_library.dart'; - -final messages = new MessageLookup(); - -typedef String MessageIfAbsent(String messageStr, List args); - -class MessageLookup extends MessageLookupByLibrary { - String get localeName => 'nb'; - - static m0(userName) => "Du opptrer som ${userName}"; - - static m1(version) => "v. ${version}"; - - static m2(threshold) => "Oppgavevurdering over ${threshold}"; - - static m3(threshold) => "Oppgavevurdering under ${threshold}"; - - static m4(moduleName) => "Denne oppgaven er låst av modulen \"${moduleName}\"."; - - static m5(studentName, assignmentName) => "Vedrørende: ${studentName}, Oppgave - ${assignmentName}"; - - static m6(points) => "${points} poeng"; - - static m7(points) => "${points} poeng"; - - static m8(authorName, howMany) => "${Intl.plural(howMany, one: '${authorName} til 1 annen', other: '${authorName} til ${howMany} andre')}"; - - static m9(authorName, recipientName) => "${authorName} til ${recipientName}"; - - static m10(authorName, recipientName, howMany) => "${Intl.plural(howMany, one: '${authorName} til ${recipientName} og 1 annen', other: '${authorName} til ${recipientName} og ${howMany} andre')}"; - - static m11(count) => "${count}+"; - - static m12(studentName) => "Endre farge for ${studentName}"; - - static m13(score, pointsPossible) => "${score} av ${pointsPossible} poeng"; - - static m14(studentShortName) => "for ${studentShortName}"; - - static m15(threshold) => "Emnevurdering over ${threshold}"; - - static m16(threshold) => "Emnevurdering under ${threshold}"; - - static m17(date, time) => "${date} på ${time}"; - - static m18(alertTitle) => "Avvise ${alertTitle}"; - - static m19(canvasGuides, canvasSupport) => "Prøv å søke på navnet til skolen eller området du forsøker å få tilgang til som f.eks. “Smith privatskole” eller “Smith kommunal skole.” Du kan også angi et Canvas-domene direkte som f.eks. “smith.instructure.com.”\n\nHvis du vil ha mer informasjon om hvordan du finner Canvas-kontoen til din institusjon, besøk ${canvasGuides}, spør etter ${canvasSupport} eller kontakt skolen din for hjelp."; - - static m20(date, time) => "Frist ${date} klokken ${time}"; - - static m21(userName) => "Du vil slutte å opptre som ${userName} og bli logget ut."; - - static m22(userName) => "Du vil slutte å opptre som ${userName} og gå tilbake til din originale konto."; - - static m23(studentName, eventTitle) => "Vedrørende: ${studentName}, Hendelse - ${eventTitle}"; - - static m24(startAt, endAt) => "${startAt} - ${endAt}"; - - static m25(grade) => "Avsluttende karakter: ${grade}"; - - static m26(studentName) => "Vedrørende: ${studentName}, Forside"; - - static m27(score, pointsPossible) => "${score} / ${pointsPossible}"; - - static m28(studentName) => "Vedrørende: ${studentName}, Karakterer"; - - static m29(pointsLost) => "Forsinkelsesstraff (-${pointsLost})"; - - static m30(studentName, linkUrl) => "Vedrørende: ${studentName}, ${linkUrl}"; - - static m31(percentage) => "Må være over ${percentage}"; - - static m32(percentage) => "Må være under ${percentage}"; - - static m33(month) => "Neste måned: ${month}"; - - static m34(date) => "Neste uke begynner ${date}"; - - static m35(query) => "Kan ikke finne skoler som stemmer med \"${query}\""; - - static m36(points, howMany) => "${Intl.plural(howMany, one: 'av 1 poeng', other: 'av ${points} poenger')}"; - - static m37(count) => "+${count}"; - - static m38(points) => "${points} poeng oppnåelig"; - - static m39(month) => "Forrige måned: ${month}"; - - static m40(date) => "Forrige uke begynte ${date}"; - - static m41(termsOfService, privacyPolicy) => "Ved å trykke på Opprett konto, samtykker du til ${termsOfService} og godtar ${privacyPolicy}"; - - static m42(version) => "Forslag for Android - Canvas foreldre ${version}"; - - static m43(month) => "Måned ${month}"; - - static m44(position) => "${Intl.plural(position, one: '${position} stjerne', other: '${position} stjerner')}"; - - static m45(date, time) => "Denne oppgaven ble levert den ${date} klokken ${time} og avventer vurdering."; - - static m46(studentName) => "Vedrørende: ${studentName}, Emneoversikt"; - - static m47(count) => "${count} ulest"; - - final messages = _notInlinedMessages(_notInlinedMessages); - static _notInlinedMessages(_) => { - "\"Act as\" is essentially logging in as this user without a password. You will be able to take any action as if you were this user, and from other users\' points of views, it will be as if this user performed them. However, audit logs record that you were the one who performed the actions on behalf of this user." : MessageLookupByLibrary.simpleMessage("\"Oppfør deg som\" er i realiteten å logge inn som denne brukeren uten passord. Du vil kunne utføre alle handlinger som om du var denne brukeren, og for andre brukere vil det se ut som om at denne brukeren utførte handlingene. Overvåkingloggen vil likevel notere at det var du som utførte handlingene på vegne av denne brukeren."), - "-" : MessageLookupByLibrary.simpleMessage("-"), - "A description is required." : MessageLookupByLibrary.simpleMessage("Du må ha en beskrivelse."), - "A network error occurred when adding this student. Check your connection and try again." : MessageLookupByLibrary.simpleMessage("Det oppsto en nettverksfeil da du la til denne studenten. Kontroller tilkoblingen og prøv på nytt."), - "A subject is required." : MessageLookupByLibrary.simpleMessage("Du må ha en tittel."), - "Act As User" : MessageLookupByLibrary.simpleMessage("Opptre som bruker"), - "Add Student" : MessageLookupByLibrary.simpleMessage("Legg til student"), - "Add attachment" : MessageLookupByLibrary.simpleMessage("Legg til vedlegg"), - "Add new student" : MessageLookupByLibrary.simpleMessage("Legg til ny student"), - "Add student with…" : MessageLookupByLibrary.simpleMessage("Legg til en student til..."), - "Alert Settings" : MessageLookupByLibrary.simpleMessage("Varselsinnstillinger"), - "Alert me when…" : MessageLookupByLibrary.simpleMessage("Varsle meg når..."), - "All Grading Periods" : MessageLookupByLibrary.simpleMessage("Alle vurderingsperioder"), - "Already have an account? " : MessageLookupByLibrary.simpleMessage("Har du allerede en konto? "), - "An email address is required." : MessageLookupByLibrary.simpleMessage("Du må ha en e-postadresse."), - "An error occurred when trying to display this link" : MessageLookupByLibrary.simpleMessage("Feil oppsto da du ønsket å vise denne lenken."), - "An error occurred while saving your selection. Please try again." : MessageLookupByLibrary.simpleMessage("Det oppsto en feil ved lagring av valget ditt. Prøv på nytt."), - "An unexpected error occurred" : MessageLookupByLibrary.simpleMessage("Det oppsto en uventet feil"), - "Android OS version" : MessageLookupByLibrary.simpleMessage("Android OS-versjon"), - "Appearance" : MessageLookupByLibrary.simpleMessage("Utseende"), - "Application version" : MessageLookupByLibrary.simpleMessage("Applikasjonsversjon"), - "Are you a student or teacher?" : MessageLookupByLibrary.simpleMessage("Er du lærer eller student?"), - "Are you sure you want to log out?" : MessageLookupByLibrary.simpleMessage("Er du sikker på at du vil logge ut?"), - "Are you sure you wish to close this page? Your unsent message will be lost." : MessageLookupByLibrary.simpleMessage("Er du sikker på at du vil lukke denne siden? Dine usendte meldinger vil bli slettet."), - "Assignment Details" : MessageLookupByLibrary.simpleMessage("Oppgavedetaljer"), - "Assignment grade above" : MessageLookupByLibrary.simpleMessage("Oppgavevurdering over"), - "Assignment grade below" : MessageLookupByLibrary.simpleMessage("Oppgavevurdering under"), - "Assignment missing" : MessageLookupByLibrary.simpleMessage("Oppgave mangler"), - "Barney, Fuschia" : MessageLookupByLibrary.simpleMessage("Barney, fuchsia"), - "Calendars" : MessageLookupByLibrary.simpleMessage("Kalendere"), - "Camera Permission" : MessageLookupByLibrary.simpleMessage("Kameratillatelse"), - "Cancel" : MessageLookupByLibrary.simpleMessage("Avbryt"), - "Canvas Student" : MessageLookupByLibrary.simpleMessage("Canvas-student"), - "Canvas Teacher" : MessageLookupByLibrary.simpleMessage("Canvas Teacher"), - "Canvas on GitHub" : MessageLookupByLibrary.simpleMessage("Canvas på GitHub"), - "Choose a course to message" : MessageLookupByLibrary.simpleMessage("Velg et emne du vil sende melding til"), - "Choose from Gallery" : MessageLookupByLibrary.simpleMessage("Velg fra galleri"), - "Complete" : MessageLookupByLibrary.simpleMessage("Fullført"), - "Contact Support" : MessageLookupByLibrary.simpleMessage("ta kontakt med kundestøtte"), - "Course Announcement" : MessageLookupByLibrary.simpleMessage("Emne-kunngjøring"), - "Course Announcements" : MessageLookupByLibrary.simpleMessage("Emnekunngjøringer"), - "Course grade above" : MessageLookupByLibrary.simpleMessage("Emnevurdering over"), - "Course grade below" : MessageLookupByLibrary.simpleMessage("Emnevurdering under"), - "Create Account" : MessageLookupByLibrary.simpleMessage("Opprett konto"), - "Dark Mode" : MessageLookupByLibrary.simpleMessage("Mørk modus"), - "Date" : MessageLookupByLibrary.simpleMessage("Dato"), - "Delete" : MessageLookupByLibrary.simpleMessage("Slett"), - "Description" : MessageLookupByLibrary.simpleMessage("Beskrivelse"), - "Device" : MessageLookupByLibrary.simpleMessage("Enhet"), - "Device model" : MessageLookupByLibrary.simpleMessage("Enhetsmodell"), - "Domain" : MessageLookupByLibrary.simpleMessage("Domene"), - "Domain:" : MessageLookupByLibrary.simpleMessage("Domene:"), - "Don\'t show again" : MessageLookupByLibrary.simpleMessage("Ikke vis igjen"), - "Done" : MessageLookupByLibrary.simpleMessage("Ferdig"), - "Download" : MessageLookupByLibrary.simpleMessage("Last ned"), - "Due" : MessageLookupByLibrary.simpleMessage("Forfall"), - "EXTREME CRITICAL EMERGENCY!!" : MessageLookupByLibrary.simpleMessage("EKSTREMT KRITISK NØDSITUASJON!!"), - "Electric, blue" : MessageLookupByLibrary.simpleMessage("Elektrisk, blå"), - "Email Address" : MessageLookupByLibrary.simpleMessage("E-postadresse"), - "Email:" : MessageLookupByLibrary.simpleMessage("E-post:"), - "Email…" : MessageLookupByLibrary.simpleMessage("E-post…"), - "Enter the student pairing code provided to you. If the pairing code doesn\'t work, it may have expired" : MessageLookupByLibrary.simpleMessage("Angi studentparingskoden som ble gitt til deg. Hvis paringskoden ikke fungerer kan det hende at den er utgått"), - "Event" : MessageLookupByLibrary.simpleMessage("Hendelse"), - "Excused" : MessageLookupByLibrary.simpleMessage("Fritatt"), - "Expired QR Code" : MessageLookupByLibrary.simpleMessage("Utgått QR-kode"), - "Failed. Tap for options." : MessageLookupByLibrary.simpleMessage("Mislyktes. Trykk for alternativer."), - "Filter" : MessageLookupByLibrary.simpleMessage("Filter"), - "Filter by" : MessageLookupByLibrary.simpleMessage("Filtrer etter"), - "Fire, Orange" : MessageLookupByLibrary.simpleMessage("Ild, oransje"), - "Front Page" : MessageLookupByLibrary.simpleMessage("Forside"), - "Full Name" : MessageLookupByLibrary.simpleMessage("Fullt navn"), - "Full Name…" : MessageLookupByLibrary.simpleMessage("Fullt navn…"), - "Full error message" : MessageLookupByLibrary.simpleMessage("Fullstendig feilmelding"), - "Go to today" : MessageLookupByLibrary.simpleMessage("Gå til idag"), - "Grade" : MessageLookupByLibrary.simpleMessage("Karakter"), - "Grade percentage" : MessageLookupByLibrary.simpleMessage("Karakterskala i prosent"), - "Graded" : MessageLookupByLibrary.simpleMessage("Karaktersatt"), - "Grades" : MessageLookupByLibrary.simpleMessage("Karakterer"), - "Help" : MessageLookupByLibrary.simpleMessage("Hjelp"), - "Hide Password" : MessageLookupByLibrary.simpleMessage("Skjul passord"), - "High Contrast Mode" : MessageLookupByLibrary.simpleMessage("Høy kontrast-modus"), - "How are we doing?" : MessageLookupByLibrary.simpleMessage("Hvordan klarer vi oss?"), - "How is this affecting you?" : MessageLookupByLibrary.simpleMessage("Hvordan påvirker dette deg?"), - "I can\'t get things done until I hear back from you." : MessageLookupByLibrary.simpleMessage("Jeg får gjort noenting før jeg hører i fra deg."), - "I don\'t have a Canvas account" : MessageLookupByLibrary.simpleMessage("Jeg har ikke en Canvas-konto"), - "I have a Canvas account" : MessageLookupByLibrary.simpleMessage("Jeg har en Canvas-konto"), - "I need some help but it\'s not urgent." : MessageLookupByLibrary.simpleMessage("Jeg trenger litt hjelp men det haster ikke."), - "I\'m having trouble logging in" : MessageLookupByLibrary.simpleMessage("Jeg har problemer med å logge inn"), - "Idea for Canvas Parent App [Android]" : MessageLookupByLibrary.simpleMessage("Idé for appen Canvas Parent [Android]"), - "In order to provide you with a better experience, we have updated how reminders work. You can add new reminders by viewing an assignment or calendar event and tapping the switch under the \"Remind Me\" section.\n\nBe aware that any reminders created with older versions of this app will not be compatible with the new changes and you will need to create them again." : MessageLookupByLibrary.simpleMessage("For å gi deg en bedre opplevelse, har vi oppdatert hvordan påminnelser fungerer. Du kan legg etil påminnelser ved å vise en oppgave eller kalenderoppføring og trykke på bryteren under avsnittet ”Påminn meg”.\n\nVær oppmerksom på at påminnelser som ble opprettet med den gamle versjonen av denne appen ikke er kompatible med de nye endringene, og at du må opprette disse på nytt."), - "Inbox" : MessageLookupByLibrary.simpleMessage("Innboks"), - "Inbox Zero" : MessageLookupByLibrary.simpleMessage("Innboks null"), - "Incomplete" : MessageLookupByLibrary.simpleMessage("Ikke godkjent"), - "Incorrect Domain" : MessageLookupByLibrary.simpleMessage("Ugyldig domene"), - "Institution Announcement" : MessageLookupByLibrary.simpleMessage("Institusjons-kunngjøring"), - "Institution Announcements" : MessageLookupByLibrary.simpleMessage("Institusjonskunngjøringer"), - "Instructions" : MessageLookupByLibrary.simpleMessage("Instruksjoner"), - "Interactions on this page are limited by your institution." : MessageLookupByLibrary.simpleMessage("Interaksjoner på denne siden er begrenset av institusjonen din."), - "Invalid QR Code" : MessageLookupByLibrary.simpleMessage("Ugyldig QR-kode"), - "It looks like a great day to rest, relax, and recharge." : MessageLookupByLibrary.simpleMessage("Det ser ut som dette er en flott dag til å slappe av og lade batteriene."), - "It looks like assignments haven\'t been created in this space yet." : MessageLookupByLibrary.simpleMessage("Det ser ut som det ikke er opprettet oppgaver i dette området enda."), - "Just a casual question, comment, idea, suggestion…" : MessageLookupByLibrary.simpleMessage("Bare et tilfeldig spørsmål, kommentar, idé eller forslag..."), - "Late" : MessageLookupByLibrary.simpleMessage("Sent"), - "Launch External Tool" : MessageLookupByLibrary.simpleMessage("Åpne eksternt verktøy"), - "Legal" : MessageLookupByLibrary.simpleMessage("Rettslig"), - "Light Mode" : MessageLookupByLibrary.simpleMessage("Lys modus"), - "Link Error" : MessageLookupByLibrary.simpleMessage("Avvik på lenke"), - "Locale:" : MessageLookupByLibrary.simpleMessage("Sted:"), - "Locate QR Code" : MessageLookupByLibrary.simpleMessage("Lokalisere QR-kode"), - "Location" : MessageLookupByLibrary.simpleMessage("Sted"), - "Locked" : MessageLookupByLibrary.simpleMessage("Låst"), - "Log Out" : MessageLookupByLibrary.simpleMessage("Logg Ut"), - "Login flow: Canvas" : MessageLookupByLibrary.simpleMessage("Innloggingsflyt: Canvas"), - "Login flow: Normal" : MessageLookupByLibrary.simpleMessage("Innloggingsflyt: Normal"), - "Login flow: Site Admin" : MessageLookupByLibrary.simpleMessage("Innloggingsflyt: Site-admin"), - "Login flow: Skip mobile verify" : MessageLookupByLibrary.simpleMessage("Innloggingsflyt: Hopp over bekreftelse med mobil"), - "Manage Students" : MessageLookupByLibrary.simpleMessage("Administrer studenter"), - "Message" : MessageLookupByLibrary.simpleMessage("Melding"), - "Message subject" : MessageLookupByLibrary.simpleMessage("Meldingstittel"), - "Missing" : MessageLookupByLibrary.simpleMessage("Mangler"), - "Must be below 100" : MessageLookupByLibrary.simpleMessage("Må være under 100"), - "Network error" : MessageLookupByLibrary.simpleMessage("Nettverksfeil"), - "Never" : MessageLookupByLibrary.simpleMessage("Aldri"), - "New message" : MessageLookupByLibrary.simpleMessage("Ny melding"), - "No" : MessageLookupByLibrary.simpleMessage("Nei"), - "No Alerts" : MessageLookupByLibrary.simpleMessage("Ingen varsler"), - "No Assignments" : MessageLookupByLibrary.simpleMessage("Ingen oppgaver"), - "No Courses" : MessageLookupByLibrary.simpleMessage("Ingen emner"), - "No Due Date" : MessageLookupByLibrary.simpleMessage("Ingen forfallsdato"), - "No Events Today!" : MessageLookupByLibrary.simpleMessage("Ingen arrangementer i dag!"), - "No Grade" : MessageLookupByLibrary.simpleMessage("Ingen karakter"), - "No Location Specified" : MessageLookupByLibrary.simpleMessage("Ingen lokalisasjon spesifisert"), - "No Students" : MessageLookupByLibrary.simpleMessage("Ingen studenter"), - "No Subject" : MessageLookupByLibrary.simpleMessage("Intet tittel"), - "No Summary" : MessageLookupByLibrary.simpleMessage("Ingen sammendrag"), - "No description" : MessageLookupByLibrary.simpleMessage("Ingen beskrivelse"), - "No recipients selected" : MessageLookupByLibrary.simpleMessage("Ingen mottakere er valgt"), - "Not Graded" : MessageLookupByLibrary.simpleMessage("Ikke karaktersatt"), - "Not Submitted" : MessageLookupByLibrary.simpleMessage("Ikke levert"), - "Not a parent?" : MessageLookupByLibrary.simpleMessage("Ikke en foresatt?"), - "Notifications for reminders about assignments and calendar events" : MessageLookupByLibrary.simpleMessage("Gir deg påminnelser om oppgaver og kalenderhendelser"), - "OS Version" : MessageLookupByLibrary.simpleMessage("OS-versjon"), - "Observer" : MessageLookupByLibrary.simpleMessage("Observatør"), - "One of our other apps might be a better fit. Tap one to visit the Play Store." : MessageLookupByLibrary.simpleMessage("En av våre andre applikasjoner kan være mer tilpasset. Trykk på en for å gå til Play Store."), - "Open Canvas Student" : MessageLookupByLibrary.simpleMessage("Åpne Canvas student"), - "Open In Browser" : MessageLookupByLibrary.simpleMessage("Åpne i nettleser"), - "Open with another app" : MessageLookupByLibrary.simpleMessage("Åpne med en annen app"), - "Pairing Code" : MessageLookupByLibrary.simpleMessage("Paringskode"), - "Password" : MessageLookupByLibrary.simpleMessage("Passord"), - "Password is required" : MessageLookupByLibrary.simpleMessage("Passord kreves"), - "Password must contain at least 8 characters" : MessageLookupByLibrary.simpleMessage("Passord må inneholde minst åtte tegn"), - "Password…" : MessageLookupByLibrary.simpleMessage("Passord…"), - "Planner Note" : MessageLookupByLibrary.simpleMessage("Planleggingsmerknad"), - "Please enter a valid email address" : MessageLookupByLibrary.simpleMessage("Oppgi en gyldig e-postadresse"), - "Please enter an email address" : MessageLookupByLibrary.simpleMessage("Angi en e-postadresse"), - "Please enter full name" : MessageLookupByLibrary.simpleMessage("Angi fullt navn"), - "Please scan a QR code generated by Canvas" : MessageLookupByLibrary.simpleMessage("Skann en QR-kode generert av Canvas"), - "Plum, Purple" : MessageLookupByLibrary.simpleMessage("Plomme, blå"), - "Preparing…" : MessageLookupByLibrary.simpleMessage("Forbereder..."), - "Previous Logins" : MessageLookupByLibrary.simpleMessage("Tidligere innlogginger"), - "Privacy Policy" : MessageLookupByLibrary.simpleMessage("retningslinjer for personvern"), - "Privacy Policy Link" : MessageLookupByLibrary.simpleMessage("Lenke til retningslinjer for personvern"), - "Privacy policy, terms of use, open source" : MessageLookupByLibrary.simpleMessage("Personvernregler, bruksvilkår, åpen kilde"), - "QR Code" : MessageLookupByLibrary.simpleMessage("QR-kode"), - "QR scanning requires camera access" : MessageLookupByLibrary.simpleMessage("QR-skanning krever kameratilgang"), - "Raspberry, Red" : MessageLookupByLibrary.simpleMessage("Bringebær, rød"), - "Recipients" : MessageLookupByLibrary.simpleMessage("Mottakere"), - "Refresh" : MessageLookupByLibrary.simpleMessage("Oppdater"), - "Remind Me" : MessageLookupByLibrary.simpleMessage("Påminnelse"), - "Reminders" : MessageLookupByLibrary.simpleMessage("Påminnelser"), - "Reminders have changed!" : MessageLookupByLibrary.simpleMessage("Påminnelser er endret!"), - "Reply" : MessageLookupByLibrary.simpleMessage("Svar"), - "Reply All" : MessageLookupByLibrary.simpleMessage("Svar alle"), - "Report A Problem" : MessageLookupByLibrary.simpleMessage("Rapporter et problem"), - "Request Login Help" : MessageLookupByLibrary.simpleMessage("Be om hjelp til å logge inn"), - "Request Login Help Button" : MessageLookupByLibrary.simpleMessage("“Be om hjelp til å logge inn”-knapp"), - "Restart app" : MessageLookupByLibrary.simpleMessage("Start app på nytt"), - "Retry" : MessageLookupByLibrary.simpleMessage("Forsøk igjen"), - "Return to Login" : MessageLookupByLibrary.simpleMessage("Tilbake til logg-inn"), - "STUDENT" : MessageLookupByLibrary.simpleMessage("STUDENT"), - "Screenshot showing location of QR code generation in browser" : MessageLookupByLibrary.simpleMessage("Skjermbilde som viser plassering av QR-kodegenerering i nettleser"), - "Screenshot showing location of pairing QR code generation in the Canvas Student app" : MessageLookupByLibrary.simpleMessage("Skjermbilde som viser plasseringen av QR-koden som genereres i Canvas Student-appen"), - "Select" : MessageLookupByLibrary.simpleMessage("Velg"), - "Select Student Color" : MessageLookupByLibrary.simpleMessage("Velg studentfarge"), - "Select recipients" : MessageLookupByLibrary.simpleMessage("Velg mottakere"), - "Send Feedback" : MessageLookupByLibrary.simpleMessage("Send tilbakemelding"), - "Send a message about this assignment" : MessageLookupByLibrary.simpleMessage("Send en melding om denne oppgaven"), - "Send a message about this course" : MessageLookupByLibrary.simpleMessage("Send en melding om dette emnet"), - "Send message" : MessageLookupByLibrary.simpleMessage("Send melding"), - "Set a date and time to be notified of this event." : MessageLookupByLibrary.simpleMessage("Angi tid og dato for påminnelse om denne oppgaven."), - "Set a date and time to be notified of this specific assignment." : MessageLookupByLibrary.simpleMessage("Angi tid og dato for påminnelse om denne bestemte oppgaven."), - "Settings" : MessageLookupByLibrary.simpleMessage("Innstillinger"), - "Shamrock, Green" : MessageLookupByLibrary.simpleMessage("Kløver, grønn"), - "Share Your Love for the App" : MessageLookupByLibrary.simpleMessage("Del din kjærlighet for appen"), - "Show Password" : MessageLookupByLibrary.simpleMessage("Vis passord"), - "Sign In" : MessageLookupByLibrary.simpleMessage("Logg inn"), - "Something went wrong trying to create your account, please reach out to your school for assistance." : MessageLookupByLibrary.simpleMessage("Noe gikk galt da vi forsøkte å opprette kontoen din. Kontakt skolen din for assistanse."), - "Something\'s broken but I can work around it to get what I need done." : MessageLookupByLibrary.simpleMessage("Noe er ødelagt, men jeg kan jobbe rundt problemet for å få gjort det jeg trenger å gjøre."), - "Stop Acting as User" : MessageLookupByLibrary.simpleMessage("Avslutt opptre som bruker"), - "Student" : MessageLookupByLibrary.simpleMessage("Student"), - "Student Pairing" : MessageLookupByLibrary.simpleMessage("Studentparing"), - "Students can create a QR code using the Canvas Student app on their mobile device" : MessageLookupByLibrary.simpleMessage("Studenter kan opprette en QR-kode ved å bruke Canvas Student-appen på mobilenheten"), - "Students can obtain a pairing code through the Canvas website" : MessageLookupByLibrary.simpleMessage("Studenter kan få en paringskode gjennom Canvas-nettstedet"), - "Subject" : MessageLookupByLibrary.simpleMessage("Tittel"), - "Submitted" : MessageLookupByLibrary.simpleMessage("Innlevert"), - "Successfully submitted!" : MessageLookupByLibrary.simpleMessage("Vellykket innlevering!"), - "Summary" : MessageLookupByLibrary.simpleMessage("Sammendrag"), - "Switch Users" : MessageLookupByLibrary.simpleMessage("Bytt brukere"), - "Syllabus" : MessageLookupByLibrary.simpleMessage("Emneoversikt"), - "TA" : MessageLookupByLibrary.simpleMessage("LA"), - "TEACHER" : MessageLookupByLibrary.simpleMessage("LÆRER"), - "Tap to favorite the courses you want to see on the Calendar. Select up to 10." : MessageLookupByLibrary.simpleMessage("Trykk for å velge emnene du ønsker på se på kalenderen. Velg opptil 10."), - "Tap to pair with a new student" : MessageLookupByLibrary.simpleMessage("Trykk for å pare opp mot ny student"), - "Tap to select this student" : MessageLookupByLibrary.simpleMessage("Trykk for å velge denne studenten"), - "Tap to show student selector" : MessageLookupByLibrary.simpleMessage("Trykk for å vise studentvelger"), - "Teacher" : MessageLookupByLibrary.simpleMessage("Lærer"), - "Tell us about your favorite parts of the app" : MessageLookupByLibrary.simpleMessage("Fortell oss om dine favorittdeler av appen"), - "Terms of Service" : MessageLookupByLibrary.simpleMessage("tjenestevilkår"), - "Terms of Service Link" : MessageLookupByLibrary.simpleMessage("Lenke til tjenestevilkår"), - "Terms of Use" : MessageLookupByLibrary.simpleMessage("bruksvilkår"), - "The QR code you scanned may have expired. Refresh the code on the student\'s device and try again." : MessageLookupByLibrary.simpleMessage("QR-koden du skannet kan ha utgått Gjenopprett koden på studentens enhet og prøv igjen."), - "The following information will help us better understand your idea:" : MessageLookupByLibrary.simpleMessage("Følgende informasjon vil hjelpe oss bedre til å forstå din idé:"), - "The server you entered is not authorized for this app." : MessageLookupByLibrary.simpleMessage("Serveren du oppga er ikke tillatt for denne appen."), - "The student you are trying to add belongs to a different school. Log in or create an account with that school to scan this code." : MessageLookupByLibrary.simpleMessage("Studenten du forsøker å legge til tilhører en annen skole. Logg inn eller opprett en konto med den skolen for å skanne denne koden."), - "The user agent for this app is not authorized." : MessageLookupByLibrary.simpleMessage("Brukeragenten for denne appen er ikke autorisert."), - "Theme" : MessageLookupByLibrary.simpleMessage("Tema"), - "There are no installed applications that can open this file" : MessageLookupByLibrary.simpleMessage("Det finnes ingen installerte applikasjoner som kan åpne denne filen"), - "There is no page information available." : MessageLookupByLibrary.simpleMessage("Det er ingen sideinformasjon tilgjengelig."), - "There was a problem loading the Terms of Use" : MessageLookupByLibrary.simpleMessage("Det oppsto et problem under opplastingen av bruksvilkårene"), - "There was a problem removing this student from your account. Please check your connection and try again." : MessageLookupByLibrary.simpleMessage("Det oppsto et problem ved fjerning av denne studenten fra kontoen din. Kontroller tilkoblingen og prøv på nytt."), - "There was an error loading recipients for this course" : MessageLookupByLibrary.simpleMessage("Det oppsto en feil under lasting av mottakere for dette emnet."), - "There was an error loading the summary details for this course." : MessageLookupByLibrary.simpleMessage("Det oppsto en feil under lasting av sammendragsdetaljer for dette emnet."), - "There was an error loading this announcement" : MessageLookupByLibrary.simpleMessage("Det oppsto en feil under lasting av denne kunngjøringen"), - "There was an error loading this conversation" : MessageLookupByLibrary.simpleMessage("Det oppsto en feil under lasting av denne samtalen"), - "There was an error loading this file" : MessageLookupByLibrary.simpleMessage("Det oppsto en feil under lasting av denne filen"), - "There was an error loading your inbox messages." : MessageLookupByLibrary.simpleMessage("Det oppsto en feil under lasting av innboksmeldingene dine."), - "There was an error loading your student\'s alerts." : MessageLookupByLibrary.simpleMessage("Det oppsto en feil under lasting av studentvarslene dine."), - "There was an error loading your student\'s calendar" : MessageLookupByLibrary.simpleMessage("Det oppsto en feil under lasting av din studentkalender."), - "There was an error loading your students." : MessageLookupByLibrary.simpleMessage("Det oppsto en feil under lasting av studentene dine."), - "There was an error loading your student’s courses." : MessageLookupByLibrary.simpleMessage("Det oppsto en feil under lasting av studentemnene dine."), - "There was an error logging in. Please generate another QR Code and try again." : MessageLookupByLibrary.simpleMessage("Det oppsto en feil ved innlogging. Vennligst lag en ny QR-kode og prøv på nytt."), - "There was an error trying to act as this user. Please check the Domain and User ID and try again." : MessageLookupByLibrary.simpleMessage("Det var en feil med å opptre som denne brukeren. Sjekk domenet og bruker-ID-en og prøv igjen."), - "There’s nothing to be notified of yet." : MessageLookupByLibrary.simpleMessage("Det er ingenting du trenger å bli varslet om enda."), - "This app is not authorized for use." : MessageLookupByLibrary.simpleMessage("Denne appen er ikke autorisert for bruk."), - "This course does not have any assignments or calendar events yet." : MessageLookupByLibrary.simpleMessage("Dette emnet mangler fortsatt oppgaver eller kalenderhendelser."), - "This file is unsupported and can’t be viewed through the app" : MessageLookupByLibrary.simpleMessage("Denne filtypen støttes ikke og kan ikke vises på appen"), - "This will unpair and remove all enrollments for this student from your account." : MessageLookupByLibrary.simpleMessage("Dette vil koble fra og fjerne alle påmeldinger for denne studenten fra kontoen din."), - "Total Grade" : MessageLookupByLibrary.simpleMessage("Samlet karakter"), - "Uh oh!" : MessageLookupByLibrary.simpleMessage("Oi sann!"), - "Unable to fetch courses. Please check your connection and try again." : MessageLookupByLibrary.simpleMessage("Kan ikke hente emner. Kontroller tilkoblingen og prøv på nytt."), - "Unable to load this image" : MessageLookupByLibrary.simpleMessage("Kan ikke laste bildet"), - "Unable to play this media file" : MessageLookupByLibrary.simpleMessage("Kan ikke spille av mediefilen"), - "Unable to send message. Check your connection and try again." : MessageLookupByLibrary.simpleMessage("Kan ikke sende melding. Kontroller tilkoblingen og prøv på nytt."), - "Under Construction" : MessageLookupByLibrary.simpleMessage("Under bygging"), - "Unknown User" : MessageLookupByLibrary.simpleMessage("Ukjent bruker"), - "Unsaved changes" : MessageLookupByLibrary.simpleMessage("Ulagrede endringer"), - "Unsupported File" : MessageLookupByLibrary.simpleMessage("Filtypen støttes ikke"), - "Upload File" : MessageLookupByLibrary.simpleMessage("Last opp fil"), - "Use Camera" : MessageLookupByLibrary.simpleMessage("Bruk kamera"), - "Use Dark Theme in Web Content" : MessageLookupByLibrary.simpleMessage("Bruk Mørkt tema i webinnhold"), - "User ID" : MessageLookupByLibrary.simpleMessage("Bruker-ID"), - "User ID:" : MessageLookupByLibrary.simpleMessage("Bruker-ID"), - "Version Number" : MessageLookupByLibrary.simpleMessage("Versjon nummer"), - "View Description" : MessageLookupByLibrary.simpleMessage("Vise beskrivelsen"), - "View error details" : MessageLookupByLibrary.simpleMessage("Vis avviksdetaljer"), - "View the Privacy Policy" : MessageLookupByLibrary.simpleMessage("Se retningslinjer for personvern"), - "We are currently building this feature for your viewing pleasure." : MessageLookupByLibrary.simpleMessage("Vi jobber for tiden med denne funksjonen slik at du kan få glede av den senere."), - "We are unable to display this link, it may belong to an institution you currently aren\'t logged in to." : MessageLookupByLibrary.simpleMessage("Vi kan ikke vise denne lenken, den kan eies av en instutisjon som du for øyeblikket ikke er innlogget i."), - "We couldn\'t find any students associated with this account" : MessageLookupByLibrary.simpleMessage("Vi kunne ikke finne noen studenter knyttet til denne kontoen"), - "We were unable to verify the server for use with this app." : MessageLookupByLibrary.simpleMessage("Vi klarte ikke å verifisere serveren for bruk med denne appen."), - "We’re not sure what happened, but it wasn’t good. Contact us if this keeps happening." : MessageLookupByLibrary.simpleMessage("Vi vet ikke hva som skjedde her, men det ser ikke bra ut. Ta kontakt med oss hvis denne situasjonen vedvarer."), - "What can we do better?" : MessageLookupByLibrary.simpleMessage("Hva kan vi gjøre bedre?"), - "Yes" : MessageLookupByLibrary.simpleMessage("Ja"), - "You are not observing any students." : MessageLookupByLibrary.simpleMessage("Du har ingen studenter under observasjon."), - "You may only choose 10 calendars to display" : MessageLookupByLibrary.simpleMessage("Du kan kun velge 10 kalendere som skal vises"), - "You must enter a user id" : MessageLookupByLibrary.simpleMessage("Du må skrive inn en bruker-ID"), - "You must enter a valid domain" : MessageLookupByLibrary.simpleMessage("Du må oppgi et gyldig domene"), - "You must select at least one calendar to display" : MessageLookupByLibrary.simpleMessage("Du må velge minst én kalender som skal vises"), - "You will be notified about this assignment on…" : MessageLookupByLibrary.simpleMessage("Du vil få en påminnelse om denne oppgaven den..."), - "You will be notified about this event on…" : MessageLookupByLibrary.simpleMessage("Du vil få en påminnelse om denne hendelsen den..."), - "You\'ll find the QR code on the web in your account profile. Click \'QR for Mobile Login\' in the list." : MessageLookupByLibrary.simpleMessage("Du finner QR-koden på nettet i kontoprofilen din. Klikk på “QR for mobil-innlogging” i listen."), - "You\'ll need to open your student\'s Canvas Student app to continue. Go into Main Menu > Settings > Pair with Observer and scan the QR code you see there." : MessageLookupByLibrary.simpleMessage("Du må åpne Canvas Student-appen til studenten din for å fortsette. Gå til Hovedmeny > Innstillinger > Paring med observatør og skann QR-koden du ser der."), - "Your code is incorrect or expired." : MessageLookupByLibrary.simpleMessage("Koden din stemmer ikke eller den er utgått"), - "Your student’s courses might not be published yet." : MessageLookupByLibrary.simpleMessage("Emnene til studentene dine er kanskje ikke publisert enda."), - "You’re all caught up!" : MessageLookupByLibrary.simpleMessage("Du er oppdatert!"), - "actingAsUser" : m0, - "alertsLabel" : MessageLookupByLibrary.simpleMessage("Varsler"), - "appVersion" : m1, - "assignmentGradeAboveThreshold" : m2, - "assignmentGradeBelowThreshold" : m3, - "assignmentLockedModule" : m4, - "assignmentSubjectMessage" : m5, - "assignmentTotalPoints" : m6, - "assignmentTotalPointsAccessible" : m7, - "authorToNOthers" : m8, - "authorToRecipient" : m9, - "authorToRecipientAndNOthers" : m10, - "badgeNumberPlus" : m11, - "calendarLabel" : MessageLookupByLibrary.simpleMessage("Kalender"), - "canvasGuides" : MessageLookupByLibrary.simpleMessage("Canvas-guider"), - "canvasLogoLabel" : MessageLookupByLibrary.simpleMessage("Canvas-logo"), - "canvasSupport" : MessageLookupByLibrary.simpleMessage("Canvas Support"), - "changeStudentColorLabel" : m12, - "collapse" : MessageLookupByLibrary.simpleMessage("skjult"), - "collapsed" : MessageLookupByLibrary.simpleMessage("skjult"), - "contentDescriptionScoreOutOfPointsPossible" : m13, - "courseForWhom" : m14, - "courseGradeAboveThreshold" : m15, - "courseGradeBelowThreshold" : m16, - "coursesLabel" : MessageLookupByLibrary.simpleMessage("Emner"), - "dateAtTime" : m17, - "dismissAlertLabel" : m18, - "domainSearchHelpBody" : m19, - "domainSearchHelpLabel" : MessageLookupByLibrary.simpleMessage("Hvordan finner jeg skolen eller området mitt?"), - "domainSearchInputHint" : MessageLookupByLibrary.simpleMessage("Skriv inn skolenavn eller område..."), - "dueDateAtTime" : m20, - "endMasqueradeLogoutMessage" : m21, - "endMasqueradeMessage" : m22, - "eventSubjectMessage" : m23, - "eventTime" : m24, - "expand" : MessageLookupByLibrary.simpleMessage("utvid"), - "expanded" : MessageLookupByLibrary.simpleMessage("utvidet"), - "finalGrade" : m25, - "findSchool" : MessageLookupByLibrary.simpleMessage("Finne skole"), - "frontPageSubjectMessage" : m26, - "gradeFormatScoreOutOfPointsPossible" : m27, - "gradesSubjectMessage" : m28, - "latePenalty" : m29, - "me" : MessageLookupByLibrary.simpleMessage("meg"), - "messageLinkPostscript" : m30, - "minus" : MessageLookupByLibrary.simpleMessage("minus"), - "mustBeAboveN" : m31, - "mustBeBelowN" : m32, - "next" : MessageLookupByLibrary.simpleMessage("Neste"), - "nextMonth" : m33, - "nextWeek" : m34, - "noDomainResults" : m35, - "ok" : MessageLookupByLibrary.simpleMessage("OK"), - "outOfPoints" : m36, - "plusRecipientCount" : m37, - "pointsPossible" : m38, - "previousMonth" : m39, - "previousWeek" : m40, - "qrCreateAccountTos" : m41, - "ratingDialogEmailSubject" : m42, - "selectedMonthLabel" : m43, - "send" : MessageLookupByLibrary.simpleMessage("send"), - "starRating" : m44, - "submissionStatusSuccessSubtitle" : m45, - "syllabusSubjectMessage" : m46, - "unread" : MessageLookupByLibrary.simpleMessage("ulest"), - "unreadCount" : m47 - }; -} diff --git a/apps/flutter_parent/lib/l10n/generated/messages_nb_instk12.dart b/apps/flutter_parent/lib/l10n/generated/messages_nb_instk12.dart deleted file mode 100644 index 4ed41f3ae0..0000000000 --- a/apps/flutter_parent/lib/l10n/generated/messages_nb_instk12.dart +++ /dev/null @@ -1,473 +0,0 @@ -// DO NOT EDIT. This is code generated via package:intl/generate_localized.dart -// This is a library that provides messages for a nb_instk12 locale. All the -// messages from the main program should be duplicated here with the same -// function name. - -// Ignore issues from commonly used lints in this file. -// ignore_for_file:unnecessary_brace_in_string_interps, unnecessary_new -// ignore_for_file:prefer_single_quotes,comment_references, directives_ordering -// ignore_for_file:annotate_overrides,prefer_generic_function_type_aliases -// ignore_for_file:unused_import, file_names - -import 'package:intl/intl.dart'; -import 'package:intl/message_lookup_by_library.dart'; - -final messages = new MessageLookup(); - -typedef String MessageIfAbsent(String messageStr, List args); - -class MessageLookup extends MessageLookupByLibrary { - String get localeName => 'nb_instk12'; - - static m0(userName) => "Du opptrer som ${userName}"; - - static m1(version) => "v. ${version}"; - - static m2(threshold) => "Oppgavevurdering over ${threshold}"; - - static m3(threshold) => "Oppgavevurdering under ${threshold}"; - - static m4(moduleName) => "Denne oppgaven er låst av modulen \"${moduleName}\"."; - - static m5(studentName, assignmentName) => "Vedrørende: ${studentName}, Oppgave - ${assignmentName}"; - - static m6(points) => "${points} poeng"; - - static m7(points) => "${points} poeng"; - - static m8(authorName, howMany) => "${Intl.plural(howMany, one: '${authorName} til 1 annen', other: '${authorName} til ${howMany} andre')}"; - - static m9(authorName, recipientName) => "${authorName} til ${recipientName}"; - - static m10(authorName, recipientName, howMany) => "${Intl.plural(howMany, one: '${authorName} til ${recipientName} og 1 annen', other: '${authorName} til ${recipientName} og ${howMany} andre')}"; - - static m11(count) => "${count}+"; - - static m12(studentName) => "Endre farge for ${studentName}"; - - static m13(score, pointsPossible) => "${score} av ${pointsPossible} poeng"; - - static m14(studentShortName) => "for ${studentShortName}"; - - static m15(threshold) => "Fagvurdering over ${threshold}"; - - static m16(threshold) => "Fagvurdering under ${threshold}"; - - static m17(date, time) => "${date} på ${time}"; - - static m18(alertTitle) => "Avvise ${alertTitle}"; - - static m19(canvasGuides, canvasSupport) => "Prøv å søke på navnet til skolen eller området du forsøker å få tilgang til som f.eks. “Smith privatskole” eller “Smith kommunal skole.” Du kan også angi et Canvas-domene direkte som f.eks. “smith.instructure.com.”\n\nHvis du vil ha mer informasjon om hvordan du finner Canvas-kontoen til din institusjon, besøk ${canvasGuides}, spør etter ${canvasSupport} eller kontakt skolen din for hjelp."; - - static m20(date, time) => "Frist ${date} klokken ${time}"; - - static m21(userName) => "Du vil slutte å opptre som ${userName} og bli logget ut."; - - static m22(userName) => "Du vil slutte å opptre som ${userName} og gå tilbake til din originale konto."; - - static m23(studentName, eventTitle) => "Vedrørende: ${studentName}, Hendelse - ${eventTitle}"; - - static m24(startAt, endAt) => "${startAt} - ${endAt}"; - - static m25(grade) => "Avsluttende vurdering: ${grade}"; - - static m26(studentName) => "Vedrørende: ${studentName}, Forside"; - - static m27(score, pointsPossible) => "${score}/${pointsPossible}"; - - static m28(studentName) => "Vedrørende: ${studentName}, Vurderinger"; - - static m29(pointsLost) => "Forsinkelsesstraff (-${pointsLost})"; - - static m30(studentName, linkUrl) => "Vedrørende: ${studentName}, ${linkUrl}"; - - static m31(percentage) => "Må være over ${percentage}"; - - static m32(percentage) => "Må være under ${percentage}"; - - static m33(month) => "Neste måned: ${month}"; - - static m34(date) => "Neste uke begynner ${date}"; - - static m35(query) => "Kan ikke finne skoler som stemmer med \"${query}\""; - - static m36(points, howMany) => "${Intl.plural(howMany, one: 'av 1 poeng', other: 'av ${points} poenger')}"; - - static m37(count) => "+${count}"; - - static m38(points) => "${points} poeng oppnåelig"; - - static m39(month) => "Forrige måned: ${month}"; - - static m40(date) => "Forrige uke begynte ${date}"; - - static m41(termsOfService, privacyPolicy) => "Ved å trykke på Opprett konto, samtykker du til ${termsOfService} og godtar ${privacyPolicy}"; - - static m42(version) => "Forslag for Android - Canvas foreldre ${version}"; - - static m43(month) => "Måned ${month}"; - - static m44(position) => "${Intl.plural(position, one: '${position} stjerne', other: '${position} stjerner')}"; - - static m45(date, time) => "Denne oppgaven ble levert den ${date} klokken ${time} og avventer vurdering."; - - static m46(studentName) => "Vedrørende: ${studentName}, Fagoversikt"; - - static m47(count) => "${count} ulest"; - - final messages = _notInlinedMessages(_notInlinedMessages); - static _notInlinedMessages(_) => { - "\"Act as\" is essentially logging in as this user without a password. You will be able to take any action as if you were this user, and from other users\' points of views, it will be as if this user performed them. However, audit logs record that you were the one who performed the actions on behalf of this user." : MessageLookupByLibrary.simpleMessage("\"Oppfør deg som\" er i realiteten å logge inn som denne brukeren uten passord. Du vil kunne utføre alle handlinger som om du var denne brukeren, og for andre brukere vil det se ut som om at denne brukeren utførte handlingene. Overvåkingloggen vil likevel notere at det var du som utførte handlingene på vegne av denne brukeren."), - "-" : MessageLookupByLibrary.simpleMessage("-"), - "A description is required." : MessageLookupByLibrary.simpleMessage("Du må ha en beskrivelse."), - "A network error occurred when adding this student. Check your connection and try again." : MessageLookupByLibrary.simpleMessage("Det oppsto en nettverksfeil da du la til denne eleven. Kontroller tilkoblingen og prøv på nytt."), - "A subject is required." : MessageLookupByLibrary.simpleMessage("Du må ha en tittel."), - "Act As User" : MessageLookupByLibrary.simpleMessage("Opptre som bruker"), - "Add Student" : MessageLookupByLibrary.simpleMessage("Legg til elev"), - "Add attachment" : MessageLookupByLibrary.simpleMessage("Legg til vedlegg"), - "Add new student" : MessageLookupByLibrary.simpleMessage("Legg til ny elev"), - "Add student with…" : MessageLookupByLibrary.simpleMessage("Legg til en elev til..."), - "Alert Settings" : MessageLookupByLibrary.simpleMessage("Varselsinnstillinger"), - "Alert me when…" : MessageLookupByLibrary.simpleMessage("Varsle meg når..."), - "All Grading Periods" : MessageLookupByLibrary.simpleMessage("Alle vurderingsperioder"), - "Already have an account? " : MessageLookupByLibrary.simpleMessage("Har du allerede en konto? "), - "An email address is required." : MessageLookupByLibrary.simpleMessage("Du må ha en e-postadresse."), - "An error occurred when trying to display this link" : MessageLookupByLibrary.simpleMessage("Feil oppsto da du ønsket å vise denne lenken."), - "An error occurred while saving your selection. Please try again." : MessageLookupByLibrary.simpleMessage("Det oppsto en feil ved lagring av valget ditt. Vennligst prøv igjen."), - "An unexpected error occurred" : MessageLookupByLibrary.simpleMessage("Det oppsto en uventet feil"), - "Android OS version" : MessageLookupByLibrary.simpleMessage("Android OS-versjon"), - "Appearance" : MessageLookupByLibrary.simpleMessage("Utseende"), - "Application version" : MessageLookupByLibrary.simpleMessage("Applikasjonsversjon"), - "Are you a student or teacher?" : MessageLookupByLibrary.simpleMessage("Er du lærer eller elev?"), - "Are you sure you want to log out?" : MessageLookupByLibrary.simpleMessage("Er du sikker på at du vil logge ut?"), - "Are you sure you wish to close this page? Your unsent message will be lost." : MessageLookupByLibrary.simpleMessage("Er du sikker på at du vil lukke denne siden? Dine usendte meldinger vil bli slettet."), - "Assignment Details" : MessageLookupByLibrary.simpleMessage("Oppgavedetaljer"), - "Assignment grade above" : MessageLookupByLibrary.simpleMessage("Oppgavevurdering over"), - "Assignment grade below" : MessageLookupByLibrary.simpleMessage("Oppgavevurdering under"), - "Assignment missing" : MessageLookupByLibrary.simpleMessage("Oppgave mangler"), - "Barney, Fuschia" : MessageLookupByLibrary.simpleMessage("Barney, fuchsia"), - "Calendars" : MessageLookupByLibrary.simpleMessage("Kalendere"), - "Camera Permission" : MessageLookupByLibrary.simpleMessage("Kameratillatelse"), - "Cancel" : MessageLookupByLibrary.simpleMessage("Avbryt"), - "Canvas Student" : MessageLookupByLibrary.simpleMessage("Canvas-elev"), - "Canvas Teacher" : MessageLookupByLibrary.simpleMessage("Canvas Teacher"), - "Canvas on GitHub" : MessageLookupByLibrary.simpleMessage("Canvas på GitHub"), - "Choose a course to message" : MessageLookupByLibrary.simpleMessage("Velg et fag du vil sende melding til"), - "Choose from Gallery" : MessageLookupByLibrary.simpleMessage("Velg fra galleri"), - "Complete" : MessageLookupByLibrary.simpleMessage("Fullført"), - "Contact Support" : MessageLookupByLibrary.simpleMessage("ta kontakt med kundestøtte"), - "Course Announcement" : MessageLookupByLibrary.simpleMessage("Fagbeskjed"), - "Course Announcements" : MessageLookupByLibrary.simpleMessage("Fagbeskjed"), - "Course grade above" : MessageLookupByLibrary.simpleMessage("Fagvurdering over"), - "Course grade below" : MessageLookupByLibrary.simpleMessage("Fagvurdering under"), - "Create Account" : MessageLookupByLibrary.simpleMessage("Opprett konto"), - "Dark Mode" : MessageLookupByLibrary.simpleMessage("Mørk modus"), - "Date" : MessageLookupByLibrary.simpleMessage("Dato"), - "Delete" : MessageLookupByLibrary.simpleMessage("Slett"), - "Description" : MessageLookupByLibrary.simpleMessage("Beskrivelse"), - "Device" : MessageLookupByLibrary.simpleMessage("Enhet"), - "Device model" : MessageLookupByLibrary.simpleMessage("Enhetsmodell"), - "Domain" : MessageLookupByLibrary.simpleMessage("Domene"), - "Domain:" : MessageLookupByLibrary.simpleMessage("Domene:"), - "Don\'t show again" : MessageLookupByLibrary.simpleMessage("Ikke vis igjen"), - "Done" : MessageLookupByLibrary.simpleMessage("Ferdig"), - "Download" : MessageLookupByLibrary.simpleMessage("Last ned"), - "Due" : MessageLookupByLibrary.simpleMessage("Forfall"), - "EXTREME CRITICAL EMERGENCY!!" : MessageLookupByLibrary.simpleMessage("EKSTREMT KRITISK NØDSITUASJON!!"), - "Electric, blue" : MessageLookupByLibrary.simpleMessage("Elektrisk, blå"), - "Email Address" : MessageLookupByLibrary.simpleMessage("E-postadresse"), - "Email:" : MessageLookupByLibrary.simpleMessage("E-post:"), - "Email…" : MessageLookupByLibrary.simpleMessage("E-post…"), - "Enter the student pairing code provided to you. If the pairing code doesn\'t work, it may have expired" : MessageLookupByLibrary.simpleMessage("Angi paringskoden til elev som ble gitt til deg. Hvis paringskoden ikke fungerer kan det hende at den er utgått"), - "Event" : MessageLookupByLibrary.simpleMessage("Hendelse"), - "Excused" : MessageLookupByLibrary.simpleMessage("Fritatt"), - "Expired QR Code" : MessageLookupByLibrary.simpleMessage("Utgått QR-kode"), - "Failed. Tap for options." : MessageLookupByLibrary.simpleMessage("Mislyktes. Trykk for alternativer."), - "Filter" : MessageLookupByLibrary.simpleMessage("Filter"), - "Filter by" : MessageLookupByLibrary.simpleMessage("Filtrer etter"), - "Fire, Orange" : MessageLookupByLibrary.simpleMessage("Ild, oransje"), - "Front Page" : MessageLookupByLibrary.simpleMessage("Forside"), - "Full Name" : MessageLookupByLibrary.simpleMessage("Fullt navn"), - "Full Name…" : MessageLookupByLibrary.simpleMessage("Fullt navn…"), - "Full error message" : MessageLookupByLibrary.simpleMessage("Fullstendig feilmelding"), - "Go to today" : MessageLookupByLibrary.simpleMessage("Gå til idag"), - "Grade" : MessageLookupByLibrary.simpleMessage("Vurdering"), - "Grade percentage" : MessageLookupByLibrary.simpleMessage("Vurderingsprosent"), - "Graded" : MessageLookupByLibrary.simpleMessage("Vurdert"), - "Grades" : MessageLookupByLibrary.simpleMessage("Vurderinger"), - "Help" : MessageLookupByLibrary.simpleMessage("Hjelp"), - "Hide Password" : MessageLookupByLibrary.simpleMessage("Skjul passord"), - "High Contrast Mode" : MessageLookupByLibrary.simpleMessage("Høy kontrast-modus"), - "How are we doing?" : MessageLookupByLibrary.simpleMessage("Hvordan klarer vi oss?"), - "How is this affecting you?" : MessageLookupByLibrary.simpleMessage("Hvordan påvirker dette deg?"), - "I can\'t get things done until I hear back from you." : MessageLookupByLibrary.simpleMessage("Jeg får gjort noenting før jeg hører i fra deg."), - "I don\'t have a Canvas account" : MessageLookupByLibrary.simpleMessage("Jeg har ikke en Canvas-konto"), - "I have a Canvas account" : MessageLookupByLibrary.simpleMessage("Jeg har en Canvas-konto"), - "I need some help but it\'s not urgent." : MessageLookupByLibrary.simpleMessage("Jeg trenger litt hjelp men det haster ikke."), - "I\'m having trouble logging in" : MessageLookupByLibrary.simpleMessage("Jeg har problemer med å logge inn"), - "Idea for Canvas Parent App [Android]" : MessageLookupByLibrary.simpleMessage("Idé for appen Canvas Parent [Android]"), - "In order to provide you with a better experience, we have updated how reminders work. You can add new reminders by viewing an assignment or calendar event and tapping the switch under the \"Remind Me\" section.\n\nBe aware that any reminders created with older versions of this app will not be compatible with the new changes and you will need to create them again." : MessageLookupByLibrary.simpleMessage("For å gi deg en bedre opplevelse, har vi oppdatert hvordan påminnelser fungerer. Du kan legge til påminnelser ved å vise en oppgave eller kalenderoppføring og trykke på bryteren under avsnittet ”Påminn meg”.\n\nVær oppmerksom på at påminnelser som ble opprettet med den gamle versjonen av denne appen ikke er kompatible med de nye endringene, og at du må opprette disse på nytt."), - "Inbox" : MessageLookupByLibrary.simpleMessage("Innboks"), - "Inbox Zero" : MessageLookupByLibrary.simpleMessage("Innboks null"), - "Incomplete" : MessageLookupByLibrary.simpleMessage("Ikke fullført"), - "Incorrect Domain" : MessageLookupByLibrary.simpleMessage("Ugyldig domene"), - "Institution Announcement" : MessageLookupByLibrary.simpleMessage("Institusjonsbeskjed"), - "Institution Announcements" : MessageLookupByLibrary.simpleMessage("Institusjonsbeskjed"), - "Instructions" : MessageLookupByLibrary.simpleMessage("Instruksjoner"), - "Interactions on this page are limited by your institution." : MessageLookupByLibrary.simpleMessage("Interaksjoner på denne siden er begrenset av institusjonen din."), - "Invalid QR Code" : MessageLookupByLibrary.simpleMessage("Ugyldig QR-kode"), - "It looks like a great day to rest, relax, and recharge." : MessageLookupByLibrary.simpleMessage("Det ser ut som dette er en flott dag til å slappe av og lade batteriene."), - "It looks like assignments haven\'t been created in this space yet." : MessageLookupByLibrary.simpleMessage("Det ser ut som det ikke er opprettet oppgaver i dette området enda."), - "Just a casual question, comment, idea, suggestion…" : MessageLookupByLibrary.simpleMessage("Bare et tilfeldig spørsmål, kommentar, idé eller forslag..."), - "Late" : MessageLookupByLibrary.simpleMessage("Sent"), - "Launch External Tool" : MessageLookupByLibrary.simpleMessage("Åpne eksternt verktøy"), - "Legal" : MessageLookupByLibrary.simpleMessage("Rettslig"), - "Light Mode" : MessageLookupByLibrary.simpleMessage("Lys modus"), - "Link Error" : MessageLookupByLibrary.simpleMessage("Avvik på lenke"), - "Locale:" : MessageLookupByLibrary.simpleMessage("Sted:"), - "Locate QR Code" : MessageLookupByLibrary.simpleMessage("Lokalisere QR-kode"), - "Location" : MessageLookupByLibrary.simpleMessage("Sted"), - "Locked" : MessageLookupByLibrary.simpleMessage("Låst"), - "Log Out" : MessageLookupByLibrary.simpleMessage("Logg Ut"), - "Login flow: Canvas" : MessageLookupByLibrary.simpleMessage("Innloggingsflyt: Canvas"), - "Login flow: Normal" : MessageLookupByLibrary.simpleMessage("Innloggingsflyt: Normal"), - "Login flow: Site Admin" : MessageLookupByLibrary.simpleMessage("Innloggingsflyt: Site-admin"), - "Login flow: Skip mobile verify" : MessageLookupByLibrary.simpleMessage("Innloggingsflyt: Hopp over bekreftelse med mobil"), - "Manage Students" : MessageLookupByLibrary.simpleMessage("Administrer elever"), - "Message" : MessageLookupByLibrary.simpleMessage("Melding"), - "Message subject" : MessageLookupByLibrary.simpleMessage("Meldingstittel"), - "Missing" : MessageLookupByLibrary.simpleMessage("Mangler"), - "Must be below 100" : MessageLookupByLibrary.simpleMessage("Må være under 100"), - "Network error" : MessageLookupByLibrary.simpleMessage("Nettverksfeil"), - "Never" : MessageLookupByLibrary.simpleMessage("Aldri"), - "New message" : MessageLookupByLibrary.simpleMessage("Ny melding"), - "No" : MessageLookupByLibrary.simpleMessage("Nei"), - "No Alerts" : MessageLookupByLibrary.simpleMessage("Ingen varsler"), - "No Assignments" : MessageLookupByLibrary.simpleMessage("Ingen oppgaver"), - "No Courses" : MessageLookupByLibrary.simpleMessage("Ingen fag"), - "No Due Date" : MessageLookupByLibrary.simpleMessage("Ingen forfallsdato"), - "No Events Today!" : MessageLookupByLibrary.simpleMessage("Ingen arrangementer i dag!"), - "No Grade" : MessageLookupByLibrary.simpleMessage("Ingen vurdering"), - "No Location Specified" : MessageLookupByLibrary.simpleMessage("Ingen lokalisasjon spesifisert"), - "No Students" : MessageLookupByLibrary.simpleMessage("Ingen elever"), - "No Subject" : MessageLookupByLibrary.simpleMessage("Intet tittel"), - "No Summary" : MessageLookupByLibrary.simpleMessage("Ingen sammendrag"), - "No description" : MessageLookupByLibrary.simpleMessage("Ingen beskrivelse"), - "No recipients selected" : MessageLookupByLibrary.simpleMessage("Ingen mottakere er valgt"), - "Not Graded" : MessageLookupByLibrary.simpleMessage("Ikke vurdert"), - "Not Submitted" : MessageLookupByLibrary.simpleMessage("Ikke levert"), - "Not a parent?" : MessageLookupByLibrary.simpleMessage("Ikke en foresatt?"), - "Notifications for reminders about assignments and calendar events" : MessageLookupByLibrary.simpleMessage("Gir deg påminnelser om oppgaver og kalenderhendelser"), - "OS Version" : MessageLookupByLibrary.simpleMessage("OS-versjon"), - "Observer" : MessageLookupByLibrary.simpleMessage("Observatør"), - "One of our other apps might be a better fit. Tap one to visit the Play Store." : MessageLookupByLibrary.simpleMessage("En av våre andre applikasjoner kan være mer tilpasset. Trykk på en for å gå til Play Store."), - "Open Canvas Student" : MessageLookupByLibrary.simpleMessage("Åpne Canvas Elev"), - "Open In Browser" : MessageLookupByLibrary.simpleMessage("Åpne i nettleser"), - "Open with another app" : MessageLookupByLibrary.simpleMessage("Åpne med en annen app"), - "Pairing Code" : MessageLookupByLibrary.simpleMessage("Paringskode"), - "Password" : MessageLookupByLibrary.simpleMessage("Passord"), - "Password is required" : MessageLookupByLibrary.simpleMessage("Passord kreves"), - "Password must contain at least 8 characters" : MessageLookupByLibrary.simpleMessage("Passord må inneholde minst åtte tegn"), - "Password…" : MessageLookupByLibrary.simpleMessage("Passord…"), - "Planner Note" : MessageLookupByLibrary.simpleMessage("Planlegger-notat"), - "Please enter a valid email address" : MessageLookupByLibrary.simpleMessage("Oppgi en gyldig e-postadresse"), - "Please enter an email address" : MessageLookupByLibrary.simpleMessage("Angi en e-postadresse"), - "Please enter full name" : MessageLookupByLibrary.simpleMessage("Angi fullt navn"), - "Please scan a QR code generated by Canvas" : MessageLookupByLibrary.simpleMessage("Skann en QR-kode generert av Canvas"), - "Plum, Purple" : MessageLookupByLibrary.simpleMessage("Plomme, blå"), - "Preparing…" : MessageLookupByLibrary.simpleMessage("Forbereder..."), - "Previous Logins" : MessageLookupByLibrary.simpleMessage("Tidligere innlogginger"), - "Privacy Policy" : MessageLookupByLibrary.simpleMessage("retningslinjer for personvern"), - "Privacy Policy Link" : MessageLookupByLibrary.simpleMessage("Lenke til retningslinjer for personvern"), - "Privacy policy, terms of use, open source" : MessageLookupByLibrary.simpleMessage("Personvernregler, bruksvilkår, åpen kilde"), - "QR Code" : MessageLookupByLibrary.simpleMessage("QR-kode"), - "QR scanning requires camera access" : MessageLookupByLibrary.simpleMessage("QR-skanning krever kameratilgang"), - "Raspberry, Red" : MessageLookupByLibrary.simpleMessage("Bringebær, rød"), - "Recipients" : MessageLookupByLibrary.simpleMessage("Mottakere"), - "Refresh" : MessageLookupByLibrary.simpleMessage("Oppdater"), - "Remind Me" : MessageLookupByLibrary.simpleMessage("Påminnelse"), - "Reminders" : MessageLookupByLibrary.simpleMessage("Påminnelser"), - "Reminders have changed!" : MessageLookupByLibrary.simpleMessage("Påminnelser er endret!"), - "Reply" : MessageLookupByLibrary.simpleMessage("Svar"), - "Reply All" : MessageLookupByLibrary.simpleMessage("Svar alle"), - "Report A Problem" : MessageLookupByLibrary.simpleMessage("Rapporter et problem"), - "Request Login Help" : MessageLookupByLibrary.simpleMessage("Be om hjelp til å logge inn"), - "Request Login Help Button" : MessageLookupByLibrary.simpleMessage("“Be om hjelp til å logge inn”-knapp"), - "Restart app" : MessageLookupByLibrary.simpleMessage("Start app på nytt"), - "Retry" : MessageLookupByLibrary.simpleMessage("Forsøk igjen"), - "Return to Login" : MessageLookupByLibrary.simpleMessage("Tilbake til logg-inn"), - "STUDENT" : MessageLookupByLibrary.simpleMessage("ELEV"), - "Screenshot showing location of QR code generation in browser" : MessageLookupByLibrary.simpleMessage("Skjermbilde som viser plassering av QR-kodegenerering i nettleser"), - "Screenshot showing location of pairing QR code generation in the Canvas Student app" : MessageLookupByLibrary.simpleMessage("Skjermbilde som viser plasseringen av QR-koden som genereres i Canvas Elev-appen"), - "Select" : MessageLookupByLibrary.simpleMessage("Velg"), - "Select Student Color" : MessageLookupByLibrary.simpleMessage("Velg elevfarge"), - "Select recipients" : MessageLookupByLibrary.simpleMessage("Velg mottakere"), - "Send Feedback" : MessageLookupByLibrary.simpleMessage("Send tilbakemelding"), - "Send a message about this assignment" : MessageLookupByLibrary.simpleMessage("Send en melding om denne oppgaven"), - "Send a message about this course" : MessageLookupByLibrary.simpleMessage("Send en melding om dette faget"), - "Send message" : MessageLookupByLibrary.simpleMessage("Send melding"), - "Set a date and time to be notified of this event." : MessageLookupByLibrary.simpleMessage("Angi tid og dato for påminnelse om denne oppgaven."), - "Set a date and time to be notified of this specific assignment." : MessageLookupByLibrary.simpleMessage("Angi tid og dato for påminnelse om denne bestemte oppgaven."), - "Settings" : MessageLookupByLibrary.simpleMessage("Innstillinger"), - "Shamrock, Green" : MessageLookupByLibrary.simpleMessage("Kløver, grønn"), - "Share Your Love for the App" : MessageLookupByLibrary.simpleMessage("Del din kjærlighet for appen"), - "Show Password" : MessageLookupByLibrary.simpleMessage("Vis passord"), - "Sign In" : MessageLookupByLibrary.simpleMessage("Logg inn"), - "Something went wrong trying to create your account, please reach out to your school for assistance." : MessageLookupByLibrary.simpleMessage("Noe gikk galt da vi forsøkte å opprette kontoen din. Kontakt skolen din for assistanse."), - "Something\'s broken but I can work around it to get what I need done." : MessageLookupByLibrary.simpleMessage("Noe er ødelagt, men jeg kan jobbe rundt problemet for å få gjort det jeg trenger å gjøre."), - "Stop Acting as User" : MessageLookupByLibrary.simpleMessage("Avslutt opptre som bruker"), - "Student" : MessageLookupByLibrary.simpleMessage("Elev"), - "Student Pairing" : MessageLookupByLibrary.simpleMessage("Elevparing"), - "Students can create a QR code using the Canvas Student app on their mobile device" : MessageLookupByLibrary.simpleMessage("Elever kan opprette en QR-kode ved å bruke Canvas Elev-appen på mobilenheten"), - "Students can obtain a pairing code through the Canvas website" : MessageLookupByLibrary.simpleMessage("Elever kan få en paringskode gjennom Canvas-nettstedet"), - "Subject" : MessageLookupByLibrary.simpleMessage("Tittel"), - "Submitted" : MessageLookupByLibrary.simpleMessage("Innlevert"), - "Successfully submitted!" : MessageLookupByLibrary.simpleMessage("Vellykket innlevering!"), - "Summary" : MessageLookupByLibrary.simpleMessage("Sammendrag"), - "Switch Users" : MessageLookupByLibrary.simpleMessage("Bytt brukere"), - "Syllabus" : MessageLookupByLibrary.simpleMessage("Fagoversikt"), - "TA" : MessageLookupByLibrary.simpleMessage("LA"), - "TEACHER" : MessageLookupByLibrary.simpleMessage("LÆRER"), - "Tap to favorite the courses you want to see on the Calendar. Select up to 10." : MessageLookupByLibrary.simpleMessage("Trykk for å velge fagene du ønsker på se på kalenderen. Velg opptil 10."), - "Tap to pair with a new student" : MessageLookupByLibrary.simpleMessage("Trykk for å pare opp mot ny elev"), - "Tap to select this student" : MessageLookupByLibrary.simpleMessage("Trykk for å velge denne eleven"), - "Tap to show student selector" : MessageLookupByLibrary.simpleMessage("Trykk for å vise elev velger"), - "Teacher" : MessageLookupByLibrary.simpleMessage("Lærer"), - "Tell us about your favorite parts of the app" : MessageLookupByLibrary.simpleMessage("Fortell oss om dine favorittdeler av appen"), - "Terms of Service" : MessageLookupByLibrary.simpleMessage("Brukervilkår"), - "Terms of Service Link" : MessageLookupByLibrary.simpleMessage("Lenke til tjenestevilkår"), - "Terms of Use" : MessageLookupByLibrary.simpleMessage("bruksvilkår"), - "The QR code you scanned may have expired. Refresh the code on the student\'s device and try again." : MessageLookupByLibrary.simpleMessage("QR-koden du skannet kan ha utgått Gjenopprett koden på elevens enhet og prøv igjen."), - "The following information will help us better understand your idea:" : MessageLookupByLibrary.simpleMessage("Følgende informasjon vil hjelpe oss bedre til å forstå din idé:"), - "The server you entered is not authorized for this app." : MessageLookupByLibrary.simpleMessage("Serveren du oppga er ikke tillatt for denne appen."), - "The student you are trying to add belongs to a different school. Log in or create an account with that school to scan this code." : MessageLookupByLibrary.simpleMessage("Eleven du forsøker å legge til tilhører en annen skole. Logg inn eller opprett en konto med den skolen for å skanne denne koden."), - "The user agent for this app is not authorized." : MessageLookupByLibrary.simpleMessage("Brukeragenten for denne appen er ikke autorisert."), - "Theme" : MessageLookupByLibrary.simpleMessage("Tema"), - "There are no installed applications that can open this file" : MessageLookupByLibrary.simpleMessage("Det finnes ingen installerte applikasjoner som kan åpne denne filen"), - "There is no page information available." : MessageLookupByLibrary.simpleMessage("Det er ingen sideinformasjon tilgjengelig."), - "There was a problem loading the Terms of Use" : MessageLookupByLibrary.simpleMessage("Det oppsto et problem under opplastingen av bruksvilkårene"), - "There was a problem removing this student from your account. Please check your connection and try again." : MessageLookupByLibrary.simpleMessage("Det oppsto et problem ved fjerning av denne eleven fra kontoen din. Kontroller tilkoblingen og prøv på nytt."), - "There was an error loading recipients for this course" : MessageLookupByLibrary.simpleMessage("Det oppstod en feil under lasting av mottakere for dette faget."), - "There was an error loading the summary details for this course." : MessageLookupByLibrary.simpleMessage("Det oppstod en feil under lasting av sammendragsdetaljer for dette faget."), - "There was an error loading this announcement" : MessageLookupByLibrary.simpleMessage("Det oppstod en feil under lasting av denne beskjeden"), - "There was an error loading this conversation" : MessageLookupByLibrary.simpleMessage("Det oppstod en feil under lasting av denne samtalen"), - "There was an error loading this file" : MessageLookupByLibrary.simpleMessage("Det oppstod en feil under lasting av denne filen"), - "There was an error loading your inbox messages." : MessageLookupByLibrary.simpleMessage("Det oppstod en feil under lasting av innboksmeldingene dine."), - "There was an error loading your student\'s alerts." : MessageLookupByLibrary.simpleMessage("Det oppstod en feil under lasting av elev-varslene dine."), - "There was an error loading your student\'s calendar" : MessageLookupByLibrary.simpleMessage("Det oppstod en feil under lasting av din elevkalender."), - "There was an error loading your students." : MessageLookupByLibrary.simpleMessage("Det oppstod en feil under lasting av elevene dine."), - "There was an error loading your student’s courses." : MessageLookupByLibrary.simpleMessage("Det oppstod en feil under lasting av fagene til elevene dine."), - "There was an error logging in. Please generate another QR Code and try again." : MessageLookupByLibrary.simpleMessage("Det oppstod en feil ved innlogging. Vennligst lag en ny QR-kode og prøv på nytt."), - "There was an error trying to act as this user. Please check the Domain and User ID and try again." : MessageLookupByLibrary.simpleMessage("Det var en feil med å opptre som denne brukeren. Sjekk domenet og bruker-ID-en og prøv igjen."), - "There’s nothing to be notified of yet." : MessageLookupByLibrary.simpleMessage("Det er ingenting du trenger å bli varslet om enda."), - "This app is not authorized for use." : MessageLookupByLibrary.simpleMessage("Denne appen er ikke autorisert for bruk."), - "This course does not have any assignments or calendar events yet." : MessageLookupByLibrary.simpleMessage("Dette faget mangler fortsatt oppgaver eller kalenderhendelser."), - "This file is unsupported and can’t be viewed through the app" : MessageLookupByLibrary.simpleMessage("Denne filtypen støttes ikke og kan ikke vises på appen"), - "This will unpair and remove all enrollments for this student from your account." : MessageLookupByLibrary.simpleMessage("Dette vil koble fra og fjerne alle påmeldinger for denne eleven fra kontoen din."), - "Total Grade" : MessageLookupByLibrary.simpleMessage("Samlet vurdering"), - "Uh oh!" : MessageLookupByLibrary.simpleMessage("Oi sann!"), - "Unable to fetch courses. Please check your connection and try again." : MessageLookupByLibrary.simpleMessage("Kan ikke hente fag. Kontroller tilkoblingen og prøv på nytt."), - "Unable to load this image" : MessageLookupByLibrary.simpleMessage("Kan ikke laste bildet"), - "Unable to play this media file" : MessageLookupByLibrary.simpleMessage("Kan ikke spille av mediefilen"), - "Unable to send message. Check your connection and try again." : MessageLookupByLibrary.simpleMessage("Kan ikke sende melding. Kontroller tilkoblingen og prøv på nytt."), - "Under Construction" : MessageLookupByLibrary.simpleMessage("Under bygging"), - "Unknown User" : MessageLookupByLibrary.simpleMessage("Ukjent bruker"), - "Unsaved changes" : MessageLookupByLibrary.simpleMessage("Ulagrede endringer"), - "Unsupported File" : MessageLookupByLibrary.simpleMessage("Filtypen støttes ikke"), - "Upload File" : MessageLookupByLibrary.simpleMessage("Last opp fil"), - "Use Camera" : MessageLookupByLibrary.simpleMessage("Bruk kamera"), - "Use Dark Theme in Web Content" : MessageLookupByLibrary.simpleMessage("Bruk Mørkt tema i webinnhold"), - "User ID" : MessageLookupByLibrary.simpleMessage("Bruker-ID"), - "User ID:" : MessageLookupByLibrary.simpleMessage("Bruker-ID"), - "Version Number" : MessageLookupByLibrary.simpleMessage("Versjon nummer"), - "View Description" : MessageLookupByLibrary.simpleMessage("Vise beskrivelsen"), - "View error details" : MessageLookupByLibrary.simpleMessage("Vis avviksdetaljer"), - "View the Privacy Policy" : MessageLookupByLibrary.simpleMessage("Se retningslinjer for personvern"), - "We are currently building this feature for your viewing pleasure." : MessageLookupByLibrary.simpleMessage("Vi jobber for tiden med denne funksjonen slik at du kan få glede av den senere."), - "We are unable to display this link, it may belong to an institution you currently aren\'t logged in to." : MessageLookupByLibrary.simpleMessage("Vi kan ikke vise denne lenken, den kan eies av en instutisjon som du for øyeblikket ikke er innlogget i."), - "We couldn\'t find any students associated with this account" : MessageLookupByLibrary.simpleMessage("Vi kunne ikke finne noen elever knyttet til denne kontoen"), - "We were unable to verify the server for use with this app." : MessageLookupByLibrary.simpleMessage("Vi klarte ikke å verifisere serveren for bruk med denne appen."), - "We’re not sure what happened, but it wasn’t good. Contact us if this keeps happening." : MessageLookupByLibrary.simpleMessage("Vi vet ikke hva som skjedde her, men det ser ikke bra ut. Ta kontakt med oss hvis denne situasjonen vedvarer."), - "What can we do better?" : MessageLookupByLibrary.simpleMessage("Hva kan vi gjøre bedre?"), - "Yes" : MessageLookupByLibrary.simpleMessage("Ja"), - "You are not observing any students." : MessageLookupByLibrary.simpleMessage("Du har ingen elever under observasjon."), - "You may only choose 10 calendars to display" : MessageLookupByLibrary.simpleMessage("Du kan kun velge 10 kalendere som skal vises"), - "You must enter a user id" : MessageLookupByLibrary.simpleMessage("Du må skrive inn en bruker-ID"), - "You must enter a valid domain" : MessageLookupByLibrary.simpleMessage("Du må oppgi et gyldig domene"), - "You must select at least one calendar to display" : MessageLookupByLibrary.simpleMessage("Du må velge minst én kalender som skal vises"), - "You will be notified about this assignment on…" : MessageLookupByLibrary.simpleMessage("Du vil få en påminnelse om denne oppgaven den..."), - "You will be notified about this event on…" : MessageLookupByLibrary.simpleMessage("Du vil få en påminnelse om denne hendelsen den..."), - "You\'ll find the QR code on the web in your account profile. Click \'QR for Mobile Login\' in the list." : MessageLookupByLibrary.simpleMessage("Du finner QR-koden på nettet i kontoprofilen din. Klikk på “QR for mobil-innlogging” i listen."), - "You\'ll need to open your student\'s Canvas Student app to continue. Go into Main Menu > Settings > Pair with Observer and scan the QR code you see there." : MessageLookupByLibrary.simpleMessage("Du må åpne Canvas Elev-appen til eleven din for å fortsette. Gå til Hovedmeny > Innstillinger > Paring med observatør og skann QR-koden du ser der."), - "Your code is incorrect or expired." : MessageLookupByLibrary.simpleMessage("Koden din stemmer ikke eller den er utgått"), - "Your student’s courses might not be published yet." : MessageLookupByLibrary.simpleMessage("Fagene til elevene dine er kanskje ikke publisert enda."), - "You’re all caught up!" : MessageLookupByLibrary.simpleMessage("Du er oppdatert!"), - "actingAsUser" : m0, - "alertsLabel" : MessageLookupByLibrary.simpleMessage("Varsler"), - "appVersion" : m1, - "assignmentGradeAboveThreshold" : m2, - "assignmentGradeBelowThreshold" : m3, - "assignmentLockedModule" : m4, - "assignmentSubjectMessage" : m5, - "assignmentTotalPoints" : m6, - "assignmentTotalPointsAccessible" : m7, - "authorToNOthers" : m8, - "authorToRecipient" : m9, - "authorToRecipientAndNOthers" : m10, - "badgeNumberPlus" : m11, - "calendarLabel" : MessageLookupByLibrary.simpleMessage("Kalender"), - "canvasGuides" : MessageLookupByLibrary.simpleMessage("Canvas-guider"), - "canvasLogoLabel" : MessageLookupByLibrary.simpleMessage("Canvas-logo"), - "canvasSupport" : MessageLookupByLibrary.simpleMessage("Canvas Support"), - "changeStudentColorLabel" : m12, - "collapse" : MessageLookupByLibrary.simpleMessage("skjult"), - "collapsed" : MessageLookupByLibrary.simpleMessage("skjult"), - "contentDescriptionScoreOutOfPointsPossible" : m13, - "courseForWhom" : m14, - "courseGradeAboveThreshold" : m15, - "courseGradeBelowThreshold" : m16, - "coursesLabel" : MessageLookupByLibrary.simpleMessage("Fag"), - "dateAtTime" : m17, - "dismissAlertLabel" : m18, - "domainSearchHelpBody" : m19, - "domainSearchHelpLabel" : MessageLookupByLibrary.simpleMessage("Hvordan finner jeg skolen eller området mitt?"), - "domainSearchInputHint" : MessageLookupByLibrary.simpleMessage("Skriv inn skolenavn eller område..."), - "dueDateAtTime" : m20, - "endMasqueradeLogoutMessage" : m21, - "endMasqueradeMessage" : m22, - "eventSubjectMessage" : m23, - "eventTime" : m24, - "expand" : MessageLookupByLibrary.simpleMessage("utvid"), - "expanded" : MessageLookupByLibrary.simpleMessage("utvidet"), - "finalGrade" : m25, - "findSchool" : MessageLookupByLibrary.simpleMessage("Finne skole"), - "frontPageSubjectMessage" : m26, - "gradeFormatScoreOutOfPointsPossible" : m27, - "gradesSubjectMessage" : m28, - "latePenalty" : m29, - "me" : MessageLookupByLibrary.simpleMessage("meg"), - "messageLinkPostscript" : m30, - "minus" : MessageLookupByLibrary.simpleMessage("minus"), - "mustBeAboveN" : m31, - "mustBeBelowN" : m32, - "next" : MessageLookupByLibrary.simpleMessage("Neste"), - "nextMonth" : m33, - "nextWeek" : m34, - "noDomainResults" : m35, - "ok" : MessageLookupByLibrary.simpleMessage("OK"), - "outOfPoints" : m36, - "plusRecipientCount" : m37, - "pointsPossible" : m38, - "previousMonth" : m39, - "previousWeek" : m40, - "qrCreateAccountTos" : m41, - "ratingDialogEmailSubject" : m42, - "selectedMonthLabel" : m43, - "send" : MessageLookupByLibrary.simpleMessage("send"), - "starRating" : m44, - "submissionStatusSuccessSubtitle" : m45, - "syllabusSubjectMessage" : m46, - "unread" : MessageLookupByLibrary.simpleMessage("ulest"), - "unreadCount" : m47 - }; -} diff --git a/apps/flutter_parent/lib/l10n/generated/messages_nl.dart b/apps/flutter_parent/lib/l10n/generated/messages_nl.dart deleted file mode 100644 index 74b69fd968..0000000000 --- a/apps/flutter_parent/lib/l10n/generated/messages_nl.dart +++ /dev/null @@ -1,473 +0,0 @@ -// DO NOT EDIT. This is code generated via package:intl/generate_localized.dart -// This is a library that provides messages for a nl locale. All the -// messages from the main program should be duplicated here with the same -// function name. - -// Ignore issues from commonly used lints in this file. -// ignore_for_file:unnecessary_brace_in_string_interps, unnecessary_new -// ignore_for_file:prefer_single_quotes,comment_references, directives_ordering -// ignore_for_file:annotate_overrides,prefer_generic_function_type_aliases -// ignore_for_file:unused_import, file_names - -import 'package:intl/intl.dart'; -import 'package:intl/message_lookup_by_library.dart'; - -final messages = new MessageLookup(); - -typedef String MessageIfAbsent(String messageStr, List args); - -class MessageLookup extends MessageLookupByLibrary { - String get localeName => 'nl'; - - static m0(userName) => "Je treedt op als ${userName}"; - - static m1(version) => "v. ${version}"; - - static m2(threshold) => "Opdrachtcijfer hoger dan ${threshold}"; - - static m3(threshold) => "Opdrachtcijfer lager dan ${threshold}"; - - static m4(moduleName) => "Deze opdracht wordt vergrendeld door de module \"${moduleName}\"."; - - static m5(studentName, assignmentName) => "Betreffende: ${studentName}, opdracht - ${assignmentName}"; - - static m6(points) => "${points} punten"; - - static m7(points) => "${points} punten"; - - static m8(authorName, howMany) => "${Intl.plural(howMany, one: '${authorName} naar 1 andere', other: '${authorName} naar ${howMany} andere')}"; - - static m9(authorName, recipientName) => "${authorName} naar ${recipientName}"; - - static m10(authorName, recipientName, howMany) => "${Intl.plural(howMany, one: '${authorName} naar ${recipientName} en 1 andere', other: '${authorName} naar ${recipientName} en ${howMany} andere')}"; - - static m11(count) => "${count}+"; - - static m12(studentName) => "Kleur wijzigen voor ${studentName}"; - - static m13(score, pointsPossible) => "${score} van de ${pointsPossible} punten"; - - static m14(studentShortName) => "voor ${studentShortName}"; - - static m15(threshold) => "Cursuscijfer hoger dan ${threshold}"; - - static m16(threshold) => "Cursuscijfer lager dan ${threshold}"; - - static m17(date, time) => "${date} om ${time}"; - - static m18(alertTitle) => "${alertTitle} afwijzen"; - - static m19(canvasGuides, canvasSupport) => "Zoek naar de gewenste naam van de school of onderwijskoepel, zoals “Spinozacollege” of “INNOVO”. Je kunt ook rechtstreeks een Canvas-domein invoeren, zoals “smith.instructure.com.”\n\nVoor meer informatie over het vinden van het Canvas-account van jouw instelling kun je de ${canvasGuides} bezoeken, contact opnemen met ${canvasSupport} of met je school zelf."; - - static m20(date, time) => "In te leveren op ${date} om ${time}"; - - static m21(userName) => "Je stopt met optreden als ${userName} en je wordt afgemeld."; - - static m22(userName) => "Je stopt met optreden als ${userName} en keert terug naar je oorspronkelijke account."; - - static m23(studentName, eventTitle) => "Betreffende: ${studentName}, gebeurtenis - ${eventTitle}"; - - static m24(startAt, endAt) => "${startAt} - ${endAt}"; - - static m25(grade) => "Eindcijfer: ${grade}"; - - static m26(studentName) => "Betreffende: ${studentName}, voorpagina"; - - static m27(score, pointsPossible) => "${score} / ${pointsPossible}"; - - static m28(studentName) => "Betreffende: ${studentName}, cijfers"; - - static m29(pointsLost) => "Sanctie indien te laat (-${pointsLost})"; - - static m30(studentName, linkUrl) => "Betreffende: ${studentName}, ${linkUrl}"; - - static m31(percentage) => "Moet hoger zijn dan ${percentage}"; - - static m32(percentage) => "Moet lager zijn dan ${percentage}"; - - static m33(month) => "Volgende maand: ${month}"; - - static m34(date) => "Volgende week vanaf ${date}"; - - static m35(query) => "Kan geen scholen vinden met \"${query}\""; - - static m36(points, howMany) => "${Intl.plural(howMany, one: 'Van 1 punt', other: 'Van ${points} punten')}"; - - static m37(count) => "+${count}"; - - static m38(points) => "${points} punten mogelijk"; - - static m39(month) => "Vorige maand: ${month}"; - - static m40(date) => "Vorige week vanaf ${date}"; - - static m41(termsOfService, privacyPolicy) => "Door op \'Account maken’ te tikken ga je akkoord met de ${termsOfService} en accepteer je het ${privacyPolicy}"; - - static m42(version) => "Suggesties voor Android - Canvas Parent ${version}"; - - static m43(month) => "De maand ${month}"; - - static m44(position) => "${Intl.plural(position, one: '${position} ster', other: '${position} sterren')}"; - - static m45(date, time) => "Deze opdracht werd ingeleverd op ${date} om ${time} en wacht op beoordeling"; - - static m46(studentName) => "Betreffende: ${studentName}, syllabus"; - - static m47(count) => "${count} ongelezen"; - - final messages = _notInlinedMessages(_notInlinedMessages); - static _notInlinedMessages(_) => { - "\"Act as\" is essentially logging in as this user without a password. You will be able to take any action as if you were this user, and from other users\' points of views, it will be as if this user performed them. However, audit logs record that you were the one who performed the actions on behalf of this user." : MessageLookupByLibrary.simpleMessage("\"Optreden als\" is in essentie hetzelfde als aanmelden als deze gebruiker zonder wachtwoord. Je kunt alle acties uitvoeren alsof je die gebruiker bent. Gezien vanuit andere gebruikers lijkt het dan ook alsof die acties door die gebruiker zijn uitgevoerd. De controleogboeken laten echter zien dat jij degene was die namens deze gebruiker die acties verricht hebt."), - "-" : MessageLookupByLibrary.simpleMessage("-"), - "A description is required." : MessageLookupByLibrary.simpleMessage("Er is een beschrijving vereist."), - "A network error occurred when adding this student. Check your connection and try again." : MessageLookupByLibrary.simpleMessage("Er is een netwerkfout opgetreden bij het toevoegen van deze cursist. Controleer je verbinding en probeer het opnieuw."), - "A subject is required." : MessageLookupByLibrary.simpleMessage("Er is een onderwerp vereist"), - "Act As User" : MessageLookupByLibrary.simpleMessage("Optreden als gebruiker"), - "Add Student" : MessageLookupByLibrary.simpleMessage("Cursist toevoegen"), - "Add attachment" : MessageLookupByLibrary.simpleMessage("Bijlage toevoegen"), - "Add new student" : MessageLookupByLibrary.simpleMessage("Nieuwe cursist toevoegen"), - "Add student with…" : MessageLookupByLibrary.simpleMessage("Cursist toevoegen met…"), - "Alert Settings" : MessageLookupByLibrary.simpleMessage("Waarschuwingsinstellingen"), - "Alert me when…" : MessageLookupByLibrary.simpleMessage("Waarschuw me als..."), - "All Grading Periods" : MessageLookupByLibrary.simpleMessage("Alle beoordelingsperioden"), - "Already have an account? " : MessageLookupByLibrary.simpleMessage("Heb je al een account? "), - "An email address is required." : MessageLookupByLibrary.simpleMessage("Er is een e-mailadres vereist."), - "An error occurred when trying to display this link" : MessageLookupByLibrary.simpleMessage("Er is een fout opgetreden bij het weergeven van deze van link."), - "An error occurred while saving your selection. Please try again." : MessageLookupByLibrary.simpleMessage("Er is een fout opgetreden tijdens het opslaan van je selectie. Probeer het opnieuw."), - "An unexpected error occurred" : MessageLookupByLibrary.simpleMessage("Er heeft zich een onverwachte fout voorgedaan"), - "Android OS version" : MessageLookupByLibrary.simpleMessage("Android OS-versie"), - "Appearance" : MessageLookupByLibrary.simpleMessage("Uiterlijk"), - "Application version" : MessageLookupByLibrary.simpleMessage("Versie van toepassing"), - "Are you a student or teacher?" : MessageLookupByLibrary.simpleMessage("Ben je cursist of cursusleider?"), - "Are you sure you want to log out?" : MessageLookupByLibrary.simpleMessage("Weet je zeker dat je je wilt afmelden?"), - "Are you sure you wish to close this page? Your unsent message will be lost." : MessageLookupByLibrary.simpleMessage("Weet je zeker dat je deze pagina wilt sluiten? Je niet-verzonden bericht gaat verloren."), - "Assignment Details" : MessageLookupByLibrary.simpleMessage("Opdrachtdetails"), - "Assignment grade above" : MessageLookupByLibrary.simpleMessage("Opdrachtcijfer hoger dan"), - "Assignment grade below" : MessageLookupByLibrary.simpleMessage("Opdrachtcijfer lager dan"), - "Assignment missing" : MessageLookupByLibrary.simpleMessage("Opdracht ontbreekt"), - "Barney, Fuschia" : MessageLookupByLibrary.simpleMessage("Barney, fuchsia"), - "Calendars" : MessageLookupByLibrary.simpleMessage("Kalenders"), - "Camera Permission" : MessageLookupByLibrary.simpleMessage("Cameramachtiging"), - "Cancel" : MessageLookupByLibrary.simpleMessage("Annuleren"), - "Canvas Student" : MessageLookupByLibrary.simpleMessage("Canvas Student"), - "Canvas Teacher" : MessageLookupByLibrary.simpleMessage("Canvas Teacher"), - "Canvas on GitHub" : MessageLookupByLibrary.simpleMessage("Canvas op GitHub"), - "Choose a course to message" : MessageLookupByLibrary.simpleMessage("Kies een cursus voor bericht"), - "Choose from Gallery" : MessageLookupByLibrary.simpleMessage("Kies uit galerij"), - "Complete" : MessageLookupByLibrary.simpleMessage("Voltooid"), - "Contact Support" : MessageLookupByLibrary.simpleMessage("Contact opnemen met ondersteuning"), - "Course Announcement" : MessageLookupByLibrary.simpleMessage("Cursusaankondiging"), - "Course Announcements" : MessageLookupByLibrary.simpleMessage("Cursusaankondigingen"), - "Course grade above" : MessageLookupByLibrary.simpleMessage("Cursuscijfer hoger dan"), - "Course grade below" : MessageLookupByLibrary.simpleMessage("Cursuscijfer lager dan"), - "Create Account" : MessageLookupByLibrary.simpleMessage("Account maken"), - "Dark Mode" : MessageLookupByLibrary.simpleMessage("Donkere modus"), - "Date" : MessageLookupByLibrary.simpleMessage("Datum"), - "Delete" : MessageLookupByLibrary.simpleMessage("Verwijderen"), - "Description" : MessageLookupByLibrary.simpleMessage("Beschrijving"), - "Device" : MessageLookupByLibrary.simpleMessage("Apparaat"), - "Device model" : MessageLookupByLibrary.simpleMessage("Apparaatmodel"), - "Domain" : MessageLookupByLibrary.simpleMessage("Domein"), - "Domain:" : MessageLookupByLibrary.simpleMessage("Domein:"), - "Don\'t show again" : MessageLookupByLibrary.simpleMessage("Niet nogmaals tonen"), - "Done" : MessageLookupByLibrary.simpleMessage("Gereed"), - "Download" : MessageLookupByLibrary.simpleMessage("Downloaden"), - "Due" : MessageLookupByLibrary.simpleMessage("Inleverdatum"), - "EXTREME CRITICAL EMERGENCY!!" : MessageLookupByLibrary.simpleMessage("EXTREEM NOODGEVAL!"), - "Electric, blue" : MessageLookupByLibrary.simpleMessage("Elektrisch, blauw"), - "Email Address" : MessageLookupByLibrary.simpleMessage("E-mailadres"), - "Email:" : MessageLookupByLibrary.simpleMessage("E-mail:"), - "Email…" : MessageLookupByLibrary.simpleMessage("E-mail..."), - "Enter the student pairing code provided to you. If the pairing code doesn\'t work, it may have expired" : MessageLookupByLibrary.simpleMessage("Voer de koppelingscode cursist in die je gekregen hebt. Als de koppelingscode niet werkt, is deze mogelijk verlopen"), - "Event" : MessageLookupByLibrary.simpleMessage("Gebeurtenis"), - "Excused" : MessageLookupByLibrary.simpleMessage("Vrijgesteld"), - "Expired QR Code" : MessageLookupByLibrary.simpleMessage("Verlopen QR-code"), - "Failed. Tap for options." : MessageLookupByLibrary.simpleMessage("Mislukt. Tik voor opties."), - "Filter" : MessageLookupByLibrary.simpleMessage("Filter"), - "Filter by" : MessageLookupByLibrary.simpleMessage("Filteren op"), - "Fire, Orange" : MessageLookupByLibrary.simpleMessage("Vuur, oranje"), - "Front Page" : MessageLookupByLibrary.simpleMessage("Voorpagina"), - "Full Name" : MessageLookupByLibrary.simpleMessage("Volledige naam"), - "Full Name…" : MessageLookupByLibrary.simpleMessage("Volledige naam..."), - "Full error message" : MessageLookupByLibrary.simpleMessage("Volledig foutbericht"), - "Go to today" : MessageLookupByLibrary.simpleMessage("Ga naar vandaag"), - "Grade" : MessageLookupByLibrary.simpleMessage("Cijfer"), - "Grade percentage" : MessageLookupByLibrary.simpleMessage("Cijferpercentage"), - "Graded" : MessageLookupByLibrary.simpleMessage("Beoordeeld"), - "Grades" : MessageLookupByLibrary.simpleMessage("Cijfers"), - "Help" : MessageLookupByLibrary.simpleMessage("Help"), - "Hide Password" : MessageLookupByLibrary.simpleMessage("Wachtwoord verbergen"), - "High Contrast Mode" : MessageLookupByLibrary.simpleMessage("Modus hoog contrast"), - "How are we doing?" : MessageLookupByLibrary.simpleMessage("Hoe gaat het?"), - "How is this affecting you?" : MessageLookupByLibrary.simpleMessage("Wat voor gevolgen heeft dit voor jou?"), - "I can\'t get things done until I hear back from you." : MessageLookupByLibrary.simpleMessage("Ik kan pas iets voor je doen als je me antwoordt."), - "I don\'t have a Canvas account" : MessageLookupByLibrary.simpleMessage("Ik heb geen Canvas-account"), - "I have a Canvas account" : MessageLookupByLibrary.simpleMessage("Ik heb een Canvas-account"), - "I need some help but it\'s not urgent." : MessageLookupByLibrary.simpleMessage("Ik heb wat hulp nodig, maar het is niet dringend."), - "I\'m having trouble logging in" : MessageLookupByLibrary.simpleMessage("Ik ondervind problemen met inloggen"), - "Idea for Canvas Parent App [Android]" : MessageLookupByLibrary.simpleMessage("Idee voor Canvas Parent App [Android]"), - "In order to provide you with a better experience, we have updated how reminders work. You can add new reminders by viewing an assignment or calendar event and tapping the switch under the \"Remind Me\" section.\n\nBe aware that any reminders created with older versions of this app will not be compatible with the new changes and you will need to create them again." : MessageLookupByLibrary.simpleMessage("Om je een betere gebruikerservaring te geven, hebben we de wijze waarop herinneringen functioneren bijgewerkt. Je kunt nieuwe herinneringen toevoegen door een opdracht of kalendergebeurtenis te bekijken en op de schakelaar te tikken onder de sectie \"Stuur me een herinnering\".\n\nHoud er rekening mee dat herinneringen die zijn gemaakt met oudere versies van deze app niet compatibel zijn met de nieuwe wijzigingen en je deze herinneringen opnieuw moet maken."), - "Inbox" : MessageLookupByLibrary.simpleMessage("Inbox"), - "Inbox Zero" : MessageLookupByLibrary.simpleMessage("Inbox leeg"), - "Incomplete" : MessageLookupByLibrary.simpleMessage("Incompleet"), - "Incorrect Domain" : MessageLookupByLibrary.simpleMessage("Verkeerd domein"), - "Institution Announcement" : MessageLookupByLibrary.simpleMessage("Aankondiging organisatie"), - "Institution Announcements" : MessageLookupByLibrary.simpleMessage("Aankondigingen van instituut"), - "Instructions" : MessageLookupByLibrary.simpleMessage("Instructies"), - "Interactions on this page are limited by your institution." : MessageLookupByLibrary.simpleMessage("Interacties op deze pagina zijn beperkt door je organisatie."), - "Invalid QR Code" : MessageLookupByLibrary.simpleMessage("Ongeldige QR-code"), - "It looks like a great day to rest, relax, and recharge." : MessageLookupByLibrary.simpleMessage("Dat lijkt een prima dag om lekker uit te rusten, te relaxen en de batterij op te laden."), - "It looks like assignments haven\'t been created in this space yet." : MessageLookupByLibrary.simpleMessage("Het lijkt erop dat er in deze ruimte nog geen opdrachten zijn gemaakt."), - "Just a casual question, comment, idea, suggestion…" : MessageLookupByLibrary.simpleMessage("Gewoon een informele vraag, opmerking, idee of suggestie..."), - "Late" : MessageLookupByLibrary.simpleMessage("Te laat"), - "Launch External Tool" : MessageLookupByLibrary.simpleMessage("Extern hulpmiddel lanceren"), - "Legal" : MessageLookupByLibrary.simpleMessage("Juridisch"), - "Light Mode" : MessageLookupByLibrary.simpleMessage("Lichte modus"), - "Link Error" : MessageLookupByLibrary.simpleMessage("Fout met link"), - "Locale:" : MessageLookupByLibrary.simpleMessage("Landinstellingen:"), - "Locate QR Code" : MessageLookupByLibrary.simpleMessage("QR-code zoeken"), - "Location" : MessageLookupByLibrary.simpleMessage("Locatie"), - "Locked" : MessageLookupByLibrary.simpleMessage("Vergrendeld"), - "Log Out" : MessageLookupByLibrary.simpleMessage("Afmelden"), - "Login flow: Canvas" : MessageLookupByLibrary.simpleMessage("Aanmeldingsstroom: Canvas"), - "Login flow: Normal" : MessageLookupByLibrary.simpleMessage("Aanmeldingsstroom: Normaal"), - "Login flow: Site Admin" : MessageLookupByLibrary.simpleMessage("Aanmeldingsstroom: Sitebeheerder"), - "Login flow: Skip mobile verify" : MessageLookupByLibrary.simpleMessage("Aanmeldingsstroom: Mobiel verifiëren overslaan"), - "Manage Students" : MessageLookupByLibrary.simpleMessage("Cursisten beheren"), - "Message" : MessageLookupByLibrary.simpleMessage("Bericht"), - "Message subject" : MessageLookupByLibrary.simpleMessage("Onderwerp van bericht"), - "Missing" : MessageLookupByLibrary.simpleMessage("Ontbrekend"), - "Must be below 100" : MessageLookupByLibrary.simpleMessage("Moet lager zijn dan 100"), - "Network error" : MessageLookupByLibrary.simpleMessage("Netwerkfout"), - "Never" : MessageLookupByLibrary.simpleMessage("Nooit"), - "New message" : MessageLookupByLibrary.simpleMessage("Nieuw bericht"), - "No" : MessageLookupByLibrary.simpleMessage("Nee"), - "No Alerts" : MessageLookupByLibrary.simpleMessage("Geen waarschuwingen"), - "No Assignments" : MessageLookupByLibrary.simpleMessage("Geen opdrachten"), - "No Courses" : MessageLookupByLibrary.simpleMessage("Geen cursussen"), - "No Due Date" : MessageLookupByLibrary.simpleMessage("Geen inleverdatum"), - "No Events Today!" : MessageLookupByLibrary.simpleMessage("Vandaag geen gebeurtenissen!"), - "No Grade" : MessageLookupByLibrary.simpleMessage("Geen cijfer"), - "No Location Specified" : MessageLookupByLibrary.simpleMessage("Geen locatie opgegeven"), - "No Students" : MessageLookupByLibrary.simpleMessage("Geen cursisten"), - "No Subject" : MessageLookupByLibrary.simpleMessage("Geen onderwerp"), - "No Summary" : MessageLookupByLibrary.simpleMessage("Geen samenvatting"), - "No description" : MessageLookupByLibrary.simpleMessage("Geen beschrijving"), - "No recipients selected" : MessageLookupByLibrary.simpleMessage("Geen ontvangers geselecteerd"), - "Not Graded" : MessageLookupByLibrary.simpleMessage("Niet beoordeeld"), - "Not Submitted" : MessageLookupByLibrary.simpleMessage("Niet ingediend"), - "Not a parent?" : MessageLookupByLibrary.simpleMessage("Geen ouder?"), - "Notifications for reminders about assignments and calendar events" : MessageLookupByLibrary.simpleMessage("Meldingen voor herinneringen over opdrachten en kalendergebeurtenissen"), - "OS Version" : MessageLookupByLibrary.simpleMessage("OS Versie"), - "Observer" : MessageLookupByLibrary.simpleMessage("Waarnemer"), - "One of our other apps might be a better fit. Tap one to visit the Play Store." : MessageLookupByLibrary.simpleMessage("Wellicht is een van onze andere apps hiervoor beter geschikt. Tik op een van de apps om de Play Store te openen."), - "Open Canvas Student" : MessageLookupByLibrary.simpleMessage("Canvas Student openen"), - "Open In Browser" : MessageLookupByLibrary.simpleMessage("Openen in browser"), - "Open with another app" : MessageLookupByLibrary.simpleMessage("Openen met een andere app"), - "Pairing Code" : MessageLookupByLibrary.simpleMessage("Koppelingscode"), - "Password" : MessageLookupByLibrary.simpleMessage("Wachtwoord"), - "Password is required" : MessageLookupByLibrary.simpleMessage("Wachtwoord is vereist"), - "Password must contain at least 8 characters" : MessageLookupByLibrary.simpleMessage("Wachtwoord moet minstens 8 tekens bevatten."), - "Password…" : MessageLookupByLibrary.simpleMessage("Wachtwoord..."), - "Planner Note" : MessageLookupByLibrary.simpleMessage("Planneraantekening"), - "Please enter a valid email address" : MessageLookupByLibrary.simpleMessage("Voer een geldig e-mailadres in"), - "Please enter an email address" : MessageLookupByLibrary.simpleMessage("Voer een e-mailadres in"), - "Please enter full name" : MessageLookupByLibrary.simpleMessage("Voer volledige naam in"), - "Please scan a QR code generated by Canvas" : MessageLookupByLibrary.simpleMessage("Scan een door Canvas gegenereerde QR-code"), - "Plum, Purple" : MessageLookupByLibrary.simpleMessage("Pruim, paars"), - "Preparing…" : MessageLookupByLibrary.simpleMessage("Wordt voorbereid"), - "Previous Logins" : MessageLookupByLibrary.simpleMessage("Eerdere aanmeldingen"), - "Privacy Policy" : MessageLookupByLibrary.simpleMessage("Privacybeleid"), - "Privacy Policy Link" : MessageLookupByLibrary.simpleMessage("Link naar Privacybeleid"), - "Privacy policy, terms of use, open source" : MessageLookupByLibrary.simpleMessage("Privacybeleid, gebruiksvoor"), - "QR Code" : MessageLookupByLibrary.simpleMessage("QR-code"), - "QR scanning requires camera access" : MessageLookupByLibrary.simpleMessage("Scannen van QR-code vereist toegang tot camera"), - "Raspberry, Red" : MessageLookupByLibrary.simpleMessage("Framboos, rood"), - "Recipients" : MessageLookupByLibrary.simpleMessage("Geadresseerden"), - "Refresh" : MessageLookupByLibrary.simpleMessage("Vernieuwen"), - "Remind Me" : MessageLookupByLibrary.simpleMessage("Stuur me een herinnering"), - "Reminders" : MessageLookupByLibrary.simpleMessage("Herinneringen"), - "Reminders have changed!" : MessageLookupByLibrary.simpleMessage("Herinneringen zijn veranderd!"), - "Reply" : MessageLookupByLibrary.simpleMessage("Beantwoorden"), - "Reply All" : MessageLookupByLibrary.simpleMessage("Allen beantwoorden"), - "Report A Problem" : MessageLookupByLibrary.simpleMessage("Een probleem melden"), - "Request Login Help" : MessageLookupByLibrary.simpleMessage("Help bij inloggen aanvragen"), - "Request Login Help Button" : MessageLookupByLibrary.simpleMessage("Knop Help bij inloggen aanvragen"), - "Restart app" : MessageLookupByLibrary.simpleMessage("App opnieuw starten"), - "Retry" : MessageLookupByLibrary.simpleMessage("Opnieuw proberen"), - "Return to Login" : MessageLookupByLibrary.simpleMessage("Terug naar Aanmelden"), - "STUDENT" : MessageLookupByLibrary.simpleMessage("CURSIST"), - "Screenshot showing location of QR code generation in browser" : MessageLookupByLibrary.simpleMessage("Screenshot met locatie van het genereren van een QR-code in een browser"), - "Screenshot showing location of pairing QR code generation in the Canvas Student app" : MessageLookupByLibrary.simpleMessage("Schermafbeelding die de locatie toont waar de QR-code voor de koppeling in de Canvas Student-app wordt gegenereerd"), - "Select" : MessageLookupByLibrary.simpleMessage("Selecteren"), - "Select Student Color" : MessageLookupByLibrary.simpleMessage("Cursistkleur selecteren"), - "Select recipients" : MessageLookupByLibrary.simpleMessage("Ontvangers selecteren"), - "Send Feedback" : MessageLookupByLibrary.simpleMessage("Feedback versturen"), - "Send a message about this assignment" : MessageLookupByLibrary.simpleMessage("Een bericht over deze opdracht verzenden"), - "Send a message about this course" : MessageLookupByLibrary.simpleMessage("Een bericht over deze cursus verzenden"), - "Send message" : MessageLookupByLibrary.simpleMessage("Bericht versturen"), - "Set a date and time to be notified of this event." : MessageLookupByLibrary.simpleMessage("Stel een datum en tijd in waarop je een melding wilt krijgen voor deze gebeurtenis."), - "Set a date and time to be notified of this specific assignment." : MessageLookupByLibrary.simpleMessage("Stel een datum en tijd in waarop je een melding wilt krijgen voor deze specifieke opdracht."), - "Settings" : MessageLookupByLibrary.simpleMessage("Instellingen"), - "Shamrock, Green" : MessageLookupByLibrary.simpleMessage("Klaver, groen"), - "Share Your Love for the App" : MessageLookupByLibrary.simpleMessage("Laat weten hoe goed je de App vindt"), - "Show Password" : MessageLookupByLibrary.simpleMessage("Wachtwoord weergeven"), - "Sign In" : MessageLookupByLibrary.simpleMessage("Aanmelden"), - "Something went wrong trying to create your account, please reach out to your school for assistance." : MessageLookupByLibrary.simpleMessage("Er is iets mis gegaan bij het aanmaken van je account. Neem voor hulp contact op met je school."), - "Something\'s broken but I can work around it to get what I need done." : MessageLookupByLibrary.simpleMessage("Er is iets gebroken, maar daar kan ik wel omheen werken om gedaan te krijgen wat ik wil."), - "Stop Acting as User" : MessageLookupByLibrary.simpleMessage("Stop met optreden als gebruiker"), - "Student" : MessageLookupByLibrary.simpleMessage("Cursist"), - "Student Pairing" : MessageLookupByLibrary.simpleMessage("Cursistkoppeling"), - "Students can create a QR code using the Canvas Student app on their mobile device" : MessageLookupByLibrary.simpleMessage("Cursisten kunnen een QR-code maken met behulp van de Canvas Student-app op hun mobiele apparaat"), - "Students can obtain a pairing code through the Canvas website" : MessageLookupByLibrary.simpleMessage("Cursisten kunnen een koppelingscode ophalen via de Canvas-website."), - "Subject" : MessageLookupByLibrary.simpleMessage("Vak"), - "Submitted" : MessageLookupByLibrary.simpleMessage("Ingeleverd"), - "Successfully submitted!" : MessageLookupByLibrary.simpleMessage("Inlevering is gelukt!"), - "Summary" : MessageLookupByLibrary.simpleMessage("Samenvatting"), - "Switch Users" : MessageLookupByLibrary.simpleMessage("Wissel van gebruikers"), - "Syllabus" : MessageLookupByLibrary.simpleMessage("Syllabus"), - "TA" : MessageLookupByLibrary.simpleMessage("Onderwijsassistent"), - "TEACHER" : MessageLookupByLibrary.simpleMessage("CURSUSLEIDER"), - "Tap to favorite the courses you want to see on the Calendar. Select up to 10." : MessageLookupByLibrary.simpleMessage("Tik op de cursussen die je als favoriet in de kalender wilt zien. Tot maximaal 10 selecteren."), - "Tap to pair with a new student" : MessageLookupByLibrary.simpleMessage("Tik om te koppelen met een nieuwe cursist"), - "Tap to select this student" : MessageLookupByLibrary.simpleMessage("Tik om deze cursist te selecteren"), - "Tap to show student selector" : MessageLookupByLibrary.simpleMessage("Tik om cursistkiezer weer te geven"), - "Teacher" : MessageLookupByLibrary.simpleMessage("Docent"), - "Tell us about your favorite parts of the app" : MessageLookupByLibrary.simpleMessage("Laat ons weten wat jouw favoriete onderdelen van de app zijn"), - "Terms of Service" : MessageLookupByLibrary.simpleMessage("Servicevoorwaarden"), - "Terms of Service Link" : MessageLookupByLibrary.simpleMessage("Link naar Servicevoorwaarden"), - "Terms of Use" : MessageLookupByLibrary.simpleMessage("Gebruiksvoorwaarden"), - "The QR code you scanned may have expired. Refresh the code on the student\'s device and try again." : MessageLookupByLibrary.simpleMessage("De QR-code die je hebt gescand is wellicht verlopen. Ververs de code op het apparaat van de cursist en probeer het opnieuw."), - "The following information will help us better understand your idea:" : MessageLookupByLibrary.simpleMessage("De volgende informatie helpt ons een beter idee te krijgen van jouw idee:"), - "The server you entered is not authorized for this app." : MessageLookupByLibrary.simpleMessage("De server die je hebt ingevoerd, is niet gemachtigd voor deze app."), - "The student you are trying to add belongs to a different school. Log in or create an account with that school to scan this code." : MessageLookupByLibrary.simpleMessage("De cursist die je probeert toe te voegen behoort tot een andere school. Log in of maak een account aan bij die school om deze code te scannen."), - "The user agent for this app is not authorized." : MessageLookupByLibrary.simpleMessage("De gebruikersagent voor deze app heeft geen toestemming."), - "Theme" : MessageLookupByLibrary.simpleMessage("Thema"), - "There are no installed applications that can open this file" : MessageLookupByLibrary.simpleMessage("Er zijn geen apps geïnstalleerd die dit bestand kunnen openen"), - "There is no page information available." : MessageLookupByLibrary.simpleMessage("Er is geen pagina-informatie beschikbaar."), - "There was a problem loading the Terms of Use" : MessageLookupByLibrary.simpleMessage("Er is een probleem met het laden van de gebruiksvoorwaarden"), - "There was a problem removing this student from your account. Please check your connection and try again." : MessageLookupByLibrary.simpleMessage("Er is een probleem met het verwijderen van deze cursist uit je account. Controleer je verbinding en probeer het opnieuw."), - "There was an error loading recipients for this course" : MessageLookupByLibrary.simpleMessage("Er is een fout opgetreden bij het laden van ontvangers voor deze cursus"), - "There was an error loading the summary details for this course." : MessageLookupByLibrary.simpleMessage("Er is een fout opgetreden bij het laden van de samenvatting van deze cursus."), - "There was an error loading this announcement" : MessageLookupByLibrary.simpleMessage("Er is een fout opgetreden bij het laden van deze aankondiging"), - "There was an error loading this conversation" : MessageLookupByLibrary.simpleMessage("Er is een fout opgetreden bij het laden van dit gesprek."), - "There was an error loading this file" : MessageLookupByLibrary.simpleMessage("Er is een fout opgetreden bij het laden van dit bestand"), - "There was an error loading your inbox messages." : MessageLookupByLibrary.simpleMessage("Er is een fout opgetreden bij het laden van je inboxberichten."), - "There was an error loading your student\'s alerts." : MessageLookupByLibrary.simpleMessage("Er is een fout opgetreden bij het laden van de waarschuwingen van je cursist."), - "There was an error loading your student\'s calendar" : MessageLookupByLibrary.simpleMessage("Er is een fout opgetreden bij het laden van de kalender van je cursist"), - "There was an error loading your students." : MessageLookupByLibrary.simpleMessage("Er is een probleem opgetreden bij het laden van je cursisten."), - "There was an error loading your student’s courses." : MessageLookupByLibrary.simpleMessage("Er is een fout opgetreden bij het laden van de cursussen van je cursist."), - "There was an error logging in. Please generate another QR Code and try again." : MessageLookupByLibrary.simpleMessage("Er is een fout opgetreden bij het aanmelden. Genereer een andere QR-code en probeer het opnieuw."), - "There was an error trying to act as this user. Please check the Domain and User ID and try again." : MessageLookupByLibrary.simpleMessage("Er is een fout opgetreden bij het optreden als deze gebruiker. Controleer het domein en de gebruikers-ID en probeer het opnieuw."), - "There’s nothing to be notified of yet." : MessageLookupByLibrary.simpleMessage("Er is nog niets om te melden."), - "This app is not authorized for use." : MessageLookupByLibrary.simpleMessage("Deze app mag niet gebruikt worden."), - "This course does not have any assignments or calendar events yet." : MessageLookupByLibrary.simpleMessage("Deze cursus heeft nog geen opdrachten of kalendergebeurtenissen."), - "This file is unsupported and can’t be viewed through the app" : MessageLookupByLibrary.simpleMessage("Dit bestand wordt niet ondersteund en kan niet via de app worden bekeken"), - "This will unpair and remove all enrollments for this student from your account." : MessageLookupByLibrary.simpleMessage("Dit zal alle inschrijvingen voor deze cursist van jouw account ontkoppelen en verwijderen."), - "Total Grade" : MessageLookupByLibrary.simpleMessage("Totaalcijfer"), - "Uh oh!" : MessageLookupByLibrary.simpleMessage("Let op!"), - "Unable to fetch courses. Please check your connection and try again." : MessageLookupByLibrary.simpleMessage("Cursussen kunnen niet worden opgehaald. Controleer je verbinding en probeer het opnieuw."), - "Unable to load this image" : MessageLookupByLibrary.simpleMessage("Kan deze afbeelding niet laden"), - "Unable to play this media file" : MessageLookupByLibrary.simpleMessage("Kan dit mediabestand niet afspelen"), - "Unable to send message. Check your connection and try again." : MessageLookupByLibrary.simpleMessage("Kan het bericht niet verzenden. Controleer je verbinding en probeer nogmaals."), - "Under Construction" : MessageLookupByLibrary.simpleMessage("In aanbouw"), - "Unknown User" : MessageLookupByLibrary.simpleMessage("Onbekende gebruiker"), - "Unsaved changes" : MessageLookupByLibrary.simpleMessage("Niet-opgeslagen wijzigingen"), - "Unsupported File" : MessageLookupByLibrary.simpleMessage("Niet-ondersteund bestand"), - "Upload File" : MessageLookupByLibrary.simpleMessage("Bestand uploaden"), - "Use Camera" : MessageLookupByLibrary.simpleMessage("Camera gebruiken"), - "Use Dark Theme in Web Content" : MessageLookupByLibrary.simpleMessage("Donker thema gebruiken voor webcontent"), - "User ID" : MessageLookupByLibrary.simpleMessage("Gebruikers-ID:"), - "User ID:" : MessageLookupByLibrary.simpleMessage("Gebruikers ID:"), - "Version Number" : MessageLookupByLibrary.simpleMessage("Versienummer"), - "View Description" : MessageLookupByLibrary.simpleMessage("Beschrijving bekijken"), - "View error details" : MessageLookupByLibrary.simpleMessage("Foutgegevens weergeven"), - "View the Privacy Policy" : MessageLookupByLibrary.simpleMessage("Privacybeleid weergeven"), - "We are currently building this feature for your viewing pleasure." : MessageLookupByLibrary.simpleMessage("We werken momenteel aan deze functie om de weergave te verbeteren."), - "We are unable to display this link, it may belong to an institution you currently aren\'t logged in to." : MessageLookupByLibrary.simpleMessage("We kunnen deze link niet weergeven omdat de link wellicht van een organisatie is waarbij je momenteel niet bent aangemeld."), - "We couldn\'t find any students associated with this account" : MessageLookupByLibrary.simpleMessage("We kunnen geen cursist vinden die aan dit account gekoppeld is."), - "We were unable to verify the server for use with this app." : MessageLookupByLibrary.simpleMessage("We konden niet verifiëren of de server geschikt is voor deze app."), - "We’re not sure what happened, but it wasn’t good. Contact us if this keeps happening." : MessageLookupByLibrary.simpleMessage("We weten niet precies wat er is gebeurd, maar goed is het niet. Neem contact met ons op als dit blijft gebeuren."), - "What can we do better?" : MessageLookupByLibrary.simpleMessage("Wat kunnen we beter doen?"), - "Yes" : MessageLookupByLibrary.simpleMessage("Ja"), - "You are not observing any students." : MessageLookupByLibrary.simpleMessage("Je observeert geen cursisten."), - "You may only choose 10 calendars to display" : MessageLookupByLibrary.simpleMessage("Je kan slecht 10 kalenders kiezen om te tonen"), - "You must enter a user id" : MessageLookupByLibrary.simpleMessage("Je moet een gebruikers-ID invoeren"), - "You must enter a valid domain" : MessageLookupByLibrary.simpleMessage("Je moet een geldig domein invoeren"), - "You must select at least one calendar to display" : MessageLookupByLibrary.simpleMessage("Je moet minimaal één kalender selecteren om te tonen"), - "You will be notified about this assignment on…" : MessageLookupByLibrary.simpleMessage("Je krijgt een melding over deze opdracht op…"), - "You will be notified about this event on…" : MessageLookupByLibrary.simpleMessage("Je krijgt een melding over deze gebeurtenis op…"), - "You\'ll find the QR code on the web in your account profile. Click \'QR for Mobile Login\' in the list." : MessageLookupByLibrary.simpleMessage("Je vindt de QR-code op het web in je accountprofiel. Klik op \'QR voor mobiel inloggen\' in de lijst."), - "You\'ll need to open your student\'s Canvas Student app to continue. Go into Main Menu > Settings > Pair with Observer and scan the QR code you see there." : MessageLookupByLibrary.simpleMessage("Je moet de Canvas Student-app van je cursist openen om door te kunnen gaan. Ga naar Hoofdmenu > Instellingen > Koppelen met waarnemer en scan de QR-code die je daar ziet."), - "Your code is incorrect or expired." : MessageLookupByLibrary.simpleMessage("Je code is onjuist of verlopen."), - "Your student’s courses might not be published yet." : MessageLookupByLibrary.simpleMessage("De cursussen van je cursist zijn mogelijk nog niet gepubliceerd."), - "You’re all caught up!" : MessageLookupByLibrary.simpleMessage("Je bent helemaal bij!"), - "actingAsUser" : m0, - "alertsLabel" : MessageLookupByLibrary.simpleMessage("Waarschuwingen"), - "appVersion" : m1, - "assignmentGradeAboveThreshold" : m2, - "assignmentGradeBelowThreshold" : m3, - "assignmentLockedModule" : m4, - "assignmentSubjectMessage" : m5, - "assignmentTotalPoints" : m6, - "assignmentTotalPointsAccessible" : m7, - "authorToNOthers" : m8, - "authorToRecipient" : m9, - "authorToRecipientAndNOthers" : m10, - "badgeNumberPlus" : m11, - "calendarLabel" : MessageLookupByLibrary.simpleMessage("Kalender"), - "canvasGuides" : MessageLookupByLibrary.simpleMessage("Canvas-handleidingen"), - "canvasLogoLabel" : MessageLookupByLibrary.simpleMessage("Canvas-logo"), - "canvasSupport" : MessageLookupByLibrary.simpleMessage("Canvas-ondersteuning"), - "changeStudentColorLabel" : m12, - "collapse" : MessageLookupByLibrary.simpleMessage("samenvouwen"), - "collapsed" : MessageLookupByLibrary.simpleMessage("samengevouwen"), - "contentDescriptionScoreOutOfPointsPossible" : m13, - "courseForWhom" : m14, - "courseGradeAboveThreshold" : m15, - "courseGradeBelowThreshold" : m16, - "coursesLabel" : MessageLookupByLibrary.simpleMessage("Cursussen"), - "dateAtTime" : m17, - "dismissAlertLabel" : m18, - "domainSearchHelpBody" : m19, - "domainSearchHelpLabel" : MessageLookupByLibrary.simpleMessage("Hoe vind ik mijn school of district?"), - "domainSearchInputHint" : MessageLookupByLibrary.simpleMessage("Voer de naam van de school of onderwijskoepel in…"), - "dueDateAtTime" : m20, - "endMasqueradeLogoutMessage" : m21, - "endMasqueradeMessage" : m22, - "eventSubjectMessage" : m23, - "eventTime" : m24, - "expand" : MessageLookupByLibrary.simpleMessage("uitvouwen"), - "expanded" : MessageLookupByLibrary.simpleMessage("uitgevouwen"), - "finalGrade" : m25, - "findSchool" : MessageLookupByLibrary.simpleMessage("School zoeken"), - "frontPageSubjectMessage" : m26, - "gradeFormatScoreOutOfPointsPossible" : m27, - "gradesSubjectMessage" : m28, - "latePenalty" : m29, - "me" : MessageLookupByLibrary.simpleMessage("mij"), - "messageLinkPostscript" : m30, - "minus" : MessageLookupByLibrary.simpleMessage("minus"), - "mustBeAboveN" : m31, - "mustBeBelowN" : m32, - "next" : MessageLookupByLibrary.simpleMessage("Volgende"), - "nextMonth" : m33, - "nextWeek" : m34, - "noDomainResults" : m35, - "ok" : MessageLookupByLibrary.simpleMessage("OK"), - "outOfPoints" : m36, - "plusRecipientCount" : m37, - "pointsPossible" : m38, - "previousMonth" : m39, - "previousWeek" : m40, - "qrCreateAccountTos" : m41, - "ratingDialogEmailSubject" : m42, - "selectedMonthLabel" : m43, - "send" : MessageLookupByLibrary.simpleMessage("verzenden"), - "starRating" : m44, - "submissionStatusSuccessSubtitle" : m45, - "syllabusSubjectMessage" : m46, - "unread" : MessageLookupByLibrary.simpleMessage("ongelezen"), - "unreadCount" : m47 - }; -} diff --git a/apps/flutter_parent/lib/l10n/generated/messages_pl.dart b/apps/flutter_parent/lib/l10n/generated/messages_pl.dart deleted file mode 100644 index 158a74bd8f..0000000000 --- a/apps/flutter_parent/lib/l10n/generated/messages_pl.dart +++ /dev/null @@ -1,473 +0,0 @@ -// DO NOT EDIT. This is code generated via package:intl/generate_localized.dart -// This is a library that provides messages for a pl locale. All the -// messages from the main program should be duplicated here with the same -// function name. - -// Ignore issues from commonly used lints in this file. -// ignore_for_file:unnecessary_brace_in_string_interps, unnecessary_new -// ignore_for_file:prefer_single_quotes,comment_references, directives_ordering -// ignore_for_file:annotate_overrides,prefer_generic_function_type_aliases -// ignore_for_file:unused_import, file_names - -import 'package:intl/intl.dart'; -import 'package:intl/message_lookup_by_library.dart'; - -final messages = new MessageLookup(); - -typedef String MessageIfAbsent(String messageStr, List args); - -class MessageLookup extends MessageLookupByLibrary { - String get localeName => 'pl'; - - static m0(userName) => "Podszywasz się jako ${userName}"; - - static m1(version) => "wer. ${version}"; - - static m2(threshold) => "Ocena za zadanie powyżej ${threshold}"; - - static m3(threshold) => "Ocena za zadanie poniżej ${threshold}"; - - static m4(moduleName) => "To zadanie jest zablokowane przez moduł \"${moduleName}\"."; - - static m5(studentName, assignmentName) => "W odniesieniu do: ${studentName}, zadanie - ${assignmentName}"; - - static m6(points) => "${points} pkt"; - - static m7(points) => "${points} punkty"; - - static m8(authorName, howMany) => "${Intl.plural(howMany, one: '${authorName} do 1 innego', other: '${authorName} do ${howMany} innych')}"; - - static m9(authorName, recipientName) => "${authorName} do ${recipientName}"; - - static m10(authorName, recipientName, howMany) => "${Intl.plural(howMany, one: '${authorName} do ${recipientName} oraz 1 innego', other: '${authorName} do ${recipientName} oraz ${howMany} innych')}"; - - static m11(count) => "${count}+"; - - static m12(studentName) => "Zmień kolor na ${studentName}"; - - static m13(score, pointsPossible) => "${score} z ${pointsPossible} pkt"; - - static m14(studentShortName) => "dla ${studentShortName}"; - - static m15(threshold) => "Ocena z kursu powyżej ${threshold}"; - - static m16(threshold) => "Ocena z kursu poniżej ${threshold}"; - - static m17(date, time) => "${date} o ${time}"; - - static m18(alertTitle) => "Odrzuć ${alertTitle}"; - - static m19(canvasGuides, canvasSupport) => "Spróbuj wyszukać nazwę szkoły lub okręg, do których chcesz uzyskać dostęp, np. Prywatna Szkoła im. Adama Smitha albo szkoły z okręgu mazowieckiego. Można także wpisać bezpośrednio domenę Canvas, np. smith.instructure.com.\n\nAby uzyskać więcej informacji o wyszukiwaniu konta Canvas instytucji, odwiedź ${canvasGuides} lub skontaktuj się z ${canvasSupport} bądź ze swoją szkołą."; - - static m20(date, time) => "Termin ${date} o ${time}"; - - static m21(userName) => "Zatrzymasz podszywanie się jako ${userName} i nastąpi wylogowanie."; - - static m22(userName) => "Zatrzymasz podszywanie się jako ${userName} i powrócisz do swojego konta."; - - static m23(studentName, eventTitle) => "W odniesieniu do: ${studentName}, wydarzenie - ${eventTitle}"; - - static m24(startAt, endAt) => "${startAt} - ${endAt}"; - - static m25(grade) => "Ocena końcowa: ${grade}"; - - static m26(studentName) => "W odniesieniu do: ${studentName}, pierwsza strona"; - - static m27(score, pointsPossible) => "${score} / ${pointsPossible}"; - - static m28(studentName) => "W odniesieniu do: ${studentName}, oceny"; - - static m29(pointsLost) => "Kara za spóźnienie (-${pointsLost})"; - - static m30(studentName, linkUrl) => "W odniesieniu do: ${studentName}, ${linkUrl}"; - - static m31(percentage) => "Wymagane powyżej ${percentage}"; - - static m32(percentage) => "Wymagane poniżej ${percentage}"; - - static m33(month) => "Następny miesiąc: ${month}"; - - static m34(date) => "Następny tydzień od ${date}"; - - static m35(query) => "Nie można znaleźć szkół spełniających kryterium \"${query}\""; - - static m36(points, howMany) => "${Intl.plural(howMany, one: 'Z 1 pkt', other: 'Z ${points} pkt')}"; - - static m37(count) => "+${count}"; - - static m38(points) => "${points} pkt do zdobycia"; - - static m39(month) => "Poprzedni miesiąc: ${month}"; - - static m40(date) => "Poprzedni tydzień od ${date}"; - - static m41(termsOfService, privacyPolicy) => "Stukając opcję Utwórz konto, zgadzasz się na ${termsOfService} i potwierdzasz ${privacyPolicy}."; - - static m42(version) => "Sugestie dla systemu Android - Canvas Parent ${version}"; - - static m43(month) => "Miesiąc: ${month}"; - - static m44(position) => "${Intl.plural(position, one: '${position} gwiazdka', other: '${position} gwiazdki')}"; - - static m45(date, time) => "To zadanie zostało przesłane w dniu ${date} o godz. ${time} i oczekuje na ocenę"; - - static m46(studentName) => "W odniesieniu do: ${studentName}, program"; - - static m47(count) => "${count} nieprzeczytane"; - - final messages = _notInlinedMessages(_notInlinedMessages); - static _notInlinedMessages(_) => { - "\"Act as\" is essentially logging in as this user without a password. You will be able to take any action as if you were this user, and from other users\' points of views, it will be as if this user performed them. However, audit logs record that you were the one who performed the actions on behalf of this user." : MessageLookupByLibrary.simpleMessage("\"Podszywanie\" polega na logowaniu się jako inny użytkownik bez użycia hasła. Będziesz mieć możliwość podejmowania wszelkich działań jako ten użytkownik, a z perspektywy innych użytkowników będzie to wyglądać, jakby właśnie dany użytkownik przeprowadzał wszystkie czynności. W dzienniku audytu zostanie jednak zapisana informacja, że to Ty wykonywałeś(aś) działania w imieniu tego użytkownika."), - "-" : MessageLookupByLibrary.simpleMessage("-"), - "A description is required." : MessageLookupByLibrary.simpleMessage("Wymagany jest opis."), - "A network error occurred when adding this student. Check your connection and try again." : MessageLookupByLibrary.simpleMessage("Wystąpił błąd sieciowy podczas dodawania uczestnika. Sprawdź połączenie sieciowe i spróbuj ponownie."), - "A subject is required." : MessageLookupByLibrary.simpleMessage("Wymagany jest temat."), - "Act As User" : MessageLookupByLibrary.simpleMessage("Działaj jako użytkownik"), - "Add Student" : MessageLookupByLibrary.simpleMessage("Dodaj uczestnika"), - "Add attachment" : MessageLookupByLibrary.simpleMessage("Dodaj załącznik"), - "Add new student" : MessageLookupByLibrary.simpleMessage("Dodaj nowego uczestnika"), - "Add student with…" : MessageLookupByLibrary.simpleMessage("Dodaj uczestnika z..."), - "Alert Settings" : MessageLookupByLibrary.simpleMessage("Ustawienia alertów"), - "Alert me when…" : MessageLookupByLibrary.simpleMessage("Powiadom mnie, gdy..."), - "All Grading Periods" : MessageLookupByLibrary.simpleMessage("Wszystkie okresy oceniania"), - "Already have an account? " : MessageLookupByLibrary.simpleMessage("Masz już konto? "), - "An email address is required." : MessageLookupByLibrary.simpleMessage("Wymagany jest adres e-mail."), - "An error occurred when trying to display this link" : MessageLookupByLibrary.simpleMessage("Wystąpił błąd podczas wyświetlania tego łącza"), - "An error occurred while saving your selection. Please try again." : MessageLookupByLibrary.simpleMessage("Wystąpił błąd podczas zapisywania kolekcji. Spróbuj ponownie."), - "An unexpected error occurred" : MessageLookupByLibrary.simpleMessage("Wystąpił nieoczekiwany błąd"), - "Android OS version" : MessageLookupByLibrary.simpleMessage("Wersja systemu Android"), - "Appearance" : MessageLookupByLibrary.simpleMessage("Wygląd"), - "Application version" : MessageLookupByLibrary.simpleMessage("Wersja aplikacji"), - "Are you a student or teacher?" : MessageLookupByLibrary.simpleMessage("Jesteś uczestnikiem czy nauczycielem?"), - "Are you sure you want to log out?" : MessageLookupByLibrary.simpleMessage("Czy na pewno chcesz się wylogować?"), - "Are you sure you wish to close this page? Your unsent message will be lost." : MessageLookupByLibrary.simpleMessage("Czy na pewno chcesz zamknąć tę stronę? Niewysłana wiadomość zostanie utracona."), - "Assignment Details" : MessageLookupByLibrary.simpleMessage("Szczegóły zadania"), - "Assignment grade above" : MessageLookupByLibrary.simpleMessage("Ocena za zadanie powyżej"), - "Assignment grade below" : MessageLookupByLibrary.simpleMessage("Ocena za zadanie poniżej"), - "Assignment missing" : MessageLookupByLibrary.simpleMessage("Brak zadania"), - "Barney, Fuschia" : MessageLookupByLibrary.simpleMessage("Barney, fuksjowy"), - "Calendars" : MessageLookupByLibrary.simpleMessage("Kalendarze"), - "Camera Permission" : MessageLookupByLibrary.simpleMessage("Uprawnienia kamery"), - "Cancel" : MessageLookupByLibrary.simpleMessage("Anuluj"), - "Canvas Student" : MessageLookupByLibrary.simpleMessage("Uczestnik Canvas"), - "Canvas Teacher" : MessageLookupByLibrary.simpleMessage("Canvas Teacher"), - "Canvas on GitHub" : MessageLookupByLibrary.simpleMessage("Canvas na GitHub"), - "Choose a course to message" : MessageLookupByLibrary.simpleMessage("Wybierz kurs do przesłania"), - "Choose from Gallery" : MessageLookupByLibrary.simpleMessage("Wybierz z galerii"), - "Complete" : MessageLookupByLibrary.simpleMessage("Ukończony"), - "Contact Support" : MessageLookupByLibrary.simpleMessage("Skontaktuj się z działem wsparcia"), - "Course Announcement" : MessageLookupByLibrary.simpleMessage("Ogłoszenie kursu"), - "Course Announcements" : MessageLookupByLibrary.simpleMessage("Ogłoszenia dotyczące kursu"), - "Course grade above" : MessageLookupByLibrary.simpleMessage("Ocena z kursu powyżej"), - "Course grade below" : MessageLookupByLibrary.simpleMessage("Ocena z kursu poniżej"), - "Create Account" : MessageLookupByLibrary.simpleMessage("Utwórz konto"), - "Dark Mode" : MessageLookupByLibrary.simpleMessage("Tryb ciemnego tła"), - "Date" : MessageLookupByLibrary.simpleMessage("Data"), - "Delete" : MessageLookupByLibrary.simpleMessage("Usuń"), - "Description" : MessageLookupByLibrary.simpleMessage("Opis"), - "Device" : MessageLookupByLibrary.simpleMessage("Urządzenie"), - "Device model" : MessageLookupByLibrary.simpleMessage("Model urządzenia"), - "Domain" : MessageLookupByLibrary.simpleMessage("Domena"), - "Domain:" : MessageLookupByLibrary.simpleMessage("Domena:"), - "Don\'t show again" : MessageLookupByLibrary.simpleMessage("Nie pokazuj więcej"), - "Done" : MessageLookupByLibrary.simpleMessage("Gotowe"), - "Download" : MessageLookupByLibrary.simpleMessage("Pobierz"), - "Due" : MessageLookupByLibrary.simpleMessage("Termin"), - "EXTREME CRITICAL EMERGENCY!!" : MessageLookupByLibrary.simpleMessage("KRYTYCZNA SYTUACJA AWARYJNA!"), - "Electric, blue" : MessageLookupByLibrary.simpleMessage("Elektryczny, niebieski"), - "Email Address" : MessageLookupByLibrary.simpleMessage("Adres e-mail"), - "Email:" : MessageLookupByLibrary.simpleMessage("Adres e-mail:"), - "Email…" : MessageLookupByLibrary.simpleMessage("Adres e-mail..."), - "Enter the student pairing code provided to you. If the pairing code doesn\'t work, it may have expired" : MessageLookupByLibrary.simpleMessage("Wpisz otrzymany kod parowania uczestnika. Jeśli kod parowania nie działa, mógł wygasnąć"), - "Event" : MessageLookupByLibrary.simpleMessage("Wydarzenie"), - "Excused" : MessageLookupByLibrary.simpleMessage("Usprawiedliwiony"), - "Expired QR Code" : MessageLookupByLibrary.simpleMessage("Nieważny kod QR"), - "Failed. Tap for options." : MessageLookupByLibrary.simpleMessage("Nie powiodło się. Stuknij, aby wyświetlić opcje."), - "Filter" : MessageLookupByLibrary.simpleMessage("Filtruj"), - "Filter by" : MessageLookupByLibrary.simpleMessage("Filtruj wg"), - "Fire, Orange" : MessageLookupByLibrary.simpleMessage("Ogień, pomarańczowy"), - "Front Page" : MessageLookupByLibrary.simpleMessage("Pierwsza strona"), - "Full Name" : MessageLookupByLibrary.simpleMessage("Imię i nazwisko"), - "Full Name…" : MessageLookupByLibrary.simpleMessage("Imię i nazwisko..."), - "Full error message" : MessageLookupByLibrary.simpleMessage("Pełny komunikat o błędzie"), - "Go to today" : MessageLookupByLibrary.simpleMessage("Przejdź do dziś"), - "Grade" : MessageLookupByLibrary.simpleMessage("Ocena"), - "Grade percentage" : MessageLookupByLibrary.simpleMessage("Procent oceny"), - "Graded" : MessageLookupByLibrary.simpleMessage("Oceniono"), - "Grades" : MessageLookupByLibrary.simpleMessage("Oceny"), - "Help" : MessageLookupByLibrary.simpleMessage("Pomoc"), - "Hide Password" : MessageLookupByLibrary.simpleMessage("Ukryj hasło"), - "High Contrast Mode" : MessageLookupByLibrary.simpleMessage("Tryb wysokiego kontrastu"), - "How are we doing?" : MessageLookupByLibrary.simpleMessage("Jak się czujemy?"), - "How is this affecting you?" : MessageLookupByLibrary.simpleMessage("W jaki sposób to na Ciebie wpływa?"), - "I can\'t get things done until I hear back from you." : MessageLookupByLibrary.simpleMessage("Nie mogę nie zrobić dopóki się ze mną nie skontaktujesz."), - "I don\'t have a Canvas account" : MessageLookupByLibrary.simpleMessage("Nie mam konta Canvas"), - "I have a Canvas account" : MessageLookupByLibrary.simpleMessage("Posiadam konto Canvas"), - "I need some help but it\'s not urgent." : MessageLookupByLibrary.simpleMessage("Potrzebuję pomocy ale nie jest to pilne."), - "I\'m having trouble logging in" : MessageLookupByLibrary.simpleMessage("Mam problem z logowaniem"), - "Idea for Canvas Parent App [Android]" : MessageLookupByLibrary.simpleMessage("Pomysł na aplikację Canvas Parent [Android]"), - "In order to provide you with a better experience, we have updated how reminders work. You can add new reminders by viewing an assignment or calendar event and tapping the switch under the \"Remind Me\" section.\n\nBe aware that any reminders created with older versions of this app will not be compatible with the new changes and you will need to create them again." : MessageLookupByLibrary.simpleMessage("Aby zapewnić lepszą obsługę, zaktualizowaliśmy sposób działania przypomnień. Można dodawać nowe przypomnienia, wyświetlając zadanie lub wydarzenie w kalendarzu i stukając przełącznik pod sekcją \"Przypomnij mi\".\n\nNależy pamiętać, że przypomnienia utworzone w starszej wersji tej aplikacji nie będą zgodne z nowymi zmianami i będzie trzeba utworzyć je ponownie."), - "Inbox" : MessageLookupByLibrary.simpleMessage("Skrzynka odbiorcza"), - "Inbox Zero" : MessageLookupByLibrary.simpleMessage("Skrzynka odbiorcza zero"), - "Incomplete" : MessageLookupByLibrary.simpleMessage("Nie ukończono"), - "Incorrect Domain" : MessageLookupByLibrary.simpleMessage("Niepoprawna domena"), - "Institution Announcement" : MessageLookupByLibrary.simpleMessage("Ogłoszenie instytucji"), - "Institution Announcements" : MessageLookupByLibrary.simpleMessage("Ogłoszenia instytucji"), - "Instructions" : MessageLookupByLibrary.simpleMessage("Instrukcje"), - "Interactions on this page are limited by your institution." : MessageLookupByLibrary.simpleMessage("Interakcje na tej stronie zostały ograniczone przez Twoją instytucje."), - "Invalid QR Code" : MessageLookupByLibrary.simpleMessage("Niepoprawny kod QR"), - "It looks like a great day to rest, relax, and recharge." : MessageLookupByLibrary.simpleMessage("Wygląda to na świetny dzień do odpoczynku, relaksu i regeneracji."), - "It looks like assignments haven\'t been created in this space yet." : MessageLookupByLibrary.simpleMessage("Wygląda na to, że w tej przestrzeni nie utworzono zadań."), - "Just a casual question, comment, idea, suggestion…" : MessageLookupByLibrary.simpleMessage("Jedynie przypadkowe pytanie, komentarz, pomysł, sugestię..."), - "Late" : MessageLookupByLibrary.simpleMessage("Późno"), - "Launch External Tool" : MessageLookupByLibrary.simpleMessage("Uruchom narzędzie zewnętrzne"), - "Legal" : MessageLookupByLibrary.simpleMessage("Informacje prawne"), - "Light Mode" : MessageLookupByLibrary.simpleMessage("Tryb jasny"), - "Link Error" : MessageLookupByLibrary.simpleMessage("Błąd łącza"), - "Locale:" : MessageLookupByLibrary.simpleMessage("Lokalizacja:"), - "Locate QR Code" : MessageLookupByLibrary.simpleMessage("Znajdź kod QR"), - "Location" : MessageLookupByLibrary.simpleMessage("Lokalizacja"), - "Locked" : MessageLookupByLibrary.simpleMessage("Zablokowany"), - "Log Out" : MessageLookupByLibrary.simpleMessage("Wyloguj"), - "Login flow: Canvas" : MessageLookupByLibrary.simpleMessage("Proces logowania: Canvas"), - "Login flow: Normal" : MessageLookupByLibrary.simpleMessage("Proces logowania: Normalny"), - "Login flow: Site Admin" : MessageLookupByLibrary.simpleMessage("Proces logowania: Administrator strony"), - "Login flow: Skip mobile verify" : MessageLookupByLibrary.simpleMessage("Proces logowania: Pomiń weryfikację mobilną"), - "Manage Students" : MessageLookupByLibrary.simpleMessage("Zarządzaj uczestnikami"), - "Message" : MessageLookupByLibrary.simpleMessage("Wiadomość"), - "Message subject" : MessageLookupByLibrary.simpleMessage("Temat wiadomości"), - "Missing" : MessageLookupByLibrary.simpleMessage("Brak"), - "Must be below 100" : MessageLookupByLibrary.simpleMessage("Wymagane poniżej 100"), - "Network error" : MessageLookupByLibrary.simpleMessage("Błąd sieciowy"), - "Never" : MessageLookupByLibrary.simpleMessage("Nigdy"), - "New message" : MessageLookupByLibrary.simpleMessage("Nowa wiadomość"), - "No" : MessageLookupByLibrary.simpleMessage("Nie"), - "No Alerts" : MessageLookupByLibrary.simpleMessage("Brak alertów"), - "No Assignments" : MessageLookupByLibrary.simpleMessage("Brak zadań"), - "No Courses" : MessageLookupByLibrary.simpleMessage("Brak kursów"), - "No Due Date" : MessageLookupByLibrary.simpleMessage("Brak terminu"), - "No Events Today!" : MessageLookupByLibrary.simpleMessage("Brak wydarzeń na dziś!"), - "No Grade" : MessageLookupByLibrary.simpleMessage("Brak oceny"), - "No Location Specified" : MessageLookupByLibrary.simpleMessage("Brak określonej lokalizacji"), - "No Students" : MessageLookupByLibrary.simpleMessage("Brak uczestników"), - "No Subject" : MessageLookupByLibrary.simpleMessage("Brak tematu"), - "No Summary" : MessageLookupByLibrary.simpleMessage("Brak podsumowania"), - "No description" : MessageLookupByLibrary.simpleMessage("Brak opisu"), - "No recipients selected" : MessageLookupByLibrary.simpleMessage("Nie wybrano odbiorców"), - "Not Graded" : MessageLookupByLibrary.simpleMessage("Nie oceniono"), - "Not Submitted" : MessageLookupByLibrary.simpleMessage("Nie wysłano"), - "Not a parent?" : MessageLookupByLibrary.simpleMessage("Nie jesteś rodzicem?"), - "Notifications for reminders about assignments and calendar events" : MessageLookupByLibrary.simpleMessage("Powiadomienia dla przypomnień o zadaniach i wydarzeniach w kalendarzu"), - "OS Version" : MessageLookupByLibrary.simpleMessage("Wersja OS"), - "Observer" : MessageLookupByLibrary.simpleMessage("Obserwujący"), - "One of our other apps might be a better fit. Tap one to visit the Play Store." : MessageLookupByLibrary.simpleMessage("Jedna z innych naszych aplikacji może być bardziej przydatna. Stuknij jedną z nich, aby odwiedzić sklep Play Store."), - "Open Canvas Student" : MessageLookupByLibrary.simpleMessage("Otwórz aplikację Canvas Student"), - "Open In Browser" : MessageLookupByLibrary.simpleMessage("Otwórz w przeglądarce"), - "Open with another app" : MessageLookupByLibrary.simpleMessage("Otwórz w innej aplikacji"), - "Pairing Code" : MessageLookupByLibrary.simpleMessage("Kod parowania"), - "Password" : MessageLookupByLibrary.simpleMessage("Hasło"), - "Password is required" : MessageLookupByLibrary.simpleMessage("Wymagane jest hasło"), - "Password must contain at least 8 characters" : MessageLookupByLibrary.simpleMessage("Hasło musi zawierać co najmniej 8 znaków."), - "Password…" : MessageLookupByLibrary.simpleMessage("Hasło..."), - "Planner Note" : MessageLookupByLibrary.simpleMessage("Notatka planera"), - "Please enter a valid email address" : MessageLookupByLibrary.simpleMessage("Wprowadź prawidłowy adres e-mail"), - "Please enter an email address" : MessageLookupByLibrary.simpleMessage("Podaj adres e-mail"), - "Please enter full name" : MessageLookupByLibrary.simpleMessage("Podaj pełną nazwę"), - "Please scan a QR code generated by Canvas" : MessageLookupByLibrary.simpleMessage("Zeskanuj kod QR wygenerowany przez Canvas"), - "Plum, Purple" : MessageLookupByLibrary.simpleMessage("Śliwka, fioletowy"), - "Preparing…" : MessageLookupByLibrary.simpleMessage("Przygotowywanie..."), - "Previous Logins" : MessageLookupByLibrary.simpleMessage("Poprzednie logowania"), - "Privacy Policy" : MessageLookupByLibrary.simpleMessage("Polityka prywatności"), - "Privacy Policy Link" : MessageLookupByLibrary.simpleMessage("Łącze do Polityki prywatności"), - "Privacy policy, terms of use, open source" : MessageLookupByLibrary.simpleMessage("Polityka prywatności, Warunki korzystania, open source"), - "QR Code" : MessageLookupByLibrary.simpleMessage("Kod QR"), - "QR scanning requires camera access" : MessageLookupByLibrary.simpleMessage("Skanowanie kodu QR wymaga dostępu kamery"), - "Raspberry, Red" : MessageLookupByLibrary.simpleMessage("Poziomka, czerwony"), - "Recipients" : MessageLookupByLibrary.simpleMessage("Odbiorcy"), - "Refresh" : MessageLookupByLibrary.simpleMessage("Odśwież"), - "Remind Me" : MessageLookupByLibrary.simpleMessage("Przypomnij mi"), - "Reminders" : MessageLookupByLibrary.simpleMessage("Przypomnienia"), - "Reminders have changed!" : MessageLookupByLibrary.simpleMessage("Przypomnienia uległy zmianie!"), - "Reply" : MessageLookupByLibrary.simpleMessage("Odpowiedz"), - "Reply All" : MessageLookupByLibrary.simpleMessage("Odpowiedz wszystkim"), - "Report A Problem" : MessageLookupByLibrary.simpleMessage("Zgłoś problem"), - "Request Login Help" : MessageLookupByLibrary.simpleMessage("Poproś o pomoc w logowaniu"), - "Request Login Help Button" : MessageLookupByLibrary.simpleMessage("Przycisk prośby o pomoc w logowaniu"), - "Restart app" : MessageLookupByLibrary.simpleMessage("Ponownie uruchom aplikację"), - "Retry" : MessageLookupByLibrary.simpleMessage("Ponów próbę"), - "Return to Login" : MessageLookupByLibrary.simpleMessage("Powrót do logowania"), - "STUDENT" : MessageLookupByLibrary.simpleMessage("UCZESTNIK"), - "Screenshot showing location of QR code generation in browser" : MessageLookupByLibrary.simpleMessage("Zrzut ekranu z lokalizacją wygenerowanego kodu QR w przeglądarce"), - "Screenshot showing location of pairing QR code generation in the Canvas Student app" : MessageLookupByLibrary.simpleMessage("Zrzut ekranu przedstawiający miejsce generowania kodu QR w aplikacji Canvas Student"), - "Select" : MessageLookupByLibrary.simpleMessage("Wybierz"), - "Select Student Color" : MessageLookupByLibrary.simpleMessage("Wybierz kolor uczestnika"), - "Select recipients" : MessageLookupByLibrary.simpleMessage("Wybierz odbiorców"), - "Send Feedback" : MessageLookupByLibrary.simpleMessage("Wyślij informację zwrotną"), - "Send a message about this assignment" : MessageLookupByLibrary.simpleMessage("Wyślij wiadomość o tym zadaniu"), - "Send a message about this course" : MessageLookupByLibrary.simpleMessage("Wyślij wiadomość o tym kursie"), - "Send message" : MessageLookupByLibrary.simpleMessage("Wyślij wiadomość"), - "Set a date and time to be notified of this event." : MessageLookupByLibrary.simpleMessage("Ustaw datę i godzinę powiadomienia o tym wydarzeniu."), - "Set a date and time to be notified of this specific assignment." : MessageLookupByLibrary.simpleMessage("Ustaw datę i godzinę powiadomienia dla tego zadania."), - "Settings" : MessageLookupByLibrary.simpleMessage("Ustawienia"), - "Shamrock, Green" : MessageLookupByLibrary.simpleMessage("Koniczynka, zielony"), - "Share Your Love for the App" : MessageLookupByLibrary.simpleMessage("Podziel się miłością do Aplikacji"), - "Show Password" : MessageLookupByLibrary.simpleMessage("Pokaż hasło"), - "Sign In" : MessageLookupByLibrary.simpleMessage("Zaloguj się"), - "Something went wrong trying to create your account, please reach out to your school for assistance." : MessageLookupByLibrary.simpleMessage("Wystąpił błąd podczas tworzenia konta. Skontaktuj się ze swoją szkołą, aby uzyskać pomoc."), - "Something\'s broken but I can work around it to get what I need done." : MessageLookupByLibrary.simpleMessage("Coś się zepsuło ale jestem w stanie to obejść aby wykonać to czego potrzebuję."), - "Stop Acting as User" : MessageLookupByLibrary.simpleMessage("Przestań działać jako Użytkownik"), - "Student" : MessageLookupByLibrary.simpleMessage("Uczestnik"), - "Student Pairing" : MessageLookupByLibrary.simpleMessage("Parowanie uczestnika"), - "Students can create a QR code using the Canvas Student app on their mobile device" : MessageLookupByLibrary.simpleMessage("Uczestnicy mogą utworzyć kod QR za pomocą aplikacji Canvas Student na smartfonie"), - "Students can obtain a pairing code through the Canvas website" : MessageLookupByLibrary.simpleMessage("Uczestnicy mogą otrzymać kod parowania za pomocą witryny Canvas"), - "Subject" : MessageLookupByLibrary.simpleMessage("Temat"), - "Submitted" : MessageLookupByLibrary.simpleMessage("Przesłano"), - "Successfully submitted!" : MessageLookupByLibrary.simpleMessage("Przesłano pomyślnie!"), - "Summary" : MessageLookupByLibrary.simpleMessage("Podsumowanie"), - "Switch Users" : MessageLookupByLibrary.simpleMessage("Przełącz użytkownika"), - "Syllabus" : MessageLookupByLibrary.simpleMessage("Program"), - "TA" : MessageLookupByLibrary.simpleMessage("TA"), - "TEACHER" : MessageLookupByLibrary.simpleMessage("NAUCZYCIEL"), - "Tap to favorite the courses you want to see on the Calendar. Select up to 10." : MessageLookupByLibrary.simpleMessage("Stuknij, aby dodać do ulubionych kursy, które chcesz wyświetlić w Kalendarzu. Wybierz maksymalnie 10."), - "Tap to pair with a new student" : MessageLookupByLibrary.simpleMessage("Stuknij, aby sparować z nowym uczestnikiem"), - "Tap to select this student" : MessageLookupByLibrary.simpleMessage("Stuknij, aby wybrać tego uczestnika"), - "Tap to show student selector" : MessageLookupByLibrary.simpleMessage("Stuknij, aby wyświetlić opcję wyboru uczestników"), - "Teacher" : MessageLookupByLibrary.simpleMessage("Nauczyciel"), - "Tell us about your favorite parts of the app" : MessageLookupByLibrary.simpleMessage("Powiedz nam o twoich ulubionych częściach aplikacji"), - "Terms of Service" : MessageLookupByLibrary.simpleMessage("Warunki korzystania z usługi"), - "Terms of Service Link" : MessageLookupByLibrary.simpleMessage("Łącze do Warunków korzystania z usługi"), - "Terms of Use" : MessageLookupByLibrary.simpleMessage("Warunki korzystania"), - "The QR code you scanned may have expired. Refresh the code on the student\'s device and try again." : MessageLookupByLibrary.simpleMessage("Kod QR, który zeskanowano, mógł już wygasnąć. Odśwież kod na urządzeniu uczestnika i spróbuj ponownie."), - "The following information will help us better understand your idea:" : MessageLookupByLibrary.simpleMessage("Poniższe informacje pozwolą nam lepiej zrozumieć twój pomysł:"), - "The server you entered is not authorized for this app." : MessageLookupByLibrary.simpleMessage("Wybrany serwer nie ma uprawnień dla tej aplikacji."), - "The student you are trying to add belongs to a different school. Log in or create an account with that school to scan this code." : MessageLookupByLibrary.simpleMessage("Uczestnik, którego próbujesz dodać, należy do innej szkoły. Aby zeskanować ten kod, zaloguj się lub utwórz konto powiązane z tą szkołą."), - "The user agent for this app is not authorized." : MessageLookupByLibrary.simpleMessage("Pośrednik użytkownika dla tej aplikacji nie ma uprawnień."), - "Theme" : MessageLookupByLibrary.simpleMessage("Motyw"), - "There are no installed applications that can open this file" : MessageLookupByLibrary.simpleMessage("Brak zainstalowanych aplikacji, które mogłyby otworzyć ten plik"), - "There is no page information available." : MessageLookupByLibrary.simpleMessage("Brak informacji o stronie."), - "There was a problem loading the Terms of Use" : MessageLookupByLibrary.simpleMessage("Wystąpił problem z wczytywaniem Warunków korzystania"), - "There was a problem removing this student from your account. Please check your connection and try again." : MessageLookupByLibrary.simpleMessage("Wystąpił błąd podczas usuwania tego uczestnika z konta. Sprawdź połączenie i spróbuj ponownie."), - "There was an error loading recipients for this course" : MessageLookupByLibrary.simpleMessage("Wystąpił problem z wczytaniem odbiorców dla tego kursu"), - "There was an error loading the summary details for this course." : MessageLookupByLibrary.simpleMessage("Wystąpił problem z wczytaniem szczegółów podsumowania dla tego kursu."), - "There was an error loading this announcement" : MessageLookupByLibrary.simpleMessage("Wystąpił problem z wczytaniem tego ogłoszenia"), - "There was an error loading this conversation" : MessageLookupByLibrary.simpleMessage("Wystąpił problem z wczytaniem tej rozmowy"), - "There was an error loading this file" : MessageLookupByLibrary.simpleMessage("Wystąpił problem z wczytaniem tego pliku"), - "There was an error loading your inbox messages." : MessageLookupByLibrary.simpleMessage("Wystąpił błąd podczas wczytywania wiadomości ze skrzynki odbiorczej."), - "There was an error loading your student\'s alerts." : MessageLookupByLibrary.simpleMessage("Wystąpił błąd podczas wczytywania alertów dla uczestników."), - "There was an error loading your student\'s calendar" : MessageLookupByLibrary.simpleMessage("Wystąpił błąd podczas wczytywania kalendarza dla uczestników"), - "There was an error loading your students." : MessageLookupByLibrary.simpleMessage("Wystąpił błąd podczas wczytywania uczestników."), - "There was an error loading your student’s courses." : MessageLookupByLibrary.simpleMessage("Wystąpił błąd podczas wczytywania kursów uczestnika."), - "There was an error logging in. Please generate another QR Code and try again." : MessageLookupByLibrary.simpleMessage("Wystąpił błąd podczas logowania. Wygeneruj kolejny kod QR i spróbuj ponownie."), - "There was an error trying to act as this user. Please check the Domain and User ID and try again." : MessageLookupByLibrary.simpleMessage("Wystąpił błąd podczas podszywania się jako ten użytkownik. Sprawdź domenę i ID użytkownika oraz spróbuj ponownie."), - "There’s nothing to be notified of yet." : MessageLookupByLibrary.simpleMessage("Brak informacji do przekazania."), - "This app is not authorized for use." : MessageLookupByLibrary.simpleMessage("Ta aplikacja nie jest dopuszczona do użytku."), - "This course does not have any assignments or calendar events yet." : MessageLookupByLibrary.simpleMessage("Ten kurs nie ma żadnych zadań ani wydarzeń w kalendarzu."), - "This file is unsupported and can’t be viewed through the app" : MessageLookupByLibrary.simpleMessage("Ten plik nie jest obsługiwany i nie można go wyświetlić w aplikacji"), - "This will unpair and remove all enrollments for this student from your account." : MessageLookupByLibrary.simpleMessage("Spowoduje to usunięcie parowania i wszystkich zapisów uczestnika z konta."), - "Total Grade" : MessageLookupByLibrary.simpleMessage("Łączna ocena"), - "Uh oh!" : MessageLookupByLibrary.simpleMessage("O, nie!"), - "Unable to fetch courses. Please check your connection and try again." : MessageLookupByLibrary.simpleMessage("Nie udało się pobrać kursów. Sprawdź połączenie i spróbuj ponownie."), - "Unable to load this image" : MessageLookupByLibrary.simpleMessage("Nie można wczytać tego obrazu"), - "Unable to play this media file" : MessageLookupByLibrary.simpleMessage("Nie można odtworzyć pliku multimediów"), - "Unable to send message. Check your connection and try again." : MessageLookupByLibrary.simpleMessage("Nie udało się wysłać wiadomości. Sprawdź połączenie sieciowe i spróbuj ponownie."), - "Under Construction" : MessageLookupByLibrary.simpleMessage("Strona w budowie"), - "Unknown User" : MessageLookupByLibrary.simpleMessage("Nieznany użytkownik"), - "Unsaved changes" : MessageLookupByLibrary.simpleMessage("Niezapisane zmiany"), - "Unsupported File" : MessageLookupByLibrary.simpleMessage("Nieobsługiwany plik"), - "Upload File" : MessageLookupByLibrary.simpleMessage("Prześlij plik"), - "Use Camera" : MessageLookupByLibrary.simpleMessage("Użyj kamery"), - "Use Dark Theme in Web Content" : MessageLookupByLibrary.simpleMessage("Użyj ciemnego motywu w zawartości sieciowej"), - "User ID" : MessageLookupByLibrary.simpleMessage("ID użytkownika"), - "User ID:" : MessageLookupByLibrary.simpleMessage("Identyfikator użytkownika:"), - "Version Number" : MessageLookupByLibrary.simpleMessage("Numer wersji"), - "View Description" : MessageLookupByLibrary.simpleMessage("Wyświetl opis"), - "View error details" : MessageLookupByLibrary.simpleMessage("Wyświetl szczegóły błędu"), - "View the Privacy Policy" : MessageLookupByLibrary.simpleMessage("Pokaż politykę prywatności"), - "We are currently building this feature for your viewing pleasure." : MessageLookupByLibrary.simpleMessage("Tworzymy tę funkcję dla przyjemności użytkowników."), - "We are unable to display this link, it may belong to an institution you currently aren\'t logged in to." : MessageLookupByLibrary.simpleMessage("Nie udało się wyświetlić tego łącza, może należeć do instytucji, do której nie jesteś zalogowany."), - "We couldn\'t find any students associated with this account" : MessageLookupByLibrary.simpleMessage("Nie udało się odnaleźć uczestnika powiązanego z tym kontem"), - "We were unable to verify the server for use with this app." : MessageLookupByLibrary.simpleMessage("Nie udało się zweryfikować serwera do użycia z tą aplikacją."), - "We’re not sure what happened, but it wasn’t good. Contact us if this keeps happening." : MessageLookupByLibrary.simpleMessage("Nie mamy pewności, co się wydarzyło, ale nie było to dobre. Jeśli to będzie się powtarzać, skontaktuj się z nami."), - "What can we do better?" : MessageLookupByLibrary.simpleMessage("Co możemy ulepszyć?"), - "Yes" : MessageLookupByLibrary.simpleMessage("Tak"), - "You are not observing any students." : MessageLookupByLibrary.simpleMessage("Nie obserwujesz żadnych uczestników."), - "You may only choose 10 calendars to display" : MessageLookupByLibrary.simpleMessage("Możesz wybrać tylko 10 kalendarzy do wyświetlenia"), - "You must enter a user id" : MessageLookupByLibrary.simpleMessage("Musisz wpisać ID użytkownika"), - "You must enter a valid domain" : MessageLookupByLibrary.simpleMessage("Musisz wpisać prawidłową domenę"), - "You must select at least one calendar to display" : MessageLookupByLibrary.simpleMessage("Musisz wybrać co najmniej jeden kalendarz do wyświetlenia"), - "You will be notified about this assignment on…" : MessageLookupByLibrary.simpleMessage("Otrzymasz powiadomienie o tym zadaniu w dniu..."), - "You will be notified about this event on…" : MessageLookupByLibrary.simpleMessage("Otrzymasz powiadomienie o tym wydarzeniu w dniu..."), - "You\'ll find the QR code on the web in your account profile. Click \'QR for Mobile Login\' in the list." : MessageLookupByLibrary.simpleMessage("Kod QR można znaleźć w witrynie, na profilu konta. Kliknij \'Kod QR do logowania mobilnego\' na liście."), - "You\'ll need to open your student\'s Canvas Student app to continue. Go into Main Menu > Settings > Pair with Observer and scan the QR code you see there." : MessageLookupByLibrary.simpleMessage("Aby kontynuować, należy otworzyć aplikację Canvas Student. Przejdź do Menu głównego > Ustawienia > Paruj z obserwującym i zeskanuj podany kod QR."), - "Your code is incorrect or expired." : MessageLookupByLibrary.simpleMessage("Twój kod jest nieprawidłowy lub wygasł."), - "Your student’s courses might not be published yet." : MessageLookupByLibrary.simpleMessage("Być może kursy uczestnika nie zostały jeszcze opublikowane."), - "You’re all caught up!" : MessageLookupByLibrary.simpleMessage("To już wszystko!"), - "actingAsUser" : m0, - "alertsLabel" : MessageLookupByLibrary.simpleMessage("Alerty"), - "appVersion" : m1, - "assignmentGradeAboveThreshold" : m2, - "assignmentGradeBelowThreshold" : m3, - "assignmentLockedModule" : m4, - "assignmentSubjectMessage" : m5, - "assignmentTotalPoints" : m6, - "assignmentTotalPointsAccessible" : m7, - "authorToNOthers" : m8, - "authorToRecipient" : m9, - "authorToRecipientAndNOthers" : m10, - "badgeNumberPlus" : m11, - "calendarLabel" : MessageLookupByLibrary.simpleMessage("Kalendarz"), - "canvasGuides" : MessageLookupByLibrary.simpleMessage("Przewodniki Canvas"), - "canvasLogoLabel" : MessageLookupByLibrary.simpleMessage("Logo Canvas"), - "canvasSupport" : MessageLookupByLibrary.simpleMessage("Wsparcie Canvas"), - "changeStudentColorLabel" : m12, - "collapse" : MessageLookupByLibrary.simpleMessage("zwinąć"), - "collapsed" : MessageLookupByLibrary.simpleMessage("zwinięte"), - "contentDescriptionScoreOutOfPointsPossible" : m13, - "courseForWhom" : m14, - "courseGradeAboveThreshold" : m15, - "courseGradeBelowThreshold" : m16, - "coursesLabel" : MessageLookupByLibrary.simpleMessage("Kursy"), - "dateAtTime" : m17, - "dismissAlertLabel" : m18, - "domainSearchHelpBody" : m19, - "domainSearchHelpLabel" : MessageLookupByLibrary.simpleMessage("Jak mogę odnaleźć swoją szkołę lub okrąg?"), - "domainSearchInputHint" : MessageLookupByLibrary.simpleMessage("Wpisz nazwę szkoły lub okręg..."), - "dueDateAtTime" : m20, - "endMasqueradeLogoutMessage" : m21, - "endMasqueradeMessage" : m22, - "eventSubjectMessage" : m23, - "eventTime" : m24, - "expand" : MessageLookupByLibrary.simpleMessage("rozwinąć"), - "expanded" : MessageLookupByLibrary.simpleMessage("rozwinięte"), - "finalGrade" : m25, - "findSchool" : MessageLookupByLibrary.simpleMessage("Znajdź szkołę"), - "frontPageSubjectMessage" : m26, - "gradeFormatScoreOutOfPointsPossible" : m27, - "gradesSubjectMessage" : m28, - "latePenalty" : m29, - "me" : MessageLookupByLibrary.simpleMessage("ja"), - "messageLinkPostscript" : m30, - "minus" : MessageLookupByLibrary.simpleMessage("minus"), - "mustBeAboveN" : m31, - "mustBeBelowN" : m32, - "next" : MessageLookupByLibrary.simpleMessage("Następny"), - "nextMonth" : m33, - "nextWeek" : m34, - "noDomainResults" : m35, - "ok" : MessageLookupByLibrary.simpleMessage("OK"), - "outOfPoints" : m36, - "plusRecipientCount" : m37, - "pointsPossible" : m38, - "previousMonth" : m39, - "previousWeek" : m40, - "qrCreateAccountTos" : m41, - "ratingDialogEmailSubject" : m42, - "selectedMonthLabel" : m43, - "send" : MessageLookupByLibrary.simpleMessage("wyślij"), - "starRating" : m44, - "submissionStatusSuccessSubtitle" : m45, - "syllabusSubjectMessage" : m46, - "unread" : MessageLookupByLibrary.simpleMessage("nieprzeczytane"), - "unreadCount" : m47 - }; -} diff --git a/apps/flutter_parent/lib/l10n/generated/messages_pt_BR.dart b/apps/flutter_parent/lib/l10n/generated/messages_pt_BR.dart deleted file mode 100644 index 8d9ea5f8d4..0000000000 --- a/apps/flutter_parent/lib/l10n/generated/messages_pt_BR.dart +++ /dev/null @@ -1,473 +0,0 @@ -// DO NOT EDIT. This is code generated via package:intl/generate_localized.dart -// This is a library that provides messages for a pt_BR locale. All the -// messages from the main program should be duplicated here with the same -// function name. - -// Ignore issues from commonly used lints in this file. -// ignore_for_file:unnecessary_brace_in_string_interps, unnecessary_new -// ignore_for_file:prefer_single_quotes,comment_references, directives_ordering -// ignore_for_file:annotate_overrides,prefer_generic_function_type_aliases -// ignore_for_file:unused_import, file_names - -import 'package:intl/intl.dart'; -import 'package:intl/message_lookup_by_library.dart'; - -final messages = new MessageLookup(); - -typedef String MessageIfAbsent(String messageStr, List args); - -class MessageLookup extends MessageLookupByLibrary { - String get localeName => 'pt_BR'; - - static m0(userName) => "Você está agindo como ${userName}"; - - static m1(version) => "v. ${version}"; - - static m2(threshold) => "Nota da tarefa acima ${threshold}"; - - static m3(threshold) => "Nota da tarefa abaixo ${threshold}"; - - static m4(moduleName) => "Esta tarefa está bloqueada pelo módulo \"${moduleName}\"."; - - static m5(studentName, assignmentName) => "Sobre: ${studentName}, Tarefa - ${assignmentName}"; - - static m6(points) => "${points} pts"; - - static m7(points) => "${points} pontos"; - - static m8(authorName, howMany) => "${Intl.plural(howMany, one: '${authorName} para 1 outro', other: '${authorName} para ${howMany} outros')}"; - - static m9(authorName, recipientName) => "${authorName} a ${recipientName}"; - - static m10(authorName, recipientName, howMany) => "${Intl.plural(howMany, one: '${authorName} para ${recipientName} e 1 outro', other: '${authorName} para ${recipientName} e ${howMany} outros')}"; - - static m11(count) => "${count}+"; - - static m12(studentName) => "Alterar cor para ${studentName}"; - - static m13(score, pointsPossible) => "${score} de ${pointsPossible} pontos"; - - static m14(studentShortName) => "para ${studentShortName}"; - - static m15(threshold) => "Nota do curso acima ${threshold}"; - - static m16(threshold) => "Nota do curso abaixo ${threshold}"; - - static m17(date, time) => "${date} às ${time}"; - - static m18(alertTitle) => "Descartar ${alertTitle}"; - - static m19(canvasGuides, canvasSupport) => "Tente pesquisar o nome da escola ou distrito que você está tentando acessar, como “Smith Private School” ou “Smith County Schools.” Também é possível inserir um domínio do Canvas diretamente, como “smith.instructure.com.”\n\nPara mais informações sobre encontrar a conta do Canvas da sua instituição, você pode visitar o ${canvasGuides}, falar com o ${canvasSupport} ou contatar a sua escola para assistência."; - - static m20(date, time) => "Para ser entregue em ${date} às ${time}"; - - static m21(userName) => "Você parará de agir como ${userName} e será desconectado."; - - static m22(userName) => "Você parará de agir como ${userName} e voltará à sua conta original."; - - static m23(studentName, eventTitle) => "Sobre: ${studentName}, Evento - ${eventTitle}"; - - static m24(startAt, endAt) => "${startAt} - ${endAt}"; - - static m25(grade) => "Nota final: ${grade}"; - - static m26(studentName) => "Sobre: ${studentName}, Primeira página"; - - static m27(score, pointsPossible) => "${score} / ${pointsPossible}"; - - static m28(studentName) => "Sobre: ${studentName}, Notas"; - - static m29(pointsLost) => "Penalidade por atraso (-${pointsLost})"; - - static m30(studentName, linkUrl) => "Sobre: ${studentName}, ${linkUrl}"; - - static m31(percentage) => "Deve ser acima de ${percentage}"; - - static m32(percentage) => "Deve ser abaixo de ${percentage}"; - - static m33(month) => "Próximo mês: ${month}"; - - static m34(date) => "Próxima semana começando ${date}"; - - static m35(query) => "Não é possível encontrar escolas correspondendo a \"${query}\""; - - static m36(points, howMany) => "${Intl.plural(howMany, one: 'De 1 ponto', other: 'De ${points} pontos')}"; - - static m37(count) => "+${count}"; - - static m38(points) => "${points} pontos possíveis"; - - static m39(month) => "Mês anterior: ${month}"; - - static m40(date) => "Semana anterior começando ${date}"; - - static m41(termsOfService, privacyPolicy) => "Ao tocar em ‘Criar conta’, você concorda com os ${termsOfService} e reconhece a ${privacyPolicy}"; - - static m42(version) => "Sugsetões para Android - Canvas Parent ${version}"; - - static m43(month) => "Mês de ${month}"; - - static m44(position) => "${Intl.plural(position, one: '${position} estrela', other: '${position} estrelas')}"; - - static m45(date, time) => "Esta tarefa foi enviada em ${date} às ${time} e está esperando avaliação"; - - static m46(studentName) => "Sobre: ${studentName}, Programa de estudos"; - - static m47(count) => "${count} não lido"; - - final messages = _notInlinedMessages(_notInlinedMessages); - static _notInlinedMessages(_) => { - "\"Act as\" is essentially logging in as this user without a password. You will be able to take any action as if you were this user, and from other users\' points of views, it will be as if this user performed them. However, audit logs record that you were the one who performed the actions on behalf of this user." : MessageLookupByLibrary.simpleMessage("\"Agir como\" é essencialmente fazer logon como este usuário sem uma senha. Você poderá realizar qualquer ação como se você fosse este usuário, e no ponto de vista dos outros usuários, será como se este usuário a estivesse executando. Contudo, logs de auditoria registram o fato de que você era a pessoa que realizou as ações em nome desse usuário."), - "-" : MessageLookupByLibrary.simpleMessage("-"), - "A description is required." : MessageLookupByLibrary.simpleMessage("Uma descrição é necessária."), - "A network error occurred when adding this student. Check your connection and try again." : MessageLookupByLibrary.simpleMessage("Ocorreu um erro de rede ao adicionar este aluno. Verifique sua conexão e tente novamente."), - "A subject is required." : MessageLookupByLibrary.simpleMessage("Um assunto é necessário."), - "Act As User" : MessageLookupByLibrary.simpleMessage("Agir como usuário"), - "Add Student" : MessageLookupByLibrary.simpleMessage("Adicionar Estudante"), - "Add attachment" : MessageLookupByLibrary.simpleMessage("Adicionar anexo"), - "Add new student" : MessageLookupByLibrary.simpleMessage("Adicionar novo aluno"), - "Add student with…" : MessageLookupByLibrary.simpleMessage("Adicionar aluno com..."), - "Alert Settings" : MessageLookupByLibrary.simpleMessage("Configurações do alerta"), - "Alert me when…" : MessageLookupByLibrary.simpleMessage("Avisem-me quando..."), - "All Grading Periods" : MessageLookupByLibrary.simpleMessage("Todos os períodos de avaliação"), - "Already have an account? " : MessageLookupByLibrary.simpleMessage("Já tem uma conta? "), - "An email address is required." : MessageLookupByLibrary.simpleMessage("Um endereço de e-mail é necessário."), - "An error occurred when trying to display this link" : MessageLookupByLibrary.simpleMessage("Ocorreu um erro ao tentar exibir este link"), - "An error occurred while saving your selection. Please try again." : MessageLookupByLibrary.simpleMessage("Um erro ocorreu ao salvar a sua seleção. Por favor, tente novamente."), - "An unexpected error occurred" : MessageLookupByLibrary.simpleMessage("Ocorreu um erro inesperado"), - "Android OS version" : MessageLookupByLibrary.simpleMessage("Versão SO do Android"), - "Appearance" : MessageLookupByLibrary.simpleMessage("Aparência"), - "Application version" : MessageLookupByLibrary.simpleMessage("Versão do aplicativo"), - "Are you a student or teacher?" : MessageLookupByLibrary.simpleMessage("Você é um aluno ou professor?"), - "Are you sure you want to log out?" : MessageLookupByLibrary.simpleMessage("Tem certeza de que deseja sair?"), - "Are you sure you wish to close this page? Your unsent message will be lost." : MessageLookupByLibrary.simpleMessage("Tem certeza de que deseja fechar esta página? Suas mensagens não enviadas serão perdidas."), - "Assignment Details" : MessageLookupByLibrary.simpleMessage("Detalhes da tarefa"), - "Assignment grade above" : MessageLookupByLibrary.simpleMessage("Nota da tarefa acima"), - "Assignment grade below" : MessageLookupByLibrary.simpleMessage("Nota da tarefa abaixo"), - "Assignment missing" : MessageLookupByLibrary.simpleMessage("Tarefa em falta"), - "Barney, Fuschia" : MessageLookupByLibrary.simpleMessage("Barney, Fuschia"), - "Calendars" : MessageLookupByLibrary.simpleMessage("Calendários"), - "Camera Permission" : MessageLookupByLibrary.simpleMessage("Permissão para câmera"), - "Cancel" : MessageLookupByLibrary.simpleMessage("Cancelar"), - "Canvas Student" : MessageLookupByLibrary.simpleMessage("Canvas Student"), - "Canvas Teacher" : MessageLookupByLibrary.simpleMessage("Canvas Teacher"), - "Canvas on GitHub" : MessageLookupByLibrary.simpleMessage("Canvas no GitHub"), - "Choose a course to message" : MessageLookupByLibrary.simpleMessage("Escolher um curso para enviar mensagem"), - "Choose from Gallery" : MessageLookupByLibrary.simpleMessage("Escolher na galeria"), - "Complete" : MessageLookupByLibrary.simpleMessage("Concluído"), - "Contact Support" : MessageLookupByLibrary.simpleMessage("Entre em contato com o suporte"), - "Course Announcement" : MessageLookupByLibrary.simpleMessage("Aviso do curso"), - "Course Announcements" : MessageLookupByLibrary.simpleMessage("Avisos do Curso"), - "Course grade above" : MessageLookupByLibrary.simpleMessage("Nota do curso acima"), - "Course grade below" : MessageLookupByLibrary.simpleMessage("Nota do curso abaixo"), - "Create Account" : MessageLookupByLibrary.simpleMessage("Criar conta"), - "Dark Mode" : MessageLookupByLibrary.simpleMessage("Modo escuro"), - "Date" : MessageLookupByLibrary.simpleMessage("Data"), - "Delete" : MessageLookupByLibrary.simpleMessage("Excluir"), - "Description" : MessageLookupByLibrary.simpleMessage("Descrição"), - "Device" : MessageLookupByLibrary.simpleMessage("Dispositivo"), - "Device model" : MessageLookupByLibrary.simpleMessage("Modelo do dispositivo"), - "Domain" : MessageLookupByLibrary.simpleMessage("Domínio"), - "Domain:" : MessageLookupByLibrary.simpleMessage("Domínio:"), - "Don\'t show again" : MessageLookupByLibrary.simpleMessage("Não mostrar de novo"), - "Done" : MessageLookupByLibrary.simpleMessage("Feito"), - "Download" : MessageLookupByLibrary.simpleMessage("Baixar"), - "Due" : MessageLookupByLibrary.simpleMessage("Vencimento"), - "EXTREME CRITICAL EMERGENCY!!" : MessageLookupByLibrary.simpleMessage("EMERGÊNCIA CRÍTICA EXTREMA!!"), - "Electric, blue" : MessageLookupByLibrary.simpleMessage("Elétrica, azul"), - "Email Address" : MessageLookupByLibrary.simpleMessage("Endereço de e-mail"), - "Email:" : MessageLookupByLibrary.simpleMessage("E-mail:"), - "Email…" : MessageLookupByLibrary.simpleMessage("E-mail..."), - "Enter the student pairing code provided to you. If the pairing code doesn\'t work, it may have expired" : MessageLookupByLibrary.simpleMessage("Insira o código de emparelhamento do aluno fornecido. Se o código de emparelhamento não funcionar, ele pode ter expirado"), - "Event" : MessageLookupByLibrary.simpleMessage("Evento"), - "Excused" : MessageLookupByLibrary.simpleMessage("Dispensado"), - "Expired QR Code" : MessageLookupByLibrary.simpleMessage("Código QR expirado"), - "Failed. Tap for options." : MessageLookupByLibrary.simpleMessage("Falhou. Toque para opções."), - "Filter" : MessageLookupByLibrary.simpleMessage("Filtrar"), - "Filter by" : MessageLookupByLibrary.simpleMessage("Filtrar por"), - "Fire, Orange" : MessageLookupByLibrary.simpleMessage("Fogo, laranja"), - "Front Page" : MessageLookupByLibrary.simpleMessage("Primeira página"), - "Full Name" : MessageLookupByLibrary.simpleMessage("Nome completo"), - "Full Name…" : MessageLookupByLibrary.simpleMessage("Nome completo..."), - "Full error message" : MessageLookupByLibrary.simpleMessage("Mensagem de erro completa"), - "Go to today" : MessageLookupByLibrary.simpleMessage("Ir para hoje"), - "Grade" : MessageLookupByLibrary.simpleMessage("Avaliar"), - "Grade percentage" : MessageLookupByLibrary.simpleMessage("Porcentagem da nota"), - "Graded" : MessageLookupByLibrary.simpleMessage("Avaliado"), - "Grades" : MessageLookupByLibrary.simpleMessage("Notas"), - "Help" : MessageLookupByLibrary.simpleMessage("Ajuda"), - "Hide Password" : MessageLookupByLibrary.simpleMessage("Ocultar senha"), - "High Contrast Mode" : MessageLookupByLibrary.simpleMessage("Modo de alto contraste"), - "How are we doing?" : MessageLookupByLibrary.simpleMessage("Como estamos indo?"), - "How is this affecting you?" : MessageLookupByLibrary.simpleMessage("Como isso está afetando você?"), - "I can\'t get things done until I hear back from you." : MessageLookupByLibrary.simpleMessage("Eu não posso fazer as coisas até que eu receba uma resposta de vocês."), - "I don\'t have a Canvas account" : MessageLookupByLibrary.simpleMessage("Eu não tenho uma conta do Canvas"), - "I have a Canvas account" : MessageLookupByLibrary.simpleMessage("Eu tenho uma conta do Canvas"), - "I need some help but it\'s not urgent." : MessageLookupByLibrary.simpleMessage("Preciso de ajuda, mas não é urgente."), - "I\'m having trouble logging in" : MessageLookupByLibrary.simpleMessage("Estou tendo problemas em fazer login"), - "Idea for Canvas Parent App [Android]" : MessageLookupByLibrary.simpleMessage("Ideia para o Aplicativo Canvas Parent [Android]"), - "In order to provide you with a better experience, we have updated how reminders work. You can add new reminders by viewing an assignment or calendar event and tapping the switch under the \"Remind Me\" section.\n\nBe aware that any reminders created with older versions of this app will not be compatible with the new changes and you will need to create them again." : MessageLookupByLibrary.simpleMessage("Para fornecer uma melhor experiência, atualizamos como os lembretes funcionam. É possível adicionar novos lembretes ao visualizar uma tarefa ou evento de calendário e tocar no interruptor sob a seção \"Lembrar de mim\".\n\nEsteja ciente de que quaisquer lembretes criados com versões antigas deste app não serão compatíveis com as novas alterações e será necessário criá-los novamente."), - "Inbox" : MessageLookupByLibrary.simpleMessage("Caixa de entrada"), - "Inbox Zero" : MessageLookupByLibrary.simpleMessage("Caixa de Entrada Zero"), - "Incomplete" : MessageLookupByLibrary.simpleMessage("Incompleto"), - "Incorrect Domain" : MessageLookupByLibrary.simpleMessage("Domínio incorreto"), - "Institution Announcement" : MessageLookupByLibrary.simpleMessage("Aviso da instituição"), - "Institution Announcements" : MessageLookupByLibrary.simpleMessage("Avisos da Instituição"), - "Instructions" : MessageLookupByLibrary.simpleMessage("Instruções"), - "Interactions on this page are limited by your institution." : MessageLookupByLibrary.simpleMessage("Interações nesta página são limitadas pela sua instituição."), - "Invalid QR Code" : MessageLookupByLibrary.simpleMessage("Código QR inválido"), - "It looks like a great day to rest, relax, and recharge." : MessageLookupByLibrary.simpleMessage("Parece um bom dia para descansar, relaxar e recarregar."), - "It looks like assignments haven\'t been created in this space yet." : MessageLookupByLibrary.simpleMessage("Parece que tarefas ainda não foram criadas nesse espaço."), - "Just a casual question, comment, idea, suggestion…" : MessageLookupByLibrary.simpleMessage("Só uma pergunta casual, comentário, idéia, sugestão ..."), - "Late" : MessageLookupByLibrary.simpleMessage("Atrasado"), - "Launch External Tool" : MessageLookupByLibrary.simpleMessage("Executar ferramenta externa"), - "Legal" : MessageLookupByLibrary.simpleMessage("Legal"), - "Light Mode" : MessageLookupByLibrary.simpleMessage("Modo claro"), - "Link Error" : MessageLookupByLibrary.simpleMessage("Erro de link"), - "Locale:" : MessageLookupByLibrary.simpleMessage("Localidade:"), - "Locate QR Code" : MessageLookupByLibrary.simpleMessage("Localizar código QR"), - "Location" : MessageLookupByLibrary.simpleMessage("Localização"), - "Locked" : MessageLookupByLibrary.simpleMessage("Bloqueado(a)"), - "Log Out" : MessageLookupByLibrary.simpleMessage("Sair"), - "Login flow: Canvas" : MessageLookupByLibrary.simpleMessage("Fluxo de login: Canvas"), - "Login flow: Normal" : MessageLookupByLibrary.simpleMessage("Fluxo de login: Normal"), - "Login flow: Site Admin" : MessageLookupByLibrary.simpleMessage("Fluxo de login: Administrador do site"), - "Login flow: Skip mobile verify" : MessageLookupByLibrary.simpleMessage("Fluxo de login: Pular verificação móvel"), - "Manage Students" : MessageLookupByLibrary.simpleMessage("Gerenciar alunos"), - "Message" : MessageLookupByLibrary.simpleMessage("Mensagem"), - "Message subject" : MessageLookupByLibrary.simpleMessage("Assunto da mensagem"), - "Missing" : MessageLookupByLibrary.simpleMessage("Faltante"), - "Must be below 100" : MessageLookupByLibrary.simpleMessage("Deve ser abaixo de 100"), - "Network error" : MessageLookupByLibrary.simpleMessage("Erro de rede"), - "Never" : MessageLookupByLibrary.simpleMessage("Nunca"), - "New message" : MessageLookupByLibrary.simpleMessage("Nova mensagem"), - "No" : MessageLookupByLibrary.simpleMessage("Não"), - "No Alerts" : MessageLookupByLibrary.simpleMessage("Nenhum alerta"), - "No Assignments" : MessageLookupByLibrary.simpleMessage("Sem tarefas"), - "No Courses" : MessageLookupByLibrary.simpleMessage("Sem Cursos"), - "No Due Date" : MessageLookupByLibrary.simpleMessage("Sem prazo de entrega"), - "No Events Today!" : MessageLookupByLibrary.simpleMessage("Nenhum evento hoje!"), - "No Grade" : MessageLookupByLibrary.simpleMessage("Sem nota"), - "No Location Specified" : MessageLookupByLibrary.simpleMessage("Nenhum Local Especificado"), - "No Students" : MessageLookupByLibrary.simpleMessage("Sem Alunos"), - "No Subject" : MessageLookupByLibrary.simpleMessage("Sem assunto"), - "No Summary" : MessageLookupByLibrary.simpleMessage("Sem resumo"), - "No description" : MessageLookupByLibrary.simpleMessage("Sem descrição"), - "No recipients selected" : MessageLookupByLibrary.simpleMessage("Nenhum recipiente selecionado"), - "Not Graded" : MessageLookupByLibrary.simpleMessage("Sem nota"), - "Not Submitted" : MessageLookupByLibrary.simpleMessage("Não Enviado"), - "Not a parent?" : MessageLookupByLibrary.simpleMessage("Não é um pai?"), - "Notifications for reminders about assignments and calendar events" : MessageLookupByLibrary.simpleMessage("Notificações para lembretes sobre tarefas e eventos do calendário"), - "OS Version" : MessageLookupByLibrary.simpleMessage("Versão OS"), - "Observer" : MessageLookupByLibrary.simpleMessage("Observador"), - "One of our other apps might be a better fit. Tap one to visit the Play Store." : MessageLookupByLibrary.simpleMessage("Um dos nossos outros aplicativos pode ser uma escolha melhor. Toque em um para visitar o Play Store."), - "Open Canvas Student" : MessageLookupByLibrary.simpleMessage("Abrir Canvas Student"), - "Open In Browser" : MessageLookupByLibrary.simpleMessage("Abrir em Navegador"), - "Open with another app" : MessageLookupByLibrary.simpleMessage("Abrir com outro app"), - "Pairing Code" : MessageLookupByLibrary.simpleMessage("Código de emparelhamento"), - "Password" : MessageLookupByLibrary.simpleMessage("Senha"), - "Password is required" : MessageLookupByLibrary.simpleMessage("Senha é necessária"), - "Password must contain at least 8 characters" : MessageLookupByLibrary.simpleMessage("Senha deve ter pelo menos 8 caracteres"), - "Password…" : MessageLookupByLibrary.simpleMessage("Senha..."), - "Planner Note" : MessageLookupByLibrary.simpleMessage("Nota do planejador"), - "Please enter a valid email address" : MessageLookupByLibrary.simpleMessage("Insira um endereço de e-mail válido"), - "Please enter an email address" : MessageLookupByLibrary.simpleMessage("Insira um endereço de e-mail"), - "Please enter full name" : MessageLookupByLibrary.simpleMessage("Insira nome completo"), - "Please scan a QR code generated by Canvas" : MessageLookupByLibrary.simpleMessage("Escaneie um código QR gerado pelo Canvas"), - "Plum, Purple" : MessageLookupByLibrary.simpleMessage("Ameixa, roxo"), - "Preparing…" : MessageLookupByLibrary.simpleMessage("Preparando..."), - "Previous Logins" : MessageLookupByLibrary.simpleMessage("Logins prévios"), - "Privacy Policy" : MessageLookupByLibrary.simpleMessage("Política de privacidade"), - "Privacy Policy Link" : MessageLookupByLibrary.simpleMessage("Link da Política de Privacidade"), - "Privacy policy, terms of use, open source" : MessageLookupByLibrary.simpleMessage("Política de privacidade, termos e uso, fonte aberta"), - "QR Code" : MessageLookupByLibrary.simpleMessage("Código QR"), - "QR scanning requires camera access" : MessageLookupByLibrary.simpleMessage("O escaneamento QR requer acesso à câmera"), - "Raspberry, Red" : MessageLookupByLibrary.simpleMessage("Framboesa, vermelho"), - "Recipients" : MessageLookupByLibrary.simpleMessage("Recipientes"), - "Refresh" : MessageLookupByLibrary.simpleMessage("Atualizar"), - "Remind Me" : MessageLookupByLibrary.simpleMessage("Lembrar-me"), - "Reminders" : MessageLookupByLibrary.simpleMessage("Lembretes"), - "Reminders have changed!" : MessageLookupByLibrary.simpleMessage("Lembretes mudaram!"), - "Reply" : MessageLookupByLibrary.simpleMessage("Responder"), - "Reply All" : MessageLookupByLibrary.simpleMessage("Responder a todos"), - "Report A Problem" : MessageLookupByLibrary.simpleMessage("Relatar um problema"), - "Request Login Help" : MessageLookupByLibrary.simpleMessage("Solicitar ajuda com login"), - "Request Login Help Button" : MessageLookupByLibrary.simpleMessage("Solicitar botão de ajuda com login"), - "Restart app" : MessageLookupByLibrary.simpleMessage("Reiniciar app"), - "Retry" : MessageLookupByLibrary.simpleMessage("Tentar novamente"), - "Return to Login" : MessageLookupByLibrary.simpleMessage("Voltar ao login"), - "STUDENT" : MessageLookupByLibrary.simpleMessage("ALUNO"), - "Screenshot showing location of QR code generation in browser" : MessageLookupByLibrary.simpleMessage("Captura de tela mostrando local da geração do código QR no navegador"), - "Screenshot showing location of pairing QR code generation in the Canvas Student app" : MessageLookupByLibrary.simpleMessage("Captura de tela mostrando o local da geração de código QR emparelhado no aplicativo Canvas Student"), - "Select" : MessageLookupByLibrary.simpleMessage("Selecionar"), - "Select Student Color" : MessageLookupByLibrary.simpleMessage("Selecionar cor do aluno"), - "Select recipients" : MessageLookupByLibrary.simpleMessage("Selecionar recipientes"), - "Send Feedback" : MessageLookupByLibrary.simpleMessage("Enviar Comentários"), - "Send a message about this assignment" : MessageLookupByLibrary.simpleMessage("Enviar uma mensagem sobre esta tarefa"), - "Send a message about this course" : MessageLookupByLibrary.simpleMessage("Enviar uma mensagem sobre este curso"), - "Send message" : MessageLookupByLibrary.simpleMessage("Enviar mensagem"), - "Set a date and time to be notified of this event." : MessageLookupByLibrary.simpleMessage("Definir uma data e hora para ser notificado sobre este evento."), - "Set a date and time to be notified of this specific assignment." : MessageLookupByLibrary.simpleMessage("Definir uma data e hora para ser notificado sobre esta tarefa específica."), - "Settings" : MessageLookupByLibrary.simpleMessage("Configurações"), - "Shamrock, Green" : MessageLookupByLibrary.simpleMessage("Trevo, verde"), - "Share Your Love for the App" : MessageLookupByLibrary.simpleMessage("Divulgar o seu amor pelo aplicativo"), - "Show Password" : MessageLookupByLibrary.simpleMessage("Exibir senha"), - "Sign In" : MessageLookupByLibrary.simpleMessage("Conectar"), - "Something went wrong trying to create your account, please reach out to your school for assistance." : MessageLookupByLibrary.simpleMessage("Algo deu errado ao tentar criar sua conta. Entre em contato com sua escola para obter ajuda."), - "Something\'s broken but I can work around it to get what I need done." : MessageLookupByLibrary.simpleMessage("Alguma coisa não está funcionando, mas eu posso trabalhar em torno dela para conseguir fazer o que precisa ser feito."), - "Stop Acting as User" : MessageLookupByLibrary.simpleMessage("Parar de Agir como Usuário"), - "Student" : MessageLookupByLibrary.simpleMessage("Aluno"), - "Student Pairing" : MessageLookupByLibrary.simpleMessage("Emparelhamento do aluno"), - "Students can create a QR code using the Canvas Student app on their mobile device" : MessageLookupByLibrary.simpleMessage("Os alunos podem criar um código QR usando o aplicativo Canvas Student em seu dispositivo móvel"), - "Students can obtain a pairing code through the Canvas website" : MessageLookupByLibrary.simpleMessage("Os alunos podem obter um código de emparelhamento no site do Canvas"), - "Subject" : MessageLookupByLibrary.simpleMessage("Assunto"), - "Submitted" : MessageLookupByLibrary.simpleMessage("Enviado"), - "Successfully submitted!" : MessageLookupByLibrary.simpleMessage("Enviado com sucesso!"), - "Summary" : MessageLookupByLibrary.simpleMessage("Resumo"), - "Switch Users" : MessageLookupByLibrary.simpleMessage("Alternar Usuários"), - "Syllabus" : MessageLookupByLibrary.simpleMessage("Programa"), - "TA" : MessageLookupByLibrary.simpleMessage("Assistente"), - "TEACHER" : MessageLookupByLibrary.simpleMessage("PROFESSOR"), - "Tap to favorite the courses you want to see on the Calendar. Select up to 10." : MessageLookupByLibrary.simpleMessage("Toque para favoritar os cursos que você deseja ver no calendário. Selecione até 10."), - "Tap to pair with a new student" : MessageLookupByLibrary.simpleMessage("Toque para emparelhar com um novo aluno"), - "Tap to select this student" : MessageLookupByLibrary.simpleMessage("Toque para selecionar este aluno"), - "Tap to show student selector" : MessageLookupByLibrary.simpleMessage("Toque para exibir o seletor de alunos"), - "Teacher" : MessageLookupByLibrary.simpleMessage("Professor"), - "Tell us about your favorite parts of the app" : MessageLookupByLibrary.simpleMessage("Conte-nos as suas partes favoritas do aplicativo"), - "Terms of Service" : MessageLookupByLibrary.simpleMessage("Termos de Serviço"), - "Terms of Service Link" : MessageLookupByLibrary.simpleMessage("Link dos Termos de Serviço"), - "Terms of Use" : MessageLookupByLibrary.simpleMessage("Termos de Uso"), - "The QR code you scanned may have expired. Refresh the code on the student\'s device and try again." : MessageLookupByLibrary.simpleMessage("O código QR que você escaneou pode ter expirado. Atualize o código no dispositivo do aluno e tente novamente."), - "The following information will help us better understand your idea:" : MessageLookupByLibrary.simpleMessage("As informações a seguir nos ajudarão a compreender melhor a sua ideia:"), - "The server you entered is not authorized for this app." : MessageLookupByLibrary.simpleMessage("O servidor que você digitou não está autorizado para este aplicativo."), - "The student you are trying to add belongs to a different school. Log in or create an account with that school to scan this code." : MessageLookupByLibrary.simpleMessage("O aluno que você está tentando adicionar pertence a uma escola diferente. Faça login ou crie uma conta nessa escola para escanear esse código."), - "The user agent for this app is not authorized." : MessageLookupByLibrary.simpleMessage("O agente de usuário para este aplicativo não é autorizado."), - "Theme" : MessageLookupByLibrary.simpleMessage("Tema"), - "There are no installed applications that can open this file" : MessageLookupByLibrary.simpleMessage("Não há aplicativos instalados que podem abrir este arquivo"), - "There is no page information available." : MessageLookupByLibrary.simpleMessage("Não há informação da página disponível."), - "There was a problem loading the Terms of Use" : MessageLookupByLibrary.simpleMessage("Houve um problema ao carregar os Termos de Uso"), - "There was a problem removing this student from your account. Please check your connection and try again." : MessageLookupByLibrary.simpleMessage("Ocorreu um problema ao remover este aluno da sua conta. Verifique a sua conexão e tente novamente."), - "There was an error loading recipients for this course" : MessageLookupByLibrary.simpleMessage("Houve um erro ao carregar recipientes para este curso"), - "There was an error loading the summary details for this course." : MessageLookupByLibrary.simpleMessage("Houve um erro ao carregar os detalhes do resumo para este curso."), - "There was an error loading this announcement" : MessageLookupByLibrary.simpleMessage("Houve um erro ao carregar este anúncio"), - "There was an error loading this conversation" : MessageLookupByLibrary.simpleMessage("Houve um erro ao carregar esta conversa"), - "There was an error loading this file" : MessageLookupByLibrary.simpleMessage("Houve um erro ao carregar este arquivo"), - "There was an error loading your inbox messages." : MessageLookupByLibrary.simpleMessage("Houve um erro ao carregar as suas mensagens da caixa de entrada."), - "There was an error loading your student\'s alerts." : MessageLookupByLibrary.simpleMessage("Houve um erro ao carregar os alertas do seu aluno."), - "There was an error loading your student\'s calendar" : MessageLookupByLibrary.simpleMessage("Houve um erro ao carregar o calendário do seu aluno"), - "There was an error loading your students." : MessageLookupByLibrary.simpleMessage("Houve um erro ao carregar seus alunos."), - "There was an error loading your student’s courses." : MessageLookupByLibrary.simpleMessage("Ocorreu um erro ao carregar os cursos dos seus alunos."), - "There was an error logging in. Please generate another QR Code and try again." : MessageLookupByLibrary.simpleMessage("Houve um erro ao fazer login. Gere outro código QR e tente novamente."), - "There was an error trying to act as this user. Please check the Domain and User ID and try again." : MessageLookupByLibrary.simpleMessage("Houve um erro ao tentar agir como este usuário. Verifique o Domínio e a ID de usuário e tente novamente."), - "There’s nothing to be notified of yet." : MessageLookupByLibrary.simpleMessage("Ainda não há nada para ser notificado."), - "This app is not authorized for use." : MessageLookupByLibrary.simpleMessage("Este aplicativo não é autorizado para uso."), - "This course does not have any assignments or calendar events yet." : MessageLookupByLibrary.simpleMessage("Este curso ainda não tem quaisquer tarefas ou eventos de calendário."), - "This file is unsupported and can’t be viewed through the app" : MessageLookupByLibrary.simpleMessage("Este arquivo não é suportado e não pode ser visto através do app"), - "This will unpair and remove all enrollments for this student from your account." : MessageLookupByLibrary.simpleMessage("Isso desemparelhará e removerá todas as matrículas desse aluno da sua conta."), - "Total Grade" : MessageLookupByLibrary.simpleMessage("Nota Total"), - "Uh oh!" : MessageLookupByLibrary.simpleMessage("Que difícil..."), - "Unable to fetch courses. Please check your connection and try again." : MessageLookupByLibrary.simpleMessage("Não é possível obter cursos. Verifique a sua conexão e tente novamente."), - "Unable to load this image" : MessageLookupByLibrary.simpleMessage("Não é possível carregar esta mensagem"), - "Unable to play this media file" : MessageLookupByLibrary.simpleMessage("Não é possível reproduzir este arquivo de mídia"), - "Unable to send message. Check your connection and try again." : MessageLookupByLibrary.simpleMessage("Incapaz de enviar mensagem. Verifique sua conexão e tente novamente."), - "Under Construction" : MessageLookupByLibrary.simpleMessage("Em construção"), - "Unknown User" : MessageLookupByLibrary.simpleMessage("Usuário desconhecido"), - "Unsaved changes" : MessageLookupByLibrary.simpleMessage("Alterações não salvas"), - "Unsupported File" : MessageLookupByLibrary.simpleMessage("Arquivo não suportado"), - "Upload File" : MessageLookupByLibrary.simpleMessage("Carregar arquivo"), - "Use Camera" : MessageLookupByLibrary.simpleMessage("Usar câmera"), - "Use Dark Theme in Web Content" : MessageLookupByLibrary.simpleMessage("Usar tema escuro em conteúdo web"), - "User ID" : MessageLookupByLibrary.simpleMessage("ID de Usuário"), - "User ID:" : MessageLookupByLibrary.simpleMessage("ID de Usuário:"), - "Version Number" : MessageLookupByLibrary.simpleMessage("Número da versão"), - "View Description" : MessageLookupByLibrary.simpleMessage("Ver descrição"), - "View error details" : MessageLookupByLibrary.simpleMessage("Visualizar detalhes do erro"), - "View the Privacy Policy" : MessageLookupByLibrary.simpleMessage("Visualizar Política de Privacidade"), - "We are currently building this feature for your viewing pleasure." : MessageLookupByLibrary.simpleMessage("Atualmente estamos construindo este recurso para a sua visualização."), - "We are unable to display this link, it may belong to an institution you currently aren\'t logged in to." : MessageLookupByLibrary.simpleMessage("Não podemos exibir este link, ele pode pertencer a uma instituição à qual você não está logado atualmente."), - "We couldn\'t find any students associated with this account" : MessageLookupByLibrary.simpleMessage("Não conseguimos encontrar quaisquer alunos associados a esta conta"), - "We were unable to verify the server for use with this app." : MessageLookupByLibrary.simpleMessage("Não fomos capazes de verificar o servidor para uso com este aplicativo."), - "We’re not sure what happened, but it wasn’t good. Contact us if this keeps happening." : MessageLookupByLibrary.simpleMessage("Não temos certeza do que aconteceu, mas não foi bom. Contate-nos se isso continuar acontecendo."), - "What can we do better?" : MessageLookupByLibrary.simpleMessage("O que podemos fazer melhor?"), - "Yes" : MessageLookupByLibrary.simpleMessage("Sim"), - "You are not observing any students." : MessageLookupByLibrary.simpleMessage("Você não está observando quaisquer alunos."), - "You may only choose 10 calendars to display" : MessageLookupByLibrary.simpleMessage("Você pode escolher apenas 10 calendários para exibir"), - "You must enter a user id" : MessageLookupByLibrary.simpleMessage("É necessário inserir uma id de usuário"), - "You must enter a valid domain" : MessageLookupByLibrary.simpleMessage("É necessário inserir um domínio válido"), - "You must select at least one calendar to display" : MessageLookupByLibrary.simpleMessage("Você deve selecionar pelo menos um calendário para exibir"), - "You will be notified about this assignment on…" : MessageLookupByLibrary.simpleMessage("Você será notificado sobre esta tarefa em..."), - "You will be notified about this event on…" : MessageLookupByLibrary.simpleMessage("Você será notificado sobre este evento em..."), - "You\'ll find the QR code on the web in your account profile. Click \'QR for Mobile Login\' in the list." : MessageLookupByLibrary.simpleMessage("Você encontrará o código QR na web no seu perfil da conta. Clique em ‘QR para login móvel’ na lista."), - "You\'ll need to open your student\'s Canvas Student app to continue. Go into Main Menu > Settings > Pair with Observer and scan the QR code you see there." : MessageLookupByLibrary.simpleMessage("Você precisará abrir o aplicativo Canvas Student do aluno para continuar. Vá para o Menu Principal > Configurações > Emparelhar com o Observer e escaneie o código QR que você vê lá."), - "Your code is incorrect or expired." : MessageLookupByLibrary.simpleMessage("Seu código está incorreto ou expirado."), - "Your student’s courses might not be published yet." : MessageLookupByLibrary.simpleMessage("Os cursos do seu aluno podem ainda não ter sido publicados."), - "You’re all caught up!" : MessageLookupByLibrary.simpleMessage("Você está em dia!"), - "actingAsUser" : m0, - "alertsLabel" : MessageLookupByLibrary.simpleMessage("Alertas"), - "appVersion" : m1, - "assignmentGradeAboveThreshold" : m2, - "assignmentGradeBelowThreshold" : m3, - "assignmentLockedModule" : m4, - "assignmentSubjectMessage" : m5, - "assignmentTotalPoints" : m6, - "assignmentTotalPointsAccessible" : m7, - "authorToNOthers" : m8, - "authorToRecipient" : m9, - "authorToRecipientAndNOthers" : m10, - "badgeNumberPlus" : m11, - "calendarLabel" : MessageLookupByLibrary.simpleMessage("Calendário"), - "canvasGuides" : MessageLookupByLibrary.simpleMessage("Canvas Guides"), - "canvasLogoLabel" : MessageLookupByLibrary.simpleMessage("Logotipo do Canvas"), - "canvasSupport" : MessageLookupByLibrary.simpleMessage("Suporte do Canvas"), - "changeStudentColorLabel" : m12, - "collapse" : MessageLookupByLibrary.simpleMessage("recolher"), - "collapsed" : MessageLookupByLibrary.simpleMessage("recolhido"), - "contentDescriptionScoreOutOfPointsPossible" : m13, - "courseForWhom" : m14, - "courseGradeAboveThreshold" : m15, - "courseGradeBelowThreshold" : m16, - "coursesLabel" : MessageLookupByLibrary.simpleMessage("Cursos"), - "dateAtTime" : m17, - "dismissAlertLabel" : m18, - "domainSearchHelpBody" : m19, - "domainSearchHelpLabel" : MessageLookupByLibrary.simpleMessage("Como encontrar minha escola ou distrito?"), - "domainSearchInputHint" : MessageLookupByLibrary.simpleMessage("Inserir nome ou distrito da escola..."), - "dueDateAtTime" : m20, - "endMasqueradeLogoutMessage" : m21, - "endMasqueradeMessage" : m22, - "eventSubjectMessage" : m23, - "eventTime" : m24, - "expand" : MessageLookupByLibrary.simpleMessage("expandir"), - "expanded" : MessageLookupByLibrary.simpleMessage("expandido"), - "finalGrade" : m25, - "findSchool" : MessageLookupByLibrary.simpleMessage("Encontrar escola"), - "frontPageSubjectMessage" : m26, - "gradeFormatScoreOutOfPointsPossible" : m27, - "gradesSubjectMessage" : m28, - "latePenalty" : m29, - "me" : MessageLookupByLibrary.simpleMessage("eu"), - "messageLinkPostscript" : m30, - "minus" : MessageLookupByLibrary.simpleMessage("menos"), - "mustBeAboveN" : m31, - "mustBeBelowN" : m32, - "next" : MessageLookupByLibrary.simpleMessage("Próximo"), - "nextMonth" : m33, - "nextWeek" : m34, - "noDomainResults" : m35, - "ok" : MessageLookupByLibrary.simpleMessage("OK"), - "outOfPoints" : m36, - "plusRecipientCount" : m37, - "pointsPossible" : m38, - "previousMonth" : m39, - "previousWeek" : m40, - "qrCreateAccountTos" : m41, - "ratingDialogEmailSubject" : m42, - "selectedMonthLabel" : m43, - "send" : MessageLookupByLibrary.simpleMessage("enviar"), - "starRating" : m44, - "submissionStatusSuccessSubtitle" : m45, - "syllabusSubjectMessage" : m46, - "unread" : MessageLookupByLibrary.simpleMessage("não lido"), - "unreadCount" : m47 - }; -} diff --git a/apps/flutter_parent/lib/l10n/generated/messages_pt_PT.dart b/apps/flutter_parent/lib/l10n/generated/messages_pt_PT.dart deleted file mode 100644 index c8cc1a5d95..0000000000 --- a/apps/flutter_parent/lib/l10n/generated/messages_pt_PT.dart +++ /dev/null @@ -1,473 +0,0 @@ -// DO NOT EDIT. This is code generated via package:intl/generate_localized.dart -// This is a library that provides messages for a pt_PT locale. All the -// messages from the main program should be duplicated here with the same -// function name. - -// Ignore issues from commonly used lints in this file. -// ignore_for_file:unnecessary_brace_in_string_interps, unnecessary_new -// ignore_for_file:prefer_single_quotes,comment_references, directives_ordering -// ignore_for_file:annotate_overrides,prefer_generic_function_type_aliases -// ignore_for_file:unused_import, file_names - -import 'package:intl/intl.dart'; -import 'package:intl/message_lookup_by_library.dart'; - -final messages = new MessageLookup(); - -typedef String MessageIfAbsent(String messageStr, List args); - -class MessageLookup extends MessageLookupByLibrary { - String get localeName => 'pt_PT'; - - static m0(userName) => "Você está a agir como ${userName}"; - - static m1(version) => "v. ${version}"; - - static m2(threshold) => "Classificação de atribuição acima ${threshold}"; - - static m3(threshold) => "Classificação de atribuição abaixo ${threshold}"; - - static m4(moduleName) => "Sua tarefa está bloqueada pelo módulo “${moduleName}”."; - - static m5(studentName, assignmentName) => "Em relação a: ${studentName}, Tarefa - ${assignmentName}"; - - static m6(points) => "${points} pts"; - - static m7(points) => "${points} pontos"; - - static m8(authorName, howMany) => "${Intl.plural(howMany, one: '${authorName} para 1 outro', other: '${authorName} para ${howMany} outros')}"; - - static m9(authorName, recipientName) => "${authorName} a ${recipientName}"; - - static m10(authorName, recipientName, howMany) => "${Intl.plural(howMany, one: '${authorName} para ${recipientName} & 1 outro', other: '${authorName} para ${recipientName} & ${howMany} outros')}"; - - static m11(count) => "${count}+"; - - static m12(studentName) => "Alterar cor para ${studentName}"; - - static m13(score, pointsPossible) => "${score} de ${pointsPossible} pontos"; - - static m14(studentShortName) => "para ${studentShortName}"; - - static m15(threshold) => "Grau da Disciplina Acima ${threshold}"; - - static m16(threshold) => "Grau da Disciplina Abaixo ${threshold}"; - - static m17(date, time) => "${date} em ${time}"; - - static m18(alertTitle) => "Ignorar ${alertTitle}"; - - static m19(canvasGuides, canvasSupport) => "Tente procurar o nome da escola ou distrito que você está a tentar aceder, como “Smith Private School” ou “Smith County Schools”. Você também pode entrar diretamente em um domínio do Canvas , como “smith.instructure.com.”\n\nPara mais informações sobre como encontrar a conta do Canvas da sua instituição, você pode visitar o ${canvasGuides}, alcançar a ${canvasSupport}, ou contatar a sua escola para obter assistência."; - - static m20(date, time) => "Termina ${date} a ${time}"; - - static m21(userName) => "Você vai deixar de agir como ${userName} e será desconectado."; - - static m22(userName) => "Vai deixar de agir como ${userName} e voltar à sua conta original."; - - static m23(studentName, eventTitle) => "Em relação a: ${studentName}, Evento - ${eventTitle}"; - - static m24(startAt, endAt) => "${startAt} - ${endAt}"; - - static m25(grade) => "Nota final: ${grade}"; - - static m26(studentName) => "Em relação a: ${studentName}, Primeira página"; - - static m27(score, pointsPossible) => "${score} / ${pointsPossible}"; - - static m28(studentName) => "Em relação a: ${studentName}, Classificações"; - - static m29(pointsLost) => "Penalidade tardia (-${pointsLost})"; - - static m30(studentName, linkUrl) => "Em relação a: ${studentName}, ${linkUrl}"; - - static m31(percentage) => "Deve estar acima de ${percentage}"; - - static m32(percentage) => "Deve estar abaixo ${percentage}"; - - static m33(month) => "Próximo mês: ${month}"; - - static m34(date) => "A partir da próxima semana ${date}"; - - static m35(query) => "Incapaz de encontrar escolas iguais “${query}”"; - - static m36(points, howMany) => "${Intl.plural(howMany, one: 'De 1 ponto', other: 'Fora de ${points} pontos')}"; - - static m37(count) => "+${count}"; - - static m38(points) => "${points} ponto possível"; - - static m39(month) => "Mês anterior: ${month}"; - - static m40(date) => "A partir da semana anterior ${date}"; - - static m41(termsOfService, privacyPolicy) => "Ao tocar em “Criar conta”, concorda com o ${termsOfService} e reconhece o ${privacyPolicy}"; - - static m42(version) => "Sugestões para Android - Canvas Parent ${version}"; - - static m43(month) => "Mês de ${month}"; - - static m44(position) => "${Intl.plural(position, one: '${position} estrelas', other: '${position} estrelas')}"; - - static m45(date, time) => "Esta tarefa foi submetida em ${date} em ${time} e está à espera de ser classificada"; - - static m46(studentName) => "Em relação a: ${studentName}, Programa"; - - static m47(count) => "${count} não lida"; - - final messages = _notInlinedMessages(_notInlinedMessages); - static _notInlinedMessages(_) => { - "\"Act as\" is essentially logging in as this user without a password. You will be able to take any action as if you were this user, and from other users\' points of views, it will be as if this user performed them. However, audit logs record that you were the one who performed the actions on behalf of this user." : MessageLookupByLibrary.simpleMessage("\"Atuar como\" é essencialmente fazer logon como esse utilizador sem uma palavra passe. Você será capaz de executar qualquer ação como se fosse este utilizador e de pontos de vista de outros utilizadores, será como se este utilizador executou-os. No entanto, registos de auditoria registam que você foi o único que realizou as ações em nome desse utilizador."), - "-" : MessageLookupByLibrary.simpleMessage("-"), - "A description is required." : MessageLookupByLibrary.simpleMessage("Uma descrição é necessária."), - "A network error occurred when adding this student. Check your connection and try again." : MessageLookupByLibrary.simpleMessage("Ocorreu um erro de rede ao adicionar este aluno. Verifique a sua ligação e tente novamente."), - "A subject is required." : MessageLookupByLibrary.simpleMessage("É necessário um sujeito."), - "Act As User" : MessageLookupByLibrary.simpleMessage("Agir como Utilizador"), - "Add Student" : MessageLookupByLibrary.simpleMessage("Adicionar aluno"), - "Add attachment" : MessageLookupByLibrary.simpleMessage("Adicionar Anexo"), - "Add new student" : MessageLookupByLibrary.simpleMessage("Adicionar novo aluno"), - "Add student with…" : MessageLookupByLibrary.simpleMessage("Adicionar aluno com..."), - "Alert Settings" : MessageLookupByLibrary.simpleMessage("Configurações de Alerta"), - "Alert me when…" : MessageLookupByLibrary.simpleMessage("Alerte-me quando..."), - "All Grading Periods" : MessageLookupByLibrary.simpleMessage("Todos os períodos de classificação"), - "Already have an account? " : MessageLookupByLibrary.simpleMessage("Já tens uma conta? "), - "An email address is required." : MessageLookupByLibrary.simpleMessage("É necessário um endereço de e-mail."), - "An error occurred when trying to display this link" : MessageLookupByLibrary.simpleMessage("Ocorreu um erro ao tentar mostrar esta ligação"), - "An error occurred while saving your selection. Please try again." : MessageLookupByLibrary.simpleMessage("Ocorreu um erro ao salvar a sua selecção. É favor tentar novamente."), - "An unexpected error occurred" : MessageLookupByLibrary.simpleMessage("Ocorreu um erro inesperado"), - "Android OS version" : MessageLookupByLibrary.simpleMessage("versão do Android OS"), - "Appearance" : MessageLookupByLibrary.simpleMessage("Aparência"), - "Application version" : MessageLookupByLibrary.simpleMessage("Versão da aplicação"), - "Are you a student or teacher?" : MessageLookupByLibrary.simpleMessage("Você é um aluno ou professor?"), - "Are you sure you want to log out?" : MessageLookupByLibrary.simpleMessage("Tem a certeza de que quer terminar a sessão?"), - "Are you sure you wish to close this page? Your unsent message will be lost." : MessageLookupByLibrary.simpleMessage("Tem a certeza de que pretende fechar esta página? A sua mensagem não enviada será perdida."), - "Assignment Details" : MessageLookupByLibrary.simpleMessage("Detalhes da tarefa"), - "Assignment grade above" : MessageLookupByLibrary.simpleMessage("Classificação de atribuição acima"), - "Assignment grade below" : MessageLookupByLibrary.simpleMessage("Classificação de atribuição abaixo"), - "Assignment missing" : MessageLookupByLibrary.simpleMessage("Tarefa em falta"), - "Barney, Fuschia" : MessageLookupByLibrary.simpleMessage("Barney, Fuschia"), - "Calendars" : MessageLookupByLibrary.simpleMessage("Calendários"), - "Camera Permission" : MessageLookupByLibrary.simpleMessage("Permissão de câmara"), - "Cancel" : MessageLookupByLibrary.simpleMessage("Cancelar"), - "Canvas Student" : MessageLookupByLibrary.simpleMessage("Aluno Canvas"), - "Canvas Teacher" : MessageLookupByLibrary.simpleMessage("Canvas Teacher"), - "Canvas on GitHub" : MessageLookupByLibrary.simpleMessage("Canvas no GitHub"), - "Choose a course to message" : MessageLookupByLibrary.simpleMessage("Escolha uma disciplina para a mensagem"), - "Choose from Gallery" : MessageLookupByLibrary.simpleMessage("Escolha na Galeria"), - "Complete" : MessageLookupByLibrary.simpleMessage("Completo"), - "Contact Support" : MessageLookupByLibrary.simpleMessage("Contactar Suporte"), - "Course Announcement" : MessageLookupByLibrary.simpleMessage("Anúncio da disciplina"), - "Course Announcements" : MessageLookupByLibrary.simpleMessage("Anúncios da disciplina"), - "Course grade above" : MessageLookupByLibrary.simpleMessage("Classificação da disciplina acima"), - "Course grade below" : MessageLookupByLibrary.simpleMessage("Classificação da disciplina abaixo"), - "Create Account" : MessageLookupByLibrary.simpleMessage("Criar Conta"), - "Dark Mode" : MessageLookupByLibrary.simpleMessage("Modo Escuro"), - "Date" : MessageLookupByLibrary.simpleMessage("Data"), - "Delete" : MessageLookupByLibrary.simpleMessage("Eliminar"), - "Description" : MessageLookupByLibrary.simpleMessage("Descrição"), - "Device" : MessageLookupByLibrary.simpleMessage("Dispositivo"), - "Device model" : MessageLookupByLibrary.simpleMessage("Modelo do dispositivo"), - "Domain" : MessageLookupByLibrary.simpleMessage("Domínio"), - "Domain:" : MessageLookupByLibrary.simpleMessage("Domínio:"), - "Don\'t show again" : MessageLookupByLibrary.simpleMessage("Não apresentar novamente"), - "Done" : MessageLookupByLibrary.simpleMessage("Feito"), - "Download" : MessageLookupByLibrary.simpleMessage("Descarregar"), - "Due" : MessageLookupByLibrary.simpleMessage("Vencimento"), - "EXTREME CRITICAL EMERGENCY!!" : MessageLookupByLibrary.simpleMessage("EMERGÊNCIA EXTREMA CRÍTICA !!"), - "Electric, blue" : MessageLookupByLibrary.simpleMessage("Elétrico, azul"), - "Email Address" : MessageLookupByLibrary.simpleMessage("Endereço de e-mail"), - "Email:" : MessageLookupByLibrary.simpleMessage("Email:"), - "Email…" : MessageLookupByLibrary.simpleMessage("E-mail..."), - "Enter the student pairing code provided to you. If the pairing code doesn\'t work, it may have expired" : MessageLookupByLibrary.simpleMessage("Introduza o código de pareamento de alunos que lhe foi fornecido. Se o código de pareamento não funcionar, ele pode ter expirado"), - "Event" : MessageLookupByLibrary.simpleMessage("Evento"), - "Excused" : MessageLookupByLibrary.simpleMessage("Desculpado"), - "Expired QR Code" : MessageLookupByLibrary.simpleMessage("Código QR expirado"), - "Failed. Tap for options." : MessageLookupByLibrary.simpleMessage("Falhou. Toque para opções."), - "Filter" : MessageLookupByLibrary.simpleMessage("Filtrar"), - "Filter by" : MessageLookupByLibrary.simpleMessage("Filtrar por"), - "Fire, Orange" : MessageLookupByLibrary.simpleMessage("Fogo, Laranja"), - "Front Page" : MessageLookupByLibrary.simpleMessage("Primeira página"), - "Full Name" : MessageLookupByLibrary.simpleMessage("Nome completo"), - "Full Name…" : MessageLookupByLibrary.simpleMessage("Nome completo..."), - "Full error message" : MessageLookupByLibrary.simpleMessage("Mensagem de erro completa"), - "Go to today" : MessageLookupByLibrary.simpleMessage("Ir para hoje"), - "Grade" : MessageLookupByLibrary.simpleMessage("Nota"), - "Grade percentage" : MessageLookupByLibrary.simpleMessage("Classificação percentual"), - "Graded" : MessageLookupByLibrary.simpleMessage("Classificado"), - "Grades" : MessageLookupByLibrary.simpleMessage("Classificações"), - "Help" : MessageLookupByLibrary.simpleMessage("Ajuda"), - "Hide Password" : MessageLookupByLibrary.simpleMessage("Ocultar Palavra-passe"), - "High Contrast Mode" : MessageLookupByLibrary.simpleMessage("Modo de Alto Contraste"), - "How are we doing?" : MessageLookupByLibrary.simpleMessage("Como está?"), - "How is this affecting you?" : MessageLookupByLibrary.simpleMessage("Como é que isto o afeta?"), - "I can\'t get things done until I hear back from you." : MessageLookupByLibrary.simpleMessage("Não consigo terminar as tarefas até receber indicações vossas."), - "I don\'t have a Canvas account" : MessageLookupByLibrary.simpleMessage("Não tenho uma conta Canvas"), - "I have a Canvas account" : MessageLookupByLibrary.simpleMessage("Eu tenho uma conta Canvas"), - "I need some help but it\'s not urgent." : MessageLookupByLibrary.simpleMessage("Preciso de ajuda mas não é urgente."), - "I\'m having trouble logging in" : MessageLookupByLibrary.simpleMessage("Estou a ter problemas para fazer login"), - "Idea for Canvas Parent App [Android]" : MessageLookupByLibrary.simpleMessage("Ideia para a App Canvas Parent [Android]"), - "In order to provide you with a better experience, we have updated how reminders work. You can add new reminders by viewing an assignment or calendar event and tapping the switch under the \"Remind Me\" section.\n\nBe aware that any reminders created with older versions of this app will not be compatible with the new changes and you will need to create them again." : MessageLookupByLibrary.simpleMessage("A fim de lhe proporcionar uma melhor experiência, atualizámos a forma como os lembretes funcionam. Pode adicionar novos lembretes ao visualizar uma tarefa ou evento de calendário e tocar no botão na seção \"Lembre-me\".\n\nTenha em atenção que quaisquer lembretes criados com versões antigas desta aplicação não serão compatíveis com as novas alterações e terá de os criar novamente."), - "Inbox" : MessageLookupByLibrary.simpleMessage("Caixa de entrada"), - "Inbox Zero" : MessageLookupByLibrary.simpleMessage("Caixa de mensagem Zero"), - "Incomplete" : MessageLookupByLibrary.simpleMessage("Incompleto"), - "Incorrect Domain" : MessageLookupByLibrary.simpleMessage("Domínio Incorrecto"), - "Institution Announcement" : MessageLookupByLibrary.simpleMessage("Anúncio da Instituição"), - "Institution Announcements" : MessageLookupByLibrary.simpleMessage("Anúncios da Instituição"), - "Instructions" : MessageLookupByLibrary.simpleMessage("Instruções"), - "Interactions on this page are limited by your institution." : MessageLookupByLibrary.simpleMessage("As interações nesta página são limitadas pela sua instituição."), - "Invalid QR Code" : MessageLookupByLibrary.simpleMessage("Código QR inválido"), - "It looks like a great day to rest, relax, and recharge." : MessageLookupByLibrary.simpleMessage("Parece um ótimo dia para descansar, relaxar e recarregar."), - "It looks like assignments haven\'t been created in this space yet." : MessageLookupByLibrary.simpleMessage("Parece que as tarefas ainda não foram criadas neste espaço."), - "Just a casual question, comment, idea, suggestion…" : MessageLookupByLibrary.simpleMessage("Apenas uma questão casual, comentário, ideia, sugestão..."), - "Late" : MessageLookupByLibrary.simpleMessage("Atrasado"), - "Launch External Tool" : MessageLookupByLibrary.simpleMessage("Lançar Ferramenta Externa"), - "Legal" : MessageLookupByLibrary.simpleMessage("Legal"), - "Light Mode" : MessageLookupByLibrary.simpleMessage("Modo de luz"), - "Link Error" : MessageLookupByLibrary.simpleMessage("Erro de Ligação"), - "Locale:" : MessageLookupByLibrary.simpleMessage("Local:"), - "Locate QR Code" : MessageLookupByLibrary.simpleMessage("Localizar código QR"), - "Location" : MessageLookupByLibrary.simpleMessage("Local"), - "Locked" : MessageLookupByLibrary.simpleMessage("Bloqueado"), - "Log Out" : MessageLookupByLibrary.simpleMessage("Sair"), - "Login flow: Canvas" : MessageLookupByLibrary.simpleMessage("Fluxo de login: Canvas"), - "Login flow: Normal" : MessageLookupByLibrary.simpleMessage("Fluxo de login: Normal"), - "Login flow: Site Admin" : MessageLookupByLibrary.simpleMessage("Fluxo de login: Administrador do site"), - "Login flow: Skip mobile verify" : MessageLookupByLibrary.simpleMessage("Fluxo de login: Saltar verificação móvel"), - "Manage Students" : MessageLookupByLibrary.simpleMessage("Gerir alunos"), - "Message" : MessageLookupByLibrary.simpleMessage("Mensagem"), - "Message subject" : MessageLookupByLibrary.simpleMessage("Assunto da mensagem"), - "Missing" : MessageLookupByLibrary.simpleMessage("Em falta"), - "Must be below 100" : MessageLookupByLibrary.simpleMessage("Deve estar abaixo de 100"), - "Network error" : MessageLookupByLibrary.simpleMessage("Erro de rede"), - "Never" : MessageLookupByLibrary.simpleMessage("Nunca"), - "New message" : MessageLookupByLibrary.simpleMessage("Nova mensagem"), - "No" : MessageLookupByLibrary.simpleMessage("Não"), - "No Alerts" : MessageLookupByLibrary.simpleMessage("Sem Alertas"), - "No Assignments" : MessageLookupByLibrary.simpleMessage("Nenhuma tarefa"), - "No Courses" : MessageLookupByLibrary.simpleMessage("Sem Disciplinas"), - "No Due Date" : MessageLookupByLibrary.simpleMessage("Sem data de vencimento"), - "No Events Today!" : MessageLookupByLibrary.simpleMessage("Nenhum evento hoje!"), - "No Grade" : MessageLookupByLibrary.simpleMessage("Sem classificação"), - "No Location Specified" : MessageLookupByLibrary.simpleMessage("Sem Local Especificado"), - "No Students" : MessageLookupByLibrary.simpleMessage("Não existem alunos"), - "No Subject" : MessageLookupByLibrary.simpleMessage("Sem assunto"), - "No Summary" : MessageLookupByLibrary.simpleMessage("Nenhum Resumo"), - "No description" : MessageLookupByLibrary.simpleMessage("Sem descrição"), - "No recipients selected" : MessageLookupByLibrary.simpleMessage("Nenhum beneficiário selecionado"), - "Not Graded" : MessageLookupByLibrary.simpleMessage("Sem classificação"), - "Not Submitted" : MessageLookupByLibrary.simpleMessage("Não Entregue"), - "Not a parent?" : MessageLookupByLibrary.simpleMessage("Não é um pai?"), - "Notifications for reminders about assignments and calendar events" : MessageLookupByLibrary.simpleMessage("Notificações para lembretes sobre tarefas e eventos do calendário"), - "OS Version" : MessageLookupByLibrary.simpleMessage("Versão SO"), - "Observer" : MessageLookupByLibrary.simpleMessage("Observador"), - "One of our other apps might be a better fit. Tap one to visit the Play Store." : MessageLookupByLibrary.simpleMessage("Uma das nossas outras aplicações pode ser um ajuste melhor. Toque em um para visitar a App Store."), - "Open Canvas Student" : MessageLookupByLibrary.simpleMessage("Abrir Canvas Student"), - "Open In Browser" : MessageLookupByLibrary.simpleMessage("Abrir no Navegador"), - "Open with another app" : MessageLookupByLibrary.simpleMessage("Abrir com outra aplicação"), - "Pairing Code" : MessageLookupByLibrary.simpleMessage("Código de pareamento"), - "Password" : MessageLookupByLibrary.simpleMessage("Palavra-passe"), - "Password is required" : MessageLookupByLibrary.simpleMessage("Palavra passe é necessária"), - "Password must contain at least 8 characters" : MessageLookupByLibrary.simpleMessage("A palavra-passe deve conter pelo menos 8 caracteres"), - "Password…" : MessageLookupByLibrary.simpleMessage("Palavra-passe..."), - "Planner Note" : MessageLookupByLibrary.simpleMessage("Nota do planeador"), - "Please enter a valid email address" : MessageLookupByLibrary.simpleMessage("Por favor insira um endereço de e-mail válido"), - "Please enter an email address" : MessageLookupByLibrary.simpleMessage("Por favor, insira um endereço de e-mail"), - "Please enter full name" : MessageLookupByLibrary.simpleMessage("Por favor, insira nome completo"), - "Please scan a QR code generated by Canvas" : MessageLookupByLibrary.simpleMessage("Por favor, digitalize um código QR gerado pela Canvas"), - "Plum, Purple" : MessageLookupByLibrary.simpleMessage("Ameixa, Púrpura"), - "Preparing…" : MessageLookupByLibrary.simpleMessage("A preparar..."), - "Previous Logins" : MessageLookupByLibrary.simpleMessage("Logins anteriores"), - "Privacy Policy" : MessageLookupByLibrary.simpleMessage("Política de Privacidade"), - "Privacy Policy Link" : MessageLookupByLibrary.simpleMessage("Ligação à Política de Privacidade"), - "Privacy policy, terms of use, open source" : MessageLookupByLibrary.simpleMessage("Política de privacidade, termos de uso, código aberto"), - "QR Code" : MessageLookupByLibrary.simpleMessage("Código QR"), - "QR scanning requires camera access" : MessageLookupByLibrary.simpleMessage("A digitalização QR requer acesso à câmara"), - "Raspberry, Red" : MessageLookupByLibrary.simpleMessage("Framboesa, Vermelho"), - "Recipients" : MessageLookupByLibrary.simpleMessage("Destinatários"), - "Refresh" : MessageLookupByLibrary.simpleMessage("Atualizar"), - "Remind Me" : MessageLookupByLibrary.simpleMessage("Relembra-me"), - "Reminders" : MessageLookupByLibrary.simpleMessage("Lembretes"), - "Reminders have changed!" : MessageLookupByLibrary.simpleMessage("Os lembretes mudaram!"), - "Reply" : MessageLookupByLibrary.simpleMessage("Responder"), - "Reply All" : MessageLookupByLibrary.simpleMessage("Responder a todos"), - "Report A Problem" : MessageLookupByLibrary.simpleMessage("Relatar um Problema"), - "Request Login Help" : MessageLookupByLibrary.simpleMessage("Solicitar Ajuda de Login"), - "Request Login Help Button" : MessageLookupByLibrary.simpleMessage("Solicitar botão de Ajuda de Login"), - "Restart app" : MessageLookupByLibrary.simpleMessage("Reiniciar aplicação"), - "Retry" : MessageLookupByLibrary.simpleMessage("Tentar novamente"), - "Return to Login" : MessageLookupByLibrary.simpleMessage("Voltar para Login"), - "STUDENT" : MessageLookupByLibrary.simpleMessage("ALUNO"), - "Screenshot showing location of QR code generation in browser" : MessageLookupByLibrary.simpleMessage("Captura de tela mostrando a localização da geração do código QR no navegador"), - "Screenshot showing location of pairing QR code generation in the Canvas Student app" : MessageLookupByLibrary.simpleMessage("Imagem do ecrã mostrando a localização da geração do código QR de parelhamento na aplicação Canvas Student"), - "Select" : MessageLookupByLibrary.simpleMessage("Selecionar"), - "Select Student Color" : MessageLookupByLibrary.simpleMessage("Seleccionar a cor do aluno"), - "Select recipients" : MessageLookupByLibrary.simpleMessage("Selecione Destinatários"), - "Send Feedback" : MessageLookupByLibrary.simpleMessage("Enviar Comentários"), - "Send a message about this assignment" : MessageLookupByLibrary.simpleMessage("Enviar uma mensagem sobre esta tarefa"), - "Send a message about this course" : MessageLookupByLibrary.simpleMessage("Enviar uma mensagem a cerca dessa disciplina"), - "Send message" : MessageLookupByLibrary.simpleMessage("Enviar mensagem"), - "Set a date and time to be notified of this event." : MessageLookupByLibrary.simpleMessage("Defina uma data e hora para ser notificado deste evento."), - "Set a date and time to be notified of this specific assignment." : MessageLookupByLibrary.simpleMessage("Defina uma data e hora para ser notificado sobre esta atribuição específica."), - "Settings" : MessageLookupByLibrary.simpleMessage("Configurações"), - "Shamrock, Green" : MessageLookupByLibrary.simpleMessage("Shamrock, Verde"), - "Share Your Love for the App" : MessageLookupByLibrary.simpleMessage("Partilhe o Seu Carinho pela App"), - "Show Password" : MessageLookupByLibrary.simpleMessage("Mostrar Palavra-passe"), - "Sign In" : MessageLookupByLibrary.simpleMessage("Iniciar sessão"), - "Something went wrong trying to create your account, please reach out to your school for assistance." : MessageLookupByLibrary.simpleMessage("Algo correu mal ao tentar criar a sua conta, por favor contacte a sua escola para obter assistência."), - "Something\'s broken but I can work around it to get what I need done." : MessageLookupByLibrary.simpleMessage("Algo não está bem mas consigo contornar a dificuldade e fazer o que preciso."), - "Stop Acting as User" : MessageLookupByLibrary.simpleMessage("Parar de atuar como utilizador"), - "Student" : MessageLookupByLibrary.simpleMessage("Aluno"), - "Student Pairing" : MessageLookupByLibrary.simpleMessage("Parelhamento de alunos"), - "Students can create a QR code using the Canvas Student app on their mobile device" : MessageLookupByLibrary.simpleMessage("Os alunos podem criar um código QR utilizando a aplicação Canvas Student no seu dispositivo móvel"), - "Students can obtain a pairing code through the Canvas website" : MessageLookupByLibrary.simpleMessage("Os alunos podem obter um código de parelhamento através do sitio web do Canvas"), - "Subject" : MessageLookupByLibrary.simpleMessage("Assunto"), - "Submitted" : MessageLookupByLibrary.simpleMessage("Submetido"), - "Successfully submitted!" : MessageLookupByLibrary.simpleMessage("Submetido com sucesso!"), - "Summary" : MessageLookupByLibrary.simpleMessage("Sumário"), - "Switch Users" : MessageLookupByLibrary.simpleMessage("Alterar Utilizadores"), - "Syllabus" : MessageLookupByLibrary.simpleMessage("Programa"), - "TA" : MessageLookupByLibrary.simpleMessage("Assistente"), - "TEACHER" : MessageLookupByLibrary.simpleMessage("PROFESSOR"), - "Tap to favorite the courses you want to see on the Calendar. Select up to 10." : MessageLookupByLibrary.simpleMessage("Toque para escolher os percursos que pretende ver no Calendário. Seleccione até 10."), - "Tap to pair with a new student" : MessageLookupByLibrary.simpleMessage("Toque para parelhar com um novo aluno"), - "Tap to select this student" : MessageLookupByLibrary.simpleMessage("Toque para selecionar este aluno"), - "Tap to show student selector" : MessageLookupByLibrary.simpleMessage("Toque para mostrar o seletor de alunos"), - "Teacher" : MessageLookupByLibrary.simpleMessage("Professor"), - "Tell us about your favorite parts of the app" : MessageLookupByLibrary.simpleMessage("Diga-nos quais são as suas partes favoritas da app"), - "Terms of Service" : MessageLookupByLibrary.simpleMessage("Termos de serviço"), - "Terms of Service Link" : MessageLookupByLibrary.simpleMessage("Ligação dos Termos de serviço"), - "Terms of Use" : MessageLookupByLibrary.simpleMessage("Termos de uso"), - "The QR code you scanned may have expired. Refresh the code on the student\'s device and try again." : MessageLookupByLibrary.simpleMessage("O código QR que digitalizou pode ter expirado. Actualize o código no dispositivo do aluno e tente novamente."), - "The following information will help us better understand your idea:" : MessageLookupByLibrary.simpleMessage("A seguinte informação vai ajudar-nos a compreender melhora sua ideia:"), - "The server you entered is not authorized for this app." : MessageLookupByLibrary.simpleMessage("O servidor que você digitou não está autorizado para esta app."), - "The student you are trying to add belongs to a different school. Log in or create an account with that school to scan this code." : MessageLookupByLibrary.simpleMessage("O aluno que está a tentar acrescentar pertence a uma escola diferente. Inicie sessão ou crie uma conta com essa escola para digitalizar este código."), - "The user agent for this app is not authorized." : MessageLookupByLibrary.simpleMessage("O agente do utilizador para esta app não está autorizado."), - "Theme" : MessageLookupByLibrary.simpleMessage("Tema"), - "There are no installed applications that can open this file" : MessageLookupByLibrary.simpleMessage("Não existem aplicações instaladas que possam abrir este ficheiro"), - "There is no page information available." : MessageLookupByLibrary.simpleMessage("Não existe informação de página disponível."), - "There was a problem loading the Terms of Use" : MessageLookupByLibrary.simpleMessage("Ocorreu um problema ao carregar os Termos de Uso"), - "There was a problem removing this student from your account. Please check your connection and try again." : MessageLookupByLibrary.simpleMessage("Houve um problema ao retirar este aluno da sua conta. É favor verificar sua conexão e tente novamente."), - "There was an error loading recipients for this course" : MessageLookupByLibrary.simpleMessage("Houve um erro ao carregar os destinatários para esta disciplina"), - "There was an error loading the summary details for this course." : MessageLookupByLibrary.simpleMessage("Houve um erro ao carregar os detalhes resumidos para esta disciplina."), - "There was an error loading this announcement" : MessageLookupByLibrary.simpleMessage("Houve um erro ao carregar este anúncio"), - "There was an error loading this conversation" : MessageLookupByLibrary.simpleMessage("Ocorreu um erro ao carregar esta conversa"), - "There was an error loading this file" : MessageLookupByLibrary.simpleMessage("Houve um erro ao carregar este ficheiro"), - "There was an error loading your inbox messages." : MessageLookupByLibrary.simpleMessage("Houve um erro ao carregar as mensagens da sua caixa de entrada."), - "There was an error loading your student\'s alerts." : MessageLookupByLibrary.simpleMessage("Houve um erro ao carregar os alertas dos seus alunos."), - "There was an error loading your student\'s calendar" : MessageLookupByLibrary.simpleMessage("Houve um erro ao carregar o calendário do seu aluno."), - "There was an error loading your students." : MessageLookupByLibrary.simpleMessage("Houve um erro ao carregar os seus alunos."), - "There was an error loading your student’s courses." : MessageLookupByLibrary.simpleMessage("Houve um erro ao carregar as disciplinas dos seus alunos."), - "There was an error logging in. Please generate another QR Code and try again." : MessageLookupByLibrary.simpleMessage("Houve um erro no registo. Por favor, gere outro código QR e tente novamente."), - "There was an error trying to act as this user. Please check the Domain and User ID and try again." : MessageLookupByLibrary.simpleMessage("Houve um erro ao tentar agir como este utilizador. Por favor, verifique o Domínio e o ID do Utilizador e tente novamente."), - "There’s nothing to be notified of yet." : MessageLookupByLibrary.simpleMessage("Não há nada para ser notificado ainda."), - "This app is not authorized for use." : MessageLookupByLibrary.simpleMessage("Esta app não está autorizada para utilização."), - "This course does not have any assignments or calendar events yet." : MessageLookupByLibrary.simpleMessage("Esta disciplina ainda não tem nenhuma tarefa ou calendário de eventos."), - "This file is unsupported and can’t be viewed through the app" : MessageLookupByLibrary.simpleMessage("Este ficheiro não tem suporte e não pode ser visualizado através da aplicação"), - "This will unpair and remove all enrollments for this student from your account." : MessageLookupByLibrary.simpleMessage("Isto irá desesperar e remover todas as inscrições para este aluno da sua conta."), - "Total Grade" : MessageLookupByLibrary.simpleMessage("Nota Completa"), - "Uh oh!" : MessageLookupByLibrary.simpleMessage("Ah não!"), - "Unable to fetch courses. Please check your connection and try again." : MessageLookupByLibrary.simpleMessage("Incapaz de ir buscar disciplinas. É favor verificar sua conexão e tente novamente."), - "Unable to load this image" : MessageLookupByLibrary.simpleMessage("Incapaz de carregar esta imagem"), - "Unable to play this media file" : MessageLookupByLibrary.simpleMessage("Incapaz de reproduzir este ficheiro multimédia"), - "Unable to send message. Check your connection and try again." : MessageLookupByLibrary.simpleMessage("Incapaz de enviar mensagem. Verifique a sua ligação e tente novamente."), - "Under Construction" : MessageLookupByLibrary.simpleMessage("Em construção"), - "Unknown User" : MessageLookupByLibrary.simpleMessage("Utilizador desconhecido"), - "Unsaved changes" : MessageLookupByLibrary.simpleMessage("Alterações não guardadas"), - "Unsupported File" : MessageLookupByLibrary.simpleMessage("Ficheiro não suportado"), - "Upload File" : MessageLookupByLibrary.simpleMessage("Carregar ficheiro"), - "Use Camera" : MessageLookupByLibrary.simpleMessage("Use a câmara"), - "Use Dark Theme in Web Content" : MessageLookupByLibrary.simpleMessage("Usar Tema Escuro no Conteúdo da Web"), - "User ID" : MessageLookupByLibrary.simpleMessage("ID do utilizador"), - "User ID:" : MessageLookupByLibrary.simpleMessage("ID do Utilizador:"), - "Version Number" : MessageLookupByLibrary.simpleMessage("Número da versão"), - "View Description" : MessageLookupByLibrary.simpleMessage("Ver descrição"), - "View error details" : MessageLookupByLibrary.simpleMessage("Ver detalhes do erro"), - "View the Privacy Policy" : MessageLookupByLibrary.simpleMessage("Ver a Política de Privacidade"), - "We are currently building this feature for your viewing pleasure." : MessageLookupByLibrary.simpleMessage("Estamos atualmente a construir esta funcionalidade para o seu prazer visual."), - "We are unable to display this link, it may belong to an institution you currently aren\'t logged in to." : MessageLookupByLibrary.simpleMessage("Não podemos mostrar esta ligação, ela pode pertencer a uma instituição na qual você não está atualmente ligado."), - "We couldn\'t find any students associated with this account" : MessageLookupByLibrary.simpleMessage("Não conseguimos encontrar nenhum estudante associado a esta conta"), - "We were unable to verify the server for use with this app." : MessageLookupByLibrary.simpleMessage("Não conseguimos verificar o servidor para utilização com esta app."), - "We’re not sure what happened, but it wasn’t good. Contact us if this keeps happening." : MessageLookupByLibrary.simpleMessage("Nós não temos certeza do que aconteceu, mas não foi bom. Contacte-nos se isto continuar a acontecer."), - "What can we do better?" : MessageLookupByLibrary.simpleMessage("O que podemos melhorar?"), - "Yes" : MessageLookupByLibrary.simpleMessage("Sim"), - "You are not observing any students." : MessageLookupByLibrary.simpleMessage("Você não está a observar nenhum aluno."), - "You may only choose 10 calendars to display" : MessageLookupByLibrary.simpleMessage("Você só pode escolher 10 calendários para exibir"), - "You must enter a user id" : MessageLookupByLibrary.simpleMessage("É necessário introduzir uma id do utilizador"), - "You must enter a valid domain" : MessageLookupByLibrary.simpleMessage("É necessário introduzir um domínio válido"), - "You must select at least one calendar to display" : MessageLookupByLibrary.simpleMessage("Deve selecionar pelo menos um calendário para visualizar"), - "You will be notified about this assignment on…" : MessageLookupByLibrary.simpleMessage("Você será notificado sobre esta atribuição em..."), - "You will be notified about this event on…" : MessageLookupByLibrary.simpleMessage("Você será notificado sobre este evento em..."), - "You\'ll find the QR code on the web in your account profile. Click \'QR for Mobile Login\' in the list." : MessageLookupByLibrary.simpleMessage("Encontrará o código QR na Internet no perfil da sua conta. Clique em \'QR para Login de Telemóvel\' na lista."), - "You\'ll need to open your student\'s Canvas Student app to continue. Go into Main Menu > Settings > Pair with Observer and scan the QR code you see there." : MessageLookupByLibrary.simpleMessage("Terá de abrir a aplicação Canvas Student do seu aluno para poder continuar. Vá ao Menu Principal > Configurações > Parelhar com Observador e digitalize o código QR que aí vê."), - "Your code is incorrect or expired." : MessageLookupByLibrary.simpleMessage("O seu código está incorrecto ou expirou."), - "Your student’s courses might not be published yet." : MessageLookupByLibrary.simpleMessage("As disciplinas dos seus alunos podem ainda não ter sido publicadas."), - "You’re all caught up!" : MessageLookupByLibrary.simpleMessage("Vocês estão todos apanhados!"), - "actingAsUser" : m0, - "alertsLabel" : MessageLookupByLibrary.simpleMessage("Alertas"), - "appVersion" : m1, - "assignmentGradeAboveThreshold" : m2, - "assignmentGradeBelowThreshold" : m3, - "assignmentLockedModule" : m4, - "assignmentSubjectMessage" : m5, - "assignmentTotalPoints" : m6, - "assignmentTotalPointsAccessible" : m7, - "authorToNOthers" : m8, - "authorToRecipient" : m9, - "authorToRecipientAndNOthers" : m10, - "badgeNumberPlus" : m11, - "calendarLabel" : MessageLookupByLibrary.simpleMessage("Calendário"), - "canvasGuides" : MessageLookupByLibrary.simpleMessage("Guias Canvas"), - "canvasLogoLabel" : MessageLookupByLibrary.simpleMessage("Logo Canvas"), - "canvasSupport" : MessageLookupByLibrary.simpleMessage("Suporte Canvas"), - "changeStudentColorLabel" : m12, - "collapse" : MessageLookupByLibrary.simpleMessage("recolhido"), - "collapsed" : MessageLookupByLibrary.simpleMessage("recolhido"), - "contentDescriptionScoreOutOfPointsPossible" : m13, - "courseForWhom" : m14, - "courseGradeAboveThreshold" : m15, - "courseGradeBelowThreshold" : m16, - "coursesLabel" : MessageLookupByLibrary.simpleMessage("Disciplinas"), - "dateAtTime" : m17, - "dismissAlertLabel" : m18, - "domainSearchHelpBody" : m19, - "domainSearchHelpLabel" : MessageLookupByLibrary.simpleMessage("Como posso encontrar a minha escola ou distrito?"), - "domainSearchInputHint" : MessageLookupByLibrary.simpleMessage("Digite o nome da escola ou distrito..."), - "dueDateAtTime" : m20, - "endMasqueradeLogoutMessage" : m21, - "endMasqueradeMessage" : m22, - "eventSubjectMessage" : m23, - "eventTime" : m24, - "expand" : MessageLookupByLibrary.simpleMessage("expandido"), - "expanded" : MessageLookupByLibrary.simpleMessage("expandido"), - "finalGrade" : m25, - "findSchool" : MessageLookupByLibrary.simpleMessage("Encontrar Escola"), - "frontPageSubjectMessage" : m26, - "gradeFormatScoreOutOfPointsPossible" : m27, - "gradesSubjectMessage" : m28, - "latePenalty" : m29, - "me" : MessageLookupByLibrary.simpleMessage("eu"), - "messageLinkPostscript" : m30, - "minus" : MessageLookupByLibrary.simpleMessage("menos"), - "mustBeAboveN" : m31, - "mustBeBelowN" : m32, - "next" : MessageLookupByLibrary.simpleMessage("Próximo"), - "nextMonth" : m33, - "nextWeek" : m34, - "noDomainResults" : m35, - "ok" : MessageLookupByLibrary.simpleMessage("OK"), - "outOfPoints" : m36, - "plusRecipientCount" : m37, - "pointsPossible" : m38, - "previousMonth" : m39, - "previousWeek" : m40, - "qrCreateAccountTos" : m41, - "ratingDialogEmailSubject" : m42, - "selectedMonthLabel" : m43, - "send" : MessageLookupByLibrary.simpleMessage("enviar"), - "starRating" : m44, - "submissionStatusSuccessSubtitle" : m45, - "syllabusSubjectMessage" : m46, - "unread" : MessageLookupByLibrary.simpleMessage("não lida"), - "unreadCount" : m47 - }; -} diff --git a/apps/flutter_parent/lib/l10n/generated/messages_ru.dart b/apps/flutter_parent/lib/l10n/generated/messages_ru.dart deleted file mode 100644 index b7ab4ec086..0000000000 --- a/apps/flutter_parent/lib/l10n/generated/messages_ru.dart +++ /dev/null @@ -1,473 +0,0 @@ -// DO NOT EDIT. This is code generated via package:intl/generate_localized.dart -// This is a library that provides messages for a ru locale. All the -// messages from the main program should be duplicated here with the same -// function name. - -// Ignore issues from commonly used lints in this file. -// ignore_for_file:unnecessary_brace_in_string_interps, unnecessary_new -// ignore_for_file:prefer_single_quotes,comment_references, directives_ordering -// ignore_for_file:annotate_overrides,prefer_generic_function_type_aliases -// ignore_for_file:unused_import, file_names - -import 'package:intl/intl.dart'; -import 'package:intl/message_lookup_by_library.dart'; - -final messages = new MessageLookup(); - -typedef String MessageIfAbsent(String messageStr, List args); - -class MessageLookup extends MessageLookupByLibrary { - String get localeName => 'ru'; - - static m0(userName) => "Вы действуете как ${userName}"; - - static m1(version) => "в. ${version}"; - - static m2(threshold) => "Оценка за задание выше ${threshold}"; - - static m3(threshold) => "Оценка за задание ниже ${threshold}"; - - static m4(moduleName) => "Это задание заблокировано модулем \"${moduleName}\"."; - - static m5(studentName, assignmentName) => "Касательно: ${studentName}, задание - ${assignmentName}"; - - static m6(points) => "${points} баллов"; - - static m7(points) => "${points} баллов"; - - static m8(authorName, howMany) => "${Intl.plural(howMany, one: '${authorName} до 1 другое', other: '${authorName} до ${howMany} другие')}"; - - static m9(authorName, recipientName) => "${authorName} до ${recipientName}"; - - static m10(authorName, recipientName, howMany) => "${Intl.plural(howMany, one: '${authorName} до ${recipientName} и 1 другой', other: '${authorName} до ${recipientName} и ${howMany} другие')}"; - - static m11(count) => "${count}+"; - - static m12(studentName) => "Изменить цвет для ${studentName}"; - - static m13(score, pointsPossible) => "${score} из ${pointsPossible} баллов"; - - static m14(studentShortName) => "для ${studentShortName}"; - - static m15(threshold) => "Оценка за курс выше ${threshold}"; - - static m16(threshold) => "Оценка за курс ниже ${threshold}"; - - static m17(date, time) => "${date} в ${time}"; - - static m18(alertTitle) => "Исключить ${alertTitle}"; - - static m19(canvasGuides, canvasSupport) => "Попытайтесь выполнить поиск названия школы или округа, к которым вы пытаетесь получить доступ, например, «частная школа Смита» или «школа графства Смит». Также вы можете ввести название домена Canvas напрямую, например, «smith.instructure.com.»\n\nДля получения более подробной информации по поиску учетной записи учреждения Canvas вы можете посетить ${canvasGuides}, обратиться в ${canvasSupport} или в свою школу за поддержкой."; - - static m20(date, time) => "Срок выполнения ${date} в ${time}"; - - static m21(userName) => "Функция «Действовать как ${userName}» будет отключена, и сеанс будет завершен."; - - static m22(userName) => "Функция «Действовать как ${userName}» будет отключена и вы вернетесь в свою исходную учетную запись."; - - static m23(studentName, eventTitle) => "Касательно: ${studentName}, событие - ${eventTitle}"; - - static m24(startAt, endAt) => "${startAt} - ${endAt}"; - - static m25(grade) => "Итоговая оценка: ${grade}"; - - static m26(studentName) => "Касательно: ${studentName}, первая страница"; - - static m27(score, pointsPossible) => "${score} / ${pointsPossible}"; - - static m28(studentName) => "Касательно: ${studentName}, оценки"; - - static m29(pointsLost) => "Снижение оценки за опоздание (-${pointsLost})"; - - static m30(studentName, linkUrl) => "Касательно: ${studentName}, ${linkUrl}"; - - static m31(percentage) => "Должно быть больше ${percentage}"; - - static m32(percentage) => "Должно быть меньше ${percentage}"; - - static m33(month) => "Следующий месяц: ${month}"; - - static m34(date) => "Начало на следующей неделе ${date}"; - - static m35(query) => "Невозможно найти школу, соответствующую \"${query}\""; - - static m36(points, howMany) => "${Intl.plural(howMany, one: 'Из 1 балла', other: 'Из ${points} баллов')}"; - - static m37(count) => "+${count}"; - - static m38(points) => "${points} балла(-ов) возможно"; - - static m39(month) => "Предыдущий месяц: ${month}"; - - static m40(date) => "Начало на предыдущей неделе ${date}"; - - static m41(termsOfService, privacyPolicy) => "Нажимая «Создать учетную запись», вы соглашаетесь с ${termsOfService} и признаете ${privacyPolicy}"; - - static m42(version) => "Предложения для Android - Canvas Parent ${version}"; - - static m43(month) => "Месяц из ${month}"; - - static m44(position) => "${Intl.plural(position, one: '${position} звезда', other: '${position} звезд(-ы)')}"; - - static m45(date, time) => "Это задание было отправлено ${date} в ${time} и ожидает оценки"; - - static m46(studentName) => "Касательно: ${studentName}, содержание курса"; - - static m47(count) => "${count} непрочитанных"; - - final messages = _notInlinedMessages(_notInlinedMessages); - static _notInlinedMessages(_) => { - "\"Act as\" is essentially logging in as this user without a password. You will be able to take any action as if you were this user, and from other users\' points of views, it will be as if this user performed them. However, audit logs record that you were the one who performed the actions on behalf of this user." : MessageLookupByLibrary.simpleMessage("«Действовать как пользователь» является по существу входом в систему в качестве этого пользователя без пароля. Вы сможете совершать любые действия, как если бы вы были этим пользователем, а для других пользователей это будет выглядеть так, как будто эти действия совершил этот пользователь. Тем не менее, в контрольных журналах записывается информация от том, что именно вы выполняли указанные действия от имени этого пользователя."), - "-" : MessageLookupByLibrary.simpleMessage("-"), - "A description is required." : MessageLookupByLibrary.simpleMessage("Требуется описание."), - "A network error occurred when adding this student. Check your connection and try again." : MessageLookupByLibrary.simpleMessage("При добавлении студента произошла ошибка. Проверьте подключение и попробуйте еще раз."), - "A subject is required." : MessageLookupByLibrary.simpleMessage("Необходима тема."), - "Act As User" : MessageLookupByLibrary.simpleMessage("Действовать как пользователь"), - "Add Student" : MessageLookupByLibrary.simpleMessage("Добавить студента"), - "Add attachment" : MessageLookupByLibrary.simpleMessage("Добавить вложение"), - "Add new student" : MessageLookupByLibrary.simpleMessage("Добавить нового студента"), - "Add student with…" : MessageLookupByLibrary.simpleMessage("Добавить студента с…"), - "Alert Settings" : MessageLookupByLibrary.simpleMessage("Настройки оповещения"), - "Alert me when…" : MessageLookupByLibrary.simpleMessage("Оповестить меня, когда…"), - "All Grading Periods" : MessageLookupByLibrary.simpleMessage("Все академические периоды"), - "Already have an account? " : MessageLookupByLibrary.simpleMessage("Уже есть учетная запись? "), - "An email address is required." : MessageLookupByLibrary.simpleMessage("Необходим адрес электронной почты."), - "An error occurred when trying to display this link" : MessageLookupByLibrary.simpleMessage("Произошла ошибка при попытке открытия данной ссылки"), - "An error occurred while saving your selection. Please try again." : MessageLookupByLibrary.simpleMessage("Произошла ошибка при сохранении вашего выбора. Попробуйте еще раз."), - "An unexpected error occurred" : MessageLookupByLibrary.simpleMessage("Произошла непредвиденная ошибка"), - "Android OS version" : MessageLookupByLibrary.simpleMessage("Версия ОС Android"), - "Appearance" : MessageLookupByLibrary.simpleMessage("Представление"), - "Application version" : MessageLookupByLibrary.simpleMessage("Версия приложения"), - "Are you a student or teacher?" : MessageLookupByLibrary.simpleMessage("Вы студент или преподаватель?"), - "Are you sure you want to log out?" : MessageLookupByLibrary.simpleMessage("Вы уверены, что вы хотите выйти?"), - "Are you sure you wish to close this page? Your unsent message will be lost." : MessageLookupByLibrary.simpleMessage("Вы действительно хотите закрыть эту страницу? Ваше неотправленное сообщение будет потеряно."), - "Assignment Details" : MessageLookupByLibrary.simpleMessage("Сведения о задании"), - "Assignment grade above" : MessageLookupByLibrary.simpleMessage("Оценка за задание выше"), - "Assignment grade below" : MessageLookupByLibrary.simpleMessage("Оценка за задание ниже"), - "Assignment missing" : MessageLookupByLibrary.simpleMessage("Задание отсутствует"), - "Barney, Fuschia" : MessageLookupByLibrary.simpleMessage("Барни, фуксия"), - "Calendars" : MessageLookupByLibrary.simpleMessage("Календари"), - "Camera Permission" : MessageLookupByLibrary.simpleMessage("Разрешение для камеры"), - "Cancel" : MessageLookupByLibrary.simpleMessage("Отменить"), - "Canvas Student" : MessageLookupByLibrary.simpleMessage("Студент Canvas"), - "Canvas Teacher" : MessageLookupByLibrary.simpleMessage("Преподаватель Canvas"), - "Canvas on GitHub" : MessageLookupByLibrary.simpleMessage("Canvas на GitHub"), - "Choose a course to message" : MessageLookupByLibrary.simpleMessage("Выбрать курс для сообщения"), - "Choose from Gallery" : MessageLookupByLibrary.simpleMessage("Выбрать из галереи"), - "Complete" : MessageLookupByLibrary.simpleMessage("Завершить"), - "Contact Support" : MessageLookupByLibrary.simpleMessage("Связаться со службой поддержки"), - "Course Announcement" : MessageLookupByLibrary.simpleMessage("Объявление о курсе"), - "Course Announcements" : MessageLookupByLibrary.simpleMessage("Объявления курса"), - "Course grade above" : MessageLookupByLibrary.simpleMessage("Оценка за курс выше"), - "Course grade below" : MessageLookupByLibrary.simpleMessage("Оценка за курс ниже"), - "Create Account" : MessageLookupByLibrary.simpleMessage("Создать учетную запись"), - "Dark Mode" : MessageLookupByLibrary.simpleMessage("Темный режим"), - "Date" : MessageLookupByLibrary.simpleMessage("Дата"), - "Delete" : MessageLookupByLibrary.simpleMessage("Удалить"), - "Description" : MessageLookupByLibrary.simpleMessage("Описание"), - "Device" : MessageLookupByLibrary.simpleMessage("Устройство"), - "Device model" : MessageLookupByLibrary.simpleMessage("Модель устройства"), - "Domain" : MessageLookupByLibrary.simpleMessage("Домен"), - "Domain:" : MessageLookupByLibrary.simpleMessage("Домен:"), - "Don\'t show again" : MessageLookupByLibrary.simpleMessage("Не показывать снова"), - "Done" : MessageLookupByLibrary.simpleMessage("Готово"), - "Download" : MessageLookupByLibrary.simpleMessage("Скачать"), - "Due" : MessageLookupByLibrary.simpleMessage("Срок"), - "EXTREME CRITICAL EMERGENCY!!" : MessageLookupByLibrary.simpleMessage("ЧРЕЗВЫЧАЙНО КРИТИЧЕСКАЯ СИТУАЦИЯ!!"), - "Electric, blue" : MessageLookupByLibrary.simpleMessage("Электрик, синий"), - "Email Address" : MessageLookupByLibrary.simpleMessage("Адрес электронной почты"), - "Email:" : MessageLookupByLibrary.simpleMessage("Эл. почта:"), - "Email…" : MessageLookupByLibrary.simpleMessage("Электронная почта..."), - "Enter the student pairing code provided to you. If the pairing code doesn\'t work, it may have expired" : MessageLookupByLibrary.simpleMessage("Введите предоставленный вам код сопряжения студентов. Если сопряжение не работает, срок его действия может закончиться"), - "Event" : MessageLookupByLibrary.simpleMessage("Событие"), - "Excused" : MessageLookupByLibrary.simpleMessage("По уважительной причине"), - "Expired QR Code" : MessageLookupByLibrary.simpleMessage("QR-код с истекшим сроком действия"), - "Failed. Tap for options." : MessageLookupByLibrary.simpleMessage("Сбой. Коснитесь для просмотра опций."), - "Filter" : MessageLookupByLibrary.simpleMessage("Фильтровать"), - "Filter by" : MessageLookupByLibrary.simpleMessage("Фильтровать по"), - "Fire, Orange" : MessageLookupByLibrary.simpleMessage("Огонь, оранжевый"), - "Front Page" : MessageLookupByLibrary.simpleMessage("Первая страница"), - "Full Name" : MessageLookupByLibrary.simpleMessage("Полное имя"), - "Full Name…" : MessageLookupByLibrary.simpleMessage("Полное имя..."), - "Full error message" : MessageLookupByLibrary.simpleMessage("Полное сообщение об ошибке"), - "Go to today" : MessageLookupByLibrary.simpleMessage("Перейти к сегодня"), - "Grade" : MessageLookupByLibrary.simpleMessage("Оценка"), - "Grade percentage" : MessageLookupByLibrary.simpleMessage("Процент оценок"), - "Graded" : MessageLookupByLibrary.simpleMessage("С оценкой"), - "Grades" : MessageLookupByLibrary.simpleMessage("Оценки"), - "Help" : MessageLookupByLibrary.simpleMessage("Справка"), - "Hide Password" : MessageLookupByLibrary.simpleMessage("Скрыть пароль"), - "High Contrast Mode" : MessageLookupByLibrary.simpleMessage("Высококонтрастный режим"), - "How are we doing?" : MessageLookupByLibrary.simpleMessage("Как мы работаем?"), - "How is this affecting you?" : MessageLookupByLibrary.simpleMessage("Как это влияет на вас?"), - "I can\'t get things done until I hear back from you." : MessageLookupByLibrary.simpleMessage("Я не могу добиться своей цели, пока не услышу от вас ответа."), - "I don\'t have a Canvas account" : MessageLookupByLibrary.simpleMessage("У меня нет учетной записи Canvas"), - "I have a Canvas account" : MessageLookupByLibrary.simpleMessage("У меня есть учетная запись Canvas"), - "I need some help but it\'s not urgent." : MessageLookupByLibrary.simpleMessage("Мне нужна помощь, но это не срочно."), - "I\'m having trouble logging in" : MessageLookupByLibrary.simpleMessage("У меня проблема со входом в систему"), - "Idea for Canvas Parent App [Android]" : MessageLookupByLibrary.simpleMessage("Идея для приложения Canvas Родители [Android]"), - "In order to provide you with a better experience, we have updated how reminders work. You can add new reminders by viewing an assignment or calendar event and tapping the switch under the \"Remind Me\" section.\n\nBe aware that any reminders created with older versions of this app will not be compatible with the new changes and you will need to create them again." : MessageLookupByLibrary.simpleMessage("Для обеспечения высокого качества обслуживания мы обновили порядок использования напоминаний. Добавить новые напоминания можно, просмотрев задание или событие календаря и нажав переключатель в разделе «Напоминание».\n\nСледует иметь в виду, что напоминания, созданные с помощью старых версий данного приложения, не будут совместимы с новыми изменениями, и их нужно будет создавать заново."), - "Inbox" : MessageLookupByLibrary.simpleMessage("Входящие"), - "Inbox Zero" : MessageLookupByLibrary.simpleMessage("Входящие Ноль"), - "Incomplete" : MessageLookupByLibrary.simpleMessage("Не завершено"), - "Incorrect Domain" : MessageLookupByLibrary.simpleMessage("Неверный домен"), - "Institution Announcement" : MessageLookupByLibrary.simpleMessage("Объявление об учебном заведении"), - "Institution Announcements" : MessageLookupByLibrary.simpleMessage("Объявления заведения"), - "Instructions" : MessageLookupByLibrary.simpleMessage("Инструкции"), - "Interactions on this page are limited by your institution." : MessageLookupByLibrary.simpleMessage("Взаимодействие на этой странице ограничено вашей организацией."), - "Invalid QR Code" : MessageLookupByLibrary.simpleMessage("Неверный QR-код"), - "It looks like a great day to rest, relax, and recharge." : MessageLookupByLibrary.simpleMessage("Похоже, что сегодня можно отдохнуть, расслабиться и набраться сил."), - "It looks like assignments haven\'t been created in this space yet." : MessageLookupByLibrary.simpleMessage("Похоже, что в этом разделе пока что не было создано ни одного задания."), - "Just a casual question, comment, idea, suggestion…" : MessageLookupByLibrary.simpleMessage("Просто обычный вопрос, комментарий, идея, предложение..."), - "Late" : MessageLookupByLibrary.simpleMessage("Поздно"), - "Launch External Tool" : MessageLookupByLibrary.simpleMessage("Запуск внешнего инструмента"), - "Legal" : MessageLookupByLibrary.simpleMessage("Юридические вопросы"), - "Light Mode" : MessageLookupByLibrary.simpleMessage("Светлый режим"), - "Link Error" : MessageLookupByLibrary.simpleMessage("Ошибка ссылки"), - "Locale:" : MessageLookupByLibrary.simpleMessage("Язык:"), - "Locate QR Code" : MessageLookupByLibrary.simpleMessage("Определить местонахождение кода QR"), - "Location" : MessageLookupByLibrary.simpleMessage("Местоположение"), - "Locked" : MessageLookupByLibrary.simpleMessage("Заблокировано"), - "Log Out" : MessageLookupByLibrary.simpleMessage("Выйти"), - "Login flow: Canvas" : MessageLookupByLibrary.simpleMessage("Процесс авторизации: Canvas"), - "Login flow: Normal" : MessageLookupByLibrary.simpleMessage("Процесс авторизации: Обычный"), - "Login flow: Site Admin" : MessageLookupByLibrary.simpleMessage("Процесс авторизации: Администратор сайта"), - "Login flow: Skip mobile verify" : MessageLookupByLibrary.simpleMessage("Процесс авторизации: Пропустить проверку мобильного устройства"), - "Manage Students" : MessageLookupByLibrary.simpleMessage("Управление студентами"), - "Message" : MessageLookupByLibrary.simpleMessage("Сообщение"), - "Message subject" : MessageLookupByLibrary.simpleMessage("Тема сообщения"), - "Missing" : MessageLookupByLibrary.simpleMessage("Отсутствует"), - "Must be below 100" : MessageLookupByLibrary.simpleMessage("Должно быть меньше 100"), - "Network error" : MessageLookupByLibrary.simpleMessage("Ошибка сети"), - "Never" : MessageLookupByLibrary.simpleMessage("Никогда"), - "New message" : MessageLookupByLibrary.simpleMessage("Новое сообщение"), - "No" : MessageLookupByLibrary.simpleMessage("Нет"), - "No Alerts" : MessageLookupByLibrary.simpleMessage("Нет оповещений"), - "No Assignments" : MessageLookupByLibrary.simpleMessage("Задания отсутствуют"), - "No Courses" : MessageLookupByLibrary.simpleMessage("Курсы отсутствуют"), - "No Due Date" : MessageLookupByLibrary.simpleMessage("Срок выполнения не задан"), - "No Events Today!" : MessageLookupByLibrary.simpleMessage("На сегодня события отсутствуют!"), - "No Grade" : MessageLookupByLibrary.simpleMessage("Нет оценки"), - "No Location Specified" : MessageLookupByLibrary.simpleMessage("Местоположение не указано"), - "No Students" : MessageLookupByLibrary.simpleMessage("Студенты отсутствуют"), - "No Subject" : MessageLookupByLibrary.simpleMessage("Нет темы"), - "No Summary" : MessageLookupByLibrary.simpleMessage("Нет сводных данных"), - "No description" : MessageLookupByLibrary.simpleMessage("Описание отсутствует"), - "No recipients selected" : MessageLookupByLibrary.simpleMessage("Получатели не выбраны"), - "Not Graded" : MessageLookupByLibrary.simpleMessage("Оценка не выставлена"), - "Not Submitted" : MessageLookupByLibrary.simpleMessage("Не отправлено"), - "Not a parent?" : MessageLookupByLibrary.simpleMessage("Не являетесь родителем?"), - "Notifications for reminders about assignments and calendar events" : MessageLookupByLibrary.simpleMessage("Уведомления по напоминаниям о заданиях и календарных событиях"), - "OS Version" : MessageLookupByLibrary.simpleMessage("Версия ОС"), - "Observer" : MessageLookupByLibrary.simpleMessage("Наблюдатель"), - "One of our other apps might be a better fit. Tap one to visit the Play Store." : MessageLookupByLibrary.simpleMessage("Одно из наших других приложений может подойти лучше. Прикоснитесь один раз для входа в Play Store."), - "Open Canvas Student" : MessageLookupByLibrary.simpleMessage("Откройте Canvas Student"), - "Open In Browser" : MessageLookupByLibrary.simpleMessage("Открыть в браузере"), - "Open with another app" : MessageLookupByLibrary.simpleMessage("Открыть с помощью другого приложения"), - "Pairing Code" : MessageLookupByLibrary.simpleMessage("Код сопряжения"), - "Password" : MessageLookupByLibrary.simpleMessage("Пароль"), - "Password is required" : MessageLookupByLibrary.simpleMessage("Требуется пароль"), - "Password must contain at least 8 characters" : MessageLookupByLibrary.simpleMessage("Пароль должен содержать не менее 8 символов"), - "Password…" : MessageLookupByLibrary.simpleMessage("Пароль..."), - "Planner Note" : MessageLookupByLibrary.simpleMessage("Примечание планировщика"), - "Please enter a valid email address" : MessageLookupByLibrary.simpleMessage("Введите действительный адрес эл. почты"), - "Please enter an email address" : MessageLookupByLibrary.simpleMessage("Введите адрес эл. почты"), - "Please enter full name" : MessageLookupByLibrary.simpleMessage("Введите полное имя"), - "Please scan a QR code generated by Canvas" : MessageLookupByLibrary.simpleMessage("Отсканируйте QR-код, сгенерированный Canvas"), - "Plum, Purple" : MessageLookupByLibrary.simpleMessage("Слива, фиолетовый"), - "Preparing…" : MessageLookupByLibrary.simpleMessage("Подготовка..."), - "Previous Logins" : MessageLookupByLibrary.simpleMessage("Предыдущие идентификаторы"), - "Privacy Policy" : MessageLookupByLibrary.simpleMessage("Политика конфиденциальности"), - "Privacy Policy Link" : MessageLookupByLibrary.simpleMessage("Ссылка на политику конфиденциальности"), - "Privacy policy, terms of use, open source" : MessageLookupByLibrary.simpleMessage("Политика конфиденциальности, условия использования, открытый источник"), - "QR Code" : MessageLookupByLibrary.simpleMessage("QR-код"), - "QR scanning requires camera access" : MessageLookupByLibrary.simpleMessage("Для сканирования QR-кода необходим доступ к камере"), - "Raspberry, Red" : MessageLookupByLibrary.simpleMessage("Малина, красный"), - "Recipients" : MessageLookupByLibrary.simpleMessage("Получатели"), - "Refresh" : MessageLookupByLibrary.simpleMessage("Обновить"), - "Remind Me" : MessageLookupByLibrary.simpleMessage("Напомнить"), - "Reminders" : MessageLookupByLibrary.simpleMessage("Оповещения"), - "Reminders have changed!" : MessageLookupByLibrary.simpleMessage("Напоминания изменились!"), - "Reply" : MessageLookupByLibrary.simpleMessage("Ответить"), - "Reply All" : MessageLookupByLibrary.simpleMessage("Ответить на все"), - "Report A Problem" : MessageLookupByLibrary.simpleMessage("Сообщить о проблеме"), - "Request Login Help" : MessageLookupByLibrary.simpleMessage("Запрос помощи со входом в систему"), - "Request Login Help Button" : MessageLookupByLibrary.simpleMessage("Кнопка запроса помощи по входу в систему"), - "Restart app" : MessageLookupByLibrary.simpleMessage("Перезапуск приложения"), - "Retry" : MessageLookupByLibrary.simpleMessage("Повторить"), - "Return to Login" : MessageLookupByLibrary.simpleMessage("Вернуться к авторизации"), - "STUDENT" : MessageLookupByLibrary.simpleMessage("СТУДЕНТ"), - "Screenshot showing location of QR code generation in browser" : MessageLookupByLibrary.simpleMessage("Снимок экрана с отображением места генерирования QR-кода в браузере"), - "Screenshot showing location of pairing QR code generation in the Canvas Student app" : MessageLookupByLibrary.simpleMessage("Снимок экрана, на котором показано расположение генерирования QR-кода для подключения в приложение Canvas Student"), - "Select" : MessageLookupByLibrary.simpleMessage("Выбрать"), - "Select Student Color" : MessageLookupByLibrary.simpleMessage("Выбрать цвет студента"), - "Select recipients" : MessageLookupByLibrary.simpleMessage("Выбрать получателей"), - "Send Feedback" : MessageLookupByLibrary.simpleMessage("Отправить оценку"), - "Send a message about this assignment" : MessageLookupByLibrary.simpleMessage("Отправить сообщение об этом задании"), - "Send a message about this course" : MessageLookupByLibrary.simpleMessage("Отправить сообщение об этом курсе"), - "Send message" : MessageLookupByLibrary.simpleMessage("Отправить сообщение"), - "Set a date and time to be notified of this event." : MessageLookupByLibrary.simpleMessage("Задать дату и время уведомления об этом событии."), - "Set a date and time to be notified of this specific assignment." : MessageLookupByLibrary.simpleMessage("Задать дату и время уведомления об этом конкретном задании."), - "Settings" : MessageLookupByLibrary.simpleMessage("Настройки"), - "Shamrock, Green" : MessageLookupByLibrary.simpleMessage("Трилистник, зеленый"), - "Share Your Love for the App" : MessageLookupByLibrary.simpleMessage("Поделитесь своей любовью к приложению"), - "Show Password" : MessageLookupByLibrary.simpleMessage("Показать пароль"), - "Sign In" : MessageLookupByLibrary.simpleMessage("Войти в систему"), - "Something went wrong trying to create your account, please reach out to your school for assistance." : MessageLookupByLibrary.simpleMessage("Что-то пошло не так при попытке создания вашей учетной записи. Обратитесь в свою школу за помощью."), - "Something\'s broken but I can work around it to get what I need done." : MessageLookupByLibrary.simpleMessage("Что-то не работает, но я могу обойтись без этого, чтобы получить то, что мне нужно сделать."), - "Stop Acting as User" : MessageLookupByLibrary.simpleMessage("Перестать действовать как пользователь"), - "Student" : MessageLookupByLibrary.simpleMessage("Студент"), - "Student Pairing" : MessageLookupByLibrary.simpleMessage("Подключение студентов"), - "Students can create a QR code using the Canvas Student app on their mobile device" : MessageLookupByLibrary.simpleMessage("Студенты могут создать QR-код с помощью приложения Canvas Student на своем мобильном устройстве"), - "Students can obtain a pairing code through the Canvas website" : MessageLookupByLibrary.simpleMessage("Студенты могут получить код подключения на веб-сайте Canvas"), - "Subject" : MessageLookupByLibrary.simpleMessage("Тема"), - "Submitted" : MessageLookupByLibrary.simpleMessage("Отправлено"), - "Successfully submitted!" : MessageLookupByLibrary.simpleMessage("Успешно отправлено!"), - "Summary" : MessageLookupByLibrary.simpleMessage("Сводные данные"), - "Switch Users" : MessageLookupByLibrary.simpleMessage("Сменить пользователя"), - "Syllabus" : MessageLookupByLibrary.simpleMessage("Содержание курса"), - "TA" : MessageLookupByLibrary.simpleMessage("TA"), - "TEACHER" : MessageLookupByLibrary.simpleMessage("ПРЕПОДАВАТЕЛЬ"), - "Tap to favorite the courses you want to see on the Calendar. Select up to 10." : MessageLookupByLibrary.simpleMessage("Коснитесь, чтобы отправить в избранное курсы, которые вам хотелось бы видеть в календаре. Выберите до 10."), - "Tap to pair with a new student" : MessageLookupByLibrary.simpleMessage("Коснитесь для связывания с новыми студентами"), - "Tap to select this student" : MessageLookupByLibrary.simpleMessage("Коснитесь для выбора этого студента"), - "Tap to show student selector" : MessageLookupByLibrary.simpleMessage("Коснитесь для отображения селектора студентов"), - "Teacher" : MessageLookupByLibrary.simpleMessage("Преподаватель"), - "Tell us about your favorite parts of the app" : MessageLookupByLibrary.simpleMessage("Расскажите нам о своих любимых моментах приложения"), - "Terms of Service" : MessageLookupByLibrary.simpleMessage("Условия предоставления услуг"), - "Terms of Service Link" : MessageLookupByLibrary.simpleMessage("Ссылка на условия обслуживания"), - "Terms of Use" : MessageLookupByLibrary.simpleMessage("Условия использования"), - "The QR code you scanned may have expired. Refresh the code on the student\'s device and try again." : MessageLookupByLibrary.simpleMessage("У отсканированного вами QR-кода мог истечь срок действия. Обновите код на устройстве студента и попробуйте еще раз."), - "The following information will help us better understand your idea:" : MessageLookupByLibrary.simpleMessage("Следующая информация поможет нам лучше понять вашу идею:"), - "The server you entered is not authorized for this app." : MessageLookupByLibrary.simpleMessage("Введенный сервер не авторизован для этого приложения."), - "The student you are trying to add belongs to a different school. Log in or create an account with that school to scan this code." : MessageLookupByLibrary.simpleMessage("Студент, которого вы пытаетесь добавить, относится к другому факультету. Выполните вход или создайте учетную запись на этом факультете, чтобы отсканировать этот код."), - "The user agent for this app is not authorized." : MessageLookupByLibrary.simpleMessage("Пользовательский агент для этого приложения не авторизован."), - "Theme" : MessageLookupByLibrary.simpleMessage("Тема"), - "There are no installed applications that can open this file" : MessageLookupByLibrary.simpleMessage("Нет установленных приложений, которые могут открыть этот файл"), - "There is no page information available." : MessageLookupByLibrary.simpleMessage("Нет доступной информации о странице."), - "There was a problem loading the Terms of Use" : MessageLookupByLibrary.simpleMessage("Возникала проблема при загрузке условий использования"), - "There was a problem removing this student from your account. Please check your connection and try again." : MessageLookupByLibrary.simpleMessage("Возникла проблема при удалении этого студента из вашей учетной записи. Проверьте подключение и попробуйте еще раз."), - "There was an error loading recipients for this course" : MessageLookupByLibrary.simpleMessage("Произошла ошибка при загрузке получателей для этого курса"), - "There was an error loading the summary details for this course." : MessageLookupByLibrary.simpleMessage("Произошла ошибка при загрузке подробных сводных данных для этого курса."), - "There was an error loading this announcement" : MessageLookupByLibrary.simpleMessage("Произошла ошибка при загрузке этого объявления"), - "There was an error loading this conversation" : MessageLookupByLibrary.simpleMessage("Произошла ошибка при загрузке этого обсуждения"), - "There was an error loading this file" : MessageLookupByLibrary.simpleMessage("Произошла ошибка при загрузке этого файла"), - "There was an error loading your inbox messages." : MessageLookupByLibrary.simpleMessage("Произошла ошибка при загрузке ваших сообщений из папки «Входящие»."), - "There was an error loading your student\'s alerts." : MessageLookupByLibrary.simpleMessage("Произошла ошибка при загрузке оповещений ваших студентов."), - "There was an error loading your student\'s calendar" : MessageLookupByLibrary.simpleMessage("Произошла ошибка при загрузке календаря ваших учащихся."), - "There was an error loading your students." : MessageLookupByLibrary.simpleMessage("Произошла ошибка при загрузке ваших студентов."), - "There was an error loading your student’s courses." : MessageLookupByLibrary.simpleMessage("Произошла ошибка при загрузке курсов ваших студентов."), - "There was an error logging in. Please generate another QR Code and try again." : MessageLookupByLibrary.simpleMessage("Ошибка входа в систему. Сгенерируйте другой QR-код и попробуйте еще раз."), - "There was an error trying to act as this user. Please check the Domain and User ID and try again." : MessageLookupByLibrary.simpleMessage("Произошла ошибка при попытке использования функции «Действовать как пользователь». Проверьте домен и идентификатор пользователя и повторите попытку."), - "There’s nothing to be notified of yet." : MessageLookupByLibrary.simpleMessage("На данный момент оповещать не о чем."), - "This app is not authorized for use." : MessageLookupByLibrary.simpleMessage("Это приложение не авторизовано для использования."), - "This course does not have any assignments or calendar events yet." : MessageLookupByLibrary.simpleMessage("Этот курс пока что не имеет никаких заданий или календарных событий."), - "This file is unsupported and can’t be viewed through the app" : MessageLookupByLibrary.simpleMessage("Этот файл не поддерживается и не может быть просмотрен в приложении"), - "This will unpair and remove all enrollments for this student from your account." : MessageLookupByLibrary.simpleMessage("Это приведет к отключению и удалению всех зачислений для этого студента из вашей учетной записи."), - "Total Grade" : MessageLookupByLibrary.simpleMessage("Общая оценка"), - "Uh oh!" : MessageLookupByLibrary.simpleMessage("Ой-ой!"), - "Unable to fetch courses. Please check your connection and try again." : MessageLookupByLibrary.simpleMessage("Невозможно сделать выборку курсов. Проверьте подключение и попробуйте еще раз."), - "Unable to load this image" : MessageLookupByLibrary.simpleMessage("Невозможно скачать это изображение"), - "Unable to play this media file" : MessageLookupByLibrary.simpleMessage("Невозможно воспроизвести этот медиафайл"), - "Unable to send message. Check your connection and try again." : MessageLookupByLibrary.simpleMessage("Невозможно отправить сообщение. Проверьте подключение и попробуйте еще раз."), - "Under Construction" : MessageLookupByLibrary.simpleMessage("В разработке"), - "Unknown User" : MessageLookupByLibrary.simpleMessage("Неизвестный пользователь"), - "Unsaved changes" : MessageLookupByLibrary.simpleMessage("Несохраненные изменения"), - "Unsupported File" : MessageLookupByLibrary.simpleMessage("Неподдерживаемый файл"), - "Upload File" : MessageLookupByLibrary.simpleMessage("Загрузить файл"), - "Use Camera" : MessageLookupByLibrary.simpleMessage("Использование камеры"), - "Use Dark Theme in Web Content" : MessageLookupByLibrary.simpleMessage("Использовать темную тему в веб-контенте"), - "User ID" : MessageLookupByLibrary.simpleMessage("Идентификатор пользователя"), - "User ID:" : MessageLookupByLibrary.simpleMessage("ID пользователя:"), - "Version Number" : MessageLookupByLibrary.simpleMessage("Номер версии"), - "View Description" : MessageLookupByLibrary.simpleMessage("Просмотреть описание"), - "View error details" : MessageLookupByLibrary.simpleMessage("Просмотр подробностей ошибки"), - "View the Privacy Policy" : MessageLookupByLibrary.simpleMessage("Посмотреть политику конфиденциальности"), - "We are currently building this feature for your viewing pleasure." : MessageLookupByLibrary.simpleMessage("В настоящее время мы разрабатываем эту функцию для более комфортного просмотра."), - "We are unable to display this link, it may belong to an institution you currently aren\'t logged in to." : MessageLookupByLibrary.simpleMessage("Мы не можем открыть данную ссылку, она может принадлежать учреждению, в систему которого вы в настоящее время не вошли."), - "We couldn\'t find any students associated with this account" : MessageLookupByLibrary.simpleMessage("Мы не смогли найти студентов, ассоциированных с этой учетной записью"), - "We were unable to verify the server for use with this app." : MessageLookupByLibrary.simpleMessage("Мы не смогли проверить сервер для использования с этим приложением."), - "We’re not sure what happened, but it wasn’t good. Contact us if this keeps happening." : MessageLookupByLibrary.simpleMessage("Мы не знаем точно, что произошло, но это нехорошо. Обратитесь к нам, если это происходит дальше."), - "What can we do better?" : MessageLookupByLibrary.simpleMessage("Что мы можем сделать лучше?"), - "Yes" : MessageLookupByLibrary.simpleMessage("Да"), - "You are not observing any students." : MessageLookupByLibrary.simpleMessage("Вы не наблюдаете ни за одни студентом."), - "You may only choose 10 calendars to display" : MessageLookupByLibrary.simpleMessage("Вы можете выбрать только 10 календарей для отображения"), - "You must enter a user id" : MessageLookupByLibrary.simpleMessage("Необходимо ввести идентификатор пользователя"), - "You must enter a valid domain" : MessageLookupByLibrary.simpleMessage("Необходимо указать действительный домен"), - "You must select at least one calendar to display" : MessageLookupByLibrary.simpleMessage("Вы должны выбрать как минимум один календарь для отображения"), - "You will be notified about this assignment on…" : MessageLookupByLibrary.simpleMessage("Вы будете уведомлены об этом задании…"), - "You will be notified about this event on…" : MessageLookupByLibrary.simpleMessage("Вы будете уведомлены об этом событии…"), - "You\'ll find the QR code on the web in your account profile. Click \'QR for Mobile Login\' in the list." : MessageLookupByLibrary.simpleMessage("В профиле своей учетной записи вы найдете QR-код. Нажмите «QR для входа с мобильного устройства» в списке."), - "You\'ll need to open your student\'s Canvas Student app to continue. Go into Main Menu > Settings > Pair with Observer and scan the QR code you see there." : MessageLookupByLibrary.simpleMessage("Вам понадобится открыть приложение Canvas Student, чтобы продолжить. Перейдите в Главное меню > Настройки > Подключить к Observer и отсканируйте QR-код, который вы видите здесь."), - "Your code is incorrect or expired." : MessageLookupByLibrary.simpleMessage("Ваш код неверен, или истек срок его действия."), - "Your student’s courses might not be published yet." : MessageLookupByLibrary.simpleMessage("Курсы вашего студента пока еще не могут быть опубликованы."), - "You’re all caught up!" : MessageLookupByLibrary.simpleMessage("Вы все нагнали!"), - "actingAsUser" : m0, - "alertsLabel" : MessageLookupByLibrary.simpleMessage("Предупреждения"), - "appVersion" : m1, - "assignmentGradeAboveThreshold" : m2, - "assignmentGradeBelowThreshold" : m3, - "assignmentLockedModule" : m4, - "assignmentSubjectMessage" : m5, - "assignmentTotalPoints" : m6, - "assignmentTotalPointsAccessible" : m7, - "authorToNOthers" : m8, - "authorToRecipient" : m9, - "authorToRecipientAndNOthers" : m10, - "badgeNumberPlus" : m11, - "calendarLabel" : MessageLookupByLibrary.simpleMessage("Календарь"), - "canvasGuides" : MessageLookupByLibrary.simpleMessage("Руководства Canvas"), - "canvasLogoLabel" : MessageLookupByLibrary.simpleMessage("Логотип Canvas"), - "canvasSupport" : MessageLookupByLibrary.simpleMessage("Поддержка Canvas"), - "changeStudentColorLabel" : m12, - "collapse" : MessageLookupByLibrary.simpleMessage("свернуть"), - "collapsed" : MessageLookupByLibrary.simpleMessage("в свернутом виде"), - "contentDescriptionScoreOutOfPointsPossible" : m13, - "courseForWhom" : m14, - "courseGradeAboveThreshold" : m15, - "courseGradeBelowThreshold" : m16, - "coursesLabel" : MessageLookupByLibrary.simpleMessage("Курсы"), - "dateAtTime" : m17, - "dismissAlertLabel" : m18, - "domainSearchHelpBody" : m19, - "domainSearchHelpLabel" : MessageLookupByLibrary.simpleMessage("Как найти мою школу или округ?"), - "domainSearchInputHint" : MessageLookupByLibrary.simpleMessage("Введите название школы или округа…"), - "dueDateAtTime" : m20, - "endMasqueradeLogoutMessage" : m21, - "endMasqueradeMessage" : m22, - "eventSubjectMessage" : m23, - "eventTime" : m24, - "expand" : MessageLookupByLibrary.simpleMessage("развернуть"), - "expanded" : MessageLookupByLibrary.simpleMessage("в развернутом виде"), - "finalGrade" : m25, - "findSchool" : MessageLookupByLibrary.simpleMessage("Найти школу"), - "frontPageSubjectMessage" : m26, - "gradeFormatScoreOutOfPointsPossible" : m27, - "gradesSubjectMessage" : m28, - "latePenalty" : m29, - "me" : MessageLookupByLibrary.simpleMessage("меня"), - "messageLinkPostscript" : m30, - "minus" : MessageLookupByLibrary.simpleMessage("минус"), - "mustBeAboveN" : m31, - "mustBeBelowN" : m32, - "next" : MessageLookupByLibrary.simpleMessage("Далее"), - "nextMonth" : m33, - "nextWeek" : m34, - "noDomainResults" : m35, - "ok" : MessageLookupByLibrary.simpleMessage("OK"), - "outOfPoints" : m36, - "plusRecipientCount" : m37, - "pointsPossible" : m38, - "previousMonth" : m39, - "previousWeek" : m40, - "qrCreateAccountTos" : m41, - "ratingDialogEmailSubject" : m42, - "selectedMonthLabel" : m43, - "send" : MessageLookupByLibrary.simpleMessage("отправить"), - "starRating" : m44, - "submissionStatusSuccessSubtitle" : m45, - "syllabusSubjectMessage" : m46, - "unread" : MessageLookupByLibrary.simpleMessage("не прочитано"), - "unreadCount" : m47 - }; -} diff --git a/apps/flutter_parent/lib/l10n/generated/messages_sl.dart b/apps/flutter_parent/lib/l10n/generated/messages_sl.dart deleted file mode 100644 index 975050ac24..0000000000 --- a/apps/flutter_parent/lib/l10n/generated/messages_sl.dart +++ /dev/null @@ -1,473 +0,0 @@ -// DO NOT EDIT. This is code generated via package:intl/generate_localized.dart -// This is a library that provides messages for a sl locale. All the -// messages from the main program should be duplicated here with the same -// function name. - -// Ignore issues from commonly used lints in this file. -// ignore_for_file:unnecessary_brace_in_string_interps, unnecessary_new -// ignore_for_file:prefer_single_quotes,comment_references, directives_ordering -// ignore_for_file:annotate_overrides,prefer_generic_function_type_aliases -// ignore_for_file:unused_import, file_names - -import 'package:intl/intl.dart'; -import 'package:intl/message_lookup_by_library.dart'; - -final messages = new MessageLookup(); - -typedef String MessageIfAbsent(String messageStr, List args); - -class MessageLookup extends MessageLookupByLibrary { - String get localeName => 'sl'; - - static m0(userName) => "Nastopate v vlogi ${userName}"; - - static m1(version) => "r. ${version}"; - - static m2(threshold) => "Ocena pri nalogi višja od ${threshold}"; - - static m3(threshold) => "Ocena pri nalogi nižja od ${threshold}"; - - static m4(moduleName) => "To nalogo je zaklenil modul »${moduleName}«."; - - static m5(studentName, assignmentName) => "Zadeva: ${studentName}, Naloga – ${assignmentName}"; - - static m6(points) => "${points} točk"; - - static m7(points) => "${points} točk"; - - static m8(authorName, howMany) => "${Intl.plural(howMany, one: '${authorName} do 1 drugi', other: '${authorName} do ${howMany} drugih')}"; - - static m9(authorName, recipientName) => "${authorName} do ${recipientName}"; - - static m10(authorName, recipientName, howMany) => "${Intl.plural(howMany, one: '${authorName} do ${recipientName} in 1 drugi', other: '${authorName} do ${recipientName} in ${howMany} drugih')}"; - - static m11(count) => "${count}+"; - - static m12(studentName) => "Spremeni barvo za ${studentName}"; - - static m13(score, pointsPossible) => "${score} od ${pointsPossible} točk"; - - static m14(studentShortName) => "za ${studentShortName}"; - - static m15(threshold) => "Ocena pri predmetu višja od ${threshold}"; - - static m16(threshold) => "Ocena pri predmetu nižja od ${threshold}"; - - static m17(date, time) => "${date} ob ${time}"; - - static m18(alertTitle) => "Opusti ${alertTitle}"; - - static m19(canvasGuides, canvasSupport) => "Poskusite poiskati ime šole ali okrožja, do katerega poskušate dostopati, na primer »Smith Private School« ali »Smith County Schools«. V domeno sistema Canvas lahko vstopite neposredno, na primer »smith.instructure.com«.\n\nZa več informacij o iskanju računa Canvas vaše ustanove, obiščite spletno mesto ${canvasGuides} in se za pomoč obrnite na ${canvasSupport} ali na šolo."; - - static m20(date, time) => "Roki ${date} ob ${time}"; - - static m21(userName) => "Prenehali boste nastopati v vlogi ${userName} in boste odjavljeni."; - - static m22(userName) => "Prenehali boste nastopati v vlogi ${userName} in se vrnili v svoj prvotni račun."; - - static m23(studentName, eventTitle) => "Zadeva: ${studentName}, Dogodek – ${eventTitle}"; - - static m24(startAt, endAt) => "${startAt} – ${endAt}"; - - static m25(grade) => "Končna ocena: ${grade}"; - - static m26(studentName) => "Zadeva: ${studentName}, Prva stran"; - - static m27(score, pointsPossible) => "${score}/${pointsPossible}"; - - static m28(studentName) => "Zadeva: ${studentName}, Ocene"; - - static m29(pointsLost) => "Kazen za zamudo (-${pointsLost})"; - - static m30(studentName, linkUrl) => "Zadeva: ${studentName}, ${linkUrl}"; - - static m31(percentage) => "Mora biti višje od ${percentage}"; - - static m32(percentage) => "Mora biti nižje od ${percentage}"; - - static m33(month) => "Naslednji mesec: ${month}"; - - static m34(date) => "Naslednji teden z začetkom ${date}"; - - static m35(query) => "Ni mogoče najti šol, ki se ujemajo s/z »${query}«"; - - static m36(points, howMany) => "${Intl.plural(howMany, one: 'Od 1 točke', other: 'Od ${points} točk')}"; - - static m37(count) => "+${count}"; - - static m38(points) => "${points} možnih točk"; - - static m39(month) => "Predhodni mesec: ${month}"; - - static m40(date) => "Predhodni teden z začetkom ${date}"; - - static m41(termsOfService, privacyPolicy) => "Če tapnete »Ustvari račun«, pristajate na ${termsOfService} in potrdite ${privacyPolicy}."; - - static m42(version) => "Predlogi za sistem Android – Canvas Parent ${version}"; - - static m43(month) => "Mesec ${month}"; - - static m44(position) => "${Intl.plural(position, one: '${position} zvezda', other: '${position} zvezde')}"; - - static m45(date, time) => "Ta naloga je bila poslana dne ${date} ob ${time} in čaka na ocenjevanje"; - - static m46(studentName) => "Zadeva: ${studentName}, Učni načrt predmeta"; - - static m47(count) => "${count} neprebranih"; - - final messages = _notInlinedMessages(_notInlinedMessages); - static _notInlinedMessages(_) => { - "\"Act as\" is essentially logging in as this user without a password. You will be able to take any action as if you were this user, and from other users\' points of views, it will be as if this user performed them. However, audit logs record that you were the one who performed the actions on behalf of this user." : MessageLookupByLibrary.simpleMessage("»Nastopajoči v vlogi« se v osnovi prijavlja kot ta uporabnik brez gesla. Lahko boste izvedli katero koli dejanje, kot bi bili ta uporabnik, z vidika drugih uporabnikov pa bo videti, kot da je dejanja izvedel ta uporabnik. Vendar dnevniki dogodkov beležijo, da ste v imenu tega uporabnika dejanja izvedli vi."), - "-" : MessageLookupByLibrary.simpleMessage("-"), - "A description is required." : MessageLookupByLibrary.simpleMessage("Opis je obvezen."), - "A network error occurred when adding this student. Check your connection and try again." : MessageLookupByLibrary.simpleMessage("Pri dodajanju tega študenta je prišlo do napake v omrežju. Preverite svojo povezavo in poskusite znova."), - "A subject is required." : MessageLookupByLibrary.simpleMessage("Polje za zadevo mora biti izpolnjeno."), - "Act As User" : MessageLookupByLibrary.simpleMessage("Prevzemi vlogo uporabnika"), - "Add Student" : MessageLookupByLibrary.simpleMessage("Dodaj študenta"), - "Add attachment" : MessageLookupByLibrary.simpleMessage("Dodaj prilogo"), - "Add new student" : MessageLookupByLibrary.simpleMessage("Dodaj novega študenta"), - "Add student with…" : MessageLookupByLibrary.simpleMessage("Dodaj študenta s/z ..."), - "Alert Settings" : MessageLookupByLibrary.simpleMessage("Nastavitve opozoril"), - "Alert me when…" : MessageLookupByLibrary.simpleMessage("Opozori me, ko ..."), - "All Grading Periods" : MessageLookupByLibrary.simpleMessage("Vsa ocenjevalna obdobja"), - "Already have an account? " : MessageLookupByLibrary.simpleMessage("Ali že imate račun? "), - "An email address is required." : MessageLookupByLibrary.simpleMessage("Potreben je e-poštni naslov."), - "An error occurred when trying to display this link" : MessageLookupByLibrary.simpleMessage("Med prikazovanjem te povezave je prišlo do napake"), - "An error occurred while saving your selection. Please try again." : MessageLookupByLibrary.simpleMessage("Med shranjevanjem vaše izbire je prišlo do napake. Poskusite znova."), - "An unexpected error occurred" : MessageLookupByLibrary.simpleMessage("Prišlo je do nepričakovane napake"), - "Android OS version" : MessageLookupByLibrary.simpleMessage("Različica sistema Android"), - "Appearance" : MessageLookupByLibrary.simpleMessage("Videz"), - "Application version" : MessageLookupByLibrary.simpleMessage("Različica aplikacije"), - "Are you a student or teacher?" : MessageLookupByLibrary.simpleMessage("Ste študent ali izvajalec?"), - "Are you sure you want to log out?" : MessageLookupByLibrary.simpleMessage("Ali ste prepričani, da se želite odjaviti?"), - "Are you sure you wish to close this page? Your unsent message will be lost." : MessageLookupByLibrary.simpleMessage("Ali ste prepričani, da želite zapreti to stran? Neposlana sporočila bodo izgubljena."), - "Assignment Details" : MessageLookupByLibrary.simpleMessage("Podrobnosti o nalogi"), - "Assignment grade above" : MessageLookupByLibrary.simpleMessage("Ocena pri nalogi višja od"), - "Assignment grade below" : MessageLookupByLibrary.simpleMessage("Ocena pri nalogi nižja od"), - "Assignment missing" : MessageLookupByLibrary.simpleMessage("Manjkajoča naloga"), - "Barney, Fuschia" : MessageLookupByLibrary.simpleMessage("Barney, rožnato-vijolična"), - "Calendars" : MessageLookupByLibrary.simpleMessage("Koledarji"), - "Camera Permission" : MessageLookupByLibrary.simpleMessage("Dovoljenje za uporabo kamere"), - "Cancel" : MessageLookupByLibrary.simpleMessage("Prekliči"), - "Canvas Student" : MessageLookupByLibrary.simpleMessage("Študent v sistemu Canvas"), - "Canvas Teacher" : MessageLookupByLibrary.simpleMessage("Izvajalec v sistemu Canvas"), - "Canvas on GitHub" : MessageLookupByLibrary.simpleMessage("Canvas na GitHub"), - "Choose a course to message" : MessageLookupByLibrary.simpleMessage("Izberite predmet za pošiljanje sporočila"), - "Choose from Gallery" : MessageLookupByLibrary.simpleMessage("Izberi iz galerije"), - "Complete" : MessageLookupByLibrary.simpleMessage("Zaključeno"), - "Contact Support" : MessageLookupByLibrary.simpleMessage("Stik s podporo"), - "Course Announcement" : MessageLookupByLibrary.simpleMessage("Obvestilo o predmetu"), - "Course Announcements" : MessageLookupByLibrary.simpleMessage("Obvestila o predmetu"), - "Course grade above" : MessageLookupByLibrary.simpleMessage("Ocena pri predmetu višja od"), - "Course grade below" : MessageLookupByLibrary.simpleMessage("Ocena pri predmetu nižja od"), - "Create Account" : MessageLookupByLibrary.simpleMessage("Ustvari račun"), - "Dark Mode" : MessageLookupByLibrary.simpleMessage("Temni način"), - "Date" : MessageLookupByLibrary.simpleMessage("Datum"), - "Delete" : MessageLookupByLibrary.simpleMessage("Odstrani"), - "Description" : MessageLookupByLibrary.simpleMessage("Opis"), - "Device" : MessageLookupByLibrary.simpleMessage("Naprava"), - "Device model" : MessageLookupByLibrary.simpleMessage("Model naprave"), - "Domain" : MessageLookupByLibrary.simpleMessage("Domena"), - "Domain:" : MessageLookupByLibrary.simpleMessage("Domena:"), - "Don\'t show again" : MessageLookupByLibrary.simpleMessage("Ne prikaži znova"), - "Done" : MessageLookupByLibrary.simpleMessage("Dokončano"), - "Download" : MessageLookupByLibrary.simpleMessage("Prenesi"), - "Due" : MessageLookupByLibrary.simpleMessage("Roki"), - "EXTREME CRITICAL EMERGENCY!!" : MessageLookupByLibrary.simpleMessage("SKRAJNO KRITIČNI NUJNI PRIMER"), - "Electric, blue" : MessageLookupByLibrary.simpleMessage("Elektrika, modra"), - "Email Address" : MessageLookupByLibrary.simpleMessage("E-poštni naslov"), - "Email:" : MessageLookupByLibrary.simpleMessage("E-pošta:"), - "Email…" : MessageLookupByLibrary.simpleMessage("E-pošta ..."), - "Enter the student pairing code provided to you. If the pairing code doesn\'t work, it may have expired" : MessageLookupByLibrary.simpleMessage("Vnesite kodo za povezovanje s študentom, ki ste jo prejeli. Če koda za povezovanje ne deluje, je morda potekla"), - "Event" : MessageLookupByLibrary.simpleMessage("Dogodek"), - "Excused" : MessageLookupByLibrary.simpleMessage("Opravičeno"), - "Expired QR Code" : MessageLookupByLibrary.simpleMessage("Koda QR je potekla"), - "Failed. Tap for options." : MessageLookupByLibrary.simpleMessage("Ni uspelo. Tapnite za možnosti."), - "Filter" : MessageLookupByLibrary.simpleMessage("Filter"), - "Filter by" : MessageLookupByLibrary.simpleMessage("Filtriraj glede na"), - "Fire, Orange" : MessageLookupByLibrary.simpleMessage("Ogenj, oranžna"), - "Front Page" : MessageLookupByLibrary.simpleMessage("Prva stran"), - "Full Name" : MessageLookupByLibrary.simpleMessage("Polno ime"), - "Full Name…" : MessageLookupByLibrary.simpleMessage("Polno ime ..."), - "Full error message" : MessageLookupByLibrary.simpleMessage("Polni prikaz sporočila o napaki"), - "Go to today" : MessageLookupByLibrary.simpleMessage("Pojdi na danes"), - "Grade" : MessageLookupByLibrary.simpleMessage("Ocena"), - "Grade percentage" : MessageLookupByLibrary.simpleMessage("Odstotek ocene"), - "Graded" : MessageLookupByLibrary.simpleMessage("Ocenjeno"), - "Grades" : MessageLookupByLibrary.simpleMessage("Ocene"), - "Help" : MessageLookupByLibrary.simpleMessage("Pomoč"), - "Hide Password" : MessageLookupByLibrary.simpleMessage("Skrij geslo"), - "High Contrast Mode" : MessageLookupByLibrary.simpleMessage("Visokokontrastni način"), - "How are we doing?" : MessageLookupByLibrary.simpleMessage("Kako nam gre?"), - "How is this affecting you?" : MessageLookupByLibrary.simpleMessage("Kako to vpliva na vas?"), - "I can\'t get things done until I hear back from you." : MessageLookupByLibrary.simpleMessage("Ne morem dokončati zadev, dokler ne prejmem vašega odziva."), - "I don\'t have a Canvas account" : MessageLookupByLibrary.simpleMessage("Nimam računa Canvas"), - "I have a Canvas account" : MessageLookupByLibrary.simpleMessage("Imam račun Canvas"), - "I need some help but it\'s not urgent." : MessageLookupByLibrary.simpleMessage("Potrebujem pomoč, ni pa nujno."), - "I\'m having trouble logging in" : MessageLookupByLibrary.simpleMessage("Imam težave pri prijavi"), - "Idea for Canvas Parent App [Android]" : MessageLookupByLibrary.simpleMessage("Zamisel za aplikacijo Canvas Parent [Android]"), - "In order to provide you with a better experience, we have updated how reminders work. You can add new reminders by viewing an assignment or calendar event and tapping the switch under the \"Remind Me\" section.\n\nBe aware that any reminders created with older versions of this app will not be compatible with the new changes and you will need to create them again." : MessageLookupByLibrary.simpleMessage("Da vam zagotovimo boljšo izkušnjo, smo posodobili delovanje opomnikov. Nove opomnike lahko dodate, tako da si ogledate nalogo ali dogodek v koledarju in tapnete stikalo v razdelku »Opomni me«.\n\nUpoštevajte, da noben opomnik, ustvarjen v starejši različici te aplikacije, ne bo združljiv z novimi spremembami in boste te morali ustvariti znova."), - "Inbox" : MessageLookupByLibrary.simpleMessage("Pošta"), - "Inbox Zero" : MessageLookupByLibrary.simpleMessage("Nabiralnik je prazen"), - "Incomplete" : MessageLookupByLibrary.simpleMessage("Nezaključeno"), - "Incorrect Domain" : MessageLookupByLibrary.simpleMessage("Nepravilna domena"), - "Institution Announcement" : MessageLookupByLibrary.simpleMessage("Obvestilo ustanove"), - "Institution Announcements" : MessageLookupByLibrary.simpleMessage("Obvestila ustanove"), - "Instructions" : MessageLookupByLibrary.simpleMessage("Navodila"), - "Interactions on this page are limited by your institution." : MessageLookupByLibrary.simpleMessage("Interakcije na tej strani omejuje vaša ustanova."), - "Invalid QR Code" : MessageLookupByLibrary.simpleMessage("Neveljavna koda QR"), - "It looks like a great day to rest, relax, and recharge." : MessageLookupByLibrary.simpleMessage("Videti je, da je to krasen dan za počitek, sprostitev in regeneracijo."), - "It looks like assignments haven\'t been created in this space yet." : MessageLookupByLibrary.simpleMessage("Videti je, da v tem prostoru naloge še niso bile ustvarjene."), - "Just a casual question, comment, idea, suggestion…" : MessageLookupByLibrary.simpleMessage("Samo neobvezno vprašanje, komentar, zamisel, predlog ..."), - "Late" : MessageLookupByLibrary.simpleMessage("Zamuda"), - "Launch External Tool" : MessageLookupByLibrary.simpleMessage("Zaženi zunanje orodje"), - "Legal" : MessageLookupByLibrary.simpleMessage("Pravne informacije"), - "Light Mode" : MessageLookupByLibrary.simpleMessage("Svetli način"), - "Link Error" : MessageLookupByLibrary.simpleMessage("Napaka povezave"), - "Locale:" : MessageLookupByLibrary.simpleMessage("Območna nastavitev:"), - "Locate QR Code" : MessageLookupByLibrary.simpleMessage("Poiščite kodo QR"), - "Location" : MessageLookupByLibrary.simpleMessage("Mesto"), - "Locked" : MessageLookupByLibrary.simpleMessage("Zaklenjeno"), - "Log Out" : MessageLookupByLibrary.simpleMessage("Odjava"), - "Login flow: Canvas" : MessageLookupByLibrary.simpleMessage("Potek prijave: Sistem Canvas"), - "Login flow: Normal" : MessageLookupByLibrary.simpleMessage("Potek prijave: Aktivno"), - "Login flow: Site Admin" : MessageLookupByLibrary.simpleMessage("Potek prijave: Skrbnik mesta"), - "Login flow: Skip mobile verify" : MessageLookupByLibrary.simpleMessage("Potek prijave: Preskoči mobilno potrditev"), - "Manage Students" : MessageLookupByLibrary.simpleMessage("Uredi študente"), - "Message" : MessageLookupByLibrary.simpleMessage("Sporočilo"), - "Message subject" : MessageLookupByLibrary.simpleMessage("Zadeva sporočila"), - "Missing" : MessageLookupByLibrary.simpleMessage("Manjkajoče"), - "Must be below 100" : MessageLookupByLibrary.simpleMessage("Mora biti nižje od 100"), - "Network error" : MessageLookupByLibrary.simpleMessage("Napaka v omrežju"), - "Never" : MessageLookupByLibrary.simpleMessage("Nikoli"), - "New message" : MessageLookupByLibrary.simpleMessage("Novo sporočilo"), - "No" : MessageLookupByLibrary.simpleMessage("Ne"), - "No Alerts" : MessageLookupByLibrary.simpleMessage("Ni opozoril"), - "No Assignments" : MessageLookupByLibrary.simpleMessage("Ni nalog"), - "No Courses" : MessageLookupByLibrary.simpleMessage("Ni predmetov"), - "No Due Date" : MessageLookupByLibrary.simpleMessage("Ni roka."), - "No Events Today!" : MessageLookupByLibrary.simpleMessage("Danes ni dogodkov."), - "No Grade" : MessageLookupByLibrary.simpleMessage("Ni ocen"), - "No Location Specified" : MessageLookupByLibrary.simpleMessage("Mesto ni določeno"), - "No Students" : MessageLookupByLibrary.simpleMessage("Ni študentov"), - "No Subject" : MessageLookupByLibrary.simpleMessage("Ni zadeve"), - "No Summary" : MessageLookupByLibrary.simpleMessage("Ni povzetka"), - "No description" : MessageLookupByLibrary.simpleMessage("Brez opisa"), - "No recipients selected" : MessageLookupByLibrary.simpleMessage("Izbran ni noben prejemnik"), - "Not Graded" : MessageLookupByLibrary.simpleMessage("Ni ocenjeno"), - "Not Submitted" : MessageLookupByLibrary.simpleMessage("Ni oddano."), - "Not a parent?" : MessageLookupByLibrary.simpleMessage("Niste eden od staršev?"), - "Notifications for reminders about assignments and calendar events" : MessageLookupByLibrary.simpleMessage("Sporočila za opomnike o nalogah in koledarskih dogodkih"), - "OS Version" : MessageLookupByLibrary.simpleMessage("Različica OS"), - "Observer" : MessageLookupByLibrary.simpleMessage("Skriti bralec"), - "One of our other apps might be a better fit. Tap one to visit the Play Store." : MessageLookupByLibrary.simpleMessage("Morda bi bolj ustrezala kakšna druga aplikacija. Tapnite eno od njih, da obiščete trgovino Play Store."), - "Open Canvas Student" : MessageLookupByLibrary.simpleMessage("Odpiranje Canvas Student"), - "Open In Browser" : MessageLookupByLibrary.simpleMessage("Odpri v brskalniku"), - "Open with another app" : MessageLookupByLibrary.simpleMessage("Odpri z drugo aplikacijo"), - "Pairing Code" : MessageLookupByLibrary.simpleMessage("Koda za seznanjanje naprave"), - "Password" : MessageLookupByLibrary.simpleMessage("Geslo"), - "Password is required" : MessageLookupByLibrary.simpleMessage("Geslo je obvezno"), - "Password must contain at least 8 characters" : MessageLookupByLibrary.simpleMessage("Geslo mora vsebovati vsaj 8 znakov."), - "Password…" : MessageLookupByLibrary.simpleMessage("Geslo ..."), - "Planner Note" : MessageLookupByLibrary.simpleMessage("Opomba orodja Planner"), - "Please enter a valid email address" : MessageLookupByLibrary.simpleMessage("Vnesite veljavni e-poštni naslov."), - "Please enter an email address" : MessageLookupByLibrary.simpleMessage("Vnesite e-poštni naslov"), - "Please enter full name" : MessageLookupByLibrary.simpleMessage("Vnesite polno ime"), - "Please scan a QR code generated by Canvas" : MessageLookupByLibrary.simpleMessage("Preberite kodo QR, ustvarjeno v sistemu Canvas"), - "Plum, Purple" : MessageLookupByLibrary.simpleMessage("Sliva, vijolična"), - "Preparing…" : MessageLookupByLibrary.simpleMessage("Pripravljam ..."), - "Previous Logins" : MessageLookupByLibrary.simpleMessage("Predhodne prijave"), - "Privacy Policy" : MessageLookupByLibrary.simpleMessage("Pravilnik o zasebnosti"), - "Privacy Policy Link" : MessageLookupByLibrary.simpleMessage("Povezava na Pravilnik o zasebnosti"), - "Privacy policy, terms of use, open source" : MessageLookupByLibrary.simpleMessage("Politika zasebnosti, pogoji uporabe, odprti vir"), - "QR Code" : MessageLookupByLibrary.simpleMessage("Koda QR"), - "QR scanning requires camera access" : MessageLookupByLibrary.simpleMessage("Za branje kode QR je potreben dostop do kamere"), - "Raspberry, Red" : MessageLookupByLibrary.simpleMessage("Malina, rdeča"), - "Recipients" : MessageLookupByLibrary.simpleMessage("Prejemniki"), - "Refresh" : MessageLookupByLibrary.simpleMessage("Osveži"), - "Remind Me" : MessageLookupByLibrary.simpleMessage("Opomni me"), - "Reminders" : MessageLookupByLibrary.simpleMessage("Opomniki"), - "Reminders have changed!" : MessageLookupByLibrary.simpleMessage("Opomniki so se spremenili!"), - "Reply" : MessageLookupByLibrary.simpleMessage("Odgovori"), - "Reply All" : MessageLookupByLibrary.simpleMessage("Odgovori vsem"), - "Report A Problem" : MessageLookupByLibrary.simpleMessage("Poročajte o težavi"), - "Request Login Help" : MessageLookupByLibrary.simpleMessage("Zahtevaj pomoč pri prijavi"), - "Request Login Help Button" : MessageLookupByLibrary.simpleMessage("Zahtevaj gumb za pomoč pri prijavi"), - "Restart app" : MessageLookupByLibrary.simpleMessage("Ponovno zaženite aplikacijo"), - "Retry" : MessageLookupByLibrary.simpleMessage("Ponovno poskusi"), - "Return to Login" : MessageLookupByLibrary.simpleMessage("Nazaj na prijavo"), - "STUDENT" : MessageLookupByLibrary.simpleMessage("ŠTUDENT"), - "Screenshot showing location of QR code generation in browser" : MessageLookupByLibrary.simpleMessage("Posnetek zaslona, ki prikazuje, kje v brskalniku ustvarite kodo QR"), - "Screenshot showing location of pairing QR code generation in the Canvas Student app" : MessageLookupByLibrary.simpleMessage("Posnetek zaslona, ki prikazuje lokacijo za ustvarjanje kode QR za seznanjanje v aplikaciji Canvas Student"), - "Select" : MessageLookupByLibrary.simpleMessage("Izberi"), - "Select Student Color" : MessageLookupByLibrary.simpleMessage("Izberite barvo študenta"), - "Select recipients" : MessageLookupByLibrary.simpleMessage("Izberi prejemnike"), - "Send Feedback" : MessageLookupByLibrary.simpleMessage("Pošlji povratne informacije"), - "Send a message about this assignment" : MessageLookupByLibrary.simpleMessage("Pošlji sporočilo o tej nalogi"), - "Send a message about this course" : MessageLookupByLibrary.simpleMessage("Pošlji sporočilo o tem predmetu"), - "Send message" : MessageLookupByLibrary.simpleMessage("Pošlji sporočilo"), - "Set a date and time to be notified of this event." : MessageLookupByLibrary.simpleMessage("Nastavite datum in čas obvestila o tem dogodku."), - "Set a date and time to be notified of this specific assignment." : MessageLookupByLibrary.simpleMessage("Nastavite datum in čas obvestila o tej določeni nalogi."), - "Settings" : MessageLookupByLibrary.simpleMessage("Nastavitve"), - "Shamrock, Green" : MessageLookupByLibrary.simpleMessage("Detelja, zelena"), - "Share Your Love for the App" : MessageLookupByLibrary.simpleMessage("Delite svoje navdušenje nad aplikacijo"), - "Show Password" : MessageLookupByLibrary.simpleMessage("Pokaži geslo"), - "Sign In" : MessageLookupByLibrary.simpleMessage("Prijava"), - "Something went wrong trying to create your account, please reach out to your school for assistance." : MessageLookupByLibrary.simpleMessage("Pri poskusu ustvarjanja računa je prišlo do napake. Za pomoč se obrnite na šolo."), - "Something\'s broken but I can work around it to get what I need done." : MessageLookupByLibrary.simpleMessage("Nekaj ne deluje, a znam to rešiti, da dokončam, kar je treba."), - "Stop Acting as User" : MessageLookupByLibrary.simpleMessage("Opustite vlogo uporabnika"), - "Student" : MessageLookupByLibrary.simpleMessage("Študent"), - "Student Pairing" : MessageLookupByLibrary.simpleMessage("Seznanjanje študenta"), - "Students can create a QR code using the Canvas Student app on their mobile device" : MessageLookupByLibrary.simpleMessage("Študenti lahko ustvarijo kodo QR z aplikacijo Canvas Student na svoji mobilni napravi"), - "Students can obtain a pairing code through the Canvas website" : MessageLookupByLibrary.simpleMessage("Študenti lahko pridobijo kodo za seznanitev prek spletnega mesta Canvas"), - "Subject" : MessageLookupByLibrary.simpleMessage("Zadeva"), - "Submitted" : MessageLookupByLibrary.simpleMessage("Poslano"), - "Successfully submitted!" : MessageLookupByLibrary.simpleMessage("Uspešno poslano."), - "Summary" : MessageLookupByLibrary.simpleMessage("Povzetek"), - "Switch Users" : MessageLookupByLibrary.simpleMessage("Preklopi uporabnika"), - "Syllabus" : MessageLookupByLibrary.simpleMessage("Učni načrt"), - "TA" : MessageLookupByLibrary.simpleMessage("Demonstrator"), - "TEACHER" : MessageLookupByLibrary.simpleMessage("IZVAJALEC"), - "Tap to favorite the courses you want to see on the Calendar. Select up to 10." : MessageLookupByLibrary.simpleMessage("Tapnite za dodajanje predmetov, ki jih želite prikazane na koledarju, med priljubljene. Izberite do 10 elementov."), - "Tap to pair with a new student" : MessageLookupByLibrary.simpleMessage("Tapnite za povezavo z novim študentom"), - "Tap to select this student" : MessageLookupByLibrary.simpleMessage("Tapnite za izbiro tega študenta"), - "Tap to show student selector" : MessageLookupByLibrary.simpleMessage("Tapnite za prikaz izbirnika študentov"), - "Teacher" : MessageLookupByLibrary.simpleMessage("Izvajalec"), - "Tell us about your favorite parts of the app" : MessageLookupByLibrary.simpleMessage("Opišite nam, kateri deli aplikacije so vam najljubši"), - "Terms of Service" : MessageLookupByLibrary.simpleMessage("Pogoji storitve"), - "Terms of Service Link" : MessageLookupByLibrary.simpleMessage("Povezava na Pogoji za uporabo storitve"), - "Terms of Use" : MessageLookupByLibrary.simpleMessage("Pogoji uporabe"), - "The QR code you scanned may have expired. Refresh the code on the student\'s device and try again." : MessageLookupByLibrary.simpleMessage("Veljavnost kode QR, ki ste jo odčitali, je potekla. Osvežite kodo na študentovi napravi in poskusite znova."), - "The following information will help us better understand your idea:" : MessageLookupByLibrary.simpleMessage("Z naslednjimi informacijami bomo bolje razumeli vašo zamisel:"), - "The server you entered is not authorized for this app." : MessageLookupByLibrary.simpleMessage("Strežnik, ki ste ga vnesli, nima pooblastila za to aplikacijo."), - "The student you are trying to add belongs to a different school. Log in or create an account with that school to scan this code." : MessageLookupByLibrary.simpleMessage("Študent, ki ga poskušate dodati, spada v drugo šolo. Prijavite se ali ustvarite račun pri tej šoli, če želite odčitati to kodo."), - "The user agent for this app is not authorized." : MessageLookupByLibrary.simpleMessage("Zastopnik uporabnika za to aplikacijo ni pooblaščen."), - "Theme" : MessageLookupByLibrary.simpleMessage("Tema"), - "There are no installed applications that can open this file" : MessageLookupByLibrary.simpleMessage("Nameščene nimate nobene aplikacije, ki bi lahko odprla to datoteko"), - "There is no page information available." : MessageLookupByLibrary.simpleMessage("Informacije o strani niso na voljo."), - "There was a problem loading the Terms of Use" : MessageLookupByLibrary.simpleMessage("Prišlo je do težav pri nalaganju pogojev uporabe."), - "There was a problem removing this student from your account. Please check your connection and try again." : MessageLookupByLibrary.simpleMessage("Prišlo je do težave pri odstranjevanju tega študenta iz računa. Preverite svojo povezavo in poskusite znova."), - "There was an error loading recipients for this course" : MessageLookupByLibrary.simpleMessage("Prišlo je do napake pri nalaganju prejemnikov za ta predmet"), - "There was an error loading the summary details for this course." : MessageLookupByLibrary.simpleMessage("Prišlo je do napake pri nalaganju povzetka podrobnosti za ta predmet."), - "There was an error loading this announcement" : MessageLookupByLibrary.simpleMessage("Prišlo je do napake pri nalaganju tega obvestila"), - "There was an error loading this conversation" : MessageLookupByLibrary.simpleMessage("Prišlo je do napake pri nalaganju tega pogovora"), - "There was an error loading this file" : MessageLookupByLibrary.simpleMessage("Prišlo je do napake pri nalaganju te datoteke"), - "There was an error loading your inbox messages." : MessageLookupByLibrary.simpleMessage("Pri nalaganju sporočil vašega nabiralnika je prišlo do napake."), - "There was an error loading your student\'s alerts." : MessageLookupByLibrary.simpleMessage("Pri nalaganju opozoril vašega študenta je prišlo do napake."), - "There was an error loading your student\'s calendar" : MessageLookupByLibrary.simpleMessage("Pri nalaganju koledarja vašega študenta je prišlo do napake"), - "There was an error loading your students." : MessageLookupByLibrary.simpleMessage("Pri nalaganju vaših študentov je prišlo do napake."), - "There was an error loading your student’s courses." : MessageLookupByLibrary.simpleMessage("Pri nalaganju predmetov vašega študenta je prišlo do napake."), - "There was an error logging in. Please generate another QR Code and try again." : MessageLookupByLibrary.simpleMessage("Pri prijavi je prišlo do napake. Ustvarite novo kodo QR in poskusite znova."), - "There was an error trying to act as this user. Please check the Domain and User ID and try again." : MessageLookupByLibrary.simpleMessage("Prišlo je do napake pri prevzemanju vloge tega uporabnika. Preverite domeno in ID uporabnika ter poskusite znova."), - "There’s nothing to be notified of yet." : MessageLookupByLibrary.simpleMessage("Ni ničesar, o čemer bi bilo treba obveščati."), - "This app is not authorized for use." : MessageLookupByLibrary.simpleMessage("Te aplikacije ni dovoljeno uporabljati."), - "This course does not have any assignments or calendar events yet." : MessageLookupByLibrary.simpleMessage("Ta predmet še nima nalog ali koledarskih dogodkov."), - "This file is unsupported and can’t be viewed through the app" : MessageLookupByLibrary.simpleMessage("Datoteka ni podprta in si je ni mogoče ogledati v aplikaciji"), - "This will unpair and remove all enrollments for this student from your account." : MessageLookupByLibrary.simpleMessage("Ta možnost bo odstranila seznanitev in vse vpise za študenta v vašem računu."), - "Total Grade" : MessageLookupByLibrary.simpleMessage("Skupna ocena"), - "Uh oh!" : MessageLookupByLibrary.simpleMessage("Ojoj."), - "Unable to fetch courses. Please check your connection and try again." : MessageLookupByLibrary.simpleMessage("Predmetov ni bilo mogoče pridobiti. Preverite svojo povezavo in poskusite znova."), - "Unable to load this image" : MessageLookupByLibrary.simpleMessage("Te slike ni mogoče naložiti"), - "Unable to play this media file" : MessageLookupByLibrary.simpleMessage("Te predstavnostne datoteke ni mogoče predvajati"), - "Unable to send message. Check your connection and try again." : MessageLookupByLibrary.simpleMessage("Sporočila ni bilo mogoče poslati. Preverite svojo povezavo in poskusite znova."), - "Under Construction" : MessageLookupByLibrary.simpleMessage("V delu"), - "Unknown User" : MessageLookupByLibrary.simpleMessage("Neznani uporabnik"), - "Unsaved changes" : MessageLookupByLibrary.simpleMessage("Neshranjene spremembe"), - "Unsupported File" : MessageLookupByLibrary.simpleMessage("Nepodprta datoteka"), - "Upload File" : MessageLookupByLibrary.simpleMessage("Naloži datoteko"), - "Use Camera" : MessageLookupByLibrary.simpleMessage("Uporabi fotoaparat"), - "Use Dark Theme in Web Content" : MessageLookupByLibrary.simpleMessage("Uporabi temno temo za spletno vsebino"), - "User ID" : MessageLookupByLibrary.simpleMessage("ID uporabnika"), - "User ID:" : MessageLookupByLibrary.simpleMessage("ID uporabnika:"), - "Version Number" : MessageLookupByLibrary.simpleMessage("Številka različice"), - "View Description" : MessageLookupByLibrary.simpleMessage("Prikaz opisa"), - "View error details" : MessageLookupByLibrary.simpleMessage("Prikaz podrobnosti o napaki"), - "View the Privacy Policy" : MessageLookupByLibrary.simpleMessage("Ogled Pravilnika o zasebnosti"), - "We are currently building this feature for your viewing pleasure." : MessageLookupByLibrary.simpleMessage("Ta funkcija je v izdelavi za vaš užitek ob gledanju."), - "We are unable to display this link, it may belong to an institution you currently aren\'t logged in to." : MessageLookupByLibrary.simpleMessage("Te povezave ne moremo prikazati; morda pripada ustanovi, v katero trenutno niste prijavljeni."), - "We couldn\'t find any students associated with this account" : MessageLookupByLibrary.simpleMessage("Nismo uspeli najti nobenega študenta, povezanega s tem računom"), - "We were unable to verify the server for use with this app." : MessageLookupByLibrary.simpleMessage("Strežnika za uporabo pri tej aplikaciji nismo uspeli preveriti."), - "We’re not sure what happened, but it wasn’t good. Contact us if this keeps happening." : MessageLookupByLibrary.simpleMessage("Nismo prepričano, kaj se je zgodilo, ni pa bilo dobro. Če se napaka ponovi, nas kontaktirajte."), - "What can we do better?" : MessageLookupByLibrary.simpleMessage("Kaj lahko izboljšamo?"), - "Yes" : MessageLookupByLibrary.simpleMessage("Da"), - "You are not observing any students." : MessageLookupByLibrary.simpleMessage("Ne opazujete nobenega študenta."), - "You may only choose 10 calendars to display" : MessageLookupByLibrary.simpleMessage("Za prikaz lahko izberete le 10 koledarjev."), - "You must enter a user id" : MessageLookupByLibrary.simpleMessage("Vnesti morate ID uporabnika"), - "You must enter a valid domain" : MessageLookupByLibrary.simpleMessage("Vnesti morate veljavno domeno"), - "You must select at least one calendar to display" : MessageLookupByLibrary.simpleMessage("Izbrati morate vsaj en koledar za prikaz."), - "You will be notified about this assignment on…" : MessageLookupByLibrary.simpleMessage("O tej nalogi boste obveščeni dne ..."), - "You will be notified about this event on…" : MessageLookupByLibrary.simpleMessage("O tem dogodku boste obveščeni dne ..."), - "You\'ll find the QR code on the web in your account profile. Click \'QR for Mobile Login\' in the list." : MessageLookupByLibrary.simpleMessage("Kodo QR boste našli v svojem profilu računa na spletu. Na seznamu kliknite »QR za mobilno prijavo«."), - "You\'ll need to open your student\'s Canvas Student app to continue. Go into Main Menu > Settings > Pair with Observer and scan the QR code you see there." : MessageLookupByLibrary.simpleMessage("Če želite nadaljevati, odprite aplikacijo Canvas Student za študente. Pojdite v glavni meni > Nastavitve > Seznani s skritim bralcem in odčitajte prikazano kodo QR"), - "Your code is incorrect or expired." : MessageLookupByLibrary.simpleMessage("Vaša koda je nepravilna ali potekla."), - "Your student’s courses might not be published yet." : MessageLookupByLibrary.simpleMessage("Predmeti vašega študenta morda še niso objavljeni."), - "You’re all caught up!" : MessageLookupByLibrary.simpleMessage("Seznanjeni ste z vsem!"), - "actingAsUser" : m0, - "alertsLabel" : MessageLookupByLibrary.simpleMessage("Opozorila"), - "appVersion" : m1, - "assignmentGradeAboveThreshold" : m2, - "assignmentGradeBelowThreshold" : m3, - "assignmentLockedModule" : m4, - "assignmentSubjectMessage" : m5, - "assignmentTotalPoints" : m6, - "assignmentTotalPointsAccessible" : m7, - "authorToNOthers" : m8, - "authorToRecipient" : m9, - "authorToRecipientAndNOthers" : m10, - "badgeNumberPlus" : m11, - "calendarLabel" : MessageLookupByLibrary.simpleMessage("Koledar"), - "canvasGuides" : MessageLookupByLibrary.simpleMessage("Vodniki po sistemu Canvas"), - "canvasLogoLabel" : MessageLookupByLibrary.simpleMessage("Logotip sistema Canvas"), - "canvasSupport" : MessageLookupByLibrary.simpleMessage("Podpora za sistem Canvas"), - "changeStudentColorLabel" : m12, - "collapse" : MessageLookupByLibrary.simpleMessage("strni"), - "collapsed" : MessageLookupByLibrary.simpleMessage("strnjeno"), - "contentDescriptionScoreOutOfPointsPossible" : m13, - "courseForWhom" : m14, - "courseGradeAboveThreshold" : m15, - "courseGradeBelowThreshold" : m16, - "coursesLabel" : MessageLookupByLibrary.simpleMessage("Predmeti"), - "dateAtTime" : m17, - "dismissAlertLabel" : m18, - "domainSearchHelpBody" : m19, - "domainSearchHelpLabel" : MessageLookupByLibrary.simpleMessage("Kako najdem svojo šolo ali okrožje?"), - "domainSearchInputHint" : MessageLookupByLibrary.simpleMessage("Vnos imena šole ali okrožja ..."), - "dueDateAtTime" : m20, - "endMasqueradeLogoutMessage" : m21, - "endMasqueradeMessage" : m22, - "eventSubjectMessage" : m23, - "eventTime" : m24, - "expand" : MessageLookupByLibrary.simpleMessage("razširi"), - "expanded" : MessageLookupByLibrary.simpleMessage("razširjeno"), - "finalGrade" : m25, - "findSchool" : MessageLookupByLibrary.simpleMessage("Poišči šolo"), - "frontPageSubjectMessage" : m26, - "gradeFormatScoreOutOfPointsPossible" : m27, - "gradesSubjectMessage" : m28, - "latePenalty" : m29, - "me" : MessageLookupByLibrary.simpleMessage("jaz"), - "messageLinkPostscript" : m30, - "minus" : MessageLookupByLibrary.simpleMessage("minus"), - "mustBeAboveN" : m31, - "mustBeBelowN" : m32, - "next" : MessageLookupByLibrary.simpleMessage("Naprej"), - "nextMonth" : m33, - "nextWeek" : m34, - "noDomainResults" : m35, - "ok" : MessageLookupByLibrary.simpleMessage("V redu"), - "outOfPoints" : m36, - "plusRecipientCount" : m37, - "pointsPossible" : m38, - "previousMonth" : m39, - "previousWeek" : m40, - "qrCreateAccountTos" : m41, - "ratingDialogEmailSubject" : m42, - "selectedMonthLabel" : m43, - "send" : MessageLookupByLibrary.simpleMessage("pošlji"), - "starRating" : m44, - "submissionStatusSuccessSubtitle" : m45, - "syllabusSubjectMessage" : m46, - "unread" : MessageLookupByLibrary.simpleMessage("neprebrano"), - "unreadCount" : m47 - }; -} diff --git a/apps/flutter_parent/lib/l10n/generated/messages_sv.dart b/apps/flutter_parent/lib/l10n/generated/messages_sv.dart deleted file mode 100644 index 50847a6a0c..0000000000 --- a/apps/flutter_parent/lib/l10n/generated/messages_sv.dart +++ /dev/null @@ -1,473 +0,0 @@ -// DO NOT EDIT. This is code generated via package:intl/generate_localized.dart -// This is a library that provides messages for a sv locale. All the -// messages from the main program should be duplicated here with the same -// function name. - -// Ignore issues from commonly used lints in this file. -// ignore_for_file:unnecessary_brace_in_string_interps, unnecessary_new -// ignore_for_file:prefer_single_quotes,comment_references, directives_ordering -// ignore_for_file:annotate_overrides,prefer_generic_function_type_aliases -// ignore_for_file:unused_import, file_names - -import 'package:intl/intl.dart'; -import 'package:intl/message_lookup_by_library.dart'; - -final messages = new MessageLookup(); - -typedef String MessageIfAbsent(String messageStr, List args); - -class MessageLookup extends MessageLookupByLibrary { - String get localeName => 'sv'; - - static m0(userName) => "Du agerar som ${userName}"; - - static m1(version) => "v. ${version}"; - - static m2(threshold) => "Uppgiftsomdöme över ${threshold}"; - - static m3(threshold) => "Uppgiftsomdöme under ${threshold}"; - - static m4(moduleName) => "Den här uppgiften har låsts av modulen \"${moduleName}\"."; - - static m5(studentName, assignmentName) => "Angående : ${studentName}, uppgift – ${assignmentName}"; - - static m6(points) => "${points} poäng"; - - static m7(points) => "${points} poäng"; - - static m8(authorName, howMany) => "${Intl.plural(howMany, one: '${authorName} till 1 annan', other: '${authorName} till ${howMany} andra')}"; - - static m9(authorName, recipientName) => "${authorName} till ${recipientName}"; - - static m10(authorName, recipientName, howMany) => "${Intl.plural(howMany, one: '${authorName} till ${recipientName} och 1 annan', other: '${authorName} till ${recipientName} och ${howMany} andra')}"; - - static m11(count) => "${count}+"; - - static m12(studentName) => "Ändra färg för ${studentName}"; - - static m13(score, pointsPossible) => "${score} av ${pointsPossible} poäng"; - - static m14(studentShortName) => "för ${studentShortName}"; - - static m15(threshold) => "Kursomdöme över ${threshold}"; - - static m16(threshold) => "Kursomdöme under ${threshold}"; - - static m17(date, time) => "${date} kl. ${time}"; - - static m18(alertTitle) => "Avvisa ${alertTitle}"; - - static m19(canvasGuides, canvasSupport) => "Försök med att söka efter namnet på skolan eller distrikten du vill ansluta till, t.ex. “Allmänna skolan” eller “Skolor i Skåne”. Du kan även ange en Canvas-domän direkt, t.ex. “smith.instructure.com.”\n\nMer information om hur du kan hitta din institutions Canvas-konto finns på ${canvasGuides} eller kontakta ${canvasSupport} eller din skola för att få hjälp."; - - static m20(date, time) => "Ska lämnas in ${date} klockan ${time}"; - - static m21(userName) => "Du kommer att sluta agera som ${userName} och loggas ut."; - - static m22(userName) => "Du kommer att sluta agera som ${userName} och återgå till ditt ursprungliga konto."; - - static m23(studentName, eventTitle) => "Angående : ${studentName}, händelse – ${eventTitle}"; - - static m24(startAt, endAt) => "${startAt}/${endAt}"; - - static m25(grade) => "Totalt omdöme: ${grade}"; - - static m26(studentName) => "Angående : ${studentName}, framsida"; - - static m27(score, pointsPossible) => "${score}/${pointsPossible}"; - - static m28(studentName) => "Angående : ${studentName}, omdömen"; - - static m29(pointsLost) => "Förseningsbestraffning (-${pointsLost})"; - - static m30(studentName, linkUrl) => "Angående : ${studentName}, ${linkUrl}"; - - static m31(percentage) => "Måste vara över ${percentage}"; - - static m32(percentage) => "Måste vara under ${percentage}"; - - static m33(month) => "Nästa månad: ${month}"; - - static m34(date) => "Nästa vecka börjar ${date}"; - - static m35(query) => "Det gick inte att hitta skolar som matchar \"${query}\""; - - static m36(points, howMany) => "${Intl.plural(howMany, one: 'En av 1 poäng', other: 'En av ${points} poäng')}"; - - static m37(count) => "+${count}"; - - static m38(points) => "${points} möjliga poäng"; - - static m39(month) => "Föregående månad: ${month}"; - - static m40(date) => "Föregående vecka startade ${date}"; - - static m41(termsOfService, privacyPolicy) => "Genom att trycka på Skapa konto samtycker du till ${termsOfService} och ${privacyPolicy}"; - - static m42(version) => "Förslag för Android – Canvas Parent ${version}"; - - static m43(month) => "Månaden ${month}"; - - static m44(position) => "${Intl.plural(position, one: '${position} stjärna', other: '${position} stjärnor')}"; - - static m45(date, time) => "Uppgiften lämnades in ${date} kl. ${time} och väntar på bedömning"; - - static m46(studentName) => "Angående : ${studentName}, kursöversikt"; - - static m47(count) => "${count} olästa"; - - final messages = _notInlinedMessages(_notInlinedMessages); - static _notInlinedMessages(_) => { - "\"Act as\" is essentially logging in as this user without a password. You will be able to take any action as if you were this user, and from other users\' points of views, it will be as if this user performed them. However, audit logs record that you were the one who performed the actions on behalf of this user." : MessageLookupByLibrary.simpleMessage("\"Att uppträda som\", loggar huvudsakligen in som den här användaren utan lösenord. Du kommer att kunna vidta åtgärder som om du var den här användaren, och från andra användares synpunkter kommer det att upplevas som om den här användaren utförde dem. I historik-loggar registreras dock att du var den som utförde åtgärderna på den här användarens vägnar."), - "-" : MessageLookupByLibrary.simpleMessage("-"), - "A description is required." : MessageLookupByLibrary.simpleMessage("Beskrivning är obligatorisk."), - "A network error occurred when adding this student. Check your connection and try again." : MessageLookupByLibrary.simpleMessage("Ett nätverksfel inträffade när du lade till den här studenten. Kontrollera din anslutning och försök igen."), - "A subject is required." : MessageLookupByLibrary.simpleMessage("Ämne är obligatoriskt."), - "Act As User" : MessageLookupByLibrary.simpleMessage("Agera som användare"), - "Add Student" : MessageLookupByLibrary.simpleMessage("Lägg till student"), - "Add attachment" : MessageLookupByLibrary.simpleMessage("Lägg till bilaga"), - "Add new student" : MessageLookupByLibrary.simpleMessage("Lägg till ny student"), - "Add student with…" : MessageLookupByLibrary.simpleMessage("Lägg till student med..."), - "Alert Settings" : MessageLookupByLibrary.simpleMessage("Notisinställningar"), - "Alert me when…" : MessageLookupByLibrary.simpleMessage("Notifiera mig om..."), - "All Grading Periods" : MessageLookupByLibrary.simpleMessage("Alla bedömningsperioder"), - "Already have an account? " : MessageLookupByLibrary.simpleMessage("Har du redan ett konto? "), - "An email address is required." : MessageLookupByLibrary.simpleMessage("E-postadressen är obligatorisk."), - "An error occurred when trying to display this link" : MessageLookupByLibrary.simpleMessage("Ett fel uppstod när länken skulle visas"), - "An error occurred while saving your selection. Please try again." : MessageLookupByLibrary.simpleMessage("Ett fel inträffade när ditt val sparades. Försök igen."), - "An unexpected error occurred" : MessageLookupByLibrary.simpleMessage("Ett oväntat fel inträffade"), - "Android OS version" : MessageLookupByLibrary.simpleMessage("Android AS-version"), - "Appearance" : MessageLookupByLibrary.simpleMessage("Utseende"), - "Application version" : MessageLookupByLibrary.simpleMessage("Programversion"), - "Are you a student or teacher?" : MessageLookupByLibrary.simpleMessage("Är du student eller lärare?"), - "Are you sure you want to log out?" : MessageLookupByLibrary.simpleMessage("Vill du logga ut?"), - "Are you sure you wish to close this page? Your unsent message will be lost." : MessageLookupByLibrary.simpleMessage("Är du säker på att du vill stänga den här sidan? Ditt meddelande du ännu inte skickat kommer att tas bort."), - "Assignment Details" : MessageLookupByLibrary.simpleMessage("Uppgiftens detaljer"), - "Assignment grade above" : MessageLookupByLibrary.simpleMessage("Uppgiftsomdöme över"), - "Assignment grade below" : MessageLookupByLibrary.simpleMessage("Uppgiftsbetyg nedan"), - "Assignment missing" : MessageLookupByLibrary.simpleMessage("Tilldelning saknas"), - "Barney, Fuschia" : MessageLookupByLibrary.simpleMessage("Barney, Fuschia"), - "Calendars" : MessageLookupByLibrary.simpleMessage("Kalendrar"), - "Camera Permission" : MessageLookupByLibrary.simpleMessage("Kamerabehörighet"), - "Cancel" : MessageLookupByLibrary.simpleMessage("Avbryt"), - "Canvas Student" : MessageLookupByLibrary.simpleMessage("Canvas-student"), - "Canvas Teacher" : MessageLookupByLibrary.simpleMessage("Canvas-lärare"), - "Canvas on GitHub" : MessageLookupByLibrary.simpleMessage("Canvas på GitHub"), - "Choose a course to message" : MessageLookupByLibrary.simpleMessage("Välj en kurs att skicka meddelande till"), - "Choose from Gallery" : MessageLookupByLibrary.simpleMessage("Välj från galleri"), - "Complete" : MessageLookupByLibrary.simpleMessage("Färdig"), - "Contact Support" : MessageLookupByLibrary.simpleMessage("Kontakta support"), - "Course Announcement" : MessageLookupByLibrary.simpleMessage("Anslag"), - "Course Announcements" : MessageLookupByLibrary.simpleMessage("Anslag"), - "Course grade above" : MessageLookupByLibrary.simpleMessage("Kursbetyg över"), - "Course grade below" : MessageLookupByLibrary.simpleMessage("Kursbetyg under"), - "Create Account" : MessageLookupByLibrary.simpleMessage("Skapa konto"), - "Dark Mode" : MessageLookupByLibrary.simpleMessage("Mörkt läge"), - "Date" : MessageLookupByLibrary.simpleMessage("Datum"), - "Delete" : MessageLookupByLibrary.simpleMessage("Ta bort"), - "Description" : MessageLookupByLibrary.simpleMessage("Beskrivning"), - "Device" : MessageLookupByLibrary.simpleMessage("Enhet"), - "Device model" : MessageLookupByLibrary.simpleMessage("Enhetsmodell"), - "Domain" : MessageLookupByLibrary.simpleMessage("Domän"), - "Domain:" : MessageLookupByLibrary.simpleMessage("Domän:"), - "Don\'t show again" : MessageLookupByLibrary.simpleMessage("Visa inte igen"), - "Done" : MessageLookupByLibrary.simpleMessage("Klar"), - "Download" : MessageLookupByLibrary.simpleMessage("Ladda ned"), - "Due" : MessageLookupByLibrary.simpleMessage("Inlämningsdatum"), - "EXTREME CRITICAL EMERGENCY!!" : MessageLookupByLibrary.simpleMessage("EXTREMT KRITISKT NÖDFALL!!"), - "Electric, blue" : MessageLookupByLibrary.simpleMessage("Elektrisk, blå"), - "Email Address" : MessageLookupByLibrary.simpleMessage("E-postadress"), - "Email:" : MessageLookupByLibrary.simpleMessage("E-post:"), - "Email…" : MessageLookupByLibrary.simpleMessage("E-post …"), - "Enter the student pairing code provided to you. If the pairing code doesn\'t work, it may have expired" : MessageLookupByLibrary.simpleMessage("Ange den studentparkopplingskod du har fått. Om parkopplingskoden inte fungerar kan den ha gått ut"), - "Event" : MessageLookupByLibrary.simpleMessage("Händelse"), - "Excused" : MessageLookupByLibrary.simpleMessage("Ursäktad"), - "Expired QR Code" : MessageLookupByLibrary.simpleMessage("Utgången QR-kod"), - "Failed. Tap for options." : MessageLookupByLibrary.simpleMessage("Misslyckades. Tryck för alternativ."), - "Filter" : MessageLookupByLibrary.simpleMessage("Filtrera"), - "Filter by" : MessageLookupByLibrary.simpleMessage("Filtrera efter"), - "Fire, Orange" : MessageLookupByLibrary.simpleMessage("Eld, orange"), - "Front Page" : MessageLookupByLibrary.simpleMessage("Framsida"), - "Full Name" : MessageLookupByLibrary.simpleMessage("Fullständigt namn"), - "Full Name…" : MessageLookupByLibrary.simpleMessage("Fullständigt namn ..."), - "Full error message" : MessageLookupByLibrary.simpleMessage("Fullständigt felmeddelande"), - "Go to today" : MessageLookupByLibrary.simpleMessage("Gå till i dag"), - "Grade" : MessageLookupByLibrary.simpleMessage("Omdöme"), - "Grade percentage" : MessageLookupByLibrary.simpleMessage("Omdömesprocent"), - "Graded" : MessageLookupByLibrary.simpleMessage("Har bedömts"), - "Grades" : MessageLookupByLibrary.simpleMessage("Omdömen"), - "Help" : MessageLookupByLibrary.simpleMessage("Hjälp"), - "Hide Password" : MessageLookupByLibrary.simpleMessage("Dölj lösenord"), - "High Contrast Mode" : MessageLookupByLibrary.simpleMessage("Högt kontrastläge"), - "How are we doing?" : MessageLookupByLibrary.simpleMessage("Hur går det för oss?"), - "How is this affecting you?" : MessageLookupByLibrary.simpleMessage("Hur påverkar detta dig?"), - "I can\'t get things done until I hear back from you." : MessageLookupByLibrary.simpleMessage("Jag kan inte göra något tills jag hör ifrån er."), - "I don\'t have a Canvas account" : MessageLookupByLibrary.simpleMessage("Jag har inte ett Canvas-konto"), - "I have a Canvas account" : MessageLookupByLibrary.simpleMessage("Jag har ett Canvas-konto"), - "I need some help but it\'s not urgent." : MessageLookupByLibrary.simpleMessage("Jag behöver hjälp men det är inte bråttom."), - "I\'m having trouble logging in" : MessageLookupByLibrary.simpleMessage("Jag kan inte logga in"), - "Idea for Canvas Parent App [Android]" : MessageLookupByLibrary.simpleMessage("Idéer för appen Canvas Parent [Android]"), - "In order to provide you with a better experience, we have updated how reminders work. You can add new reminders by viewing an assignment or calendar event and tapping the switch under the \"Remind Me\" section.\n\nBe aware that any reminders created with older versions of this app will not be compatible with the new changes and you will need to create them again." : MessageLookupByLibrary.simpleMessage("För att tillhandahålla dig en förbättrad upplevelse har vi uppdaterat påminnelsefunktionen. Du kan lägga till nya påminnelser genom att visa en uppgift eller en kalenderhändelse och trycka på reglaget under avsnittet \"Påminn mig\".\n\nTänk på att påminnelser som skapats i äldre versionen av den här appen inte är kompatibla med de nya ändringarna och måste därför skapas om igen."), - "Inbox" : MessageLookupByLibrary.simpleMessage("Inkorg"), - "Inbox Zero" : MessageLookupByLibrary.simpleMessage("Inbox Zero"), - "Incomplete" : MessageLookupByLibrary.simpleMessage("Ej fullständig"), - "Incorrect Domain" : MessageLookupByLibrary.simpleMessage("Felaktig domän"), - "Institution Announcement" : MessageLookupByLibrary.simpleMessage("Institutionsmeddelande"), - "Institution Announcements" : MessageLookupByLibrary.simpleMessage("Institutionsannonseringar"), - "Instructions" : MessageLookupByLibrary.simpleMessage("Instruktioner"), - "Interactions on this page are limited by your institution." : MessageLookupByLibrary.simpleMessage("Interaktioner på den här sidan har begränsats av din institution."), - "Invalid QR Code" : MessageLookupByLibrary.simpleMessage("Ogiltig QR-kod"), - "It looks like a great day to rest, relax, and recharge." : MessageLookupByLibrary.simpleMessage("Det verkar vara en bra dag för vila, avslappning och omladdning."), - "It looks like assignments haven\'t been created in this space yet." : MessageLookupByLibrary.simpleMessage("Det verkar som om inga uppgifter har skapats för den här platsen än."), - "Just a casual question, comment, idea, suggestion…" : MessageLookupByLibrary.simpleMessage("Bara en vanlig fråga, kommentar, idé, förslag ..."), - "Late" : MessageLookupByLibrary.simpleMessage("Sen"), - "Launch External Tool" : MessageLookupByLibrary.simpleMessage("Starta externt verktyg"), - "Legal" : MessageLookupByLibrary.simpleMessage("Juridik"), - "Light Mode" : MessageLookupByLibrary.simpleMessage("Ljust läge"), - "Link Error" : MessageLookupByLibrary.simpleMessage("Länkfel"), - "Locale:" : MessageLookupByLibrary.simpleMessage("Plats:"), - "Locate QR Code" : MessageLookupByLibrary.simpleMessage("Lokalisera QR-kod"), - "Location" : MessageLookupByLibrary.simpleMessage("Plats"), - "Locked" : MessageLookupByLibrary.simpleMessage("Låst"), - "Log Out" : MessageLookupByLibrary.simpleMessage("Logga ut"), - "Login flow: Canvas" : MessageLookupByLibrary.simpleMessage("Inloggningsflöde: Canvas"), - "Login flow: Normal" : MessageLookupByLibrary.simpleMessage("Inloggningsflöde: Normal"), - "Login flow: Site Admin" : MessageLookupByLibrary.simpleMessage("Inloggningsflöde: Webbplatsadmin"), - "Login flow: Skip mobile verify" : MessageLookupByLibrary.simpleMessage("Inloggningsflöde: Hoppa över mobilverifiering"), - "Manage Students" : MessageLookupByLibrary.simpleMessage("Hantera studenter"), - "Message" : MessageLookupByLibrary.simpleMessage("Meddelande"), - "Message subject" : MessageLookupByLibrary.simpleMessage("Meddelandeämne"), - "Missing" : MessageLookupByLibrary.simpleMessage("Saknad"), - "Must be below 100" : MessageLookupByLibrary.simpleMessage("Måste vara under 100"), - "Network error" : MessageLookupByLibrary.simpleMessage("Nätverksfel"), - "Never" : MessageLookupByLibrary.simpleMessage("Aldrig"), - "New message" : MessageLookupByLibrary.simpleMessage("Nytt meddelande"), - "No" : MessageLookupByLibrary.simpleMessage("Nej"), - "No Alerts" : MessageLookupByLibrary.simpleMessage("Inga notiser"), - "No Assignments" : MessageLookupByLibrary.simpleMessage("Inga uppgifter"), - "No Courses" : MessageLookupByLibrary.simpleMessage("Inga kurser"), - "No Due Date" : MessageLookupByLibrary.simpleMessage("Inget inlämningsdatum"), - "No Events Today!" : MessageLookupByLibrary.simpleMessage("Inga händelser idag!"), - "No Grade" : MessageLookupByLibrary.simpleMessage("Ingen omdöme"), - "No Location Specified" : MessageLookupByLibrary.simpleMessage("Ingen plats specificerad"), - "No Students" : MessageLookupByLibrary.simpleMessage("Inga studenter"), - "No Subject" : MessageLookupByLibrary.simpleMessage("Inget ämne"), - "No Summary" : MessageLookupByLibrary.simpleMessage("Ingen sammanfattning"), - "No description" : MessageLookupByLibrary.simpleMessage("Ingen beskrivning"), - "No recipients selected" : MessageLookupByLibrary.simpleMessage("Inga mottagare har valts"), - "Not Graded" : MessageLookupByLibrary.simpleMessage("Inte bedömd"), - "Not Submitted" : MessageLookupByLibrary.simpleMessage("Inte inskickad"), - "Not a parent?" : MessageLookupByLibrary.simpleMessage("Är du inte vårdnadshavare?"), - "Notifications for reminders about assignments and calendar events" : MessageLookupByLibrary.simpleMessage("Påminnelsenotiser om uppgifter och kalenderhändelser"), - "OS Version" : MessageLookupByLibrary.simpleMessage("Operativsystemets version"), - "Observer" : MessageLookupByLibrary.simpleMessage("Observatör"), - "One of our other apps might be a better fit. Tap one to visit the Play Store." : MessageLookupByLibrary.simpleMessage("Någon av våra andra appar kan vara bättre lämpade. Tryck på en för att besöka Play Store."), - "Open Canvas Student" : MessageLookupByLibrary.simpleMessage("Öppna Canvas Student"), - "Open In Browser" : MessageLookupByLibrary.simpleMessage("Öppna i webbläsare"), - "Open with another app" : MessageLookupByLibrary.simpleMessage("Öppna med en annan app"), - "Pairing Code" : MessageLookupByLibrary.simpleMessage("Parkopplingskod"), - "Password" : MessageLookupByLibrary.simpleMessage("Lösenord"), - "Password is required" : MessageLookupByLibrary.simpleMessage("Lösenord krävs"), - "Password must contain at least 8 characters" : MessageLookupByLibrary.simpleMessage("Lösenord måste innehålla minst 8 tecken"), - "Password…" : MessageLookupByLibrary.simpleMessage("Lösenord ..."), - "Planner Note" : MessageLookupByLibrary.simpleMessage("Planner-anteckning"), - "Please enter a valid email address" : MessageLookupByLibrary.simpleMessage("Ange en giltig e-postadress"), - "Please enter an email address" : MessageLookupByLibrary.simpleMessage("Ange en e-postadress"), - "Please enter full name" : MessageLookupByLibrary.simpleMessage("Ange fullständigt namn"), - "Please scan a QR code generated by Canvas" : MessageLookupByLibrary.simpleMessage("Skanna en QR-kod som genererats i Canvas."), - "Plum, Purple" : MessageLookupByLibrary.simpleMessage("Plommon, lila"), - "Preparing…" : MessageLookupByLibrary.simpleMessage("Förbereder..."), - "Previous Logins" : MessageLookupByLibrary.simpleMessage("Tidigare inloggningar"), - "Privacy Policy" : MessageLookupByLibrary.simpleMessage("Sekretesspolicy"), - "Privacy Policy Link" : MessageLookupByLibrary.simpleMessage("Länk till sekretesspolicy"), - "Privacy policy, terms of use, open source" : MessageLookupByLibrary.simpleMessage("Integritetspolicy, användarvillkor, öppen källkod"), - "QR Code" : MessageLookupByLibrary.simpleMessage("QR-kod"), - "QR scanning requires camera access" : MessageLookupByLibrary.simpleMessage("QR-skanning kräver kameraåtkomst"), - "Raspberry, Red" : MessageLookupByLibrary.simpleMessage("Hallon, röd"), - "Recipients" : MessageLookupByLibrary.simpleMessage("Mottagare"), - "Refresh" : MessageLookupByLibrary.simpleMessage("Uppdatera"), - "Remind Me" : MessageLookupByLibrary.simpleMessage("Påminn mig"), - "Reminders" : MessageLookupByLibrary.simpleMessage("Påminnelser"), - "Reminders have changed!" : MessageLookupByLibrary.simpleMessage("Påminnelser har ändrats!"), - "Reply" : MessageLookupByLibrary.simpleMessage("Svara"), - "Reply All" : MessageLookupByLibrary.simpleMessage("Svara alla"), - "Report A Problem" : MessageLookupByLibrary.simpleMessage("Rapportera ett problem"), - "Request Login Help" : MessageLookupByLibrary.simpleMessage("Begär hjälp med inloggning"), - "Request Login Help Button" : MessageLookupByLibrary.simpleMessage("Hjälpknapp för inloggningsförfrågningar"), - "Restart app" : MessageLookupByLibrary.simpleMessage("Starta om appen"), - "Retry" : MessageLookupByLibrary.simpleMessage("Försök igen"), - "Return to Login" : MessageLookupByLibrary.simpleMessage("Gå tillbaka till inloggning"), - "STUDENT" : MessageLookupByLibrary.simpleMessage("STUDENT"), - "Screenshot showing location of QR code generation in browser" : MessageLookupByLibrary.simpleMessage("Skärmdumpen visar platsen för QR-kodgenerering i webbläsaren"), - "Screenshot showing location of pairing QR code generation in the Canvas Student app" : MessageLookupByLibrary.simpleMessage("Skärmbild som visar var QR-kodens parkopplingsgenerering görs i Canvas Student-appen"), - "Select" : MessageLookupByLibrary.simpleMessage("Välj"), - "Select Student Color" : MessageLookupByLibrary.simpleMessage("Välj studentfärg"), - "Select recipients" : MessageLookupByLibrary.simpleMessage("Välj mottagare"), - "Send Feedback" : MessageLookupByLibrary.simpleMessage("Skicka feedback"), - "Send a message about this assignment" : MessageLookupByLibrary.simpleMessage("Skicka ett meddelande om den här kursen"), - "Send a message about this course" : MessageLookupByLibrary.simpleMessage("Skicka ett meddelande om den här kursen"), - "Send message" : MessageLookupByLibrary.simpleMessage("Skicka meddelandet"), - "Set a date and time to be notified of this event." : MessageLookupByLibrary.simpleMessage("Ange ett datum och tid för att få en notis för den här händelsen."), - "Set a date and time to be notified of this specific assignment." : MessageLookupByLibrary.simpleMessage("Ange ett datum och tid för att få en notis för den här specifika uppgiften."), - "Settings" : MessageLookupByLibrary.simpleMessage("Inställningar"), - "Shamrock, Green" : MessageLookupByLibrary.simpleMessage("Klöver, grön"), - "Share Your Love for the App" : MessageLookupByLibrary.simpleMessage("Dela din kärlek till appen"), - "Show Password" : MessageLookupByLibrary.simpleMessage("Visa lösenord"), - "Sign In" : MessageLookupByLibrary.simpleMessage("Logga in"), - "Something went wrong trying to create your account, please reach out to your school for assistance." : MessageLookupByLibrary.simpleMessage("Något gick fel när ditt konto skulle skapas. Kontakta din skola för hjälp."), - "Something\'s broken but I can work around it to get what I need done." : MessageLookupByLibrary.simpleMessage("Det är något som inte fungerar men jag kan göra det jag ska ändå."), - "Stop Acting as User" : MessageLookupByLibrary.simpleMessage("Sluta att agera som en användare"), - "Student" : MessageLookupByLibrary.simpleMessage("Student"), - "Student Pairing" : MessageLookupByLibrary.simpleMessage("Student-parkoppling"), - "Students can create a QR code using the Canvas Student app on their mobile device" : MessageLookupByLibrary.simpleMessage("Studenter kan skapa en QR-kod i Canvas Student-appen i sina mobiler."), - "Students can obtain a pairing code through the Canvas website" : MessageLookupByLibrary.simpleMessage("Studenter kan få en parkopplingskod genom att använda Canvas Student-appen i sina mobiler."), - "Subject" : MessageLookupByLibrary.simpleMessage("Ämne"), - "Submitted" : MessageLookupByLibrary.simpleMessage("Skickad"), - "Successfully submitted!" : MessageLookupByLibrary.simpleMessage("Uppgiften har skickats in!"), - "Summary" : MessageLookupByLibrary.simpleMessage("Sammanfattning"), - "Switch Users" : MessageLookupByLibrary.simpleMessage("Växla användare"), - "Syllabus" : MessageLookupByLibrary.simpleMessage("Kursöversikt"), - "TA" : MessageLookupByLibrary.simpleMessage("Lärarassistent"), - "TEACHER" : MessageLookupByLibrary.simpleMessage("LÄRARE"), - "Tap to favorite the courses you want to see on the Calendar. Select up to 10." : MessageLookupByLibrary.simpleMessage("Tryck för att favoritmarkera de kurser du vill se i kalendern. Välj upp till 10."), - "Tap to pair with a new student" : MessageLookupByLibrary.simpleMessage("Tryck för att koppla samman med en ny student"), - "Tap to select this student" : MessageLookupByLibrary.simpleMessage("Tryck för att välja den här studenten"), - "Tap to show student selector" : MessageLookupByLibrary.simpleMessage("Tryck för att visa studentväljare"), - "Teacher" : MessageLookupByLibrary.simpleMessage("Lärare"), - "Tell us about your favorite parts of the app" : MessageLookupByLibrary.simpleMessage("Berätta vad du tycker om mest med appen"), - "Terms of Service" : MessageLookupByLibrary.simpleMessage("Tjänstvillkor"), - "Terms of Service Link" : MessageLookupByLibrary.simpleMessage("Länk till tjänstvillkor"), - "Terms of Use" : MessageLookupByLibrary.simpleMessage("Användarvillkor"), - "The QR code you scanned may have expired. Refresh the code on the student\'s device and try again." : MessageLookupByLibrary.simpleMessage("QR-koden du skannade kan har gått ut. Uppdatera koden på studentens enhet och försök igen."), - "The following information will help us better understand your idea:" : MessageLookupByLibrary.simpleMessage("Följande information kommer att hjälpa oss att förstå din idé bättre:"), - "The server you entered is not authorized for this app." : MessageLookupByLibrary.simpleMessage("Den server du har angett har inte auktoriserats för den här appen."), - "The student you are trying to add belongs to a different school. Log in or create an account with that school to scan this code." : MessageLookupByLibrary.simpleMessage("Studenten du försöker lägga tillhör en annan skola. Logga in eller skapa ett konto med den skolans för att skanna den här koden."), - "The user agent for this app is not authorized." : MessageLookupByLibrary.simpleMessage("Användaragenten för den här appen är inte auktoriserad."), - "Theme" : MessageLookupByLibrary.simpleMessage("Tema"), - "There are no installed applications that can open this file" : MessageLookupByLibrary.simpleMessage("Det finns inga installerade program som kan öppna den här filen"), - "There is no page information available." : MessageLookupByLibrary.simpleMessage("Det finns ingen sidinformation tillgänglig."), - "There was a problem loading the Terms of Use" : MessageLookupByLibrary.simpleMessage("Det gick inte att läsa in användarvillkoren"), - "There was a problem removing this student from your account. Please check your connection and try again." : MessageLookupByLibrary.simpleMessage("Det gick inte att ta bort studenten från ditt konto. Kontrollera din anslutning och försök igen."), - "There was an error loading recipients for this course" : MessageLookupByLibrary.simpleMessage("Det gick inte att läsa in mottagare för den här kursen"), - "There was an error loading the summary details for this course." : MessageLookupByLibrary.simpleMessage("Det gick inte att läsa in sammanfattningsinformationen för den här kursen."), - "There was an error loading this announcement" : MessageLookupByLibrary.simpleMessage("Det gick inte att läsa in den här annonsen"), - "There was an error loading this conversation" : MessageLookupByLibrary.simpleMessage("Det gick inte att läsa in den här konversationen"), - "There was an error loading this file" : MessageLookupByLibrary.simpleMessage("Det gick inte att läsa in den här filen"), - "There was an error loading your inbox messages." : MessageLookupByLibrary.simpleMessage("Det gick inte att läsa in dina meddelanden i inkorgen."), - "There was an error loading your student\'s alerts." : MessageLookupByLibrary.simpleMessage("Det gick inte att läsa in din students notiser."), - "There was an error loading your student\'s calendar" : MessageLookupByLibrary.simpleMessage("Det gick inte att läsa in din studentkalender."), - "There was an error loading your students." : MessageLookupByLibrary.simpleMessage("Det gick inte att läsa in dina studenter."), - "There was an error loading your student’s courses." : MessageLookupByLibrary.simpleMessage("Det gick inte att läsa in din students kurser."), - "There was an error logging in. Please generate another QR Code and try again." : MessageLookupByLibrary.simpleMessage("Det gick inte att logga in. Generera en annan QR-kod och försök igen."), - "There was an error trying to act as this user. Please check the Domain and User ID and try again." : MessageLookupByLibrary.simpleMessage("Ett fel inträffade under Agera som den här användaren. Kontrollera domänen och användar-ID:t och försök igen."), - "There’s nothing to be notified of yet." : MessageLookupByLibrary.simpleMessage("Det finns inget att avisera om än."), - "This app is not authorized for use." : MessageLookupByLibrary.simpleMessage("Den här appen har inte auktoriserats för användning."), - "This course does not have any assignments or calendar events yet." : MessageLookupByLibrary.simpleMessage("Den här kursen har inga uppgifter eller kalenderhändelser än."), - "This file is unsupported and can’t be viewed through the app" : MessageLookupByLibrary.simpleMessage("Den här filen stöds inte och kan inte visas i appen"), - "This will unpair and remove all enrollments for this student from your account." : MessageLookupByLibrary.simpleMessage("Detta kommer att koppla från och ta bort alla registreringar för den här studenten från ditt konto."), - "Total Grade" : MessageLookupByLibrary.simpleMessage("Total omdöme"), - "Uh oh!" : MessageLookupByLibrary.simpleMessage("Oj då!"), - "Unable to fetch courses. Please check your connection and try again." : MessageLookupByLibrary.simpleMessage("Det gick inte att hämta kurser. Kontrollera din anslutning och försök igen."), - "Unable to load this image" : MessageLookupByLibrary.simpleMessage("Det går inte att läsa in den här bilden"), - "Unable to play this media file" : MessageLookupByLibrary.simpleMessage("Det går inte att spela upp den här mediefilen"), - "Unable to send message. Check your connection and try again." : MessageLookupByLibrary.simpleMessage("Det gick inte att skicka meddelandet. Kontrollera din anslutning och försök igen."), - "Under Construction" : MessageLookupByLibrary.simpleMessage("Under uppbyggnad"), - "Unknown User" : MessageLookupByLibrary.simpleMessage("Okänd användare"), - "Unsaved changes" : MessageLookupByLibrary.simpleMessage("Osparade ändringar"), - "Unsupported File" : MessageLookupByLibrary.simpleMessage("Filtyp som inte stöds"), - "Upload File" : MessageLookupByLibrary.simpleMessage("Ladda upp fil"), - "Use Camera" : MessageLookupByLibrary.simpleMessage("Använd kamera"), - "Use Dark Theme in Web Content" : MessageLookupByLibrary.simpleMessage("Använd mörkt tema i webbinnehållet"), - "User ID" : MessageLookupByLibrary.simpleMessage("Användar-ID"), - "User ID:" : MessageLookupByLibrary.simpleMessage("Användar-ID:"), - "Version Number" : MessageLookupByLibrary.simpleMessage("Versionsnummer"), - "View Description" : MessageLookupByLibrary.simpleMessage("Visa beskrivning"), - "View error details" : MessageLookupByLibrary.simpleMessage("Visa felinformation"), - "View the Privacy Policy" : MessageLookupByLibrary.simpleMessage("Visa sekretesspolicyn"), - "We are currently building this feature for your viewing pleasure." : MessageLookupByLibrary.simpleMessage("Vi bygger den här funktionen för dig."), - "We are unable to display this link, it may belong to an institution you currently aren\'t logged in to." : MessageLookupByLibrary.simpleMessage("Det går inte att visa den här länken. Den kan tillhöra en institution du för närvarande inte är inloggad på."), - "We couldn\'t find any students associated with this account" : MessageLookupByLibrary.simpleMessage("Det gick inte att hitta studenter kopplade till det här kontot"), - "We were unable to verify the server for use with this app." : MessageLookupByLibrary.simpleMessage("Vi kunde inte verifiera servern för användning med den här appen."), - "We’re not sure what happened, but it wasn’t good. Contact us if this keeps happening." : MessageLookupByLibrary.simpleMessage("Vi vet inte vad som hände, men det fungerar inte. Kontakta oss om detta fortsätter att inträffa."), - "What can we do better?" : MessageLookupByLibrary.simpleMessage("Vad kan vi förbättra?"), - "Yes" : MessageLookupByLibrary.simpleMessage("Ja"), - "You are not observing any students." : MessageLookupByLibrary.simpleMessage("Du observerar inga studenter."), - "You may only choose 10 calendars to display" : MessageLookupByLibrary.simpleMessage("Du kan endast välja 10 kalendrar att visa"), - "You must enter a user id" : MessageLookupByLibrary.simpleMessage("Du måste ange ett giltigt användar-ID"), - "You must enter a valid domain" : MessageLookupByLibrary.simpleMessage("Du måste ange en giltig domän"), - "You must select at least one calendar to display" : MessageLookupByLibrary.simpleMessage("Du måste välja minst en kalender att visa"), - "You will be notified about this assignment on…" : MessageLookupByLibrary.simpleMessage("Du kommer att få en notis om den här uppgiften på..."), - "You will be notified about this event on…" : MessageLookupByLibrary.simpleMessage("Du kommer att få en notis om den här händelsen den..."), - "You\'ll find the QR code on the web in your account profile. Click \'QR for Mobile Login\' in the list." : MessageLookupByLibrary.simpleMessage("Du hittar QR-koden på webben i din kontoprofil. Klicka på \"QR för mobil inloggning\" i listan."), - "You\'ll need to open your student\'s Canvas Student app to continue. Go into Main Menu > Settings > Pair with Observer and scan the QR code you see there." : MessageLookupByLibrary.simpleMessage("Du måste öppna din students Canvas Student-app för att fortsätta. Gå till Huvudmenyn > Inställningar > Parkoppla med observatör och skanna QR-koden du ser där."), - "Your code is incorrect or expired." : MessageLookupByLibrary.simpleMessage("Din kod är fel eller har gått ut."), - "Your student’s courses might not be published yet." : MessageLookupByLibrary.simpleMessage("Dina studentkurser kanske inte publicerats än."), - "You’re all caught up!" : MessageLookupByLibrary.simpleMessage("Du är helt i kapp!"), - "actingAsUser" : m0, - "alertsLabel" : MessageLookupByLibrary.simpleMessage("Notiser"), - "appVersion" : m1, - "assignmentGradeAboveThreshold" : m2, - "assignmentGradeBelowThreshold" : m3, - "assignmentLockedModule" : m4, - "assignmentSubjectMessage" : m5, - "assignmentTotalPoints" : m6, - "assignmentTotalPointsAccessible" : m7, - "authorToNOthers" : m8, - "authorToRecipient" : m9, - "authorToRecipientAndNOthers" : m10, - "badgeNumberPlus" : m11, - "calendarLabel" : MessageLookupByLibrary.simpleMessage("Kalender"), - "canvasGuides" : MessageLookupByLibrary.simpleMessage("Canvas-guider"), - "canvasLogoLabel" : MessageLookupByLibrary.simpleMessage("Canvas-logotyp"), - "canvasSupport" : MessageLookupByLibrary.simpleMessage("Canvas Support"), - "changeStudentColorLabel" : m12, - "collapse" : MessageLookupByLibrary.simpleMessage("dölj"), - "collapsed" : MessageLookupByLibrary.simpleMessage("minimerad"), - "contentDescriptionScoreOutOfPointsPossible" : m13, - "courseForWhom" : m14, - "courseGradeAboveThreshold" : m15, - "courseGradeBelowThreshold" : m16, - "coursesLabel" : MessageLookupByLibrary.simpleMessage("Kurser"), - "dateAtTime" : m17, - "dismissAlertLabel" : m18, - "domainSearchHelpBody" : m19, - "domainSearchHelpLabel" : MessageLookupByLibrary.simpleMessage("Hur hittar jag min skola eller distrikt?"), - "domainSearchInputHint" : MessageLookupByLibrary.simpleMessage("Ange skolans namn eller distrikt..."), - "dueDateAtTime" : m20, - "endMasqueradeLogoutMessage" : m21, - "endMasqueradeMessage" : m22, - "eventSubjectMessage" : m23, - "eventTime" : m24, - "expand" : MessageLookupByLibrary.simpleMessage("visa"), - "expanded" : MessageLookupByLibrary.simpleMessage("expanderad"), - "finalGrade" : m25, - "findSchool" : MessageLookupByLibrary.simpleMessage("Sök skola"), - "frontPageSubjectMessage" : m26, - "gradeFormatScoreOutOfPointsPossible" : m27, - "gradesSubjectMessage" : m28, - "latePenalty" : m29, - "me" : MessageLookupByLibrary.simpleMessage("jag"), - "messageLinkPostscript" : m30, - "minus" : MessageLookupByLibrary.simpleMessage("minus"), - "mustBeAboveN" : m31, - "mustBeBelowN" : m32, - "next" : MessageLookupByLibrary.simpleMessage("Nästa"), - "nextMonth" : m33, - "nextWeek" : m34, - "noDomainResults" : m35, - "ok" : MessageLookupByLibrary.simpleMessage("OK"), - "outOfPoints" : m36, - "plusRecipientCount" : m37, - "pointsPossible" : m38, - "previousMonth" : m39, - "previousWeek" : m40, - "qrCreateAccountTos" : m41, - "ratingDialogEmailSubject" : m42, - "selectedMonthLabel" : m43, - "send" : MessageLookupByLibrary.simpleMessage("skicka"), - "starRating" : m44, - "submissionStatusSuccessSubtitle" : m45, - "syllabusSubjectMessage" : m46, - "unread" : MessageLookupByLibrary.simpleMessage("olästa"), - "unreadCount" : m47 - }; -} diff --git a/apps/flutter_parent/lib/l10n/generated/messages_sv_instk12.dart b/apps/flutter_parent/lib/l10n/generated/messages_sv_instk12.dart deleted file mode 100644 index 59bffbb57a..0000000000 --- a/apps/flutter_parent/lib/l10n/generated/messages_sv_instk12.dart +++ /dev/null @@ -1,473 +0,0 @@ -// DO NOT EDIT. This is code generated via package:intl/generate_localized.dart -// This is a library that provides messages for a sv_instk12 locale. All the -// messages from the main program should be duplicated here with the same -// function name. - -// Ignore issues from commonly used lints in this file. -// ignore_for_file:unnecessary_brace_in_string_interps, unnecessary_new -// ignore_for_file:prefer_single_quotes,comment_references, directives_ordering -// ignore_for_file:annotate_overrides,prefer_generic_function_type_aliases -// ignore_for_file:unused_import, file_names - -import 'package:intl/intl.dart'; -import 'package:intl/message_lookup_by_library.dart'; - -final messages = new MessageLookup(); - -typedef String MessageIfAbsent(String messageStr, List args); - -class MessageLookup extends MessageLookupByLibrary { - String get localeName => 'sv_instk12'; - - static m0(userName) => "Du agerar som ${userName}"; - - static m1(version) => "v. ${version}"; - - static m2(threshold) => "Uppgiftsbedömning över ${threshold}"; - - static m3(threshold) => "Uppgiftsbedömning under ${threshold}"; - - static m4(moduleName) => "Den här uppgiften har låsts av modulen \"${moduleName}\"."; - - static m5(studentName, assignmentName) => "Angående : ${studentName}, uppgift – ${assignmentName}"; - - static m6(points) => "${points} poäng"; - - static m7(points) => "${points} poäng"; - - static m8(authorName, howMany) => "${Intl.plural(howMany, one: '${authorName} till 1 annan', other: '${authorName} till ${howMany} andra')}"; - - static m9(authorName, recipientName) => "${authorName} till ${recipientName}"; - - static m10(authorName, recipientName, howMany) => "${Intl.plural(howMany, one: '${authorName} till ${recipientName} och 1 annan', other: '${authorName} till ${recipientName} och ${howMany} andra')}"; - - static m11(count) => "${count}+"; - - static m12(studentName) => "Ändra färg för ${studentName}"; - - static m13(score, pointsPossible) => "${score} av ${pointsPossible} poäng"; - - static m14(studentShortName) => "för ${studentShortName}"; - - static m15(threshold) => "Kursbedömning över ${threshold}"; - - static m16(threshold) => "Kursbedömning under ${threshold}"; - - static m17(date, time) => "${date} kl. ${time}"; - - static m18(alertTitle) => "Avvisa ${alertTitle}"; - - static m19(canvasGuides, canvasSupport) => "Försök med att söka efter namnet på skolan eller distrikten du vill ansluta till, t.ex. “Allmänna skolan” eller “Skolor i Skåne”. Du kan även ange en Canvas-domän direkt, t.ex. “smith.instructure.com.”\n\nMer information om hur du kan hitta din institutions Canvas-konto finns på ${canvasGuides} eller kontakta ${canvasSupport} eller din skola för att få hjälp."; - - static m20(date, time) => "Ska lämnas in ${date} klockan ${time}"; - - static m21(userName) => "Du kommer att sluta agera som ${userName} och loggas ut."; - - static m22(userName) => "Du kommer att sluta agera som ${userName} och återgå till ditt ursprungliga konto."; - - static m23(studentName, eventTitle) => "Angående : ${studentName}, händelse – ${eventTitle}"; - - static m24(startAt, endAt) => "${startAt}/${endAt}"; - - static m25(grade) => "Slutbedömning: ${grade}"; - - static m26(studentName) => "Angående : ${studentName}, framsida"; - - static m27(score, pointsPossible) => "${score} / ${pointsPossible}"; - - static m28(studentName) => "Angående : ${studentName}, bedömningar"; - - static m29(pointsLost) => "Förseningsbestraffning (-${pointsLost})"; - - static m30(studentName, linkUrl) => "Angående : ${studentName}, ${linkUrl}"; - - static m31(percentage) => "Måste vara över ${percentage}"; - - static m32(percentage) => "Måste vara under ${percentage}"; - - static m33(month) => "Nästa månad: ${month}"; - - static m34(date) => "Nästa vecka börjar ${date}"; - - static m35(query) => "Det gick inte att hitta skolar som matchar \"${query}\""; - - static m36(points, howMany) => "${Intl.plural(howMany, one: 'En av 1 poäng', other: 'En av ${points} poäng')}"; - - static m37(count) => "+${count}"; - - static m38(points) => "${points} möjliga poäng"; - - static m39(month) => "Föregående månad: ${month}"; - - static m40(date) => "Föregående vecka startade ${date}"; - - static m41(termsOfService, privacyPolicy) => "Genom att trycka på Skapa konto samtycker du till ${termsOfService} och ${privacyPolicy}"; - - static m42(version) => "Förslag för Android – Canvas Parent ${version}"; - - static m43(month) => "Månaden ${month}"; - - static m44(position) => "${Intl.plural(position, one: '${position} stjärna', other: '${position} stjärnor')}"; - - static m45(date, time) => "Uppgiften lämnades in ${date} kl. ${time} och väntar på bedömning"; - - static m46(studentName) => "Angående : ${studentName}, kursöversikt"; - - static m47(count) => "${count} olästa"; - - final messages = _notInlinedMessages(_notInlinedMessages); - static _notInlinedMessages(_) => { - "\"Act as\" is essentially logging in as this user without a password. You will be able to take any action as if you were this user, and from other users\' points of views, it will be as if this user performed them. However, audit logs record that you were the one who performed the actions on behalf of this user." : MessageLookupByLibrary.simpleMessage("\"Att uppträda som\", loggar huvudsakligen in som den här användaren utan lösenord. Du kommer att kunna vidta åtgärder som om du var den här användaren, och från andra användares synpunkter kommer det att upplevas som om den här användaren utförde dem. I revisionsloggar registreras dock att du var den som utförde åtgärderna på den här användarens vägnar."), - "-" : MessageLookupByLibrary.simpleMessage("-"), - "A description is required." : MessageLookupByLibrary.simpleMessage("Beskrivning är obligatorisk."), - "A network error occurred when adding this student. Check your connection and try again." : MessageLookupByLibrary.simpleMessage("Ett nätverksfel inträffade när du lade till den här eleven. Kontrollera din anslutning och försök igen."), - "A subject is required." : MessageLookupByLibrary.simpleMessage("Ämne är obligatoriskt."), - "Act As User" : MessageLookupByLibrary.simpleMessage("Agera som användare"), - "Add Student" : MessageLookupByLibrary.simpleMessage("Lägg till elev"), - "Add attachment" : MessageLookupByLibrary.simpleMessage("Lägg till bilaga"), - "Add new student" : MessageLookupByLibrary.simpleMessage("Lägg till ny elev"), - "Add student with…" : MessageLookupByLibrary.simpleMessage("Lägg till elev med..."), - "Alert Settings" : MessageLookupByLibrary.simpleMessage("Notisinställningar"), - "Alert me when…" : MessageLookupByLibrary.simpleMessage("Notifiera mig om..."), - "All Grading Periods" : MessageLookupByLibrary.simpleMessage("Alla bedömningsperioder"), - "Already have an account? " : MessageLookupByLibrary.simpleMessage("Har du redan ett konto? "), - "An email address is required." : MessageLookupByLibrary.simpleMessage("E-postadressen är obligatorisk."), - "An error occurred when trying to display this link" : MessageLookupByLibrary.simpleMessage("Ett fel uppstod när länken skulle visas"), - "An error occurred while saving your selection. Please try again." : MessageLookupByLibrary.simpleMessage("Ett fel inträffade när ditt val sparades. Försök igen."), - "An unexpected error occurred" : MessageLookupByLibrary.simpleMessage("Ett oväntat fel inträffade"), - "Android OS version" : MessageLookupByLibrary.simpleMessage("Android AS-version"), - "Appearance" : MessageLookupByLibrary.simpleMessage("Utseende"), - "Application version" : MessageLookupByLibrary.simpleMessage("Programversion"), - "Are you a student or teacher?" : MessageLookupByLibrary.simpleMessage("Är du elev eller lärare?"), - "Are you sure you want to log out?" : MessageLookupByLibrary.simpleMessage("Vill du logga ut?"), - "Are you sure you wish to close this page? Your unsent message will be lost." : MessageLookupByLibrary.simpleMessage("Är du säker på att du vill stänga den här sidan? Ditt meddelande du ännu inte skickat kommer att tas bort."), - "Assignment Details" : MessageLookupByLibrary.simpleMessage("Uppgiftens detaljer"), - "Assignment grade above" : MessageLookupByLibrary.simpleMessage("Uppgiftsbedömning över"), - "Assignment grade below" : MessageLookupByLibrary.simpleMessage("Uppgiftsbedömning under"), - "Assignment missing" : MessageLookupByLibrary.simpleMessage("Uppgift saknas"), - "Barney, Fuschia" : MessageLookupByLibrary.simpleMessage("Barney, Fuschia"), - "Calendars" : MessageLookupByLibrary.simpleMessage("Kalendrar"), - "Camera Permission" : MessageLookupByLibrary.simpleMessage("Kamerabehörighet"), - "Cancel" : MessageLookupByLibrary.simpleMessage("Avbryt"), - "Canvas Student" : MessageLookupByLibrary.simpleMessage("Canvas-elev"), - "Canvas Teacher" : MessageLookupByLibrary.simpleMessage("Canvas-lärare"), - "Canvas on GitHub" : MessageLookupByLibrary.simpleMessage("Canvas på GitHub"), - "Choose a course to message" : MessageLookupByLibrary.simpleMessage("Välj en kurs att skicka meddelande till"), - "Choose from Gallery" : MessageLookupByLibrary.simpleMessage("Välj från galleri"), - "Complete" : MessageLookupByLibrary.simpleMessage("Fullgjord"), - "Contact Support" : MessageLookupByLibrary.simpleMessage("Kontakta support"), - "Course Announcement" : MessageLookupByLibrary.simpleMessage("Kursmeddelande"), - "Course Announcements" : MessageLookupByLibrary.simpleMessage("Kursmeddelande"), - "Course grade above" : MessageLookupByLibrary.simpleMessage("Kursbedömning över"), - "Course grade below" : MessageLookupByLibrary.simpleMessage("Kursbedömning under"), - "Create Account" : MessageLookupByLibrary.simpleMessage("Skapa konto"), - "Dark Mode" : MessageLookupByLibrary.simpleMessage("Mörkt läge"), - "Date" : MessageLookupByLibrary.simpleMessage("Datum"), - "Delete" : MessageLookupByLibrary.simpleMessage("Ta bort"), - "Description" : MessageLookupByLibrary.simpleMessage("Beskrivning"), - "Device" : MessageLookupByLibrary.simpleMessage("Enhet"), - "Device model" : MessageLookupByLibrary.simpleMessage("Enhetsmodell"), - "Domain" : MessageLookupByLibrary.simpleMessage("Domän"), - "Domain:" : MessageLookupByLibrary.simpleMessage("Domän:"), - "Don\'t show again" : MessageLookupByLibrary.simpleMessage("Visa inte igen"), - "Done" : MessageLookupByLibrary.simpleMessage("Klar"), - "Download" : MessageLookupByLibrary.simpleMessage("Ladda ned"), - "Due" : MessageLookupByLibrary.simpleMessage("Inlämningsdatum"), - "EXTREME CRITICAL EMERGENCY!!" : MessageLookupByLibrary.simpleMessage("EXTREMT KRITISKT NÖDFALL!!"), - "Electric, blue" : MessageLookupByLibrary.simpleMessage("Elektrisk, blå"), - "Email Address" : MessageLookupByLibrary.simpleMessage("E-postadress"), - "Email:" : MessageLookupByLibrary.simpleMessage("E-post:"), - "Email…" : MessageLookupByLibrary.simpleMessage("E-post …"), - "Enter the student pairing code provided to you. If the pairing code doesn\'t work, it may have expired" : MessageLookupByLibrary.simpleMessage("Ange den elevparkopplingskod du har fått. Om parkopplingskoden inte fungerar kan den ha gått ut"), - "Event" : MessageLookupByLibrary.simpleMessage("Händelse"), - "Excused" : MessageLookupByLibrary.simpleMessage("Ursäktad"), - "Expired QR Code" : MessageLookupByLibrary.simpleMessage("Utgången QR-kod"), - "Failed. Tap for options." : MessageLookupByLibrary.simpleMessage("Misslyckades. Tryck för alternativ."), - "Filter" : MessageLookupByLibrary.simpleMessage("Filtrera"), - "Filter by" : MessageLookupByLibrary.simpleMessage("Filtrera efter"), - "Fire, Orange" : MessageLookupByLibrary.simpleMessage("Eld, orange"), - "Front Page" : MessageLookupByLibrary.simpleMessage("Framsida"), - "Full Name" : MessageLookupByLibrary.simpleMessage("Fullständigt namn"), - "Full Name…" : MessageLookupByLibrary.simpleMessage("Fullständigt namn ..."), - "Full error message" : MessageLookupByLibrary.simpleMessage("Fullständigt felmeddelande"), - "Go to today" : MessageLookupByLibrary.simpleMessage("Gå till i dag"), - "Grade" : MessageLookupByLibrary.simpleMessage("Bedömning"), - "Grade percentage" : MessageLookupByLibrary.simpleMessage("Bedömningsprocent"), - "Graded" : MessageLookupByLibrary.simpleMessage("Har bedömts"), - "Grades" : MessageLookupByLibrary.simpleMessage("Bedömningar"), - "Help" : MessageLookupByLibrary.simpleMessage("Hjälp"), - "Hide Password" : MessageLookupByLibrary.simpleMessage("Dölj lösenord"), - "High Contrast Mode" : MessageLookupByLibrary.simpleMessage("Högt kontrastläge"), - "How are we doing?" : MessageLookupByLibrary.simpleMessage("Hur går det för oss?"), - "How is this affecting you?" : MessageLookupByLibrary.simpleMessage("Hur påverkar detta dig?"), - "I can\'t get things done until I hear back from you." : MessageLookupByLibrary.simpleMessage("Jag kan inte göra något tills jag hör ifrån er."), - "I don\'t have a Canvas account" : MessageLookupByLibrary.simpleMessage("Jag har inte ett Canvas-konto"), - "I have a Canvas account" : MessageLookupByLibrary.simpleMessage("Jag har ett Canvas-konto"), - "I need some help but it\'s not urgent." : MessageLookupByLibrary.simpleMessage("Jag behöver hjälp men det är inte bråttom."), - "I\'m having trouble logging in" : MessageLookupByLibrary.simpleMessage("Jag kan inte logga in"), - "Idea for Canvas Parent App [Android]" : MessageLookupByLibrary.simpleMessage("Idéer för appen Canvas Parent [Android]"), - "In order to provide you with a better experience, we have updated how reminders work. You can add new reminders by viewing an assignment or calendar event and tapping the switch under the \"Remind Me\" section.\n\nBe aware that any reminders created with older versions of this app will not be compatible with the new changes and you will need to create them again." : MessageLookupByLibrary.simpleMessage("För att tillhandahålla dig en förbättrad upplevelse har vi uppdaterat påminnelsefunktionen. Du kan lägga till nya påminnelser genom att visa en uppgift eller en kalenderhändelse och trycka på reglaget under avsnittet \"Påminn mig\".\n\nTänk på att påminnelser som skapats i äldre versionen av den här appen inte är kompatibla med de nya ändringarna och måste därför skapas om igen."), - "Inbox" : MessageLookupByLibrary.simpleMessage("Inkorg"), - "Inbox Zero" : MessageLookupByLibrary.simpleMessage("Inkorg noll"), - "Incomplete" : MessageLookupByLibrary.simpleMessage("Ej fullständig"), - "Incorrect Domain" : MessageLookupByLibrary.simpleMessage("Felaktig domän"), - "Institution Announcement" : MessageLookupByLibrary.simpleMessage("Institutionsmeddelande"), - "Institution Announcements" : MessageLookupByLibrary.simpleMessage("Institutionsmeddelande"), - "Instructions" : MessageLookupByLibrary.simpleMessage("Instruktioner"), - "Interactions on this page are limited by your institution." : MessageLookupByLibrary.simpleMessage("Interaktioner på den här sidan har begränsats av din institution."), - "Invalid QR Code" : MessageLookupByLibrary.simpleMessage("Ogiltig QR-kod"), - "It looks like a great day to rest, relax, and recharge." : MessageLookupByLibrary.simpleMessage("Det verkar vara en bra dag för vila, avslappning och omladdning."), - "It looks like assignments haven\'t been created in this space yet." : MessageLookupByLibrary.simpleMessage("Det verkar som om inga uppgifter har skapats för den här platsen än."), - "Just a casual question, comment, idea, suggestion…" : MessageLookupByLibrary.simpleMessage("Bara en vanlig fråga, kommentar, idé, förslag ..."), - "Late" : MessageLookupByLibrary.simpleMessage("Sen"), - "Launch External Tool" : MessageLookupByLibrary.simpleMessage("Starta externt verktyg"), - "Legal" : MessageLookupByLibrary.simpleMessage("Juridik"), - "Light Mode" : MessageLookupByLibrary.simpleMessage("Ljust läge"), - "Link Error" : MessageLookupByLibrary.simpleMessage("Länkfel"), - "Locale:" : MessageLookupByLibrary.simpleMessage("Plats:"), - "Locate QR Code" : MessageLookupByLibrary.simpleMessage("Lokalisera QR-kod"), - "Location" : MessageLookupByLibrary.simpleMessage("Plats"), - "Locked" : MessageLookupByLibrary.simpleMessage("Låst"), - "Log Out" : MessageLookupByLibrary.simpleMessage("Logga ut"), - "Login flow: Canvas" : MessageLookupByLibrary.simpleMessage("Inloggningsflöde: Canvas"), - "Login flow: Normal" : MessageLookupByLibrary.simpleMessage("Inloggningsflöde: Normal"), - "Login flow: Site Admin" : MessageLookupByLibrary.simpleMessage("Inloggningsflöde: Webbplatsadmin"), - "Login flow: Skip mobile verify" : MessageLookupByLibrary.simpleMessage("Inloggningsflöde: Hoppa över mobilverifiering"), - "Manage Students" : MessageLookupByLibrary.simpleMessage("Hantera elever"), - "Message" : MessageLookupByLibrary.simpleMessage("Meddelande"), - "Message subject" : MessageLookupByLibrary.simpleMessage("Meddelandeämne"), - "Missing" : MessageLookupByLibrary.simpleMessage("Saknad"), - "Must be below 100" : MessageLookupByLibrary.simpleMessage("Måste vara under 100"), - "Network error" : MessageLookupByLibrary.simpleMessage("Nätverksfel"), - "Never" : MessageLookupByLibrary.simpleMessage("Aldrig"), - "New message" : MessageLookupByLibrary.simpleMessage("Nytt meddelande"), - "No" : MessageLookupByLibrary.simpleMessage("Nej"), - "No Alerts" : MessageLookupByLibrary.simpleMessage("Inga notiser"), - "No Assignments" : MessageLookupByLibrary.simpleMessage("Inga uppgifter"), - "No Courses" : MessageLookupByLibrary.simpleMessage("Inga kurser"), - "No Due Date" : MessageLookupByLibrary.simpleMessage("Inget inlämningsdatum"), - "No Events Today!" : MessageLookupByLibrary.simpleMessage("Inga händelser idag!"), - "No Grade" : MessageLookupByLibrary.simpleMessage("Ingen bedömning"), - "No Location Specified" : MessageLookupByLibrary.simpleMessage("Ingen plats specificerad"), - "No Students" : MessageLookupByLibrary.simpleMessage("Inga elever"), - "No Subject" : MessageLookupByLibrary.simpleMessage("Inget ämne"), - "No Summary" : MessageLookupByLibrary.simpleMessage("Ingen sammanfattning"), - "No description" : MessageLookupByLibrary.simpleMessage("Ingen beskrivning"), - "No recipients selected" : MessageLookupByLibrary.simpleMessage("Inga mottagare har valts"), - "Not Graded" : MessageLookupByLibrary.simpleMessage("Inte bedömd"), - "Not Submitted" : MessageLookupByLibrary.simpleMessage("Inte inlämnad"), - "Not a parent?" : MessageLookupByLibrary.simpleMessage("Är du inte vårdnadshavare?"), - "Notifications for reminders about assignments and calendar events" : MessageLookupByLibrary.simpleMessage("Påminnelsenotiser om uppgifter och kalenderhändelser"), - "OS Version" : MessageLookupByLibrary.simpleMessage("Operativsystemets version"), - "Observer" : MessageLookupByLibrary.simpleMessage("Observatör"), - "One of our other apps might be a better fit. Tap one to visit the Play Store." : MessageLookupByLibrary.simpleMessage("Någon av våra andra appar kan vara bättre lämpade. Tryck på en för att besöka Play Store."), - "Open Canvas Student" : MessageLookupByLibrary.simpleMessage("Öppna Canvas Elev"), - "Open In Browser" : MessageLookupByLibrary.simpleMessage("Öppna i webbläsare"), - "Open with another app" : MessageLookupByLibrary.simpleMessage("Öppna med en annan app"), - "Pairing Code" : MessageLookupByLibrary.simpleMessage("Parkopplingskod"), - "Password" : MessageLookupByLibrary.simpleMessage("Lösenord"), - "Password is required" : MessageLookupByLibrary.simpleMessage("Lösenord krävs"), - "Password must contain at least 8 characters" : MessageLookupByLibrary.simpleMessage("Lösenord måste innehålla minst 8 tecken"), - "Password…" : MessageLookupByLibrary.simpleMessage("Lösenord ..."), - "Planner Note" : MessageLookupByLibrary.simpleMessage("Planner-anteckning"), - "Please enter a valid email address" : MessageLookupByLibrary.simpleMessage("Ange en giltig e-postadress"), - "Please enter an email address" : MessageLookupByLibrary.simpleMessage("Ange en e-postadress"), - "Please enter full name" : MessageLookupByLibrary.simpleMessage("Ange fullständigt namn"), - "Please scan a QR code generated by Canvas" : MessageLookupByLibrary.simpleMessage("Skanna en QR-kod som genererats i Canvas."), - "Plum, Purple" : MessageLookupByLibrary.simpleMessage("Plommon, lila"), - "Preparing…" : MessageLookupByLibrary.simpleMessage("Förbereder..."), - "Previous Logins" : MessageLookupByLibrary.simpleMessage("Tidigare inloggningar"), - "Privacy Policy" : MessageLookupByLibrary.simpleMessage("Integritetspolicy"), - "Privacy Policy Link" : MessageLookupByLibrary.simpleMessage("Länk till sekretesspolicy"), - "Privacy policy, terms of use, open source" : MessageLookupByLibrary.simpleMessage("Integritetspolicy, användarvillkor, öppen källkod"), - "QR Code" : MessageLookupByLibrary.simpleMessage("QR-kod"), - "QR scanning requires camera access" : MessageLookupByLibrary.simpleMessage("QR-skanning kräver kameraåtkomst"), - "Raspberry, Red" : MessageLookupByLibrary.simpleMessage("Hallon, röd"), - "Recipients" : MessageLookupByLibrary.simpleMessage("Mottagare"), - "Refresh" : MessageLookupByLibrary.simpleMessage("Uppdatera"), - "Remind Me" : MessageLookupByLibrary.simpleMessage("Påminn mig"), - "Reminders" : MessageLookupByLibrary.simpleMessage("Påminnelser"), - "Reminders have changed!" : MessageLookupByLibrary.simpleMessage("Påminnelser har ändrats!"), - "Reply" : MessageLookupByLibrary.simpleMessage("Svara"), - "Reply All" : MessageLookupByLibrary.simpleMessage("Svara alla"), - "Report A Problem" : MessageLookupByLibrary.simpleMessage("Rapportera ett problem"), - "Request Login Help" : MessageLookupByLibrary.simpleMessage("Begär hjälp med inloggning"), - "Request Login Help Button" : MessageLookupByLibrary.simpleMessage("Hjälpknapp för inloggningsförfrågningar"), - "Restart app" : MessageLookupByLibrary.simpleMessage("Starta om appen"), - "Retry" : MessageLookupByLibrary.simpleMessage("Försök igen"), - "Return to Login" : MessageLookupByLibrary.simpleMessage("Gå tillbaka till inloggning"), - "STUDENT" : MessageLookupByLibrary.simpleMessage("ELEV"), - "Screenshot showing location of QR code generation in browser" : MessageLookupByLibrary.simpleMessage("Skärmdumpen visar platsen för QR-kodgenerering i webbläsaren"), - "Screenshot showing location of pairing QR code generation in the Canvas Student app" : MessageLookupByLibrary.simpleMessage("Skärmbild som visar var QR-kodens parkopplingsgenerering görs i Canvas Elev-appen"), - "Select" : MessageLookupByLibrary.simpleMessage("Välj"), - "Select Student Color" : MessageLookupByLibrary.simpleMessage("Välj elevfärg"), - "Select recipients" : MessageLookupByLibrary.simpleMessage("Välj mottagare"), - "Send Feedback" : MessageLookupByLibrary.simpleMessage("Skicka återkoppling"), - "Send a message about this assignment" : MessageLookupByLibrary.simpleMessage("Skicka ett meddelande om den här kursen"), - "Send a message about this course" : MessageLookupByLibrary.simpleMessage("Skicka ett meddelande om den här kursen"), - "Send message" : MessageLookupByLibrary.simpleMessage("Skicka meddelandet"), - "Set a date and time to be notified of this event." : MessageLookupByLibrary.simpleMessage("Ange ett datum och tid för att få en notis för den här händelsen."), - "Set a date and time to be notified of this specific assignment." : MessageLookupByLibrary.simpleMessage("Ange ett datum och tid för att få en notis för den här specifika uppgiften."), - "Settings" : MessageLookupByLibrary.simpleMessage("Inställningar"), - "Shamrock, Green" : MessageLookupByLibrary.simpleMessage("Klöver, grön"), - "Share Your Love for the App" : MessageLookupByLibrary.simpleMessage("Dela din kärlek till appen"), - "Show Password" : MessageLookupByLibrary.simpleMessage("Visa lösenord"), - "Sign In" : MessageLookupByLibrary.simpleMessage("Logga in"), - "Something went wrong trying to create your account, please reach out to your school for assistance." : MessageLookupByLibrary.simpleMessage("Något gick fel när ditt konto skulle skapas. Kontakta din skola för hjälp."), - "Something\'s broken but I can work around it to get what I need done." : MessageLookupByLibrary.simpleMessage("Det är något som inte fungerar men jag kan göra det jag ska ändå."), - "Stop Acting as User" : MessageLookupByLibrary.simpleMessage("Sluta att agera som en användare"), - "Student" : MessageLookupByLibrary.simpleMessage("Elev"), - "Student Pairing" : MessageLookupByLibrary.simpleMessage("Elev-parkoppling"), - "Students can create a QR code using the Canvas Student app on their mobile device" : MessageLookupByLibrary.simpleMessage("Elever kan skapa en QR-kod i Canvas Elev-appen i sina mobiler."), - "Students can obtain a pairing code through the Canvas website" : MessageLookupByLibrary.simpleMessage("Elever kan få en parkopplingskod genom att använda Canvas Elev-appen i sina mobiler."), - "Subject" : MessageLookupByLibrary.simpleMessage("Ämne"), - "Submitted" : MessageLookupByLibrary.simpleMessage("Inskickad"), - "Successfully submitted!" : MessageLookupByLibrary.simpleMessage("Uppgiften har skickats in!"), - "Summary" : MessageLookupByLibrary.simpleMessage("Sammanfattning"), - "Switch Users" : MessageLookupByLibrary.simpleMessage("Växla användare"), - "Syllabus" : MessageLookupByLibrary.simpleMessage("Kursöversikt"), - "TA" : MessageLookupByLibrary.simpleMessage("Lärarassistent"), - "TEACHER" : MessageLookupByLibrary.simpleMessage("LÄRARE"), - "Tap to favorite the courses you want to see on the Calendar. Select up to 10." : MessageLookupByLibrary.simpleMessage("Tryck för att favoritmarkera de kurser du vill se i kalendern. Välj upp till 10."), - "Tap to pair with a new student" : MessageLookupByLibrary.simpleMessage("Tryck för att koppla samman med en ny elev"), - "Tap to select this student" : MessageLookupByLibrary.simpleMessage("Tryck för att välja den här eleven"), - "Tap to show student selector" : MessageLookupByLibrary.simpleMessage("Tryck för att visa elevväljare"), - "Teacher" : MessageLookupByLibrary.simpleMessage("Lärare"), - "Tell us about your favorite parts of the app" : MessageLookupByLibrary.simpleMessage("Berätta vad du tycker om mest med appen"), - "Terms of Service" : MessageLookupByLibrary.simpleMessage("Tjänstvillkor"), - "Terms of Service Link" : MessageLookupByLibrary.simpleMessage("Länk till tjänstvillkor"), - "Terms of Use" : MessageLookupByLibrary.simpleMessage("Användningsvillkor"), - "The QR code you scanned may have expired. Refresh the code on the student\'s device and try again." : MessageLookupByLibrary.simpleMessage("QR-koden du skannade kan har gått ut. Uppdatera koden på elevens enhet och försök igen."), - "The following information will help us better understand your idea:" : MessageLookupByLibrary.simpleMessage("Följande information kommer att hjälpa oss att förstå din idé bättre:"), - "The server you entered is not authorized for this app." : MessageLookupByLibrary.simpleMessage("Den server du har angett har inte auktoriserats för den här appen."), - "The student you are trying to add belongs to a different school. Log in or create an account with that school to scan this code." : MessageLookupByLibrary.simpleMessage("Eleven du försöker lägga tillhör en annan skola. Logga in eller skapa ett konto med den skolans för att skanna den här koden."), - "The user agent for this app is not authorized." : MessageLookupByLibrary.simpleMessage("Användaragenten för den här appen är inte auktoriserad."), - "Theme" : MessageLookupByLibrary.simpleMessage("Tema"), - "There are no installed applications that can open this file" : MessageLookupByLibrary.simpleMessage("Det finns inga installerade program som kan öppna den här filen"), - "There is no page information available." : MessageLookupByLibrary.simpleMessage("Det finns ingen sidinformation tillgänglig."), - "There was a problem loading the Terms of Use" : MessageLookupByLibrary.simpleMessage("Det gick inte att läsa in användarvillkoren"), - "There was a problem removing this student from your account. Please check your connection and try again." : MessageLookupByLibrary.simpleMessage("Det gick inte att ta bort eleven från ditt konto. Kontrollera din anslutning och försök igen."), - "There was an error loading recipients for this course" : MessageLookupByLibrary.simpleMessage("Det gick inte att läsa in mottagare för den här kursen"), - "There was an error loading the summary details for this course." : MessageLookupByLibrary.simpleMessage("Det gick inte att läsa in sammanfattningsinformationen för den här kursen."), - "There was an error loading this announcement" : MessageLookupByLibrary.simpleMessage("Det gick inte att läsa in det här meddelandet"), - "There was an error loading this conversation" : MessageLookupByLibrary.simpleMessage("Det gick inte att läsa in den här konversationen"), - "There was an error loading this file" : MessageLookupByLibrary.simpleMessage("Det gick inte att läsa in den här filen"), - "There was an error loading your inbox messages." : MessageLookupByLibrary.simpleMessage("Det gick inte att läsa in dina meddelanden i inkorgen."), - "There was an error loading your student\'s alerts." : MessageLookupByLibrary.simpleMessage("Det gick inte att läsa in din elevs notiser."), - "There was an error loading your student\'s calendar" : MessageLookupByLibrary.simpleMessage("Det gick inte att läsa in din elevkalender."), - "There was an error loading your students." : MessageLookupByLibrary.simpleMessage("Det gick inte att läsa in dina elever."), - "There was an error loading your student’s courses." : MessageLookupByLibrary.simpleMessage("Det gick inte att läsa in din elevs kurser."), - "There was an error logging in. Please generate another QR Code and try again." : MessageLookupByLibrary.simpleMessage("Det gick inte att logga in. Generera en annan QR-kod och försök igen."), - "There was an error trying to act as this user. Please check the Domain and User ID and try again." : MessageLookupByLibrary.simpleMessage("Ett fel inträffade under Agera som den här användaren. Kontrollera domänen och användar-ID:t och försök igen."), - "There’s nothing to be notified of yet." : MessageLookupByLibrary.simpleMessage("Det finns inget att avisera om än."), - "This app is not authorized for use." : MessageLookupByLibrary.simpleMessage("Den här appen har inte auktoriserats för användning."), - "This course does not have any assignments or calendar events yet." : MessageLookupByLibrary.simpleMessage("Den här kursen har inga uppgifter eller kalenderhändelser än."), - "This file is unsupported and can’t be viewed through the app" : MessageLookupByLibrary.simpleMessage("Den här filen stöds inte och kan inte visas i appen"), - "This will unpair and remove all enrollments for this student from your account." : MessageLookupByLibrary.simpleMessage("Detta kommer att koppla från och ta bort alla registreringar för den här Eleven från ditt konto."), - "Total Grade" : MessageLookupByLibrary.simpleMessage("Totalt bedömning"), - "Uh oh!" : MessageLookupByLibrary.simpleMessage("Oj då!"), - "Unable to fetch courses. Please check your connection and try again." : MessageLookupByLibrary.simpleMessage("Det gick inte att hämta kurser. Kontrollera din anslutning och försök igen."), - "Unable to load this image" : MessageLookupByLibrary.simpleMessage("Det går inte att läsa in den här bilden"), - "Unable to play this media file" : MessageLookupByLibrary.simpleMessage("Det går inte att spela upp den här mediefilen"), - "Unable to send message. Check your connection and try again." : MessageLookupByLibrary.simpleMessage("Det gick inte att skicka meddelandet. Kontrollera din anslutning och försök igen."), - "Under Construction" : MessageLookupByLibrary.simpleMessage("Under uppbyggnad"), - "Unknown User" : MessageLookupByLibrary.simpleMessage("Okänd användare"), - "Unsaved changes" : MessageLookupByLibrary.simpleMessage("Osparade ändringar"), - "Unsupported File" : MessageLookupByLibrary.simpleMessage("Filtyp som inte stöds"), - "Upload File" : MessageLookupByLibrary.simpleMessage("Ladda upp fil"), - "Use Camera" : MessageLookupByLibrary.simpleMessage("Använd kamera"), - "Use Dark Theme in Web Content" : MessageLookupByLibrary.simpleMessage("Använd mörkt tema i webbinnehållet"), - "User ID" : MessageLookupByLibrary.simpleMessage("Användar-ID"), - "User ID:" : MessageLookupByLibrary.simpleMessage("Användar-ID:"), - "Version Number" : MessageLookupByLibrary.simpleMessage("Versionsnummer"), - "View Description" : MessageLookupByLibrary.simpleMessage("Visa beskrivning"), - "View error details" : MessageLookupByLibrary.simpleMessage("Visa felinformation"), - "View the Privacy Policy" : MessageLookupByLibrary.simpleMessage("Visa sekretesspolicyn"), - "We are currently building this feature for your viewing pleasure." : MessageLookupByLibrary.simpleMessage("Vi bygger den här funktionen för dig."), - "We are unable to display this link, it may belong to an institution you currently aren\'t logged in to." : MessageLookupByLibrary.simpleMessage("Det går inte att visa den här länken. Den kan tillhöra en institution du för närvarande inte är inloggad på."), - "We couldn\'t find any students associated with this account" : MessageLookupByLibrary.simpleMessage("Det gick inte att hitta elever kopplade till det här kontot"), - "We were unable to verify the server for use with this app." : MessageLookupByLibrary.simpleMessage("Vi kunde inte verifiera servern för användning med den här appen."), - "We’re not sure what happened, but it wasn’t good. Contact us if this keeps happening." : MessageLookupByLibrary.simpleMessage("Vi vet inte vad som hände, men det fungerar inte. Kontakta oss om detta fortsätter att inträffa."), - "What can we do better?" : MessageLookupByLibrary.simpleMessage("Vad kan vi förbättra?"), - "Yes" : MessageLookupByLibrary.simpleMessage("Ja"), - "You are not observing any students." : MessageLookupByLibrary.simpleMessage("Du observerar inga elever."), - "You may only choose 10 calendars to display" : MessageLookupByLibrary.simpleMessage("Du kan endast välja 10 kalendrar att visa"), - "You must enter a user id" : MessageLookupByLibrary.simpleMessage("Du måste ange ett giltigt användar-ID"), - "You must enter a valid domain" : MessageLookupByLibrary.simpleMessage("Du måste ange en giltig domän"), - "You must select at least one calendar to display" : MessageLookupByLibrary.simpleMessage("Du måste välja minst en kalender att visa"), - "You will be notified about this assignment on…" : MessageLookupByLibrary.simpleMessage("Du kommer att få en notis om den här uppgiften på..."), - "You will be notified about this event on…" : MessageLookupByLibrary.simpleMessage("Du kommer att få en notis om den här händelsen den..."), - "You\'ll find the QR code on the web in your account profile. Click \'QR for Mobile Login\' in the list." : MessageLookupByLibrary.simpleMessage("Du hittar QR-koden på webben i din kontoprofil. Klicka på \"QR för mobil inloggning\" i listan."), - "You\'ll need to open your student\'s Canvas Student app to continue. Go into Main Menu > Settings > Pair with Observer and scan the QR code you see there." : MessageLookupByLibrary.simpleMessage("Du måste öppna din Elevs Canvas Elev-app för att fortsätta. Gå till Huvudmenyn > Inställningar > Parkoppla med observatör och skanna QR-koden du ser där."), - "Your code is incorrect or expired." : MessageLookupByLibrary.simpleMessage("Din kod är fel eller har gått ut."), - "Your student’s courses might not be published yet." : MessageLookupByLibrary.simpleMessage("Dina elevkurser kanske inte publicerats än."), - "You’re all caught up!" : MessageLookupByLibrary.simpleMessage("Du är helt i kapp!"), - "actingAsUser" : m0, - "alertsLabel" : MessageLookupByLibrary.simpleMessage("Notiser"), - "appVersion" : m1, - "assignmentGradeAboveThreshold" : m2, - "assignmentGradeBelowThreshold" : m3, - "assignmentLockedModule" : m4, - "assignmentSubjectMessage" : m5, - "assignmentTotalPoints" : m6, - "assignmentTotalPointsAccessible" : m7, - "authorToNOthers" : m8, - "authorToRecipient" : m9, - "authorToRecipientAndNOthers" : m10, - "badgeNumberPlus" : m11, - "calendarLabel" : MessageLookupByLibrary.simpleMessage("Kalender"), - "canvasGuides" : MessageLookupByLibrary.simpleMessage("Canvas-guider"), - "canvasLogoLabel" : MessageLookupByLibrary.simpleMessage("Canvas-logotyp"), - "canvasSupport" : MessageLookupByLibrary.simpleMessage("Canvas Support"), - "changeStudentColorLabel" : m12, - "collapse" : MessageLookupByLibrary.simpleMessage("dölj"), - "collapsed" : MessageLookupByLibrary.simpleMessage("minimerad"), - "contentDescriptionScoreOutOfPointsPossible" : m13, - "courseForWhom" : m14, - "courseGradeAboveThreshold" : m15, - "courseGradeBelowThreshold" : m16, - "coursesLabel" : MessageLookupByLibrary.simpleMessage("Kurser"), - "dateAtTime" : m17, - "dismissAlertLabel" : m18, - "domainSearchHelpBody" : m19, - "domainSearchHelpLabel" : MessageLookupByLibrary.simpleMessage("Hur hittar jag min skola eller distrikt?"), - "domainSearchInputHint" : MessageLookupByLibrary.simpleMessage("Ange skolans namn eller distrikt..."), - "dueDateAtTime" : m20, - "endMasqueradeLogoutMessage" : m21, - "endMasqueradeMessage" : m22, - "eventSubjectMessage" : m23, - "eventTime" : m24, - "expand" : MessageLookupByLibrary.simpleMessage("visa"), - "expanded" : MessageLookupByLibrary.simpleMessage("expanderad"), - "finalGrade" : m25, - "findSchool" : MessageLookupByLibrary.simpleMessage("Sök skola"), - "frontPageSubjectMessage" : m26, - "gradeFormatScoreOutOfPointsPossible" : m27, - "gradesSubjectMessage" : m28, - "latePenalty" : m29, - "me" : MessageLookupByLibrary.simpleMessage("jag"), - "messageLinkPostscript" : m30, - "minus" : MessageLookupByLibrary.simpleMessage("minus"), - "mustBeAboveN" : m31, - "mustBeBelowN" : m32, - "next" : MessageLookupByLibrary.simpleMessage("Nästa"), - "nextMonth" : m33, - "nextWeek" : m34, - "noDomainResults" : m35, - "ok" : MessageLookupByLibrary.simpleMessage("OK"), - "outOfPoints" : m36, - "plusRecipientCount" : m37, - "pointsPossible" : m38, - "previousMonth" : m39, - "previousWeek" : m40, - "qrCreateAccountTos" : m41, - "ratingDialogEmailSubject" : m42, - "selectedMonthLabel" : m43, - "send" : MessageLookupByLibrary.simpleMessage("skicka"), - "starRating" : m44, - "submissionStatusSuccessSubtitle" : m45, - "syllabusSubjectMessage" : m46, - "unread" : MessageLookupByLibrary.simpleMessage("olästa"), - "unreadCount" : m47 - }; -} diff --git a/apps/flutter_parent/lib/l10n/generated/messages_zh.dart b/apps/flutter_parent/lib/l10n/generated/messages_zh.dart deleted file mode 100644 index f949d4c355..0000000000 --- a/apps/flutter_parent/lib/l10n/generated/messages_zh.dart +++ /dev/null @@ -1,473 +0,0 @@ -// DO NOT EDIT. This is code generated via package:intl/generate_localized.dart -// This is a library that provides messages for a zh locale. All the -// messages from the main program should be duplicated here with the same -// function name. - -// Ignore issues from commonly used lints in this file. -// ignore_for_file:unnecessary_brace_in_string_interps, unnecessary_new -// ignore_for_file:prefer_single_quotes,comment_references, directives_ordering -// ignore_for_file:annotate_overrides,prefer_generic_function_type_aliases -// ignore_for_file:unused_import, file_names - -import 'package:intl/intl.dart'; -import 'package:intl/message_lookup_by_library.dart'; - -final messages = new MessageLookup(); - -typedef String MessageIfAbsent(String messageStr, List args); - -class MessageLookup extends MessageLookupByLibrary { - String get localeName => 'zh'; - - static m0(userName) => "您正在临时代理${userName}"; - - static m1(version) => "v. ${version}"; - - static m2(threshold) => "作业评分高于${threshold}"; - - static m3(threshold) => "作业评分低于${threshold}"; - - static m4(moduleName) => "此作业已被模块“${moduleName}”锁定。"; - - static m5(studentName, assignmentName) => "事由:${studentName},作业 - ${assignmentName}"; - - static m6(points) => "${points} 分"; - - static m7(points) => "${points} 分"; - - static m8(authorName, howMany) => "${Intl.plural(howMany, one: '${authorName}至另外1个', other: '${authorName}至另外${howMany}个')}"; - - static m9(authorName, recipientName) => "${authorName} 至 ${recipientName}"; - - static m10(authorName, recipientName, howMany) => "${Intl.plural(howMany, one: '${authorName}至${recipientName}和另外1个', other: '${authorName}至${recipientName}和另外${howMany}个')}"; - - static m11(count) => "${count}+"; - - static m12(studentName) => "更改 ${studentName} 的颜色"; - - static m13(score, pointsPossible) => "得分 ${score},总分 ${pointsPossible}"; - - static m14(studentShortName) => "适用于${studentShortName}"; - - static m15(threshold) => "课程评分高于${threshold}"; - - static m16(threshold) => "课程评分低于${threshold}"; - - static m17(date, time) => "${date},时间 ${time}"; - - static m18(alertTitle) => "拒绝 ${alertTitle}"; - - static m19(canvasGuides, canvasSupport) => "尝试搜索您要访问的学校或校区的名称,例如“Smith Private School”或“Smith County Schools”。也可以直接输入Canvas域,例如“smith.instructure.com”。\n\n有关查找机构Canvas账户的更多信息,可访问${canvasGuides}、联系${canvasSupport}或您的学校寻求帮助。"; - - static m20(date, time) => "截止于 ${date},${time}"; - - static m21(userName) => "您将停止临时代理用户 ${userName} 并注销。"; - - static m22(userName) => "您将停止临时代理用户 ${userName} 并返回您的原始帐户。"; - - static m23(studentName, eventTitle) => "事由:${studentName},活动 - ${eventTitle}"; - - static m24(startAt, endAt) => "${startAt} - ${endAt}"; - - static m25(grade) => "最终评分:${grade}"; - - static m26(studentName) => "事由:${studentName},首页"; - - static m27(score, pointsPossible) => "${score}/${pointsPossible}"; - - static m28(studentName) => "事由:${studentName},评分"; - - static m29(pointsLost) => "迟交罚分 (-${pointsLost})"; - - static m30(studentName, linkUrl) => "事由:${studentName},${linkUrl}"; - - static m31(percentage) => "必须高于${percentage}"; - - static m32(percentage) => "必须低于${percentage}"; - - static m33(month) => "下个月:${month}"; - - static m34(date) => "下周,从${date}开始"; - - static m35(query) => "找不到与“${query}”匹配的学校"; - - static m36(points, howMany) => "${Intl.plural(howMany, one: '共1分', other: '共${points}分')}"; - - static m37(count) => "+${count}"; - - static m38(points) => "${points}满分"; - - static m39(month) => "上个月:${month}"; - - static m40(date) => "上周,从${date}开始"; - - static m41(termsOfService, privacyPolicy) => "点击“创建帐户”即表示,您同意${termsOfService}并确认${privacyPolicy}"; - - static m42(version) => "Android 版本建议 - Canvas Parent ${version}"; - - static m43(month) => "${month}月"; - - static m44(position) => "${Intl.plural(position, one: '${position} 星', other: '${position} 星')}"; - - static m45(date, time) => "此作业提交时间为${date},${time},正在等待评分"; - - static m46(studentName) => "事由:${studentName},教学大纲"; - - static m47(count) => "${count}未读"; - - final messages = _notInlinedMessages(_notInlinedMessages); - static _notInlinedMessages(_) => { - "\"Act as\" is essentially logging in as this user without a password. You will be able to take any action as if you were this user, and from other users\' points of views, it will be as if this user performed them. However, audit logs record that you were the one who performed the actions on behalf of this user." : MessageLookupByLibrary.simpleMessage("“临时代理”实际上已经登录,因为该用户没有密码。您能够像此用户一样执行任何操作,从另一位用户的角度来讲,这将视同由此用户执行这些操作。但是,审计日志记录您是代表该用户执行操作的人。"), - "-" : MessageLookupByLibrary.simpleMessage("-"), - "A description is required." : MessageLookupByLibrary.simpleMessage("必须填写描述。"), - "A network error occurred when adding this student. Check your connection and try again." : MessageLookupByLibrary.simpleMessage("添加此学生时发生网络错误。请检查您的网络连接并重试。"), - "A subject is required." : MessageLookupByLibrary.simpleMessage("必须填写主题。"), - "Act As User" : MessageLookupByLibrary.simpleMessage("临时代理用户"), - "Add Student" : MessageLookupByLibrary.simpleMessage("添加学生"), - "Add attachment" : MessageLookupByLibrary.simpleMessage("添加附件"), - "Add new student" : MessageLookupByLibrary.simpleMessage("添加新学生"), - "Add student with…" : MessageLookupByLibrary.simpleMessage("使用...添加学生"), - "Alert Settings" : MessageLookupByLibrary.simpleMessage("警告设置"), - "Alert me when…" : MessageLookupByLibrary.simpleMessage("当...时警告我"), - "All Grading Periods" : MessageLookupByLibrary.simpleMessage("所有评分周期"), - "Already have an account? " : MessageLookupByLibrary.simpleMessage("已经有一个帐户吗? "), - "An email address is required." : MessageLookupByLibrary.simpleMessage("必须填写电子邮件地址。"), - "An error occurred when trying to display this link" : MessageLookupByLibrary.simpleMessage("尝试显示此链接时发生错误"), - "An error occurred while saving your selection. Please try again." : MessageLookupByLibrary.simpleMessage("保存选择时发生错误。请重试。"), - "An unexpected error occurred" : MessageLookupByLibrary.simpleMessage("一个意料之外的错误发生了。"), - "Android OS version" : MessageLookupByLibrary.simpleMessage("Android操作系统版本"), - "Appearance" : MessageLookupByLibrary.simpleMessage("外观"), - "Application version" : MessageLookupByLibrary.simpleMessage("应用程序版本"), - "Are you a student or teacher?" : MessageLookupByLibrary.simpleMessage("您是学生还是教师?"), - "Are you sure you want to log out?" : MessageLookupByLibrary.simpleMessage("是否确定要登出?"), - "Are you sure you wish to close this page? Your unsent message will be lost." : MessageLookupByLibrary.simpleMessage("是否确定要关闭此页面?未发送的消息将会丢失。"), - "Assignment Details" : MessageLookupByLibrary.simpleMessage("作业详情"), - "Assignment grade above" : MessageLookupByLibrary.simpleMessage("作业评分高于"), - "Assignment grade below" : MessageLookupByLibrary.simpleMessage("作业评分低于"), - "Assignment missing" : MessageLookupByLibrary.simpleMessage("缺少作业"), - "Barney, Fuschia" : MessageLookupByLibrary.simpleMessage("粉红"), - "Calendars" : MessageLookupByLibrary.simpleMessage("日历"), - "Camera Permission" : MessageLookupByLibrary.simpleMessage("相机权限"), - "Cancel" : MessageLookupByLibrary.simpleMessage("取消"), - "Canvas Student" : MessageLookupByLibrary.simpleMessage("Canvas 学生"), - "Canvas Teacher" : MessageLookupByLibrary.simpleMessage("Canvas 教师"), - "Canvas on GitHub" : MessageLookupByLibrary.simpleMessage("GitHub上的Canvas"), - "Choose a course to message" : MessageLookupByLibrary.simpleMessage("选择一个课程来发送讯息"), - "Choose from Gallery" : MessageLookupByLibrary.simpleMessage("从图库中选择"), - "Complete" : MessageLookupByLibrary.simpleMessage("完成"), - "Contact Support" : MessageLookupByLibrary.simpleMessage("联系支持"), - "Course Announcement" : MessageLookupByLibrary.simpleMessage("课程公告"), - "Course Announcements" : MessageLookupByLibrary.simpleMessage("课程公告"), - "Course grade above" : MessageLookupByLibrary.simpleMessage("课程评分高于"), - "Course grade below" : MessageLookupByLibrary.simpleMessage("课程评分低于"), - "Create Account" : MessageLookupByLibrary.simpleMessage("创建帐户"), - "Dark Mode" : MessageLookupByLibrary.simpleMessage("暗模式"), - "Date" : MessageLookupByLibrary.simpleMessage("日期"), - "Delete" : MessageLookupByLibrary.simpleMessage("删除"), - "Description" : MessageLookupByLibrary.simpleMessage("说明"), - "Device" : MessageLookupByLibrary.simpleMessage("设备"), - "Device model" : MessageLookupByLibrary.simpleMessage("设备型号"), - "Domain" : MessageLookupByLibrary.simpleMessage("域"), - "Domain:" : MessageLookupByLibrary.simpleMessage("域:"), - "Don\'t show again" : MessageLookupByLibrary.simpleMessage("不再显示"), - "Done" : MessageLookupByLibrary.simpleMessage("完成"), - "Download" : MessageLookupByLibrary.simpleMessage("下载"), - "Due" : MessageLookupByLibrary.simpleMessage("截止"), - "EXTREME CRITICAL EMERGENCY!!" : MessageLookupByLibrary.simpleMessage("非常紧急!"), - "Electric, blue" : MessageLookupByLibrary.simpleMessage("蓝色"), - "Email Address" : MessageLookupByLibrary.simpleMessage("电子邮件地址"), - "Email:" : MessageLookupByLibrary.simpleMessage("电子邮箱:"), - "Email…" : MessageLookupByLibrary.simpleMessage("电子邮件..."), - "Enter the student pairing code provided to you. If the pairing code doesn\'t work, it may have expired" : MessageLookupByLibrary.simpleMessage("输入提供给您的学生配对代码。如果配对代码无法使用,可能已过期"), - "Event" : MessageLookupByLibrary.simpleMessage("活动"), - "Excused" : MessageLookupByLibrary.simpleMessage("已免除"), - "Expired QR Code" : MessageLookupByLibrary.simpleMessage("失效的二维码"), - "Failed. Tap for options." : MessageLookupByLibrary.simpleMessage("失败。点击以获取选项。"), - "Filter" : MessageLookupByLibrary.simpleMessage("筛选器"), - "Filter by" : MessageLookupByLibrary.simpleMessage("筛选条件"), - "Fire, Orange" : MessageLookupByLibrary.simpleMessage("橙色"), - "Front Page" : MessageLookupByLibrary.simpleMessage("首页"), - "Full Name" : MessageLookupByLibrary.simpleMessage("全名"), - "Full Name…" : MessageLookupByLibrary.simpleMessage("全名..."), - "Full error message" : MessageLookupByLibrary.simpleMessage("完整的错误消息"), - "Go to today" : MessageLookupByLibrary.simpleMessage("转至今天"), - "Grade" : MessageLookupByLibrary.simpleMessage("评分"), - "Grade percentage" : MessageLookupByLibrary.simpleMessage("评分百分数"), - "Graded" : MessageLookupByLibrary.simpleMessage("已评分"), - "Grades" : MessageLookupByLibrary.simpleMessage("评分"), - "Help" : MessageLookupByLibrary.simpleMessage("帮助"), - "Hide Password" : MessageLookupByLibrary.simpleMessage("隐藏密码"), - "High Contrast Mode" : MessageLookupByLibrary.simpleMessage("高对比度模式"), - "How are we doing?" : MessageLookupByLibrary.simpleMessage("我们做得怎样?"), - "How is this affecting you?" : MessageLookupByLibrary.simpleMessage("这对您有什么影响?"), - "I can\'t get things done until I hear back from you." : MessageLookupByLibrary.simpleMessage("我无法把事情做好,直到我听到您回来。"), - "I don\'t have a Canvas account" : MessageLookupByLibrary.simpleMessage("我没有 Canvas 帐户"), - "I have a Canvas account" : MessageLookupByLibrary.simpleMessage("我有 Canvas 帐户"), - "I need some help but it\'s not urgent." : MessageLookupByLibrary.simpleMessage("我需要一些帮助,但不是迫切的。"), - "I\'m having trouble logging in" : MessageLookupByLibrary.simpleMessage("我在登录时遇到问题"), - "Idea for Canvas Parent App [Android]" : MessageLookupByLibrary.simpleMessage("构想 Canvas 的[安卓版本]"), - "In order to provide you with a better experience, we have updated how reminders work. You can add new reminders by viewing an assignment or calendar event and tapping the switch under the \"Remind Me\" section.\n\nBe aware that any reminders created with older versions of this app will not be compatible with the new changes and you will need to create them again." : MessageLookupByLibrary.simpleMessage("为了让您获得更好的体验,我们更新了提醒的工作模式。通过查看作业或日历事件然后点击“提醒我”部分下面的切换按钮,可以添加新提醒。\n\n请注意,使用原来的应用程序版本创建的任何提醒均无法在更改后的新版本中使用,因此需重新创建。"), - "Inbox" : MessageLookupByLibrary.simpleMessage("收件箱"), - "Inbox Zero" : MessageLookupByLibrary.simpleMessage("收件箱为零"), - "Incomplete" : MessageLookupByLibrary.simpleMessage("未完成"), - "Incorrect Domain" : MessageLookupByLibrary.simpleMessage("错误的域"), - "Institution Announcement" : MessageLookupByLibrary.simpleMessage("机构公告"), - "Institution Announcements" : MessageLookupByLibrary.simpleMessage("机构通告"), - "Instructions" : MessageLookupByLibrary.simpleMessage("说明"), - "Interactions on this page are limited by your institution." : MessageLookupByLibrary.simpleMessage("在此页面上的互动被您的机构限制。"), - "Invalid QR Code" : MessageLookupByLibrary.simpleMessage("无效的二维码"), - "It looks like a great day to rest, relax, and recharge." : MessageLookupByLibrary.simpleMessage("今天是休息放松的一天。"), - "It looks like assignments haven\'t been created in this space yet." : MessageLookupByLibrary.simpleMessage("似乎尚未在此区域创建作业。"), - "Just a casual question, comment, idea, suggestion…" : MessageLookupByLibrary.simpleMessage("只是一个偶然问题、意见、想法、建议..."), - "Late" : MessageLookupByLibrary.simpleMessage("迟交"), - "Launch External Tool" : MessageLookupByLibrary.simpleMessage("启动外部工具"), - "Legal" : MessageLookupByLibrary.simpleMessage("法律"), - "Light Mode" : MessageLookupByLibrary.simpleMessage("亮模式"), - "Link Error" : MessageLookupByLibrary.simpleMessage("链接错误"), - "Locale:" : MessageLookupByLibrary.simpleMessage("区域设置:"), - "Locate QR Code" : MessageLookupByLibrary.simpleMessage("查找二维码"), - "Location" : MessageLookupByLibrary.simpleMessage("位置"), - "Locked" : MessageLookupByLibrary.simpleMessage("已锁定"), - "Log Out" : MessageLookupByLibrary.simpleMessage("注销"), - "Login flow: Canvas" : MessageLookupByLibrary.simpleMessage("登录流程:Canvas"), - "Login flow: Normal" : MessageLookupByLibrary.simpleMessage("登录流程:正常"), - "Login flow: Site Admin" : MessageLookupByLibrary.simpleMessage("登录流程:网站管理员"), - "Login flow: Skip mobile verify" : MessageLookupByLibrary.simpleMessage("登录流程:跳过移动设备验证"), - "Manage Students" : MessageLookupByLibrary.simpleMessage("管理学生"), - "Message" : MessageLookupByLibrary.simpleMessage("消息"), - "Message subject" : MessageLookupByLibrary.simpleMessage("消息主题"), - "Missing" : MessageLookupByLibrary.simpleMessage("未交"), - "Must be below 100" : MessageLookupByLibrary.simpleMessage("必须低于100"), - "Network error" : MessageLookupByLibrary.simpleMessage("网络错误"), - "Never" : MessageLookupByLibrary.simpleMessage("从不"), - "New message" : MessageLookupByLibrary.simpleMessage("新建消息"), - "No" : MessageLookupByLibrary.simpleMessage("否"), - "No Alerts" : MessageLookupByLibrary.simpleMessage("无警告"), - "No Assignments" : MessageLookupByLibrary.simpleMessage("无作业"), - "No Courses" : MessageLookupByLibrary.simpleMessage("没有课程"), - "No Due Date" : MessageLookupByLibrary.simpleMessage("无截止日期"), - "No Events Today!" : MessageLookupByLibrary.simpleMessage("今天没有事件!"), - "No Grade" : MessageLookupByLibrary.simpleMessage("没有评分"), - "No Location Specified" : MessageLookupByLibrary.simpleMessage("没有具体的位置"), - "No Students" : MessageLookupByLibrary.simpleMessage("没有学生"), - "No Subject" : MessageLookupByLibrary.simpleMessage("无主题"), - "No Summary" : MessageLookupByLibrary.simpleMessage("无摘要"), - "No description" : MessageLookupByLibrary.simpleMessage("无描述"), - "No recipients selected" : MessageLookupByLibrary.simpleMessage("未选择收件人"), - "Not Graded" : MessageLookupByLibrary.simpleMessage("未评分"), - "Not Submitted" : MessageLookupByLibrary.simpleMessage("未提交"), - "Not a parent?" : MessageLookupByLibrary.simpleMessage("不是家长?"), - "Notifications for reminders about assignments and calendar events" : MessageLookupByLibrary.simpleMessage("有关作业和日历活动的提醒通知"), - "OS Version" : MessageLookupByLibrary.simpleMessage("操作系统版本"), - "Observer" : MessageLookupByLibrary.simpleMessage("观察员"), - "One of our other apps might be a better fit. Tap one to visit the Play Store." : MessageLookupByLibrary.simpleMessage("我们的其他应用可能更合适。单击可访问 Play Store。"), - "Open Canvas Student" : MessageLookupByLibrary.simpleMessage("打开 Canvas 学生版"), - "Open In Browser" : MessageLookupByLibrary.simpleMessage("在浏览器里打开"), - "Open with another app" : MessageLookupByLibrary.simpleMessage("使用其他应用程序打开"), - "Pairing Code" : MessageLookupByLibrary.simpleMessage("配对代码"), - "Password" : MessageLookupByLibrary.simpleMessage("密码"), - "Password is required" : MessageLookupByLibrary.simpleMessage("必须填写密码"), - "Password must contain at least 8 characters" : MessageLookupByLibrary.simpleMessage("密码必须包含至少 8 个字符"), - "Password…" : MessageLookupByLibrary.simpleMessage("密码..."), - "Planner Note" : MessageLookupByLibrary.simpleMessage("计划程序注释"), - "Please enter a valid email address" : MessageLookupByLibrary.simpleMessage("请输入有效的电子邮件地址"), - "Please enter an email address" : MessageLookupByLibrary.simpleMessage("请输入电子邮件地址"), - "Please enter full name" : MessageLookupByLibrary.simpleMessage("请输入全名"), - "Please scan a QR code generated by Canvas" : MessageLookupByLibrary.simpleMessage("请扫描 Canvas 生成的二维码"), - "Plum, Purple" : MessageLookupByLibrary.simpleMessage("紫色"), - "Preparing…" : MessageLookupByLibrary.simpleMessage("正在准备..."), - "Previous Logins" : MessageLookupByLibrary.simpleMessage("历史登录记录"), - "Privacy Policy" : MessageLookupByLibrary.simpleMessage("隐私政策"), - "Privacy Policy Link" : MessageLookupByLibrary.simpleMessage("隐私政策链接"), - "Privacy policy, terms of use, open source" : MessageLookupByLibrary.simpleMessage("隐私政策、使用条款、开放源"), - "QR Code" : MessageLookupByLibrary.simpleMessage("二维码"), - "QR scanning requires camera access" : MessageLookupByLibrary.simpleMessage("扫描二维码要求具有相机访问权限"), - "Raspberry, Red" : MessageLookupByLibrary.simpleMessage("红色"), - "Recipients" : MessageLookupByLibrary.simpleMessage("收件人"), - "Refresh" : MessageLookupByLibrary.simpleMessage("刷新"), - "Remind Me" : MessageLookupByLibrary.simpleMessage("提醒我"), - "Reminders" : MessageLookupByLibrary.simpleMessage("提醒"), - "Reminders have changed!" : MessageLookupByLibrary.simpleMessage("提醒已更改!"), - "Reply" : MessageLookupByLibrary.simpleMessage("回复"), - "Reply All" : MessageLookupByLibrary.simpleMessage("回复所有人"), - "Report A Problem" : MessageLookupByLibrary.simpleMessage("报告一个问题"), - "Request Login Help" : MessageLookupByLibrary.simpleMessage("请求登录帮助"), - "Request Login Help Button" : MessageLookupByLibrary.simpleMessage("请求登录帮助按钮"), - "Restart app" : MessageLookupByLibrary.simpleMessage("重启应用程序"), - "Retry" : MessageLookupByLibrary.simpleMessage("重试"), - "Return to Login" : MessageLookupByLibrary.simpleMessage("返回登录"), - "STUDENT" : MessageLookupByLibrary.simpleMessage("学生"), - "Screenshot showing location of QR code generation in browser" : MessageLookupByLibrary.simpleMessage("在浏览器中显示二维码生成位置的截图"), - "Screenshot showing location of pairing QR code generation in the Canvas Student app" : MessageLookupByLibrary.simpleMessage("截图显示在 Canvas 学生版应用程序中生成配对二维码的位置"), - "Select" : MessageLookupByLibrary.simpleMessage("选择"), - "Select Student Color" : MessageLookupByLibrary.simpleMessage("选择学生颜色"), - "Select recipients" : MessageLookupByLibrary.simpleMessage("选择收件人"), - "Send Feedback" : MessageLookupByLibrary.simpleMessage("发送反馈"), - "Send a message about this assignment" : MessageLookupByLibrary.simpleMessage("发送有关此作业的消息"), - "Send a message about this course" : MessageLookupByLibrary.simpleMessage("发送有关此课程的消息"), - "Send message" : MessageLookupByLibrary.simpleMessage("发送消息"), - "Set a date and time to be notified of this event." : MessageLookupByLibrary.simpleMessage("设定通知此活动的日期和时间。"), - "Set a date and time to be notified of this specific assignment." : MessageLookupByLibrary.simpleMessage("设定通知此特定作业的日期和时间。"), - "Settings" : MessageLookupByLibrary.simpleMessage("设置"), - "Shamrock, Green" : MessageLookupByLibrary.simpleMessage("绿色"), - "Share Your Love for the App" : MessageLookupByLibrary.simpleMessage("分享您所喜爱的应用程序"), - "Show Password" : MessageLookupByLibrary.simpleMessage("显示密码"), - "Sign In" : MessageLookupByLibrary.simpleMessage("登录"), - "Something went wrong trying to create your account, please reach out to your school for assistance." : MessageLookupByLibrary.simpleMessage("尝试创建帐户时遇到错误,请联系您的学校寻求帮助。"), - "Something\'s broken but I can work around it to get what I need done." : MessageLookupByLibrary.simpleMessage("系统出错了,但我可以解决它,并完成我所需要做的事。"), - "Stop Acting as User" : MessageLookupByLibrary.simpleMessage("停止临时代理用户"), - "Student" : MessageLookupByLibrary.simpleMessage("学生"), - "Student Pairing" : MessageLookupByLibrary.simpleMessage("学生配对"), - "Students can create a QR code using the Canvas Student app on their mobile device" : MessageLookupByLibrary.simpleMessage("学生可以使用移动设备上的 Canvas 学生版应用程序创建二维码"), - "Students can obtain a pairing code through the Canvas website" : MessageLookupByLibrary.simpleMessage("学生可以通过 Canvas 网站获得配对码"), - "Subject" : MessageLookupByLibrary.simpleMessage("主题"), - "Submitted" : MessageLookupByLibrary.simpleMessage("已提交"), - "Successfully submitted!" : MessageLookupByLibrary.simpleMessage("已成功提交。"), - "Summary" : MessageLookupByLibrary.simpleMessage("摘要"), - "Switch Users" : MessageLookupByLibrary.simpleMessage("转换用户"), - "Syllabus" : MessageLookupByLibrary.simpleMessage("教学大纲"), - "TA" : MessageLookupByLibrary.simpleMessage("助教"), - "TEACHER" : MessageLookupByLibrary.simpleMessage("教师"), - "Tap to favorite the courses you want to see on the Calendar. Select up to 10." : MessageLookupByLibrary.simpleMessage("点击以收藏您希望在日历中看到的课程。选择最多 10 个。"), - "Tap to pair with a new student" : MessageLookupByLibrary.simpleMessage("点击以与新生配对"), - "Tap to select this student" : MessageLookupByLibrary.simpleMessage("点击以选择此学生"), - "Tap to show student selector" : MessageLookupByLibrary.simpleMessage("点击以显示学生选择器"), - "Teacher" : MessageLookupByLibrary.simpleMessage("教师"), - "Tell us about your favorite parts of the app" : MessageLookupByLibrary.simpleMessage("告诉我们您最喜欢应用程序的部分"), - "Terms of Service" : MessageLookupByLibrary.simpleMessage("服务条款"), - "Terms of Service Link" : MessageLookupByLibrary.simpleMessage("服务条款链接"), - "Terms of Use" : MessageLookupByLibrary.simpleMessage("使用条款"), - "The QR code you scanned may have expired. Refresh the code on the student\'s device and try again." : MessageLookupByLibrary.simpleMessage("您扫描的二维码已失效。刷新学生设备上的二维码并重试。"), - "The following information will help us better understand your idea:" : MessageLookupByLibrary.simpleMessage("下面的信息将帮助我们更好地了解您的想法:"), - "The server you entered is not authorized for this app." : MessageLookupByLibrary.simpleMessage("您输入的服务器没有授权此应用程序。"), - "The student you are trying to add belongs to a different school. Log in or create an account with that school to scan this code." : MessageLookupByLibrary.simpleMessage("您尝试添加的学生属于不同的学校。使用该学校的帐户登录或创建帐户以扫描此二维码。"), - "The user agent for this app is not authorized." : MessageLookupByLibrary.simpleMessage("此应用程序的用户代理未获得授权。"), - "Theme" : MessageLookupByLibrary.simpleMessage("主题、话题"), - "There are no installed applications that can open this file" : MessageLookupByLibrary.simpleMessage("未安装可以打开此文件的应用程序"), - "There is no page information available." : MessageLookupByLibrary.simpleMessage("没有可用的页面信息。"), - "There was a problem loading the Terms of Use" : MessageLookupByLibrary.simpleMessage("加载使用条款时发生错误"), - "There was a problem removing this student from your account. Please check your connection and try again." : MessageLookupByLibrary.simpleMessage("从帐户中移除该学生时发生错误。请检查您的连接,然后再试一次。"), - "There was an error loading recipients for this course" : MessageLookupByLibrary.simpleMessage("加载此课程的收件人时发生错误。"), - "There was an error loading the summary details for this course." : MessageLookupByLibrary.simpleMessage("加载此课程的摘要详情时发生错误。"), - "There was an error loading this announcement" : MessageLookupByLibrary.simpleMessage("加载此公告时发生错误"), - "There was an error loading this conversation" : MessageLookupByLibrary.simpleMessage("加载此会话时发生错误"), - "There was an error loading this file" : MessageLookupByLibrary.simpleMessage("加载此文件时发生错误"), - "There was an error loading your inbox messages." : MessageLookupByLibrary.simpleMessage("加载收件箱消息时发生错误。"), - "There was an error loading your student\'s alerts." : MessageLookupByLibrary.simpleMessage("加载学生的警告时发生错误。"), - "There was an error loading your student\'s calendar" : MessageLookupByLibrary.simpleMessage("加载学生的日历时发生错误"), - "There was an error loading your students." : MessageLookupByLibrary.simpleMessage("加载学生时发生错误。"), - "There was an error loading your student’s courses." : MessageLookupByLibrary.simpleMessage("加载学生的课程时发生错误。"), - "There was an error logging in. Please generate another QR Code and try again." : MessageLookupByLibrary.simpleMessage("登录时发生错误。请生成新的二维码并重试。"), - "There was an error trying to act as this user. Please check the Domain and User ID and try again." : MessageLookupByLibrary.simpleMessage("尝试临时代理用户时发生错误。请检查域和用户 ID,然后再试一次。"), - "There’s nothing to be notified of yet." : MessageLookupByLibrary.simpleMessage("暂时没有任何通知。"), - "This app is not authorized for use." : MessageLookupByLibrary.simpleMessage("此程序没有被授权使用。"), - "This course does not have any assignments or calendar events yet." : MessageLookupByLibrary.simpleMessage("此课程暂时没有任何作业或日历活动。"), - "This file is unsupported and can’t be viewed through the app" : MessageLookupByLibrary.simpleMessage("此文件不受支持,无法通过应用程序查看"), - "This will unpair and remove all enrollments for this student from your account." : MessageLookupByLibrary.simpleMessage("这样做将取消配对并从您的帐户中移除该学生的所有注册。"), - "Total Grade" : MessageLookupByLibrary.simpleMessage("总分"), - "Uh oh!" : MessageLookupByLibrary.simpleMessage("嗳哟!"), - "Unable to fetch courses. Please check your connection and try again." : MessageLookupByLibrary.simpleMessage("无法获取课程。请检查您的连接,然后再试一次。"), - "Unable to load this image" : MessageLookupByLibrary.simpleMessage("无法加载此图片"), - "Unable to play this media file" : MessageLookupByLibrary.simpleMessage("无法播放此媒体文件"), - "Unable to send message. Check your connection and try again." : MessageLookupByLibrary.simpleMessage("无法发送消息。请检查您的网络连接并重试。"), - "Under Construction" : MessageLookupByLibrary.simpleMessage("正在建设中"), - "Unknown User" : MessageLookupByLibrary.simpleMessage("未知用户"), - "Unsaved changes" : MessageLookupByLibrary.simpleMessage("无法保存更改"), - "Unsupported File" : MessageLookupByLibrary.simpleMessage("不受支持的文件"), - "Upload File" : MessageLookupByLibrary.simpleMessage("上传文件"), - "Use Camera" : MessageLookupByLibrary.simpleMessage("使用相机"), - "Use Dark Theme in Web Content" : MessageLookupByLibrary.simpleMessage("在 Web 内容中使用深色主题"), - "User ID" : MessageLookupByLibrary.simpleMessage("用户 ID"), - "User ID:" : MessageLookupByLibrary.simpleMessage("用户 ID:"), - "Version Number" : MessageLookupByLibrary.simpleMessage("版本号"), - "View Description" : MessageLookupByLibrary.simpleMessage("查看说明"), - "View error details" : MessageLookupByLibrary.simpleMessage("查看错误详细信息"), - "View the Privacy Policy" : MessageLookupByLibrary.simpleMessage("查看隐私政策"), - "We are currently building this feature for your viewing pleasure." : MessageLookupByLibrary.simpleMessage("我们目前在构建此功能,以便为您提供愉悦的浏览体验。"), - "We are unable to display this link, it may belong to an institution you currently aren\'t logged in to." : MessageLookupByLibrary.simpleMessage("无法显示此链接,可能属于您目前未登录的机构。"), - "We couldn\'t find any students associated with this account" : MessageLookupByLibrary.simpleMessage("我们找不到任何与该账户关联的学生"), - "We were unable to verify the server for use with this app." : MessageLookupByLibrary.simpleMessage("我们无法验证此应用程序使用的服务器。"), - "We’re not sure what happened, but it wasn’t good. Contact us if this keeps happening." : MessageLookupByLibrary.simpleMessage("不知道发生了什么事情,但似乎不太妙。如果问题持续,请联系我们。"), - "What can we do better?" : MessageLookupByLibrary.simpleMessage("我们如何能做得更好?"), - "Yes" : MessageLookupByLibrary.simpleMessage("是"), - "You are not observing any students." : MessageLookupByLibrary.simpleMessage("您未观察任何学生。"), - "You may only choose 10 calendars to display" : MessageLookupByLibrary.simpleMessage("只能选择 10 个要显示的日历"), - "You must enter a user id" : MessageLookupByLibrary.simpleMessage("必须输入用户 ID"), - "You must enter a valid domain" : MessageLookupByLibrary.simpleMessage("必须输入有效的域"), - "You must select at least one calendar to display" : MessageLookupByLibrary.simpleMessage("必须选择至少 1 个要显示的日历"), - "You will be notified about this assignment on…" : MessageLookupByLibrary.simpleMessage("您将在...收到有关此作业的通知"), - "You will be notified about this event on…" : MessageLookupByLibrary.simpleMessage("您将在...收到有关此活动的通知"), - "You\'ll find the QR code on the web in your account profile. Click \'QR for Mobile Login\' in the list." : MessageLookupByLibrary.simpleMessage("在 Web 的帐户个人资料中可以找到二维码。点击列表中的“用于移动设备登录的二维码”。"), - "You\'ll need to open your student\'s Canvas Student app to continue. Go into Main Menu > Settings > Pair with Observer and scan the QR code you see there." : MessageLookupByLibrary.simpleMessage("您需打开学生的 Canvas 学生版应用程序才能继续。转到“主菜单 > 设置 > 与旁听者配对”,扫描在其中看到的二维码。"), - "Your code is incorrect or expired." : MessageLookupByLibrary.simpleMessage("您的代码错误或已过期。"), - "Your student’s courses might not be published yet." : MessageLookupByLibrary.simpleMessage("学生的课程可能尚未发布。"), - "You’re all caught up!" : MessageLookupByLibrary.simpleMessage("您全部跟上了!"), - "actingAsUser" : m0, - "alertsLabel" : MessageLookupByLibrary.simpleMessage("警告"), - "appVersion" : m1, - "assignmentGradeAboveThreshold" : m2, - "assignmentGradeBelowThreshold" : m3, - "assignmentLockedModule" : m4, - "assignmentSubjectMessage" : m5, - "assignmentTotalPoints" : m6, - "assignmentTotalPointsAccessible" : m7, - "authorToNOthers" : m8, - "authorToRecipient" : m9, - "authorToRecipientAndNOthers" : m10, - "badgeNumberPlus" : m11, - "calendarLabel" : MessageLookupByLibrary.simpleMessage("日历"), - "canvasGuides" : MessageLookupByLibrary.simpleMessage("Canvas指南"), - "canvasLogoLabel" : MessageLookupByLibrary.simpleMessage("Canvas徽标"), - "canvasSupport" : MessageLookupByLibrary.simpleMessage("Canvas支持"), - "changeStudentColorLabel" : m12, - "collapse" : MessageLookupByLibrary.simpleMessage("折叠"), - "collapsed" : MessageLookupByLibrary.simpleMessage("折叠"), - "contentDescriptionScoreOutOfPointsPossible" : m13, - "courseForWhom" : m14, - "courseGradeAboveThreshold" : m15, - "courseGradeBelowThreshold" : m16, - "coursesLabel" : MessageLookupByLibrary.simpleMessage("课程"), - "dateAtTime" : m17, - "dismissAlertLabel" : m18, - "domainSearchHelpBody" : m19, - "domainSearchHelpLabel" : MessageLookupByLibrary.simpleMessage("如何查找我的学校或校区?"), - "domainSearchInputHint" : MessageLookupByLibrary.simpleMessage("输入学校名称或校区..."), - "dueDateAtTime" : m20, - "endMasqueradeLogoutMessage" : m21, - "endMasqueradeMessage" : m22, - "eventSubjectMessage" : m23, - "eventTime" : m24, - "expand" : MessageLookupByLibrary.simpleMessage("展开"), - "expanded" : MessageLookupByLibrary.simpleMessage("展开"), - "finalGrade" : m25, - "findSchool" : MessageLookupByLibrary.simpleMessage("查找学校"), - "frontPageSubjectMessage" : m26, - "gradeFormatScoreOutOfPointsPossible" : m27, - "gradesSubjectMessage" : m28, - "latePenalty" : m29, - "me" : MessageLookupByLibrary.simpleMessage("本人"), - "messageLinkPostscript" : m30, - "minus" : MessageLookupByLibrary.simpleMessage("负分"), - "mustBeAboveN" : m31, - "mustBeBelowN" : m32, - "next" : MessageLookupByLibrary.simpleMessage("下一步"), - "nextMonth" : m33, - "nextWeek" : m34, - "noDomainResults" : m35, - "ok" : MessageLookupByLibrary.simpleMessage("确定"), - "outOfPoints" : m36, - "plusRecipientCount" : m37, - "pointsPossible" : m38, - "previousMonth" : m39, - "previousWeek" : m40, - "qrCreateAccountTos" : m41, - "ratingDialogEmailSubject" : m42, - "selectedMonthLabel" : m43, - "send" : MessageLookupByLibrary.simpleMessage("发送"), - "starRating" : m44, - "submissionStatusSuccessSubtitle" : m45, - "syllabusSubjectMessage" : m46, - "unread" : MessageLookupByLibrary.simpleMessage("未读"), - "unreadCount" : m47 - }; -} diff --git a/apps/flutter_parent/lib/l10n/generated/messages_zh_HK.dart b/apps/flutter_parent/lib/l10n/generated/messages_zh_HK.dart deleted file mode 100644 index 54353f50cb..0000000000 --- a/apps/flutter_parent/lib/l10n/generated/messages_zh_HK.dart +++ /dev/null @@ -1,473 +0,0 @@ -// DO NOT EDIT. This is code generated via package:intl/generate_localized.dart -// This is a library that provides messages for a zh_HK locale. All the -// messages from the main program should be duplicated here with the same -// function name. - -// Ignore issues from commonly used lints in this file. -// ignore_for_file:unnecessary_brace_in_string_interps, unnecessary_new -// ignore_for_file:prefer_single_quotes,comment_references, directives_ordering -// ignore_for_file:annotate_overrides,prefer_generic_function_type_aliases -// ignore_for_file:unused_import, file_names - -import 'package:intl/intl.dart'; -import 'package:intl/message_lookup_by_library.dart'; - -final messages = new MessageLookup(); - -typedef String MessageIfAbsent(String messageStr, List args); - -class MessageLookup extends MessageLookupByLibrary { - String get localeName => 'zh_HK'; - - static m0(userName) => "您正在作為 ${userName}"; - - static m1(version) => "v. ${version}"; - - static m2(threshold) => "作業評分高於 ${threshold}"; - - static m3(threshold) => "作業評分低於 ${threshold}"; - - static m4(moduleName) => "此作業由單元 \"${moduleName}\" 鎖定。"; - - static m5(studentName, assignmentName) => "關於:${studentName},作業 - ${assignmentName}"; - - static m6(points) => "${points} 分"; - - static m7(points) => "${points} 分"; - - static m8(authorName, howMany) => "${Intl.plural(howMany, one: '${authorName} 到 1 個其他', other: '${authorName} 到 ${howMany} 其他')}"; - - static m9(authorName, recipientName) => "${authorName} 至 ${recipientName}"; - - static m10(authorName, recipientName, howMany) => "${Intl.plural(howMany, one: '${authorName} 到 ${recipientName} 和 1 個其他', other: '${authorName} 到 ${recipientName} 和 ${howMany} 其他')}"; - - static m11(count) => "${count}+"; - - static m12(studentName) => "變更 ${studentName} 的顏色"; - - static m13(score, pointsPossible) => "得分為 ${score},滿分為 ${pointsPossible}"; - - static m14(studentShortName) => "針對 ${studentShortName}"; - - static m15(threshold) => "課程評分高於 ${threshold}"; - - static m16(threshold) => "課程評分低於 ${threshold}"; - - static m17(date, time) => "日期 ${date},時間 ${time}"; - - static m18(alertTitle) => "忽略 ${alertTitle}"; - - static m19(canvasGuides, canvasSupport) => "嘗試搜尋您試著存取的學校或地區的名稱,例如“Smith Private School”或“Smith County Schools”。您也可以直接輸入 Canvas 網域,例如“smith.instructure.com”。\n\n如需更多有關尋找您的機構的 Canvas 帳戶的資訊,您可以瀏覽 ${canvasGuides}、連線到 ${canvasSupport} 或聯絡您的學校尋求協助。"; - - static m20(date, time) => "截止於 ${date} 的 ${time}"; - - static m21(userName) => "您將會停止作為 ${userName} 並登出。"; - - static m22(userName) => "您將會停止作為 ${userName} 並返回到您的原有帳戶。"; - - static m23(studentName, eventTitle) => "關於:${studentName},活動 - ${eventTitle}"; - - static m24(startAt, endAt) => "${startAt} - ${endAt}"; - - static m25(grade) => "最終評分:${grade}"; - - static m26(studentName) => "關於:${studentName},封面頁"; - - static m27(score, pointsPossible) => "${score} / ${pointsPossible}"; - - static m28(studentName) => "關於:${studentName},成績"; - - static m29(pointsLost) => "逾期懲罰 (-${pointsLost})"; - - static m30(studentName, linkUrl) => "關於:${studentName},${linkUrl}"; - - static m31(percentage) => "必須高於 ${percentage}"; - - static m32(percentage) => "必須低於 ${percentage}"; - - static m33(month) => "下個月:${month}"; - - static m34(date) => "下一週開始 ${date}"; - - static m35(query) => "找不到符合 \"${query}\" 的學校"; - - static m36(points, howMany) => "${Intl.plural(howMany, one: '滿分為 1 分', other: '滿分為 ${points} 分')}"; - - static m37(count) => "+${count}"; - - static m38(points) => "可能的分數 ${points}"; - - static m39(month) => "上個月:${month}"; - - static m40(date) => "上一週開始 ${date}"; - - static m41(termsOfService, privacyPolicy) => "點擊「創建帳戶」,代表您同意${termsOfService},並了解${privacyPolicy}"; - - static m42(version) => "給 Android 的建議 - Canvas Parent ${version}"; - - static m43(month) => "${month} 的月份"; - - static m44(position) => "${Intl.plural(position, one: '${position} 顆星', other: '${position}顆星')}"; - - static m45(date, time) => "此作業在 ${date} 的 ${time} 上已提交,並且正在等待評分"; - - static m46(studentName) => "關於:${studentName},課程大綱"; - - static m47(count) => "${count} 則未讀"; - - final messages = _notInlinedMessages(_notInlinedMessages); - static _notInlinedMessages(_) => { - "\"Act as\" is essentially logging in as this user without a password. You will be able to take any action as if you were this user, and from other users\' points of views, it will be as if this user performed them. However, audit logs record that you were the one who performed the actions on behalf of this user." : MessageLookupByLibrary.simpleMessage("「作為」本質上是以此使用者身份登錄,沒有密碼。您將能夠進行任何操作,就好像您就是此使用者一樣,並且,其他使用者也會認為是此使用者執行了操作。然而,活動紀錄會記錄事實,即您是代表此使用者執行操作的人。"), - "-" : MessageLookupByLibrary.simpleMessage("-"), - "A description is required." : MessageLookupByLibrary.simpleMessage("描述必填。"), - "A network error occurred when adding this student. Check your connection and try again." : MessageLookupByLibrary.simpleMessage("添加此學生時發生網路錯誤。請檢查您的連線,然後再試一次。"), - "A subject is required." : MessageLookupByLibrary.simpleMessage("主題必填。"), - "Act As User" : MessageLookupByLibrary.simpleMessage("作為使用者"), - "Add Student" : MessageLookupByLibrary.simpleMessage("添加學生"), - "Add attachment" : MessageLookupByLibrary.simpleMessage("添加附件"), - "Add new student" : MessageLookupByLibrary.simpleMessage("添加新學生"), - "Add student with…" : MessageLookupByLibrary.simpleMessage("添加學生…"), - "Alert Settings" : MessageLookupByLibrary.simpleMessage("提醒設定"), - "Alert me when…" : MessageLookupByLibrary.simpleMessage("在下列情形時提醒我..."), - "All Grading Periods" : MessageLookupByLibrary.simpleMessage("所有評分期"), - "Already have an account? " : MessageLookupByLibrary.simpleMessage("已經擁有帳戶? "), - "An email address is required." : MessageLookupByLibrary.simpleMessage("電郵地址必填。"), - "An error occurred when trying to display this link" : MessageLookupByLibrary.simpleMessage("嘗試顯示此連結時出現錯誤"), - "An error occurred while saving your selection. Please try again." : MessageLookupByLibrary.simpleMessage("儲存您的選擇時發生錯誤。請重試。"), - "An unexpected error occurred" : MessageLookupByLibrary.simpleMessage("出現意外錯誤"), - "Android OS version" : MessageLookupByLibrary.simpleMessage("Android 作業系統版本"), - "Appearance" : MessageLookupByLibrary.simpleMessage("外觀"), - "Application version" : MessageLookupByLibrary.simpleMessage("應用程式版本"), - "Are you a student or teacher?" : MessageLookupByLibrary.simpleMessage("您是學生或教師?"), - "Are you sure you want to log out?" : MessageLookupByLibrary.simpleMessage("是否確定登出?"), - "Are you sure you wish to close this page? Your unsent message will be lost." : MessageLookupByLibrary.simpleMessage("是否確定要關閉此頁面?將遺失未傳送的訊息。"), - "Assignment Details" : MessageLookupByLibrary.simpleMessage("作業詳細資料"), - "Assignment grade above" : MessageLookupByLibrary.simpleMessage("作業評分高於"), - "Assignment grade below" : MessageLookupByLibrary.simpleMessage("作業評分低於"), - "Assignment missing" : MessageLookupByLibrary.simpleMessage("缺少作業"), - "Barney, Fuschia" : MessageLookupByLibrary.simpleMessage("巴尼,紫紅色"), - "Calendars" : MessageLookupByLibrary.simpleMessage("行事曆"), - "Camera Permission" : MessageLookupByLibrary.simpleMessage("攝影機權限"), - "Cancel" : MessageLookupByLibrary.simpleMessage("取消"), - "Canvas Student" : MessageLookupByLibrary.simpleMessage("Canvas Student"), - "Canvas Teacher" : MessageLookupByLibrary.simpleMessage("Canvas Teacher"), - "Canvas on GitHub" : MessageLookupByLibrary.simpleMessage("GitHub 上的 Canvas"), - "Choose a course to message" : MessageLookupByLibrary.simpleMessage("選擇課程以傳送訊息"), - "Choose from Gallery" : MessageLookupByLibrary.simpleMessage("從圖片庫中選擇"), - "Complete" : MessageLookupByLibrary.simpleMessage("完成"), - "Contact Support" : MessageLookupByLibrary.simpleMessage("聯絡支援"), - "Course Announcement" : MessageLookupByLibrary.simpleMessage("課程通告"), - "Course Announcements" : MessageLookupByLibrary.simpleMessage("課程通告"), - "Course grade above" : MessageLookupByLibrary.simpleMessage("課程評分高於"), - "Course grade below" : MessageLookupByLibrary.simpleMessage("課程評分低於"), - "Create Account" : MessageLookupByLibrary.simpleMessage("建立帳戶"), - "Dark Mode" : MessageLookupByLibrary.simpleMessage("暗色模式"), - "Date" : MessageLookupByLibrary.simpleMessage("日期"), - "Delete" : MessageLookupByLibrary.simpleMessage("刪除"), - "Description" : MessageLookupByLibrary.simpleMessage("描述"), - "Device" : MessageLookupByLibrary.simpleMessage("裝置"), - "Device model" : MessageLookupByLibrary.simpleMessage("裝置機型"), - "Domain" : MessageLookupByLibrary.simpleMessage("網域"), - "Domain:" : MessageLookupByLibrary.simpleMessage("網域:"), - "Don\'t show again" : MessageLookupByLibrary.simpleMessage("不要再次顯示"), - "Done" : MessageLookupByLibrary.simpleMessage("已完成"), - "Download" : MessageLookupByLibrary.simpleMessage("下載"), - "Due" : MessageLookupByLibrary.simpleMessage("截止"), - "EXTREME CRITICAL EMERGENCY!!" : MessageLookupByLibrary.simpleMessage("極其重要的緊急情況!!"), - "Electric, blue" : MessageLookupByLibrary.simpleMessage("電,藍色"), - "Email Address" : MessageLookupByLibrary.simpleMessage("電郵地址"), - "Email:" : MessageLookupByLibrary.simpleMessage("電郵地址:"), - "Email…" : MessageLookupByLibrary.simpleMessage("電郵..."), - "Enter the student pairing code provided to you. If the pairing code doesn\'t work, it may have expired" : MessageLookupByLibrary.simpleMessage("輸入已提供給您的學生配對代碼。如果配對代碼無效,可能是已到期"), - "Event" : MessageLookupByLibrary.simpleMessage("活動"), - "Excused" : MessageLookupByLibrary.simpleMessage("已免除"), - "Expired QR Code" : MessageLookupByLibrary.simpleMessage("已過期 QR 碼"), - "Failed. Tap for options." : MessageLookupByLibrary.simpleMessage("失敗。點選選項。"), - "Filter" : MessageLookupByLibrary.simpleMessage("篩選器"), - "Filter by" : MessageLookupByLibrary.simpleMessage("篩選條件"), - "Fire, Orange" : MessageLookupByLibrary.simpleMessage("火,橙色"), - "Front Page" : MessageLookupByLibrary.simpleMessage("首頁"), - "Full Name" : MessageLookupByLibrary.simpleMessage("全名"), - "Full Name…" : MessageLookupByLibrary.simpleMessage("全名..."), - "Full error message" : MessageLookupByLibrary.simpleMessage("完整錯誤訊息"), - "Go to today" : MessageLookupByLibrary.simpleMessage("前往今天"), - "Grade" : MessageLookupByLibrary.simpleMessage("評分"), - "Grade percentage" : MessageLookupByLibrary.simpleMessage("評分百分比"), - "Graded" : MessageLookupByLibrary.simpleMessage("已評分"), - "Grades" : MessageLookupByLibrary.simpleMessage("成績"), - "Help" : MessageLookupByLibrary.simpleMessage("支援"), - "Hide Password" : MessageLookupByLibrary.simpleMessage("隱藏密碼"), - "High Contrast Mode" : MessageLookupByLibrary.simpleMessage("高對比模式"), - "How are we doing?" : MessageLookupByLibrary.simpleMessage("我們表現如何?"), - "How is this affecting you?" : MessageLookupByLibrary.simpleMessage("問題對您造成什麼影響?"), - "I can\'t get things done until I hear back from you." : MessageLookupByLibrary.simpleMessage("在收到您的回覆之前,我無法處理。"), - "I don\'t have a Canvas account" : MessageLookupByLibrary.simpleMessage("我沒有 Canvas 帳戶"), - "I have a Canvas account" : MessageLookupByLibrary.simpleMessage("我有 Canvas 帳戶"), - "I need some help but it\'s not urgent." : MessageLookupByLibrary.simpleMessage("我需要支援,但並不緊迫。"), - "I\'m having trouble logging in" : MessageLookupByLibrary.simpleMessage("我登入時發生問題"), - "Idea for Canvas Parent App [Android]" : MessageLookupByLibrary.simpleMessage("關於 Canvas Parent 程式 [Android] 的想法"), - "In order to provide you with a better experience, we have updated how reminders work. You can add new reminders by viewing an assignment or calendar event and tapping the switch under the \"Remind Me\" section.\n\nBe aware that any reminders created with older versions of this app will not be compatible with the new changes and you will need to create them again." : MessageLookupByLibrary.simpleMessage("為向您提供更佳體驗,我們更新了提醒功能的運作方式。您可以在檢視作業或行事曆活動時,點擊「提醒我」部分下方的切換按鈕,以新增提醒。\n\n請注意,任何透過較舊版本應用程式創建的提醒將不能與新功能相容,您需要再次創建提醒。"), - "Inbox" : MessageLookupByLibrary.simpleMessage("收件匣"), - "Inbox Zero" : MessageLookupByLibrary.simpleMessage("收件匣無訊息"), - "Incomplete" : MessageLookupByLibrary.simpleMessage("未完成"), - "Incorrect Domain" : MessageLookupByLibrary.simpleMessage("錯誤網域"), - "Institution Announcement" : MessageLookupByLibrary.simpleMessage("機構通告"), - "Institution Announcements" : MessageLookupByLibrary.simpleMessage("機構的告"), - "Instructions" : MessageLookupByLibrary.simpleMessage("教學"), - "Interactions on this page are limited by your institution." : MessageLookupByLibrary.simpleMessage("本頁面的互動受您所在機構的限制。"), - "Invalid QR Code" : MessageLookupByLibrary.simpleMessage("無效的 QR 碼"), - "It looks like a great day to rest, relax, and recharge." : MessageLookupByLibrary.simpleMessage("看來是適合休息、放鬆和充電的一天。"), - "It looks like assignments haven\'t been created in this space yet." : MessageLookupByLibrary.simpleMessage("此空間中尚未建立任何作業。"), - "Just a casual question, comment, idea, suggestion…" : MessageLookupByLibrary.simpleMessage("只是隨意提問、評論、想法、建議……"), - "Late" : MessageLookupByLibrary.simpleMessage("逾期"), - "Launch External Tool" : MessageLookupByLibrary.simpleMessage("啟動外部工具"), - "Legal" : MessageLookupByLibrary.simpleMessage("法律事務"), - "Light Mode" : MessageLookupByLibrary.simpleMessage("淡色模式"), - "Link Error" : MessageLookupByLibrary.simpleMessage("連結錯誤"), - "Locale:" : MessageLookupByLibrary.simpleMessage("位置:"), - "Locate QR Code" : MessageLookupByLibrary.simpleMessage("尋找 QR 碼"), - "Location" : MessageLookupByLibrary.simpleMessage("位置"), - "Locked" : MessageLookupByLibrary.simpleMessage("已鎖定"), - "Log Out" : MessageLookupByLibrary.simpleMessage("登出"), - "Login flow: Canvas" : MessageLookupByLibrary.simpleMessage("登入流態:Canvas"), - "Login flow: Normal" : MessageLookupByLibrary.simpleMessage("登入流態:正常"), - "Login flow: Site Admin" : MessageLookupByLibrary.simpleMessage("登入流態:網站管理員"), - "Login flow: Skip mobile verify" : MessageLookupByLibrary.simpleMessage("登入流態:跳過流動認證"), - "Manage Students" : MessageLookupByLibrary.simpleMessage("管理學生"), - "Message" : MessageLookupByLibrary.simpleMessage("訊息"), - "Message subject" : MessageLookupByLibrary.simpleMessage("訊息主題"), - "Missing" : MessageLookupByLibrary.simpleMessage("缺失"), - "Must be below 100" : MessageLookupByLibrary.simpleMessage("必須低於 100"), - "Network error" : MessageLookupByLibrary.simpleMessage("網路錯誤"), - "Never" : MessageLookupByLibrary.simpleMessage("永不"), - "New message" : MessageLookupByLibrary.simpleMessage("新訊息"), - "No" : MessageLookupByLibrary.simpleMessage("否"), - "No Alerts" : MessageLookupByLibrary.simpleMessage("無提醒"), - "No Assignments" : MessageLookupByLibrary.simpleMessage("無作業"), - "No Courses" : MessageLookupByLibrary.simpleMessage("無課程"), - "No Due Date" : MessageLookupByLibrary.simpleMessage("無截止日期"), - "No Events Today!" : MessageLookupByLibrary.simpleMessage("今天並無活動!"), - "No Grade" : MessageLookupByLibrary.simpleMessage("無評分"), - "No Location Specified" : MessageLookupByLibrary.simpleMessage("無指定的地點"), - "No Students" : MessageLookupByLibrary.simpleMessage("無學生"), - "No Subject" : MessageLookupByLibrary.simpleMessage("無主題"), - "No Summary" : MessageLookupByLibrary.simpleMessage("無摘要"), - "No description" : MessageLookupByLibrary.simpleMessage("沒有說明"), - "No recipients selected" : MessageLookupByLibrary.simpleMessage("未選擇收件人"), - "Not Graded" : MessageLookupByLibrary.simpleMessage("未評分"), - "Not Submitted" : MessageLookupByLibrary.simpleMessage("未提交"), - "Not a parent?" : MessageLookupByLibrary.simpleMessage("不是父母?"), - "Notifications for reminders about assignments and calendar events" : MessageLookupByLibrary.simpleMessage("與作業和行事曆活動有關的提醒通知"), - "OS Version" : MessageLookupByLibrary.simpleMessage("OS 版本"), - "Observer" : MessageLookupByLibrary.simpleMessage("觀察者"), - "One of our other apps might be a better fit. Tap one to visit the Play Store." : MessageLookupByLibrary.simpleMessage("我們其他應用程式可能更適合您。按一查看 Play Store。"), - "Open Canvas Student" : MessageLookupByLibrary.simpleMessage("開啟 Canvas Student"), - "Open In Browser" : MessageLookupByLibrary.simpleMessage("在瀏覽器中打開"), - "Open with another app" : MessageLookupByLibrary.simpleMessage("使用其他應用程式開啟"), - "Pairing Code" : MessageLookupByLibrary.simpleMessage("配對代碼"), - "Password" : MessageLookupByLibrary.simpleMessage("密碼"), - "Password is required" : MessageLookupByLibrary.simpleMessage("需要輸入密碼"), - "Password must contain at least 8 characters" : MessageLookupByLibrary.simpleMessage("密碼必須最少包含 8 個字符"), - "Password…" : MessageLookupByLibrary.simpleMessage("密碼..."), - "Planner Note" : MessageLookupByLibrary.simpleMessage("規劃注釋"), - "Please enter a valid email address" : MessageLookupByLibrary.simpleMessage("請輸入有效電郵地址"), - "Please enter an email address" : MessageLookupByLibrary.simpleMessage("請輸入電郵地址"), - "Please enter full name" : MessageLookupByLibrary.simpleMessage("請輸入全名"), - "Please scan a QR code generated by Canvas" : MessageLookupByLibrary.simpleMessage("請掃描由 Canvas 產生的 QR 碼"), - "Plum, Purple" : MessageLookupByLibrary.simpleMessage("梅子,紫色"), - "Preparing…" : MessageLookupByLibrary.simpleMessage("準備中…"), - "Previous Logins" : MessageLookupByLibrary.simpleMessage("先前登入"), - "Privacy Policy" : MessageLookupByLibrary.simpleMessage("隱私政策"), - "Privacy Policy Link" : MessageLookupByLibrary.simpleMessage("隱私政策連結"), - "Privacy policy, terms of use, open source" : MessageLookupByLibrary.simpleMessage("隱私政策,使用條款,開放源碼"), - "QR Code" : MessageLookupByLibrary.simpleMessage("QR 碼"), - "QR scanning requires camera access" : MessageLookupByLibrary.simpleMessage("QR 碼掃描需要攝影機存取權限"), - "Raspberry, Red" : MessageLookupByLibrary.simpleMessage("樹莓,紅色"), - "Recipients" : MessageLookupByLibrary.simpleMessage("收件人"), - "Refresh" : MessageLookupByLibrary.simpleMessage("重新整理"), - "Remind Me" : MessageLookupByLibrary.simpleMessage("提醒我"), - "Reminders" : MessageLookupByLibrary.simpleMessage("提醒"), - "Reminders have changed!" : MessageLookupByLibrary.simpleMessage("提醒功能已改變!"), - "Reply" : MessageLookupByLibrary.simpleMessage("回覆"), - "Reply All" : MessageLookupByLibrary.simpleMessage("全部回覆"), - "Report A Problem" : MessageLookupByLibrary.simpleMessage("報告問題"), - "Request Login Help" : MessageLookupByLibrary.simpleMessage("請求登入支援"), - "Request Login Help Button" : MessageLookupByLibrary.simpleMessage("請求登入支援按鈕"), - "Restart app" : MessageLookupByLibrary.simpleMessage("重新啟動應用程式"), - "Retry" : MessageLookupByLibrary.simpleMessage("重試"), - "Return to Login" : MessageLookupByLibrary.simpleMessage("返回登入頁面"), - "STUDENT" : MessageLookupByLibrary.simpleMessage("學生"), - "Screenshot showing location of QR code generation in browser" : MessageLookupByLibrary.simpleMessage("瀏覽器內的螢幕截圖顯示產生 QR 碼的位置"), - "Screenshot showing location of pairing QR code generation in the Canvas Student app" : MessageLookupByLibrary.simpleMessage("螢幕截圖顯示 Canvas Student 應用程式內產生配對 QR 碼的位置"), - "Select" : MessageLookupByLibrary.simpleMessage("選擇"), - "Select Student Color" : MessageLookupByLibrary.simpleMessage("選擇學生顏色"), - "Select recipients" : MessageLookupByLibrary.simpleMessage("選擇收件人"), - "Send Feedback" : MessageLookupByLibrary.simpleMessage("發送回饋"), - "Send a message about this assignment" : MessageLookupByLibrary.simpleMessage("傳送與此作業有關的訊息"), - "Send a message about this course" : MessageLookupByLibrary.simpleMessage("傳送與此學生有關的訊息"), - "Send message" : MessageLookupByLibrary.simpleMessage("傳送訊息"), - "Set a date and time to be notified of this event." : MessageLookupByLibrary.simpleMessage("設定通知此活動的日期和時間。"), - "Set a date and time to be notified of this specific assignment." : MessageLookupByLibrary.simpleMessage("設定通知此指定作業的日期和時間。"), - "Settings" : MessageLookupByLibrary.simpleMessage("設定"), - "Shamrock, Green" : MessageLookupByLibrary.simpleMessage("三葉草,綠色"), - "Share Your Love for the App" : MessageLookupByLibrary.simpleMessage("分享您對於本應用程式的喜愛"), - "Show Password" : MessageLookupByLibrary.simpleMessage("顯示密碼"), - "Sign In" : MessageLookupByLibrary.simpleMessage("登入"), - "Something went wrong trying to create your account, please reach out to your school for assistance." : MessageLookupByLibrary.simpleMessage("嘗試建立您的錯誤時發生錯誤,請聯絡您的學校尋求協助。"), - "Something\'s broken but I can work around it to get what I need done." : MessageLookupByLibrary.simpleMessage("有些地方出現了問題,但我能繞過問題實現我的目的。"), - "Stop Acting as User" : MessageLookupByLibrary.simpleMessage("停止作為使用者"), - "Student" : MessageLookupByLibrary.simpleMessage("學生"), - "Student Pairing" : MessageLookupByLibrary.simpleMessage("學生配對"), - "Students can create a QR code using the Canvas Student app on their mobile device" : MessageLookupByLibrary.simpleMessage("學生可以使用流動裝置上的 Canvas Student 應用程式創建 QR 碼"), - "Students can obtain a pairing code through the Canvas website" : MessageLookupByLibrary.simpleMessage("學生可以透過 Canvas 網站獲取配對碼"), - "Subject" : MessageLookupByLibrary.simpleMessage("主題"), - "Submitted" : MessageLookupByLibrary.simpleMessage("已提交"), - "Successfully submitted!" : MessageLookupByLibrary.simpleMessage("成功提交!"), - "Summary" : MessageLookupByLibrary.simpleMessage("摘要"), - "Switch Users" : MessageLookupByLibrary.simpleMessage("切換使用者"), - "Syllabus" : MessageLookupByLibrary.simpleMessage("課程大綱"), - "TA" : MessageLookupByLibrary.simpleMessage("助教"), - "TEACHER" : MessageLookupByLibrary.simpleMessage("教師"), - "Tap to favorite the courses you want to see on the Calendar. Select up to 10." : MessageLookupByLibrary.simpleMessage("點選以選擇您要在行事曆上看到的最愛課程。選擇最多 10 個。"), - "Tap to pair with a new student" : MessageLookupByLibrary.simpleMessage("點選以和新學生配對"), - "Tap to select this student" : MessageLookupByLibrary.simpleMessage("點選以選擇此學生"), - "Tap to show student selector" : MessageLookupByLibrary.simpleMessage("點選以顯示學生選擇器"), - "Teacher" : MessageLookupByLibrary.simpleMessage("教師"), - "Tell us about your favorite parts of the app" : MessageLookupByLibrary.simpleMessage("告訴我們本應用程式最讓您滿意之處"), - "Terms of Service" : MessageLookupByLibrary.simpleMessage("服務條款"), - "Terms of Service Link" : MessageLookupByLibrary.simpleMessage("服務條款連結"), - "Terms of Use" : MessageLookupByLibrary.simpleMessage("使用條款"), - "The QR code you scanned may have expired. Refresh the code on the student\'s device and try again." : MessageLookupByLibrary.simpleMessage("您所掃描的 QR 碼可能已經過期。請在學生的裝置上重新載入 QR 碼然後重試。"), - "The following information will help us better understand your idea:" : MessageLookupByLibrary.simpleMessage("下列資訊能幫我們好好理解您的想法:"), - "The server you entered is not authorized for this app." : MessageLookupByLibrary.simpleMessage("您輸入的伺服器未獲得使用該應用程式的授權。"), - "The student you are trying to add belongs to a different school. Log in or create an account with that school to scan this code." : MessageLookupByLibrary.simpleMessage("您嘗試添加的學生屬於另一所學校。請登入至該學校或在該學校創建帳戶以掃描此 QR 碼。"), - "The user agent for this app is not authorized." : MessageLookupByLibrary.simpleMessage("該應用程式的使用者代理未獲得授權。"), - "Theme" : MessageLookupByLibrary.simpleMessage("主題"), - "There are no installed applications that can open this file" : MessageLookupByLibrary.simpleMessage("未安裝可開啟此檔案的應用程式"), - "There is no page information available." : MessageLookupByLibrary.simpleMessage("沒有可用的頁面資訊。"), - "There was a problem loading the Terms of Use" : MessageLookupByLibrary.simpleMessage("載入使用條款時出現問題"), - "There was a problem removing this student from your account. Please check your connection and try again." : MessageLookupByLibrary.simpleMessage("從帳戶中移除此學生時發生問題。請檢查您的連接然後重試。"), - "There was an error loading recipients for this course" : MessageLookupByLibrary.simpleMessage("載入此課程的收件人時發生錯誤"), - "There was an error loading the summary details for this course." : MessageLookupByLibrary.simpleMessage("載入此課程的摘要詳細資料時發生錯誤。"), - "There was an error loading this announcement" : MessageLookupByLibrary.simpleMessage("載入此通告時發生錯誤"), - "There was an error loading this conversation" : MessageLookupByLibrary.simpleMessage("載入此交談時發生錯誤"), - "There was an error loading this file" : MessageLookupByLibrary.simpleMessage("載入此檔案時發生錯誤"), - "There was an error loading your inbox messages." : MessageLookupByLibrary.simpleMessage("載入您的收件匣訊息時發生錯誤。"), - "There was an error loading your student\'s alerts." : MessageLookupByLibrary.simpleMessage("載入您的學生的提醒時發生錯誤。"), - "There was an error loading your student\'s calendar" : MessageLookupByLibrary.simpleMessage("載入您的學生的行事曆時發生錯誤"), - "There was an error loading your students." : MessageLookupByLibrary.simpleMessage("載入您的學生時發生錯誤。"), - "There was an error loading your student’s courses." : MessageLookupByLibrary.simpleMessage("載入您的學生的課程時發生錯誤。"), - "There was an error logging in. Please generate another QR Code and try again." : MessageLookupByLibrary.simpleMessage("登入時出現錯誤。請產生另一個 QR 碼然後重試。"), - "There was an error trying to act as this user. Please check the Domain and User ID and try again." : MessageLookupByLibrary.simpleMessage("嘗試作為此使用者時出現錯誤。請檢查網域及使用者 ID 然後重試。"), - "There’s nothing to be notified of yet." : MessageLookupByLibrary.simpleMessage("尚未有任何通知。尚未有任何通知。"), - "This app is not authorized for use." : MessageLookupByLibrary.simpleMessage("該 app 程式未獲得使用權限。"), - "This course does not have any assignments or calendar events yet." : MessageLookupByLibrary.simpleMessage("此課程還沒有任何作業列表或行事曆。"), - "This file is unsupported and can’t be viewed through the app" : MessageLookupByLibrary.simpleMessage("不支援此檔案,而且無法透過應用程式檢視"), - "This will unpair and remove all enrollments for this student from your account." : MessageLookupByLibrary.simpleMessage("此操作將取消配對並從您的帳戶中移除所有此學生的註冊資料。"), - "Total Grade" : MessageLookupByLibrary.simpleMessage("總評級"), - "Uh oh!" : MessageLookupByLibrary.simpleMessage("噢!"), - "Unable to fetch courses. Please check your connection and try again." : MessageLookupByLibrary.simpleMessage("無法取得課程。請檢查您的連接然後重試。"), - "Unable to load this image" : MessageLookupByLibrary.simpleMessage("無法載入此影像"), - "Unable to play this media file" : MessageLookupByLibrary.simpleMessage("無法播放此媒體檔案"), - "Unable to send message. Check your connection and try again." : MessageLookupByLibrary.simpleMessage("無法傳送訊息。請檢查您的連線,然後再試一次。"), - "Under Construction" : MessageLookupByLibrary.simpleMessage("建構中"), - "Unknown User" : MessageLookupByLibrary.simpleMessage("未知使用者"), - "Unsaved changes" : MessageLookupByLibrary.simpleMessage("未儲存的變更"), - "Unsupported File" : MessageLookupByLibrary.simpleMessage("不支援的檔案"), - "Upload File" : MessageLookupByLibrary.simpleMessage("上傳檔案"), - "Use Camera" : MessageLookupByLibrary.simpleMessage("使用攝影機"), - "Use Dark Theme in Web Content" : MessageLookupByLibrary.simpleMessage("在網頁內容使用暗色外觀主題"), - "User ID" : MessageLookupByLibrary.simpleMessage("使用者 ID"), - "User ID:" : MessageLookupByLibrary.simpleMessage("使用者 ID:"), - "Version Number" : MessageLookupByLibrary.simpleMessage("版本編號"), - "View Description" : MessageLookupByLibrary.simpleMessage("查看描述"), - "View error details" : MessageLookupByLibrary.simpleMessage("檢視錯誤詳細資料"), - "View the Privacy Policy" : MessageLookupByLibrary.simpleMessage("檢視隱私政策"), - "We are currently building this feature for your viewing pleasure." : MessageLookupByLibrary.simpleMessage("我們目前正在建立讓您開心檢視的功能。"), - "We are unable to display this link, it may belong to an institution you currently aren\'t logged in to." : MessageLookupByLibrary.simpleMessage("我們無法顯示此連結,連結可能屬於您現在尚未登入的機構。"), - "We couldn\'t find any students associated with this account" : MessageLookupByLibrary.simpleMessage("我們找不到與此帳戶有關的任何學生"), - "We were unable to verify the server for use with this app." : MessageLookupByLibrary.simpleMessage("無法確認此應用程式使用的伺服器。"), - "We’re not sure what happened, but it wasn’t good. Contact us if this keeps happening." : MessageLookupByLibrary.simpleMessage("不確定發生什麼事,但不是好事。如果持續發生,請聯絡我們。"), - "What can we do better?" : MessageLookupByLibrary.simpleMessage("我們有何可改進之處?"), - "Yes" : MessageLookupByLibrary.simpleMessage("是"), - "You are not observing any students." : MessageLookupByLibrary.simpleMessage("您未正在觀察任何學生。"), - "You may only choose 10 calendars to display" : MessageLookupByLibrary.simpleMessage("您只能選擇顯示 10 個行事曆"), - "You must enter a user id" : MessageLookupByLibrary.simpleMessage("您必須輸入使用者 ID"), - "You must enter a valid domain" : MessageLookupByLibrary.simpleMessage("您必須輸入有效的網域"), - "You must select at least one calendar to display" : MessageLookupByLibrary.simpleMessage("必須選擇最少顯示一個行事曆"), - "You will be notified about this assignment on…" : MessageLookupByLibrary.simpleMessage("將在以下時間通知您關於此作業…"), - "You will be notified about this event on…" : MessageLookupByLibrary.simpleMessage("將在以下時間通知您關於此沽動…"), - "You\'ll find the QR code on the web in your account profile. Click \'QR for Mobile Login\' in the list." : MessageLookupByLibrary.simpleMessage("您可以在您的網上帳戶個人檔案找到這個 QR 碼。點擊列表內的「流動登入 QR 碼」。"), - "You\'ll need to open your student\'s Canvas Student app to continue. Go into Main Menu > Settings > Pair with Observer and scan the QR code you see there." : MessageLookupByLibrary.simpleMessage("您需要開啟學生的 Canvas Student 應用程式以繼續操作。前往主選單 > 設定 > 與觀察者配對,然後掃描該處顯示的 QR 碼。"), - "Your code is incorrect or expired." : MessageLookupByLibrary.simpleMessage("您的代碼錯誤或到期。"), - "Your student’s courses might not be published yet." : MessageLookupByLibrary.simpleMessage("您的學生的課程可能尚未發佈。"), - "You’re all caught up!" : MessageLookupByLibrary.simpleMessage("您已讀完所有新訊息!"), - "actingAsUser" : m0, - "alertsLabel" : MessageLookupByLibrary.simpleMessage("提醒"), - "appVersion" : m1, - "assignmentGradeAboveThreshold" : m2, - "assignmentGradeBelowThreshold" : m3, - "assignmentLockedModule" : m4, - "assignmentSubjectMessage" : m5, - "assignmentTotalPoints" : m6, - "assignmentTotalPointsAccessible" : m7, - "authorToNOthers" : m8, - "authorToRecipient" : m9, - "authorToRecipientAndNOthers" : m10, - "badgeNumberPlus" : m11, - "calendarLabel" : MessageLookupByLibrary.simpleMessage("行事曆"), - "canvasGuides" : MessageLookupByLibrary.simpleMessage("Canvas 指南"), - "canvasLogoLabel" : MessageLookupByLibrary.simpleMessage("Canvas 標誌"), - "canvasSupport" : MessageLookupByLibrary.simpleMessage("Canvas 支援"), - "changeStudentColorLabel" : m12, - "collapse" : MessageLookupByLibrary.simpleMessage("收起"), - "collapsed" : MessageLookupByLibrary.simpleMessage("收起"), - "contentDescriptionScoreOutOfPointsPossible" : m13, - "courseForWhom" : m14, - "courseGradeAboveThreshold" : m15, - "courseGradeBelowThreshold" : m16, - "coursesLabel" : MessageLookupByLibrary.simpleMessage("課程"), - "dateAtTime" : m17, - "dismissAlertLabel" : m18, - "domainSearchHelpBody" : m19, - "domainSearchHelpLabel" : MessageLookupByLibrary.simpleMessage("如何找到我的學校?"), - "domainSearchInputHint" : MessageLookupByLibrary.simpleMessage("輸入學校名稱或地區…"), - "dueDateAtTime" : m20, - "endMasqueradeLogoutMessage" : m21, - "endMasqueradeMessage" : m22, - "eventSubjectMessage" : m23, - "eventTime" : m24, - "expand" : MessageLookupByLibrary.simpleMessage("展開"), - "expanded" : MessageLookupByLibrary.simpleMessage("展開"), - "finalGrade" : m25, - "findSchool" : MessageLookupByLibrary.simpleMessage("尋找學校"), - "frontPageSubjectMessage" : m26, - "gradeFormatScoreOutOfPointsPossible" : m27, - "gradesSubjectMessage" : m28, - "latePenalty" : m29, - "me" : MessageLookupByLibrary.simpleMessage("我"), - "messageLinkPostscript" : m30, - "minus" : MessageLookupByLibrary.simpleMessage("減"), - "mustBeAboveN" : m31, - "mustBeBelowN" : m32, - "next" : MessageLookupByLibrary.simpleMessage("下一個"), - "nextMonth" : m33, - "nextWeek" : m34, - "noDomainResults" : m35, - "ok" : MessageLookupByLibrary.simpleMessage("確定"), - "outOfPoints" : m36, - "plusRecipientCount" : m37, - "pointsPossible" : m38, - "previousMonth" : m39, - "previousWeek" : m40, - "qrCreateAccountTos" : m41, - "ratingDialogEmailSubject" : m42, - "selectedMonthLabel" : m43, - "send" : MessageLookupByLibrary.simpleMessage("傳送"), - "starRating" : m44, - "submissionStatusSuccessSubtitle" : m45, - "syllabusSubjectMessage" : m46, - "unread" : MessageLookupByLibrary.simpleMessage("未讀"), - "unreadCount" : m47 - }; -} diff --git a/apps/flutter_parent/lib/l10n/res/intl_ar.arb b/apps/flutter_parent/lib/l10n/res/intl_ar.arb deleted file mode 100644 index 65ec9faab5..0000000000 --- a/apps/flutter_parent/lib/l10n/res/intl_ar.arb +++ /dev/null @@ -1,2753 +0,0 @@ -{ - "@@last_modified": "2023-08-25T11:04:20.901151", - "alertsLabel": "التنبيهات", - "@alertsLabel": { - "description": "The label for the Alerts tab", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "calendarLabel": "التقويم", - "@calendarLabel": { - "description": "The label for the Calendar tab", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "coursesLabel": "المساقات", - "@coursesLabel": { - "description": "The label for the Courses tab", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Students": "لا يوجد طلاب", - "@No Students": { - "description": "Text for when an observer has no students they are observing", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Tap to show student selector": "اضغط لإظهار أداة تحديد الطلاب", - "@Tap to show student selector": { - "description": "Semantics label for the area that will show the student selector when tapped", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Tap to pair with a new student": "اضغط لإقران مع طالب جديد", - "@Tap to pair with a new student": { - "description": "Semantics label for the add student button in the student selector", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Tap to select this student": "اضغط لتحديد هذا الطالب", - "@Tap to select this student": { - "description": "Semantics label on individual students in the student switcher", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Manage Students": "إدارة الطلاب", - "@Manage Students": { - "description": "Label text for the Manage Students nav drawer button as well as the title for the Manage Students screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Help": "المساعدة", - "@Help": { - "description": "Label text for the help nav drawer button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Log Out": "تسجيل الخروج", - "@Log Out": { - "description": "Label text for the Log Out nav drawer button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Switch Users": "تبديل المستخدمين", - "@Switch Users": { - "description": "Label text for the Switch Users nav drawer button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "appVersion": "إصدار {version}", - "@appVersion": { - "description": "App version shown in the navigation drawer", - "type": "text", - "placeholders_order": [ - "version" - ], - "placeholders": { - "version": {} - } - }, - "Are you sure you want to log out?": "هل تريد بالتأكيد تسجيل الخروج؟", - "@Are you sure you want to log out?": { - "description": "Confirmation message displayed when the user tries to log out", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Calendars": "التقويمات", - "@Calendars": { - "description": "Label for button that lets users select which calendars to display", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "nextMonth": "الشهر القادم: {month}", - "@nextMonth": { - "description": "Label for the button that switches the calendar to the next month", - "type": "text", - "placeholders_order": [ - "month" - ], - "placeholders": { - "month": {} - } - }, - "previousMonth": "الشهر السابق: {month}", - "@previousMonth": { - "description": "Label for the button that switches the calendar to the previous month", - "type": "text", - "placeholders_order": [ - "month" - ], - "placeholders": { - "month": {} - } - }, - "nextWeek": "الأسبوع القادم بدءاً من {date}", - "@nextWeek": { - "description": "Label for the button that switches the calendar to the next week", - "type": "text", - "placeholders_order": [ - "date" - ], - "placeholders": { - "date": {} - } - }, - "previousWeek": "الأسبوع الماضي بدءاً من {date}", - "@previousWeek": { - "description": "Label for the button that switches the calendar to the previous week", - "type": "text", - "placeholders_order": [ - "date" - ], - "placeholders": { - "date": {} - } - }, - "selectedMonthLabel": "شهر {month}", - "@selectedMonthLabel": { - "description": "Accessibility label for the button that expands/collapses the month view", - "type": "text", - "placeholders_order": [ - "month" - ], - "placeholders": { - "month": {} - } - }, - "expand": "توسيع", - "@expand": { - "description": "Accessibility label for the on-tap hint for the button that expands/collapses the month view", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "collapse": "طي", - "@collapse": { - "description": "Accessibility label for the on-tap hint for the button that expands/collapses the month view", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "pointsPossible": "{points} من النقاط الممكنة", - "@pointsPossible": { - "description": "Screen reader label used for the points possible for an assignment, quiz, etc.", - "type": "text", - "placeholders_order": [ - "points" - ], - "placeholders": { - "points": {} - } - }, - "calendarDaySemanticsLabel": "{eventCount,plural, =1{{date}، {eventCount} حدث}other{{date}، {eventCount} أحداث}}", - "@calendarDaySemanticsLabel": { - "description": "Screen reader label used for calendar day, reads the date and count of events", - "type": "text", - "placeholders_order": [ - "date", - "eventCount" - ], - "placeholders": { - "date": {}, - "eventCount": {} - } - }, - "No Events Today!": "لا توجد أحداث اليوم!", - "@No Events Today!": { - "description": "Title displayed when there are no calendar events for the current day", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "It looks like a great day to rest, relax, and recharge.": "يبدو أنه يوم رائع للراحة والاسترخاء وتجديد النشاط.", - "@It looks like a great day to rest, relax, and recharge.": { - "description": "Message displayed when there are no calendar events for the current day", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading your student's calendar": "حدث خطأ أثناء تحميل تقويم الطالب", - "@There was an error loading your student's calendar": { - "description": "Message displayed when calendar events could not be loaded for the current student", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Tap to favorite the courses you want to see on the Calendar. Select up to 10.": "اضغط إضافة المساقات إلى المفضلة التي ترغب في رؤيتها على التقويم. تحديد 10 بحد أقصى.", - "@Tap to favorite the courses you want to see on the Calendar. Select up to 10.": { - "description": "Description text on calendar filter screen.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You may only choose 10 calendars to display": "يمكنك اختيار 10 تقويمات فقط لعرضها", - "@You may only choose 10 calendars to display": { - "description": "Error text when trying to select more than 10 calendars", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You must select at least one calendar to display": "يجب عليك تحديد تقويم واحد على الأقل للعرض", - "@You must select at least one calendar to display": { - "description": "Error text when trying to de-select all calendars", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Planner Note": "ملاحظة المخطِط", - "@Planner Note": { - "description": "Label used for notes in the planner", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Go to today": "الذهاب إلى اليوم", - "@Go to today": { - "description": "Accessibility label used for the today button in the planner", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Previous Logins": "عمليات تسجيل الدخول السابقة", - "@Previous Logins": { - "description": "Label for the list of previous user logins", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "canvasLogoLabel": "شعار Canvas", - "@canvasLogoLabel": { - "description": "The semantics label for the Canvas logo", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "findSchool": "البحث عن مدرسة", - "@findSchool": { - "description": "Text for the find-my-school button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "findAnotherSchool": "ابحث عن مدرسة أخرى", - "@findAnotherSchool": { - "description": "Text for the find-another-school button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "domainSearchInputHint": "أدخل اسم المدرسة أو الدائرة التعليمية...", - "@domainSearchInputHint": { - "description": "Input hint for the text box on the domain search screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "noDomainResults": "يتعذر العثور على مدارس مطابقة \"{query}\"", - "@noDomainResults": { - "description": "Message shown to users when the domain search query did not return any results", - "type": "text", - "placeholders_order": [ - "query" - ], - "placeholders": { - "query": {} - } - }, - "domainSearchHelpLabel": "كيف أعثر على مدرستي أو دائرتي التعليمية؟", - "@domainSearchHelpLabel": { - "description": "Label for the help button on the domain search screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "canvasGuides": "Canvas Guides", - "@canvasGuides": { - "description": "Proper name for the Canvas Guides. This will be used in the domainSearchHelpBody text and will be highlighted and clickable", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "canvasSupport": "Canvas Support", - "@canvasSupport": { - "description": "Proper name for Canvas Support. This will be used in the domainSearchHelpBody text and will be highlighted and clickable", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "domainSearchHelpBody": "جرب البحث عن اسم المدرسة أو الدائرة التعليمية التي تحاول الوصول إليها مثل \"Smith Private School\" أو \"Smith County Schools\". يمكنك أيضاً الدخول في مجال Canvas مباشرة، مثل \"smith.instructure.com.\"\n\nللمزيد من المعلومات حول العثور على حساب Canvas للمؤسسة التي تبحث عنها، يمكنك زيارة {canvasGuides} أو التواصل مع {canvasSupport} أو الاتصال بمدرستك لطلب المساعدة.", - "@domainSearchHelpBody": { - "description": "The body text shown in the help dialog on the domain search screen", - "type": "text", - "placeholders_order": [ - "canvasGuides", - "canvasSupport" - ], - "placeholders": { - "canvasGuides": {}, - "canvasSupport": {} - } - }, - "Uh oh!": "عذرًا!", - "@Uh oh!": { - "description": "Title of the screen that shows when a crash has occurred", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "We’re not sure what happened, but it wasn’t good. Contact us if this keeps happening.": "لا نعلم ما حدث على وجه الدقة، ولكنه لم يكن أمراً جيداً. اتصل بنا إذا استمر هذا في الحدوث.", - "@We’re not sure what happened, but it wasn’t good. Contact us if this keeps happening.": { - "description": "Message shown when a crash has occurred", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Contact Support": "اتصل بالدعم", - "@Contact Support": { - "description": "Label for the button that allows users to contact support after a crash has occurred", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "View error details": "عرض تفاصيل الخطأ", - "@View error details": { - "description": "Label for the button that allowed users to view crash details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Restart app": "إعادة تشغيل التطبيق", - "@Restart app": { - "description": "Label for the button that will restart the entire application", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Application version": "إصدار التطبيق", - "@Application version": { - "description": "Label for the application version displayed in the crash details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Device model": "طراز الجهاز", - "@Device model": { - "description": "Label for the device model displayed in the crash details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Android OS version": "إصدار نظام تشغيل Android", - "@Android OS version": { - "description": "Label for the Android operating system version displayed in the crash details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Full error message": "رسالة الخطأ الكاملة", - "@Full error message": { - "description": "Label for the full error message displayed in the crash details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Inbox": "علبة الوارد", - "@Inbox": { - "description": "Title for the Inbox screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading your inbox messages.": "حدث خطأ أثناء تحميل رسائلك في علبة الوارد.", - "@There was an error loading your inbox messages.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Subject": "لا يوجد موضوع", - "@No Subject": { - "description": "Title used for inbox messages that have no subject", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unable to fetch courses. Please check your connection and try again.": "يتعذر إحضار المساقات. يرجى التحقق من الاتصال وإعادة المحاولة.", - "@Unable to fetch courses. Please check your connection and try again.": { - "description": "Message shown when an error occured while loading courses", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Choose a course to message": "اختر مساقاً لإرسال رسالة", - "@Choose a course to message": { - "description": "Header in the course list shown when the user is choosing which course to associate with a new message", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Inbox Zero": "علبة الوارد صفر", - "@Inbox Zero": { - "description": "Title of the message shown when there are no inbox messages", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You’re all caught up!": "لقد اطلعت عليها جميعًا!", - "@You’re all caught up!": { - "description": "Subtitle of the message shown when there are no inbox messages", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading recipients for this course": "حدث خطأ أثناء تحميل متلقين لهذا المساق", - "@There was an error loading recipients for this course": { - "description": "Message shown when attempting to create a new message but the recipients list failed to load", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unable to send message. Check your connection and try again.": "يتعذر إرسال رسالة. تحقق من الاتصال وأعد المحاولة.", - "@Unable to send message. Check your connection and try again.": { - "description": "Message show when there was an error creating or sending a new message", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unsaved changes": "تغييرات غير محفوظة", - "@Unsaved changes": { - "description": "Title of the dialog shown when the user tries to leave with unsaved changes", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Are you sure you wish to close this page? Your unsent message will be lost.": "هل ترغب بالتأكيد في إغلاق هذه الصفحة؟ سيتم فقد رسالتك غير المرسلة.", - "@Are you sure you wish to close this page? Your unsent message will be lost.": { - "description": "Body text of the dialog shown when the user tries leave with unsaved changes", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "New message": "رسالة جديدة", - "@New message": { - "description": "Title of the new-message screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Add attachment": "إضافة مرفق", - "@Add attachment": { - "description": "Tooltip for the add-attachment button in the new-message screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Send message": "إرسال رسالة", - "@Send message": { - "description": "Tooltip for the send-message button in the new-message screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Select recipients": "تحديد متلقين", - "@Select recipients": { - "description": "Tooltip for the button that allows users to select message recipients", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No recipients selected": "لم يتم تحديد متلقين", - "@No recipients selected": { - "description": "Hint displayed when the user has not selected any message recipients", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Message subject": "موضوع الرسالة", - "@Message subject": { - "description": "Hint text displayed in the input field for the message subject", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Message": "الرسالة", - "@Message": { - "description": "Hint text displayed in the input field for the message body", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Recipients": "المتلقون", - "@Recipients": { - "description": "Label for message recipients", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "plusRecipientCount": "+{count}", - "@plusRecipientCount": { - "description": "Shows the number of recipients that are selected but not displayed on screen.", - "type": "text", - "placeholders_order": [ - "count" - ], - "placeholders": { - "count": { - "example": 5 - } - } - }, - "Failed. Tap for options.": "فشل. اضغط للوصول إلى الخيارات.", - "@Failed. Tap for options.": { - "description": "Short message shown on a message attachment when uploading has failed", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "courseForWhom": "بالنسبة لـ {studentShortName}", - "@courseForWhom": { - "description": "Describes for whom a course is for (i.e. for Bill)", - "type": "text", - "placeholders_order": [ - "studentShortName" - ], - "placeholders": { - "studentShortName": {} - } - }, - "messageLinkPostscript": "بخصوص: {studentName}, {linkUrl}", - "@messageLinkPostscript": { - "description": "A postscript appended to new messages that clarifies which student is the subject of the message and also includes a URL for the related Canvas component (course, assignment, event, etc).", - "type": "text", - "placeholders_order": [ - "studentName", - "linkUrl" - ], - "placeholders": { - "studentName": {}, - "linkUrl": {} - } - }, - "There was an error loading this conversation": "حدث خطأ أثناء تحميل هذه المحادثة", - "@There was an error loading this conversation": { - "description": "Message shown when a conversation fails to load", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Reply": "رد", - "@Reply": { - "description": "Button label for replying to a conversation", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Reply All": "رد على الكل", - "@Reply All": { - "description": "Button label for replying to all conversation participants", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unknown User": "مستخدم غير معروف", - "@Unknown User": { - "description": "Label used where the user name is not known", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "me": "أنا", - "@me": { - "description": "First-person pronoun (i.e. 'me') that will be used in message author info, e.g. 'Me to 4 others' or 'Jon Snow to me'", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "authorToRecipient": "{authorName} إلى {recipientName}", - "@authorToRecipient": { - "description": "Author info for a single-recipient message; includes both the author name and the recipient name.", - "type": "text", - "placeholders_order": [ - "authorName", - "recipientName" - ], - "placeholders": { - "authorName": {}, - "recipientName": {} - } - }, - "authorToNOthers": "{howMany,plural, =1{{authorName} إلى 1 آخرين}other{{authorName} إلى {howMany} آخرين}}", - "@authorToNOthers": { - "description": "Author info for a mutli-recipient message; includes the author name and the number of recipients", - "type": "text", - "placeholders_order": [ - "authorName", - "howMany" - ], - "placeholders": { - "authorName": {}, - "howMany": {} - } - }, - "authorToRecipientAndNOthers": "{howMany,plural, =1{{authorName} إلى {recipientName} و 1 أخرى}other{{authorName} آخر إلى {recipientName} و {howMany} أخرى}}", - "@authorToRecipientAndNOthers": { - "description": "Author info for a multi-recipient message; includes the author name, one recipient name, and the number of other recipients", - "type": "text", - "placeholders_order": [ - "authorName", - "recipientName", - "howMany" - ], - "placeholders": { - "authorName": {}, - "recipientName": {}, - "howMany": {} - } - }, - "Download": "تنزيل", - "@Download": { - "description": "Label for the button that will begin downloading a file", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Open with another app": "فتح بواسطة تطبيق آخر", - "@Open with another app": { - "description": "Label for the button that will allow users to open a file with another app", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There are no installed applications that can open this file": "لا توجد تطبيقات مثبتة يمكن من خلالها فتح هذا الملف", - "@There are no installed applications that can open this file": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unsupported File": "الملف غير مدعوم", - "@Unsupported File": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "This file is unsupported and can’t be viewed through the app": "هذا الملف غير مدعوم ولا يمكن عرضه من خلال التطبيق", - "@This file is unsupported and can’t be viewed through the app": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unable to play this media file": "يتعذر تشغيل ملف الوسائط هذا", - "@Unable to play this media file": { - "description": "Message shown when audio or video media could not be played", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unable to load this image": "يتعذر تحميل هذه الصورة", - "@Unable to load this image": { - "description": "Message shown when an image file could not be loaded or displayed", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading this file": "حدث خطأ أثناء تحميل هذا الملف", - "@There was an error loading this file": { - "description": "Message shown when a file could not be loaded or displayed", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Courses": "لا يوجد أي مساق", - "@No Courses": { - "description": "Title for having no courses", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Your student’s courses might not be published yet.": "ربما لم يتم نشر مساقات الطالب بعد.", - "@Your student’s courses might not be published yet.": { - "description": "Message for having no courses", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading your student’s courses.": "حدث خطأ أثناء تحميل مساقات الطالب لديك.", - "@There was an error loading your student’s courses.": { - "description": "Message displayed when the list of student courses could not be loaded", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Grade": "لا توجد أي درجة", - "@No Grade": { - "description": "Message shown when there is currently no grade available for a course", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Filter by": "التصفية حسب", - "@Filter by": { - "description": "Title for list of terms to filter grades by", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Grades": "التقديرات", - "@Grades": { - "description": "Label for the \"Grades\" tab in course details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Syllabus": "المنهج الدراسي", - "@Syllabus": { - "description": "Label for the \"Syllabus\" tab in course details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Front Page": "الصفحة الأمامية", - "@Front Page": { - "description": "Label for the \"Front Page\" tab in course details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Summary": "الملخص", - "@Summary": { - "description": "Label for the \"Summary\" tab in course details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Send a message about this course": "إرسال رسالة حول هذا المساق", - "@Send a message about this course": { - "description": "Accessibility hint for the course messaage floating action button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Total Grade": "التقدير الإجمالي", - "@Total Grade": { - "description": "Label for the total grade in the course", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Graded": "تم تقييم الدرجة", - "@Graded": { - "description": "Label for assignments that have been graded", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Submitted": "تم الإرسال", - "@Submitted": { - "description": "Label for assignments that have been submitted", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Not Submitted": "لم يتم الإرسال", - "@Not Submitted": { - "description": "Label for assignments that have not been submitted", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Late": "متأخر", - "@Late": { - "description": "Label for assignments that have been marked late or submitted late", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Missing": "مفقود", - "@Missing": { - "description": "Label for assignments that have been marked missing or are not submitted and past the due date", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "-": "-", - "@-": { - "description": "Value representing no score for student submission", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "All Grading Periods": "جميع فترات تقييم الدرجات", - "@All Grading Periods": { - "description": "Label for selecting all grading periods", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Assignments": "لا توجد أي مهام", - "@No Assignments": { - "description": "Title for the no assignments message", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "It looks like assignments haven't been created in this space yet.": "يبدو أنه لم يتم إنشاء مهام في هذه المساحة حتى الآن.", - "@It looks like assignments haven't been created in this space yet.": { - "description": "Message for no assignments", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading the summary details for this course.": "حدث خطأ أثناء تحميل تفاصيل الملخص لهذا المساق.", - "@There was an error loading the summary details for this course.": { - "description": "Message shown when the course summary could not be loaded", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Summary": "لا يوجد ملخص", - "@No Summary": { - "description": "Title displayed when there are no items in the course summary", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "This course does not have any assignments or calendar events yet.": "لا يحتوي هذا المساق على أي مهام أو أحداث بالتقويم حتى الآن.", - "@This course does not have any assignments or calendar events yet.": { - "description": "Message displayed when there are no items in the course summary", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "gradeFormatScoreOutOfPointsPossible": "{score} / {pointsPossible}", - "@gradeFormatScoreOutOfPointsPossible": { - "description": "Formatted string for a student score out of the points possible", - "type": "text", - "placeholders_order": [ - "score", - "pointsPossible" - ], - "placeholders": { - "score": {}, - "pointsPossible": {} - } - }, - "contentDescriptionScoreOutOfPointsPossible": "{score} من إجمالي {pointsPossible} نقاط", - "@contentDescriptionScoreOutOfPointsPossible": { - "description": "Formatted string for a student score out of the points possible", - "type": "text", - "placeholders_order": [ - "score", - "pointsPossible" - ], - "placeholders": { - "score": {}, - "pointsPossible": {} - } - }, - "gradesSubjectMessage": "بخصوص: {studentName}، الدرجات", - "@gradesSubjectMessage": { - "description": "The subject line for a message to a teacher regarding a student's grades", - "type": "text", - "placeholders_order": [ - "studentName" - ], - "placeholders": { - "studentName": {} - } - }, - "syllabusSubjectMessage": "بخصوص: {studentName}، المخطط الدراسي", - "@syllabusSubjectMessage": { - "description": "The subject line for a message to a teacher regarding a course syllabus", - "type": "text", - "placeholders_order": [ - "studentName" - ], - "placeholders": { - "studentName": {} - } - }, - "frontPageSubjectMessage": "بخصوص: {studentName}، الصفحة الأمامية", - "@frontPageSubjectMessage": { - "description": "The subject line for a message to a teacher regarding a course front page", - "type": "text", - "placeholders_order": [ - "studentName" - ], - "placeholders": { - "studentName": {} - } - }, - "assignmentSubjectMessage": "بخصوص: {studentName}، المهمة - {assignmentName}", - "@assignmentSubjectMessage": { - "description": "The subject line for a message to a teacher regarding a student's assignment", - "type": "text", - "placeholders_order": [ - "studentName", - "assignmentName" - ], - "placeholders": { - "studentName": {}, - "assignmentName": {} - } - }, - "eventSubjectMessage": "بخصوص: {studentName}، الحدث - {eventTitle}", - "@eventSubjectMessage": { - "description": "The subject line for a message to a teacher regarding a calendar event", - "type": "text", - "placeholders_order": [ - "studentName", - "eventTitle" - ], - "placeholders": { - "studentName": {}, - "eventTitle": {} - } - }, - "There is no page information available.": "لا تتوفر أي صفحة معلومات.", - "@There is no page information available.": { - "description": "Description for when no page information is available", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Assignment Details": "تفاصيل المهمة", - "@Assignment Details": { - "description": "Title for the page that shows details for an assignment", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "assignmentTotalPoints": "{points} من النقاط", - "@assignmentTotalPoints": { - "description": "Label used for the total points the assignment is worth", - "type": "text", - "placeholders_order": [ - "points" - ], - "placeholders": { - "points": {} - } - }, - "assignmentTotalPointsAccessible": "{points} من النقاط", - "@assignmentTotalPointsAccessible": { - "description": "Screen reader label used for the total points the assignment is worth", - "type": "text", - "placeholders_order": [ - "points" - ], - "placeholders": { - "points": {} - } - }, - "Due": "الاستحقاق", - "@Due": { - "description": "Label for an assignment due date", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Grade": "التقدير", - "@Grade": { - "description": "Label for the section that displays an assignment's grade", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Locked": "مؤمّن", - "@Locked": { - "description": "Label for when an assignment is locked", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "assignmentLockedModule": "هذه المهمة مؤمّنة بسبب الوحدة المنطقية \"{moduleName}\".", - "@assignmentLockedModule": { - "description": "The locked description when an assignment is locked by a module", - "type": "text", - "placeholders_order": [ - "moduleName" - ], - "placeholders": { - "moduleName": {} - } - }, - "Remind Me": "ذكرني", - "@Remind Me": { - "description": "Label for the row to set reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Set a date and time to be notified of this specific assignment.": "تعيين تاريخ ووقت للإعلام بهذه المهمة المحددة.", - "@Set a date and time to be notified of this specific assignment.": { - "description": "Description for row to set reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You will be notified about this assignment on…": "سيتم إعلامك بهذه المهمة في...", - "@You will be notified about this assignment on…": { - "description": "Description for when a reminder is set", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Instructions": "الإرشادات", - "@Instructions": { - "description": "Label for the description of the assignment when it has quiz instructions", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Send a message about this assignment": "إرسال رسالة حول هذه المهمة", - "@Send a message about this assignment": { - "description": "Accessibility hint for the assignment messaage floating action button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "This app is not authorized for use.": "هذا التطبيق غير مخول للاستخدام.", - "@This app is not authorized for use.": { - "description": "The error shown when the app being used is not verified by Canvas", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The server you entered is not authorized for this app.": "الخادم الذي أدخلته غير مخول لهذا التطبيق.", - "@The server you entered is not authorized for this app.": { - "description": "The error shown when the desired login domain is not verified by Canvas", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The user agent for this app is not authorized.": "وكيل المستخدم لهذا التطبيق غير مخوَّل.", - "@The user agent for this app is not authorized.": { - "description": "The error shown when the user agent during verification is not verified by Canvas", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "We were unable to verify the server for use with this app.": "لم نتمكن من التحقق من الخادم لاستخدامه مع هذا التطبيق.", - "@We were unable to verify the server for use with this app.": { - "description": "The generic error shown when we are unable to verify with Canvas", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Reminders": "التذكيرات", - "@Reminders": { - "description": "Name of the system notification channel for assignment and event reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Notifications for reminders about assignments and calendar events": "إعلامات لتذكيرات حول المهام وأحداث التقويم", - "@Notifications for reminders about assignments and calendar events": { - "description": "Description of the system notification channel for assignment and event reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Reminders have changed!": "تم تغيير التذكيرات!", - "@Reminders have changed!": { - "description": "Title of the dialog shown when the user needs to update their reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "In order to provide you with a better experience, we have updated how reminders work. You can add new reminders by viewing an assignment or calendar event and tapping the switch under the \"Remind Me\" section.\n\nBe aware that any reminders created with older versions of this app will not be compatible with the new changes and you will need to create them again.": "لتقديم تجربة أفضل، قمنا بتحديث طريقة التذكيرات. يمكنك إضافة تذكيرات جديدة عن طريق عرض حدث مهمة أو تقويم والضغط على المفتاح تحت قسم \"ذكرني\".\n\nاعلم أن أي تذكيرات يتم إنشاؤها بإصدارات أقدم من هذا التطبيق ستكون غير متوافقة مع التغييرات الجديدة وستحتاج إلى إنشائها مجدداً.", - "@In order to provide you with a better experience, we have updated how reminders work. You can add new reminders by viewing an assignment or calendar event and tapping the switch under the \"Remind Me\" section.\n\nBe aware that any reminders created with older versions of this app will not be compatible with the new changes and you will need to create them again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Not a parent?": "لست ولي أمر؟", - "@Not a parent?": { - "description": "Title for the screen that shows when the user is not observing any students", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "We couldn't find any students associated with this account": "تعذر علينا العثور على أي طلاب مقترنين بهذا الحساب", - "@We couldn't find any students associated with this account": { - "description": "Subtitle for the screen that shows when the user is not observing any students", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Are you a student or teacher?": "هل أنت طالب أو معلم؟", - "@Are you a student or teacher?": { - "description": "Label for button that will show users the option to view other Canvas apps in the Play Store", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "One of our other apps might be a better fit. Tap one to visit the Play Store.": "ربما تكون إحدى تطبيقاتنا الأخرى مناسبة بشكل أفضل. اضغط على واحد لزيارة Play Store.", - "@One of our other apps might be a better fit. Tap one to visit the Play Store.": { - "description": "Description of options to view other Canvas apps in the Play Store", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Return to Login": "العودة إلى تسجيل الدخول", - "@Return to Login": { - "description": "Label for the button that returns the user to the login screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "STUDENT": "الطالب", - "@STUDENT": { - "description": "The \"student\" portion of the \"Canvas Student\" app name, in all caps. \"Canvas\" is excluded in this context as it will be displayed to the user as a wordmark image", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "TEACHER": "المعلم", - "@TEACHER": { - "description": "The \"teacher\" portion of the \"Canvas Teacher\" app name, in all caps. \"Canvas\" is excluded in this context as it will be displayed to the user as a wordmark image", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Canvas Student": "Canvas Student", - "@Canvas Student": { - "description": "The name of the Canvas Student app. Only \"Student\" should be translated as \"Canvas\" is a brand name in this context and should not be translated.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Canvas Teacher": "Canvas Teacher", - "@Canvas Teacher": { - "description": "The name of the Canvas Teacher app. Only \"Teacher\" should be translated as \"Canvas\" is a brand name in this context and should not be translated.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Alerts": "لا توجد تنبيهات", - "@No Alerts": { - "description": "The title for the empty message to show to users when there are no alerts for the student.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There’s nothing to be notified of yet.": "لا يوجد شيء للإعلام عنه حتى الآن.", - "@There’s nothing to be notified of yet.": { - "description": "The empty message to show to users when there are no alerts for the student.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "dismissAlertLabel": "تجاهل {alertTitle}", - "@dismissAlertLabel": { - "description": "Accessibility label to dismiss an alert", - "type": "text", - "placeholders_order": [ - "alertTitle" - ], - "placeholders": { - "alertTitle": {} - } - }, - "Course Announcement": "إعلان المساق", - "@Course Announcement": { - "description": "Title for alerts when there is a course announcement", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Institution Announcement": "إعلان المؤسسة", - "@Institution Announcement": { - "description": "Title for alerts when there is an institution announcement", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "assignmentGradeAboveThreshold": "تقييم المهمة أعلاه {threshold}", - "@assignmentGradeAboveThreshold": { - "description": "Title for alerts when an assignment grade is above the threshold value", - "type": "text", - "placeholders_order": [ - "threshold" - ], - "placeholders": { - "threshold": {} - } - }, - "assignmentGradeBelowThreshold": "تقييم المهمة أدناه {threshold}", - "@assignmentGradeBelowThreshold": { - "description": "Title for alerts when an assignment grade is below the threshold value", - "type": "text", - "placeholders_order": [ - "threshold" - ], - "placeholders": { - "threshold": {} - } - }, - "courseGradeAboveThreshold": "تقييم المساق أعلاه {threshold}", - "@courseGradeAboveThreshold": { - "description": "Title for alerts when a course grade is above the threshold value", - "type": "text", - "placeholders_order": [ - "threshold" - ], - "placeholders": { - "threshold": {} - } - }, - "courseGradeBelowThreshold": "تقييم المساق أدناه {threshold}", - "@courseGradeBelowThreshold": { - "description": "Title for alerts when a course grade is below the threshold value", - "type": "text", - "placeholders_order": [ - "threshold" - ], - "placeholders": { - "threshold": {} - } - }, - "Settings": "الإعدادات", - "@Settings": { - "description": "Title for the settings screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Theme": "النسق", - "@Theme": { - "description": "Label for the light/dark theme section in the settings page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Dark Mode": "وضع داكن", - "@Dark Mode": { - "description": "Label for the button that enables dark mode", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Light Mode": "وضع فاتح", - "@Light Mode": { - "description": "Label for the button that enables light mode", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "High Contrast Mode": "وضع عالي التباين", - "@High Contrast Mode": { - "description": "Label for the switch that toggles high contrast mode", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Use Dark Theme in Web Content": "استخدام النسق الداكن في محتوى الويب", - "@Use Dark Theme in Web Content": { - "description": "Label for the switch that toggles dark mode for webviews", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Appearance": "المظهر", - "@Appearance": { - "description": "Label for the appearance section in the settings page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Successfully submitted!": "تم الإرسال بنجاح!", - "@Successfully submitted!": { - "description": "Title displayed in the grade cell for an assignment that has been submitted", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "submissionStatusSuccessSubtitle": "تم إرسال هذه المهمة في {date} {time} وبانتظار التقييم", - "@submissionStatusSuccessSubtitle": { - "description": "Subtitle displayed in the grade cell for an assignment that has been submitted and is awaiting a grade", - "type": "text", - "placeholders_order": [ - "date", - "time" - ], - "placeholders": { - "date": {}, - "time": {} - } - }, - "outOfPoints": "{howMany,plural, =1{من إجمالي 1 نقطة}other{من إجمالي {points} نقاط}}", - "@outOfPoints": { - "description": "Description for an assignment grade that has points without a current scoroe", - "type": "text", - "placeholders_order": [ - "points", - "howMany" - ], - "placeholders": { - "points": {}, - "howMany": {} - } - }, - "Excused": "معفى", - "@Excused": { - "description": "Grading status for an assignment marked as excused", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Complete": "مكتمل", - "@Complete": { - "description": "Grading status for an assignment marked as complete", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Incomplete": "غير مكتمل", - "@Incomplete": { - "description": "Grading status for an assignment marked as incomplete", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "minus": "سالب", - "@minus": { - "description": "Screen reader-friendly replacement for the \"-\" character in letter grades like \"A-\"", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "latePenalty": "عقوبة التأخير (-{pointsLost})", - "@latePenalty": { - "description": "Text displayed when a late penalty has been applied to the assignment", - "type": "text", - "placeholders_order": [ - "pointsLost" - ], - "placeholders": { - "pointsLost": {} - } - }, - "finalGrade": "الدرجة النهائية: {grade}", - "@finalGrade": { - "description": "Text that displays the final grade of an assignment", - "type": "text", - "placeholders_order": [ - "grade" - ], - "placeholders": { - "grade": {} - } - }, - "Alert Settings": "إعدادات التنبيه", - "@Alert Settings": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Alert me when…": "تنبيهي عندما...", - "@Alert me when…": { - "description": "Header for the screen where the observer chooses the thresholds that will determine when they receive alerts (e.g. when an assignment is graded below 70%)", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Course grade below": "تقييم المساق أدناه", - "@Course grade below": { - "description": "Label describing the threshold for when the course grade is below a certain percentage", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Course grade above": "تقييم المساق أعلاه", - "@Course grade above": { - "description": "Label describing the threshold for when the course grade is above a certain percentage", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Assignment missing": "مهمة مفقودة", - "@Assignment missing": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Assignment grade below": "تقييم المهمة أدناه", - "@Assignment grade below": { - "description": "Label describing the threshold for when an assignment is graded below a certain percentage", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Assignment grade above": "تقييم المهمة أعلاه", - "@Assignment grade above": { - "description": "Label describing the threshold for when an assignment is graded above a certain percentage", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Course Announcements": "إعلانات المساق", - "@Course Announcements": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Institution Announcements": "إعلانات المؤسسة", - "@Institution Announcements": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Never": "أبدًا", - "@Never": { - "description": "Indication that tells the user they will not receive alert notifications of a specific kind", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Grade percentage": "النسبة المئوية للدرجة", - "@Grade percentage": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading your student's alerts.": "حدث خطأ أثناء تحميل تنبيهات الطالب.", - "@There was an error loading your student's alerts.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Must be below 100": "يجب أن تقل عن 100", - "@Must be below 100": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "mustBeBelowN": "يجب أن تقل عن {percentage}", - "@mustBeBelowN": { - "description": "Validation error to the user that they must choose a percentage below 'n'", - "type": "text", - "placeholders_order": [ - "percentage" - ], - "placeholders": { - "percentage": { - "example": 5 - } - } - }, - "mustBeAboveN": "يجب أن تزيد عن {percentage}", - "@mustBeAboveN": { - "description": "Validation error to the user that they must choose a percentage above 'n'", - "type": "text", - "placeholders_order": [ - "percentage" - ], - "placeholders": { - "percentage": { - "example": 5 - } - } - }, - "Select Student Color": "حدد اللون المخصص للطالب", - "@Select Student Color": { - "description": "Title for screen that allows users to assign a color to a specific student", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Electric, blue": "أزرق، كهربائي", - "@Electric, blue": { - "description": "Name of the Electric (blue) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Plum, Purple": "أرجواني، برقوقي", - "@Plum, Purple": { - "description": "Name of the Plum (purple) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Barney, Fuschia": "فوشيا، بارني", - "@Barney, Fuschia": { - "description": "Name of the Barney (fuschia) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Raspberry, Red": "أحمر، لون التوت", - "@Raspberry, Red": { - "description": "Name of the Raspberry (red) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Fire, Orange": "برتقالي، ناري", - "@Fire, Orange": { - "description": "Name of the Fire (orange) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Shamrock, Green": "أخضر، النفل", - "@Shamrock, Green": { - "description": "Name of the Shamrock (green) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "An error occurred while saving your selection. Please try again.": "حدث خطأ أثناء حفظ التحديد الخاص بك. يرجى إعادة المحاولة.", - "@An error occurred while saving your selection. Please try again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "changeStudentColorLabel": "تغيير اللون لـ {studentName}", - "@changeStudentColorLabel": { - "description": "Accessibility label for the button that lets users change the color associated with a specific student", - "type": "text", - "placeholders_order": [ - "studentName" - ], - "placeholders": { - "studentName": {} - } - }, - "Teacher": "معلم", - "@Teacher": { - "description": "Label for the Teacher enrollment type", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Student": "طالب", - "@Student": { - "description": "Label for the Student enrollment type", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "TA": "مساعد معلم", - "@TA": { - "description": "Label for the Teaching Assistant enrollment type (also known as Teacher Aid or Education Assistant), reduced to a short acronym/initialism if appropriate.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Observer": "مراقب", - "@Observer": { - "description": "Label for the Observer enrollment type", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Use Camera": "استخدام الكاميرا", - "@Use Camera": { - "description": "Label for the action item that lets the user capture a photo using the device camera", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Upload File": "تحميل ملف", - "@Upload File": { - "description": "Label for the action item that lets the user upload a file from their device", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Choose from Gallery": "اختر من المعرض", - "@Choose from Gallery": { - "description": "Label for the action item that lets the user select a photo from their device gallery", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Preparing…": "جارٍ الإعداد...", - "@Preparing…": { - "description": "Message shown while a file is being prepared to attach to a message", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Add student with…": "إضافة طالب بـ...", - "@Add student with…": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Add Student": "إضافة طالب", - "@Add Student": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You are not observing any students.": "أنت لا تراقب أي طالب.", - "@You are not observing any students.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading your students.": "حدث خطأ أثناء تحميل طلابك.", - "@There was an error loading your students.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Pairing Code": "رمز الإقران", - "@Pairing Code": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Students can obtain a pairing code through the Canvas website": "يمكن للطلاب الحصول على رمز إقران من خلال موقع Canvas على الويب.", - "@Students can obtain a pairing code through the Canvas website": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Enter the student pairing code provided to you. If the pairing code doesn't work, it may have expired": "أدخل رمز إقران الطالب المقدم لك. إذا لم يعمل رمز الإقران، فقد يكون انتهت صلاحيته", - "@Enter the student pairing code provided to you. If the pairing code doesn't work, it may have expired": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Your code is incorrect or expired.": "رمزك غير صحيح أو منته الصلاحية.", - "@Your code is incorrect or expired.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Something went wrong trying to create your account, please reach out to your school for assistance.": "حدث خطأ ما أثناء محاولة إنشاء حسابك، يرجى الاتصال بمدرستك للمساعدة.", - "@Something went wrong trying to create your account, please reach out to your school for assistance.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "QR Code": "رمز QR", - "@QR Code": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Students can create a QR code using the Canvas Student app on their mobile device": "يستطيع الطلاب إنشاء رمز QR باستخدام تطبيق Canvas Student على أجهزتهم المحمولة", - "@Students can create a QR code using the Canvas Student app on their mobile device": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Add new student": "إضافة طالب جديد", - "@Add new student": { - "description": "Semantics label for the FAB on the Manage Students Screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Select": "تحديد", - "@Select": { - "description": "Hint text to tell the user to choose one of two options", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I have a Canvas account": "لدي حساب Canvas", - "@I have a Canvas account": { - "description": "Option to select for users that have a canvas account", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I don't have a Canvas account": "ليس لدي حساب Canvas", - "@I don't have a Canvas account": { - "description": "Option to select for users that don't have a canvas account", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Create Account": "إنشاء حساب", - "@Create Account": { - "description": "Button text for account creation confirmation", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Full Name": "الاسم الكامل", - "@Full Name": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Email Address": "عنوان البريد الإلكتروني", - "@Email Address": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Password": "كلمة المرور", - "@Password": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Full Name…": "الاسم الكامل...", - "@Full Name…": { - "description": "hint label for inside form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Email…": "البريد الإلكتروني...", - "@Email…": { - "description": "hint label for inside form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Password…": "كلمة المرور...", - "@Password…": { - "description": "hint label for inside form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Please enter full name": "يُرجى إدخال الاسم الكامل", - "@Please enter full name": { - "description": "Error message for form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Please enter an email address": "يُرجى إدخال عنوان بريد إلكتروني", - "@Please enter an email address": { - "description": "Error message for form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Please enter a valid email address": "يرجى إدخال عنوان بريد إلكتروني صالح", - "@Please enter a valid email address": { - "description": "Error message for form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Password is required": "كلمة المرور مطلوبة", - "@Password is required": { - "description": "Error message for form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Password must contain at least 8 characters": "يجب أن تحتوي كلمة المرور على 8 أحرف على الأقل", - "@Password must contain at least 8 characters": { - "description": "Error message for form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "qrCreateAccountTos": "بالضغط على \"إنشاء حساب\"، أنت توافق على {termsOfService} وتقر بـ {privacyPolicy}", - "@qrCreateAccountTos": { - "description": "The text show on the account creation screen", - "type": "text", - "placeholders_order": [ - "termsOfService", - "privacyPolicy" - ], - "placeholders": { - "termsOfService": {}, - "privacyPolicy": {} - } - }, - "Terms of Service": "شروط الخدمة", - "@Terms of Service": { - "description": "Label for the Canvas Terms of Service agreement. This will be used in the qrCreateAccountTos text and will be highlighted and clickable", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Privacy Policy": "سياسة الخصوصية", - "@Privacy Policy": { - "description": "Label for the Canvas Privacy Policy agreement. This will be used in the qrCreateAccountTos text and will be highlighted and clickable", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "View the Privacy Policy": "عرض سياسة الخصوصية", - "@View the Privacy Policy": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Already have an account? ": "هل تمتلك حسابًا بالفعل؟ ", - "@Already have an account? ": { - "description": "Part of multiline text span, includes AccountSignIn1-2, in that order", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Sign In": "تسجيل الدخول", - "@Sign In": { - "description": "Part of multiline text span, includes AccountSignIn1-2, in that order", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Hide Password": "إخفاء كلمة المرور", - "@Hide Password": { - "description": "content description for password hide button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Show Password": "إظهار كلمة المرور", - "@Show Password": { - "description": "content description for password show button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Terms of Service Link": "ارتباط شروط الخدمة", - "@Terms of Service Link": { - "description": "content description for terms of service link", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Privacy Policy Link": "ارتباط سياسة الخصوصية", - "@Privacy Policy Link": { - "description": "content description for privacy policy link", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Event": "الحدث", - "@Event": { - "description": "Title for the event details screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Date": "التاريخ", - "@Date": { - "description": "Label for the event date", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Location": "الموقع", - "@Location": { - "description": "Label for the location information", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Location Specified": "لم يتم تحديد أي موقع", - "@No Location Specified": { - "description": "Description for events that do not have a location", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "eventTime": "{startAt} - {endAt}", - "@eventTime": { - "description": "The time the event is happening, example: \"2:00 pm - 4:00 pm\"", - "type": "text", - "placeholders_order": [ - "startAt", - "endAt" - ], - "placeholders": { - "startAt": {}, - "endAt": {} - } - }, - "Set a date and time to be notified of this event.": "تعيين تاريخ ووقت للإعلام بهذا الحدث.", - "@Set a date and time to be notified of this event.": { - "description": "Description for row to set event reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You will be notified about this event on…": "سيتم إعلامك بهذا الحدث في...", - "@You will be notified about this event on…": { - "description": "Description for when an event reminder is set", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Share Your Love for the App": "شارك إعجابك بالتطبيق", - "@Share Your Love for the App": { - "description": "Label for option to open the app store", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Tell us about your favorite parts of the app": "أخبرنا بالأشياء التي تفضلها في التطبيق", - "@Tell us about your favorite parts of the app": { - "description": "Description for option to open the app store", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Legal": "القانوني", - "@Legal": { - "description": "Label for legal information option", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Privacy policy, terms of use, open source": "سياسة الخصوصية، شروط الاستخدام، المصدر المفتوح", - "@Privacy policy, terms of use, open source": { - "description": "Description for legal information option", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Idea for Canvas Parent App [Android]": "أفكار لتطبيق Canvas Parent [Android]", - "@Idea for Canvas Parent App [Android]": { - "description": "The subject for the email to request a feature", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The following information will help us better understand your idea:": "ستساعدنا المعلومات التالية على فهم فكرتك بشكل أفضل:", - "@The following information will help us better understand your idea:": { - "description": "The header for the users information that is attached to a feature request", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Domain:": "المجال:", - "@Domain:": { - "description": "The label for the Canvas domain of the logged in user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "User ID:": "معرف المستخدم:", - "@User ID:": { - "description": "The label for the Canvas user ID of the logged in user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Email:": "البريد الإلكتروني:", - "@Email:": { - "description": "The label for the eamil of the logged in user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Locale:": "الإعدادات المحلية:", - "@Locale:": { - "description": "The label for the locale of the logged in user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Terms of Use": "شروط الاستخدام", - "@Terms of Use": { - "description": "Label for the terms of use", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Canvas on GitHub": "Canvas على GitHub", - "@Canvas on GitHub": { - "description": "Label for the button that opens the Canvas project on GitHub's website", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was a problem loading the Terms of Use": "حدثت مشكلة أثناء تحميل شروط الاستخدام", - "@There was a problem loading the Terms of Use": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Device": "الجهاز", - "@Device": { - "description": "Label used for device manufacturer/model in the error report", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "OS Version": "إصدار نظام التشغيل", - "@OS Version": { - "description": "Label used for device operating system version in the error report", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Version Number": "رقم الإصدار", - "@Version Number": { - "description": "Label used for the app version number in the error report", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Report A Problem": "الإبلاغ عن مشكلة", - "@Report A Problem": { - "description": "Title used for generic dialog to report problems", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Subject": "الموضوع", - "@Subject": { - "description": "Label used for Subject text field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "A subject is required.": "يجب توفر موضوع.", - "@A subject is required.": { - "description": "Error shown when the subject field is empty", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "An email address is required.": "يجب توفير عنوان بريد إلكتروني.", - "@An email address is required.": { - "description": "Error shown when the email field is empty", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Description": "الوصف", - "@Description": { - "description": "Label used for Description text field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "A description is required.": "يجب توفير وصف.", - "@A description is required.": { - "description": "Error shown when the description field is empty", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "How is this affecting you?": "كيف يؤثر عليك ذلك؟", - "@How is this affecting you?": { - "description": "Label used for the dropdown to select how severe the issue is", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "send": "إرسال", - "@send": { - "description": "Label used for send button when reporting a problem", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Just a casual question, comment, idea, suggestion…": "مجرد سؤال عابر أو تعليق أو فكرة أو اقتراح...", - "@Just a casual question, comment, idea, suggestion…": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I need some help but it's not urgent.": "أحتاج لبعض المساعدة لكن الأمر غير عاجل.", - "@I need some help but it's not urgent.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Something's broken but I can work around it to get what I need done.": "شيء ما معطل لكن بإمكاني إتمام المهام التي يجب أن أقوم بإنجازها.", - "@Something's broken but I can work around it to get what I need done.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I can't get things done until I hear back from you.": "لا يمكنني القيام بأي شيء ما لم أحصل على رد منكم.", - "@I can't get things done until I hear back from you.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "EXTREME CRITICAL EMERGENCY!!": "حالة طارئة حرجة للغاية!!", - "@EXTREME CRITICAL EMERGENCY!!": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Not Graded": "لم يتم التقييم", - "@Not Graded": { - "description": "Description for an assignment has not been graded.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Login flow: Normal": "تدفق تسجيل الدخول: عادي", - "@Login flow: Normal": { - "description": "Description for the normal login flow", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Login flow: Canvas": "تدفق تسجيل الدخول: Canvas", - "@Login flow: Canvas": { - "description": "Description for the Canvas login flow", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Login flow: Site Admin": "تدفق تسجيل الدخول: مسؤول الموقع", - "@Login flow: Site Admin": { - "description": "Description for the Site Admin login flow", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Login flow: Skip mobile verify": "تدفق تسجيل الدخول: تخطي التحقق من الجوّال", - "@Login flow: Skip mobile verify": { - "description": "Description for the login flow that skips domain verification for mobile", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Act As User": "تصرف كمستخدم", - "@Act As User": { - "description": "Label for the button that allows the user to act (masquerade) as another user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Stop Acting as User": "إيقاف التصرف كمستخدم", - "@Stop Acting as User": { - "description": "Label for the button that allows the user to stop acting (masquerading) as another user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "actingAsUser": "أنت تتصرف باعتبارك {userName}", - "@actingAsUser": { - "description": "Message shown while acting (masquerading) as another user", - "type": "text", - "placeholders_order": [ - "userName" - ], - "placeholders": { - "userName": {} - } - }, - "\"Act as\" is essentially logging in as this user without a password. You will be able to take any action as if you were this user, and from other users' points of views, it will be as if this user performed them. However, audit logs record that you were the one who performed the actions on behalf of this user.": "\"تصرف كـ\" هو تسجيل الدخول كما لو كنت هذا المستخدم دون كلمة مرور. ستتمكن من اتخاذ أي إجراء كما لو كنت هذا المستخدم، ومن وجهة نظر المستخدمين الآخرين، سيبدو الأمر كما لو كان هذا المستخدم هو من قام بهذه الإجراءات. ولكن سجلات التدقيق ستسجل أنك كنت الشخص الذي قام بالإجراءات نيابةً عن هذا المستخدم.", - "@\"Act as\" is essentially logging in as this user without a password. You will be able to take any action as if you were this user, and from other users' points of views, it will be as if this user performed them. However, audit logs record that you were the one who performed the actions on behalf of this user.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Domain": "المجال", - "@Domain": { - "description": "Text field hint for domain url input", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You must enter a valid domain": "يجب عليك إدخال مجال صالح", - "@You must enter a valid domain": { - "description": "Message displayed for domain input error", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "User ID": "معرف المستخدم", - "@User ID": { - "description": "Text field hint for user ID input", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You must enter a user id": "يجب أن تدخل معرف مستخدم", - "@You must enter a user id": { - "description": "Message displayed for user Id input error", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error trying to act as this user. Please check the Domain and User ID and try again.": "حدث خطأ ما في التصرف باعتبارك هذا المستخدم. يرجى التحقق من المجال ومعرف المستخدم وإعادة المحاولة.", - "@There was an error trying to act as this user. Please check the Domain and User ID and try again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "endMasqueradeMessage": "ستتوقف عن التصرف باعتبارك {userName} وستعود إلى حسابك الأصلي.", - "@endMasqueradeMessage": { - "description": "Confirmation message displayed when the user wants to stop acting (masquerading) as another user", - "type": "text", - "placeholders_order": [ - "userName" - ], - "placeholders": { - "userName": {} - } - }, - "endMasqueradeLogoutMessage": "ستتوقف عن التصرف باعتبارك {userName} وسيتم إخراجك من الحساب.", - "@endMasqueradeLogoutMessage": { - "description": "Confirmation message displayed when the user wants to stop acting (masquerading) as another user and will be logged out.", - "type": "text", - "placeholders_order": [ - "userName" - ], - "placeholders": { - "userName": {} - } - }, - "How are we doing?": "كيف هو أداؤنا؟", - "@How are we doing?": { - "description": "Title for dialog asking user to rate the app out of 5 stars.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Don't show again": "عدم الإظهار مرة أخرى", - "@Don't show again": { - "description": "Button to prevent the rating dialog from showing again.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "What can we do better?": "ماذا يمكننا فعله لتطوير أداءنا؟", - "@What can we do better?": { - "description": "Hint text for providing a comment with the rating.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Send Feedback": "إرسال تعليقات", - "@Send Feedback": { - "description": "Button to send rating with feedback", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "ratingDialogEmailSubject": "اقتراحات لـ Android - Canvas Parent {version}", - "@ratingDialogEmailSubject": { - "description": "The subject for an email to provide feedback for CanvasParent.", - "type": "text", - "placeholders_order": [ - "version" - ], - "placeholders": { - "version": {} - } - }, - "starRating": "{position,plural, =1{{position} نجمة}other{{position} نجوم}}", - "@starRating": { - "description": "Accessibility label for the 1 stars to 5 stars rating", - "type": "text", - "placeholders_order": [ - "position" - ], - "placeholders": { - "position": { - "example": 1 - } - } - }, - "Student Pairing": "إقران الطالب", - "@Student Pairing": { - "description": "Title for the screen where users can pair to students using a QR code", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Open Canvas Student": "افتح Canvas Student", - "@Open Canvas Student": { - "description": "Title for QR pairing tutorial screen instructing users to open the Canvas Student app", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You'll need to open your student's Canvas Student app to continue. Go into Main Menu > Settings > Pair with Observer and scan the QR code you see there.": "ستحتاج إلى فتح تطبيق Canvas Student لدى الطالب للمتابعة. انتقل إلى القائمة الرئيسية > الإعدادات > إقران مع Observer ثم امسح رمز QR الذي تراه هناك.", - "@You'll need to open your student's Canvas Student app to continue. Go into Main Menu > Settings > Pair with Observer and scan the QR code you see there.": { - "description": "Message explaining how QR code pairing works", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Screenshot showing location of pairing QR code generation in the Canvas Student app": "لقطة شاشة تظهر موقع إنشاء رمز QR للإقران في تطبيق Canvas Student", - "@Screenshot showing location of pairing QR code generation in the Canvas Student app": { - "description": "Content Description for qr pairing tutorial screenshot", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Expired QR Code": "رمز QR منته الصلاحية", - "@Expired QR Code": { - "description": "Error title shown when the users scans a QR code that has expired", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The QR code you scanned may have expired. Refresh the code on the student's device and try again.": "ربما يكون رمز QR الذي مسحته انتهت صلاحيته. قم بتحديث الرمز على جهاز الطالب وأعد المحاولة.", - "@The QR code you scanned may have expired. Refresh the code on the student's device and try again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "A network error occurred when adding this student. Check your connection and try again.": "حدث خطأ في الشبكة أثناء إضافة هذا الطالب. تحقق من الاتصال وأعد المحاولة.", - "@A network error occurred when adding this student. Check your connection and try again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Invalid QR Code": "رمز QR غير صالح", - "@Invalid QR Code": { - "description": "Error title shown when the user scans an invalid QR code", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Incorrect Domain": "مجال غير صالح", - "@Incorrect Domain": { - "description": "Error title shown when the users scane a QR code for a student that belongs to a different domain", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The student you are trying to add belongs to a different school. Log in or create an account with that school to scan this code.": "الطالب الذي تحاول إضافته يتبع مدرسة مختلفة. سجّل الدخول أو أنشئ حساباً في هذه المدرسة لمسح هذا الرمز.", - "@The student you are trying to add belongs to a different school. Log in or create an account with that school to scan this code.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Camera Permission": "إذن الكاميرا", - "@Camera Permission": { - "description": "Error title shown when the user wans to scan a QR code but has denied the camera permission", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "This will unpair and remove all enrollments for this student from your account.": "سيؤدي هذا إلى إلغاء الإقران وإزالة جميع التسجيلات لهذا الطالب من حسابك.", - "@This will unpair and remove all enrollments for this student from your account.": { - "description": "Confirmation message shown when the user tries to delete a student from their account", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was a problem removing this student from your account. Please check your connection and try again.": "حدثت مشكلة في إزالة هذا الطالب من حسابك. يرجى التحقق من الاتصال وإعادة المحاولة.", - "@There was a problem removing this student from your account. Please check your connection and try again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Cancel": "إلغاء", - "@Cancel": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "next": "التالي", - "@next": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "ok": "موافق", - "@ok": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Yes": "نعم", - "@Yes": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No": "لا", - "@No": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Retry": "إعادة المحاولة", - "@Retry": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Delete": "حذف", - "@Delete": { - "description": "Label used for general delete/remove actions", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Done": "تم", - "@Done": { - "description": "Label for general done/finished actions", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Refresh": "تحديث", - "@Refresh": { - "description": "Label for button to refresh data from the web", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "View Description": "وصف طريقة عرض", - "@View Description": { - "description": "Button to view the description for an event or assignment", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "expanded": "تم التوسيع", - "@expanded": { - "description": "Description for the accessibility reader for list groups that are expanded", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "collapsed": "تم الطي", - "@collapsed": { - "description": "Description for the accessibility reader for list groups that are expanded", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "An unexpected error occurred": "حدث خطأ غير متوقع", - "@An unexpected error occurred": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No description": "بلا وصف", - "@No description": { - "description": "Message used when the assignment has no description", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Launch External Tool": "تشغيل الأداة الخارجية", - "@Launch External Tool": { - "description": "Button text added to webviews to let users open external tools in their browser", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Interactions on this page are limited by your institution.": "التفاعلات الموجودة في هذه الصفحة مقيدة بمؤسستك.", - "@Interactions on this page are limited by your institution.": { - "description": "Message describing how the webview has limited access due to an instution setting", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "dateAtTime": "{date} في {time}", - "@dateAtTime": { - "description": "The string to format dates", - "type": "text", - "placeholders_order": [ - "date", - "time" - ], - "placeholders": { - "date": {}, - "time": {} - } - }, - "dueDateAtTime": "تاريخ الاستحقاق {date} في {time}", - "@dueDateAtTime": { - "description": "The string to format due dates", - "type": "text", - "placeholders_order": [ - "date", - "time" - ], - "placeholders": { - "date": {}, - "time": {} - } - }, - "No Due Date": "لا يوجد تاريخ استحقاق", - "@No Due Date": { - "description": "Label for assignments that do not have a due date", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Filter": "عامل تصفية", - "@Filter": { - "description": "Label for buttons to filter what items are visible", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "unread": "غير مقروء", - "@unread": { - "description": "Label for things that are marked as unread", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "unreadCount": "{count} غير مقروء", - "@unreadCount": { - "description": "Formatted string for when there are a number of unread items", - "type": "text", - "placeholders_order": [ - "count" - ], - "placeholders": { - "count": {} - } - }, - "badgeNumberPlus": "{count}+", - "@badgeNumberPlus": { - "description": "Formatted string for when too many items are being notified in a badge, generally something like: 99+", - "type": "text", - "placeholders_order": [ - "count" - ], - "placeholders": { - "count": {} - } - }, - "There was an error loading this announcement": "حدث خطأ أثناء تحميل هذا الإعلان", - "@There was an error loading this announcement": { - "description": "Message shown when an announcement detail screen fails to load", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Network error": "خطأ في الشبكة", - "@Network error": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Under Construction": "تحت الإنشاء", - "@Under Construction": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "We are currently building this feature for your viewing pleasure.": "نقوم في الوقت الحالي ببناء هذه الميزة لتستمتع بالعرض.", - "@We are currently building this feature for your viewing pleasure.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Request Login Help Button": "زر طلب مساعدة لتسجيل الدخول", - "@Request Login Help Button": { - "description": "Accessibility hint for button that opens help dialog for a login help request", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Request Login Help": "طلب مساعدة لتسجيل الدخول", - "@Request Login Help": { - "description": "Title of help dialog for a login help request", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I'm having trouble logging in": "لدي مشكلة في تسجيل الدخول", - "@I'm having trouble logging in": { - "description": "Subject of help dialog for a login help request", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "An error occurred when trying to display this link": "حدث خطأ أثناء محاولة عرض هذا الرابط", - "@An error occurred when trying to display this link": { - "description": "Error message shown when a link can't be opened", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "We are unable to display this link, it may belong to an institution you currently aren't logged in to.": "لم يمكننا عرض هذا الرابط، قد يكون تابعاً لمؤسسة لم تسجل الدخول إليها في الوقت الحالي.", - "@We are unable to display this link, it may belong to an institution you currently aren't logged in to.": { - "description": "Description for error page shown when clicking a link", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Link Error": "خطأ في الرابط", - "@Link Error": { - "description": "Title for error page shown when clicking a link", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Open In Browser": "الفتح في المستعرض", - "@Open In Browser": { - "description": "Text for button to open a link in the browswer", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You'll find the QR code on the web in your account profile. Click 'QR for Mobile Login' in the list.": "ستجد رمز QR على الويب في ملف تعريف حسابك. انقر فوق \"QR لتسجيل دخول الجوال\" في القائمة.", - "@You'll find the QR code on the web in your account profile. Click 'QR for Mobile Login' in the list.": { - "description": "Text for qr login tutorial screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Locate QR Code": "ابحث عن رمز QR", - "@Locate QR Code": { - "description": "Text for qr login button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Please scan a QR code generated by Canvas": "يرجى مسح رمز QR من إنشاء Canvas", - "@Please scan a QR code generated by Canvas": { - "description": "Text for qr login error with incorrect qr code", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error logging in. Please generate another QR Code and try again.": "حدث خطأ أثناء تسجيل الدخول. يرجى إنشاء رمز QR وإعادة المحاولة.", - "@There was an error logging in. Please generate another QR Code and try again.": { - "description": "Text for qr login error", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Screenshot showing location of QR code generation in browser": "التقط لقطة شاشة لإظهار موقع إنشاء رمز QR في المستعرض", - "@Screenshot showing location of QR code generation in browser": { - "description": "Content Description for qr login tutorial screenshot", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "QR scanning requires camera access": "مسح رمز QR يتطلب الوصول إلى الكاميرا", - "@QR scanning requires camera access": { - "description": "placeholder for camera error for QR code scan", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The linked item is no longer available": "العنصر المرتبط لم يعد متاحًا", - "@The linked item is no longer available": { - "description": "error message when the alert could no be opened", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Message sent": "تم إرسال الرسالة", - "@Message sent": { - "description": "confirmation message on the screen when the user succesfully sends a message", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Acceptable Use Policy": "سياسة الاستخدام المقبول", - "@Acceptable Use Policy": { - "description": "title for the acceptable use policy screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Submit": "إرسال", - "@Submit": { - "description": "submit button title for acceptable use policy screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Either you're a new user or the Acceptable Use Policy has changed since you last agreed to it. Please agree to the Acceptable Use Policy before you continue.": "إما أنك مستخدم جديد أو أن سياسة الاستخدام المقبول قد تغيرت منذ أن وافقت عليها آخر مرة. الرجاء الموافقة على سياسة الاستخدام المقبول قبل المتابعة.", - "@Either you're a new user or the Acceptable Use Policy has changed since you last agreed to it. Please agree to the Acceptable Use Policy before you continue.": { - "description": "acceptable use policy screen description", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I agree to the Acceptable Use Policy.": "أوافق على سياسة الاستخدام المقبول", - "@I agree to the Acceptable Use Policy.": { - "description": "acceptable use policy switch title", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "About": "نبذة", - "@About": { - "description": "Title for about menu item in settings", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "App": "التطبيق", - "@App": { - "description": "Title for App field on about page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Login ID": "معرف تسجيل الدخول", - "@Login ID": { - "description": "Title for Login ID field on about page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Email": "البريد الإلكتروني", - "@Email": { - "description": "Title for Email field on about page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Version": "الإصدار", - "@Version": { - "description": "Title for Version field on about page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Instructure logo": "شعار Instructure", - "@Instructure logo": { - "description": "Semantics label for the Instructure logo on the about page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - } -} \ No newline at end of file diff --git a/apps/flutter_parent/lib/l10n/res/intl_ca.arb b/apps/flutter_parent/lib/l10n/res/intl_ca.arb deleted file mode 100644 index c153306375..0000000000 --- a/apps/flutter_parent/lib/l10n/res/intl_ca.arb +++ /dev/null @@ -1,2753 +0,0 @@ -{ - "@@last_modified": "2023-08-25T11:04:20.901151", - "alertsLabel": "Avisos", - "@alertsLabel": { - "description": "The label for the Alerts tab", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "calendarLabel": "Calendari", - "@calendarLabel": { - "description": "The label for the Calendar tab", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "coursesLabel": "Assignatures", - "@coursesLabel": { - "description": "The label for the Courses tab", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Students": "Cap estudiant", - "@No Students": { - "description": "Text for when an observer has no students they are observing", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Tap to show student selector": "Toqueu per mostrar el selector d'estudiants", - "@Tap to show student selector": { - "description": "Semantics label for the area that will show the student selector when tapped", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Tap to pair with a new student": "Toqueu per emparellar amb un estudiant nou", - "@Tap to pair with a new student": { - "description": "Semantics label for the add student button in the student selector", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Tap to select this student": "Toqueu per seleccionar aquest estudiant", - "@Tap to select this student": { - "description": "Semantics label on individual students in the student switcher", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Manage Students": "Administra els estudiants", - "@Manage Students": { - "description": "Label text for the Manage Students nav drawer button as well as the title for the Manage Students screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Help": "Ajuda", - "@Help": { - "description": "Label text for the help nav drawer button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Log Out": "Tanca la sessió", - "@Log Out": { - "description": "Label text for the Log Out nav drawer button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Switch Users": "Canvia els usuaris", - "@Switch Users": { - "description": "Label text for the Switch Users nav drawer button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "appVersion": "versió {version}", - "@appVersion": { - "description": "App version shown in the navigation drawer", - "type": "text", - "placeholders_order": [ - "version" - ], - "placeholders": { - "version": {} - } - }, - "Are you sure you want to log out?": "Segur que voleu tancar la sessió?", - "@Are you sure you want to log out?": { - "description": "Confirmation message displayed when the user tries to log out", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Calendars": "Calendaris", - "@Calendars": { - "description": "Label for button that lets users select which calendars to display", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "nextMonth": "El mes que ve: {month}", - "@nextMonth": { - "description": "Label for the button that switches the calendar to the next month", - "type": "text", - "placeholders_order": [ - "month" - ], - "placeholders": { - "month": {} - } - }, - "previousMonth": "El mes passat: {month}", - "@previousMonth": { - "description": "Label for the button that switches the calendar to the previous month", - "type": "text", - "placeholders_order": [ - "month" - ], - "placeholders": { - "month": {} - } - }, - "nextWeek": "La setmana que ve a partir del {date}", - "@nextWeek": { - "description": "Label for the button that switches the calendar to the next week", - "type": "text", - "placeholders_order": [ - "date" - ], - "placeholders": { - "date": {} - } - }, - "previousWeek": "La setmana passada a partir del {date}", - "@previousWeek": { - "description": "Label for the button that switches the calendar to the previous week", - "type": "text", - "placeholders_order": [ - "date" - ], - "placeholders": { - "date": {} - } - }, - "selectedMonthLabel": "Mes de {month}", - "@selectedMonthLabel": { - "description": "Accessibility label for the button that expands/collapses the month view", - "type": "text", - "placeholders_order": [ - "month" - ], - "placeholders": { - "month": {} - } - }, - "expand": "desplega", - "@expand": { - "description": "Accessibility label for the on-tap hint for the button that expands/collapses the month view", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "collapse": "redueix", - "@collapse": { - "description": "Accessibility label for the on-tap hint for the button that expands/collapses the month view", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "pointsPossible": "{points} punts possibles", - "@pointsPossible": { - "description": "Screen reader label used for the points possible for an assignment, quiz, etc.", - "type": "text", - "placeholders_order": [ - "points" - ], - "placeholders": { - "points": {} - } - }, - "calendarDaySemanticsLabel": "{eventCount,plural, =1{{date}, {eventCount} esdeveniment}other{{date}, {eventCount} esdeveniments}}", - "@calendarDaySemanticsLabel": { - "description": "Screen reader label used for calendar day, reads the date and count of events", - "type": "text", - "placeholders_order": [ - "date", - "eventCount" - ], - "placeholders": { - "date": {}, - "eventCount": {} - } - }, - "No Events Today!": "Avui no hi ha cap esdeveniment.", - "@No Events Today!": { - "description": "Title displayed when there are no calendar events for the current day", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "It looks like a great day to rest, relax, and recharge.": "Sembla un dia fabulós per descansar, relaxar-se i carregar piles.", - "@It looks like a great day to rest, relax, and recharge.": { - "description": "Message displayed when there are no calendar events for the current day", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading your student's calendar": "S'ha produït un error en carregar el vostre calendari de l'estudiant", - "@There was an error loading your student's calendar": { - "description": "Message displayed when calendar events could not be loaded for the current student", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Tap to favorite the courses you want to see on the Calendar. Select up to 10.": "Toqueu per afegir als preferits les assignatures que voleu veure al Calendari. Seleccioneu-ne fins a 10.", - "@Tap to favorite the courses you want to see on the Calendar. Select up to 10.": { - "description": "Description text on calendar filter screen.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You may only choose 10 calendars to display": "Només podeu triar 10 calendaris perquè es mostrin", - "@You may only choose 10 calendars to display": { - "description": "Error text when trying to select more than 10 calendars", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You must select at least one calendar to display": "Heu de seleccionar com a mínim un calendari perquè es mostri", - "@You must select at least one calendar to display": { - "description": "Error text when trying to de-select all calendars", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Planner Note": "Nota del planificador", - "@Planner Note": { - "description": "Label used for notes in the planner", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Go to today": "Vés a avui", - "@Go to today": { - "description": "Accessibility label used for the today button in the planner", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Previous Logins": "Inicis de sessió anteriors", - "@Previous Logins": { - "description": "Label for the list of previous user logins", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "canvasLogoLabel": "Logotip del Canvas", - "@canvasLogoLabel": { - "description": "The semantics label for the Canvas logo", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "findSchool": "Cerca una escola", - "@findSchool": { - "description": "Text for the find-my-school button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "findAnotherSchool": "Cerca una altra escola", - "@findAnotherSchool": { - "description": "Text for the find-another-school button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "domainSearchInputHint": "Introduïu el nom de l'escola o el districte...", - "@domainSearchInputHint": { - "description": "Input hint for the text box on the domain search screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "noDomainResults": "No s'han trobat escoles que coincideixin amb “{query}”", - "@noDomainResults": { - "description": "Message shown to users when the domain search query did not return any results", - "type": "text", - "placeholders_order": [ - "query" - ], - "placeholders": { - "query": {} - } - }, - "domainSearchHelpLabel": "Com puc trobar la meva escola o districte?", - "@domainSearchHelpLabel": { - "description": "Label for the help button on the domain search screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "canvasGuides": "Guies del Canvas", - "@canvasGuides": { - "description": "Proper name for the Canvas Guides. This will be used in the domainSearchHelpBody text and will be highlighted and clickable", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "canvasSupport": "Assistència tècnica del Canvas", - "@canvasSupport": { - "description": "Proper name for Canvas Support. This will be used in the domainSearchHelpBody text and will be highlighted and clickable", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "domainSearchHelpBody": "Proveu de cercar pel nom de l'escola o districte al qual intenteu accedir, com ara “Escola Privada Smith” o “Escoles de la Regió d'Smith”. També podeu introduir un domini del Canvas directament, com ara “smith.instructure.com.”\n\nPer obtenir més informació sobre com cercar l'usuari del Canvas de la vostra institució, podeu consultar les {canvasGuides}, contactar amb l'{canvasSupport}, o posar-vos en contacte amb la vostra escola per obtenir assistència.", - "@domainSearchHelpBody": { - "description": "The body text shown in the help dialog on the domain search screen", - "type": "text", - "placeholders_order": [ - "canvasGuides", - "canvasSupport" - ], - "placeholders": { - "canvasGuides": {}, - "canvasSupport": {} - } - }, - "Uh oh!": "Oh!", - "@Uh oh!": { - "description": "Title of the screen that shows when a crash has occurred", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "We’re not sure what happened, but it wasn’t good. Contact us if this keeps happening.": "No estem segurs de què ha passat, però no ha sigut res bo. Poseu-vos en contacte amb nosaltres si us segueix passant.", - "@We’re not sure what happened, but it wasn’t good. Contact us if this keeps happening.": { - "description": "Message shown when a crash has occurred", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Contact Support": "Contacta amb l'assistència tècnica", - "@Contact Support": { - "description": "Label for the button that allows users to contact support after a crash has occurred", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "View error details": "Visualitza els detalls de l'error", - "@View error details": { - "description": "Label for the button that allowed users to view crash details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Restart app": "Reinicia l'aplicació", - "@Restart app": { - "description": "Label for the button that will restart the entire application", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Application version": "Versió de l'aplicació", - "@Application version": { - "description": "Label for the application version displayed in the crash details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Device model": "Model del dispositiu", - "@Device model": { - "description": "Label for the device model displayed in the crash details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Android OS version": "Versió del sistema operatiu Android", - "@Android OS version": { - "description": "Label for the Android operating system version displayed in the crash details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Full error message": "Missatge d'error complet", - "@Full error message": { - "description": "Label for the full error message displayed in the crash details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Inbox": "Safata d'entrada", - "@Inbox": { - "description": "Title for the Inbox screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading your inbox messages.": "S'ha produït un error en carregar els missatges de la vostra safata d'entrada.", - "@There was an error loading your inbox messages.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Subject": "Sense assumpte", - "@No Subject": { - "description": "Title used for inbox messages that have no subject", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unable to fetch courses. Please check your connection and try again.": "No es poden obtenir les assignatures. Reviseu la connexió i torneu-ho a provar.", - "@Unable to fetch courses. Please check your connection and try again.": { - "description": "Message shown when an error occured while loading courses", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Choose a course to message": "Trieu una assignatura per enviar el missatge", - "@Choose a course to message": { - "description": "Header in the course list shown when the user is choosing which course to associate with a new message", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Inbox Zero": "Safata d'entrada buida", - "@Inbox Zero": { - "description": "Title of the message shown when there are no inbox messages", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You’re all caught up!": "Esteu completament al dia!", - "@You’re all caught up!": { - "description": "Subtitle of the message shown when there are no inbox messages", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading recipients for this course": "S'ha produït un error en carregar els destinataris d'aquesta assignatura", - "@There was an error loading recipients for this course": { - "description": "Message shown when attempting to create a new message but the recipients list failed to load", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unable to send message. Check your connection and try again.": "No es pot enviar el missatge. Reviseu la connexió i torneu-ho a provar.", - "@Unable to send message. Check your connection and try again.": { - "description": "Message show when there was an error creating or sending a new message", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unsaved changes": "Canvis no desats", - "@Unsaved changes": { - "description": "Title of the dialog shown when the user tries to leave with unsaved changes", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Are you sure you wish to close this page? Your unsent message will be lost.": "Segur que voleu tancar aquesta pàgina? El vostre missatge no enviat es perdrà.", - "@Are you sure you wish to close this page? Your unsent message will be lost.": { - "description": "Body text of the dialog shown when the user tries leave with unsaved changes", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "New message": "Missatge nou", - "@New message": { - "description": "Title of the new-message screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Add attachment": "Afegeix un fitxer adjunt", - "@Add attachment": { - "description": "Tooltip for the add-attachment button in the new-message screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Send message": "Send message", - "@Send message": { - "description": "Tooltip for the send-message button in the new-message screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Select recipients": "Selecciona els destinataris", - "@Select recipients": { - "description": "Tooltip for the button that allows users to select message recipients", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No recipients selected": "Cap destinatari seleccionat", - "@No recipients selected": { - "description": "Hint displayed when the user has not selected any message recipients", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Message subject": "Assumpte del missatge", - "@Message subject": { - "description": "Hint text displayed in the input field for the message subject", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Message": "Missatge", - "@Message": { - "description": "Hint text displayed in the input field for the message body", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Recipients": "Destinataris", - "@Recipients": { - "description": "Label for message recipients", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "plusRecipientCount": "+{count}", - "@plusRecipientCount": { - "description": "Shows the number of recipients that are selected but not displayed on screen.", - "type": "text", - "placeholders_order": [ - "count" - ], - "placeholders": { - "count": { - "example": 5 - } - } - }, - "Failed. Tap for options.": "S'ha produït un error. Toqueu per veure les opcions.", - "@Failed. Tap for options.": { - "description": "Short message shown on a message attachment when uploading has failed", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "courseForWhom": "per a {studentShortName}", - "@courseForWhom": { - "description": "Describes for whom a course is for (i.e. for Bill)", - "type": "text", - "placeholders_order": [ - "studentShortName" - ], - "placeholders": { - "studentShortName": {} - } - }, - "messageLinkPostscript": "Sobre: {studentName}, {linkUrl}", - "@messageLinkPostscript": { - "description": "A postscript appended to new messages that clarifies which student is the subject of the message and also includes a URL for the related Canvas component (course, assignment, event, etc).", - "type": "text", - "placeholders_order": [ - "studentName", - "linkUrl" - ], - "placeholders": { - "studentName": {}, - "linkUrl": {} - } - }, - "There was an error loading this conversation": "S'ha produït un error en carregar aquesta conversa", - "@There was an error loading this conversation": { - "description": "Message shown when a conversation fails to load", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Reply": "Respon", - "@Reply": { - "description": "Button label for replying to a conversation", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Reply All": "Respon a tots", - "@Reply All": { - "description": "Button label for replying to all conversation participants", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unknown User": "Usuari desconegut", - "@Unknown User": { - "description": "Label used where the user name is not known", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "me": "mi", - "@me": { - "description": "First-person pronoun (i.e. 'me') that will be used in message author info, e.g. 'Me to 4 others' or 'Jon Snow to me'", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "authorToRecipient": "De {authorName} a {recipientName}", - "@authorToRecipient": { - "description": "Author info for a single-recipient message; includes both the author name and the recipient name.", - "type": "text", - "placeholders_order": [ - "authorName", - "recipientName" - ], - "placeholders": { - "authorName": {}, - "recipientName": {} - } - }, - "authorToNOthers": "{howMany,plural, =1{{authorName} a 1 altre}other{{authorName} a {howMany} més}}", - "@authorToNOthers": { - "description": "Author info for a mutli-recipient message; includes the author name and the number of recipients", - "type": "text", - "placeholders_order": [ - "authorName", - "howMany" - ], - "placeholders": { - "authorName": {}, - "howMany": {} - } - }, - "authorToRecipientAndNOthers": "{howMany,plural, =1{{authorName} a {recipientName} i 1 altre}other{{authorName} a {recipientName} i {howMany} més}}", - "@authorToRecipientAndNOthers": { - "description": "Author info for a multi-recipient message; includes the author name, one recipient name, and the number of other recipients", - "type": "text", - "placeholders_order": [ - "authorName", - "recipientName", - "howMany" - ], - "placeholders": { - "authorName": {}, - "recipientName": {}, - "howMany": {} - } - }, - "Download": "Baixa", - "@Download": { - "description": "Label for the button that will begin downloading a file", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Open with another app": "Obre amb una altra aplicació", - "@Open with another app": { - "description": "Label for the button that will allow users to open a file with another app", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There are no installed applications that can open this file": "No hi ha cap aplicació instal·lada que pugui obrir aquest fitxer", - "@There are no installed applications that can open this file": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unsupported File": "Fitxer no admès", - "@Unsupported File": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "This file is unsupported and can’t be viewed through the app": "Aquest fitxer no s'admet i no es pot visualitzar a través de l'aplicació", - "@This file is unsupported and can’t be viewed through the app": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unable to play this media file": "No es pot reproduir aquest fitxer multimèdia", - "@Unable to play this media file": { - "description": "Message shown when audio or video media could not be played", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unable to load this image": "No es pot carregar aquesta imatge", - "@Unable to load this image": { - "description": "Message shown when an image file could not be loaded or displayed", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading this file": "S'ha produït un error en carregar aquest fitxer", - "@There was an error loading this file": { - "description": "Message shown when a file could not be loaded or displayed", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Courses": "No hi ha cap assignatura", - "@No Courses": { - "description": "Title for having no courses", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Your student’s courses might not be published yet.": "És possible que encara no s'hagin publicat les vostres assignatures de l'estudiant.", - "@Your student’s courses might not be published yet.": { - "description": "Message for having no courses", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading your student’s courses.": "S'ha produït un error en carregar les vostres assignatures de l'estudiant.", - "@There was an error loading your student’s courses.": { - "description": "Message displayed when the list of student courses could not be loaded", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Grade": "Sense nota", - "@No Grade": { - "description": "Message shown when there is currently no grade available for a course", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Filter by": "Filtra per", - "@Filter by": { - "description": "Title for list of terms to filter grades by", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Grades": "Notes", - "@Grades": { - "description": "Label for the \"Grades\" tab in course details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Syllabus": "Temari", - "@Syllabus": { - "description": "Label for the \"Syllabus\" tab in course details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Front Page": "Pàgina frontal", - "@Front Page": { - "description": "Label for the \"Front Page\" tab in course details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Summary": "Resum", - "@Summary": { - "description": "Label for the \"Summary\" tab in course details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Send a message about this course": "Envia un missatge sobre aquesta assignatura", - "@Send a message about this course": { - "description": "Accessibility hint for the course messaage floating action button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Total Grade": "Nota total", - "@Total Grade": { - "description": "Label for the total grade in the course", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Graded": "Qualificat", - "@Graded": { - "description": "Label for assignments that have been graded", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Submitted": "Entregat", - "@Submitted": { - "description": "Label for assignments that have been submitted", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Not Submitted": "No entregat", - "@Not Submitted": { - "description": "Label for assignments that have not been submitted", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Late": "Tardà", - "@Late": { - "description": "Label for assignments that have been marked late or submitted late", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Missing": "No presentat", - "@Missing": { - "description": "Label for assignments that have been marked missing or are not submitted and past the due date", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "-": "-", - "@-": { - "description": "Value representing no score for student submission", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "All Grading Periods": "Tots els períodes de qualificació", - "@All Grading Periods": { - "description": "Label for selecting all grading periods", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Assignments": "No hi ha cap activitat", - "@No Assignments": { - "description": "Title for the no assignments message", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "It looks like assignments haven't been created in this space yet.": "Sembla que en aquest espai encara no s'ha creat cap activitat.", - "@It looks like assignments haven't been created in this space yet.": { - "description": "Message for no assignments", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading the summary details for this course.": "S'ha produït un error en carregar els detalls de resum d'aquesta assignatura.", - "@There was an error loading the summary details for this course.": { - "description": "Message shown when the course summary could not be loaded", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Summary": "Cap resum", - "@No Summary": { - "description": "Title displayed when there are no items in the course summary", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "This course does not have any assignments or calendar events yet.": "Aquesta assignatura encara no té cap activitat o esdeveniment al calendari.", - "@This course does not have any assignments or calendar events yet.": { - "description": "Message displayed when there are no items in the course summary", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "gradeFormatScoreOutOfPointsPossible": "{score} / {pointsPossible}", - "@gradeFormatScoreOutOfPointsPossible": { - "description": "Formatted string for a student score out of the points possible", - "type": "text", - "placeholders_order": [ - "score", - "pointsPossible" - ], - "placeholders": { - "score": {}, - "pointsPossible": {} - } - }, - "contentDescriptionScoreOutOfPointsPossible": "{score} de {pointsPossible} punts", - "@contentDescriptionScoreOutOfPointsPossible": { - "description": "Formatted string for a student score out of the points possible", - "type": "text", - "placeholders_order": [ - "score", - "pointsPossible" - ], - "placeholders": { - "score": {}, - "pointsPossible": {} - } - }, - "gradesSubjectMessage": "Sobre: {studentName}, notes", - "@gradesSubjectMessage": { - "description": "The subject line for a message to a teacher regarding a student's grades", - "type": "text", - "placeholders_order": [ - "studentName" - ], - "placeholders": { - "studentName": {} - } - }, - "syllabusSubjectMessage": "Sobre: {studentName}, temari", - "@syllabusSubjectMessage": { - "description": "The subject line for a message to a teacher regarding a course syllabus", - "type": "text", - "placeholders_order": [ - "studentName" - ], - "placeholders": { - "studentName": {} - } - }, - "frontPageSubjectMessage": "Sobre: {studentName}, pàgina frontal", - "@frontPageSubjectMessage": { - "description": "The subject line for a message to a teacher regarding a course front page", - "type": "text", - "placeholders_order": [ - "studentName" - ], - "placeholders": { - "studentName": {} - } - }, - "assignmentSubjectMessage": "Sobre: {studentName}, activitat - {assignmentName}", - "@assignmentSubjectMessage": { - "description": "The subject line for a message to a teacher regarding a student's assignment", - "type": "text", - "placeholders_order": [ - "studentName", - "assignmentName" - ], - "placeholders": { - "studentName": {}, - "assignmentName": {} - } - }, - "eventSubjectMessage": "Sobre: {studentName}, esdeveniment - {eventTitle}", - "@eventSubjectMessage": { - "description": "The subject line for a message to a teacher regarding a calendar event", - "type": "text", - "placeholders_order": [ - "studentName", - "eventTitle" - ], - "placeholders": { - "studentName": {}, - "eventTitle": {} - } - }, - "There is no page information available.": "No hi ha informació disponible sobre la pàgina.", - "@There is no page information available.": { - "description": "Description for when no page information is available", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Assignment Details": "Detalls de l'activitat", - "@Assignment Details": { - "description": "Title for the page that shows details for an assignment", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "assignmentTotalPoints": "{points} punts", - "@assignmentTotalPoints": { - "description": "Label used for the total points the assignment is worth", - "type": "text", - "placeholders_order": [ - "points" - ], - "placeholders": { - "points": {} - } - }, - "assignmentTotalPointsAccessible": "{points} punts", - "@assignmentTotalPointsAccessible": { - "description": "Screen reader label used for the total points the assignment is worth", - "type": "text", - "placeholders_order": [ - "points" - ], - "placeholders": { - "points": {} - } - }, - "Due": "Data de lliurament", - "@Due": { - "description": "Label for an assignment due date", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Grade": "Nota", - "@Grade": { - "description": "Label for the section that displays an assignment's grade", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Locked": "Bloquejat", - "@Locked": { - "description": "Label for when an assignment is locked", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "assignmentLockedModule": "El contingut “{moduleName}” bloqueja aquesta activitat.", - "@assignmentLockedModule": { - "description": "The locked description when an assignment is locked by a module", - "type": "text", - "placeholders_order": [ - "moduleName" - ], - "placeholders": { - "moduleName": {} - } - }, - "Remind Me": "Recorda-m'ho", - "@Remind Me": { - "description": "Label for the row to set reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Set a date and time to be notified of this specific assignment.": "Establiu una data i hora per rebre una notificació sobre aquesta activitat concreta.", - "@Set a date and time to be notified of this specific assignment.": { - "description": "Description for row to set reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You will be notified about this assignment on…": "Rebreu una notificació sobre aquesta activitat el...", - "@You will be notified about this assignment on…": { - "description": "Description for when a reminder is set", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Instructions": "Instruccions", - "@Instructions": { - "description": "Label for the description of the assignment when it has quiz instructions", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Send a message about this assignment": "Envia un missatge sobre aquesta activitat", - "@Send a message about this assignment": { - "description": "Accessibility hint for the assignment messaage floating action button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "This app is not authorized for use.": "Aquesta aplicació no té autorització perquè s'utilitzi.", - "@This app is not authorized for use.": { - "description": "The error shown when the app being used is not verified by Canvas", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The server you entered is not authorized for this app.": "El servidor que heu introduït no té autorització per a aquesta aplicació.", - "@The server you entered is not authorized for this app.": { - "description": "The error shown when the desired login domain is not verified by Canvas", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The user agent for this app is not authorized.": "L'agent d'usuari per a aquesta aplicació no està autoritzat.", - "@The user agent for this app is not authorized.": { - "description": "The error shown when the user agent during verification is not verified by Canvas", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "We were unable to verify the server for use with this app.": "No hem pogut verificar si el servidor es pot utilitzar amb aquesta aplicació.", - "@We were unable to verify the server for use with this app.": { - "description": "The generic error shown when we are unable to verify with Canvas", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Reminders": "Recordatoris", - "@Reminders": { - "description": "Name of the system notification channel for assignment and event reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Notifications for reminders about assignments and calendar events": "Notificacions de recordatoris sobre activitats i esdeveniments del calendari", - "@Notifications for reminders about assignments and calendar events": { - "description": "Description of the system notification channel for assignment and event reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Reminders have changed!": "Els recordatoris han canviat!", - "@Reminders have changed!": { - "description": "Title of the dialog shown when the user needs to update their reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "In order to provide you with a better experience, we have updated how reminders work. You can add new reminders by viewing an assignment or calendar event and tapping the switch under the \"Remind Me\" section.\n\nBe aware that any reminders created with older versions of this app will not be compatible with the new changes and you will need to create them again.": "Per tal de proporcionar-vos una millor experiència, hem actualitzat la manera com funcionen els recordatoris. Podeu afegir recordatoris nous en visualitzar una activitat o esdeveniment del calendari i tocant el botó a sota de la secció \"Recorda-m'ho\".\n\nTingueu en compte que els recordatoris creats amb les versions anteriors de l'aplicació no seran compatibles amb els nous canvis i els haureu de tornar a crear.", - "@In order to provide you with a better experience, we have updated how reminders work. You can add new reminders by viewing an assignment or calendar event and tapping the switch under the \"Remind Me\" section.\n\nBe aware that any reminders created with older versions of this app will not be compatible with the new changes and you will need to create them again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Not a parent?": "No sou un progenitor?", - "@Not a parent?": { - "description": "Title for the screen that shows when the user is not observing any students", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "We couldn't find any students associated with this account": "No hem trobat cap estudiant associat amb aquest usuari", - "@We couldn't find any students associated with this account": { - "description": "Subtitle for the screen that shows when the user is not observing any students", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Are you a student or teacher?": "Sou un estudiant o professor?", - "@Are you a student or teacher?": { - "description": "Label for button that will show users the option to view other Canvas apps in the Play Store", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "One of our other apps might be a better fit. Tap one to visit the Play Store.": "És possible que alguna de les altres aplicacions nostres us sigui més útil. Toqueu-ne una per anar a Play Store.", - "@One of our other apps might be a better fit. Tap one to visit the Play Store.": { - "description": "Description of options to view other Canvas apps in the Play Store", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Return to Login": "Torna a l'inici de sessió", - "@Return to Login": { - "description": "Label for the button that returns the user to the login screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "STUDENT": "ESTUDIANT", - "@STUDENT": { - "description": "The \"student\" portion of the \"Canvas Student\" app name, in all caps. \"Canvas\" is excluded in this context as it will be displayed to the user as a wordmark image", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "TEACHER": "PROFESSOR", - "@TEACHER": { - "description": "The \"teacher\" portion of the \"Canvas Teacher\" app name, in all caps. \"Canvas\" is excluded in this context as it will be displayed to the user as a wordmark image", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Canvas Student": "Canvas Student", - "@Canvas Student": { - "description": "The name of the Canvas Student app. Only \"Student\" should be translated as \"Canvas\" is a brand name in this context and should not be translated.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Canvas Teacher": "Canvas Teacher", - "@Canvas Teacher": { - "description": "The name of the Canvas Teacher app. Only \"Teacher\" should be translated as \"Canvas\" is a brand name in this context and should not be translated.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Alerts": "Cap avís", - "@No Alerts": { - "description": "The title for the empty message to show to users when there are no alerts for the student.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There’s nothing to be notified of yet.": "Encara no hi ha res que s'hagi de notificar.", - "@There’s nothing to be notified of yet.": { - "description": "The empty message to show to users when there are no alerts for the student.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "dismissAlertLabel": "Descarta {alertTitle}", - "@dismissAlertLabel": { - "description": "Accessibility label to dismiss an alert", - "type": "text", - "placeholders_order": [ - "alertTitle" - ], - "placeholders": { - "alertTitle": {} - } - }, - "Course Announcement": "Anunci de l'assignatura", - "@Course Announcement": { - "description": "Title for alerts when there is a course announcement", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Institution Announcement": "Anunci de la institució", - "@Institution Announcement": { - "description": "Title for alerts when there is an institution announcement", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "assignmentGradeAboveThreshold": "Nota de l'activitat per sobre de {threshold}", - "@assignmentGradeAboveThreshold": { - "description": "Title for alerts when an assignment grade is above the threshold value", - "type": "text", - "placeholders_order": [ - "threshold" - ], - "placeholders": { - "threshold": {} - } - }, - "assignmentGradeBelowThreshold": "Nota de l'activitat per sota de {threshold}", - "@assignmentGradeBelowThreshold": { - "description": "Title for alerts when an assignment grade is below the threshold value", - "type": "text", - "placeholders_order": [ - "threshold" - ], - "placeholders": { - "threshold": {} - } - }, - "courseGradeAboveThreshold": "Nota de l'assignatura per sobre de {threshold}", - "@courseGradeAboveThreshold": { - "description": "Title for alerts when a course grade is above the threshold value", - "type": "text", - "placeholders_order": [ - "threshold" - ], - "placeholders": { - "threshold": {} - } - }, - "courseGradeBelowThreshold": "Nota de l'assignatura per sota de {threshold}", - "@courseGradeBelowThreshold": { - "description": "Title for alerts when a course grade is below the threshold value", - "type": "text", - "placeholders_order": [ - "threshold" - ], - "placeholders": { - "threshold": {} - } - }, - "Settings": "Configuració", - "@Settings": { - "description": "Title for the settings screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Theme": "Tema", - "@Theme": { - "description": "Label for the light/dark theme section in the settings page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Dark Mode": "Mode fosc", - "@Dark Mode": { - "description": "Label for the button that enables dark mode", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Light Mode": "Mode clar", - "@Light Mode": { - "description": "Label for the button that enables light mode", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "High Contrast Mode": "Mode de contrast alt", - "@High Contrast Mode": { - "description": "Label for the switch that toggles high contrast mode", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Use Dark Theme in Web Content": "Utilitza el tema fosc al contingut web", - "@Use Dark Theme in Web Content": { - "description": "Label for the switch that toggles dark mode for webviews", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Appearance": "Aspecte", - "@Appearance": { - "description": "Label for the appearance section in the settings page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Successfully submitted!": "S'ha enviat correctament.", - "@Successfully submitted!": { - "description": "Title displayed in the grade cell for an assignment that has been submitted", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "submissionStatusSuccessSubtitle": "Aquesta activitat es va entregar el {date} a les {time} i està a l'espera de nota", - "@submissionStatusSuccessSubtitle": { - "description": "Subtitle displayed in the grade cell for an assignment that has been submitted and is awaiting a grade", - "type": "text", - "placeholders_order": [ - "date", - "time" - ], - "placeholders": { - "date": {}, - "time": {} - } - }, - "outOfPoints": "{howMany,plural, =1{D'1 punt}other{De {points} punts}}", - "@outOfPoints": { - "description": "Description for an assignment grade that has points without a current scoroe", - "type": "text", - "placeholders_order": [ - "points", - "howMany" - ], - "placeholders": { - "points": {}, - "howMany": {} - } - }, - "Excused": "Excusat", - "@Excused": { - "description": "Grading status for an assignment marked as excused", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Complete": "Complet", - "@Complete": { - "description": "Grading status for an assignment marked as complete", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Incomplete": "Incomplet", - "@Incomplete": { - "description": "Grading status for an assignment marked as incomplete", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "minus": "menys", - "@minus": { - "description": "Screen reader-friendly replacement for the \"-\" character in letter grades like \"A-\"", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "latePenalty": "Sanció per endarreriment (-{pointsLost})", - "@latePenalty": { - "description": "Text displayed when a late penalty has been applied to the assignment", - "type": "text", - "placeholders_order": [ - "pointsLost" - ], - "placeholders": { - "pointsLost": {} - } - }, - "finalGrade": "Nota final: {grade}", - "@finalGrade": { - "description": "Text that displays the final grade of an assignment", - "type": "text", - "placeholders_order": [ - "grade" - ], - "placeholders": { - "grade": {} - } - }, - "Alert Settings": "Configuració de l'avís", - "@Alert Settings": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Alert me when…": "Avisa'm quan...", - "@Alert me when…": { - "description": "Header for the screen where the observer chooses the thresholds that will determine when they receive alerts (e.g. when an assignment is graded below 70%)", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Course grade below": "Nota de l'assignatura per sota de", - "@Course grade below": { - "description": "Label describing the threshold for when the course grade is below a certain percentage", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Course grade above": "Nota de l'assignatura per sobre de", - "@Course grade above": { - "description": "Label describing the threshold for when the course grade is above a certain percentage", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Assignment missing": "Activitat no presentada", - "@Assignment missing": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Assignment grade below": "Nota de l'activitat per sota de", - "@Assignment grade below": { - "description": "Label describing the threshold for when an assignment is graded below a certain percentage", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Assignment grade above": "Nota de l'activitat per sobre de", - "@Assignment grade above": { - "description": "Label describing the threshold for when an assignment is graded above a certain percentage", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Course Announcements": "Anuncis de l'assignatura", - "@Course Announcements": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Institution Announcements": "Anuncis de la institució", - "@Institution Announcements": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Never": "Mai", - "@Never": { - "description": "Indication that tells the user they will not receive alert notifications of a specific kind", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Grade percentage": "Percentatge de la nota", - "@Grade percentage": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading your student's alerts.": "S'ha produït un error en carregar els vostres avisos de l'estudiant.", - "@There was an error loading your student's alerts.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Must be below 100": "Ha de ser inferior a 100", - "@Must be below 100": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "mustBeBelowN": "Ha de ser inferior a {percentage}", - "@mustBeBelowN": { - "description": "Validation error to the user that they must choose a percentage below 'n'", - "type": "text", - "placeholders_order": [ - "percentage" - ], - "placeholders": { - "percentage": { - "example": 5 - } - } - }, - "mustBeAboveN": "Ha de ser superior a {percentage}", - "@mustBeAboveN": { - "description": "Validation error to the user that they must choose a percentage above 'n'", - "type": "text", - "placeholders_order": [ - "percentage" - ], - "placeholders": { - "percentage": { - "example": 5 - } - } - }, - "Select Student Color": "Selecciona el color de l’estudiant", - "@Select Student Color": { - "description": "Title for screen that allows users to assign a color to a specific student", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Electric, blue": "Elèctric, blau", - "@Electric, blue": { - "description": "Name of the Electric (blue) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Plum, Purple": "Pruna, porpra", - "@Plum, Purple": { - "description": "Name of the Plum (purple) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Barney, Fuschia": "Barney, fúcsia", - "@Barney, Fuschia": { - "description": "Name of the Barney (fuschia) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Raspberry, Red": "Gerd, vermell", - "@Raspberry, Red": { - "description": "Name of the Raspberry (red) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Fire, Orange": "Foc, taronja", - "@Fire, Orange": { - "description": "Name of the Fire (orange) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Shamrock, Green": "Trèvol, verd", - "@Shamrock, Green": { - "description": "Name of the Shamrock (green) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "An error occurred while saving your selection. Please try again.": "S'ha produït un error en desar la vostra selecció. Torneu-ho a provar.", - "@An error occurred while saving your selection. Please try again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "changeStudentColorLabel": "Canvia el color de {studentName}", - "@changeStudentColorLabel": { - "description": "Accessibility label for the button that lets users change the color associated with a specific student", - "type": "text", - "placeholders_order": [ - "studentName" - ], - "placeholders": { - "studentName": {} - } - }, - "Teacher": "Professor", - "@Teacher": { - "description": "Label for the Teacher enrollment type", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Student": "Estudiant", - "@Student": { - "description": "Label for the Student enrollment type", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "TA": "Auxiliar de professor", - "@TA": { - "description": "Label for the Teaching Assistant enrollment type (also known as Teacher Aid or Education Assistant), reduced to a short acronym/initialism if appropriate.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Observer": "Observador", - "@Observer": { - "description": "Label for the Observer enrollment type", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Use Camera": "Utilitza la càmera", - "@Use Camera": { - "description": "Label for the action item that lets the user capture a photo using the device camera", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Upload File": "Penja el fitxer", - "@Upload File": { - "description": "Label for the action item that lets the user upload a file from their device", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Choose from Gallery": "Tria de la galeria", - "@Choose from Gallery": { - "description": "Label for the action item that lets the user select a photo from their device gallery", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Preparing…": "S'està preparant...", - "@Preparing…": { - "description": "Message shown while a file is being prepared to attach to a message", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Add student with…": "Afegeix un estudiant amb...", - "@Add student with…": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Add Student": "Afegeix un estudiant", - "@Add Student": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You are not observing any students.": "No esteu observant cap estudiant.", - "@You are not observing any students.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading your students.": "S'ha produït un error en carregar els vostres estudiants.", - "@There was an error loading your students.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Pairing Code": "Codi d'emparellament", - "@Pairing Code": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Students can obtain a pairing code through the Canvas website": "Els estudiants poden obtenir un codi d'emparellament a través del lloc web de Canvas", - "@Students can obtain a pairing code through the Canvas website": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Enter the student pairing code provided to you. If the pairing code doesn't work, it may have expired": "Introduïu el codi d'emparellament d'estudiants que se us ha proporcionat. Si el codi d'emparellament no funciona, pot ser que hagi caducat", - "@Enter the student pairing code provided to you. If the pairing code doesn't work, it may have expired": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Your code is incorrect or expired.": "El vostre codi es incorrecte o ha caducat.", - "@Your code is incorrect or expired.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Something went wrong trying to create your account, please reach out to your school for assistance.": "Alguna cosa no ha anat bé en intentar crear el vostre usuari, poseu-vos en contacte amb la vostra escola per obtenir assistència.", - "@Something went wrong trying to create your account, please reach out to your school for assistance.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "QR Code": "Codi QR", - "@QR Code": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Students can create a QR code using the Canvas Student app on their mobile device": "Al dispositiu mòbil, els estudiants poden crear un codi QR mitjançant l’aplicació Canvas Student", - "@Students can create a QR code using the Canvas Student app on their mobile device": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Add new student": "Afegeix un estudiant nou", - "@Add new student": { - "description": "Semantics label for the FAB on the Manage Students Screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Select": "Selecciona", - "@Select": { - "description": "Hint text to tell the user to choose one of two options", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I have a Canvas account": "Tinc un usuari del Canvas", - "@I have a Canvas account": { - "description": "Option to select for users that have a canvas account", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I don't have a Canvas account": "No tinc un usuari del Canvas", - "@I don't have a Canvas account": { - "description": "Option to select for users that don't have a canvas account", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Create Account": "Crea un usuari", - "@Create Account": { - "description": "Button text for account creation confirmation", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Full Name": "Nom complet", - "@Full Name": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Email Address": "Adreça electrònica", - "@Email Address": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Password": "Contrasenya", - "@Password": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Full Name…": "Nom complet...", - "@Full Name…": { - "description": "hint label for inside form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Email…": "Adreça electrònica...", - "@Email…": { - "description": "hint label for inside form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Password…": "Contrasenya...", - "@Password…": { - "description": "hint label for inside form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Please enter full name": "Introduïu un nom complet", - "@Please enter full name": { - "description": "Error message for form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Please enter an email address": "Introduïu una adreça electrònica", - "@Please enter an email address": { - "description": "Error message for form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Please enter a valid email address": "Introduïu una adreça electrònica vàlida", - "@Please enter a valid email address": { - "description": "Error message for form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Password is required": "La contrasenya és obligatòria", - "@Password is required": { - "description": "Error message for form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Password must contain at least 8 characters": "La contrasenya ha de tenir com a mínim 8 caràcters", - "@Password must contain at least 8 characters": { - "description": "Error message for form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "qrCreateAccountTos": "En tocar \"Crea un usuari\", accepteu les {termsOfService} i reconeixeu la {privacyPolicy}.", - "@qrCreateAccountTos": { - "description": "The text show on the account creation screen", - "type": "text", - "placeholders_order": [ - "termsOfService", - "privacyPolicy" - ], - "placeholders": { - "termsOfService": {}, - "privacyPolicy": {} - } - }, - "Terms of Service": "Condicions de servei", - "@Terms of Service": { - "description": "Label for the Canvas Terms of Service agreement. This will be used in the qrCreateAccountTos text and will be highlighted and clickable", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Privacy Policy": "Política de privacitat", - "@Privacy Policy": { - "description": "Label for the Canvas Privacy Policy agreement. This will be used in the qrCreateAccountTos text and will be highlighted and clickable", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "View the Privacy Policy": "Visualitza la política de privacitat", - "@View the Privacy Policy": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Already have an account? ": "Ja teniu un usuari? ", - "@Already have an account? ": { - "description": "Part of multiline text span, includes AccountSignIn1-2, in that order", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Sign In": "Inicia la sessió", - "@Sign In": { - "description": "Part of multiline text span, includes AccountSignIn1-2, in that order", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Hide Password": "Amaga la contrasenya", - "@Hide Password": { - "description": "content description for password hide button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Show Password": "Mostra la contrasenya", - "@Show Password": { - "description": "content description for password show button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Terms of Service Link": "Enllaç a les Condicions de servei", - "@Terms of Service Link": { - "description": "content description for terms of service link", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Privacy Policy Link": "Enllaç a la Política de privacitat", - "@Privacy Policy Link": { - "description": "content description for privacy policy link", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Event": "Esdeveniment", - "@Event": { - "description": "Title for the event details screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Date": "Data", - "@Date": { - "description": "Label for the event date", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Location": "Ubicació", - "@Location": { - "description": "Label for the location information", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Location Specified": "No s'ha especificat cap ubicació", - "@No Location Specified": { - "description": "Description for events that do not have a location", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "eventTime": "{startAt} - {endAt}", - "@eventTime": { - "description": "The time the event is happening, example: \"2:00 pm - 4:00 pm\"", - "type": "text", - "placeholders_order": [ - "startAt", - "endAt" - ], - "placeholders": { - "startAt": {}, - "endAt": {} - } - }, - "Set a date and time to be notified of this event.": "Establiu una data i una hora per rebre una notificació sobre aquest esdeveniment.", - "@Set a date and time to be notified of this event.": { - "description": "Description for row to set event reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You will be notified about this event on…": "Rebreu una notificació sobre aquest esdeveniment el...", - "@You will be notified about this event on…": { - "description": "Description for when an event reminder is set", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Share Your Love for the App": "Compartiu l'interès que us desperta l'aplicació", - "@Share Your Love for the App": { - "description": "Label for option to open the app store", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Tell us about your favorite parts of the app": "Expliqueu-nos quines són les parts preferides de l'aplicació", - "@Tell us about your favorite parts of the app": { - "description": "Description for option to open the app store", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Legal": "Jurídic", - "@Legal": { - "description": "Label for legal information option", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Privacy policy, terms of use, open source": "Política de privacitat, condicions d'ús, font oberta", - "@Privacy policy, terms of use, open source": { - "description": "Description for legal information option", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Idea for Canvas Parent App [Android]": "Idea per a l'aplicació Canvas Parent (Android)", - "@Idea for Canvas Parent App [Android]": { - "description": "The subject for the email to request a feature", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The following information will help us better understand your idea:": "La informació següent ens ajudarà a conèixer millor la vostra idea:", - "@The following information will help us better understand your idea:": { - "description": "The header for the users information that is attached to a feature request", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Domain:": "Domini:", - "@Domain:": { - "description": "The label for the Canvas domain of the logged in user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "User ID:": "ID d’usuari:", - "@User ID:": { - "description": "The label for the Canvas user ID of the logged in user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Email:": "Adreça electrònica:", - "@Email:": { - "description": "The label for the eamil of the logged in user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Locale:": "Zona:", - "@Locale:": { - "description": "The label for the locale of the logged in user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Terms of Use": "Condicions d'ús", - "@Terms of Use": { - "description": "Label for the terms of use", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Canvas on GitHub": "Canvas a GitHub", - "@Canvas on GitHub": { - "description": "Label for the button that opens the Canvas project on GitHub's website", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was a problem loading the Terms of Use": "S'ha produït un problema en carregar les condicions d'ús", - "@There was a problem loading the Terms of Use": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Device": "Dispositiu", - "@Device": { - "description": "Label used for device manufacturer/model in the error report", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "OS Version": "Versió del sistema operatiu", - "@OS Version": { - "description": "Label used for device operating system version in the error report", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Version Number": "Número de versió", - "@Version Number": { - "description": "Label used for the app version number in the error report", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Report A Problem": "Informeu d'un problema", - "@Report A Problem": { - "description": "Title used for generic dialog to report problems", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Subject": "Assumpte", - "@Subject": { - "description": "Label used for Subject text field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "A subject is required.": "Cal un assumpte.", - "@A subject is required.": { - "description": "Error shown when the subject field is empty", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "An email address is required.": "Cal una adreça electrònica.", - "@An email address is required.": { - "description": "Error shown when the email field is empty", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Description": "Descripció", - "@Description": { - "description": "Label used for Description text field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "A description is required.": "Cal una descripció.", - "@A description is required.": { - "description": "Error shown when the description field is empty", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "How is this affecting you?": "Com us afecta això?", - "@How is this affecting you?": { - "description": "Label used for the dropdown to select how severe the issue is", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "send": "envia", - "@send": { - "description": "Label used for send button when reporting a problem", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Just a casual question, comment, idea, suggestion…": "Simplement una pregunta, un comentari, una idea, un suggeriment informal…", - "@Just a casual question, comment, idea, suggestion…": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I need some help but it's not urgent.": "Necessito ajuda, però no és urgent.", - "@I need some help but it's not urgent.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Something's broken but I can work around it to get what I need done.": "Alguna cosa no funciona bé però per ara puc seguir treballant per tal d'acabar de fer allò que necessito.", - "@Something's broken but I can work around it to get what I need done.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I can't get things done until I hear back from you.": "No podré fer res fins que em respongueu.", - "@I can't get things done until I hear back from you.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "EXTREME CRITICAL EMERGENCY!!": "EMERGÈNCIA DE CRÍTICA IMPORTÀNCIA!!", - "@EXTREME CRITICAL EMERGENCY!!": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Not Graded": "Sense nota", - "@Not Graded": { - "description": "Description for an assignment has not been graded.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Login flow: Normal": "Flux d'inici de sessió: Normal", - "@Login flow: Normal": { - "description": "Description for the normal login flow", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Login flow: Canvas": "Flux d'inici de sessió: Canvas", - "@Login flow: Canvas": { - "description": "Description for the Canvas login flow", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Login flow: Site Admin": "Flux d'inici de sessió: Administrador del lloc web", - "@Login flow: Site Admin": { - "description": "Description for the Site Admin login flow", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Login flow: Skip mobile verify": "Flux d'inici de sessió: Omet la verificació mòbil", - "@Login flow: Skip mobile verify": { - "description": "Description for the login flow that skips domain verification for mobile", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Act As User": "Actua com un usuari", - "@Act As User": { - "description": "Label for the button that allows the user to act (masquerade) as another user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Stop Acting as User": "Deixa d'actuar com a usuari", - "@Stop Acting as User": { - "description": "Label for the button that allows the user to stop acting (masquerading) as another user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "actingAsUser": "Esteu fent de {userName}", - "@actingAsUser": { - "description": "Message shown while acting (masquerading) as another user", - "type": "text", - "placeholders_order": [ - "userName" - ], - "placeholders": { - "userName": {} - } - }, - "\"Act as\" is essentially logging in as this user without a password. You will be able to take any action as if you were this user, and from other users' points of views, it will be as if this user performed them. However, audit logs record that you were the one who performed the actions on behalf of this user.": "“Actua com” vol dir bàsicament iniciar la sessió com aquest usuari sense una contrasenya. Podreu fer qualsevol acció com si fóssiu aquest usuari, i des del punt de vista dels altres usuaris, serà com si les hagués dut a terme aquest usuari. Tanmateix, els registres d'auditoria enregistren que heu sigut vós qui ha dut a terme les accions en nom de l'altre usuari.", - "@\"Act as\" is essentially logging in as this user without a password. You will be able to take any action as if you were this user, and from other users' points of views, it will be as if this user performed them. However, audit logs record that you were the one who performed the actions on behalf of this user.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Domain": "Domini", - "@Domain": { - "description": "Text field hint for domain url input", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You must enter a valid domain": "Heu d'introduir un domini vàlid", - "@You must enter a valid domain": { - "description": "Message displayed for domain input error", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "User ID": "ID d’usuari", - "@User ID": { - "description": "Text field hint for user ID input", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You must enter a user id": "Heu d'introduir un ID d'usuari", - "@You must enter a user id": { - "description": "Message displayed for user Id input error", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error trying to act as this user. Please check the Domain and User ID and try again.": "S'ha produït un error en intentar actuar com a aquest usuari. Comproveu l'ID d'usuari i el domini i torneu-ho a provar.", - "@There was an error trying to act as this user. Please check the Domain and User ID and try again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "endMasqueradeMessage": "Deixareu d'actuar com a {userName} i tornareu al vostre usuari original.", - "@endMasqueradeMessage": { - "description": "Confirmation message displayed when the user wants to stop acting (masquerading) as another user", - "type": "text", - "placeholders_order": [ - "userName" - ], - "placeholders": { - "userName": {} - } - }, - "endMasqueradeLogoutMessage": "Deixareu d'actuar com a {userName} i es tancarà la vostra sessió.", - "@endMasqueradeLogoutMessage": { - "description": "Confirmation message displayed when the user wants to stop acting (masquerading) as another user and will be logged out.", - "type": "text", - "placeholders_order": [ - "userName" - ], - "placeholders": { - "userName": {} - } - }, - "How are we doing?": "Com ho estem fem?", - "@How are we doing?": { - "description": "Title for dialog asking user to rate the app out of 5 stars.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Don't show again": "No ho tornis a mostrar", - "@Don't show again": { - "description": "Button to prevent the rating dialog from showing again.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "What can we do better?": "Què podem fer millor?", - "@What can we do better?": { - "description": "Hint text for providing a comment with the rating.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Send Feedback": "Envia els comentaris", - "@Send Feedback": { - "description": "Button to send rating with feedback", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "ratingDialogEmailSubject": "Suggeriments per a Android - Canvas Parent {version}", - "@ratingDialogEmailSubject": { - "description": "The subject for an email to provide feedback for CanvasParent.", - "type": "text", - "placeholders_order": [ - "version" - ], - "placeholders": { - "version": {} - } - }, - "starRating": "{position,plural, =1{{position} estrella}other{{position} estrelles}}", - "@starRating": { - "description": "Accessibility label for the 1 stars to 5 stars rating", - "type": "text", - "placeholders_order": [ - "position" - ], - "placeholders": { - "position": { - "example": 1 - } - } - }, - "Student Pairing": "Emparellament de l'estudiant", - "@Student Pairing": { - "description": "Title for the screen where users can pair to students using a QR code", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Open Canvas Student": "Obriu Canvas Student", - "@Open Canvas Student": { - "description": "Title for QR pairing tutorial screen instructing users to open the Canvas Student app", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You'll need to open your student's Canvas Student app to continue. Go into Main Menu > Settings > Pair with Observer and scan the QR code you see there.": "Per continuar, haureu d'obrir l’aplicació Canvas Student de l’estudiant. Aneu a Menú principal > Configuració > Emparella amb l'observador i escanegeu el codi QR que s’hi mostra.", - "@You'll need to open your student's Canvas Student app to continue. Go into Main Menu > Settings > Pair with Observer and scan the QR code you see there.": { - "description": "Message explaining how QR code pairing works", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Screenshot showing location of pairing QR code generation in the Canvas Student app": "Captura de pantalla en què es mostra la ubicació de la generació del codi QR d'emparellament a l'aplicació Canvas Student", - "@Screenshot showing location of pairing QR code generation in the Canvas Student app": { - "description": "Content Description for qr pairing tutorial screenshot", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Expired QR Code": "Codi QR caducat", - "@Expired QR Code": { - "description": "Error title shown when the users scans a QR code that has expired", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The QR code you scanned may have expired. Refresh the code on the student's device and try again.": "És possible que el codi QR que heu escanejat ja hagi caducat. Actualitzeu el codi al dispositiu de l’estudiant i torneu-ho a provar.", - "@The QR code you scanned may have expired. Refresh the code on the student's device and try again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "A network error occurred when adding this student. Check your connection and try again.": "S'ha produït un error de xarxa en afegir aquest estudiant. Reviseu la connexió i torneu-ho a provar.", - "@A network error occurred when adding this student. Check your connection and try again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Invalid QR Code": "Codi QR no vàlid", - "@Invalid QR Code": { - "description": "Error title shown when the user scans an invalid QR code", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Incorrect Domain": "Domini incorrecte", - "@Incorrect Domain": { - "description": "Error title shown when the users scane a QR code for a student that belongs to a different domain", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The student you are trying to add belongs to a different school. Log in or create an account with that school to scan this code.": "L'estudiant que esteu provant d'afegir pertany a una altra escola. Inicieu la sessió o creeu un usuari amb aquesta escola per escanejar aquest codi.", - "@The student you are trying to add belongs to a different school. Log in or create an account with that school to scan this code.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Camera Permission": "Permís per a la càmera", - "@Camera Permission": { - "description": "Error title shown when the user wans to scan a QR code but has denied the camera permission", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "This will unpair and remove all enrollments for this student from your account.": "Amb aquesta acció es cancel·larà l’emparellament i se suprimiran del vostre usuari totes les inscripcions per a aquest estudiant.", - "@This will unpair and remove all enrollments for this student from your account.": { - "description": "Confirmation message shown when the user tries to delete a student from their account", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was a problem removing this student from your account. Please check your connection and try again.": "S’ha produït un problema en suprimir aquest estudiant del vostre usuari. Reviseu la connexió i torneu-ho a provar.", - "@There was a problem removing this student from your account. Please check your connection and try again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Cancel": "Cancel·la", - "@Cancel": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "next": "Següent", - "@next": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "ok": "D'acord", - "@ok": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Yes": "Sí", - "@Yes": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No": "No", - "@No": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Retry": "Torna-ho a provar", - "@Retry": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Delete": "Suprimeix", - "@Delete": { - "description": "Label used for general delete/remove actions", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Done": "Fet", - "@Done": { - "description": "Label for general done/finished actions", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Refresh": "Actualitza", - "@Refresh": { - "description": "Label for button to refresh data from the web", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "View Description": "Mostra la descripció", - "@View Description": { - "description": "Button to view the description for an event or assignment", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "expanded": "desplegat", - "@expanded": { - "description": "Description for the accessibility reader for list groups that are expanded", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "collapsed": "reduït", - "@collapsed": { - "description": "Description for the accessibility reader for list groups that are expanded", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "An unexpected error occurred": "S'ha produït un error inesperat", - "@An unexpected error occurred": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No description": "Sense descripció", - "@No description": { - "description": "Message used when the assignment has no description", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Launch External Tool": "Inicieu l'eina externa", - "@Launch External Tool": { - "description": "Button text added to webviews to let users open external tools in their browser", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Interactions on this page are limited by your institution.": "La vostra institució ha limitat les interaccions en aquesta pàgina.", - "@Interactions on this page are limited by your institution.": { - "description": "Message describing how the webview has limited access due to an instution setting", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "dateAtTime": "{date} a les {time}", - "@dateAtTime": { - "description": "The string to format dates", - "type": "text", - "placeholders_order": [ - "date", - "time" - ], - "placeholders": { - "date": {}, - "time": {} - } - }, - "dueDateAtTime": "Venç el {date} a les {time}", - "@dueDateAtTime": { - "description": "The string to format due dates", - "type": "text", - "placeholders_order": [ - "date", - "time" - ], - "placeholders": { - "date": {}, - "time": {} - } - }, - "No Due Date": "Sense data de lliurament", - "@No Due Date": { - "description": "Label for assignments that do not have a due date", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Filter": "Filtre", - "@Filter": { - "description": "Label for buttons to filter what items are visible", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "unread": "sense llegir", - "@unread": { - "description": "Label for things that are marked as unread", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "unreadCount": "{count} sense llegir", - "@unreadCount": { - "description": "Formatted string for when there are a number of unread items", - "type": "text", - "placeholders_order": [ - "count" - ], - "placeholders": { - "count": {} - } - }, - "badgeNumberPlus": "{count}+", - "@badgeNumberPlus": { - "description": "Formatted string for when too many items are being notified in a badge, generally something like: 99+", - "type": "text", - "placeholders_order": [ - "count" - ], - "placeholders": { - "count": {} - } - }, - "There was an error loading this announcement": "S'ha produït un error en carregar aquest anunci", - "@There was an error loading this announcement": { - "description": "Message shown when an announcement detail screen fails to load", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Network error": "Error de xarxa", - "@Network error": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Under Construction": "En construcció", - "@Under Construction": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "We are currently building this feature for your viewing pleasure.": "Estem creant aquesta característica perquè pugueu gaudir de la visualització.", - "@We are currently building this feature for your viewing pleasure.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Request Login Help Button": "Botó Sol·liciteu ajuda per iniciar la sessió", - "@Request Login Help Button": { - "description": "Accessibility hint for button that opens help dialog for a login help request", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Request Login Help": "Sol·liciteu ajuda per iniciar la sessió", - "@Request Login Help": { - "description": "Title of help dialog for a login help request", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I'm having trouble logging in": "Tinc problemes per iniciar la sessió", - "@I'm having trouble logging in": { - "description": "Subject of help dialog for a login help request", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "An error occurred when trying to display this link": "S'ha produït un error en provar de mostrar aquest enllaç", - "@An error occurred when trying to display this link": { - "description": "Error message shown when a link can't be opened", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "We are unable to display this link, it may belong to an institution you currently aren't logged in to.": "No podem mostrar aquest enllaç, pot ser que pertanyi a una institució en la que actualment no teniu la sessió iniciada.", - "@We are unable to display this link, it may belong to an institution you currently aren't logged in to.": { - "description": "Description for error page shown when clicking a link", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Link Error": "Error d'enllaç", - "@Link Error": { - "description": "Title for error page shown when clicking a link", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Open In Browser": "Obre'l al navegador", - "@Open In Browser": { - "description": "Text for button to open a link in the browswer", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You'll find the QR code on the web in your account profile. Click 'QR for Mobile Login' in the list.": "Trobareu el codi QR a la web, al perfil del vostre usuari. Feu clic a \"QR per a inici de sessió mòbil\" a la llista.", - "@You'll find the QR code on the web in your account profile. Click 'QR for Mobile Login' in the list.": { - "description": "Text for qr login tutorial screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Locate QR Code": "Localitzeu el codi QR", - "@Locate QR Code": { - "description": "Text for qr login button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Please scan a QR code generated by Canvas": "Escanegeu un codi QR generat pel Canvas", - "@Please scan a QR code generated by Canvas": { - "description": "Text for qr login error with incorrect qr code", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error logging in. Please generate another QR Code and try again.": "S'ha produït un error en iniciar la sessió. Genereu un altre codi QR i torneu-ho a provar.", - "@There was an error logging in. Please generate another QR Code and try again.": { - "description": "Text for qr login error", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Screenshot showing location of QR code generation in browser": "Captura de pantalla que mostra la ubicació de la generació d'un codi QR al navegador", - "@Screenshot showing location of QR code generation in browser": { - "description": "Content Description for qr login tutorial screenshot", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "QR scanning requires camera access": "Per escanejar el codi QR, cal tenir accés a la càmera.", - "@QR scanning requires camera access": { - "description": "placeholder for camera error for QR code scan", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The linked item is no longer available": "L’element enllaçat ja no està disponible", - "@The linked item is no longer available": { - "description": "error message when the alert could no be opened", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Message sent": "Missatge enviat", - "@Message sent": { - "description": "confirmation message on the screen when the user succesfully sends a message", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Acceptable Use Policy": "Política d’ús acceptable", - "@Acceptable Use Policy": { - "description": "title for the acceptable use policy screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Submit": "Entrega", - "@Submit": { - "description": "submit button title for acceptable use policy screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Either you're a new user or the Acceptable Use Policy has changed since you last agreed to it. Please agree to the Acceptable Use Policy before you continue.": "O bé sou un usuari nou o la política d’ús acceptable ha canviat des de la darrera vegada que la vau acceptar. Accepteu la política d’ús acceptable abans de continuar.", - "@Either you're a new user or the Acceptable Use Policy has changed since you last agreed to it. Please agree to the Acceptable Use Policy before you continue.": { - "description": "acceptable use policy screen description", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I agree to the Acceptable Use Policy.": "Accepto la política d’ús acceptable.", - "@I agree to the Acceptable Use Policy.": { - "description": "acceptable use policy switch title", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "About": "Quant a", - "@About": { - "description": "Title for about menu item in settings", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "App": "Aplicació", - "@App": { - "description": "Title for App field on about page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Login ID": "ID d'inici de sessió", - "@Login ID": { - "description": "Title for Login ID field on about page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Email": "Correu electrònic", - "@Email": { - "description": "Title for Email field on about page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Version": "Versió", - "@Version": { - "description": "Title for Version field on about page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Instructure logo": "Logotip de l’Instructure", - "@Instructure logo": { - "description": "Semantics label for the Instructure logo on the about page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - } -} \ No newline at end of file diff --git a/apps/flutter_parent/lib/l10n/res/intl_cy.arb b/apps/flutter_parent/lib/l10n/res/intl_cy.arb deleted file mode 100644 index 4b8db4b546..0000000000 --- a/apps/flutter_parent/lib/l10n/res/intl_cy.arb +++ /dev/null @@ -1,2753 +0,0 @@ -{ - "@@last_modified": "2023-08-25T11:04:20.901151", - "alertsLabel": "Negeseuon Hysbysu", - "@alertsLabel": { - "description": "The label for the Alerts tab", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "calendarLabel": "Calendr", - "@calendarLabel": { - "description": "The label for the Calendar tab", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "coursesLabel": "Cyrsiau", - "@coursesLabel": { - "description": "The label for the Courses tab", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Students": "Dim Myfyrwyr", - "@No Students": { - "description": "Text for when an observer has no students they are observing", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Tap to show student selector": "Tapiwch i ddangos y dewisydd myfyrwyr", - "@Tap to show student selector": { - "description": "Semantics label for the area that will show the student selector when tapped", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Tap to pair with a new student": "Tapiwch i baru â myfyriwr newydd", - "@Tap to pair with a new student": { - "description": "Semantics label for the add student button in the student selector", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Tap to select this student": "Tapiwch i ddewis y myfyriwr hwn", - "@Tap to select this student": { - "description": "Semantics label on individual students in the student switcher", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Manage Students": "Rheoli Myfyrwyr", - "@Manage Students": { - "description": "Label text for the Manage Students nav drawer button as well as the title for the Manage Students screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Help": "Help", - "@Help": { - "description": "Label text for the help nav drawer button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Log Out": "Allgofnodi", - "@Log Out": { - "description": "Label text for the Log Out nav drawer button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Switch Users": "Newid Defnyddwyr", - "@Switch Users": { - "description": "Label text for the Switch Users nav drawer button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "appVersion": "v. {version}", - "@appVersion": { - "description": "App version shown in the navigation drawer", - "type": "text", - "placeholders_order": [ - "version" - ], - "placeholders": { - "version": {} - } - }, - "Are you sure you want to log out?": "Ydych chi’n siŵr eich bod am allgofnodi?", - "@Are you sure you want to log out?": { - "description": "Confirmation message displayed when the user tries to log out", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Calendars": "Calendrau", - "@Calendars": { - "description": "Label for button that lets users select which calendars to display", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "nextMonth": "Mis nesaf: {month}", - "@nextMonth": { - "description": "Label for the button that switches the calendar to the next month", - "type": "text", - "placeholders_order": [ - "month" - ], - "placeholders": { - "month": {} - } - }, - "previousMonth": "Mis blaenorol: {month}", - "@previousMonth": { - "description": "Label for the button that switches the calendar to the previous month", - "type": "text", - "placeholders_order": [ - "month" - ], - "placeholders": { - "month": {} - } - }, - "nextWeek": "Wythnos nesaf yn cychwyn {date}", - "@nextWeek": { - "description": "Label for the button that switches the calendar to the next week", - "type": "text", - "placeholders_order": [ - "date" - ], - "placeholders": { - "date": {} - } - }, - "previousWeek": "Wythnos flaenorol yn cychwyn {date}", - "@previousWeek": { - "description": "Label for the button that switches the calendar to the previous week", - "type": "text", - "placeholders_order": [ - "date" - ], - "placeholders": { - "date": {} - } - }, - "selectedMonthLabel": "Mis {month}", - "@selectedMonthLabel": { - "description": "Accessibility label for the button that expands/collapses the month view", - "type": "text", - "placeholders_order": [ - "month" - ], - "placeholders": { - "month": {} - } - }, - "expand": "ehangu", - "@expand": { - "description": "Accessibility label for the on-tap hint for the button that expands/collapses the month view", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "collapse": "crebachu", - "@collapse": { - "description": "Accessibility label for the on-tap hint for the button that expands/collapses the month view", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "pointsPossible": "{points} pwynt yn bosib", - "@pointsPossible": { - "description": "Screen reader label used for the points possible for an assignment, quiz, etc.", - "type": "text", - "placeholders_order": [ - "points" - ], - "placeholders": { - "points": {} - } - }, - "calendarDaySemanticsLabel": "{eventCount,plural, =1{{date}, {eventCount} digwyddiad}other{{date}, {eventCount} digwyddiad}}", - "@calendarDaySemanticsLabel": { - "description": "Screen reader label used for calendar day, reads the date and count of events", - "type": "text", - "placeholders_order": [ - "date", - "eventCount" - ], - "placeholders": { - "date": {}, - "eventCount": {} - } - }, - "No Events Today!": "Dim Digwyddiadau Heddiw!", - "@No Events Today!": { - "description": "Title displayed when there are no calendar events for the current day", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "It looks like a great day to rest, relax, and recharge.": "Mae’n edrych fel diwrnod gwych i orffwys, ymlacio a dod at eich hun.", - "@It looks like a great day to rest, relax, and recharge.": { - "description": "Message displayed when there are no calendar events for the current day", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading your student's calendar": "Gwall wrth lwytho calendr eich myfyriwr", - "@There was an error loading your student's calendar": { - "description": "Message displayed when calendar events could not be loaded for the current student", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Tap to favorite the courses you want to see on the Calendar. Select up to 10.": "Tapiwch i nodi fel ffefrynnau’r cyrsiau rydych chi am eu gweld ar y Calendr. Dewiswch hyd at 10.", - "@Tap to favorite the courses you want to see on the Calendar. Select up to 10.": { - "description": "Description text on calendar filter screen.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You may only choose 10 calendars to display": "Dim ond 10 calendr y cewch chi eu dewis i’w dangos", - "@You may only choose 10 calendars to display": { - "description": "Error text when trying to select more than 10 calendars", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You must select at least one calendar to display": "Mae’n rhaid i chi ddewis o leiaf un calendr i'w ddangos", - "@You must select at least one calendar to display": { - "description": "Error text when trying to de-select all calendars", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Planner Note": "Nodyn gan y Trefnydd", - "@Planner Note": { - "description": "Label used for notes in the planner", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Go to today": "Mynd i heddiw", - "@Go to today": { - "description": "Accessibility label used for the today button in the planner", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Previous Logins": "Manylion Mewngofnodi Blaenorol", - "@Previous Logins": { - "description": "Label for the list of previous user logins", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "canvasLogoLabel": "Logo Canvas", - "@canvasLogoLabel": { - "description": "The semantics label for the Canvas logo", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "findSchool": "Dod o hyd i Ysgol", - "@findSchool": { - "description": "Text for the find-my-school button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "findAnotherSchool": "Dod o hyd i ysgol arall", - "@findAnotherSchool": { - "description": "Text for the find-another-school button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "domainSearchInputHint": "Rhowch ardal neu enw’r ysgol...", - "@domainSearchInputHint": { - "description": "Input hint for the text box on the domain search screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "noDomainResults": "Doedd dim modd dod o hyd i ysgolion yn cyfateb â \"{query}\"", - "@noDomainResults": { - "description": "Message shown to users when the domain search query did not return any results", - "type": "text", - "placeholders_order": [ - "query" - ], - "placeholders": { - "query": {} - } - }, - "domainSearchHelpLabel": "Sut ydw i’n dod o hyd i fy ysgol neu ardal?", - "@domainSearchHelpLabel": { - "description": "Label for the help button on the domain search screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "canvasGuides": "Canllawiau Canvas", - "@canvasGuides": { - "description": "Proper name for the Canvas Guides. This will be used in the domainSearchHelpBody text and will be highlighted and clickable", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "canvasSupport": "Cymorth Canvas", - "@canvasSupport": { - "description": "Proper name for Canvas Support. This will be used in the domainSearchHelpBody text and will be highlighted and clickable", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "domainSearchHelpBody": "Ceisiwch chwilio am enw’r ysgol neu’r ardal rydych chi’n ceisio cael mynediad atynt, fel “Smith Private School” neu “Smith County Schools.” Gallwch chi hefyd roi parth Canvas yn uniongyrchol, fel “smith.instructure.com.”\n\nI gael rhagor o wybodaeth ynglŷn â chanfod cyfrif Canvas eich sefydliad, ewch i {canvasGuides}, gofynnwch i {canvasSupport}, neu cysylltwch â’ch ysgol i gael help.", - "@domainSearchHelpBody": { - "description": "The body text shown in the help dialog on the domain search screen", - "type": "text", - "placeholders_order": [ - "canvasGuides", - "canvasSupport" - ], - "placeholders": { - "canvasGuides": {}, - "canvasSupport": {} - } - }, - "Uh oh!": "O na!", - "@Uh oh!": { - "description": "Title of the screen that shows when a crash has occurred", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "We’re not sure what happened, but it wasn’t good. Contact us if this keeps happening.": "Dydyn ni ddim yn siŵr beth ddigwyddodd, ond doedd o ddim yn dd. Cysylltwch â ni os ydy hyn yn parhau i ddigwydd.", - "@We’re not sure what happened, but it wasn’t good. Contact us if this keeps happening.": { - "description": "Message shown when a crash has occurred", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Contact Support": "Cysylltwch â'r adran Gymorth", - "@Contact Support": { - "description": "Label for the button that allows users to contact support after a crash has occurred", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "View error details": "Gweld manylion gwall", - "@View error details": { - "description": "Label for the button that allowed users to view crash details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Restart app": "Ailddechrau’r ap", - "@Restart app": { - "description": "Label for the button that will restart the entire application", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Application version": "Fersin o’r rhaglen", - "@Application version": { - "description": "Label for the application version displayed in the crash details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Device model": "Model o’r ddyfais", - "@Device model": { - "description": "Label for the device model displayed in the crash details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Android OS version": "Fersiwn OS Android", - "@Android OS version": { - "description": "Label for the Android operating system version displayed in the crash details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Full error message": "Neges gwall llawn", - "@Full error message": { - "description": "Label for the full error message displayed in the crash details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Inbox": "Blwch Derbyn", - "@Inbox": { - "description": "Title for the Inbox screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading your inbox messages.": "Gwall wrth lwytho’ch negeseuon blwch derbyn.", - "@There was an error loading your inbox messages.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Subject": "Dim Pwnc", - "@No Subject": { - "description": "Title used for inbox messages that have no subject", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unable to fetch courses. Please check your connection and try again.": "Doedd dim modd nôl cyrsiau. Gwiriwch eich cysylltiad a rhowch gynnig arall arni.", - "@Unable to fetch courses. Please check your connection and try again.": { - "description": "Message shown when an error occured while loading courses", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Choose a course to message": "Dewiswch gwrs i anfon neges ato", - "@Choose a course to message": { - "description": "Header in the course list shown when the user is choosing which course to associate with a new message", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Inbox Zero": "Inbox Zero", - "@Inbox Zero": { - "description": "Title of the message shown when there are no inbox messages", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You’re all caught up!": "Rydych chi wedi dal i fyny!", - "@You’re all caught up!": { - "description": "Subtitle of the message shown when there are no inbox messages", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading recipients for this course": "Gwall wrth lwytho derbynwyr ar gyfer y cwrs hwn", - "@There was an error loading recipients for this course": { - "description": "Message shown when attempting to create a new message but the recipients list failed to load", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unable to send message. Check your connection and try again.": "Doedd dim modd anfon y neges. Gwiriwch eich cysylltiad a rhowch gynnig arall arni.", - "@Unable to send message. Check your connection and try again.": { - "description": "Message show when there was an error creating or sending a new message", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unsaved changes": "Newidiadau heb eu cadw", - "@Unsaved changes": { - "description": "Title of the dialog shown when the user tries to leave with unsaved changes", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Are you sure you wish to close this page? Your unsent message will be lost.": "Ydych chi’n siŵr eich bod chi eisiau cau’r dudalen hon? Od nad yw eich neges wedi’i anfon bydd yn cael ei golli.", - "@Are you sure you wish to close this page? Your unsent message will be lost.": { - "description": "Body text of the dialog shown when the user tries leave with unsaved changes", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "New message": "Neges newydd", - "@New message": { - "description": "Title of the new-message screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Add attachment": "Ychwanegu atodiad", - "@Add attachment": { - "description": "Tooltip for the add-attachment button in the new-message screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Send message": "Anfon neges", - "@Send message": { - "description": "Tooltip for the send-message button in the new-message screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Select recipients": "Dewis derbynwyr", - "@Select recipients": { - "description": "Tooltip for the button that allows users to select message recipients", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No recipients selected": "Dim derbynwyr wedi’u dewis", - "@No recipients selected": { - "description": "Hint displayed when the user has not selected any message recipients", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Message subject": "Pwnc y neges", - "@Message subject": { - "description": "Hint text displayed in the input field for the message subject", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Message": "Neges", - "@Message": { - "description": "Hint text displayed in the input field for the message body", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Recipients": "Derbynwyr", - "@Recipients": { - "description": "Label for message recipients", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "plusRecipientCount": "+{count}", - "@plusRecipientCount": { - "description": "Shows the number of recipients that are selected but not displayed on screen.", - "type": "text", - "placeholders_order": [ - "count" - ], - "placeholders": { - "count": { - "example": 5 - } - } - }, - "Failed. Tap for options.": "Wedi methu. Tapiwch i gael opsiynau.", - "@Failed. Tap for options.": { - "description": "Short message shown on a message attachment when uploading has failed", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "courseForWhom": "ar gyfer {studentShortName}", - "@courseForWhom": { - "description": "Describes for whom a course is for (i.e. for Bill)", - "type": "text", - "placeholders_order": [ - "studentShortName" - ], - "placeholders": { - "studentShortName": {} - } - }, - "messageLinkPostscript": "Ynghylch: {studentName}, {linkUrl}", - "@messageLinkPostscript": { - "description": "A postscript appended to new messages that clarifies which student is the subject of the message and also includes a URL for the related Canvas component (course, assignment, event, etc).", - "type": "text", - "placeholders_order": [ - "studentName", - "linkUrl" - ], - "placeholders": { - "studentName": {}, - "linkUrl": {} - } - }, - "There was an error loading this conversation": "Gwall wrth lwytho'r sgwrs hon", - "@There was an error loading this conversation": { - "description": "Message shown when a conversation fails to load", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Reply": "Ateb", - "@Reply": { - "description": "Button label for replying to a conversation", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Reply All": "Ateb Pawb", - "@Reply All": { - "description": "Button label for replying to all conversation participants", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unknown User": "Defnyddiwr Dieithr", - "@Unknown User": { - "description": "Label used where the user name is not known", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "me": "fi", - "@me": { - "description": "First-person pronoun (i.e. 'me') that will be used in message author info, e.g. 'Me to 4 others' or 'Jon Snow to me'", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "authorToRecipient": "{authorName} i {recipientName}", - "@authorToRecipient": { - "description": "Author info for a single-recipient message; includes both the author name and the recipient name.", - "type": "text", - "placeholders_order": [ - "authorName", - "recipientName" - ], - "placeholders": { - "authorName": {}, - "recipientName": {} - } - }, - "authorToNOthers": "{howMany,plural, =1{{authorName} i 1 arall}other{{authorName} i {howMany} arall}}", - "@authorToNOthers": { - "description": "Author info for a mutli-recipient message; includes the author name and the number of recipients", - "type": "text", - "placeholders_order": [ - "authorName", - "howMany" - ], - "placeholders": { - "authorName": {}, - "howMany": {} - } - }, - "authorToRecipientAndNOthers": "{howMany,plural, =1{{authorName} i {recipientName} ac 1 arall}other{{authorName} i {recipientName} a {howMany} arall}}", - "@authorToRecipientAndNOthers": { - "description": "Author info for a multi-recipient message; includes the author name, one recipient name, and the number of other recipients", - "type": "text", - "placeholders_order": [ - "authorName", - "recipientName", - "howMany" - ], - "placeholders": { - "authorName": {}, - "recipientName": {}, - "howMany": {} - } - }, - "Download": "Llwytho i Lawr", - "@Download": { - "description": "Label for the button that will begin downloading a file", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Open with another app": "Agor gydag ap arall", - "@Open with another app": { - "description": "Label for the button that will allow users to open a file with another app", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There are no installed applications that can open this file": "Does dim rhaglen wedi’i gosod a all agor y ffeil hon", - "@There are no installed applications that can open this file": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unsupported File": "Ffeil Anghydnaws", - "@Unsupported File": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "This file is unsupported and can’t be viewed through the app": "Mae’r ffeil hon yn anghydnaws ac nid oes modd ei gweld drwy’r ap", - "@This file is unsupported and can’t be viewed through the app": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unable to play this media file": "Doedd dim modd chwarae’r ffeil gyfryngau", - "@Unable to play this media file": { - "description": "Message shown when audio or video media could not be played", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unable to load this image": "Doedd dim modd llwytho’r ddelwedd hon", - "@Unable to load this image": { - "description": "Message shown when an image file could not be loaded or displayed", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading this file": "Gwall wrth lwytho'r ffeil hon", - "@There was an error loading this file": { - "description": "Message shown when a file could not be loaded or displayed", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Courses": "Dim Cyrsiau", - "@No Courses": { - "description": "Title for having no courses", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Your student’s courses might not be published yet.": "Efallai nad yw cyrsiau eich myfyriwr wedi cael eu cyhoeddi eto.", - "@Your student’s courses might not be published yet.": { - "description": "Message for having no courses", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading your student’s courses.": "Gwall wrth lwytho cyrsiau eich myfyriwr.", - "@There was an error loading your student’s courses.": { - "description": "Message displayed when the list of student courses could not be loaded", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Grade": "Dim Gradd", - "@No Grade": { - "description": "Message shown when there is currently no grade available for a course", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Filter by": "Hidlo yn ôl", - "@Filter by": { - "description": "Title for list of terms to filter grades by", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Grades": "Graddau", - "@Grades": { - "description": "Label for the \"Grades\" tab in course details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Syllabus": "Maes Llafur", - "@Syllabus": { - "description": "Label for the \"Syllabus\" tab in course details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Front Page": "Tudalen Flaen", - "@Front Page": { - "description": "Label for the \"Front Page\" tab in course details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Summary": "Crynodeb", - "@Summary": { - "description": "Label for the \"Summary\" tab in course details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Send a message about this course": "Anfon neges am y cwrs hwn", - "@Send a message about this course": { - "description": "Accessibility hint for the course messaage floating action button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Total Grade": "Gradd Gyffredinol", - "@Total Grade": { - "description": "Label for the total grade in the course", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Graded": "Wedi graddio", - "@Graded": { - "description": "Label for assignments that have been graded", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Submitted": "Wedi Cyflwyno", - "@Submitted": { - "description": "Label for assignments that have been submitted", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Not Submitted": "Heb Gyflwyno", - "@Not Submitted": { - "description": "Label for assignments that have not been submitted", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Late": "Yn Hwyr", - "@Late": { - "description": "Label for assignments that have been marked late or submitted late", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Missing": "Ar goll", - "@Missing": { - "description": "Label for assignments that have been marked missing or are not submitted and past the due date", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "-": "-", - "@-": { - "description": "Value representing no score for student submission", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "All Grading Periods": "Pob Cyfnod Graddio", - "@All Grading Periods": { - "description": "Label for selecting all grading periods", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Assignments": "Dim Aseiniadau", - "@No Assignments": { - "description": "Title for the no assignments message", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "It looks like assignments haven't been created in this space yet.": "Mae’n ymddangos nad oes aseiniadau wedi cael eu creu yn y gofod hwn eto.", - "@It looks like assignments haven't been created in this space yet.": { - "description": "Message for no assignments", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading the summary details for this course.": "Gwall wrth lwytho’r manylion cryno ar gyfer y cwrs hwn.", - "@There was an error loading the summary details for this course.": { - "description": "Message shown when the course summary could not be loaded", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Summary": "Dim Crynodeb", - "@No Summary": { - "description": "Title displayed when there are no items in the course summary", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "This course does not have any assignments or calendar events yet.": "Does gan y cwrs hwn ddim aseiniadau neu ddigwyddiadau calendr eto.", - "@This course does not have any assignments or calendar events yet.": { - "description": "Message displayed when there are no items in the course summary", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "gradeFormatScoreOutOfPointsPossible": "{score} / {pointsPossible}", - "@gradeFormatScoreOutOfPointsPossible": { - "description": "Formatted string for a student score out of the points possible", - "type": "text", - "placeholders_order": [ - "score", - "pointsPossible" - ], - "placeholders": { - "score": {}, - "pointsPossible": {} - } - }, - "contentDescriptionScoreOutOfPointsPossible": "{score} allan o {pointsPossible} pwynt", - "@contentDescriptionScoreOutOfPointsPossible": { - "description": "Formatted string for a student score out of the points possible", - "type": "text", - "placeholders_order": [ - "score", - "pointsPossible" - ], - "placeholders": { - "score": {}, - "pointsPossible": {} - } - }, - "gradesSubjectMessage": "Ynghylch: {studentName}, Graddau", - "@gradesSubjectMessage": { - "description": "The subject line for a message to a teacher regarding a student's grades", - "type": "text", - "placeholders_order": [ - "studentName" - ], - "placeholders": { - "studentName": {} - } - }, - "syllabusSubjectMessage": "Ynghylch: {studentName}, Maes Llafur", - "@syllabusSubjectMessage": { - "description": "The subject line for a message to a teacher regarding a course syllabus", - "type": "text", - "placeholders_order": [ - "studentName" - ], - "placeholders": { - "studentName": {} - } - }, - "frontPageSubjectMessage": "Ynghylch: {studentName}, Tudalen Flaen", - "@frontPageSubjectMessage": { - "description": "The subject line for a message to a teacher regarding a course front page", - "type": "text", - "placeholders_order": [ - "studentName" - ], - "placeholders": { - "studentName": {} - } - }, - "assignmentSubjectMessage": "Ynghylch: {studentName}, Aseiniad - {assignmentName}", - "@assignmentSubjectMessage": { - "description": "The subject line for a message to a teacher regarding a student's assignment", - "type": "text", - "placeholders_order": [ - "studentName", - "assignmentName" - ], - "placeholders": { - "studentName": {}, - "assignmentName": {} - } - }, - "eventSubjectMessage": "Ynghylch: {studentName}, Digwyddiad - {eventTitle}", - "@eventSubjectMessage": { - "description": "The subject line for a message to a teacher regarding a calendar event", - "type": "text", - "placeholders_order": [ - "studentName", - "eventTitle" - ], - "placeholders": { - "studentName": {}, - "eventTitle": {} - } - }, - "There is no page information available.": "Does dim gwybodaeth tudalen ar gael.", - "@There is no page information available.": { - "description": "Description for when no page information is available", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Assignment Details": "Manylion Aseiniad", - "@Assignment Details": { - "description": "Title for the page that shows details for an assignment", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "assignmentTotalPoints": "{points} pwynt", - "@assignmentTotalPoints": { - "description": "Label used for the total points the assignment is worth", - "type": "text", - "placeholders_order": [ - "points" - ], - "placeholders": { - "points": {} - } - }, - "assignmentTotalPointsAccessible": "{points} pwynt", - "@assignmentTotalPointsAccessible": { - "description": "Screen reader label used for the total points the assignment is worth", - "type": "text", - "placeholders_order": [ - "points" - ], - "placeholders": { - "points": {} - } - }, - "Due": "Erbyn", - "@Due": { - "description": "Label for an assignment due date", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Grade": "Gradd", - "@Grade": { - "description": "Label for the section that displays an assignment's grade", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Locked": "Wedi Cloi", - "@Locked": { - "description": "Label for when an assignment is locked", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "assignmentLockedModule": "Mae'r aseiniad hwn wedi'i gloi gan y modiwl \"{moduleName}\".", - "@assignmentLockedModule": { - "description": "The locked description when an assignment is locked by a module", - "type": "text", - "placeholders_order": [ - "moduleName" - ], - "placeholders": { - "moduleName": {} - } - }, - "Remind Me": "Fy Atgoffa", - "@Remind Me": { - "description": "Label for the row to set reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Set a date and time to be notified of this specific assignment.": "Gosod dyddiad ac amser i gael eich atgoffa am yr aseiniad penodol hwn.", - "@Set a date and time to be notified of this specific assignment.": { - "description": "Description for row to set reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You will be notified about this assignment on…": "Byddwch chi’n cael eich hysbysu am yr aseiniad hwn ar...", - "@You will be notified about this assignment on…": { - "description": "Description for when a reminder is set", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Instructions": "Cyfarwyddiadau", - "@Instructions": { - "description": "Label for the description of the assignment when it has quiz instructions", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Send a message about this assignment": "Anfon neges am yr aseiniad hwn", - "@Send a message about this assignment": { - "description": "Accessibility hint for the assignment messaage floating action button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "This app is not authorized for use.": "Dydi’r ap hwn ddim wedi’i awdurdodi i’w ddefnyddio.", - "@This app is not authorized for use.": { - "description": "The error shown when the app being used is not verified by Canvas", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The server you entered is not authorized for this app.": "Dydy’r gweinydd rydych chi wedi'i roi ddim wedi’i awdurdodi ar gyfer yr ap hwn.", - "@The server you entered is not authorized for this app.": { - "description": "The error shown when the desired login domain is not verified by Canvas", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The user agent for this app is not authorized.": "Dydy’r asiant defnyddiwr ar gyfer yr ap hwn ddim wedi’i awdurdodi.", - "@The user agent for this app is not authorized.": { - "description": "The error shown when the user agent during verification is not verified by Canvas", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "We were unable to verify the server for use with this app.": "Doedd dim modd dilysu’r gweinydd i’w ddefnyddio gyda’r ap hwn.", - "@We were unable to verify the server for use with this app.": { - "description": "The generic error shown when we are unable to verify with Canvas", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Reminders": "Nodiadau atgoffa", - "@Reminders": { - "description": "Name of the system notification channel for assignment and event reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Notifications for reminders about assignments and calendar events": "Hysbysiadau ar gyfer nodiadau atgoffa am aseiniadau a digwyddiadau calendr", - "@Notifications for reminders about assignments and calendar events": { - "description": "Description of the system notification channel for assignment and event reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Reminders have changed!": "Mae’r nodiadau atgoffa wedi newid!", - "@Reminders have changed!": { - "description": "Title of the dialog shown when the user needs to update their reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "In order to provide you with a better experience, we have updated how reminders work. You can add new reminders by viewing an assignment or calendar event and tapping the switch under the \"Remind Me\" section.\n\nBe aware that any reminders created with older versions of this app will not be compatible with the new changes and you will need to create them again.": "Er mwyn rhoi profiad gwell i chi, rydyn ni wedi diweddaru sut mae nodiadau atgoffa’n gweithio. Gallwch chi ychwanegu nodiadau atgoffa newydd drwy edrych at aseiniad neu ddigwyddiad calendr a thapio’r switsh o dan yr adran \"Fy Atgoffa\".\n\nByddwch yn ymwybodol na fydd unrhyw nodiadau atgoffa sydd wedi cael eu creu gyda hen fersiynau o’r ap hwn yn gydnaws a’r newidiadau newydd a bydd angen i chi eu creu eto.", - "@In order to provide you with a better experience, we have updated how reminders work. You can add new reminders by viewing an assignment or calendar event and tapping the switch under the \"Remind Me\" section.\n\nBe aware that any reminders created with older versions of this app will not be compatible with the new changes and you will need to create them again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Not a parent?": "Ddim yn rhiant?", - "@Not a parent?": { - "description": "Title for the screen that shows when the user is not observing any students", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "We couldn't find any students associated with this account": "Doedd dim modd dod o hyd i unrhyw fyfyrwyr sy’n gysylltiedig â’r cyfrif hwn", - "@We couldn't find any students associated with this account": { - "description": "Subtitle for the screen that shows when the user is not observing any students", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Are you a student or teacher?": "Ai myfyriwr neu athro ydych chi?", - "@Are you a student or teacher?": { - "description": "Label for button that will show users the option to view other Canvas apps in the Play Store", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "One of our other apps might be a better fit. Tap one to visit the Play Store.": "Efallai y byddai un o'r apiau eraill yn fwy addas. Tapiwch un i fynd i'r Play Store.", - "@One of our other apps might be a better fit. Tap one to visit the Play Store.": { - "description": "Description of options to view other Canvas apps in the Play Store", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Return to Login": "Yn ôl i Fewngofnodi", - "@Return to Login": { - "description": "Label for the button that returns the user to the login screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "STUDENT": "MYFYRIWR", - "@STUDENT": { - "description": "The \"student\" portion of the \"Canvas Student\" app name, in all caps. \"Canvas\" is excluded in this context as it will be displayed to the user as a wordmark image", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "TEACHER": "ATHRO", - "@TEACHER": { - "description": "The \"teacher\" portion of the \"Canvas Teacher\" app name, in all caps. \"Canvas\" is excluded in this context as it will be displayed to the user as a wordmark image", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Canvas Student": "Myfyriwr Canvas", - "@Canvas Student": { - "description": "The name of the Canvas Student app. Only \"Student\" should be translated as \"Canvas\" is a brand name in this context and should not be translated.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Canvas Teacher": "Canvas Teacher", - "@Canvas Teacher": { - "description": "The name of the Canvas Teacher app. Only \"Teacher\" should be translated as \"Canvas\" is a brand name in this context and should not be translated.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Alerts": "Dim Negeseuon Hysbysu", - "@No Alerts": { - "description": "The title for the empty message to show to users when there are no alerts for the student.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There’s nothing to be notified of yet.": "Does dim i’w hysbysu eto.", - "@There’s nothing to be notified of yet.": { - "description": "The empty message to show to users when there are no alerts for the student.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "dismissAlertLabel": "Gwrthod {alertTitle}", - "@dismissAlertLabel": { - "description": "Accessibility label to dismiss an alert", - "type": "text", - "placeholders_order": [ - "alertTitle" - ], - "placeholders": { - "alertTitle": {} - } - }, - "Course Announcement": "Cyhoeddiad Cwrs", - "@Course Announcement": { - "description": "Title for alerts when there is a course announcement", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Institution Announcement": "Cyhoeddiad Sefydliad", - "@Institution Announcement": { - "description": "Title for alerts when there is an institution announcement", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "assignmentGradeAboveThreshold": "Gradd yr Aseiniad yn Uwch na {threshold}", - "@assignmentGradeAboveThreshold": { - "description": "Title for alerts when an assignment grade is above the threshold value", - "type": "text", - "placeholders_order": [ - "threshold" - ], - "placeholders": { - "threshold": {} - } - }, - "assignmentGradeBelowThreshold": "Gradd yr Aseiniad yn Is na {threshold}", - "@assignmentGradeBelowThreshold": { - "description": "Title for alerts when an assignment grade is below the threshold value", - "type": "text", - "placeholders_order": [ - "threshold" - ], - "placeholders": { - "threshold": {} - } - }, - "courseGradeAboveThreshold": "Gradd y Cwrs yn Uwch na {threshold}", - "@courseGradeAboveThreshold": { - "description": "Title for alerts when a course grade is above the threshold value", - "type": "text", - "placeholders_order": [ - "threshold" - ], - "placeholders": { - "threshold": {} - } - }, - "courseGradeBelowThreshold": "Gradd y Cwrs yn Is na {threshold}", - "@courseGradeBelowThreshold": { - "description": "Title for alerts when a course grade is below the threshold value", - "type": "text", - "placeholders_order": [ - "threshold" - ], - "placeholders": { - "threshold": {} - } - }, - "Settings": "Gosodiadau", - "@Settings": { - "description": "Title for the settings screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Theme": "Thema", - "@Theme": { - "description": "Label for the light/dark theme section in the settings page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Dark Mode": "Modd Tywyll", - "@Dark Mode": { - "description": "Label for the button that enables dark mode", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Light Mode": "Modd Golau", - "@Light Mode": { - "description": "Label for the button that enables light mode", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "High Contrast Mode": "Modd â Chyferbyniad Uchel", - "@High Contrast Mode": { - "description": "Label for the switch that toggles high contrast mode", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Use Dark Theme in Web Content": "Defnyddio Thema Dywyll mewn Cynnwys Gwe", - "@Use Dark Theme in Web Content": { - "description": "Label for the switch that toggles dark mode for webviews", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Appearance": "Ymddangdosiad", - "@Appearance": { - "description": "Label for the appearance section in the settings page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Successfully submitted!": "Wedi llwyddo i gyflwyno!", - "@Successfully submitted!": { - "description": "Title displayed in the grade cell for an assignment that has been submitted", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "submissionStatusSuccessSubtitle": "Cafodd yr aseiniad hwn ei gyflwyno ar {date} am {time} ac mae’n aros i gael ei raddio", - "@submissionStatusSuccessSubtitle": { - "description": "Subtitle displayed in the grade cell for an assignment that has been submitted and is awaiting a grade", - "type": "text", - "placeholders_order": [ - "date", - "time" - ], - "placeholders": { - "date": {}, - "time": {} - } - }, - "outOfPoints": "{howMany,plural, =1{Allan o 1 pwynt}other{Allan o {points} pwynt}}", - "@outOfPoints": { - "description": "Description for an assignment grade that has points without a current scoroe", - "type": "text", - "placeholders_order": [ - "points", - "howMany" - ], - "placeholders": { - "points": {}, - "howMany": {} - } - }, - "Excused": "Wedi esgusodi", - "@Excused": { - "description": "Grading status for an assignment marked as excused", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Complete": "Cwblhau", - "@Complete": { - "description": "Grading status for an assignment marked as complete", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Incomplete": "Heb Gwblhau", - "@Incomplete": { - "description": "Grading status for an assignment marked as incomplete", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "minus": "minws", - "@minus": { - "description": "Screen reader-friendly replacement for the \"-\" character in letter grades like \"A-\"", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "latePenalty": "Cosb am fod yn hwyr (-{pointsLost})", - "@latePenalty": { - "description": "Text displayed when a late penalty has been applied to the assignment", - "type": "text", - "placeholders_order": [ - "pointsLost" - ], - "placeholders": { - "pointsLost": {} - } - }, - "finalGrade": "Gradd Derfynol: {grade}", - "@finalGrade": { - "description": "Text that displays the final grade of an assignment", - "type": "text", - "placeholders_order": [ - "grade" - ], - "placeholders": { - "grade": {} - } - }, - "Alert Settings": "Gosodiadau Hysbysu", - "@Alert Settings": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Alert me when…": "Rhowch wybod i mi pan...", - "@Alert me when…": { - "description": "Header for the screen where the observer chooses the thresholds that will determine when they receive alerts (e.g. when an assignment is graded below 70%)", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Course grade below": "Gradd y cwrs yn is na", - "@Course grade below": { - "description": "Label describing the threshold for when the course grade is below a certain percentage", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Course grade above": "Gradd y cwrs yn uwch na", - "@Course grade above": { - "description": "Label describing the threshold for when the course grade is above a certain percentage", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Assignment missing": "Aseiniad ar goll", - "@Assignment missing": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Assignment grade below": "Gradd yr aseiniad yn is na", - "@Assignment grade below": { - "description": "Label describing the threshold for when an assignment is graded below a certain percentage", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Assignment grade above": "Gradd yr aseiniad yn uwch na", - "@Assignment grade above": { - "description": "Label describing the threshold for when an assignment is graded above a certain percentage", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Course Announcements": "Cyhoeddiadau Cwrs", - "@Course Announcements": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Institution Announcements": "Cyhoeddiadau Sefydliadau", - "@Institution Announcements": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Never": "Byth", - "@Never": { - "description": "Indication that tells the user they will not receive alert notifications of a specific kind", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Grade percentage": "Canran gradd", - "@Grade percentage": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading your student's alerts.": "Gwall wrth lwytho hysbysiadau eich myfyriwr.", - "@There was an error loading your student's alerts.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Must be below 100": "Rhaid bod is na 100", - "@Must be below 100": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "mustBeBelowN": "Rhaid bod yn is na {percentage}", - "@mustBeBelowN": { - "description": "Validation error to the user that they must choose a percentage below 'n'", - "type": "text", - "placeholders_order": [ - "percentage" - ], - "placeholders": { - "percentage": { - "example": 5 - } - } - }, - "mustBeAboveN": "Rhaid bod yn uwch na {percentage}", - "@mustBeAboveN": { - "description": "Validation error to the user that they must choose a percentage above 'n'", - "type": "text", - "placeholders_order": [ - "percentage" - ], - "placeholders": { - "percentage": { - "example": 5 - } - } - }, - "Select Student Color": "Dewis Lliw Myfyriwr", - "@Select Student Color": { - "description": "Title for screen that allows users to assign a color to a specific student", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Electric, blue": "Trydan, Glas", - "@Electric, blue": { - "description": "Name of the Electric (blue) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Plum, Purple": "Eirinen, Porffor", - "@Plum, Purple": { - "description": "Name of the Plum (purple) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Barney, Fuschia": "Barney, Ffiwsia", - "@Barney, Fuschia": { - "description": "Name of the Barney (fuschia) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Raspberry, Red": "Mafonen, Coch", - "@Raspberry, Red": { - "description": "Name of the Raspberry (red) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Fire, Orange": "Tân, Oren", - "@Fire, Orange": { - "description": "Name of the Fire (orange) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Shamrock, Green": "Meillionen, Gwyrdd", - "@Shamrock, Green": { - "description": "Name of the Shamrock (green) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "An error occurred while saving your selection. Please try again.": "Gwall wrth gadw eich dewis. Rhowch gynnig arall arni.", - "@An error occurred while saving your selection. Please try again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "changeStudentColorLabel": "Newid lliw {studentName}", - "@changeStudentColorLabel": { - "description": "Accessibility label for the button that lets users change the color associated with a specific student", - "type": "text", - "placeholders_order": [ - "studentName" - ], - "placeholders": { - "studentName": {} - } - }, - "Teacher": "Athro", - "@Teacher": { - "description": "Label for the Teacher enrollment type", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Student": "Myfyriwr", - "@Student": { - "description": "Label for the Student enrollment type", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "TA": "Cynorthwyydd Dysgu", - "@TA": { - "description": "Label for the Teaching Assistant enrollment type (also known as Teacher Aid or Education Assistant), reduced to a short acronym/initialism if appropriate.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Observer": "Arsyllwr", - "@Observer": { - "description": "Label for the Observer enrollment type", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Use Camera": "Defnyddio Camera", - "@Use Camera": { - "description": "Label for the action item that lets the user capture a photo using the device camera", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Upload File": "Llwytho Ffeil i Fyny", - "@Upload File": { - "description": "Label for the action item that lets the user upload a file from their device", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Choose from Gallery": "Dewis o’r Oriel", - "@Choose from Gallery": { - "description": "Label for the action item that lets the user select a photo from their device gallery", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Preparing…": "Wrthi’n paratoi...", - "@Preparing…": { - "description": "Message shown while a file is being prepared to attach to a message", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Add student with…": "Ychwanegu myfyriwr gyda...", - "@Add student with…": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Add Student": "Ychwanegu Myfyriwr", - "@Add Student": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You are not observing any students.": "Dydych chi ddim yn arsyllu unrhyw fyfyrwyr.", - "@You are not observing any students.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading your students.": "Gwall wrth lwytho’ch myfyrwyr.", - "@There was an error loading your students.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Pairing Code": "Cod Paru", - "@Pairing Code": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Students can obtain a pairing code through the Canvas website": "Mae myfyrwyr yn gallu cael cod paru trwy wefan Canvas", - "@Students can obtain a pairing code through the Canvas website": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Enter the student pairing code provided to you. If the pairing code doesn't work, it may have expired": "Rhowch y cod paru myfyriwr a roddwyd i chi. Os nad yw’r cod paru yn gweithio, mae’n bosib ei fod wedi dod i ben", - "@Enter the student pairing code provided to you. If the pairing code doesn't work, it may have expired": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Your code is incorrect or expired.": "Mae eich cod yn anghywir neu mae wedi dod i ben.", - "@Your code is incorrect or expired.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Something went wrong trying to create your account, please reach out to your school for assistance.": "Aeth rhywbeth o’i le wrth geisio creu eich cyfrif, gofynnwch i’ch ysgol am gymorth.", - "@Something went wrong trying to create your account, please reach out to your school for assistance.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "QR Code": "Cod QR", - "@QR Code": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Students can create a QR code using the Canvas Student app on their mobile device": "Mae myfyrwyr yn gallu creu cod QR drwy ddefnyddio app Canvas Student ar eu dyfais symudol", - "@Students can create a QR code using the Canvas Student app on their mobile device": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Add new student": "Ychwanegu myfyriwr newydd", - "@Add new student": { - "description": "Semantics label for the FAB on the Manage Students Screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Select": "Dewiswch", - "@Select": { - "description": "Hint text to tell the user to choose one of two options", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I have a Canvas account": "Mae gen i gyfrif Canvas", - "@I have a Canvas account": { - "description": "Option to select for users that have a canvas account", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I don't have a Canvas account": "Does gen i ddim cyfrif Canvas", - "@I don't have a Canvas account": { - "description": "Option to select for users that don't have a canvas account", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Create Account": "Creu Cyfrif", - "@Create Account": { - "description": "Button text for account creation confirmation", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Full Name": "Enw Llawn", - "@Full Name": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Email Address": "Cyfeiriad E-bost", - "@Email Address": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Password": "Cyfrinair", - "@Password": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Full Name…": "Enw Llawn...", - "@Full Name…": { - "description": "hint label for inside form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Email…": "E-bost...", - "@Email…": { - "description": "hint label for inside form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Password…": "Cyfrinair...", - "@Password…": { - "description": "hint label for inside form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Please enter full name": "Rhowch enw llawn", - "@Please enter full name": { - "description": "Error message for form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Please enter an email address": "Rhowch gyfeiriad e-bost", - "@Please enter an email address": { - "description": "Error message for form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Please enter a valid email address": "Rhowch gyfeiriad e-bost dilys", - "@Please enter a valid email address": { - "description": "Error message for form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Password is required": "Rhaid rhoi cyfrinair", - "@Password is required": { - "description": "Error message for form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Password must contain at least 8 characters": "Rhaid i gyfrinair gynnwys o leiaf 8 nod", - "@Password must contain at least 8 characters": { - "description": "Error message for form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "qrCreateAccountTos": "Wrth daro ‘Creu Cyfrif’, rydych chi’n cytuno i’r {termsOfService} ac yn cydnabod y {privacyPolicy}", - "@qrCreateAccountTos": { - "description": "The text show on the account creation screen", - "type": "text", - "placeholders_order": [ - "termsOfService", - "privacyPolicy" - ], - "placeholders": { - "termsOfService": {}, - "privacyPolicy": {} - } - }, - "Terms of Service": "Telerau Gwasanaeth", - "@Terms of Service": { - "description": "Label for the Canvas Terms of Service agreement. This will be used in the qrCreateAccountTos text and will be highlighted and clickable", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Privacy Policy": "Polisi Preifatrwydd", - "@Privacy Policy": { - "description": "Label for the Canvas Privacy Policy agreement. This will be used in the qrCreateAccountTos text and will be highlighted and clickable", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "View the Privacy Policy": "Gweld y Polisi Preifatrwydd", - "@View the Privacy Policy": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Already have an account? ": "Oes gennych chi gyfrif yn barod? ", - "@Already have an account? ": { - "description": "Part of multiline text span, includes AccountSignIn1-2, in that order", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Sign In": "Mewngofnodi", - "@Sign In": { - "description": "Part of multiline text span, includes AccountSignIn1-2, in that order", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Hide Password": "Cuddio Cyfrinair", - "@Hide Password": { - "description": "content description for password hide button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Show Password": "Dangos Cyfrinair", - "@Show Password": { - "description": "content description for password show button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Terms of Service Link": "Dolen y Telerau Gwasanaeth", - "@Terms of Service Link": { - "description": "content description for terms of service link", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Privacy Policy Link": "Dolen y Polisi Preifatrwydd", - "@Privacy Policy Link": { - "description": "content description for privacy policy link", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Event": "Digwyddiad", - "@Event": { - "description": "Title for the event details screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Date": "Dyddiad", - "@Date": { - "description": "Label for the event date", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Location": "Lleoliad", - "@Location": { - "description": "Label for the location information", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Location Specified": "Dim Lleoliad wedi’i Nodi", - "@No Location Specified": { - "description": "Description for events that do not have a location", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "eventTime": "{startAt} - {endAt}", - "@eventTime": { - "description": "The time the event is happening, example: \"2:00 pm - 4:00 pm\"", - "type": "text", - "placeholders_order": [ - "startAt", - "endAt" - ], - "placeholders": { - "startAt": {}, - "endAt": {} - } - }, - "Set a date and time to be notified of this event.": "Gosod dyddiad ac amser i gael eich atgoffa am y digwyddiad hwn.", - "@Set a date and time to be notified of this event.": { - "description": "Description for row to set event reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You will be notified about this event on…": "Byddwch chi’n cael eich hysbysu am y digwyddiad hwn ar...", - "@You will be notified about this event on…": { - "description": "Description for when an event reminder is set", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Share Your Love for the App": "Rhowch eich barn am yr ap", - "@Share Your Love for the App": { - "description": "Label for option to open the app store", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Tell us about your favorite parts of the app": "Rhowch wybod i ni am eich hoff rannau o’r ap", - "@Tell us about your favorite parts of the app": { - "description": "Description for option to open the app store", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Legal": "Cyfreithiol", - "@Legal": { - "description": "Label for legal information option", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Privacy policy, terms of use, open source": "Polisi preifatrwydd, telerau defnyddio, ffynhonnell agored", - "@Privacy policy, terms of use, open source": { - "description": "Description for legal information option", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Idea for Canvas Parent App [Android]": "Syniad ar gyfer Ap Canvas Parent [Android]", - "@Idea for Canvas Parent App [Android]": { - "description": "The subject for the email to request a feature", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The following information will help us better understand your idea:": "Bydd y wybodaeth ganlynol yn ein helpu ni i ddeall eich syniad yn well:", - "@The following information will help us better understand your idea:": { - "description": "The header for the users information that is attached to a feature request", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Domain:": "Parth:", - "@Domain:": { - "description": "The label for the Canvas domain of the logged in user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "User ID:": "ID Defnyddiwr:", - "@User ID:": { - "description": "The label for the Canvas user ID of the logged in user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Email:": "E-bost:", - "@Email:": { - "description": "The label for the eamil of the logged in user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Locale:": "Lleoliad:", - "@Locale:": { - "description": "The label for the locale of the logged in user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Terms of Use": "Telerau Defnyddio", - "@Terms of Use": { - "description": "Label for the terms of use", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Canvas on GitHub": "Canvas ar GitHub", - "@Canvas on GitHub": { - "description": "Label for the button that opens the Canvas project on GitHub's website", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was a problem loading the Terms of Use": "Problem wrth lwytho’r Telerau Defnyddio", - "@There was a problem loading the Terms of Use": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Device": "Dyfais", - "@Device": { - "description": "Label used for device manufacturer/model in the error report", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "OS Version": "Fersiwn OS", - "@OS Version": { - "description": "Label used for device operating system version in the error report", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Version Number": "Rhif Fersiwn", - "@Version Number": { - "description": "Label used for the app version number in the error report", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Report A Problem": "Rhoi gwybod am broblem", - "@Report A Problem": { - "description": "Title used for generic dialog to report problems", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Subject": "Pwnc", - "@Subject": { - "description": "Label used for Subject text field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "A subject is required.": "Rhaid rhoi pwnc.", - "@A subject is required.": { - "description": "Error shown when the subject field is empty", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "An email address is required.": "Rhaid rhoi cyfeiriad e-bost.", - "@An email address is required.": { - "description": "Error shown when the email field is empty", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Description": "Disgrifiad", - "@Description": { - "description": "Label used for Description text field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "A description is required.": "Rhaid rhoi disgrifiad.", - "@A description is required.": { - "description": "Error shown when the description field is empty", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "How is this affecting you?": "Sut mae hyn yn effeithio arnoch chi?", - "@How is this affecting you?": { - "description": "Label used for the dropdown to select how severe the issue is", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "send": "anfon", - "@send": { - "description": "Label used for send button when reporting a problem", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Just a casual question, comment, idea, suggestion…": "Dim ond awgrym, syniad, sylw neu gwestiwn anffurfiol...", - "@Just a casual question, comment, idea, suggestion…": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I need some help but it's not urgent.": "Mae angen help arna i, ond dydy’r mater ddim yn un brys.", - "@I need some help but it's not urgent.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Something's broken but I can work around it to get what I need done.": "Mae rhywbeth wedi mynd o’i le, ond fe alla i ddal i wneud yr hyn rydw i angen ei wneud.", - "@Something's broken but I can work around it to get what I need done.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I can't get things done until I hear back from you.": "Alla i ddim bwrw ymlaen nes bydda i wedi cael ateb gennych chi.", - "@I can't get things done until I hear back from you.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "EXTREME CRITICAL EMERGENCY!!": "ARGYFWNG - DIFRIFOL IAWN!!", - "@EXTREME CRITICAL EMERGENCY!!": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Not Graded": "Heb eu graddio", - "@Not Graded": { - "description": "Description for an assignment has not been graded.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Login flow: Normal": "Llif Mewngofnodi: Arferol", - "@Login flow: Normal": { - "description": "Description for the normal login flow", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Login flow: Canvas": "Llif Mewngofnodi: Canvas", - "@Login flow: Canvas": { - "description": "Description for the Canvas login flow", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Login flow: Site Admin": "Llif Mewngofnodi: Gweinyddwr Safle", - "@Login flow: Site Admin": { - "description": "Description for the Site Admin login flow", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Login flow: Skip mobile verify": "Llif Mewngofnodi: Anwybyddu cadarnhau symudol", - "@Login flow: Skip mobile verify": { - "description": "Description for the login flow that skips domain verification for mobile", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Act As User": "Gweithredu fel Defnyddiwr", - "@Act As User": { - "description": "Label for the button that allows the user to act (masquerade) as another user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Stop Acting as User": "Stopio Gweithredu fel Defnyddiwr", - "@Stop Acting as User": { - "description": "Label for the button that allows the user to stop acting (masquerading) as another user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "actingAsUser": "Rydych chi’n gweithredu fel {userName}", - "@actingAsUser": { - "description": "Message shown while acting (masquerading) as another user", - "type": "text", - "placeholders_order": [ - "userName" - ], - "placeholders": { - "userName": {} - } - }, - "\"Act as\" is essentially logging in as this user without a password. You will be able to take any action as if you were this user, and from other users' points of views, it will be as if this user performed them. However, audit logs record that you were the one who performed the actions on behalf of this user.": "Bydd \"Gweithredu fel\" yn golygu eich bod yn mewngofnodi fel y defnyddiwr hwn heb gyfrinair. Byddwch chi’n gallu gwneud unrhyw beth fel petai chi yw’r defnyddiwr hwn. O safbwynt defnyddwyr eraill, bydd yn edrych fel mai’r defnyddiwr hwn sydd wedi gwneud hynny. Ond, bydd logiau archwilio’n cofnodi mai chi wnaeth hynny ar ran y defnyddiwr hwn.", - "@\"Act as\" is essentially logging in as this user without a password. You will be able to take any action as if you were this user, and from other users' points of views, it will be as if this user performed them. However, audit logs record that you were the one who performed the actions on behalf of this user.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Domain": "Parth", - "@Domain": { - "description": "Text field hint for domain url input", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You must enter a valid domain": "Mae’n rhaid i chi roi parth dilys", - "@You must enter a valid domain": { - "description": "Message displayed for domain input error", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "User ID": "ID Defnyddiwr", - "@User ID": { - "description": "Text field hint for user ID input", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You must enter a user id": "Mae’n rhaid i chi roi ID defnyddiwr", - "@You must enter a user id": { - "description": "Message displayed for user Id input error", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error trying to act as this user. Please check the Domain and User ID and try again.": "Gwall wrth geisio gweithredu fel y defnyddiwr hwn. Gwnewch yn sîwr bod y Parth a’r ID Defnyddiwr yn iawn a rhoi cynnig arall arni.", - "@There was an error trying to act as this user. Please check the Domain and User ID and try again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "endMasqueradeMessage": "Byddwch chi’n stopio gweithredu fel {userName} ac yn dychwelyd i’ch cyfrif gwreiddiol.", - "@endMasqueradeMessage": { - "description": "Confirmation message displayed when the user wants to stop acting (masquerading) as another user", - "type": "text", - "placeholders_order": [ - "userName" - ], - "placeholders": { - "userName": {} - } - }, - "endMasqueradeLogoutMessage": "Byddwch chi’n stopio gweithredu fel {userName} ac yn cael eich allgofnodi.", - "@endMasqueradeLogoutMessage": { - "description": "Confirmation message displayed when the user wants to stop acting (masquerading) as another user and will be logged out.", - "type": "text", - "placeholders_order": [ - "userName" - ], - "placeholders": { - "userName": {} - } - }, - "How are we doing?": "Sut hwyl rydyn ni’n ei gael arni?", - "@How are we doing?": { - "description": "Title for dialog asking user to rate the app out of 5 stars.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Don't show again": "Peidio â dangos eto", - "@Don't show again": { - "description": "Button to prevent the rating dialog from showing again.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "What can we do better?": "Beth fydden ni’n gallu ei wneud yn well?", - "@What can we do better?": { - "description": "Hint text for providing a comment with the rating.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Send Feedback": "Anfon Adborth", - "@Send Feedback": { - "description": "Button to send rating with feedback", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "ratingDialogEmailSubject": "Awgrymiadau i Android - Canvas Parent {version}", - "@ratingDialogEmailSubject": { - "description": "The subject for an email to provide feedback for CanvasParent.", - "type": "text", - "placeholders_order": [ - "version" - ], - "placeholders": { - "version": {} - } - }, - "starRating": "{position,plural, =1{{position} seren}other{{position} seren}}", - "@starRating": { - "description": "Accessibility label for the 1 stars to 5 stars rating", - "type": "text", - "placeholders_order": [ - "position" - ], - "placeholders": { - "position": { - "example": 1 - } - } - }, - "Student Pairing": "Paru Myfyrwyr", - "@Student Pairing": { - "description": "Title for the screen where users can pair to students using a QR code", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Open Canvas Student": "Agor Canvas Student", - "@Open Canvas Student": { - "description": "Title for QR pairing tutorial screen instructing users to open the Canvas Student app", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You'll need to open your student's Canvas Student app to continue. Go into Main Menu > Settings > Pair with Observer and scan the QR code you see there.": "Bydd angen i chi agor app Canvas Student eich myfyriwr i barhau. Ewch i'r Brif Ddewislen > Gosodiadau > Paru ag Arsyllwr a sganiwch y cod QR rydych chi’n ei weld yno.", - "@You'll need to open your student's Canvas Student app to continue. Go into Main Menu > Settings > Pair with Observer and scan the QR code you see there.": { - "description": "Message explaining how QR code pairing works", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Screenshot showing location of pairing QR code generation in the Canvas Student app": "Ciplun yn dangos y lleoliad creu cod QR paru yn ap Canvas Student", - "@Screenshot showing location of pairing QR code generation in the Canvas Student app": { - "description": "Content Description for qr pairing tutorial screenshot", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Expired QR Code": "Cod QR wedi dod i ben", - "@Expired QR Code": { - "description": "Error title shown when the users scans a QR code that has expired", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The QR code you scanned may have expired. Refresh the code on the student's device and try again.": "Efallai fod y cod QR y gwnaethoch chi ei sganio wedi dod i ben. Adnewyddwch y cod ar ddyfais y myfyriwr a rhowch gynnig arall arni.", - "@The QR code you scanned may have expired. Refresh the code on the student's device and try again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "A network error occurred when adding this student. Check your connection and try again.": "Gwall ar y rhwydwaith wrth ychwanegu'r myfyriwr hwn. Gwiriwch eich cysylltiad a rhowch gynnig arall arni.", - "@A network error occurred when adding this student. Check your connection and try again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Invalid QR Code": "Cod QR Annilys", - "@Invalid QR Code": { - "description": "Error title shown when the user scans an invalid QR code", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Incorrect Domain": "Parth Anghywir", - "@Incorrect Domain": { - "description": "Error title shown when the users scane a QR code for a student that belongs to a different domain", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The student you are trying to add belongs to a different school. Log in or create an account with that school to scan this code.": "Mae’r myfyriwr rydych chi’n ceisio ei ychwanegu’n perthyn i ysgol arall. Rhaid i chi fewngofnodi neu greu cyfrif gyda’r ysgol honno i sganio’r cod hwn.", - "@The student you are trying to add belongs to a different school. Log in or create an account with that school to scan this code.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Camera Permission": "Hawl Camera", - "@Camera Permission": { - "description": "Error title shown when the user wans to scan a QR code but has denied the camera permission", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "This will unpair and remove all enrollments for this student from your account.": "Bydd hyn yn dadbaru ac yn tynnu’r holl ymrestriadau ar gyfer y myfyriwr hwn o’ch cyfrif.", - "@This will unpair and remove all enrollments for this student from your account.": { - "description": "Confirmation message shown when the user tries to delete a student from their account", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was a problem removing this student from your account. Please check your connection and try again.": "Roedd problem wrth dynnu’r myfyriwr hwn o’ch cyfrif. Gwiriwch eich cysylltiad a rhowch gynnig arall arni.", - "@There was a problem removing this student from your account. Please check your connection and try again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Cancel": "Canslo", - "@Cancel": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "next": "Nesaf", - "@next": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "ok": "Iawn", - "@ok": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Yes": "Iawn", - "@Yes": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No": "Na", - "@No": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Retry": "Ailgynnig", - "@Retry": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Delete": "Dileu", - "@Delete": { - "description": "Label used for general delete/remove actions", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Done": "Wedi gorffen", - "@Done": { - "description": "Label for general done/finished actions", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Refresh": "Adnewyddu", - "@Refresh": { - "description": "Label for button to refresh data from the web", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "View Description": "Gweld Disgrifiad", - "@View Description": { - "description": "Button to view the description for an event or assignment", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "expanded": "wedi ehangu", - "@expanded": { - "description": "Description for the accessibility reader for list groups that are expanded", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "collapsed": "wedi crebachu", - "@collapsed": { - "description": "Description for the accessibility reader for list groups that are expanded", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "An unexpected error occurred": "Gwall annisgwyl", - "@An unexpected error occurred": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No description": "Dim disgrifiad", - "@No description": { - "description": "Message used when the assignment has no description", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Launch External Tool": "Lansio Adnodd Allanol", - "@Launch External Tool": { - "description": "Button text added to webviews to let users open external tools in their browser", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Interactions on this page are limited by your institution.": "Mae achosion o ryngweithio ar y dudalen hon wedi’u cyfyngu gan eich sefydliad.", - "@Interactions on this page are limited by your institution.": { - "description": "Message describing how the webview has limited access due to an instution setting", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "dateAtTime": "{date} at {time}", - "@dateAtTime": { - "description": "The string to format dates", - "type": "text", - "placeholders_order": [ - "date", - "time" - ], - "placeholders": { - "date": {}, - "time": {} - } - }, - "dueDateAtTime": "Erbyn {date} am {time}", - "@dueDateAtTime": { - "description": "The string to format due dates", - "type": "text", - "placeholders_order": [ - "date", - "time" - ], - "placeholders": { - "date": {}, - "time": {} - } - }, - "No Due Date": "Dim Dyddiad Erbyn", - "@No Due Date": { - "description": "Label for assignments that do not have a due date", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Filter": "Hidlo", - "@Filter": { - "description": "Label for buttons to filter what items are visible", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "unread": "heb eu darllen", - "@unread": { - "description": "Label for things that are marked as unread", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "unreadCount": "{count} heb eu darllen", - "@unreadCount": { - "description": "Formatted string for when there are a number of unread items", - "type": "text", - "placeholders_order": [ - "count" - ], - "placeholders": { - "count": {} - } - }, - "badgeNumberPlus": "{count}+", - "@badgeNumberPlus": { - "description": "Formatted string for when too many items are being notified in a badge, generally something like: 99+", - "type": "text", - "placeholders_order": [ - "count" - ], - "placeholders": { - "count": {} - } - }, - "There was an error loading this announcement": "Gwall wrth lwytho'r cyhoeddiad hwn", - "@There was an error loading this announcement": { - "description": "Message shown when an announcement detail screen fails to load", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Network error": "Gwall ar y rhwydwaith", - "@Network error": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Under Construction": "Wrthi’n cael ei greu", - "@Under Construction": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "We are currently building this feature for your viewing pleasure.": "Rydyn ni’n adeiladu’r nodwedd hon ar hyn o bryd er mwyn i chi allu gweld.", - "@We are currently building this feature for your viewing pleasure.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Request Login Help Button": "Botwm Gofyn am Help i Fewngofnodi", - "@Request Login Help Button": { - "description": "Accessibility hint for button that opens help dialog for a login help request", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Request Login Help": "Gofyn am Help i Fewngofnodi", - "@Request Login Help": { - "description": "Title of help dialog for a login help request", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I'm having trouble logging in": "Rwy’n cael trafferth yn mewngofnodi", - "@I'm having trouble logging in": { - "description": "Subject of help dialog for a login help request", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "An error occurred when trying to display this link": "Gwall wrth geisio dangos y ddolen hon", - "@An error occurred when trying to display this link": { - "description": "Error message shown when a link can't be opened", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "We are unable to display this link, it may belong to an institution you currently aren't logged in to.": "Does dim modd i ni ddangos y ddolen hon, efallai ei bod hi’n perthyn i sefydliad nad ydych chi wedi mewngofnodi iddo ar hyn o bryd.", - "@We are unable to display this link, it may belong to an institution you currently aren't logged in to.": { - "description": "Description for error page shown when clicking a link", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Link Error": "Gwall Dolen", - "@Link Error": { - "description": "Title for error page shown when clicking a link", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Open In Browser": "Agor mewn Porwr", - "@Open In Browser": { - "description": "Text for button to open a link in the browswer", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You'll find the QR code on the web in your account profile. Click 'QR for Mobile Login' in the list.": "Fe ddewch chi o hyd i’r cod QR ar y we yn eich proffil cyfrif. Cliciwch 'QR ar gyfer Mewngofnodi Symudol' yn y rhestr.", - "@You'll find the QR code on the web in your account profile. Click 'QR for Mobile Login' in the list.": { - "description": "Text for qr login tutorial screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Locate QR Code": "Dod o hyd i God QR", - "@Locate QR Code": { - "description": "Text for qr login button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Please scan a QR code generated by Canvas": "Sganiwch god QR sydd wedi cael ei greu gan Canvas.", - "@Please scan a QR code generated by Canvas": { - "description": "Text for qr login error with incorrect qr code", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error logging in. Please generate another QR Code and try again.": "Gwall wrth fewngofnodi. Crëwch God QR arall a rhoi cynnig arall arni.", - "@There was an error logging in. Please generate another QR Code and try again.": { - "description": "Text for qr login error", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Screenshot showing location of QR code generation in browser": "Ciplun yn dangos y lleoliad creu cod QR yn y porwr.", - "@Screenshot showing location of QR code generation in browser": { - "description": "Content Description for qr login tutorial screenshot", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "QR scanning requires camera access": "Mae sganio QR angen mynediad at eich camera", - "@QR scanning requires camera access": { - "description": "placeholder for camera error for QR code scan", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The linked item is no longer available": "Dydy'r eitem â gysylltwyd ddim ar gael mwyach", - "@The linked item is no longer available": { - "description": "error message when the alert could no be opened", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Message sent": "Neges wedi’i anfon", - "@Message sent": { - "description": "confirmation message on the screen when the user succesfully sends a message", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Acceptable Use Policy": "Polisi Defnydd Derbyniol", - "@Acceptable Use Policy": { - "description": "title for the acceptable use policy screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Submit": "Cyflwyno", - "@Submit": { - "description": "submit button title for acceptable use policy screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Either you're a new user or the Acceptable Use Policy has changed since you last agreed to it. Please agree to the Acceptable Use Policy before you continue.": "Naill ai rydych chi’n ddefnyddiwr newydd, neu mae’r Polisi Defnydd Derbyniol wedi newid ers i chi gytuno i’r Polisi ddiwethaf. Mae angen i chi gytuno i’r Polisi Defnydd Derbyniol cyn bwrw ymlaen.", - "@Either you're a new user or the Acceptable Use Policy has changed since you last agreed to it. Please agree to the Acceptable Use Policy before you continue.": { - "description": "acceptable use policy screen description", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I agree to the Acceptable Use Policy.": "Mae’n rhaid i chi gytuno i’r Polisi Defnydd Derbyniol", - "@I agree to the Acceptable Use Policy.": { - "description": "acceptable use policy switch title", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "About": "Ynghylch", - "@About": { - "description": "Title for about menu item in settings", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "App": "Ap", - "@App": { - "description": "Title for App field on about page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Login ID": "ID Mewngofnodi", - "@Login ID": { - "description": "Title for Login ID field on about page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Email": "E-bost", - "@Email": { - "description": "Title for Email field on about page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Version": "Fersiwn", - "@Version": { - "description": "Title for Version field on about page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Instructure logo": "Logo Instructure", - "@Instructure logo": { - "description": "Semantics label for the Instructure logo on the about page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - } -} \ No newline at end of file diff --git a/apps/flutter_parent/lib/l10n/res/intl_da.arb b/apps/flutter_parent/lib/l10n/res/intl_da.arb deleted file mode 100644 index e1b63cd05d..0000000000 --- a/apps/flutter_parent/lib/l10n/res/intl_da.arb +++ /dev/null @@ -1,2753 +0,0 @@ -{ - "@@last_modified": "2023-08-25T11:04:20.901151", - "alertsLabel": "Varslinger", - "@alertsLabel": { - "description": "The label for the Alerts tab", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "calendarLabel": "Kalender", - "@calendarLabel": { - "description": "The label for the Calendar tab", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "coursesLabel": "Fag", - "@coursesLabel": { - "description": "The label for the Courses tab", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Students": "Ingen studerende", - "@No Students": { - "description": "Text for when an observer has no students they are observing", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Tap to show student selector": "Tryk for at vise vælger for studerende", - "@Tap to show student selector": { - "description": "Semantics label for the area that will show the student selector when tapped", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Tap to pair with a new student": "Tryk for at parre med en ny studerende", - "@Tap to pair with a new student": { - "description": "Semantics label for the add student button in the student selector", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Tap to select this student": "Tryk for at vælge denne studerende", - "@Tap to select this student": { - "description": "Semantics label on individual students in the student switcher", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Manage Students": "Administrer studerende", - "@Manage Students": { - "description": "Label text for the Manage Students nav drawer button as well as the title for the Manage Students screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Help": "Hjælp", - "@Help": { - "description": "Label text for the help nav drawer button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Log Out": "Log ud", - "@Log Out": { - "description": "Label text for the Log Out nav drawer button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Switch Users": "Skift brugere", - "@Switch Users": { - "description": "Label text for the Switch Users nav drawer button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "appVersion": "v. {version}", - "@appVersion": { - "description": "App version shown in the navigation drawer", - "type": "text", - "placeholders_order": [ - "version" - ], - "placeholders": { - "version": {} - } - }, - "Are you sure you want to log out?": "Er du sikker på, du vil logge af?", - "@Are you sure you want to log out?": { - "description": "Confirmation message displayed when the user tries to log out", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Calendars": "Kalendere", - "@Calendars": { - "description": "Label for button that lets users select which calendars to display", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "nextMonth": "Næste måned: {month}", - "@nextMonth": { - "description": "Label for the button that switches the calendar to the next month", - "type": "text", - "placeholders_order": [ - "month" - ], - "placeholders": { - "month": {} - } - }, - "previousMonth": "Forrige måned: {month}", - "@previousMonth": { - "description": "Label for the button that switches the calendar to the previous month", - "type": "text", - "placeholders_order": [ - "month" - ], - "placeholders": { - "month": {} - } - }, - "nextWeek": "Næste uge, der starter {date}", - "@nextWeek": { - "description": "Label for the button that switches the calendar to the next week", - "type": "text", - "placeholders_order": [ - "date" - ], - "placeholders": { - "date": {} - } - }, - "previousWeek": "Forrige uge, der starter {date}", - "@previousWeek": { - "description": "Label for the button that switches the calendar to the previous week", - "type": "text", - "placeholders_order": [ - "date" - ], - "placeholders": { - "date": {} - } - }, - "selectedMonthLabel": "Måneden {month}", - "@selectedMonthLabel": { - "description": "Accessibility label for the button that expands/collapses the month view", - "type": "text", - "placeholders_order": [ - "month" - ], - "placeholders": { - "month": {} - } - }, - "expand": "udvid", - "@expand": { - "description": "Accessibility label for the on-tap hint for the button that expands/collapses the month view", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "collapse": "skjul", - "@collapse": { - "description": "Accessibility label for the on-tap hint for the button that expands/collapses the month view", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "pointsPossible": "{points} mulige point", - "@pointsPossible": { - "description": "Screen reader label used for the points possible for an assignment, quiz, etc.", - "type": "text", - "placeholders_order": [ - "points" - ], - "placeholders": { - "points": {} - } - }, - "calendarDaySemanticsLabel": "{eventCount,plural, =1{{date}, {eventCount} begivenhed}other{{date}, {eventCount} begivenheder}}", - "@calendarDaySemanticsLabel": { - "description": "Screen reader label used for calendar day, reads the date and count of events", - "type": "text", - "placeholders_order": [ - "date", - "eventCount" - ], - "placeholders": { - "date": {}, - "eventCount": {} - } - }, - "No Events Today!": "Ingen begivenheder i dag!", - "@No Events Today!": { - "description": "Title displayed when there are no calendar events for the current day", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "It looks like a great day to rest, relax, and recharge.": "Det er en alle tiders dag til at tage den med ro og slappe af.", - "@It looks like a great day to rest, relax, and recharge.": { - "description": "Message displayed when there are no calendar events for the current day", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading your student's calendar": "Der opstod en fejl under indlæsning af den studerendes kalender", - "@There was an error loading your student's calendar": { - "description": "Message displayed when calendar events could not be loaded for the current student", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Tap to favorite the courses you want to see on the Calendar. Select up to 10.": "Tryk for at få vist dine favoritfag i kalenderen. Vælg op til 10.", - "@Tap to favorite the courses you want to see on the Calendar. Select up to 10.": { - "description": "Description text on calendar filter screen.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You may only choose 10 calendars to display": "Du kan kun vælge at vise 10 kalendere", - "@You may only choose 10 calendars to display": { - "description": "Error text when trying to select more than 10 calendars", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You must select at least one calendar to display": "Du skal vælge mindst en kalender at vise", - "@You must select at least one calendar to display": { - "description": "Error text when trying to de-select all calendars", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Planner Note": "Planlægger-bemærkning", - "@Planner Note": { - "description": "Label used for notes in the planner", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Go to today": "Gå til I dag", - "@Go to today": { - "description": "Accessibility label used for the today button in the planner", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Previous Logins": "Tidligere logins", - "@Previous Logins": { - "description": "Label for the list of previous user logins", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "canvasLogoLabel": "Canvas-logo", - "@canvasLogoLabel": { - "description": "The semantics label for the Canvas logo", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "findSchool": "Find skole", - "@findSchool": { - "description": "Text for the find-my-school button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "findAnotherSchool": "Find en anden skole", - "@findAnotherSchool": { - "description": "Text for the find-another-school button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "domainSearchInputHint": "Indtast skolens navn eller distrikt ...", - "@domainSearchInputHint": { - "description": "Input hint for the text box on the domain search screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "noDomainResults": "Kan ikke finde skoler, der matcher \"{query}\"", - "@noDomainResults": { - "description": "Message shown to users when the domain search query did not return any results", - "type": "text", - "placeholders_order": [ - "query" - ], - "placeholders": { - "query": {} - } - }, - "domainSearchHelpLabel": "Hvordan finder jeg min skole eller distrikt?", - "@domainSearchHelpLabel": { - "description": "Label for the help button on the domain search screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "canvasGuides": "Canvas-vejledningerne", - "@canvasGuides": { - "description": "Proper name for the Canvas Guides. This will be used in the domainSearchHelpBody text and will be highlighted and clickable", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "canvasSupport": "Canvas-support", - "@canvasSupport": { - "description": "Proper name for Canvas Support. This will be used in the domainSearchHelpBody text and will be highlighted and clickable", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "domainSearchHelpBody": "Prøv at søge efter navnet på den skole eller det distrikt, du forsøger at få adgang til, fx “Smith Private School” eller “Smith County Schools.” Du kan også indtaste et Canvas-domæne direkte, som fx “smith.instructure.com.”\n\nFor mere information om hvordan du finder din institutions Canvas-konto, kan du besøge {canvasGuides}, kontakte {canvasSupport} eller kontakte din skole for at få hjælp.", - "@domainSearchHelpBody": { - "description": "The body text shown in the help dialog on the domain search screen", - "type": "text", - "placeholders_order": [ - "canvasGuides", - "canvasSupport" - ], - "placeholders": { - "canvasGuides": {}, - "canvasSupport": {} - } - }, - "Uh oh!": "Åh ååh!", - "@Uh oh!": { - "description": "Title of the screen that shows when a crash has occurred", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "We’re not sure what happened, but it wasn’t good. Contact us if this keeps happening.": "Vi ved ikke helt, hvad der skete, men det var ikke godt. Kontakt os, hvis dette fortsætter.", - "@We’re not sure what happened, but it wasn’t good. Contact us if this keeps happening.": { - "description": "Message shown when a crash has occurred", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Contact Support": "Kontakt support", - "@Contact Support": { - "description": "Label for the button that allows users to contact support after a crash has occurred", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "View error details": "Vis fejldetaljer", - "@View error details": { - "description": "Label for the button that allowed users to view crash details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Restart app": "Genstart app", - "@Restart app": { - "description": "Label for the button that will restart the entire application", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Application version": "App-version", - "@Application version": { - "description": "Label for the application version displayed in the crash details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Device model": "Enhedsmodel", - "@Device model": { - "description": "Label for the device model displayed in the crash details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Android OS version": "Android OS-version", - "@Android OS version": { - "description": "Label for the Android operating system version displayed in the crash details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Full error message": "Hel fejlmeddelelse", - "@Full error message": { - "description": "Label for the full error message displayed in the crash details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Inbox": "Indbakke", - "@Inbox": { - "description": "Title for the Inbox screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading your inbox messages.": "Der opstod en fejl under indlæsning af beskederne i indbakken.", - "@There was an error loading your inbox messages.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Subject": "Intet emne", - "@No Subject": { - "description": "Title used for inbox messages that have no subject", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unable to fetch courses. Please check your connection and try again.": "Kan ikke hente fag. Kontrollér forbindelsen, og prøv igen.", - "@Unable to fetch courses. Please check your connection and try again.": { - "description": "Message shown when an error occured while loading courses", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Choose a course to message": "Vælg et fag at sende en meddelelse til", - "@Choose a course to message": { - "description": "Header in the course list shown when the user is choosing which course to associate with a new message", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Inbox Zero": "Indbakke nul", - "@Inbox Zero": { - "description": "Title of the message shown when there are no inbox messages", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You’re all caught up!": "Du har set det hele!", - "@You’re all caught up!": { - "description": "Subtitle of the message shown when there are no inbox messages", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading recipients for this course": "Der opstod en fejl under indlæsning af modtagere for dette fag", - "@There was an error loading recipients for this course": { - "description": "Message shown when attempting to create a new message but the recipients list failed to load", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unable to send message. Check your connection and try again.": "Kan ikke sende besked. Kontrollér forbindelsen, og prøv igen.", - "@Unable to send message. Check your connection and try again.": { - "description": "Message show when there was an error creating or sending a new message", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unsaved changes": "Ikke-gemte ændringer", - "@Unsaved changes": { - "description": "Title of the dialog shown when the user tries to leave with unsaved changes", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Are you sure you wish to close this page? Your unsent message will be lost.": "Er du sikker på, at du vil lukke denne side? Din usendte besked vil gå tabt.", - "@Are you sure you wish to close this page? Your unsent message will be lost.": { - "description": "Body text of the dialog shown when the user tries leave with unsaved changes", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "New message": "Ny besked", - "@New message": { - "description": "Title of the new-message screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Add attachment": "Tilføj vedhæftet fil", - "@Add attachment": { - "description": "Tooltip for the add-attachment button in the new-message screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Send message": "Send besked", - "@Send message": { - "description": "Tooltip for the send-message button in the new-message screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Select recipients": "Vælg modtagere", - "@Select recipients": { - "description": "Tooltip for the button that allows users to select message recipients", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No recipients selected": "Ingen modtagere valgt", - "@No recipients selected": { - "description": "Hint displayed when the user has not selected any message recipients", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Message subject": "Beskedens emne", - "@Message subject": { - "description": "Hint text displayed in the input field for the message subject", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Message": "Besked", - "@Message": { - "description": "Hint text displayed in the input field for the message body", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Recipients": "Modtagere", - "@Recipients": { - "description": "Label for message recipients", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "plusRecipientCount": "+{count}", - "@plusRecipientCount": { - "description": "Shows the number of recipients that are selected but not displayed on screen.", - "type": "text", - "placeholders_order": [ - "count" - ], - "placeholders": { - "count": { - "example": 5 - } - } - }, - "Failed. Tap for options.": "Mislykkedes. Tryk for indstillinger.", - "@Failed. Tap for options.": { - "description": "Short message shown on a message attachment when uploading has failed", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "courseForWhom": "for {studentShortName}", - "@courseForWhom": { - "description": "Describes for whom a course is for (i.e. for Bill)", - "type": "text", - "placeholders_order": [ - "studentShortName" - ], - "placeholders": { - "studentShortName": {} - } - }, - "messageLinkPostscript": "Vedrørende: {studentName}, {linkUrl}", - "@messageLinkPostscript": { - "description": "A postscript appended to new messages that clarifies which student is the subject of the message and also includes a URL for the related Canvas component (course, assignment, event, etc).", - "type": "text", - "placeholders_order": [ - "studentName", - "linkUrl" - ], - "placeholders": { - "studentName": {}, - "linkUrl": {} - } - }, - "There was an error loading this conversation": "Der opstod en fejl under indlæsning af denne diskussion", - "@There was an error loading this conversation": { - "description": "Message shown when a conversation fails to load", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Reply": "Svar", - "@Reply": { - "description": "Button label for replying to a conversation", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Reply All": "Svar til alle", - "@Reply All": { - "description": "Button label for replying to all conversation participants", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unknown User": "Ukendt bruger", - "@Unknown User": { - "description": "Label used where the user name is not known", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "me": "mig", - "@me": { - "description": "First-person pronoun (i.e. 'me') that will be used in message author info, e.g. 'Me to 4 others' or 'Jon Snow to me'", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "authorToRecipient": "{authorName} til {recipientName}", - "@authorToRecipient": { - "description": "Author info for a single-recipient message; includes both the author name and the recipient name.", - "type": "text", - "placeholders_order": [ - "authorName", - "recipientName" - ], - "placeholders": { - "authorName": {}, - "recipientName": {} - } - }, - "authorToNOthers": "{howMany,plural, =1{{authorName} til 1 anden}other{{authorName} til {howMany} andre}}", - "@authorToNOthers": { - "description": "Author info for a mutli-recipient message; includes the author name and the number of recipients", - "type": "text", - "placeholders_order": [ - "authorName", - "howMany" - ], - "placeholders": { - "authorName": {}, - "howMany": {} - } - }, - "authorToRecipientAndNOthers": "{howMany,plural, =1{{authorName} til {recipientName} & 1 anden}other{{authorName} til {recipientName} & {howMany} andre}}", - "@authorToRecipientAndNOthers": { - "description": "Author info for a multi-recipient message; includes the author name, one recipient name, and the number of other recipients", - "type": "text", - "placeholders_order": [ - "authorName", - "recipientName", - "howMany" - ], - "placeholders": { - "authorName": {}, - "recipientName": {}, - "howMany": {} - } - }, - "Download": "Download", - "@Download": { - "description": "Label for the button that will begin downloading a file", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Open with another app": "Åbn med en anden app", - "@Open with another app": { - "description": "Label for the button that will allow users to open a file with another app", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There are no installed applications that can open this file": "Der er ingen installerede applikationer, der kan åbne denne fil", - "@There are no installed applications that can open this file": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unsupported File": "Ikke-understøttet fil", - "@Unsupported File": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "This file is unsupported and can’t be viewed through the app": "Denne fil understøttes ikke og kan ikke vises i appen", - "@This file is unsupported and can’t be viewed through the app": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unable to play this media file": "Denne mediefil kunne ikke afspilles", - "@Unable to play this media file": { - "description": "Message shown when audio or video media could not be played", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unable to load this image": "Kan ikke indlæse dette billede", - "@Unable to load this image": { - "description": "Message shown when an image file could not be loaded or displayed", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading this file": "Der opstod en fejl ved indlæsning af denne fil", - "@There was an error loading this file": { - "description": "Message shown when a file could not be loaded or displayed", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Courses": "Ingen kurser", - "@No Courses": { - "description": "Title for having no courses", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Your student’s courses might not be published yet.": "Din studerendes fag kan muligvis ikke offentliggøres endnu.", - "@Your student’s courses might not be published yet.": { - "description": "Message for having no courses", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading your student’s courses.": "Der opstod en fejl under indlæsning af din studerendes fag.", - "@There was an error loading your student’s courses.": { - "description": "Message displayed when the list of student courses could not be loaded", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Grade": "Ingen karakter", - "@No Grade": { - "description": "Message shown when there is currently no grade available for a course", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Filter by": "Filtrer efter", - "@Filter by": { - "description": "Title for list of terms to filter grades by", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Grades": "Karakterer", - "@Grades": { - "description": "Label for the \"Grades\" tab in course details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Syllabus": "Læseplan", - "@Syllabus": { - "description": "Label for the \"Syllabus\" tab in course details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Front Page": "Forside", - "@Front Page": { - "description": "Label for the \"Front Page\" tab in course details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Summary": "Sammendrag", - "@Summary": { - "description": "Label for the \"Summary\" tab in course details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Send a message about this course": "Send en besked om dette fag", - "@Send a message about this course": { - "description": "Accessibility hint for the course messaage floating action button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Total Grade": "Total karakter", - "@Total Grade": { - "description": "Label for the total grade in the course", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Graded": "Bedømt", - "@Graded": { - "description": "Label for assignments that have been graded", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Submitted": "Afleveret", - "@Submitted": { - "description": "Label for assignments that have been submitted", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Not Submitted": "Ikke indsendt", - "@Not Submitted": { - "description": "Label for assignments that have not been submitted", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Late": "Sen", - "@Late": { - "description": "Label for assignments that have been marked late or submitted late", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Missing": "Mangler", - "@Missing": { - "description": "Label for assignments that have been marked missing or are not submitted and past the due date", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "-": "-", - "@-": { - "description": "Value representing no score for student submission", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "All Grading Periods": "Alle karakterperioder", - "@All Grading Periods": { - "description": "Label for selecting all grading periods", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Assignments": "Ingen opgaver", - "@No Assignments": { - "description": "Title for the no assignments message", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "It looks like assignments haven't been created in this space yet.": "Det ser ud til, at opgaver ikke er blevet oprettet i dette rum endnu.", - "@It looks like assignments haven't been created in this space yet.": { - "description": "Message for no assignments", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading the summary details for this course.": "Der opstod en fejl ved indlæsning af sammendragsoplysningerne for dette fag.", - "@There was an error loading the summary details for this course.": { - "description": "Message shown when the course summary could not be loaded", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Summary": "Intet sammendrag", - "@No Summary": { - "description": "Title displayed when there are no items in the course summary", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "This course does not have any assignments or calendar events yet.": "Dette fag har endnu ingen opgaver eller kalenderbegivenheder.", - "@This course does not have any assignments or calendar events yet.": { - "description": "Message displayed when there are no items in the course summary", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "gradeFormatScoreOutOfPointsPossible": "{score} / {pointsPossible}", - "@gradeFormatScoreOutOfPointsPossible": { - "description": "Formatted string for a student score out of the points possible", - "type": "text", - "placeholders_order": [ - "score", - "pointsPossible" - ], - "placeholders": { - "score": {}, - "pointsPossible": {} - } - }, - "contentDescriptionScoreOutOfPointsPossible": "{score} ud af {pointsPossible} point", - "@contentDescriptionScoreOutOfPointsPossible": { - "description": "Formatted string for a student score out of the points possible", - "type": "text", - "placeholders_order": [ - "score", - "pointsPossible" - ], - "placeholders": { - "score": {}, - "pointsPossible": {} - } - }, - "gradesSubjectMessage": "Vedrørende: {studentName}, Karakterer", - "@gradesSubjectMessage": { - "description": "The subject line for a message to a teacher regarding a student's grades", - "type": "text", - "placeholders_order": [ - "studentName" - ], - "placeholders": { - "studentName": {} - } - }, - "syllabusSubjectMessage": "Vedrørende: {studentName}, Læseplan", - "@syllabusSubjectMessage": { - "description": "The subject line for a message to a teacher regarding a course syllabus", - "type": "text", - "placeholders_order": [ - "studentName" - ], - "placeholders": { - "studentName": {} - } - }, - "frontPageSubjectMessage": "Vedrørende: {studentName}, Forside", - "@frontPageSubjectMessage": { - "description": "The subject line for a message to a teacher regarding a course front page", - "type": "text", - "placeholders_order": [ - "studentName" - ], - "placeholders": { - "studentName": {} - } - }, - "assignmentSubjectMessage": "Vedrørende: {studentName}, Opgave - {assignmentName}", - "@assignmentSubjectMessage": { - "description": "The subject line for a message to a teacher regarding a student's assignment", - "type": "text", - "placeholders_order": [ - "studentName", - "assignmentName" - ], - "placeholders": { - "studentName": {}, - "assignmentName": {} - } - }, - "eventSubjectMessage": "Vedrørende: {studentName}, Begivenhed - {eventTitle}", - "@eventSubjectMessage": { - "description": "The subject line for a message to a teacher regarding a calendar event", - "type": "text", - "placeholders_order": [ - "studentName", - "eventTitle" - ], - "placeholders": { - "studentName": {}, - "eventTitle": {} - } - }, - "There is no page information available.": "Der er ingen tilgængelige sideinformationer.", - "@There is no page information available.": { - "description": "Description for when no page information is available", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Assignment Details": "Opgaveoplysninger", - "@Assignment Details": { - "description": "Title for the page that shows details for an assignment", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "assignmentTotalPoints": "{points} point", - "@assignmentTotalPoints": { - "description": "Label used for the total points the assignment is worth", - "type": "text", - "placeholders_order": [ - "points" - ], - "placeholders": { - "points": {} - } - }, - "assignmentTotalPointsAccessible": "{points} point", - "@assignmentTotalPointsAccessible": { - "description": "Screen reader label used for the total points the assignment is worth", - "type": "text", - "placeholders_order": [ - "points" - ], - "placeholders": { - "points": {} - } - }, - "Due": "Forfalder", - "@Due": { - "description": "Label for an assignment due date", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Grade": "Karakter", - "@Grade": { - "description": "Label for the section that displays an assignment's grade", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Locked": "Låst", - "@Locked": { - "description": "Label for when an assignment is locked", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "assignmentLockedModule": "Denne opgave er låst af modulet \"{moduleName}\".", - "@assignmentLockedModule": { - "description": "The locked description when an assignment is locked by a module", - "type": "text", - "placeholders_order": [ - "moduleName" - ], - "placeholders": { - "moduleName": {} - } - }, - "Remind Me": "Påmind mig", - "@Remind Me": { - "description": "Label for the row to set reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Set a date and time to be notified of this specific assignment.": "Indstil en dato og tid for at blive meddelt om denne specifikke opgave.", - "@Set a date and time to be notified of this specific assignment.": { - "description": "Description for row to set reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You will be notified about this assignment on…": "Du får besked om denne opgave den …", - "@You will be notified about this assignment on…": { - "description": "Description for when a reminder is set", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Instructions": "Instruktioner", - "@Instructions": { - "description": "Label for the description of the assignment when it has quiz instructions", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Send a message about this assignment": "Send en besked om denne opgave", - "@Send a message about this assignment": { - "description": "Accessibility hint for the assignment messaage floating action button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "This app is not authorized for use.": "Denne app er ikke autoriseret for brug.", - "@This app is not authorized for use.": { - "description": "The error shown when the app being used is not verified by Canvas", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The server you entered is not authorized for this app.": "Den server, du indtastede, er ikke autoriseret til denne app.", - "@The server you entered is not authorized for this app.": { - "description": "The error shown when the desired login domain is not verified by Canvas", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The user agent for this app is not authorized.": "Brugeragenten for denne app er ikke autoriseret.", - "@The user agent for this app is not authorized.": { - "description": "The error shown when the user agent during verification is not verified by Canvas", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "We were unable to verify the server for use with this app.": "Vi kunne ikke bekræfte serveren til brug med denne app.", - "@We were unable to verify the server for use with this app.": { - "description": "The generic error shown when we are unable to verify with Canvas", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Reminders": "Påmindelser", - "@Reminders": { - "description": "Name of the system notification channel for assignment and event reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Notifications for reminders about assignments and calendar events": "Meddelelser for påmindelser om opgaver og kalenderbegivenheder", - "@Notifications for reminders about assignments and calendar events": { - "description": "Description of the system notification channel for assignment and event reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Reminders have changed!": "Påmindelser er blevet ændret!", - "@Reminders have changed!": { - "description": "Title of the dialog shown when the user needs to update their reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "In order to provide you with a better experience, we have updated how reminders work. You can add new reminders by viewing an assignment or calendar event and tapping the switch under the \"Remind Me\" section.\n\nBe aware that any reminders created with older versions of this app will not be compatible with the new changes and you will need to create them again.": "For at give dig en bedre oplevelse har vi opdateret, hvordan påmindelser fungerer. Du kan tilføje nye påmindelser ved at se en opgave eller kalenderbegivenhed og trykke på kontakten i sektionen \"Påmind mig\".\n\nVær opmærksom på, at alle påmindelser oprettet med ældre versioner af denne app ikke vil være kompatible med de nye ændringer, og du derfor må oprette dem igen.", - "@In order to provide you with a better experience, we have updated how reminders work. You can add new reminders by viewing an assignment or calendar event and tapping the switch under the \"Remind Me\" section.\n\nBe aware that any reminders created with older versions of this app will not be compatible with the new changes and you will need to create them again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Not a parent?": "Ikke forælder?", - "@Not a parent?": { - "description": "Title for the screen that shows when the user is not observing any students", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "We couldn't find any students associated with this account": "Vi kunne ikke finde nogen studerende tilknyttet den konto.", - "@We couldn't find any students associated with this account": { - "description": "Subtitle for the screen that shows when the user is not observing any students", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Are you a student or teacher?": "Er du studerende eller lærer?", - "@Are you a student or teacher?": { - "description": "Label for button that will show users the option to view other Canvas apps in the Play Store", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "One of our other apps might be a better fit. Tap one to visit the Play Store.": "En af vores andre apps kan være bedre egnet. Tryk på et for at besøge Play Store.", - "@One of our other apps might be a better fit. Tap one to visit the Play Store.": { - "description": "Description of options to view other Canvas apps in the Play Store", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Return to Login": "Retur til login", - "@Return to Login": { - "description": "Label for the button that returns the user to the login screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "STUDENT": "STUDERENDE", - "@STUDENT": { - "description": "The \"student\" portion of the \"Canvas Student\" app name, in all caps. \"Canvas\" is excluded in this context as it will be displayed to the user as a wordmark image", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "TEACHER": "LÆRER", - "@TEACHER": { - "description": "The \"teacher\" portion of the \"Canvas Teacher\" app name, in all caps. \"Canvas\" is excluded in this context as it will be displayed to the user as a wordmark image", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Canvas Student": "Canvas-studerende", - "@Canvas Student": { - "description": "The name of the Canvas Student app. Only \"Student\" should be translated as \"Canvas\" is a brand name in this context and should not be translated.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Canvas Teacher": "Canvas Teacher", - "@Canvas Teacher": { - "description": "The name of the Canvas Teacher app. Only \"Teacher\" should be translated as \"Canvas\" is a brand name in this context and should not be translated.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Alerts": "Ingen varslinger", - "@No Alerts": { - "description": "The title for the empty message to show to users when there are no alerts for the student.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There’s nothing to be notified of yet.": "Der er intet at blive underrettet om endnu.", - "@There’s nothing to be notified of yet.": { - "description": "The empty message to show to users when there are no alerts for the student.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "dismissAlertLabel": "Afvis {alertTitle}", - "@dismissAlertLabel": { - "description": "Accessibility label to dismiss an alert", - "type": "text", - "placeholders_order": [ - "alertTitle" - ], - "placeholders": { - "alertTitle": {} - } - }, - "Course Announcement": "Besked til faget", - "@Course Announcement": { - "description": "Title for alerts when there is a course announcement", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Institution Announcement": "Besked til institutionen", - "@Institution Announcement": { - "description": "Title for alerts when there is an institution announcement", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "assignmentGradeAboveThreshold": "Opgavekarakter over {threshold}", - "@assignmentGradeAboveThreshold": { - "description": "Title for alerts when an assignment grade is above the threshold value", - "type": "text", - "placeholders_order": [ - "threshold" - ], - "placeholders": { - "threshold": {} - } - }, - "assignmentGradeBelowThreshold": "Opgavekarakter under {threshold}", - "@assignmentGradeBelowThreshold": { - "description": "Title for alerts when an assignment grade is below the threshold value", - "type": "text", - "placeholders_order": [ - "threshold" - ], - "placeholders": { - "threshold": {} - } - }, - "courseGradeAboveThreshold": "Kursuskarakter oven {threshold}", - "@courseGradeAboveThreshold": { - "description": "Title for alerts when a course grade is above the threshold value", - "type": "text", - "placeholders_order": [ - "threshold" - ], - "placeholders": { - "threshold": {} - } - }, - "courseGradeBelowThreshold": "Kursuskarakter under {threshold}", - "@courseGradeBelowThreshold": { - "description": "Title for alerts when a course grade is below the threshold value", - "type": "text", - "placeholders_order": [ - "threshold" - ], - "placeholders": { - "threshold": {} - } - }, - "Settings": "Indstillinger", - "@Settings": { - "description": "Title for the settings screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Theme": "Tema", - "@Theme": { - "description": "Label for the light/dark theme section in the settings page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Dark Mode": "Mørk tilstand", - "@Dark Mode": { - "description": "Label for the button that enables dark mode", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Light Mode": "Lys tilstand", - "@Light Mode": { - "description": "Label for the button that enables light mode", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "High Contrast Mode": "Høj kontrast-tilstand", - "@High Contrast Mode": { - "description": "Label for the switch that toggles high contrast mode", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Use Dark Theme in Web Content": "Brug mørkt tema i webindhold", - "@Use Dark Theme in Web Content": { - "description": "Label for the switch that toggles dark mode for webviews", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Appearance": "Udseende", - "@Appearance": { - "description": "Label for the appearance section in the settings page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Successfully submitted!": "Blev indsendt!", - "@Successfully submitted!": { - "description": "Title displayed in the grade cell for an assignment that has been submitted", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "submissionStatusSuccessSubtitle": "Denne opgave blev afleveret den {date} kl. {time} og venter på at blive bedømt", - "@submissionStatusSuccessSubtitle": { - "description": "Subtitle displayed in the grade cell for an assignment that has been submitted and is awaiting a grade", - "type": "text", - "placeholders_order": [ - "date", - "time" - ], - "placeholders": { - "date": {}, - "time": {} - } - }, - "outOfPoints": "{howMany,plural, =1{Ud af 1 point}other{Ud af {points} point}}", - "@outOfPoints": { - "description": "Description for an assignment grade that has points without a current scoroe", - "type": "text", - "placeholders_order": [ - "points", - "howMany" - ], - "placeholders": { - "points": {}, - "howMany": {} - } - }, - "Excused": "Undskyldt", - "@Excused": { - "description": "Grading status for an assignment marked as excused", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Complete": "Fuldført", - "@Complete": { - "description": "Grading status for an assignment marked as complete", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Incomplete": "Ufuldstændig", - "@Incomplete": { - "description": "Grading status for an assignment marked as incomplete", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "minus": "minus", - "@minus": { - "description": "Screen reader-friendly replacement for the \"-\" character in letter grades like \"A-\"", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "latePenalty": "Straf for sen aflevering (-{pointsLost})", - "@latePenalty": { - "description": "Text displayed when a late penalty has been applied to the assignment", - "type": "text", - "placeholders_order": [ - "pointsLost" - ], - "placeholders": { - "pointsLost": {} - } - }, - "finalGrade": "Endelig karakter: {grade}", - "@finalGrade": { - "description": "Text that displays the final grade of an assignment", - "type": "text", - "placeholders_order": [ - "grade" - ], - "placeholders": { - "grade": {} - } - }, - "Alert Settings": "Varslingsindstillinger", - "@Alert Settings": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Alert me when…": "Send mig en varsling når ...", - "@Alert me when…": { - "description": "Header for the screen where the observer chooses the thresholds that will determine when they receive alerts (e.g. when an assignment is graded below 70%)", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Course grade below": "Kursuskarakter under", - "@Course grade below": { - "description": "Label describing the threshold for when the course grade is below a certain percentage", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Course grade above": "Kursuskarakter over", - "@Course grade above": { - "description": "Label describing the threshold for when the course grade is above a certain percentage", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Assignment missing": "Opgave mangler", - "@Assignment missing": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Assignment grade below": "Opgavekarakter under", - "@Assignment grade below": { - "description": "Label describing the threshold for when an assignment is graded below a certain percentage", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Assignment grade above": "Opgavekarakter over", - "@Assignment grade above": { - "description": "Label describing the threshold for when an assignment is graded above a certain percentage", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Course Announcements": "Fag-beskeder", - "@Course Announcements": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Institution Announcements": "Institutionsmeddelelser", - "@Institution Announcements": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Never": "Aldrig", - "@Never": { - "description": "Indication that tells the user they will not receive alert notifications of a specific kind", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Grade percentage": "Karakter procent", - "@Grade percentage": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading your student's alerts.": "Der opstod en fejl under indlæsning af den studerendes varslinger.", - "@There was an error loading your student's alerts.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Must be below 100": "Skal være under 100", - "@Must be below 100": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "mustBeBelowN": "Skal være under {percentage}", - "@mustBeBelowN": { - "description": "Validation error to the user that they must choose a percentage below 'n'", - "type": "text", - "placeholders_order": [ - "percentage" - ], - "placeholders": { - "percentage": { - "example": 5 - } - } - }, - "mustBeAboveN": "Skal være over {percentage}", - "@mustBeAboveN": { - "description": "Validation error to the user that they must choose a percentage above 'n'", - "type": "text", - "placeholders_order": [ - "percentage" - ], - "placeholders": { - "percentage": { - "example": 5 - } - } - }, - "Select Student Color": "Vælg den studerendes farve", - "@Select Student Color": { - "description": "Title for screen that allows users to assign a color to a specific student", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Electric, blue": "Elektrisk, blå", - "@Electric, blue": { - "description": "Name of the Electric (blue) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Plum, Purple": "Blomme, lilla", - "@Plum, Purple": { - "description": "Name of the Plum (purple) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Barney, Fuschia": "Barney, fuschia", - "@Barney, Fuschia": { - "description": "Name of the Barney (fuschia) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Raspberry, Red": "Hindbær, rød", - "@Raspberry, Red": { - "description": "Name of the Raspberry (red) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Fire, Orange": "Ild, orange", - "@Fire, Orange": { - "description": "Name of the Fire (orange) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Shamrock, Green": "Firkløver, grøn", - "@Shamrock, Green": { - "description": "Name of the Shamrock (green) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "An error occurred while saving your selection. Please try again.": "Der opstod en fejl, da du forsøgte at gemme dit valg. Prøv igen.", - "@An error occurred while saving your selection. Please try again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "changeStudentColorLabel": "Skift farve til {studentName}", - "@changeStudentColorLabel": { - "description": "Accessibility label for the button that lets users change the color associated with a specific student", - "type": "text", - "placeholders_order": [ - "studentName" - ], - "placeholders": { - "studentName": {} - } - }, - "Teacher": "Lærer", - "@Teacher": { - "description": "Label for the Teacher enrollment type", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Student": "Studerende", - "@Student": { - "description": "Label for the Student enrollment type", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "TA": "Undervisningsassistent", - "@TA": { - "description": "Label for the Teaching Assistant enrollment type (also known as Teacher Aid or Education Assistant), reduced to a short acronym/initialism if appropriate.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Observer": "Observatør", - "@Observer": { - "description": "Label for the Observer enrollment type", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Use Camera": "Brug kamera", - "@Use Camera": { - "description": "Label for the action item that lets the user capture a photo using the device camera", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Upload File": "Overfør fil", - "@Upload File": { - "description": "Label for the action item that lets the user upload a file from their device", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Choose from Gallery": "Vælg fra galleri", - "@Choose from Gallery": { - "description": "Label for the action item that lets the user select a photo from their device gallery", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Preparing…": "Forbereder ...", - "@Preparing…": { - "description": "Message shown while a file is being prepared to attach to a message", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Add student with…": "Tilføj studerende med ...", - "@Add student with…": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Add Student": "Tilføj studerende", - "@Add Student": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You are not observing any students.": "Du observerer ikke nogen studerende.", - "@You are not observing any students.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading your students.": "Der opstod en fejl under indlæsning af de studerende.", - "@There was an error loading your students.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Pairing Code": "Parringskode", - "@Pairing Code": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Students can obtain a pairing code through the Canvas website": "Studerende kan få en parringskode via Canvas-webstedet", - "@Students can obtain a pairing code through the Canvas website": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Enter the student pairing code provided to you. If the pairing code doesn't work, it may have expired": "Indtast den studerendes parringskode, der er blevet givet til dig. Hvis parringskoden ikke fungerer, kan den være udløbet", - "@Enter the student pairing code provided to you. If the pairing code doesn't work, it may have expired": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Your code is incorrect or expired.": "Din kode er forkert eller udløbet.", - "@Your code is incorrect or expired.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Something went wrong trying to create your account, please reach out to your school for assistance.": "Noget gik galt ved oprettelse af din konto. Kontakt din skole for at få hjælp.", - "@Something went wrong trying to create your account, please reach out to your school for assistance.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "QR Code": "QR-kode", - "@QR Code": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Students can create a QR code using the Canvas Student app on their mobile device": "Studerende kan oprette en QR-kode ved hjælp af Canvas Student-appen på deres mobilenhed", - "@Students can create a QR code using the Canvas Student app on their mobile device": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Add new student": "Tilføj ny studerende", - "@Add new student": { - "description": "Semantics label for the FAB on the Manage Students Screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Select": "Vælg", - "@Select": { - "description": "Hint text to tell the user to choose one of two options", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I have a Canvas account": "Jeg har en Canvas-konto", - "@I have a Canvas account": { - "description": "Option to select for users that have a canvas account", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I don't have a Canvas account": "Jeg har ikke en Canvas-konto", - "@I don't have a Canvas account": { - "description": "Option to select for users that don't have a canvas account", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Create Account": "Opret konto", - "@Create Account": { - "description": "Button text for account creation confirmation", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Full Name": "Fulde navn", - "@Full Name": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Email Address": "E-mailadresse", - "@Email Address": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Password": "Adgangskode", - "@Password": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Full Name…": "Fulde navn ...", - "@Full Name…": { - "description": "hint label for inside form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Email…": "E-mail ...", - "@Email…": { - "description": "hint label for inside form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Password…": "Adgangskode ...", - "@Password…": { - "description": "hint label for inside form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Please enter full name": "Indtast det fulde navn", - "@Please enter full name": { - "description": "Error message for form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Please enter an email address": "Indtast en e-mailadresse", - "@Please enter an email address": { - "description": "Error message for form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Please enter a valid email address": "Indtast gyldig e-mailadresse", - "@Please enter a valid email address": { - "description": "Error message for form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Password is required": "Adgangskode er påkrævet", - "@Password is required": { - "description": "Error message for form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Password must contain at least 8 characters": "Adgangskode skal indeholde mindst 8 tegn", - "@Password must contain at least 8 characters": { - "description": "Error message for form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "qrCreateAccountTos": "Ved at trykke på 'Opret konto' accepterer jeg {termsOfService} og accepterer {privacyPolicy}.", - "@qrCreateAccountTos": { - "description": "The text show on the account creation screen", - "type": "text", - "placeholders_order": [ - "termsOfService", - "privacyPolicy" - ], - "placeholders": { - "termsOfService": {}, - "privacyPolicy": {} - } - }, - "Terms of Service": "Betingelser for service", - "@Terms of Service": { - "description": "Label for the Canvas Terms of Service agreement. This will be used in the qrCreateAccountTos text and will be highlighted and clickable", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Privacy Policy": "Datapolitik", - "@Privacy Policy": { - "description": "Label for the Canvas Privacy Policy agreement. This will be used in the qrCreateAccountTos text and will be highlighted and clickable", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "View the Privacy Policy": "Vis datapolitikken", - "@View the Privacy Policy": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Already have an account? ": "Har du allerede en konto? ", - "@Already have an account? ": { - "description": "Part of multiline text span, includes AccountSignIn1-2, in that order", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Sign In": "Log på", - "@Sign In": { - "description": "Part of multiline text span, includes AccountSignIn1-2, in that order", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Hide Password": "Skjul adgangskode", - "@Hide Password": { - "description": "content description for password hide button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Show Password": "Vis adgangskode", - "@Show Password": { - "description": "content description for password show button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Terms of Service Link": "Link til Betingelser for service", - "@Terms of Service Link": { - "description": "content description for terms of service link", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Privacy Policy Link": "Link til Datapolitik", - "@Privacy Policy Link": { - "description": "content description for privacy policy link", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Event": "Begivenhed", - "@Event": { - "description": "Title for the event details screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Date": "Dato", - "@Date": { - "description": "Label for the event date", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Location": "Placering", - "@Location": { - "description": "Label for the location information", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Location Specified": "Ingen lokation specificeret", - "@No Location Specified": { - "description": "Description for events that do not have a location", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "eventTime": "{startAt} - {endAt}", - "@eventTime": { - "description": "The time the event is happening, example: \"2:00 pm - 4:00 pm\"", - "type": "text", - "placeholders_order": [ - "startAt", - "endAt" - ], - "placeholders": { - "startAt": {}, - "endAt": {} - } - }, - "Set a date and time to be notified of this event.": "Indstil en dato og tid for, hvornår der skal meddeles om denne begivenhed.", - "@Set a date and time to be notified of this event.": { - "description": "Description for row to set event reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You will be notified about this event on…": "Du får besked om denne begivenhed den ...", - "@You will be notified about this event on…": { - "description": "Description for when an event reminder is set", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Share Your Love for the App": "Del din kærlighed for denne app", - "@Share Your Love for the App": { - "description": "Label for option to open the app store", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Tell us about your favorite parts of the app": "Fortæl os om, hvad du bedst kan lide af denne app", - "@Tell us about your favorite parts of the app": { - "description": "Description for option to open the app store", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Legal": "Juridisk", - "@Legal": { - "description": "Label for legal information option", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Privacy policy, terms of use, open source": "Fortrolighedspolitik, betingelser for brug, open source", - "@Privacy policy, terms of use, open source": { - "description": "Description for legal information option", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Idea for Canvas Parent App [Android]": "Ide for Canvas Parent App [Android]", - "@Idea for Canvas Parent App [Android]": { - "description": "The subject for the email to request a feature", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The following information will help us better understand your idea:": "Følgende oplysninger hjælper os med bedre at forstå din idé:", - "@The following information will help us better understand your idea:": { - "description": "The header for the users information that is attached to a feature request", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Domain:": "Domæne:", - "@Domain:": { - "description": "The label for the Canvas domain of the logged in user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "User ID:": "Bruger ID:", - "@User ID:": { - "description": "The label for the Canvas user ID of the logged in user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Email:": "E-mail:", - "@Email:": { - "description": "The label for the eamil of the logged in user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Locale:": "Sted:", - "@Locale:": { - "description": "The label for the locale of the logged in user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Terms of Use": "Betingelser for brug", - "@Terms of Use": { - "description": "Label for the terms of use", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Canvas on GitHub": "Canvas på GitHub", - "@Canvas on GitHub": { - "description": "Label for the button that opens the Canvas project on GitHub's website", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was a problem loading the Terms of Use": "Der opstod et problem ved indlæsning af Betingelser for brug", - "@There was a problem loading the Terms of Use": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Device": "Enhed", - "@Device": { - "description": "Label used for device manufacturer/model in the error report", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "OS Version": "OS-version", - "@OS Version": { - "description": "Label used for device operating system version in the error report", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Version Number": "Versionsnummer", - "@Version Number": { - "description": "Label used for the app version number in the error report", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Report A Problem": "Rapporter et problem", - "@Report A Problem": { - "description": "Title used for generic dialog to report problems", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Subject": "Emne", - "@Subject": { - "description": "Label used for Subject text field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "A subject is required.": "Der kræves et emne.", - "@A subject is required.": { - "description": "Error shown when the subject field is empty", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "An email address is required.": "Der kræves en e-mailadresse.", - "@An email address is required.": { - "description": "Error shown when the email field is empty", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Description": "Beskrivelse", - "@Description": { - "description": "Label used for Description text field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "A description is required.": "Der kræves en beskrivelse.", - "@A description is required.": { - "description": "Error shown when the description field is empty", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "How is this affecting you?": "Hvordan påvirker det dig?", - "@How is this affecting you?": { - "description": "Label used for the dropdown to select how severe the issue is", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "send": "send", - "@send": { - "description": "Label used for send button when reporting a problem", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Just a casual question, comment, idea, suggestion…": "Blot et simpelt spørgmål, kommentar, ide, forslag...", - "@Just a casual question, comment, idea, suggestion…": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I need some help but it's not urgent.": "Jeg behøver hjælp, men det er ikke presserende.", - "@I need some help but it's not urgent.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Something's broken but I can work around it to get what I need done.": "Noget et i stykker, men jeg kan ikke rette det, for at få hvad jeg behøver at gøre.", - "@Something's broken but I can work around it to get what I need done.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I can't get things done until I hear back from you.": "Jeg kan ikke udføre ting før jeg har fået dit svar.", - "@I can't get things done until I hear back from you.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "EXTREME CRITICAL EMERGENCY!!": "EKSTREMT KRITISK NØDSTILFÆLDE!!", - "@EXTREME CRITICAL EMERGENCY!!": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Not Graded": "Ikke bedømt", - "@Not Graded": { - "description": "Description for an assignment has not been graded.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Login flow: Normal": "Login-flow: Normalt", - "@Login flow: Normal": { - "description": "Description for the normal login flow", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Login flow: Canvas": "Login-flow: Canvas", - "@Login flow: Canvas": { - "description": "Description for the Canvas login flow", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Login flow: Site Admin": "Login-flow: Websideadministrator", - "@Login flow: Site Admin": { - "description": "Description for the Site Admin login flow", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Login flow: Skip mobile verify": "Login-flow: Spring mobil bekræftelse over", - "@Login flow: Skip mobile verify": { - "description": "Description for the login flow that skips domain verification for mobile", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Act As User": "Funger som bruger", - "@Act As User": { - "description": "Label for the button that allows the user to act (masquerade) as another user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Stop Acting as User": "Hold op med at fungere som bruger", - "@Stop Acting as User": { - "description": "Label for the button that allows the user to stop acting (masquerading) as another user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "actingAsUser": "Du fungerer som {userName}", - "@actingAsUser": { - "description": "Message shown while acting (masquerading) as another user", - "type": "text", - "placeholders_order": [ - "userName" - ], - "placeholders": { - "userName": {} - } - }, - "\"Act as\" is essentially logging in as this user without a password. You will be able to take any action as if you were this user, and from other users' points of views, it will be as if this user performed them. However, audit logs record that you were the one who performed the actions on behalf of this user.": "\"Funger som\" betyder i bund og grund, at du logger ind som denne bruger uden adgangskode. Du kan foretage dig alt, som om du var denne bruger, og for andre brugere, er det lige som om, det var denne bruger, der gjorde det. Dog registrerer audit-logs, at det faktisk var dig, der udførte handlingerne på vegne af denne bruger.", - "@\"Act as\" is essentially logging in as this user without a password. You will be able to take any action as if you were this user, and from other users' points of views, it will be as if this user performed them. However, audit logs record that you were the one who performed the actions on behalf of this user.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Domain": "Domæne", - "@Domain": { - "description": "Text field hint for domain url input", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You must enter a valid domain": "Du skal indtaste et gyldigt domæne", - "@You must enter a valid domain": { - "description": "Message displayed for domain input error", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "User ID": "Bruger-id", - "@User ID": { - "description": "Text field hint for user ID input", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You must enter a user id": "Du skal indtaste et bruger-ID", - "@You must enter a user id": { - "description": "Message displayed for user Id input error", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error trying to act as this user. Please check the Domain and User ID and try again.": "Der opstod en fejl ved at fungere som denne bruger. Kontroller domænet og bruger-ID'et, og prøv igen.", - "@There was an error trying to act as this user. Please check the Domain and User ID and try again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "endMasqueradeMessage": "Du vil stoppe med at fungere som {userName} og vende tilbage til din originale konto.", - "@endMasqueradeMessage": { - "description": "Confirmation message displayed when the user wants to stop acting (masquerading) as another user", - "type": "text", - "placeholders_order": [ - "userName" - ], - "placeholders": { - "userName": {} - } - }, - "endMasqueradeLogoutMessage": "Du vil stoppe med at fungere som {userName} og bliver logget ud.", - "@endMasqueradeLogoutMessage": { - "description": "Confirmation message displayed when the user wants to stop acting (masquerading) as another user and will be logged out.", - "type": "text", - "placeholders_order": [ - "userName" - ], - "placeholders": { - "userName": {} - } - }, - "How are we doing?": "Hvordan klarer vi os?", - "@How are we doing?": { - "description": "Title for dialog asking user to rate the app out of 5 stars.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Don't show again": "Vis ikke igen", - "@Don't show again": { - "description": "Button to prevent the rating dialog from showing again.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "What can we do better?": "Hvad kan vi gøre bedre?", - "@What can we do better?": { - "description": "Hint text for providing a comment with the rating.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Send Feedback": "Send feedback", - "@Send Feedback": { - "description": "Button to send rating with feedback", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "ratingDialogEmailSubject": "Forslag til Android - Canvas Parent {version}", - "@ratingDialogEmailSubject": { - "description": "The subject for an email to provide feedback for CanvasParent.", - "type": "text", - "placeholders_order": [ - "version" - ], - "placeholders": { - "version": {} - } - }, - "starRating": "{position,plural, =1{{position} stjerne}other{{position} stjerner}}", - "@starRating": { - "description": "Accessibility label for the 1 stars to 5 stars rating", - "type": "text", - "placeholders_order": [ - "position" - ], - "placeholders": { - "position": { - "example": 1 - } - } - }, - "Student Pairing": "Parring af konti for studerende", - "@Student Pairing": { - "description": "Title for the screen where users can pair to students using a QR code", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Open Canvas Student": "Åbn Canvas Student-appen", - "@Open Canvas Student": { - "description": "Title for QR pairing tutorial screen instructing users to open the Canvas Student app", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You'll need to open your student's Canvas Student app to continue. Go into Main Menu > Settings > Pair with Observer and scan the QR code you see there.": "Du skal åbne din studerendes Canvas Student-app for at fortsætte. Gå til Hovedmenu > Indstillinger> Par med observatør, og scan den QR-kode, du ser der.", - "@You'll need to open your student's Canvas Student app to continue. Go into Main Menu > Settings > Pair with Observer and scan the QR code you see there.": { - "description": "Message explaining how QR code pairing works", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Screenshot showing location of pairing QR code generation in the Canvas Student app": "Skærmbillede, der viser placering af QR-koden i Canvas Student-appen", - "@Screenshot showing location of pairing QR code generation in the Canvas Student app": { - "description": "Content Description for qr pairing tutorial screenshot", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Expired QR Code": "Udløbet QR-kode", - "@Expired QR Code": { - "description": "Error title shown when the users scans a QR code that has expired", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The QR code you scanned may have expired. Refresh the code on the student's device and try again.": "Den QR-kode, du scannede, kan være udløbet. Opdater koden på den studerendes enhed, og prøv igen.", - "@The QR code you scanned may have expired. Refresh the code on the student's device and try again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "A network error occurred when adding this student. Check your connection and try again.": "Der opstod en netværksfejl under dit forsøg på at tilføje denne studerende. Kontrollér forbindelsen, og prøv igen.", - "@A network error occurred when adding this student. Check your connection and try again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Invalid QR Code": "Ugyldig QR-kode", - "@Invalid QR Code": { - "description": "Error title shown when the user scans an invalid QR code", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Incorrect Domain": "Forkert domæne", - "@Incorrect Domain": { - "description": "Error title shown when the users scane a QR code for a student that belongs to a different domain", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The student you are trying to add belongs to a different school. Log in or create an account with that school to scan this code.": "Den studerende, du prøver at tilføje, tilhører en anden skole. Log ind eller opret en konto med denne skole for at scanne denne kode.", - "@The student you are trying to add belongs to a different school. Log in or create an account with that school to scan this code.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Camera Permission": "Kameratilladelse", - "@Camera Permission": { - "description": "Error title shown when the user wans to scan a QR code but has denied the camera permission", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "This will unpair and remove all enrollments for this student from your account.": "Dette vil fjerne parring og alle tilmeldinger for denne studerende fra din konto.", - "@This will unpair and remove all enrollments for this student from your account.": { - "description": "Confirmation message shown when the user tries to delete a student from their account", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was a problem removing this student from your account. Please check your connection and try again.": "Der opstod et problem under forsøg på at fjerne denne studerende fra din konto. Kontrollér forbindelsen, og prøv igen.", - "@There was a problem removing this student from your account. Please check your connection and try again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Cancel": "Annullér", - "@Cancel": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "next": "Næste", - "@next": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "ok": "OK", - "@ok": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Yes": "Ja", - "@Yes": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No": "Nej", - "@No": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Retry": "Prøv igen", - "@Retry": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Delete": "Slet", - "@Delete": { - "description": "Label used for general delete/remove actions", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Done": "Udført", - "@Done": { - "description": "Label for general done/finished actions", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Refresh": "Opdater", - "@Refresh": { - "description": "Label for button to refresh data from the web", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "View Description": "Vis beskrivelse", - "@View Description": { - "description": "Button to view the description for an event or assignment", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "expanded": "udvidet", - "@expanded": { - "description": "Description for the accessibility reader for list groups that are expanded", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "collapsed": "skjult", - "@collapsed": { - "description": "Description for the accessibility reader for list groups that are expanded", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "An unexpected error occurred": "En uventet fejl opstod", - "@An unexpected error occurred": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No description": "Ingen beskrivelse", - "@No description": { - "description": "Message used when the assignment has no description", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Launch External Tool": "Start eksternt værktøj", - "@Launch External Tool": { - "description": "Button text added to webviews to let users open external tools in their browser", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Interactions on this page are limited by your institution.": "Interaktioner på denne side er begrænset af din institution.", - "@Interactions on this page are limited by your institution.": { - "description": "Message describing how the webview has limited access due to an instution setting", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "dateAtTime": "{date} kl. {time}", - "@dateAtTime": { - "description": "The string to format dates", - "type": "text", - "placeholders_order": [ - "date", - "time" - ], - "placeholders": { - "date": {}, - "time": {} - } - }, - "dueDateAtTime": "Forfalder d. {date} kl. {time}", - "@dueDateAtTime": { - "description": "The string to format due dates", - "type": "text", - "placeholders_order": [ - "date", - "time" - ], - "placeholders": { - "date": {}, - "time": {} - } - }, - "No Due Date": "Ingen afleveringsdato", - "@No Due Date": { - "description": "Label for assignments that do not have a due date", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Filter": "Filter", - "@Filter": { - "description": "Label for buttons to filter what items are visible", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "unread": "ulæst", - "@unread": { - "description": "Label for things that are marked as unread", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "unreadCount": "{count} ulæst", - "@unreadCount": { - "description": "Formatted string for when there are a number of unread items", - "type": "text", - "placeholders_order": [ - "count" - ], - "placeholders": { - "count": {} - } - }, - "badgeNumberPlus": "{count}+", - "@badgeNumberPlus": { - "description": "Formatted string for when too many items are being notified in a badge, generally something like: 99+", - "type": "text", - "placeholders_order": [ - "count" - ], - "placeholders": { - "count": {} - } - }, - "There was an error loading this announcement": "Der opstod en fejl under indlæsning af denne besked", - "@There was an error loading this announcement": { - "description": "Message shown when an announcement detail screen fails to load", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Network error": "Netværksfejl", - "@Network error": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Under Construction": "Under opbygning", - "@Under Construction": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "We are currently building this feature for your viewing pleasure.": "Vi er i øjeblikket ved at bygge denne funktion.", - "@We are currently building this feature for your viewing pleasure.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Request Login Help Button": "Knap til anmodning om hjælp til login", - "@Request Login Help Button": { - "description": "Accessibility hint for button that opens help dialog for a login help request", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Request Login Help": "Anmod om hjælp til login", - "@Request Login Help": { - "description": "Title of help dialog for a login help request", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I'm having trouble logging in": "Jeg har problemer med at logge ind", - "@I'm having trouble logging in": { - "description": "Subject of help dialog for a login help request", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "An error occurred when trying to display this link": "Der opstod en fejl ved forsøg på at vise dette link", - "@An error occurred when trying to display this link": { - "description": "Error message shown when a link can't be opened", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "We are unable to display this link, it may belong to an institution you currently aren't logged in to.": "Vi kan ikke vise dette link, måske hører det til en institution, som du i øjeblikket ikke er logget ind på.", - "@We are unable to display this link, it may belong to an institution you currently aren't logged in to.": { - "description": "Description for error page shown when clicking a link", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Link Error": "Linkfejl", - "@Link Error": { - "description": "Title for error page shown when clicking a link", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Open In Browser": "Åbn i browser", - "@Open In Browser": { - "description": "Text for button to open a link in the browswer", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You'll find the QR code on the web in your account profile. Click 'QR for Mobile Login' in the list.": "Du finder QR-koden på nettet i din kontoprofil. Klik på 'QR for mobil login' på listen.", - "@You'll find the QR code on the web in your account profile. Click 'QR for Mobile Login' in the list.": { - "description": "Text for qr login tutorial screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Locate QR Code": "Find QR-kode", - "@Locate QR Code": { - "description": "Text for qr login button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Please scan a QR code generated by Canvas": "Scan en QR-kode genereret af Canvas", - "@Please scan a QR code generated by Canvas": { - "description": "Text for qr login error with incorrect qr code", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error logging in. Please generate another QR Code and try again.": "Der opstod en fejl ved indlogning. Generer en QR-kode til, og prøv igen.", - "@There was an error logging in. Please generate another QR Code and try again.": { - "description": "Text for qr login error", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Screenshot showing location of QR code generation in browser": "Skærmbillede, der viser placeringen af QR-kodegenerering i browseren", - "@Screenshot showing location of QR code generation in browser": { - "description": "Content Description for qr login tutorial screenshot", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "QR scanning requires camera access": "QR-scanning kræver kameraadgang", - "@QR scanning requires camera access": { - "description": "placeholder for camera error for QR code scan", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The linked item is no longer available": "Det linkede element er ikke længere tilgængeligt", - "@The linked item is no longer available": { - "description": "error message when the alert could no be opened", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Message sent": "Besked sendt", - "@Message sent": { - "description": "confirmation message on the screen when the user succesfully sends a message", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Acceptable Use Policy": "Betingelser for acceptabel brug", - "@Acceptable Use Policy": { - "description": "title for the acceptable use policy screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Submit": "Indsend", - "@Submit": { - "description": "submit button title for acceptable use policy screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Either you're a new user or the Acceptable Use Policy has changed since you last agreed to it. Please agree to the Acceptable Use Policy before you continue.": "Enten er du en ny bruger, eller Betingelser for acceptabel brug er blevet ændret, siden du accepterede dem. Du bedes acceptere Betingelser for acceptabel brug, før du fortsætter.", - "@Either you're a new user or the Acceptable Use Policy has changed since you last agreed to it. Please agree to the Acceptable Use Policy before you continue.": { - "description": "acceptable use policy screen description", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I agree to the Acceptable Use Policy.": "Jeg accepterer betingelserne for acceptabel brug.", - "@I agree to the Acceptable Use Policy.": { - "description": "acceptable use policy switch title", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "About": "Om", - "@About": { - "description": "Title for about menu item in settings", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "App": "App", - "@App": { - "description": "Title for App field on about page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Login ID": "Login-id", - "@Login ID": { - "description": "Title for Login ID field on about page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Email": "E-mail", - "@Email": { - "description": "Title for Email field on about page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Version": "Version", - "@Version": { - "description": "Title for Version field on about page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Instructure logo": "Instructure-logo", - "@Instructure logo": { - "description": "Semantics label for the Instructure logo on the about page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - } -} \ No newline at end of file diff --git a/apps/flutter_parent/lib/l10n/res/intl_da_instk12.arb b/apps/flutter_parent/lib/l10n/res/intl_da_instk12.arb deleted file mode 100644 index 7963c41b68..0000000000 --- a/apps/flutter_parent/lib/l10n/res/intl_da_instk12.arb +++ /dev/null @@ -1,2753 +0,0 @@ -{ - "@@last_modified": "2023-08-25T11:04:20.901151", - "alertsLabel": "Varslinger", - "@alertsLabel": { - "description": "The label for the Alerts tab", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "calendarLabel": "Kalender", - "@calendarLabel": { - "description": "The label for the Calendar tab", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "coursesLabel": "Fag", - "@coursesLabel": { - "description": "The label for the Courses tab", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Students": "Ingen elever", - "@No Students": { - "description": "Text for when an observer has no students they are observing", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Tap to show student selector": "Tryk for at vise elevvælger", - "@Tap to show student selector": { - "description": "Semantics label for the area that will show the student selector when tapped", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Tap to pair with a new student": "Tryk for at parre med en ny elev", - "@Tap to pair with a new student": { - "description": "Semantics label for the add student button in the student selector", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Tap to select this student": "Tryk for at vælge denne elev", - "@Tap to select this student": { - "description": "Semantics label on individual students in the student switcher", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Manage Students": "Administrer elever", - "@Manage Students": { - "description": "Label text for the Manage Students nav drawer button as well as the title for the Manage Students screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Help": "Hjælp", - "@Help": { - "description": "Label text for the help nav drawer button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Log Out": "Log ud", - "@Log Out": { - "description": "Label text for the Log Out nav drawer button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Switch Users": "Skift brugere", - "@Switch Users": { - "description": "Label text for the Switch Users nav drawer button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "appVersion": "v. {version}", - "@appVersion": { - "description": "App version shown in the navigation drawer", - "type": "text", - "placeholders_order": [ - "version" - ], - "placeholders": { - "version": {} - } - }, - "Are you sure you want to log out?": "Er du sikker på, du vil logge af?", - "@Are you sure you want to log out?": { - "description": "Confirmation message displayed when the user tries to log out", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Calendars": "Kalendere", - "@Calendars": { - "description": "Label for button that lets users select which calendars to display", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "nextMonth": "Næste måned: {month}", - "@nextMonth": { - "description": "Label for the button that switches the calendar to the next month", - "type": "text", - "placeholders_order": [ - "month" - ], - "placeholders": { - "month": {} - } - }, - "previousMonth": "Forrige måned: {month}", - "@previousMonth": { - "description": "Label for the button that switches the calendar to the previous month", - "type": "text", - "placeholders_order": [ - "month" - ], - "placeholders": { - "month": {} - } - }, - "nextWeek": "Næste uge, der starter {date}", - "@nextWeek": { - "description": "Label for the button that switches the calendar to the next week", - "type": "text", - "placeholders_order": [ - "date" - ], - "placeholders": { - "date": {} - } - }, - "previousWeek": "Forrige uge, der starter {date}", - "@previousWeek": { - "description": "Label for the button that switches the calendar to the previous week", - "type": "text", - "placeholders_order": [ - "date" - ], - "placeholders": { - "date": {} - } - }, - "selectedMonthLabel": "Måneden {month}", - "@selectedMonthLabel": { - "description": "Accessibility label for the button that expands/collapses the month view", - "type": "text", - "placeholders_order": [ - "month" - ], - "placeholders": { - "month": {} - } - }, - "expand": "udvid", - "@expand": { - "description": "Accessibility label for the on-tap hint for the button that expands/collapses the month view", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "collapse": "skjul", - "@collapse": { - "description": "Accessibility label for the on-tap hint for the button that expands/collapses the month view", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "pointsPossible": "{points} mulige point", - "@pointsPossible": { - "description": "Screen reader label used for the points possible for an assignment, quiz, etc.", - "type": "text", - "placeholders_order": [ - "points" - ], - "placeholders": { - "points": {} - } - }, - "calendarDaySemanticsLabel": "{eventCount,plural, =1{{date}, {eventCount} begivenhed}other{{date}, {eventCount} begivenheder}}", - "@calendarDaySemanticsLabel": { - "description": "Screen reader label used for calendar day, reads the date and count of events", - "type": "text", - "placeholders_order": [ - "date", - "eventCount" - ], - "placeholders": { - "date": {}, - "eventCount": {} - } - }, - "No Events Today!": "Ingen begivenheder i dag!", - "@No Events Today!": { - "description": "Title displayed when there are no calendar events for the current day", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "It looks like a great day to rest, relax, and recharge.": "Det er en alle tiders dag til at tage den med ro og slappe af.", - "@It looks like a great day to rest, relax, and recharge.": { - "description": "Message displayed when there are no calendar events for the current day", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading your student's calendar": "Der opstod en fejl under indlæsning af elevens kalender", - "@There was an error loading your student's calendar": { - "description": "Message displayed when calendar events could not be loaded for the current student", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Tap to favorite the courses you want to see on the Calendar. Select up to 10.": "Tryk for at få vist dine favoritfag i kalenderen. Vælg op til 10.", - "@Tap to favorite the courses you want to see on the Calendar. Select up to 10.": { - "description": "Description text on calendar filter screen.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You may only choose 10 calendars to display": "Du kan kun vælge at vise 10 kalendere", - "@You may only choose 10 calendars to display": { - "description": "Error text when trying to select more than 10 calendars", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You must select at least one calendar to display": "Du skal vælge mindst en kalender at vise", - "@You must select at least one calendar to display": { - "description": "Error text when trying to de-select all calendars", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Planner Note": "Planlægger - bemærkning", - "@Planner Note": { - "description": "Label used for notes in the planner", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Go to today": "Gå til I dag", - "@Go to today": { - "description": "Accessibility label used for the today button in the planner", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Previous Logins": "Tidligere logins", - "@Previous Logins": { - "description": "Label for the list of previous user logins", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "canvasLogoLabel": "Canvas-logo", - "@canvasLogoLabel": { - "description": "The semantics label for the Canvas logo", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "findSchool": "Find skole", - "@findSchool": { - "description": "Text for the find-my-school button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "findAnotherSchool": "Find en anden skole", - "@findAnotherSchool": { - "description": "Text for the find-another-school button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "domainSearchInputHint": "Indtast skolens navn eller distrikt ...", - "@domainSearchInputHint": { - "description": "Input hint for the text box on the domain search screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "noDomainResults": "Kan ikke finde skoler, der matcher \"{query}\"", - "@noDomainResults": { - "description": "Message shown to users when the domain search query did not return any results", - "type": "text", - "placeholders_order": [ - "query" - ], - "placeholders": { - "query": {} - } - }, - "domainSearchHelpLabel": "Hvordan finder jeg min skole eller distrikt?", - "@domainSearchHelpLabel": { - "description": "Label for the help button on the domain search screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "canvasGuides": "Canvas-vejledningerne", - "@canvasGuides": { - "description": "Proper name for the Canvas Guides. This will be used in the domainSearchHelpBody text and will be highlighted and clickable", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "canvasSupport": "Canvas-support", - "@canvasSupport": { - "description": "Proper name for Canvas Support. This will be used in the domainSearchHelpBody text and will be highlighted and clickable", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "domainSearchHelpBody": "Prøv at søge efter navnet på den skole eller det distrikt, du forsøger at få adgang til, fx “Smith Private School” eller “Smith County Schools.” Du kan også indtaste et Canvas-domæne direkte, som fx “smith.instructure.com.”\n\nFor mere information om hvordan du finder din institutions Canvas-konto, kan du besøge {canvasGuides}, kontakte {canvasSupport} eller kontakte din skole for at få hjælp.", - "@domainSearchHelpBody": { - "description": "The body text shown in the help dialog on the domain search screen", - "type": "text", - "placeholders_order": [ - "canvasGuides", - "canvasSupport" - ], - "placeholders": { - "canvasGuides": {}, - "canvasSupport": {} - } - }, - "Uh oh!": "Åh nej!", - "@Uh oh!": { - "description": "Title of the screen that shows when a crash has occurred", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "We’re not sure what happened, but it wasn’t good. Contact us if this keeps happening.": "Vi ved ikke helt, hvad der skete, men det var ikke godt. Kontakt os, hvis dette fortsætter.", - "@We’re not sure what happened, but it wasn’t good. Contact us if this keeps happening.": { - "description": "Message shown when a crash has occurred", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Contact Support": "Kontakt support", - "@Contact Support": { - "description": "Label for the button that allows users to contact support after a crash has occurred", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "View error details": "Vis fejldetaljer", - "@View error details": { - "description": "Label for the button that allowed users to view crash details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Restart app": "Genstart app", - "@Restart app": { - "description": "Label for the button that will restart the entire application", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Application version": "App-version", - "@Application version": { - "description": "Label for the application version displayed in the crash details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Device model": "Enhedsmodel", - "@Device model": { - "description": "Label for the device model displayed in the crash details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Android OS version": "Android OS-version", - "@Android OS version": { - "description": "Label for the Android operating system version displayed in the crash details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Full error message": "Hel fejlmeddelelse", - "@Full error message": { - "description": "Label for the full error message displayed in the crash details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Inbox": "Indbakke", - "@Inbox": { - "description": "Title for the Inbox screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading your inbox messages.": "Der opstod en fejl under indlæsning af beskederne i indbakken.", - "@There was an error loading your inbox messages.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Subject": "Intet emne", - "@No Subject": { - "description": "Title used for inbox messages that have no subject", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unable to fetch courses. Please check your connection and try again.": "Kan ikke hente fag. Kontrollér forbindelsen, og prøv igen.", - "@Unable to fetch courses. Please check your connection and try again.": { - "description": "Message shown when an error occured while loading courses", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Choose a course to message": "Vælg et fag at sende en meddelelse til", - "@Choose a course to message": { - "description": "Header in the course list shown when the user is choosing which course to associate with a new message", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Inbox Zero": "Indbakke nul", - "@Inbox Zero": { - "description": "Title of the message shown when there are no inbox messages", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You’re all caught up!": "Du har set det hele!", - "@You’re all caught up!": { - "description": "Subtitle of the message shown when there are no inbox messages", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading recipients for this course": "Der opstod en fejl under indlæsning af modtagere for dette fag", - "@There was an error loading recipients for this course": { - "description": "Message shown when attempting to create a new message but the recipients list failed to load", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unable to send message. Check your connection and try again.": "Kan ikke sende besked. Kontrollér forbindelsen, og prøv igen.", - "@Unable to send message. Check your connection and try again.": { - "description": "Message show when there was an error creating or sending a new message", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unsaved changes": "Ugemte ændringer", - "@Unsaved changes": { - "description": "Title of the dialog shown when the user tries to leave with unsaved changes", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Are you sure you wish to close this page? Your unsent message will be lost.": "Er du sikker på, at du vil lukke denne side? Din usendte besked vil gå tabt.", - "@Are you sure you wish to close this page? Your unsent message will be lost.": { - "description": "Body text of the dialog shown when the user tries leave with unsaved changes", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "New message": "Ny besked", - "@New message": { - "description": "Title of the new-message screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Add attachment": "Tilføj vedhæftet fil", - "@Add attachment": { - "description": "Tooltip for the add-attachment button in the new-message screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Send message": "Send besked", - "@Send message": { - "description": "Tooltip for the send-message button in the new-message screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Select recipients": "Vælg modtagere", - "@Select recipients": { - "description": "Tooltip for the button that allows users to select message recipients", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No recipients selected": "Ingen modtagere valgt", - "@No recipients selected": { - "description": "Hint displayed when the user has not selected any message recipients", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Message subject": "Beskedens emne", - "@Message subject": { - "description": "Hint text displayed in the input field for the message subject", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Message": "Besked", - "@Message": { - "description": "Hint text displayed in the input field for the message body", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Recipients": "Modtagere", - "@Recipients": { - "description": "Label for message recipients", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "plusRecipientCount": "+{count}", - "@plusRecipientCount": { - "description": "Shows the number of recipients that are selected but not displayed on screen.", - "type": "text", - "placeholders_order": [ - "count" - ], - "placeholders": { - "count": { - "example": 5 - } - } - }, - "Failed. Tap for options.": "Mislykkedes. Tryk for indstillinger.", - "@Failed. Tap for options.": { - "description": "Short message shown on a message attachment when uploading has failed", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "courseForWhom": "for {studentShortName}", - "@courseForWhom": { - "description": "Describes for whom a course is for (i.e. for Bill)", - "type": "text", - "placeholders_order": [ - "studentShortName" - ], - "placeholders": { - "studentShortName": {} - } - }, - "messageLinkPostscript": "Vedrørende: {studentName}, {linkUrl}", - "@messageLinkPostscript": { - "description": "A postscript appended to new messages that clarifies which student is the subject of the message and also includes a URL for the related Canvas component (course, assignment, event, etc).", - "type": "text", - "placeholders_order": [ - "studentName", - "linkUrl" - ], - "placeholders": { - "studentName": {}, - "linkUrl": {} - } - }, - "There was an error loading this conversation": "Der opstod en fejl under indlæsning af denne diskussion", - "@There was an error loading this conversation": { - "description": "Message shown when a conversation fails to load", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Reply": "Svar", - "@Reply": { - "description": "Button label for replying to a conversation", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Reply All": "Svar til alle", - "@Reply All": { - "description": "Button label for replying to all conversation participants", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unknown User": "Ukendt bruger", - "@Unknown User": { - "description": "Label used where the user name is not known", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "me": "mig", - "@me": { - "description": "First-person pronoun (i.e. 'me') that will be used in message author info, e.g. 'Me to 4 others' or 'Jon Snow to me'", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "authorToRecipient": "{authorName} til {recipientName}", - "@authorToRecipient": { - "description": "Author info for a single-recipient message; includes both the author name and the recipient name.", - "type": "text", - "placeholders_order": [ - "authorName", - "recipientName" - ], - "placeholders": { - "authorName": {}, - "recipientName": {} - } - }, - "authorToNOthers": "{howMany,plural, =1{{authorName} til 1 anden}other{{authorName} til {howMany} andre}}", - "@authorToNOthers": { - "description": "Author info for a mutli-recipient message; includes the author name and the number of recipients", - "type": "text", - "placeholders_order": [ - "authorName", - "howMany" - ], - "placeholders": { - "authorName": {}, - "howMany": {} - } - }, - "authorToRecipientAndNOthers": "{howMany,plural, =1{{authorName} til {recipientName} & 1 anden}other{{authorName} til {recipientName} & {howMany} andre}}", - "@authorToRecipientAndNOthers": { - "description": "Author info for a multi-recipient message; includes the author name, one recipient name, and the number of other recipients", - "type": "text", - "placeholders_order": [ - "authorName", - "recipientName", - "howMany" - ], - "placeholders": { - "authorName": {}, - "recipientName": {}, - "howMany": {} - } - }, - "Download": "Download", - "@Download": { - "description": "Label for the button that will begin downloading a file", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Open with another app": "Åbn med en anden app", - "@Open with another app": { - "description": "Label for the button that will allow users to open a file with another app", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There are no installed applications that can open this file": "Der er ingen installerede applikationer, der kan åbne denne fil", - "@There are no installed applications that can open this file": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unsupported File": "Ikke-understøttet fil", - "@Unsupported File": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "This file is unsupported and can’t be viewed through the app": "Denne fil understøttes ikke og kan ikke vises i appen", - "@This file is unsupported and can’t be viewed through the app": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unable to play this media file": "Denne mediefil kunne ikke afspilles", - "@Unable to play this media file": { - "description": "Message shown when audio or video media could not be played", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unable to load this image": "Kan ikke indlæse dette billede", - "@Unable to load this image": { - "description": "Message shown when an image file could not be loaded or displayed", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading this file": "Der opstod en fejl ved indlæsning af denne fil", - "@There was an error loading this file": { - "description": "Message shown when a file could not be loaded or displayed", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Courses": "Ingen fag", - "@No Courses": { - "description": "Title for having no courses", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Your student’s courses might not be published yet.": "Din elevs fag kan muligvis ikke offentliggøres endnu.", - "@Your student’s courses might not be published yet.": { - "description": "Message for having no courses", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading your student’s courses.": "Der opstod en fejl under indlæsning af elevens fag.", - "@There was an error loading your student’s courses.": { - "description": "Message displayed when the list of student courses could not be loaded", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Grade": "Ingen vurdering", - "@No Grade": { - "description": "Message shown when there is currently no grade available for a course", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Filter by": "Filtrere efter", - "@Filter by": { - "description": "Title for list of terms to filter grades by", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Grades": "Vurderinger", - "@Grades": { - "description": "Label for the \"Grades\" tab in course details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Syllabus": "Fagplan", - "@Syllabus": { - "description": "Label for the \"Syllabus\" tab in course details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Front Page": "Forside", - "@Front Page": { - "description": "Label for the \"Front Page\" tab in course details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Summary": "Sammendrag", - "@Summary": { - "description": "Label for the \"Summary\" tab in course details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Send a message about this course": "Send en besked om dette fag", - "@Send a message about this course": { - "description": "Accessibility hint for the course messaage floating action button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Total Grade": "Vurdering i alt", - "@Total Grade": { - "description": "Label for the total grade in the course", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Graded": "Bedømt", - "@Graded": { - "description": "Label for assignments that have been graded", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Submitted": "Afleveret", - "@Submitted": { - "description": "Label for assignments that have been submitted", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Not Submitted": "Ikke indsendt", - "@Not Submitted": { - "description": "Label for assignments that have not been submitted", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Late": "Sen", - "@Late": { - "description": "Label for assignments that have been marked late or submitted late", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Missing": "Mangler", - "@Missing": { - "description": "Label for assignments that have been marked missing or are not submitted and past the due date", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "-": "-", - "@-": { - "description": "Value representing no score for student submission", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "All Grading Periods": "Alle vurderingsperioder", - "@All Grading Periods": { - "description": "Label for selecting all grading periods", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Assignments": "Ingen opgaver", - "@No Assignments": { - "description": "Title for the no assignments message", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "It looks like assignments haven't been created in this space yet.": "Det ser ud til, at opgaver ikke er blevet oprettet i dette rum endnu.", - "@It looks like assignments haven't been created in this space yet.": { - "description": "Message for no assignments", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading the summary details for this course.": "Der opstod en fejl ved indlæsning af sammendragsoplysningerne for dette fag.", - "@There was an error loading the summary details for this course.": { - "description": "Message shown when the course summary could not be loaded", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Summary": "Intet sammendrag", - "@No Summary": { - "description": "Title displayed when there are no items in the course summary", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "This course does not have any assignments or calendar events yet.": "Dette fag har endnu ingen opgaver eller kalenderbegivenheder.", - "@This course does not have any assignments or calendar events yet.": { - "description": "Message displayed when there are no items in the course summary", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "gradeFormatScoreOutOfPointsPossible": "{score} / {pointsPossible}", - "@gradeFormatScoreOutOfPointsPossible": { - "description": "Formatted string for a student score out of the points possible", - "type": "text", - "placeholders_order": [ - "score", - "pointsPossible" - ], - "placeholders": { - "score": {}, - "pointsPossible": {} - } - }, - "contentDescriptionScoreOutOfPointsPossible": "{score} ud af {pointsPossible} point", - "@contentDescriptionScoreOutOfPointsPossible": { - "description": "Formatted string for a student score out of the points possible", - "type": "text", - "placeholders_order": [ - "score", - "pointsPossible" - ], - "placeholders": { - "score": {}, - "pointsPossible": {} - } - }, - "gradesSubjectMessage": "Vedrørende: {studentName}, Vurderinger", - "@gradesSubjectMessage": { - "description": "The subject line for a message to a teacher regarding a student's grades", - "type": "text", - "placeholders_order": [ - "studentName" - ], - "placeholders": { - "studentName": {} - } - }, - "syllabusSubjectMessage": "Vedrørende: {studentName}, Fagplan", - "@syllabusSubjectMessage": { - "description": "The subject line for a message to a teacher regarding a course syllabus", - "type": "text", - "placeholders_order": [ - "studentName" - ], - "placeholders": { - "studentName": {} - } - }, - "frontPageSubjectMessage": "Vedrørende: {studentName}, Forside", - "@frontPageSubjectMessage": { - "description": "The subject line for a message to a teacher regarding a course front page", - "type": "text", - "placeholders_order": [ - "studentName" - ], - "placeholders": { - "studentName": {} - } - }, - "assignmentSubjectMessage": "Vedrørende: {studentName}, Opgave - {assignmentName}", - "@assignmentSubjectMessage": { - "description": "The subject line for a message to a teacher regarding a student's assignment", - "type": "text", - "placeholders_order": [ - "studentName", - "assignmentName" - ], - "placeholders": { - "studentName": {}, - "assignmentName": {} - } - }, - "eventSubjectMessage": "Vedrørende: {studentName}, Begivenhed - {eventTitle}", - "@eventSubjectMessage": { - "description": "The subject line for a message to a teacher regarding a calendar event", - "type": "text", - "placeholders_order": [ - "studentName", - "eventTitle" - ], - "placeholders": { - "studentName": {}, - "eventTitle": {} - } - }, - "There is no page information available.": "Der er ingen tilgængelige sideinformationer.", - "@There is no page information available.": { - "description": "Description for when no page information is available", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Assignment Details": "Opgaveoplysninger", - "@Assignment Details": { - "description": "Title for the page that shows details for an assignment", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "assignmentTotalPoints": "{points} point", - "@assignmentTotalPoints": { - "description": "Label used for the total points the assignment is worth", - "type": "text", - "placeholders_order": [ - "points" - ], - "placeholders": { - "points": {} - } - }, - "assignmentTotalPointsAccessible": "{points} point", - "@assignmentTotalPointsAccessible": { - "description": "Screen reader label used for the total points the assignment is worth", - "type": "text", - "placeholders_order": [ - "points" - ], - "placeholders": { - "points": {} - } - }, - "Due": "Forfalder", - "@Due": { - "description": "Label for an assignment due date", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Grade": "Vurdering", - "@Grade": { - "description": "Label for the section that displays an assignment's grade", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Locked": "Låst", - "@Locked": { - "description": "Label for when an assignment is locked", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "assignmentLockedModule": "Denne opgave er låst af forløbet \"{moduleName}\".", - "@assignmentLockedModule": { - "description": "The locked description when an assignment is locked by a module", - "type": "text", - "placeholders_order": [ - "moduleName" - ], - "placeholders": { - "moduleName": {} - } - }, - "Remind Me": "Påmind mig", - "@Remind Me": { - "description": "Label for the row to set reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Set a date and time to be notified of this specific assignment.": "Indstil en dato og tid for at blive meddelt om denne specifikke opgave.", - "@Set a date and time to be notified of this specific assignment.": { - "description": "Description for row to set reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You will be notified about this assignment on…": "Du får besked om denne opgave den …", - "@You will be notified about this assignment on…": { - "description": "Description for when a reminder is set", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Instructions": "Instruktioner", - "@Instructions": { - "description": "Label for the description of the assignment when it has quiz instructions", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Send a message about this assignment": "Send en besked om denne opgave", - "@Send a message about this assignment": { - "description": "Accessibility hint for the assignment messaage floating action button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "This app is not authorized for use.": "Denne app er ikke autoriseret for brug.", - "@This app is not authorized for use.": { - "description": "The error shown when the app being used is not verified by Canvas", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The server you entered is not authorized for this app.": "Den server, du indtastede, er ikke autoriseret til denne app.", - "@The server you entered is not authorized for this app.": { - "description": "The error shown when the desired login domain is not verified by Canvas", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The user agent for this app is not authorized.": "Brugeragenten for denne app er ikke autoriseret.", - "@The user agent for this app is not authorized.": { - "description": "The error shown when the user agent during verification is not verified by Canvas", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "We were unable to verify the server for use with this app.": "Vi kunne ikke bekræfte serveren til brug med denne app.", - "@We were unable to verify the server for use with this app.": { - "description": "The generic error shown when we are unable to verify with Canvas", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Reminders": "Påmindelser", - "@Reminders": { - "description": "Name of the system notification channel for assignment and event reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Notifications for reminders about assignments and calendar events": "Meddelelser for påmindelser om opgaver og kalenderbegivenheder", - "@Notifications for reminders about assignments and calendar events": { - "description": "Description of the system notification channel for assignment and event reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Reminders have changed!": "Påmindelser er blevet ændret!", - "@Reminders have changed!": { - "description": "Title of the dialog shown when the user needs to update their reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "In order to provide you with a better experience, we have updated how reminders work. You can add new reminders by viewing an assignment or calendar event and tapping the switch under the \"Remind Me\" section.\n\nBe aware that any reminders created with older versions of this app will not be compatible with the new changes and you will need to create them again.": "For at give dig en bedre oplevelse har vi opdateret, hvordan påmindelser fungerer. Du kan tilføje nye påmindelser ved at se en opgave eller kalenderbegivenhed og trykke på kontakten i sektionen \"Påmind mig\".\n\nVær opmærksom på, at alle påmindelser oprettet med ældre versioner af denne app ikke vil være kompatible med de nye ændringer, og du derfor må oprette dem igen.", - "@In order to provide you with a better experience, we have updated how reminders work. You can add new reminders by viewing an assignment or calendar event and tapping the switch under the \"Remind Me\" section.\n\nBe aware that any reminders created with older versions of this app will not be compatible with the new changes and you will need to create them again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Not a parent?": "Ikke forælder?", - "@Not a parent?": { - "description": "Title for the screen that shows when the user is not observing any students", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "We couldn't find any students associated with this account": "Vi kunne ikke finde nogen elever tilknyttet den konto.", - "@We couldn't find any students associated with this account": { - "description": "Subtitle for the screen that shows when the user is not observing any students", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Are you a student or teacher?": "Er du elev eller lærer?", - "@Are you a student or teacher?": { - "description": "Label for button that will show users the option to view other Canvas apps in the Play Store", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "One of our other apps might be a better fit. Tap one to visit the Play Store.": "En af vores andre apps kan være bedre egnet. Tryk på et for at besøge Play Store.", - "@One of our other apps might be a better fit. Tap one to visit the Play Store.": { - "description": "Description of options to view other Canvas apps in the Play Store", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Return to Login": "Retur til login", - "@Return to Login": { - "description": "Label for the button that returns the user to the login screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "STUDENT": "ELEV", - "@STUDENT": { - "description": "The \"student\" portion of the \"Canvas Student\" app name, in all caps. \"Canvas\" is excluded in this context as it will be displayed to the user as a wordmark image", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "TEACHER": "LÆRER", - "@TEACHER": { - "description": "The \"teacher\" portion of the \"Canvas Teacher\" app name, in all caps. \"Canvas\" is excluded in this context as it will be displayed to the user as a wordmark image", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Canvas Student": "Canvas-elev", - "@Canvas Student": { - "description": "The name of the Canvas Student app. Only \"Student\" should be translated as \"Canvas\" is a brand name in this context and should not be translated.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Canvas Teacher": "Canvas Teacher", - "@Canvas Teacher": { - "description": "The name of the Canvas Teacher app. Only \"Teacher\" should be translated as \"Canvas\" is a brand name in this context and should not be translated.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Alerts": "Ingen varslinger", - "@No Alerts": { - "description": "The title for the empty message to show to users when there are no alerts for the student.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There’s nothing to be notified of yet.": "Der er intet at blive underrettet om endnu.", - "@There’s nothing to be notified of yet.": { - "description": "The empty message to show to users when there are no alerts for the student.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "dismissAlertLabel": "Afvis {alertTitle}", - "@dismissAlertLabel": { - "description": "Accessibility label to dismiss an alert", - "type": "text", - "placeholders_order": [ - "alertTitle" - ], - "placeholders": { - "alertTitle": {} - } - }, - "Course Announcement": "Besked til faget", - "@Course Announcement": { - "description": "Title for alerts when there is a course announcement", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Institution Announcement": "Besked til institutionen", - "@Institution Announcement": { - "description": "Title for alerts when there is an institution announcement", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "assignmentGradeAboveThreshold": "Opgavevurdering over {threshold}", - "@assignmentGradeAboveThreshold": { - "description": "Title for alerts when an assignment grade is above the threshold value", - "type": "text", - "placeholders_order": [ - "threshold" - ], - "placeholders": { - "threshold": {} - } - }, - "assignmentGradeBelowThreshold": "Opgavevurdering under {threshold}", - "@assignmentGradeBelowThreshold": { - "description": "Title for alerts when an assignment grade is below the threshold value", - "type": "text", - "placeholders_order": [ - "threshold" - ], - "placeholders": { - "threshold": {} - } - }, - "courseGradeAboveThreshold": "Fagvurdering oven {threshold}", - "@courseGradeAboveThreshold": { - "description": "Title for alerts when a course grade is above the threshold value", - "type": "text", - "placeholders_order": [ - "threshold" - ], - "placeholders": { - "threshold": {} - } - }, - "courseGradeBelowThreshold": "Fagvurdering under {threshold}", - "@courseGradeBelowThreshold": { - "description": "Title for alerts when a course grade is below the threshold value", - "type": "text", - "placeholders_order": [ - "threshold" - ], - "placeholders": { - "threshold": {} - } - }, - "Settings": "Indstillinger", - "@Settings": { - "description": "Title for the settings screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Theme": "Tema", - "@Theme": { - "description": "Label for the light/dark theme section in the settings page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Dark Mode": "Mørk tilstand", - "@Dark Mode": { - "description": "Label for the button that enables dark mode", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Light Mode": "Lys tilstand", - "@Light Mode": { - "description": "Label for the button that enables light mode", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "High Contrast Mode": "Høj kontrast-tilstand", - "@High Contrast Mode": { - "description": "Label for the switch that toggles high contrast mode", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Use Dark Theme in Web Content": "Brug mørkt tema i webindhold", - "@Use Dark Theme in Web Content": { - "description": "Label for the switch that toggles dark mode for webviews", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Appearance": "Udseende", - "@Appearance": { - "description": "Label for the appearance section in the settings page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Successfully submitted!": "Blev indsendt!", - "@Successfully submitted!": { - "description": "Title displayed in the grade cell for an assignment that has been submitted", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "submissionStatusSuccessSubtitle": "Denne opgave blev afleveret den {date} kl. {time} og venter på at blive bedømt", - "@submissionStatusSuccessSubtitle": { - "description": "Subtitle displayed in the grade cell for an assignment that has been submitted and is awaiting a grade", - "type": "text", - "placeholders_order": [ - "date", - "time" - ], - "placeholders": { - "date": {}, - "time": {} - } - }, - "outOfPoints": "{howMany,plural, =1{Ud af 1 point}other{Ud af {points} point}}", - "@outOfPoints": { - "description": "Description for an assignment grade that has points without a current scoroe", - "type": "text", - "placeholders_order": [ - "points", - "howMany" - ], - "placeholders": { - "points": {}, - "howMany": {} - } - }, - "Excused": "Undskyldt", - "@Excused": { - "description": "Grading status for an assignment marked as excused", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Complete": "Fuldført", - "@Complete": { - "description": "Grading status for an assignment marked as complete", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Incomplete": "Ufuldstændig", - "@Incomplete": { - "description": "Grading status for an assignment marked as incomplete", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "minus": "minus", - "@minus": { - "description": "Screen reader-friendly replacement for the \"-\" character in letter grades like \"A-\"", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "latePenalty": "Straf for sen aflevering (-{pointsLost})", - "@latePenalty": { - "description": "Text displayed when a late penalty has been applied to the assignment", - "type": "text", - "placeholders_order": [ - "pointsLost" - ], - "placeholders": { - "pointsLost": {} - } - }, - "finalGrade": "Endelig vurdering: {grade}", - "@finalGrade": { - "description": "Text that displays the final grade of an assignment", - "type": "text", - "placeholders_order": [ - "grade" - ], - "placeholders": { - "grade": {} - } - }, - "Alert Settings": "Varslingsindstillinger", - "@Alert Settings": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Alert me when…": "Send mig en varsling når ...", - "@Alert me when…": { - "description": "Header for the screen where the observer chooses the thresholds that will determine when they receive alerts (e.g. when an assignment is graded below 70%)", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Course grade below": "Fagvurdering under", - "@Course grade below": { - "description": "Label describing the threshold for when the course grade is below a certain percentage", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Course grade above": "Fagvurdering over", - "@Course grade above": { - "description": "Label describing the threshold for when the course grade is above a certain percentage", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Assignment missing": "Manglende opgave", - "@Assignment missing": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Assignment grade below": "Opgavevurdering under", - "@Assignment grade below": { - "description": "Label describing the threshold for when an assignment is graded below a certain percentage", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Assignment grade above": "Opgavevurdering over", - "@Assignment grade above": { - "description": "Label describing the threshold for when an assignment is graded above a certain percentage", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Course Announcements": "Fag-beskeder", - "@Course Announcements": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Institution Announcements": "Institutionsmeddelelser", - "@Institution Announcements": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Never": "Aldrig", - "@Never": { - "description": "Indication that tells the user they will not receive alert notifications of a specific kind", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Grade percentage": "Vurdering procent", - "@Grade percentage": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading your student's alerts.": "Der opstod en fejl under indlæsning af elevens varslinger.", - "@There was an error loading your student's alerts.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Must be below 100": "Skal være under 100", - "@Must be below 100": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "mustBeBelowN": "Skal være under {percentage}", - "@mustBeBelowN": { - "description": "Validation error to the user that they must choose a percentage below 'n'", - "type": "text", - "placeholders_order": [ - "percentage" - ], - "placeholders": { - "percentage": { - "example": 5 - } - } - }, - "mustBeAboveN": "Skal være over {percentage}", - "@mustBeAboveN": { - "description": "Validation error to the user that they must choose a percentage above 'n'", - "type": "text", - "placeholders_order": [ - "percentage" - ], - "placeholders": { - "percentage": { - "example": 5 - } - } - }, - "Select Student Color": "Vælg denne elev farve", - "@Select Student Color": { - "description": "Title for screen that allows users to assign a color to a specific student", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Electric, blue": "Elektrisk, blå", - "@Electric, blue": { - "description": "Name of the Electric (blue) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Plum, Purple": "Blomme, lilla", - "@Plum, Purple": { - "description": "Name of the Plum (purple) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Barney, Fuschia": "Barney, fuschia", - "@Barney, Fuschia": { - "description": "Name of the Barney (fuschia) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Raspberry, Red": "Hindbær, rød", - "@Raspberry, Red": { - "description": "Name of the Raspberry (red) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Fire, Orange": "Ild, orange", - "@Fire, Orange": { - "description": "Name of the Fire (orange) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Shamrock, Green": "Firkløver, grøn", - "@Shamrock, Green": { - "description": "Name of the Shamrock (green) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "An error occurred while saving your selection. Please try again.": "Der opstod en fejl, da du forsøgte at gemme dit valg. Prøv igen.", - "@An error occurred while saving your selection. Please try again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "changeStudentColorLabel": "Skift farve til {studentName}", - "@changeStudentColorLabel": { - "description": "Accessibility label for the button that lets users change the color associated with a specific student", - "type": "text", - "placeholders_order": [ - "studentName" - ], - "placeholders": { - "studentName": {} - } - }, - "Teacher": "Lærer", - "@Teacher": { - "description": "Label for the Teacher enrollment type", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Student": "Elev", - "@Student": { - "description": "Label for the Student enrollment type", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "TA": "Undervisningsassistent", - "@TA": { - "description": "Label for the Teaching Assistant enrollment type (also known as Teacher Aid or Education Assistant), reduced to a short acronym/initialism if appropriate.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Observer": "Observatør", - "@Observer": { - "description": "Label for the Observer enrollment type", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Use Camera": "Brug kamera", - "@Use Camera": { - "description": "Label for the action item that lets the user capture a photo using the device camera", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Upload File": "Overfør fil", - "@Upload File": { - "description": "Label for the action item that lets the user upload a file from their device", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Choose from Gallery": "Vælg fra galleri", - "@Choose from Gallery": { - "description": "Label for the action item that lets the user select a photo from their device gallery", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Preparing…": "Forbereder ...", - "@Preparing…": { - "description": "Message shown while a file is being prepared to attach to a message", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Add student with…": "Tilføj elev med ...", - "@Add student with…": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Add Student": "Tilføj elever", - "@Add Student": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You are not observing any students.": "Du observerer ikke nogen elever.", - "@You are not observing any students.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading your students.": "Der opstod en fejl under indlæsning af eleverne.", - "@There was an error loading your students.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Pairing Code": "Parringskode", - "@Pairing Code": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Students can obtain a pairing code through the Canvas website": "Elever kan få en parringskode via Canvas-webstedet", - "@Students can obtain a pairing code through the Canvas website": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Enter the student pairing code provided to you. If the pairing code doesn't work, it may have expired": "Indtast elevens parringskode, der er blevet givet til dig. Hvis parringskoden ikke fungerer, kan den være udløbet", - "@Enter the student pairing code provided to you. If the pairing code doesn't work, it may have expired": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Your code is incorrect or expired.": "Din kode er forkert eller udløbet.", - "@Your code is incorrect or expired.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Something went wrong trying to create your account, please reach out to your school for assistance.": "Noget gik galt ved oprettelse af din konto. Kontakt din skole for at få hjælp.", - "@Something went wrong trying to create your account, please reach out to your school for assistance.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "QR Code": "QR-kode", - "@QR Code": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Students can create a QR code using the Canvas Student app on their mobile device": "Elever kan oprette en QR-kode ved hjælp af Canvas-appen for elev på deres mobilenhed", - "@Students can create a QR code using the Canvas Student app on their mobile device": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Add new student": "Tilføj ny elev", - "@Add new student": { - "description": "Semantics label for the FAB on the Manage Students Screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Select": "Vælg", - "@Select": { - "description": "Hint text to tell the user to choose one of two options", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I have a Canvas account": "Jeg har en Canvas-konto", - "@I have a Canvas account": { - "description": "Option to select for users that have a canvas account", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I don't have a Canvas account": "Jeg har ikke en Canvas-konto", - "@I don't have a Canvas account": { - "description": "Option to select for users that don't have a canvas account", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Create Account": "Opret konto", - "@Create Account": { - "description": "Button text for account creation confirmation", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Full Name": "Fulde navn", - "@Full Name": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Email Address": "E-mail-adresse", - "@Email Address": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Password": "Adgangskode", - "@Password": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Full Name…": "Fulde navn ...", - "@Full Name…": { - "description": "hint label for inside form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Email…": "E-mail ...", - "@Email…": { - "description": "hint label for inside form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Password…": "Adgangskode ...", - "@Password…": { - "description": "hint label for inside form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Please enter full name": "Indtast det fulde navn", - "@Please enter full name": { - "description": "Error message for form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Please enter an email address": "Indtast en e-mailadresse", - "@Please enter an email address": { - "description": "Error message for form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Please enter a valid email address": "Indtast gyldig e-mailadresse", - "@Please enter a valid email address": { - "description": "Error message for form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Password is required": "Adgangskode er påkrævet", - "@Password is required": { - "description": "Error message for form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Password must contain at least 8 characters": "Adgangskode skal indeholde mindst 8 tegn", - "@Password must contain at least 8 characters": { - "description": "Error message for form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "qrCreateAccountTos": "Ved at trykke på 'Opret konto' accepterer jeg {termsOfService} og accepterer {privacyPolicy}.", - "@qrCreateAccountTos": { - "description": "The text show on the account creation screen", - "type": "text", - "placeholders_order": [ - "termsOfService", - "privacyPolicy" - ], - "placeholders": { - "termsOfService": {}, - "privacyPolicy": {} - } - }, - "Terms of Service": "Betingelser for service", - "@Terms of Service": { - "description": "Label for the Canvas Terms of Service agreement. This will be used in the qrCreateAccountTos text and will be highlighted and clickable", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Privacy Policy": "Datapolitik", - "@Privacy Policy": { - "description": "Label for the Canvas Privacy Policy agreement. This will be used in the qrCreateAccountTos text and will be highlighted and clickable", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "View the Privacy Policy": "Vis datapolitikken", - "@View the Privacy Policy": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Already have an account? ": "Har du allerede en konto? ", - "@Already have an account? ": { - "description": "Part of multiline text span, includes AccountSignIn1-2, in that order", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Sign In": "Log på", - "@Sign In": { - "description": "Part of multiline text span, includes AccountSignIn1-2, in that order", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Hide Password": "Skjul adgangskode", - "@Hide Password": { - "description": "content description for password hide button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Show Password": "Vis adgangskode", - "@Show Password": { - "description": "content description for password show button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Terms of Service Link": "Link til Betingelser for service", - "@Terms of Service Link": { - "description": "content description for terms of service link", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Privacy Policy Link": "Link til Datapolitik", - "@Privacy Policy Link": { - "description": "content description for privacy policy link", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Event": "Begivenhed", - "@Event": { - "description": "Title for the event details screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Date": "Dato", - "@Date": { - "description": "Label for the event date", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Location": "Placering", - "@Location": { - "description": "Label for the location information", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Location Specified": "Ingen lokation specificeret", - "@No Location Specified": { - "description": "Description for events that do not have a location", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "eventTime": "{startAt} - {endAt}", - "@eventTime": { - "description": "The time the event is happening, example: \"2:00 pm - 4:00 pm\"", - "type": "text", - "placeholders_order": [ - "startAt", - "endAt" - ], - "placeholders": { - "startAt": {}, - "endAt": {} - } - }, - "Set a date and time to be notified of this event.": "Indstil en dato og tid for, hvornår der skal meddeles om denne begivenhed.", - "@Set a date and time to be notified of this event.": { - "description": "Description for row to set event reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You will be notified about this event on…": "Du får besked om denne begivenhed den ...", - "@You will be notified about this event on…": { - "description": "Description for when an event reminder is set", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Share Your Love for the App": "Del din kærlighed for denne app", - "@Share Your Love for the App": { - "description": "Label for option to open the app store", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Tell us about your favorite parts of the app": "Fortæl os om, hvad du bedst kan lide af denne app", - "@Tell us about your favorite parts of the app": { - "description": "Description for option to open the app store", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Legal": "Juridisk", - "@Legal": { - "description": "Label for legal information option", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Privacy policy, terms of use, open source": "Fortrolighedspolitik, betingelser for brug, open source", - "@Privacy policy, terms of use, open source": { - "description": "Description for legal information option", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Idea for Canvas Parent App [Android]": "Ide for Canvas Parent App [Android]", - "@Idea for Canvas Parent App [Android]": { - "description": "The subject for the email to request a feature", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The following information will help us better understand your idea:": "Følgende oplysninger hjælper os med bedre at forstå din idé:", - "@The following information will help us better understand your idea:": { - "description": "The header for the users information that is attached to a feature request", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Domain:": "Domæne:", - "@Domain:": { - "description": "The label for the Canvas domain of the logged in user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "User ID:": "Bruger ID:", - "@User ID:": { - "description": "The label for the Canvas user ID of the logged in user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Email:": "E-mail:", - "@Email:": { - "description": "The label for the eamil of the logged in user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Locale:": "Sted:", - "@Locale:": { - "description": "The label for the locale of the logged in user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Terms of Use": "Betingelser for brug", - "@Terms of Use": { - "description": "Label for the terms of use", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Canvas on GitHub": "Canvas på GitHub", - "@Canvas on GitHub": { - "description": "Label for the button that opens the Canvas project on GitHub's website", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was a problem loading the Terms of Use": "Der opstod et problem ved indlæsning af Betingelser for brug", - "@There was a problem loading the Terms of Use": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Device": "Enhed", - "@Device": { - "description": "Label used for device manufacturer/model in the error report", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "OS Version": "OS-version", - "@OS Version": { - "description": "Label used for device operating system version in the error report", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Version Number": "Versionsnummer", - "@Version Number": { - "description": "Label used for the app version number in the error report", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Report A Problem": "Rapporter et problem", - "@Report A Problem": { - "description": "Title used for generic dialog to report problems", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Subject": "Emne", - "@Subject": { - "description": "Label used for Subject text field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "A subject is required.": "Der kræves et emne.", - "@A subject is required.": { - "description": "Error shown when the subject field is empty", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "An email address is required.": "Der kræves en e-mailadresse.", - "@An email address is required.": { - "description": "Error shown when the email field is empty", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Description": "Beskrivelse", - "@Description": { - "description": "Label used for Description text field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "A description is required.": "Der kræves en beskrivelse.", - "@A description is required.": { - "description": "Error shown when the description field is empty", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "How is this affecting you?": "Hvordan påvirker det dig?", - "@How is this affecting you?": { - "description": "Label used for the dropdown to select how severe the issue is", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "send": "send", - "@send": { - "description": "Label used for send button when reporting a problem", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Just a casual question, comment, idea, suggestion…": "Blot et simpelt spørgsmål, kommentar, ide, forslag...", - "@Just a casual question, comment, idea, suggestion…": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I need some help but it's not urgent.": "Jeg behøver hjælp, men det er ikke presserende.", - "@I need some help but it's not urgent.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Something's broken but I can work around it to get what I need done.": "Der er noget, der ikke virker, men jeg kan godt få det gjort, jeg skal gøre.", - "@Something's broken but I can work around it to get what I need done.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I can't get things done until I hear back from you.": "Jeg kan ikke fortsætte, før jeg har fået svar.", - "@I can't get things done until I hear back from you.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "EXTREME CRITICAL EMERGENCY!!": "EKSTREMT KRITISK NØDSTILFÆLDE!!", - "@EXTREME CRITICAL EMERGENCY!!": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Not Graded": "Ikke bedømt", - "@Not Graded": { - "description": "Description for an assignment has not been graded.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Login flow: Normal": "Login-flow: Normalt", - "@Login flow: Normal": { - "description": "Description for the normal login flow", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Login flow: Canvas": "Login-flow: Canvas", - "@Login flow: Canvas": { - "description": "Description for the Canvas login flow", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Login flow: Site Admin": "Login-flow: Websideadministrator", - "@Login flow: Site Admin": { - "description": "Description for the Site Admin login flow", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Login flow: Skip mobile verify": "Login-flow: Spring mobil bekræftelse over", - "@Login flow: Skip mobile verify": { - "description": "Description for the login flow that skips domain verification for mobile", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Act As User": "Funger som bruger", - "@Act As User": { - "description": "Label for the button that allows the user to act (masquerade) as another user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Stop Acting as User": "Hold op med at fungere som bruger", - "@Stop Acting as User": { - "description": "Label for the button that allows the user to stop acting (masquerading) as another user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "actingAsUser": "Du fungerer som {userName}", - "@actingAsUser": { - "description": "Message shown while acting (masquerading) as another user", - "type": "text", - "placeholders_order": [ - "userName" - ], - "placeholders": { - "userName": {} - } - }, - "\"Act as\" is essentially logging in as this user without a password. You will be able to take any action as if you were this user, and from other users' points of views, it will be as if this user performed them. However, audit logs record that you were the one who performed the actions on behalf of this user.": "\"Funger som\" betyder i bund og grund, at du logger ind som denne bruger uden adgangskode. Du kan foretage dig alt, som om du var denne bruger, og for andre brugere, er det lige som om, det var denne bruger, der gjorde det. Dog registrerer audit-logs, at det faktisk var dig, der udførte handlingerne på vegne af denne bruger.", - "@\"Act as\" is essentially logging in as this user without a password. You will be able to take any action as if you were this user, and from other users' points of views, it will be as if this user performed them. However, audit logs record that you were the one who performed the actions on behalf of this user.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Domain": "Domæne", - "@Domain": { - "description": "Text field hint for domain url input", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You must enter a valid domain": "Du skal indtaste et gyldigt domæne", - "@You must enter a valid domain": { - "description": "Message displayed for domain input error", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "User ID": "Bruger-id", - "@User ID": { - "description": "Text field hint for user ID input", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You must enter a user id": "Du skal indtaste et bruger-ID", - "@You must enter a user id": { - "description": "Message displayed for user Id input error", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error trying to act as this user. Please check the Domain and User ID and try again.": "Der opstod en fejl ved at fungere som denne bruger. Kontroller domænet og bruger-ID'et, og prøv igen.", - "@There was an error trying to act as this user. Please check the Domain and User ID and try again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "endMasqueradeMessage": "Du vil stoppe med at fungere som {userName} og vende tilbage til din originale konto.", - "@endMasqueradeMessage": { - "description": "Confirmation message displayed when the user wants to stop acting (masquerading) as another user", - "type": "text", - "placeholders_order": [ - "userName" - ], - "placeholders": { - "userName": {} - } - }, - "endMasqueradeLogoutMessage": "Du vil stoppe med at fungere som {userName} og bliver logget ud.", - "@endMasqueradeLogoutMessage": { - "description": "Confirmation message displayed when the user wants to stop acting (masquerading) as another user and will be logged out.", - "type": "text", - "placeholders_order": [ - "userName" - ], - "placeholders": { - "userName": {} - } - }, - "How are we doing?": "Hvordan klarer vi os?", - "@How are we doing?": { - "description": "Title for dialog asking user to rate the app out of 5 stars.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Don't show again": "Vis ikke igen", - "@Don't show again": { - "description": "Button to prevent the rating dialog from showing again.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "What can we do better?": "Hvad kan vi gøre bedre?", - "@What can we do better?": { - "description": "Hint text for providing a comment with the rating.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Send Feedback": "Send feedback", - "@Send Feedback": { - "description": "Button to send rating with feedback", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "ratingDialogEmailSubject": "Forslag til Android - Canvas Parent {version}", - "@ratingDialogEmailSubject": { - "description": "The subject for an email to provide feedback for CanvasParent.", - "type": "text", - "placeholders_order": [ - "version" - ], - "placeholders": { - "version": {} - } - }, - "starRating": "{position,plural, =1{{position} stjerne}other{{position} stjerner}}", - "@starRating": { - "description": "Accessibility label for the 1 stars to 5 stars rating", - "type": "text", - "placeholders_order": [ - "position" - ], - "placeholders": { - "position": { - "example": 1 - } - } - }, - "Student Pairing": "Parring af konti for elever", - "@Student Pairing": { - "description": "Title for the screen where users can pair to students using a QR code", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Open Canvas Student": "Åbn Canvas-appen for elev", - "@Open Canvas Student": { - "description": "Title for QR pairing tutorial screen instructing users to open the Canvas Student app", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You'll need to open your student's Canvas Student app to continue. Go into Main Menu > Settings > Pair with Observer and scan the QR code you see there.": "Du skal åbne elevens Åbn Canvas-appen for elev for at fortsætte. Gå til Hovedmenu > Indstillinger> Par med observatør, og scan den QR-kode, du ser der.", - "@You'll need to open your student's Canvas Student app to continue. Go into Main Menu > Settings > Pair with Observer and scan the QR code you see there.": { - "description": "Message explaining how QR code pairing works", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Screenshot showing location of pairing QR code generation in the Canvas Student app": "Skærmbillede, der viser placering af QR-koden i Åbn Canvas-appen for elev", - "@Screenshot showing location of pairing QR code generation in the Canvas Student app": { - "description": "Content Description for qr pairing tutorial screenshot", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Expired QR Code": "Udløbet QR-kode", - "@Expired QR Code": { - "description": "Error title shown when the users scans a QR code that has expired", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The QR code you scanned may have expired. Refresh the code on the student's device and try again.": "Den QR-kode, du scannede, kan være udløbet. Opdater koden på elevens enhed, og prøv igen.", - "@The QR code you scanned may have expired. Refresh the code on the student's device and try again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "A network error occurred when adding this student. Check your connection and try again.": "Der opstod en netværksfejl under dit forsøg på at tilføje denne elev. Kontrollér forbindelsen, og prøv igen.", - "@A network error occurred when adding this student. Check your connection and try again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Invalid QR Code": "Ugyldig QR-kode", - "@Invalid QR Code": { - "description": "Error title shown when the user scans an invalid QR code", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Incorrect Domain": "Forkert domæne", - "@Incorrect Domain": { - "description": "Error title shown when the users scane a QR code for a student that belongs to a different domain", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The student you are trying to add belongs to a different school. Log in or create an account with that school to scan this code.": "Den elev, du prøver at tilføje, tilhører en anden skole. Log ind eller opret en konto med denne skole for at scanne denne kode.", - "@The student you are trying to add belongs to a different school. Log in or create an account with that school to scan this code.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Camera Permission": "Kameratilladelse", - "@Camera Permission": { - "description": "Error title shown when the user wans to scan a QR code but has denied the camera permission", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "This will unpair and remove all enrollments for this student from your account.": "Dette vil fjerne parring og alle tilmeldinger for denne elev fra din konto.", - "@This will unpair and remove all enrollments for this student from your account.": { - "description": "Confirmation message shown when the user tries to delete a student from their account", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was a problem removing this student from your account. Please check your connection and try again.": "Der opstod et problem under forsøg på at fjerne denne elev fra din konto. Kontrollér forbindelsen, og prøv igen.", - "@There was a problem removing this student from your account. Please check your connection and try again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Cancel": "Annullér", - "@Cancel": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "next": "Næste", - "@next": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "ok": "OK", - "@ok": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Yes": "Ja", - "@Yes": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No": "Nej", - "@No": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Retry": "Prøv igen", - "@Retry": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Delete": "Slet", - "@Delete": { - "description": "Label used for general delete/remove actions", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Done": "Udført", - "@Done": { - "description": "Label for general done/finished actions", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Refresh": "Opdater", - "@Refresh": { - "description": "Label for button to refresh data from the web", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "View Description": "Vis beskrivelse", - "@View Description": { - "description": "Button to view the description for an event or assignment", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "expanded": "udvidet", - "@expanded": { - "description": "Description for the accessibility reader for list groups that are expanded", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "collapsed": "skjult", - "@collapsed": { - "description": "Description for the accessibility reader for list groups that are expanded", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "An unexpected error occurred": "Der opstod en uventet fejl", - "@An unexpected error occurred": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No description": "Ingen beskrivelse", - "@No description": { - "description": "Message used when the assignment has no description", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Launch External Tool": "Start eksternt værktøj", - "@Launch External Tool": { - "description": "Button text added to webviews to let users open external tools in their browser", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Interactions on this page are limited by your institution.": "Interaktioner på denne side er begrænset af din institution.", - "@Interactions on this page are limited by your institution.": { - "description": "Message describing how the webview has limited access due to an instution setting", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "dateAtTime": "{date} kl. {time}", - "@dateAtTime": { - "description": "The string to format dates", - "type": "text", - "placeholders_order": [ - "date", - "time" - ], - "placeholders": { - "date": {}, - "time": {} - } - }, - "dueDateAtTime": "Forfalder d. {date} kl. {time}", - "@dueDateAtTime": { - "description": "The string to format due dates", - "type": "text", - "placeholders_order": [ - "date", - "time" - ], - "placeholders": { - "date": {}, - "time": {} - } - }, - "No Due Date": "Ingen afleveringsdato", - "@No Due Date": { - "description": "Label for assignments that do not have a due date", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Filter": "Filter", - "@Filter": { - "description": "Label for buttons to filter what items are visible", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "unread": "ulæst", - "@unread": { - "description": "Label for things that are marked as unread", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "unreadCount": "{count} ulæst", - "@unreadCount": { - "description": "Formatted string for when there are a number of unread items", - "type": "text", - "placeholders_order": [ - "count" - ], - "placeholders": { - "count": {} - } - }, - "badgeNumberPlus": "{count}+", - "@badgeNumberPlus": { - "description": "Formatted string for when too many items are being notified in a badge, generally something like: 99+", - "type": "text", - "placeholders_order": [ - "count" - ], - "placeholders": { - "count": {} - } - }, - "There was an error loading this announcement": "Der opstod en fejl under indlæsning af denne besked", - "@There was an error loading this announcement": { - "description": "Message shown when an announcement detail screen fails to load", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Network error": "Netværksfejl", - "@Network error": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Under Construction": "Under opbygning", - "@Under Construction": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "We are currently building this feature for your viewing pleasure.": "Vi er i øjeblikket ved at bygge denne funktion.", - "@We are currently building this feature for your viewing pleasure.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Request Login Help Button": "Knap til anmodning om hjælp til login", - "@Request Login Help Button": { - "description": "Accessibility hint for button that opens help dialog for a login help request", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Request Login Help": "Anmod om hjælp til login", - "@Request Login Help": { - "description": "Title of help dialog for a login help request", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I'm having trouble logging in": "Jeg har problemer med at logge ind", - "@I'm having trouble logging in": { - "description": "Subject of help dialog for a login help request", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "An error occurred when trying to display this link": "Der opstod en fejl ved forsøg på at vise dette link", - "@An error occurred when trying to display this link": { - "description": "Error message shown when a link can't be opened", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "We are unable to display this link, it may belong to an institution you currently aren't logged in to.": "Vi kan ikke vise dette link, måske hører det til en institution, som du i øjeblikket ikke er logget ind på.", - "@We are unable to display this link, it may belong to an institution you currently aren't logged in to.": { - "description": "Description for error page shown when clicking a link", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Link Error": "Linkfejl", - "@Link Error": { - "description": "Title for error page shown when clicking a link", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Open In Browser": "Åbn i browser", - "@Open In Browser": { - "description": "Text for button to open a link in the browswer", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You'll find the QR code on the web in your account profile. Click 'QR for Mobile Login' in the list.": "Du finder QR-koden på nettet i din kontoprofil. Klik på 'QR for mobil login' på listen.", - "@You'll find the QR code on the web in your account profile. Click 'QR for Mobile Login' in the list.": { - "description": "Text for qr login tutorial screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Locate QR Code": "Find QR-kode", - "@Locate QR Code": { - "description": "Text for qr login button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Please scan a QR code generated by Canvas": "Scan en QR-kode genereret af Canvas", - "@Please scan a QR code generated by Canvas": { - "description": "Text for qr login error with incorrect qr code", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error logging in. Please generate another QR Code and try again.": "Der opstod en fejl ved indlogning. Generer en QR-kode til, og prøv igen.", - "@There was an error logging in. Please generate another QR Code and try again.": { - "description": "Text for qr login error", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Screenshot showing location of QR code generation in browser": "Skærmbillede, der viser placeringen af QR-kodegenerering i browseren", - "@Screenshot showing location of QR code generation in browser": { - "description": "Content Description for qr login tutorial screenshot", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "QR scanning requires camera access": "QR-scanning kræver kameraadgang", - "@QR scanning requires camera access": { - "description": "placeholder for camera error for QR code scan", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The linked item is no longer available": "Det linkede element er ikke længere tilgængeligt", - "@The linked item is no longer available": { - "description": "error message when the alert could no be opened", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Message sent": "Besked sendt", - "@Message sent": { - "description": "confirmation message on the screen when the user succesfully sends a message", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Acceptable Use Policy": "Acceptabel brugspolitik", - "@Acceptable Use Policy": { - "description": "title for the acceptable use policy screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Submit": "Aflever", - "@Submit": { - "description": "submit button title for acceptable use policy screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Either you're a new user or the Acceptable Use Policy has changed since you last agreed to it. Please agree to the Acceptable Use Policy before you continue.": "Enten er du en ny bruger, eller Betingelser for acceptabel brug er blevet ændret, siden du accepterede dem. Du bedes acceptere Betingelser for acceptabel brug, før du fortsætter.", - "@Either you're a new user or the Acceptable Use Policy has changed since you last agreed to it. Please agree to the Acceptable Use Policy before you continue.": { - "description": "acceptable use policy screen description", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I agree to the Acceptable Use Policy.": "Jeg accepterer betingelserne for acceptabel brug.", - "@I agree to the Acceptable Use Policy.": { - "description": "acceptable use policy switch title", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "About": "Om", - "@About": { - "description": "Title for about menu item in settings", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "App": "App", - "@App": { - "description": "Title for App field on about page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Login ID": "Login-id", - "@Login ID": { - "description": "Title for Login ID field on about page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Email": "E-mail", - "@Email": { - "description": "Title for Email field on about page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Version": "Version", - "@Version": { - "description": "Title for Version field on about page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Instructure logo": "Instructure-logo", - "@Instructure logo": { - "description": "Semantics label for the Instructure logo on the about page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - } -} \ No newline at end of file diff --git a/apps/flutter_parent/lib/l10n/res/intl_de.arb b/apps/flutter_parent/lib/l10n/res/intl_de.arb deleted file mode 100644 index a7a3052886..0000000000 --- a/apps/flutter_parent/lib/l10n/res/intl_de.arb +++ /dev/null @@ -1,2753 +0,0 @@ -{ - "@@last_modified": "2023-08-25T11:04:20.901151", - "alertsLabel": "Benachrichtigungen", - "@alertsLabel": { - "description": "The label for the Alerts tab", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "calendarLabel": "Kalender", - "@calendarLabel": { - "description": "The label for the Calendar tab", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "coursesLabel": "Kurse", - "@coursesLabel": { - "description": "The label for the Courses tab", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Students": "Keine Studierende", - "@No Students": { - "description": "Text for when an observer has no students they are observing", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Tap to show student selector": "Zum Anzeigen des Studierendenwählers antippen", - "@Tap to show student selector": { - "description": "Semantics label for the area that will show the student selector when tapped", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Tap to pair with a new student": "Zum Koppeln mit einer/einem neuen Studierenden antippen", - "@Tap to pair with a new student": { - "description": "Semantics label for the add student button in the student selector", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Tap to select this student": "Zum Auswählen dieser/dieses Studierenden antippen", - "@Tap to select this student": { - "description": "Semantics label on individual students in the student switcher", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Manage Students": "Studierende verwalten", - "@Manage Students": { - "description": "Label text for the Manage Students nav drawer button as well as the title for the Manage Students screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Help": "Hilfe", - "@Help": { - "description": "Label text for the help nav drawer button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Log Out": "Abmelden", - "@Log Out": { - "description": "Label text for the Log Out nav drawer button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Switch Users": "Benutzer*innen wechseln", - "@Switch Users": { - "description": "Label text for the Switch Users nav drawer button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "appVersion": "v. {version}", - "@appVersion": { - "description": "App version shown in the navigation drawer", - "type": "text", - "placeholders_order": [ - "version" - ], - "placeholders": { - "version": {} - } - }, - "Are you sure you want to log out?": "Möchten Sie sich wirklich abmelden?", - "@Are you sure you want to log out?": { - "description": "Confirmation message displayed when the user tries to log out", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Calendars": "Kalender", - "@Calendars": { - "description": "Label for button that lets users select which calendars to display", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "nextMonth": "Nächster Monat: {month}", - "@nextMonth": { - "description": "Label for the button that switches the calendar to the next month", - "type": "text", - "placeholders_order": [ - "month" - ], - "placeholders": { - "month": {} - } - }, - "previousMonth": "Vorheriger Monat: {month}", - "@previousMonth": { - "description": "Label for the button that switches the calendar to the previous month", - "type": "text", - "placeholders_order": [ - "month" - ], - "placeholders": { - "month": {} - } - }, - "nextWeek": "Nächste Woche, beginnend am {date}", - "@nextWeek": { - "description": "Label for the button that switches the calendar to the next week", - "type": "text", - "placeholders_order": [ - "date" - ], - "placeholders": { - "date": {} - } - }, - "previousWeek": "Vorherige Woche, beginnend am {date}", - "@previousWeek": { - "description": "Label for the button that switches the calendar to the previous week", - "type": "text", - "placeholders_order": [ - "date" - ], - "placeholders": { - "date": {} - } - }, - "selectedMonthLabel": "Monat {month}", - "@selectedMonthLabel": { - "description": "Accessibility label for the button that expands/collapses the month view", - "type": "text", - "placeholders_order": [ - "month" - ], - "placeholders": { - "month": {} - } - }, - "expand": "erweitern", - "@expand": { - "description": "Accessibility label for the on-tap hint for the button that expands/collapses the month view", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "collapse": "reduzieren", - "@collapse": { - "description": "Accessibility label for the on-tap hint for the button that expands/collapses the month view", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "pointsPossible": "{points} Punkte möglich", - "@pointsPossible": { - "description": "Screen reader label used for the points possible for an assignment, quiz, etc.", - "type": "text", - "placeholders_order": [ - "points" - ], - "placeholders": { - "points": {} - } - }, - "calendarDaySemanticsLabel": "{eventCount,plural, =1{{date}, {eventCount} Ereignis}other{{date}, {eventCount} Ereignisse}}", - "@calendarDaySemanticsLabel": { - "description": "Screen reader label used for calendar day, reads the date and count of events", - "type": "text", - "placeholders_order": [ - "date", - "eventCount" - ], - "placeholders": { - "date": {}, - "eventCount": {} - } - }, - "No Events Today!": "Heute keine Ereignisse!", - "@No Events Today!": { - "description": "Title displayed when there are no calendar events for the current day", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "It looks like a great day to rest, relax, and recharge.": "Scheinbar ein großartiger Tag für Ruhe, Entspannung und Energie tanken..", - "@It looks like a great day to rest, relax, and recharge.": { - "description": "Message displayed when there are no calendar events for the current day", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading your student's calendar": "Fehler beim Laden Ihres Studierendenkalenders", - "@There was an error loading your student's calendar": { - "description": "Message displayed when calendar events could not be loaded for the current student", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Tap to favorite the courses you want to see on the Calendar. Select up to 10.": "Tippen Sie, um die Kurse, die Sie im Kalender sehen möchten, in die Favoritenliste aufzunehmen. Wählen Sie bis zu 10", - "@Tap to favorite the courses you want to see on the Calendar. Select up to 10.": { - "description": "Description text on calendar filter screen.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You may only choose 10 calendars to display": "Sie dürfen nur max. 10 Kalender für die Anzeige auswählen", - "@You may only choose 10 calendars to display": { - "description": "Error text when trying to select more than 10 calendars", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You must select at least one calendar to display": "Sie müssen mindestens einen Kalender anzeigen", - "@You must select at least one calendar to display": { - "description": "Error text when trying to de-select all calendars", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Planner Note": "Planerhinweis", - "@Planner Note": { - "description": "Label used for notes in the planner", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Go to today": "Zu „heute“ gehen", - "@Go to today": { - "description": "Accessibility label used for the today button in the planner", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Previous Logins": "Frühere Anmeldungen", - "@Previous Logins": { - "description": "Label for the list of previous user logins", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "canvasLogoLabel": "Canvas-Logo", - "@canvasLogoLabel": { - "description": "The semantics label for the Canvas logo", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "findSchool": "Schule suchen", - "@findSchool": { - "description": "Text for the find-my-school button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "findAnotherSchool": "Eine andere Schule finden", - "@findAnotherSchool": { - "description": "Text for the find-another-school button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "domainSearchInputHint": "Schulnamen oder Bezirk eingeben …", - "@domainSearchInputHint": { - "description": "Input hint for the text box on the domain search screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "noDomainResults": "Es konnte keine mit „{query}“ übereinstimmende Schule gefunden werden", - "@noDomainResults": { - "description": "Message shown to users when the domain search query did not return any results", - "type": "text", - "placeholders_order": [ - "query" - ], - "placeholders": { - "query": {} - } - }, - "domainSearchHelpLabel": "Wie finde ich meine Schule oder meinen Bezirk?", - "@domainSearchHelpLabel": { - "description": "Label for the help button on the domain search screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "canvasGuides": "Canvas-Leitfäden", - "@canvasGuides": { - "description": "Proper name for the Canvas Guides. This will be used in the domainSearchHelpBody text and will be highlighted and clickable", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "canvasSupport": "Canvas-Support", - "@canvasSupport": { - "description": "Proper name for Canvas Support. This will be used in the domainSearchHelpBody text and will be highlighted and clickable", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "domainSearchHelpBody": "Suchen Sie den Namen der Schule oder des Bezirks, z. B. „Private Kant-Schule“ oder „Goethe-Gymnasium“. Sie können auch direkt eine Canvas-Domäne eingeben, z. B. „kant.instructure.com“.\n\nUm weitere Informationen zum Auffinden des Canvas-Kontos Ihrer Institution zu erhalten, nutzen Sie die {canvasGuides}, wenden Sie sich an den {canvasSupport} oder an Ihre Schule.", - "@domainSearchHelpBody": { - "description": "The body text shown in the help dialog on the domain search screen", - "type": "text", - "placeholders_order": [ - "canvasGuides", - "canvasSupport" - ], - "placeholders": { - "canvasGuides": {}, - "canvasSupport": {} - } - }, - "Uh oh!": "Oh je!", - "@Uh oh!": { - "description": "Title of the screen that shows when a crash has occurred", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "We’re not sure what happened, but it wasn’t good. Contact us if this keeps happening.": "Wir sind nicht sicher, was passiert ist, aber es war nicht gut. Kontaktieren Sie uns, falls dies wieder passiert.", - "@We’re not sure what happened, but it wasn’t good. Contact us if this keeps happening.": { - "description": "Message shown when a crash has occurred", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Contact Support": "Den Support kontaktieren", - "@Contact Support": { - "description": "Label for the button that allows users to contact support after a crash has occurred", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "View error details": "Fehlerdetails anzeigen", - "@View error details": { - "description": "Label for the button that allowed users to view crash details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Restart app": "Anwendung neustarten", - "@Restart app": { - "description": "Label for the button that will restart the entire application", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Application version": "Anwendungsversion", - "@Application version": { - "description": "Label for the application version displayed in the crash details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Device model": "Gerätemodell", - "@Device model": { - "description": "Label for the device model displayed in the crash details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Android OS version": "Android OS-Version", - "@Android OS version": { - "description": "Label for the Android operating system version displayed in the crash details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Full error message": "Vollständige Fehlermeldung", - "@Full error message": { - "description": "Label for the full error message displayed in the crash details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Inbox": "Posteingang", - "@Inbox": { - "description": "Title for the Inbox screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading your inbox messages.": "Fehler beim Laden Ihrer Posteingangsmeldungen.", - "@There was an error loading your inbox messages.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Subject": "Kein Betreff", - "@No Subject": { - "description": "Title used for inbox messages that have no subject", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unable to fetch courses. Please check your connection and try again.": "Kurse konnten nicht abgerufen werden. Bitte überprüfen Sie Ihre Verbindung, und versuchen Sie es erneut.", - "@Unable to fetch courses. Please check your connection and try again.": { - "description": "Message shown when an error occured while loading courses", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Choose a course to message": "Einen Kurs zur Benachrichtigung wählen", - "@Choose a course to message": { - "description": "Header in the course list shown when the user is choosing which course to associate with a new message", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Inbox Zero": "Posteingang Zero", - "@Inbox Zero": { - "description": "Title of the message shown when there are no inbox messages", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You’re all caught up!": "Sie werden alle erfasst!", - "@You’re all caught up!": { - "description": "Subtitle of the message shown when there are no inbox messages", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading recipients for this course": "Beim Laden der Empfänger für diesen Kurs ist ein Fehler aufgetreten", - "@There was an error loading recipients for this course": { - "description": "Message shown when attempting to create a new message but the recipients list failed to load", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unable to send message. Check your connection and try again.": "Die Nachricht kann nicht gesendet werden. Überprüfen Sie Ihre Verbindung, und versuchen Sie es erneut.", - "@Unable to send message. Check your connection and try again.": { - "description": "Message show when there was an error creating or sending a new message", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unsaved changes": "Nicht gespeicherte Änderungen", - "@Unsaved changes": { - "description": "Title of the dialog shown when the user tries to leave with unsaved changes", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Are you sure you wish to close this page? Your unsent message will be lost.": "Möchten Sie diese Seite wirklich schließen? Die nicht gesendete Nachricht geht verloren.", - "@Are you sure you wish to close this page? Your unsent message will be lost.": { - "description": "Body text of the dialog shown when the user tries leave with unsaved changes", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "New message": "Neue Nachricht", - "@New message": { - "description": "Title of the new-message screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Add attachment": "Anhang hinzufügen", - "@Add attachment": { - "description": "Tooltip for the add-attachment button in the new-message screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Send message": "Nachricht senden", - "@Send message": { - "description": "Tooltip for the send-message button in the new-message screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Select recipients": "Empfänger auswählen", - "@Select recipients": { - "description": "Tooltip for the button that allows users to select message recipients", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No recipients selected": "Es wurden keine Empfänger ausgewählt", - "@No recipients selected": { - "description": "Hint displayed when the user has not selected any message recipients", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Message subject": "Betreff der Nachricht", - "@Message subject": { - "description": "Hint text displayed in the input field for the message subject", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Message": "Nachricht", - "@Message": { - "description": "Hint text displayed in the input field for the message body", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Recipients": "Empfänger", - "@Recipients": { - "description": "Label for message recipients", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "plusRecipientCount": "+{count}", - "@plusRecipientCount": { - "description": "Shows the number of recipients that are selected but not displayed on screen.", - "type": "text", - "placeholders_order": [ - "count" - ], - "placeholders": { - "count": { - "example": 5 - } - } - }, - "Failed. Tap for options.": "Fehlgeschlagen. Für Optionen antippen.", - "@Failed. Tap for options.": { - "description": "Short message shown on a message attachment when uploading has failed", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "courseForWhom": "für {studentShortName}", - "@courseForWhom": { - "description": "Describes for whom a course is for (i.e. for Bill)", - "type": "text", - "placeholders_order": [ - "studentShortName" - ], - "placeholders": { - "studentShortName": {} - } - }, - "messageLinkPostscript": "Betreffend: {studentName}, {linkUrl}", - "@messageLinkPostscript": { - "description": "A postscript appended to new messages that clarifies which student is the subject of the message and also includes a URL for the related Canvas component (course, assignment, event, etc).", - "type": "text", - "placeholders_order": [ - "studentName", - "linkUrl" - ], - "placeholders": { - "studentName": {}, - "linkUrl": {} - } - }, - "There was an error loading this conversation": "Beim Laden dieses Gesprächs ist ein Fehler aufgetreten", - "@There was an error loading this conversation": { - "description": "Message shown when a conversation fails to load", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Reply": "Antworten", - "@Reply": { - "description": "Button label for replying to a conversation", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Reply All": "Allen antworten", - "@Reply All": { - "description": "Button label for replying to all conversation participants", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unknown User": "Unbekannte/r Benutzer*in", - "@Unknown User": { - "description": "Label used where the user name is not known", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "me": "Ich", - "@me": { - "description": "First-person pronoun (i.e. 'me') that will be used in message author info, e.g. 'Me to 4 others' or 'Jon Snow to me'", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "authorToRecipient": "{authorName} bis {recipientName}", - "@authorToRecipient": { - "description": "Author info for a single-recipient message; includes both the author name and the recipient name.", - "type": "text", - "placeholders_order": [ - "authorName", - "recipientName" - ], - "placeholders": { - "authorName": {}, - "recipientName": {} - } - }, - "authorToNOthers": "{howMany,plural, =1{{authorName} zu 1 anderen}other{{authorName} zu {howMany} anderen}}", - "@authorToNOthers": { - "description": "Author info for a mutli-recipient message; includes the author name and the number of recipients", - "type": "text", - "placeholders_order": [ - "authorName", - "howMany" - ], - "placeholders": { - "authorName": {}, - "howMany": {} - } - }, - "authorToRecipientAndNOthers": "{howMany,plural, =1{{authorName} zu {recipientName} & 1 anderen}other{{authorName} zu {recipientName} & {howMany} anderen}}", - "@authorToRecipientAndNOthers": { - "description": "Author info for a multi-recipient message; includes the author name, one recipient name, and the number of other recipients", - "type": "text", - "placeholders_order": [ - "authorName", - "recipientName", - "howMany" - ], - "placeholders": { - "authorName": {}, - "recipientName": {}, - "howMany": {} - } - }, - "Download": "Herunterladen", - "@Download": { - "description": "Label for the button that will begin downloading a file", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Open with another app": "Mit einer anderen Anwendung öffnen", - "@Open with another app": { - "description": "Label for the button that will allow users to open a file with another app", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There are no installed applications that can open this file": "Diese Datei kann mit keiner installierten Anwendung geöffnet werden", - "@There are no installed applications that can open this file": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unsupported File": "Nicht unterstützte Datei", - "@Unsupported File": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "This file is unsupported and can’t be viewed through the app": "Diese Datei wird nicht unterstützt und kann mit der App nicht angezeigt werden", - "@This file is unsupported and can’t be viewed through the app": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unable to play this media file": "Diese Mediendatei kann nicht wiedergegeben werden", - "@Unable to play this media file": { - "description": "Message shown when audio or video media could not be played", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unable to load this image": "Dieses Bild kann nicht geladen werden", - "@Unable to load this image": { - "description": "Message shown when an image file could not be loaded or displayed", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading this file": "Beim Laden dieser Datei ist ein Fehler aufgetreten", - "@There was an error loading this file": { - "description": "Message shown when a file could not be loaded or displayed", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Courses": "Keine Kurse", - "@No Courses": { - "description": "Title for having no courses", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Your student’s courses might not be published yet.": "Die Kurse sind möglicherweise noch nicht veröffentlicht.", - "@Your student’s courses might not be published yet.": { - "description": "Message for having no courses", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading your student’s courses.": "Fehler beim Laden der Kurse Ihres Studierenden.", - "@There was an error loading your student’s courses.": { - "description": "Message displayed when the list of student courses could not be loaded", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Grade": "Keine Note", - "@No Grade": { - "description": "Message shown when there is currently no grade available for a course", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Filter by": "Filtern nach", - "@Filter by": { - "description": "Title for list of terms to filter grades by", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Grades": "Noten", - "@Grades": { - "description": "Label for the \"Grades\" tab in course details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Syllabus": "Kursplan", - "@Syllabus": { - "description": "Label for the \"Syllabus\" tab in course details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Front Page": "Frontseite", - "@Front Page": { - "description": "Label for the \"Front Page\" tab in course details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Summary": "Übersicht", - "@Summary": { - "description": "Label for the \"Summary\" tab in course details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Send a message about this course": "Nachricht über diesen Kurs senden", - "@Send a message about this course": { - "description": "Accessibility hint for the course messaage floating action button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Total Grade": "Endnote", - "@Total Grade": { - "description": "Label for the total grade in the course", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Graded": "Benotet", - "@Graded": { - "description": "Label for assignments that have been graded", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Submitted": "Abgegeben", - "@Submitted": { - "description": "Label for assignments that have been submitted", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Not Submitted": "Nicht abgegeben", - "@Not Submitted": { - "description": "Label for assignments that have not been submitted", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Late": "Verspätet", - "@Late": { - "description": "Label for assignments that have been marked late or submitted late", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Missing": "Fehlt", - "@Missing": { - "description": "Label for assignments that have been marked missing or are not submitted and past the due date", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "-": "-", - "@-": { - "description": "Value representing no score for student submission", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "All Grading Periods": "Alle Benotungszeiträume", - "@All Grading Periods": { - "description": "Label for selecting all grading periods", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Assignments": "Keine Aufgaben", - "@No Assignments": { - "description": "Title for the no assignments message", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "It looks like assignments haven't been created in this space yet.": "Wie es aussieht, wurden in diesem Raum noch keine Aufgaben erstellt.", - "@It looks like assignments haven't been created in this space yet.": { - "description": "Message for no assignments", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading the summary details for this course.": "Beim Laden der Übersichtsdetails für diesen Kurs ist ein Fehler aufgetreten.", - "@There was an error loading the summary details for this course.": { - "description": "Message shown when the course summary could not be loaded", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Summary": "Keine Übersicht", - "@No Summary": { - "description": "Title displayed when there are no items in the course summary", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "This course does not have any assignments or calendar events yet.": "Für diesen Kurs gibt es noch keine Aufgaben oder Kalenderereignisse.", - "@This course does not have any assignments or calendar events yet.": { - "description": "Message displayed when there are no items in the course summary", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "gradeFormatScoreOutOfPointsPossible": "{score} / {pointsPossible}", - "@gradeFormatScoreOutOfPointsPossible": { - "description": "Formatted string for a student score out of the points possible", - "type": "text", - "placeholders_order": [ - "score", - "pointsPossible" - ], - "placeholders": { - "score": {}, - "pointsPossible": {} - } - }, - "contentDescriptionScoreOutOfPointsPossible": "{score} von {pointsPossible} Punkten", - "@contentDescriptionScoreOutOfPointsPossible": { - "description": "Formatted string for a student score out of the points possible", - "type": "text", - "placeholders_order": [ - "score", - "pointsPossible" - ], - "placeholders": { - "score": {}, - "pointsPossible": {} - } - }, - "gradesSubjectMessage": "Betreffend: {studentName}, Noten", - "@gradesSubjectMessage": { - "description": "The subject line for a message to a teacher regarding a student's grades", - "type": "text", - "placeholders_order": [ - "studentName" - ], - "placeholders": { - "studentName": {} - } - }, - "syllabusSubjectMessage": "Betreffend: {studentName}, Kursplan", - "@syllabusSubjectMessage": { - "description": "The subject line for a message to a teacher regarding a course syllabus", - "type": "text", - "placeholders_order": [ - "studentName" - ], - "placeholders": { - "studentName": {} - } - }, - "frontPageSubjectMessage": "Betreffend: {studentName}, Frontseite", - "@frontPageSubjectMessage": { - "description": "The subject line for a message to a teacher regarding a course front page", - "type": "text", - "placeholders_order": [ - "studentName" - ], - "placeholders": { - "studentName": {} - } - }, - "assignmentSubjectMessage": "Betreffend: {studentName}, Aufgabe – {assignmentName}", - "@assignmentSubjectMessage": { - "description": "The subject line for a message to a teacher regarding a student's assignment", - "type": "text", - "placeholders_order": [ - "studentName", - "assignmentName" - ], - "placeholders": { - "studentName": {}, - "assignmentName": {} - } - }, - "eventSubjectMessage": "Betreffend: {studentName}, Ereignis – {eventTitle}", - "@eventSubjectMessage": { - "description": "The subject line for a message to a teacher regarding a calendar event", - "type": "text", - "placeholders_order": [ - "studentName", - "eventTitle" - ], - "placeholders": { - "studentName": {}, - "eventTitle": {} - } - }, - "There is no page information available.": "Es steht keine Seiteninformation zur Verfügung.", - "@There is no page information available.": { - "description": "Description for when no page information is available", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Assignment Details": "Aufgabendetails", - "@Assignment Details": { - "description": "Title for the page that shows details for an assignment", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "assignmentTotalPoints": "{points} Pkte.", - "@assignmentTotalPoints": { - "description": "Label used for the total points the assignment is worth", - "type": "text", - "placeholders_order": [ - "points" - ], - "placeholders": { - "points": {} - } - }, - "assignmentTotalPointsAccessible": "{points} Punkte", - "@assignmentTotalPointsAccessible": { - "description": "Screen reader label used for the total points the assignment is worth", - "type": "text", - "placeholders_order": [ - "points" - ], - "placeholders": { - "points": {} - } - }, - "Due": "Fällig", - "@Due": { - "description": "Label for an assignment due date", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Grade": "Note", - "@Grade": { - "description": "Label for the section that displays an assignment's grade", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Locked": "Gesperrt", - "@Locked": { - "description": "Label for when an assignment is locked", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "assignmentLockedModule": "Diese Aufgabe wird durch das Modul „{moduleName}“ gesperrt.", - "@assignmentLockedModule": { - "description": "The locked description when an assignment is locked by a module", - "type": "text", - "placeholders_order": [ - "moduleName" - ], - "placeholders": { - "moduleName": {} - } - }, - "Remind Me": "Erinnerung", - "@Remind Me": { - "description": "Label for the row to set reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Set a date and time to be notified of this specific assignment.": "Datum und Uhrzeit für die Benachrichtigung über diese spezifische Aufgabe einstellen.", - "@Set a date and time to be notified of this specific assignment.": { - "description": "Description for row to set reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You will be notified about this assignment on…": "Sie werden über diese Aufgabe benachrichtigt am …", - "@You will be notified about this assignment on…": { - "description": "Description for when a reminder is set", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Instructions": "Anleitungen", - "@Instructions": { - "description": "Label for the description of the assignment when it has quiz instructions", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Send a message about this assignment": "Nachricht über diese Aufgabe senden", - "@Send a message about this assignment": { - "description": "Accessibility hint for the assignment messaage floating action button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "This app is not authorized for use.": "Keine Autorisierung, um diese App zu verwenden.", - "@This app is not authorized for use.": { - "description": "The error shown when the app being used is not verified by Canvas", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The server you entered is not authorized for this app.": "Der Server, den Sie eingegeben haben, hat keine Berechtigung für diese App.", - "@The server you entered is not authorized for this app.": { - "description": "The error shown when the desired login domain is not verified by Canvas", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The user agent for this app is not authorized.": "Der Benutzeragent für diese App hat keine Berechtigung.", - "@The user agent for this app is not authorized.": { - "description": "The error shown when the user agent during verification is not verified by Canvas", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "We were unable to verify the server for use with this app.": "Der Server konnte für die Verwendung mit dieser App nicht verifiziert werden.", - "@We were unable to verify the server for use with this app.": { - "description": "The generic error shown when we are unable to verify with Canvas", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Reminders": "Erinnerungen", - "@Reminders": { - "description": "Name of the system notification channel for assignment and event reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Notifications for reminders about assignments and calendar events": "Benachrichtigungen zu Erinnerungen über Zuweisungen und Kalenderereignisse", - "@Notifications for reminders about assignments and calendar events": { - "description": "Description of the system notification channel for assignment and event reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Reminders have changed!": "Erinnerungen haben sich geändert!", - "@Reminders have changed!": { - "description": "Title of the dialog shown when the user needs to update their reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "In order to provide you with a better experience, we have updated how reminders work. You can add new reminders by viewing an assignment or calendar event and tapping the switch under the \"Remind Me\" section.\n\nBe aware that any reminders created with older versions of this app will not be compatible with the new changes and you will need to create them again.": "Um Ihnen ein besseres Erlebnis zu bieten, haben wir die Funktionsweise von Erinnerungen aktualisiert. Sie können neue Erinnerungen hinzufügen, indem Sie sich eine Aufgabe oder ein Kalenderereignis ansehen und auf den Schalter unter dem Abschnitt „Mich erinnern“ tippen.\n\nBeachten Sie, dass alle Erinnerungen, die mit älteren Versionen dieser App erstellt wurden, nicht mit den neuen Änderungen kompatibel sind und neu erstellt werden müssen.", - "@In order to provide you with a better experience, we have updated how reminders work. You can add new reminders by viewing an assignment or calendar event and tapping the switch under the \"Remind Me\" section.\n\nBe aware that any reminders created with older versions of this app will not be compatible with the new changes and you will need to create them again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Not a parent?": "Kein Elternteil?", - "@Not a parent?": { - "description": "Title for the screen that shows when the user is not observing any students", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "We couldn't find any students associated with this account": "Es wurden keine mit dieser/diesem Konto verknüpfte Studierenden gefunden", - "@We couldn't find any students associated with this account": { - "description": "Subtitle for the screen that shows when the user is not observing any students", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Are you a student or teacher?": "Sind Sie Studierende*r oder Lehrende*r?", - "@Are you a student or teacher?": { - "description": "Label for button that will show users the option to view other Canvas apps in the Play Store", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "One of our other apps might be a better fit. Tap one to visit the Play Store.": "Eine unserer anderen Apps passt möglicherweise besser. Tippen Sie auf eine, um den Play Store zu besuchen.", - "@One of our other apps might be a better fit. Tap one to visit the Play Store.": { - "description": "Description of options to view other Canvas apps in the Play Store", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Return to Login": "Zurück zur Anmeldung", - "@Return to Login": { - "description": "Label for the button that returns the user to the login screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "STUDENT": "STUDIERENDE*R", - "@STUDENT": { - "description": "The \"student\" portion of the \"Canvas Student\" app name, in all caps. \"Canvas\" is excluded in this context as it will be displayed to the user as a wordmark image", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "TEACHER": "LEHRENDE*R", - "@TEACHER": { - "description": "The \"teacher\" portion of the \"Canvas Teacher\" app name, in all caps. \"Canvas\" is excluded in this context as it will be displayed to the user as a wordmark image", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Canvas Student": "Canvas-Studierende*r", - "@Canvas Student": { - "description": "The name of the Canvas Student app. Only \"Student\" should be translated as \"Canvas\" is a brand name in this context and should not be translated.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Canvas Teacher": "Canvas-Lehrende*r", - "@Canvas Teacher": { - "description": "The name of the Canvas Teacher app. Only \"Teacher\" should be translated as \"Canvas\" is a brand name in this context and should not be translated.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Alerts": "Keine Benachrichtigungen", - "@No Alerts": { - "description": "The title for the empty message to show to users when there are no alerts for the student.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There’s nothing to be notified of yet.": "Es gibt noch nichts, an das erinnert werden kann.", - "@There’s nothing to be notified of yet.": { - "description": "The empty message to show to users when there are no alerts for the student.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "dismissAlertLabel": "{alertTitle} verwerfen", - "@dismissAlertLabel": { - "description": "Accessibility label to dismiss an alert", - "type": "text", - "placeholders_order": [ - "alertTitle" - ], - "placeholders": { - "alertTitle": {} - } - }, - "Course Announcement": "Kursankündigung", - "@Course Announcement": { - "description": "Title for alerts when there is a course announcement", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Institution Announcement": "Institutsankündigung", - "@Institution Announcement": { - "description": "Title for alerts when there is an institution announcement", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "assignmentGradeAboveThreshold": "Aufgabennote über {threshold}", - "@assignmentGradeAboveThreshold": { - "description": "Title for alerts when an assignment grade is above the threshold value", - "type": "text", - "placeholders_order": [ - "threshold" - ], - "placeholders": { - "threshold": {} - } - }, - "assignmentGradeBelowThreshold": "Aufgabennote unter {threshold}", - "@assignmentGradeBelowThreshold": { - "description": "Title for alerts when an assignment grade is below the threshold value", - "type": "text", - "placeholders_order": [ - "threshold" - ], - "placeholders": { - "threshold": {} - } - }, - "courseGradeAboveThreshold": "Kursnote über {threshold}", - "@courseGradeAboveThreshold": { - "description": "Title for alerts when a course grade is above the threshold value", - "type": "text", - "placeholders_order": [ - "threshold" - ], - "placeholders": { - "threshold": {} - } - }, - "courseGradeBelowThreshold": "Kursnote unter {threshold}", - "@courseGradeBelowThreshold": { - "description": "Title for alerts when a course grade is below the threshold value", - "type": "text", - "placeholders_order": [ - "threshold" - ], - "placeholders": { - "threshold": {} - } - }, - "Settings": "Einstellungen", - "@Settings": { - "description": "Title for the settings screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Theme": "Design", - "@Theme": { - "description": "Label for the light/dark theme section in the settings page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Dark Mode": "Dunkel-Modus", - "@Dark Mode": { - "description": "Label for the button that enables dark mode", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Light Mode": "Heller Modus", - "@Light Mode": { - "description": "Label for the button that enables light mode", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "High Contrast Mode": "Hochkontrastmodus", - "@High Contrast Mode": { - "description": "Label for the switch that toggles high contrast mode", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Use Dark Theme in Web Content": "Dunkles Design für Web-Inhalte verwenden", - "@Use Dark Theme in Web Content": { - "description": "Label for the switch that toggles dark mode for webviews", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Appearance": "Aussehen", - "@Appearance": { - "description": "Label for the appearance section in the settings page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Successfully submitted!": "Wurde abgegeben!", - "@Successfully submitted!": { - "description": "Title displayed in the grade cell for an assignment that has been submitted", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "submissionStatusSuccessSubtitle": "Diese Aufgabe wurde am {date} um {time} abgegeben und wartet auf die Benotung", - "@submissionStatusSuccessSubtitle": { - "description": "Subtitle displayed in the grade cell for an assignment that has been submitted and is awaiting a grade", - "type": "text", - "placeholders_order": [ - "date", - "time" - ], - "placeholders": { - "date": {}, - "time": {} - } - }, - "outOfPoints": "{howMany,plural, =1{von 1 Punkt}other{von {points} Punkten}}", - "@outOfPoints": { - "description": "Description for an assignment grade that has points without a current scoroe", - "type": "text", - "placeholders_order": [ - "points", - "howMany" - ], - "placeholders": { - "points": {}, - "howMany": {} - } - }, - "Excused": "Entschuldigt", - "@Excused": { - "description": "Grading status for an assignment marked as excused", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Complete": "Fertigstellen", - "@Complete": { - "description": "Grading status for an assignment marked as complete", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Incomplete": "Unvollständig", - "@Incomplete": { - "description": "Grading status for an assignment marked as incomplete", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "minus": "minus", - "@minus": { - "description": "Screen reader-friendly replacement for the \"-\" character in letter grades like \"A-\"", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "latePenalty": "Strafe für Verspätung (-{pointsLost})", - "@latePenalty": { - "description": "Text displayed when a late penalty has been applied to the assignment", - "type": "text", - "placeholders_order": [ - "pointsLost" - ], - "placeholders": { - "pointsLost": {} - } - }, - "finalGrade": "Gesamtnote: {grade}", - "@finalGrade": { - "description": "Text that displays the final grade of an assignment", - "type": "text", - "placeholders_order": [ - "grade" - ], - "placeholders": { - "grade": {} - } - }, - "Alert Settings": "Alarmeinstellungen", - "@Alert Settings": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Alert me when…": "Mich warnen, wenn …", - "@Alert me when…": { - "description": "Header for the screen where the observer chooses the thresholds that will determine when they receive alerts (e.g. when an assignment is graded below 70%)", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Course grade below": "Kursnote unter", - "@Course grade below": { - "description": "Label describing the threshold for when the course grade is below a certain percentage", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Course grade above": "Kursnote über", - "@Course grade above": { - "description": "Label describing the threshold for when the course grade is above a certain percentage", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Assignment missing": "Aufgabe fehlt", - "@Assignment missing": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Assignment grade below": "Aufgabennote unter", - "@Assignment grade below": { - "description": "Label describing the threshold for when an assignment is graded below a certain percentage", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Assignment grade above": "Aufgabennote über", - "@Assignment grade above": { - "description": "Label describing the threshold for when an assignment is graded above a certain percentage", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Course Announcements": "Kursankündigungen", - "@Course Announcements": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Institution Announcements": "Institutsankündigungen", - "@Institution Announcements": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Never": "Nie", - "@Never": { - "description": "Indication that tells the user they will not receive alert notifications of a specific kind", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Grade percentage": "Noten-Prozentsatz", - "@Grade percentage": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading your student's alerts.": "Fehler beim Laden der Studierendenalarme.", - "@There was an error loading your student's alerts.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Must be below 100": "Muss unter 100 liegen", - "@Must be below 100": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "mustBeBelowN": "Muss unter {percentage} liegen", - "@mustBeBelowN": { - "description": "Validation error to the user that they must choose a percentage below 'n'", - "type": "text", - "placeholders_order": [ - "percentage" - ], - "placeholders": { - "percentage": { - "example": 5 - } - } - }, - "mustBeAboveN": "Muss über {percentage} liegen", - "@mustBeAboveN": { - "description": "Validation error to the user that they must choose a percentage above 'n'", - "type": "text", - "placeholders_order": [ - "percentage" - ], - "placeholders": { - "percentage": { - "example": 5 - } - } - }, - "Select Student Color": "Studierendenfarbe auswählen", - "@Select Student Color": { - "description": "Title for screen that allows users to assign a color to a specific student", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Electric, blue": "Elektrisch, blau", - "@Electric, blue": { - "description": "Name of the Electric (blue) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Plum, Purple": "Pflaume, violett", - "@Plum, Purple": { - "description": "Name of the Plum (purple) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Barney, Fuschia": "Fuchsienrot", - "@Barney, Fuschia": { - "description": "Name of the Barney (fuschia) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Raspberry, Red": "Himbeerrot", - "@Raspberry, Red": { - "description": "Name of the Raspberry (red) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Fire, Orange": "Feuerrot, orange", - "@Fire, Orange": { - "description": "Name of the Fire (orange) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Shamrock, Green": "Kleeblatt, grün", - "@Shamrock, Green": { - "description": "Name of the Shamrock (green) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "An error occurred while saving your selection. Please try again.": "Fehler beim Speichern Ihrer Auswahl. Bitte versuchen Sie es noch einmal.", - "@An error occurred while saving your selection. Please try again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "changeStudentColorLabel": "Farbe ändern für {studentName}", - "@changeStudentColorLabel": { - "description": "Accessibility label for the button that lets users change the color associated with a specific student", - "type": "text", - "placeholders_order": [ - "studentName" - ], - "placeholders": { - "studentName": {} - } - }, - "Teacher": "Lehrende*r", - "@Teacher": { - "description": "Label for the Teacher enrollment type", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Student": "Studierende*r", - "@Student": { - "description": "Label for the Student enrollment type", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "TA": "Lehrassistent*in", - "@TA": { - "description": "Label for the Teaching Assistant enrollment type (also known as Teacher Aid or Education Assistant), reduced to a short acronym/initialism if appropriate.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Observer": "Beobachter*in", - "@Observer": { - "description": "Label for the Observer enrollment type", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Use Camera": "Kamera verwenden", - "@Use Camera": { - "description": "Label for the action item that lets the user capture a photo using the device camera", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Upload File": "Datei hochladen", - "@Upload File": { - "description": "Label for the action item that lets the user upload a file from their device", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Choose from Gallery": "Aus Galerie auswählen", - "@Choose from Gallery": { - "description": "Label for the action item that lets the user select a photo from their device gallery", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Preparing…": "Vorbereiten ...", - "@Preparing…": { - "description": "Message shown while a file is being prepared to attach to a message", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Add student with…": "Studierende*n hinzufügen mit ...", - "@Add student with…": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Add Student": "Studierende*n hinzufügen", - "@Add Student": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You are not observing any students.": "Sie beobachten keine Studierende*n.", - "@You are not observing any students.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading your students.": "Fehler beim Laden Ihrer Studierende*n.", - "@There was an error loading your students.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Pairing Code": "Pairing-Code", - "@Pairing Code": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Students can obtain a pairing code through the Canvas website": "Studierende können einen Pairing-Code über die Canvas-Website erhalten", - "@Students can obtain a pairing code through the Canvas website": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Enter the student pairing code provided to you. If the pairing code doesn't work, it may have expired": "Geben Sie den Studierenden-Pairing-Code ein, den Sie erhalten haben. Falls der Pairing-Code nicht funktioniert, ist er möglicherweise abgelaufen", - "@Enter the student pairing code provided to you. If the pairing code doesn't work, it may have expired": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Your code is incorrect or expired.": "Ihr Code ist falsch oder abgelaufen.", - "@Your code is incorrect or expired.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Something went wrong trying to create your account, please reach out to your school for assistance.": "Beim Erstellen Ihres Kontos ging etwas schief. Wenden Sie sich bitte an Ihre Schule.", - "@Something went wrong trying to create your account, please reach out to your school for assistance.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "QR Code": "QR-Code", - "@QR Code": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Students can create a QR code using the Canvas Student app on their mobile device": "Studierende können einen QR-Code mit der Canvas Studierenden-App auf ihrem Mobilgerät erstellen", - "@Students can create a QR code using the Canvas Student app on their mobile device": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Add new student": "Neue/n Studierende*n hinzufügen", - "@Add new student": { - "description": "Semantics label for the FAB on the Manage Students Screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Select": "Auswählen", - "@Select": { - "description": "Hint text to tell the user to choose one of two options", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I have a Canvas account": "Ich besitze ein Canvas-Konto", - "@I have a Canvas account": { - "description": "Option to select for users that have a canvas account", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I don't have a Canvas account": "Ich besitze kein Canvas-Konto", - "@I don't have a Canvas account": { - "description": "Option to select for users that don't have a canvas account", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Create Account": "Konto erstellen", - "@Create Account": { - "description": "Button text for account creation confirmation", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Full Name": "Vollständiger Name", - "@Full Name": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Email Address": "E-Mail-Adresse", - "@Email Address": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Password": "Kennwort", - "@Password": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Full Name…": "Vollständiger Name ...", - "@Full Name…": { - "description": "hint label for inside form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Email…": "E-Mail ...", - "@Email…": { - "description": "hint label for inside form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Password…": "Kennwort ...", - "@Password…": { - "description": "hint label for inside form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Please enter full name": "Bitte geben Sie Ihren vollständigen Namen ein.", - "@Please enter full name": { - "description": "Error message for form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Please enter an email address": "Bitte geben Sie eine E-Mail-Adresse an.", - "@Please enter an email address": { - "description": "Error message for form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Please enter a valid email address": "Geben Sie bitte eine gültige E-Mail-Adresse sein.", - "@Please enter a valid email address": { - "description": "Error message for form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Password is required": "Passwort ist erforderlich", - "@Password is required": { - "description": "Error message for form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Password must contain at least 8 characters": "Das Kennwort muss mindestens 8 Zeichen lang sein.", - "@Password must contain at least 8 characters": { - "description": "Error message for form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "qrCreateAccountTos": "Durch Tippen auf „Konto erstellen“ erklären Sie sich mit den {termsOfService} und den {privacyPolicy} einverstanden.", - "@qrCreateAccountTos": { - "description": "The text show on the account creation screen", - "type": "text", - "placeholders_order": [ - "termsOfService", - "privacyPolicy" - ], - "placeholders": { - "termsOfService": {}, - "privacyPolicy": {} - } - }, - "Terms of Service": "Servicebedingungen", - "@Terms of Service": { - "description": "Label for the Canvas Terms of Service agreement. This will be used in the qrCreateAccountTos text and will be highlighted and clickable", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Privacy Policy": "Datenschutzrichtlinien", - "@Privacy Policy": { - "description": "Label for the Canvas Privacy Policy agreement. This will be used in the qrCreateAccountTos text and will be highlighted and clickable", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "View the Privacy Policy": "Datenschutzrichtlinien anzeigen", - "@View the Privacy Policy": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Already have an account? ": "Sie haben bereits ein Konto? ", - "@Already have an account? ": { - "description": "Part of multiline text span, includes AccountSignIn1-2, in that order", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Sign In": "Anmelden", - "@Sign In": { - "description": "Part of multiline text span, includes AccountSignIn1-2, in that order", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Hide Password": "Kennwort ausblenden", - "@Hide Password": { - "description": "content description for password hide button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Show Password": "Kennwort anzeigen", - "@Show Password": { - "description": "content description for password show button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Terms of Service Link": "Servicebedingungen (Link)", - "@Terms of Service Link": { - "description": "content description for terms of service link", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Privacy Policy Link": "Datenschutzrichtlinien (Link)", - "@Privacy Policy Link": { - "description": "content description for privacy policy link", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Event": "Ereignis", - "@Event": { - "description": "Title for the event details screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Date": "Datum", - "@Date": { - "description": "Label for the event date", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Location": "Standort", - "@Location": { - "description": "Label for the location information", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Location Specified": "Kein Standort angegeben", - "@No Location Specified": { - "description": "Description for events that do not have a location", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "eventTime": "{startAt} - {endAt}", - "@eventTime": { - "description": "The time the event is happening, example: \"2:00 pm - 4:00 pm\"", - "type": "text", - "placeholders_order": [ - "startAt", - "endAt" - ], - "placeholders": { - "startAt": {}, - "endAt": {} - } - }, - "Set a date and time to be notified of this event.": "Datum und Uhrzeit zur Benachrichtigung über dieses Ereignis einstellen.", - "@Set a date and time to be notified of this event.": { - "description": "Description for row to set event reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You will be notified about this event on…": "Sie werden benachrichtigt über dieses Ereignis am …", - "@You will be notified about this event on…": { - "description": "Description for when an event reminder is set", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Share Your Love for the App": "Teilen Sie Ihre Liebe für die App anderen mit", - "@Share Your Love for the App": { - "description": "Label for option to open the app store", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Tell us about your favorite parts of the app": "Sagen Sie uns, was Sie an der App besonders mögen", - "@Tell us about your favorite parts of the app": { - "description": "Description for option to open the app store", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Legal": "Rechtliches", - "@Legal": { - "description": "Label for legal information option", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Privacy policy, terms of use, open source": "Datenschutz, Nutzungsbedingungen, Open-Source", - "@Privacy policy, terms of use, open source": { - "description": "Description for legal information option", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Idea for Canvas Parent App [Android]": "Idee für Canvas-Parent-App [Android]", - "@Idea for Canvas Parent App [Android]": { - "description": "The subject for the email to request a feature", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The following information will help us better understand your idea:": "Die folgende Information hilft uns, Ihre Idee besser zu verstehen:", - "@The following information will help us better understand your idea:": { - "description": "The header for the users information that is attached to a feature request", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Domain:": "Domäne:", - "@Domain:": { - "description": "The label for the Canvas domain of the logged in user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "User ID:": "Benutzer-ID:", - "@User ID:": { - "description": "The label for the Canvas user ID of the logged in user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Email:": "E-Mail:", - "@Email:": { - "description": "The label for the eamil of the logged in user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Locale:": "Umgebung:", - "@Locale:": { - "description": "The label for the locale of the logged in user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Terms of Use": "Nutzungsbedingungen", - "@Terms of Use": { - "description": "Label for the terms of use", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Canvas on GitHub": "Canvas bei GitHub", - "@Canvas on GitHub": { - "description": "Label for the button that opens the Canvas project on GitHub's website", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was a problem loading the Terms of Use": "Es gab ein Problem beim Laden der Nutzungsbedingungen.", - "@There was a problem loading the Terms of Use": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Device": "Gerät", - "@Device": { - "description": "Label used for device manufacturer/model in the error report", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "OS Version": "BS-Version", - "@OS Version": { - "description": "Label used for device operating system version in the error report", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Version Number": "Versionsnummer", - "@Version Number": { - "description": "Label used for the app version number in the error report", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Report A Problem": "Ein Problem melden", - "@Report A Problem": { - "description": "Title used for generic dialog to report problems", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Subject": "Betreff", - "@Subject": { - "description": "Label used for Subject text field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "A subject is required.": "Ein Betreff ist erforderlich.", - "@A subject is required.": { - "description": "Error shown when the subject field is empty", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "An email address is required.": "Eine E-Mail-Adresse ist erforderlich.", - "@An email address is required.": { - "description": "Error shown when the email field is empty", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Description": "Beschreibung", - "@Description": { - "description": "Label used for Description text field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "A description is required.": "Eine Beschreibung ist erforderlich.", - "@A description is required.": { - "description": "Error shown when the description field is empty", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "How is this affecting you?": "Welche Auswirkung hat dies auf Sie?", - "@How is this affecting you?": { - "description": "Label used for the dropdown to select how severe the issue is", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "send": "senden", - "@send": { - "description": "Label used for send button when reporting a problem", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Just a casual question, comment, idea, suggestion…": "Nur zwanglos eine Frage, ein Kommentar, eine Idee, ein Vorschlag ...", - "@Just a casual question, comment, idea, suggestion…": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I need some help but it's not urgent.": "Ich brauche Hilfe, aber es eilt nicht.", - "@I need some help but it's not urgent.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Something's broken but I can work around it to get what I need done.": "Irgend etwas ist kaputt. Aber ich kann auch ohne das fertigstellen, was ich noch machen muss.", - "@Something's broken but I can work around it to get what I need done.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I can't get things done until I hear back from you.": "Ich kann nicht weitermachen, bevor ich keine Antwort von euch habe.", - "@I can't get things done until I hear back from you.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "EXTREME CRITICAL EMERGENCY!!": "ÄUSSERST KRITISCHER NOTFALL!", - "@EXTREME CRITICAL EMERGENCY!!": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Not Graded": "Unbenotet", - "@Not Graded": { - "description": "Description for an assignment has not been graded.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Login flow: Normal": "Anmeldung Flow: Normal", - "@Login flow: Normal": { - "description": "Description for the normal login flow", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Login flow: Canvas": "Anmeldung Flow: Canvas", - "@Login flow: Canvas": { - "description": "Description for the Canvas login flow", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Login flow: Site Admin": "Anmeldung Flow: Website-Administrator*in", - "@Login flow: Site Admin": { - "description": "Description for the Site Admin login flow", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Login flow: Skip mobile verify": "Anmeldung Flow: Mobile Prüfung überspringen", - "@Login flow: Skip mobile verify": { - "description": "Description for the login flow that skips domain verification for mobile", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Act As User": "Handeln als Benutzer*in", - "@Act As User": { - "description": "Label for the button that allows the user to act (masquerade) as another user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Stop Acting as User": "Nicht mehr handeln als Benutzer*in", - "@Stop Acting as User": { - "description": "Label for the button that allows the user to stop acting (masquerading) as another user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "actingAsUser": "Sie handeln als {userName}.", - "@actingAsUser": { - "description": "Message shown while acting (masquerading) as another user", - "type": "text", - "placeholders_order": [ - "userName" - ], - "placeholders": { - "userName": {} - } - }, - "\"Act as\" is essentially logging in as this user without a password. You will be able to take any action as if you were this user, and from other users' points of views, it will be as if this user performed them. However, audit logs record that you were the one who performed the actions on behalf of this user.": "„Handeln als“ heißt im Grunde sich als diese/r Benutzer*in ohne Kennwort die anzumelden. Sie können beliebige Maßnahmen ergreifen, als wären Sie dieser Benutzer, und aus der Sicht andere/r Benutzer*in wird es sein, als ob sie diese/r Benutzer*in ausführt. Die Audit-Protokolle zeichnen auf, dass Sie die Aktionen im Namen des Benutzers durchgeführt haben.", - "@\"Act as\" is essentially logging in as this user without a password. You will be able to take any action as if you were this user, and from other users' points of views, it will be as if this user performed them. However, audit logs record that you were the one who performed the actions on behalf of this user.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Domain": "Domäne", - "@Domain": { - "description": "Text field hint for domain url input", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You must enter a valid domain": "Sie müssen eine gültige Domäne eingeben", - "@You must enter a valid domain": { - "description": "Message displayed for domain input error", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "User ID": "Benutzer*in-ID", - "@User ID": { - "description": "Text field hint for user ID input", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You must enter a user id": "Sie müssen eine Benutzer-ID eingeben", - "@You must enter a user id": { - "description": "Message displayed for user Id input error", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error trying to act as this user. Please check the Domain and User ID and try again.": "Beim Handeln als diese/r Benutzer*in ist ein Fehler aufgetreten. Bitte überprüfen Sie die Domäne und die Benutzer-ID, und versuchen Sie es erneut.", - "@There was an error trying to act as this user. Please check the Domain and User ID and try again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "endMasqueradeMessage": "Sie hören auf, zu handeln als {userName} und kehren zu Ihrem ursprünglichen Konto zurück.", - "@endMasqueradeMessage": { - "description": "Confirmation message displayed when the user wants to stop acting (masquerading) as another user", - "type": "text", - "placeholders_order": [ - "userName" - ], - "placeholders": { - "userName": {} - } - }, - "endMasqueradeLogoutMessage": "Sie hören auf, zu handeln als {userName} und werden abgemeldet.", - "@endMasqueradeLogoutMessage": { - "description": "Confirmation message displayed when the user wants to stop acting (masquerading) as another user and will be logged out.", - "type": "text", - "placeholders_order": [ - "userName" - ], - "placeholders": { - "userName": {} - } - }, - "How are we doing?": "Wie sieht's aus?", - "@How are we doing?": { - "description": "Title for dialog asking user to rate the app out of 5 stars.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Don't show again": "Nicht nochmal zeigen", - "@Don't show again": { - "description": "Button to prevent the rating dialog from showing again.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "What can we do better?": "Was können wir besser machen?", - "@What can we do better?": { - "description": "Hint text for providing a comment with the rating.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Send Feedback": "Feedback senden", - "@Send Feedback": { - "description": "Button to send rating with feedback", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "ratingDialogEmailSubject": "Vorschläge für Android - Canvas Parent {version}", - "@ratingDialogEmailSubject": { - "description": "The subject for an email to provide feedback for CanvasParent.", - "type": "text", - "placeholders_order": [ - "version" - ], - "placeholders": { - "version": {} - } - }, - "starRating": "{position,plural, =1{{position} Stern}other{{position} Sterne}}", - "@starRating": { - "description": "Accessibility label for the 1 stars to 5 stars rating", - "type": "text", - "placeholders_order": [ - "position" - ], - "placeholders": { - "position": { - "example": 1 - } - } - }, - "Student Pairing": "Studierenden-Pairing", - "@Student Pairing": { - "description": "Title for the screen where users can pair to students using a QR code", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Open Canvas Student": "Canvas Studierenden öffnen", - "@Open Canvas Student": { - "description": "Title for QR pairing tutorial screen instructing users to open the Canvas Student app", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You'll need to open your student's Canvas Student app to continue. Go into Main Menu > Settings > Pair with Observer and scan the QR code you see there.": "Um fortzufahren, müssen Sie die Canvas Studierenden-App Ihrer/Ihres Studierenden öffnen. Gehen Sie zu Hauptmenü > Einstellungen > Pairing mit Beobachter*in und scannen Sie den QR-Code, den Sie dort sehen.", - "@You'll need to open your student's Canvas Student app to continue. Go into Main Menu > Settings > Pair with Observer and scan the QR code you see there.": { - "description": "Message explaining how QR code pairing works", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Screenshot showing location of pairing QR code generation in the Canvas Student app": "Screenshot des Ortes der Erzeugung des Pairing-QR-Codes in der Canvas Studierenden-App", - "@Screenshot showing location of pairing QR code generation in the Canvas Student app": { - "description": "Content Description for qr pairing tutorial screenshot", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Expired QR Code": "Abgelaufener QR-Code", - "@Expired QR Code": { - "description": "Error title shown when the users scans a QR code that has expired", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The QR code you scanned may have expired. Refresh the code on the student's device and try again.": "Der von Ihnen gescannte QR-Code ist möglicherweise abgelaufen. Aktualisieren Sie den Code auf dem Gerät der/des Studierenden und versuchen Sie es erneut.", - "@The QR code you scanned may have expired. Refresh the code on the student's device and try again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "A network error occurred when adding this student. Check your connection and try again.": "Beim Hinzufügen dier/dieses Studierenden ist ein Netzwerkfehler aufgetreten. Überprüfen Sie Ihre Verbindung, und versuchen Sie es erneut.", - "@A network error occurred when adding this student. Check your connection and try again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Invalid QR Code": "Ungültiger QR-Code", - "@Invalid QR Code": { - "description": "Error title shown when the user scans an invalid QR code", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Incorrect Domain": "Falsche Domain", - "@Incorrect Domain": { - "description": "Error title shown when the users scane a QR code for a student that belongs to a different domain", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The student you are trying to add belongs to a different school. Log in or create an account with that school to scan this code.": "Die/der Studierende*r, die/den Sie hinzufügen möchten, gehört zu einer anderen Schule. Melden Sie sich an oder erstellen Sie ein Konto bei dieser Einrichtung, um diesen Code zu scannen.", - "@The student you are trying to add belongs to a different school. Log in or create an account with that school to scan this code.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Camera Permission": "Kameraberechtigung", - "@Camera Permission": { - "description": "Error title shown when the user wans to scan a QR code but has denied the camera permission", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "This will unpair and remove all enrollments for this student from your account.": "Dadurch werden alle Pairings für Einschreibungen für diese/n Studierende*n aufgehoben und die Einschreibungen werden von Ihrem Konto entfernt.", - "@This will unpair and remove all enrollments for this student from your account.": { - "description": "Confirmation message shown when the user tries to delete a student from their account", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was a problem removing this student from your account. Please check your connection and try again.": "Beim Entfernen der/des Studierenden aus Ihrem Konto ist ein Problem aufgetreten. Bitte überprüfen Sie Ihre Verbindung, und versuchen Sie es erneut.", - "@There was a problem removing this student from your account. Please check your connection and try again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Cancel": "Abbrechen", - "@Cancel": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "next": "Weiter", - "@next": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "ok": "OK", - "@ok": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Yes": "Ja", - "@Yes": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No": "Nein", - "@No": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Retry": "Erneut versuchen", - "@Retry": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Delete": "Löschen", - "@Delete": { - "description": "Label used for general delete/remove actions", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Done": "Fertig", - "@Done": { - "description": "Label for general done/finished actions", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Refresh": "Aktualisieren", - "@Refresh": { - "description": "Label for button to refresh data from the web", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "View Description": "Beschreibung anzeigen", - "@View Description": { - "description": "Button to view the description for an event or assignment", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "expanded": "erweitert", - "@expanded": { - "description": "Description for the accessibility reader for list groups that are expanded", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "collapsed": "reduziert", - "@collapsed": { - "description": "Description for the accessibility reader for list groups that are expanded", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "An unexpected error occurred": "Es ist ein unerwarteter Fehler aufgetreten", - "@An unexpected error occurred": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No description": "Keine Beschreibung", - "@No description": { - "description": "Message used when the assignment has no description", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Launch External Tool": "Externes Tool starten", - "@Launch External Tool": { - "description": "Button text added to webviews to let users open external tools in their browser", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Interactions on this page are limited by your institution.": "Interaktionen auf dieser Seite sind durch ihre Institution eingeschränkt.", - "@Interactions on this page are limited by your institution.": { - "description": "Message describing how the webview has limited access due to an instution setting", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "dateAtTime": "Am {date} um {time}", - "@dateAtTime": { - "description": "The string to format dates", - "type": "text", - "placeholders_order": [ - "date", - "time" - ], - "placeholders": { - "date": {}, - "time": {} - } - }, - "dueDateAtTime": "Fällig am {date} um {time}", - "@dueDateAtTime": { - "description": "The string to format due dates", - "type": "text", - "placeholders_order": [ - "date", - "time" - ], - "placeholders": { - "date": {}, - "time": {} - } - }, - "No Due Date": "Kein Abgabetermin", - "@No Due Date": { - "description": "Label for assignments that do not have a due date", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Filter": "Filter", - "@Filter": { - "description": "Label for buttons to filter what items are visible", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "unread": "ungelesen", - "@unread": { - "description": "Label for things that are marked as unread", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "unreadCount": "{count} ungelesen", - "@unreadCount": { - "description": "Formatted string for when there are a number of unread items", - "type": "text", - "placeholders_order": [ - "count" - ], - "placeholders": { - "count": {} - } - }, - "badgeNumberPlus": "{count}+", - "@badgeNumberPlus": { - "description": "Formatted string for when too many items are being notified in a badge, generally something like: 99+", - "type": "text", - "placeholders_order": [ - "count" - ], - "placeholders": { - "count": {} - } - }, - "There was an error loading this announcement": "Beim Laden dieser Ankündigung ist ein Fehler aufgetreten", - "@There was an error loading this announcement": { - "description": "Message shown when an announcement detail screen fails to load", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Network error": "Netzwerkfehler", - "@Network error": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Under Construction": "In Bau", - "@Under Construction": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "We are currently building this feature for your viewing pleasure.": "Wir bauen derzeit an dieser Funktion für Sie.", - "@We are currently building this feature for your viewing pleasure.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Request Login Help Button": "Schaltfläche „Hilfe für Anmeldung erbitten“", - "@Request Login Help Button": { - "description": "Accessibility hint for button that opens help dialog for a login help request", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Request Login Help": "Hilfe für Anmeldung erbitten", - "@Request Login Help": { - "description": "Title of help dialog for a login help request", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I'm having trouble logging in": "Ich habe Probleme bei der Anmeldung", - "@I'm having trouble logging in": { - "description": "Subject of help dialog for a login help request", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "An error occurred when trying to display this link": "Beim Versuch diesen Link anzuzeigen, ist ein Fehler aufgetreten:", - "@An error occurred when trying to display this link": { - "description": "Error message shown when a link can't be opened", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "We are unable to display this link, it may belong to an institution you currently aren't logged in to.": "Wir können diesen Link nicht anzeigen. Er könnte zu einer Institution gehören, bei der Sie derzeit nicht angemeldet sind.", - "@We are unable to display this link, it may belong to an institution you currently aren't logged in to.": { - "description": "Description for error page shown when clicking a link", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Link Error": "Link-Fehler", - "@Link Error": { - "description": "Title for error page shown when clicking a link", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Open In Browser": "Im Browser öffnen", - "@Open In Browser": { - "description": "Text for button to open a link in the browswer", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You'll find the QR code on the web in your account profile. Click 'QR for Mobile Login' in the list.": "Sie finden den QR-Code im Internet in Ihrem Kontoprofil. Klicken Sie in der Liste auf 'QR für mobiles Login'.", - "@You'll find the QR code on the web in your account profile. Click 'QR for Mobile Login' in the list.": { - "description": "Text for qr login tutorial screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Locate QR Code": "QR-Code finden", - "@Locate QR Code": { - "description": "Text for qr login button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Please scan a QR code generated by Canvas": "Bitte scannen Sie einen von Canvas generierten QR-Code", - "@Please scan a QR code generated by Canvas": { - "description": "Text for qr login error with incorrect qr code", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error logging in. Please generate another QR Code and try again.": "Es gab einen Fehler bei der Anmeldung. Bitte generieren Sie einen weiteren QR-Code und versuchen Sie es erneut.", - "@There was an error logging in. Please generate another QR Code and try again.": { - "description": "Text for qr login error", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Screenshot showing location of QR code generation in browser": "Screenshot mit der Position der QR-Code-Generierung im Browser", - "@Screenshot showing location of QR code generation in browser": { - "description": "Content Description for qr login tutorial screenshot", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "QR scanning requires camera access": "QR-Scan erfordert Zugriff auf die Kamera", - "@QR scanning requires camera access": { - "description": "placeholder for camera error for QR code scan", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The linked item is no longer available": "Das verknüpfte Element ist nicht mehr verfügbar.", - "@The linked item is no longer available": { - "description": "error message when the alert could no be opened", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Message sent": "Gesendete Nachricht", - "@Message sent": { - "description": "confirmation message on the screen when the user succesfully sends a message", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Acceptable Use Policy": "Richtlinie zur akzeptablen Nutzung", - "@Acceptable Use Policy": { - "description": "title for the acceptable use policy screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Submit": "Absenden", - "@Submit": { - "description": "submit button title for acceptable use policy screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Either you're a new user or the Acceptable Use Policy has changed since you last agreed to it. Please agree to the Acceptable Use Policy before you continue.": "Entweder sind Sie ein(e) neue(r) Benutzer*in oder die Richtlinie zur akzeptablen Nutzung hat sich geändert, seit Sie ihr zuletzt zugestimmt haben. Bitte stimmen Sie der Richtlinie zur akzeptablen Nutzung zu, bevor Sie fortfahren.", - "@Either you're a new user or the Acceptable Use Policy has changed since you last agreed to it. Please agree to the Acceptable Use Policy before you continue.": { - "description": "acceptable use policy screen description", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I agree to the Acceptable Use Policy.": "Ich stimme der Richtlinie zur akzeptablen Nutzung zu", - "@I agree to the Acceptable Use Policy.": { - "description": "acceptable use policy switch title", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "About": "Info zu", - "@About": { - "description": "Title for about menu item in settings", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "App": "App", - "@App": { - "description": "Title for App field on about page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Login ID": "Anmelde-ID", - "@Login ID": { - "description": "Title for Login ID field on about page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Email": "E-Mail", - "@Email": { - "description": "Title for Email field on about page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Version": "Version", - "@Version": { - "description": "Title for Version field on about page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Instructure logo": "Instructure-Logo", - "@Instructure logo": { - "description": "Semantics label for the Instructure logo on the about page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - } -} \ No newline at end of file diff --git a/apps/flutter_parent/lib/l10n/res/intl_en.arb b/apps/flutter_parent/lib/l10n/res/intl_en.arb deleted file mode 100644 index d5edbf3ece..0000000000 --- a/apps/flutter_parent/lib/l10n/res/intl_en.arb +++ /dev/null @@ -1,2753 +0,0 @@ -{ - "@@last_modified": "2023-08-25T11:04:20.901151", - "alertsLabel": "Alerts", - "@alertsLabel": { - "description": "The label for the Alerts tab", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "calendarLabel": "Calendar", - "@calendarLabel": { - "description": "The label for the Calendar tab", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "coursesLabel": "Courses", - "@coursesLabel": { - "description": "The label for the Courses tab", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Students": "No Students", - "@No Students": { - "description": "Text for when an observer has no students they are observing", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Tap to show student selector": "Tap to show student selector", - "@Tap to show student selector": { - "description": "Semantics label for the area that will show the student selector when tapped", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Tap to pair with a new student": "Tap to pair with a new student", - "@Tap to pair with a new student": { - "description": "Semantics label for the add student button in the student selector", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Tap to select this student": "Tap to select this student", - "@Tap to select this student": { - "description": "Semantics label on individual students in the student switcher", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Manage Students": "Manage Students", - "@Manage Students": { - "description": "Label text for the Manage Students nav drawer button as well as the title for the Manage Students screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Help": "Help", - "@Help": { - "description": "Label text for the help nav drawer button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Log Out": "Log Out", - "@Log Out": { - "description": "Label text for the Log Out nav drawer button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Switch Users": "Switch Users", - "@Switch Users": { - "description": "Label text for the Switch Users nav drawer button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "appVersion": "v. {version}", - "@appVersion": { - "description": "App version shown in the navigation drawer", - "type": "text", - "placeholders_order": [ - "version" - ], - "placeholders": { - "version": {} - } - }, - "Are you sure you want to log out?": "Are you sure you want to log out?", - "@Are you sure you want to log out?": { - "description": "Confirmation message displayed when the user tries to log out", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Calendars": "Calendars", - "@Calendars": { - "description": "Label for button that lets users select which calendars to display", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "nextMonth": "Next month: {month}", - "@nextMonth": { - "description": "Label for the button that switches the calendar to the next month", - "type": "text", - "placeholders_order": [ - "month" - ], - "placeholders": { - "month": {} - } - }, - "previousMonth": "Previous month: {month}", - "@previousMonth": { - "description": "Label for the button that switches the calendar to the previous month", - "type": "text", - "placeholders_order": [ - "month" - ], - "placeholders": { - "month": {} - } - }, - "nextWeek": "Next week starting {date}", - "@nextWeek": { - "description": "Label for the button that switches the calendar to the next week", - "type": "text", - "placeholders_order": [ - "date" - ], - "placeholders": { - "date": {} - } - }, - "previousWeek": "Previous week starting {date}", - "@previousWeek": { - "description": "Label for the button that switches the calendar to the previous week", - "type": "text", - "placeholders_order": [ - "date" - ], - "placeholders": { - "date": {} - } - }, - "selectedMonthLabel": "Month of {month}", - "@selectedMonthLabel": { - "description": "Accessibility label for the button that expands/collapses the month view", - "type": "text", - "placeholders_order": [ - "month" - ], - "placeholders": { - "month": {} - } - }, - "expand": "expand", - "@expand": { - "description": "Accessibility label for the on-tap hint for the button that expands/collapses the month view", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "collapse": "collapse", - "@collapse": { - "description": "Accessibility label for the on-tap hint for the button that expands/collapses the month view", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "pointsPossible": "{points} points possible", - "@pointsPossible": { - "description": "Screen reader label used for the points possible for an assignment, quiz, etc.", - "type": "text", - "placeholders_order": [ - "points" - ], - "placeholders": { - "points": {} - } - }, - "calendarDaySemanticsLabel": "{eventCount,plural, =1{{date}, {eventCount} event}other{{date}, {eventCount} events}}", - "@calendarDaySemanticsLabel": { - "description": "Screen reader label used for calendar day, reads the date and count of events", - "type": "text", - "placeholders_order": [ - "date", - "eventCount" - ], - "placeholders": { - "date": {}, - "eventCount": {} - } - }, - "No Events Today!": "No Events Today!", - "@No Events Today!": { - "description": "Title displayed when there are no calendar events for the current day", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "It looks like a great day to rest, relax, and recharge.": "It looks like a great day to rest, relax, and recharge.", - "@It looks like a great day to rest, relax, and recharge.": { - "description": "Message displayed when there are no calendar events for the current day", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading your student's calendar": "There was an error loading your student's calendar", - "@There was an error loading your student's calendar": { - "description": "Message displayed when calendar events could not be loaded for the current student", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Tap to favorite the courses you want to see on the Calendar. Select up to 10.": "Tap to favorite the courses you want to see on the Calendar. Select up to 10.", - "@Tap to favorite the courses you want to see on the Calendar. Select up to 10.": { - "description": "Description text on calendar filter screen.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You may only choose 10 calendars to display": "You may only choose 10 calendars to display", - "@You may only choose 10 calendars to display": { - "description": "Error text when trying to select more than 10 calendars", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You must select at least one calendar to display": "You must select at least one calendar to display", - "@You must select at least one calendar to display": { - "description": "Error text when trying to de-select all calendars", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Planner Note": "Planner Note", - "@Planner Note": { - "description": "Label used for notes in the planner", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Go to today": "Go to today", - "@Go to today": { - "description": "Accessibility label used for the today button in the planner", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Previous Logins": "Previous Logins", - "@Previous Logins": { - "description": "Label for the list of previous user logins", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "canvasLogoLabel": "Canvas logo", - "@canvasLogoLabel": { - "description": "The semantics label for the Canvas logo", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "findSchool": "Find School", - "@findSchool": { - "description": "Text for the find-my-school button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "findAnotherSchool": "Find another school", - "@findAnotherSchool": { - "description": "Text for the find-another-school button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "domainSearchInputHint": "Enter school name or district…", - "@domainSearchInputHint": { - "description": "Input hint for the text box on the domain search screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "noDomainResults": "Unable to find schools matching \"{query}\"", - "@noDomainResults": { - "description": "Message shown to users when the domain search query did not return any results", - "type": "text", - "placeholders_order": [ - "query" - ], - "placeholders": { - "query": {} - } - }, - "domainSearchHelpLabel": "How do I find my school or district?", - "@domainSearchHelpLabel": { - "description": "Label for the help button on the domain search screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "canvasGuides": "Canvas Guides", - "@canvasGuides": { - "description": "Proper name for the Canvas Guides. This will be used in the domainSearchHelpBody text and will be highlighted and clickable", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "canvasSupport": "Canvas Support", - "@canvasSupport": { - "description": "Proper name for Canvas Support. This will be used in the domainSearchHelpBody text and will be highlighted and clickable", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "domainSearchHelpBody": "Try searching for the name of the school or district you’re attempting to access, like “Smith Private School” or “Smith County Schools.” You can also enter a Canvas domain directly, like “smith.instructure.com.”\n\nFor more information on finding your institution’s Canvas account, you can visit the {canvasGuides}, reach out to {canvasSupport}, or contact your school for assistance.", - "@domainSearchHelpBody": { - "description": "The body text shown in the help dialog on the domain search screen", - "type": "text", - "placeholders_order": [ - "canvasGuides", - "canvasSupport" - ], - "placeholders": { - "canvasGuides": {}, - "canvasSupport": {} - } - }, - "Uh oh!": "Uh oh!", - "@Uh oh!": { - "description": "Title of the screen that shows when a crash has occurred", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "We’re not sure what happened, but it wasn’t good. Contact us if this keeps happening.": "We’re not sure what happened, but it wasn’t good. Contact us if this keeps happening.", - "@We’re not sure what happened, but it wasn’t good. Contact us if this keeps happening.": { - "description": "Message shown when a crash has occurred", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Contact Support": "Contact Support", - "@Contact Support": { - "description": "Label for the button that allows users to contact support after a crash has occurred", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "View error details": "View error details", - "@View error details": { - "description": "Label for the button that allowed users to view crash details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Restart app": "Restart app", - "@Restart app": { - "description": "Label for the button that will restart the entire application", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Application version": "Application version", - "@Application version": { - "description": "Label for the application version displayed in the crash details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Device model": "Device model", - "@Device model": { - "description": "Label for the device model displayed in the crash details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Android OS version": "Android OS version", - "@Android OS version": { - "description": "Label for the Android operating system version displayed in the crash details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Full error message": "Full error message", - "@Full error message": { - "description": "Label for the full error message displayed in the crash details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Inbox": "Inbox", - "@Inbox": { - "description": "Title for the Inbox screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading your inbox messages.": "There was an error loading your inbox messages.", - "@There was an error loading your inbox messages.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Subject": "No Subject", - "@No Subject": { - "description": "Title used for inbox messages that have no subject", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unable to fetch courses. Please check your connection and try again.": "Unable to fetch courses. Please check your connection and try again.", - "@Unable to fetch courses. Please check your connection and try again.": { - "description": "Message shown when an error occured while loading courses", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Choose a course to message": "Choose a course to message", - "@Choose a course to message": { - "description": "Header in the course list shown when the user is choosing which course to associate with a new message", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Inbox Zero": "Inbox Zero", - "@Inbox Zero": { - "description": "Title of the message shown when there are no inbox messages", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You’re all caught up!": "You’re all caught up!", - "@You’re all caught up!": { - "description": "Subtitle of the message shown when there are no inbox messages", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading recipients for this course": "There was an error loading recipients for this course", - "@There was an error loading recipients for this course": { - "description": "Message shown when attempting to create a new message but the recipients list failed to load", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unable to send message. Check your connection and try again.": "Unable to send message. Check your connection and try again.", - "@Unable to send message. Check your connection and try again.": { - "description": "Message show when there was an error creating or sending a new message", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unsaved changes": "Unsaved changes", - "@Unsaved changes": { - "description": "Title of the dialog shown when the user tries to leave with unsaved changes", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Are you sure you wish to close this page? Your unsent message will be lost.": "Are you sure you wish to close this page? Your unsent message will be lost.", - "@Are you sure you wish to close this page? Your unsent message will be lost.": { - "description": "Body text of the dialog shown when the user tries leave with unsaved changes", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "New message": "New message", - "@New message": { - "description": "Title of the new-message screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Add attachment": "Add attachment", - "@Add attachment": { - "description": "Tooltip for the add-attachment button in the new-message screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Send message": "Send message", - "@Send message": { - "description": "Tooltip for the send-message button in the new-message screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Select recipients": "Select recipients", - "@Select recipients": { - "description": "Tooltip for the button that allows users to select message recipients", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No recipients selected": "No recipients selected", - "@No recipients selected": { - "description": "Hint displayed when the user has not selected any message recipients", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Message subject": "Message subject", - "@Message subject": { - "description": "Hint text displayed in the input field for the message subject", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Message": "Message", - "@Message": { - "description": "Hint text displayed in the input field for the message body", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Recipients": "Recipients", - "@Recipients": { - "description": "Label for message recipients", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "plusRecipientCount": "+{count}", - "@plusRecipientCount": { - "description": "Shows the number of recipients that are selected but not displayed on screen.", - "type": "text", - "placeholders_order": [ - "count" - ], - "placeholders": { - "count": { - "example": 5 - } - } - }, - "Failed. Tap for options.": "Failed. Tap for options.", - "@Failed. Tap for options.": { - "description": "Short message shown on a message attachment when uploading has failed", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "courseForWhom": "for {studentShortName}", - "@courseForWhom": { - "description": "Describes for whom a course is for (i.e. for Bill)", - "type": "text", - "placeholders_order": [ - "studentShortName" - ], - "placeholders": { - "studentShortName": {} - } - }, - "messageLinkPostscript": "Regarding: {studentName}, {linkUrl}", - "@messageLinkPostscript": { - "description": "A postscript appended to new messages that clarifies which student is the subject of the message and also includes a URL for the related Canvas component (course, assignment, event, etc).", - "type": "text", - "placeholders_order": [ - "studentName", - "linkUrl" - ], - "placeholders": { - "studentName": {}, - "linkUrl": {} - } - }, - "There was an error loading this conversation": "There was an error loading this conversation", - "@There was an error loading this conversation": { - "description": "Message shown when a conversation fails to load", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Reply": "Reply", - "@Reply": { - "description": "Button label for replying to a conversation", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Reply All": "Reply All", - "@Reply All": { - "description": "Button label for replying to all conversation participants", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unknown User": "Unknown User", - "@Unknown User": { - "description": "Label used where the user name is not known", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "me": "me", - "@me": { - "description": "First-person pronoun (i.e. 'me') that will be used in message author info, e.g. 'Me to 4 others' or 'Jon Snow to me'", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "authorToRecipient": "{authorName} to {recipientName}", - "@authorToRecipient": { - "description": "Author info for a single-recipient message; includes both the author name and the recipient name.", - "type": "text", - "placeholders_order": [ - "authorName", - "recipientName" - ], - "placeholders": { - "authorName": {}, - "recipientName": {} - } - }, - "authorToNOthers": "{howMany,plural, =1{{authorName} to 1 other}other{{authorName} to {howMany} others}}", - "@authorToNOthers": { - "description": "Author info for a mutli-recipient message; includes the author name and the number of recipients", - "type": "text", - "placeholders_order": [ - "authorName", - "howMany" - ], - "placeholders": { - "authorName": {}, - "howMany": {} - } - }, - "authorToRecipientAndNOthers": "{howMany,plural, =1{{authorName} to {recipientName} & 1 other}other{{authorName} to {recipientName} & {howMany} others}}", - "@authorToRecipientAndNOthers": { - "description": "Author info for a multi-recipient message; includes the author name, one recipient name, and the number of other recipients", - "type": "text", - "placeholders_order": [ - "authorName", - "recipientName", - "howMany" - ], - "placeholders": { - "authorName": {}, - "recipientName": {}, - "howMany": {} - } - }, - "Download": "Download", - "@Download": { - "description": "Label for the button that will begin downloading a file", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Open with another app": "Open with another app", - "@Open with another app": { - "description": "Label for the button that will allow users to open a file with another app", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There are no installed applications that can open this file": "There are no installed applications that can open this file", - "@There are no installed applications that can open this file": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unsupported File": "Unsupported File", - "@Unsupported File": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "This file is unsupported and can’t be viewed through the app": "This file is unsupported and can’t be viewed through the app", - "@This file is unsupported and can’t be viewed through the app": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unable to play this media file": "Unable to play this media file", - "@Unable to play this media file": { - "description": "Message shown when audio or video media could not be played", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unable to load this image": "Unable to load this image", - "@Unable to load this image": { - "description": "Message shown when an image file could not be loaded or displayed", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading this file": "There was an error loading this file", - "@There was an error loading this file": { - "description": "Message shown when a file could not be loaded or displayed", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Courses": "No Courses", - "@No Courses": { - "description": "Title for having no courses", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Your student’s courses might not be published yet.": "Your student’s courses might not be published yet.", - "@Your student’s courses might not be published yet.": { - "description": "Message for having no courses", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading your student’s courses.": "There was an error loading your student’s courses.", - "@There was an error loading your student’s courses.": { - "description": "Message displayed when the list of student courses could not be loaded", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Grade": "No Grade", - "@No Grade": { - "description": "Message shown when there is currently no grade available for a course", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Filter by": "Filter by", - "@Filter by": { - "description": "Title for list of terms to filter grades by", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Grades": "Grades", - "@Grades": { - "description": "Label for the \"Grades\" tab in course details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Syllabus": "Syllabus", - "@Syllabus": { - "description": "Label for the \"Syllabus\" tab in course details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Front Page": "Front Page", - "@Front Page": { - "description": "Label for the \"Front Page\" tab in course details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Summary": "Summary", - "@Summary": { - "description": "Label for the \"Summary\" tab in course details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Send a message about this course": "Send a message about this course", - "@Send a message about this course": { - "description": "Accessibility hint for the course messaage floating action button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Total Grade": "Total Grade", - "@Total Grade": { - "description": "Label for the total grade in the course", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Graded": "Graded", - "@Graded": { - "description": "Label for assignments that have been graded", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Submitted": "Submitted", - "@Submitted": { - "description": "Label for assignments that have been submitted", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Not Submitted": "Not Submitted", - "@Not Submitted": { - "description": "Label for assignments that have not been submitted", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Late": "Late", - "@Late": { - "description": "Label for assignments that have been marked late or submitted late", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Missing": "Missing", - "@Missing": { - "description": "Label for assignments that have been marked missing or are not submitted and past the due date", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "-": "-", - "@-": { - "description": "Value representing no score for student submission", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "All Grading Periods": "All Grading Periods", - "@All Grading Periods": { - "description": "Label for selecting all grading periods", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Assignments": "No Assignments", - "@No Assignments": { - "description": "Title for the no assignments message", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "It looks like assignments haven't been created in this space yet.": "It looks like assignments haven't been created in this space yet.", - "@It looks like assignments haven't been created in this space yet.": { - "description": "Message for no assignments", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading the summary details for this course.": "There was an error loading the summary details for this course.", - "@There was an error loading the summary details for this course.": { - "description": "Message shown when the course summary could not be loaded", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Summary": "No Summary", - "@No Summary": { - "description": "Title displayed when there are no items in the course summary", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "This course does not have any assignments or calendar events yet.": "This course does not have any assignments or calendar events yet.", - "@This course does not have any assignments or calendar events yet.": { - "description": "Message displayed when there are no items in the course summary", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "gradeFormatScoreOutOfPointsPossible": "{score} / {pointsPossible}", - "@gradeFormatScoreOutOfPointsPossible": { - "description": "Formatted string for a student score out of the points possible", - "type": "text", - "placeholders_order": [ - "score", - "pointsPossible" - ], - "placeholders": { - "score": {}, - "pointsPossible": {} - } - }, - "contentDescriptionScoreOutOfPointsPossible": "{score} out of {pointsPossible} points", - "@contentDescriptionScoreOutOfPointsPossible": { - "description": "Formatted string for a student score out of the points possible", - "type": "text", - "placeholders_order": [ - "score", - "pointsPossible" - ], - "placeholders": { - "score": {}, - "pointsPossible": {} - } - }, - "gradesSubjectMessage": "Regarding: {studentName}, Grades", - "@gradesSubjectMessage": { - "description": "The subject line for a message to a teacher regarding a student's grades", - "type": "text", - "placeholders_order": [ - "studentName" - ], - "placeholders": { - "studentName": {} - } - }, - "syllabusSubjectMessage": "Regarding: {studentName}, Syllabus", - "@syllabusSubjectMessage": { - "description": "The subject line for a message to a teacher regarding a course syllabus", - "type": "text", - "placeholders_order": [ - "studentName" - ], - "placeholders": { - "studentName": {} - } - }, - "frontPageSubjectMessage": "Regarding: {studentName}, Front Page", - "@frontPageSubjectMessage": { - "description": "The subject line for a message to a teacher regarding a course front page", - "type": "text", - "placeholders_order": [ - "studentName" - ], - "placeholders": { - "studentName": {} - } - }, - "assignmentSubjectMessage": "Regarding: {studentName}, Assignment - {assignmentName}", - "@assignmentSubjectMessage": { - "description": "The subject line for a message to a teacher regarding a student's assignment", - "type": "text", - "placeholders_order": [ - "studentName", - "assignmentName" - ], - "placeholders": { - "studentName": {}, - "assignmentName": {} - } - }, - "eventSubjectMessage": "Regarding: {studentName}, Event - {eventTitle}", - "@eventSubjectMessage": { - "description": "The subject line for a message to a teacher regarding a calendar event", - "type": "text", - "placeholders_order": [ - "studentName", - "eventTitle" - ], - "placeholders": { - "studentName": {}, - "eventTitle": {} - } - }, - "There is no page information available.": "There is no page information available.", - "@There is no page information available.": { - "description": "Description for when no page information is available", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Assignment Details": "Assignment Details", - "@Assignment Details": { - "description": "Title for the page that shows details for an assignment", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "assignmentTotalPoints": "{points} pts", - "@assignmentTotalPoints": { - "description": "Label used for the total points the assignment is worth", - "type": "text", - "placeholders_order": [ - "points" - ], - "placeholders": { - "points": {} - } - }, - "assignmentTotalPointsAccessible": "{points} points", - "@assignmentTotalPointsAccessible": { - "description": "Screen reader label used for the total points the assignment is worth", - "type": "text", - "placeholders_order": [ - "points" - ], - "placeholders": { - "points": {} - } - }, - "Due": "Due", - "@Due": { - "description": "Label for an assignment due date", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Grade": "Grade", - "@Grade": { - "description": "Label for the section that displays an assignment's grade", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Locked": "Locked", - "@Locked": { - "description": "Label for when an assignment is locked", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "assignmentLockedModule": "This assignment is locked by the module \"{moduleName}\".", - "@assignmentLockedModule": { - "description": "The locked description when an assignment is locked by a module", - "type": "text", - "placeholders_order": [ - "moduleName" - ], - "placeholders": { - "moduleName": {} - } - }, - "Remind Me": "Remind Me", - "@Remind Me": { - "description": "Label for the row to set reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Set a date and time to be notified of this specific assignment.": "Set a date and time to be notified of this specific assignment.", - "@Set a date and time to be notified of this specific assignment.": { - "description": "Description for row to set reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You will be notified about this assignment on…": "You will be notified about this assignment on…", - "@You will be notified about this assignment on…": { - "description": "Description for when a reminder is set", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Instructions": "Instructions", - "@Instructions": { - "description": "Label for the description of the assignment when it has quiz instructions", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Send a message about this assignment": "Send a message about this assignment", - "@Send a message about this assignment": { - "description": "Accessibility hint for the assignment messaage floating action button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "This app is not authorized for use.": "This app is not authorized for use.", - "@This app is not authorized for use.": { - "description": "The error shown when the app being used is not verified by Canvas", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The server you entered is not authorized for this app.": "The server you entered is not authorized for this app.", - "@The server you entered is not authorized for this app.": { - "description": "The error shown when the desired login domain is not verified by Canvas", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The user agent for this app is not authorized.": "The user agent for this app is not authorized.", - "@The user agent for this app is not authorized.": { - "description": "The error shown when the user agent during verification is not verified by Canvas", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "We were unable to verify the server for use with this app.": "We were unable to verify the server for use with this app.", - "@We were unable to verify the server for use with this app.": { - "description": "The generic error shown when we are unable to verify with Canvas", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Reminders": "Reminders", - "@Reminders": { - "description": "Name of the system notification channel for assignment and event reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Notifications for reminders about assignments and calendar events": "Notifications for reminders about assignments and calendar events", - "@Notifications for reminders about assignments and calendar events": { - "description": "Description of the system notification channel for assignment and event reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Reminders have changed!": "Reminders have changed!", - "@Reminders have changed!": { - "description": "Title of the dialog shown when the user needs to update their reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "In order to provide you with a better experience, we have updated how reminders work. You can add new reminders by viewing an assignment or calendar event and tapping the switch under the \"Remind Me\" section.\n\nBe aware that any reminders created with older versions of this app will not be compatible with the new changes and you will need to create them again.": "In order to provide you with a better experience, we have updated how reminders work. You can add new reminders by viewing an assignment or calendar event and tapping the switch under the \"Remind Me\" section.\n\nBe aware that any reminders created with older versions of this app will not be compatible with the new changes and you will need to create them again.", - "@In order to provide you with a better experience, we have updated how reminders work. You can add new reminders by viewing an assignment or calendar event and tapping the switch under the \"Remind Me\" section.\n\nBe aware that any reminders created with older versions of this app will not be compatible with the new changes and you will need to create them again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Not a parent?": "Not a parent?", - "@Not a parent?": { - "description": "Title for the screen that shows when the user is not observing any students", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "We couldn't find any students associated with this account": "We couldn't find any students associated with this account", - "@We couldn't find any students associated with this account": { - "description": "Subtitle for the screen that shows when the user is not observing any students", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Are you a student or teacher?": "Are you a student or teacher?", - "@Are you a student or teacher?": { - "description": "Label for button that will show users the option to view other Canvas apps in the Play Store", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "One of our other apps might be a better fit. Tap one to visit the Play Store.": "One of our other apps might be a better fit. Tap one to visit the Play Store.", - "@One of our other apps might be a better fit. Tap one to visit the Play Store.": { - "description": "Description of options to view other Canvas apps in the Play Store", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Return to Login": "Return to Login", - "@Return to Login": { - "description": "Label for the button that returns the user to the login screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "STUDENT": "STUDENT", - "@STUDENT": { - "description": "The \"student\" portion of the \"Canvas Student\" app name, in all caps. \"Canvas\" is excluded in this context as it will be displayed to the user as a wordmark image", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "TEACHER": "TEACHER", - "@TEACHER": { - "description": "The \"teacher\" portion of the \"Canvas Teacher\" app name, in all caps. \"Canvas\" is excluded in this context as it will be displayed to the user as a wordmark image", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Canvas Student": "Canvas Student", - "@Canvas Student": { - "description": "The name of the Canvas Student app. Only \"Student\" should be translated as \"Canvas\" is a brand name in this context and should not be translated.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Canvas Teacher": "Canvas Teacher", - "@Canvas Teacher": { - "description": "The name of the Canvas Teacher app. Only \"Teacher\" should be translated as \"Canvas\" is a brand name in this context and should not be translated.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Alerts": "No Alerts", - "@No Alerts": { - "description": "The title for the empty message to show to users when there are no alerts for the student.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There’s nothing to be notified of yet.": "There’s nothing to be notified of yet.", - "@There’s nothing to be notified of yet.": { - "description": "The empty message to show to users when there are no alerts for the student.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "dismissAlertLabel": "Dismiss {alertTitle}", - "@dismissAlertLabel": { - "description": "Accessibility label to dismiss an alert", - "type": "text", - "placeholders_order": [ - "alertTitle" - ], - "placeholders": { - "alertTitle": {} - } - }, - "Course Announcement": "Course Announcement", - "@Course Announcement": { - "description": "Title for alerts when there is a course announcement", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Institution Announcement": "Institution Announcement", - "@Institution Announcement": { - "description": "Title for alerts when there is an institution announcement", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "assignmentGradeAboveThreshold": "Assignment Grade Above {threshold}", - "@assignmentGradeAboveThreshold": { - "description": "Title for alerts when an assignment grade is above the threshold value", - "type": "text", - "placeholders_order": [ - "threshold" - ], - "placeholders": { - "threshold": {} - } - }, - "assignmentGradeBelowThreshold": "Assignment Grade Below {threshold}", - "@assignmentGradeBelowThreshold": { - "description": "Title for alerts when an assignment grade is below the threshold value", - "type": "text", - "placeholders_order": [ - "threshold" - ], - "placeholders": { - "threshold": {} - } - }, - "courseGradeAboveThreshold": "Course Grade Above {threshold}", - "@courseGradeAboveThreshold": { - "description": "Title for alerts when a course grade is above the threshold value", - "type": "text", - "placeholders_order": [ - "threshold" - ], - "placeholders": { - "threshold": {} - } - }, - "courseGradeBelowThreshold": "Course Grade Below {threshold}", - "@courseGradeBelowThreshold": { - "description": "Title for alerts when a course grade is below the threshold value", - "type": "text", - "placeholders_order": [ - "threshold" - ], - "placeholders": { - "threshold": {} - } - }, - "Settings": "Settings", - "@Settings": { - "description": "Title for the settings screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Theme": "Theme", - "@Theme": { - "description": "Label for the light/dark theme section in the settings page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Dark Mode": "Dark Mode", - "@Dark Mode": { - "description": "Label for the button that enables dark mode", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Light Mode": "Light Mode", - "@Light Mode": { - "description": "Label for the button that enables light mode", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "High Contrast Mode": "High Contrast Mode", - "@High Contrast Mode": { - "description": "Label for the switch that toggles high contrast mode", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Use Dark Theme in Web Content": "Use Dark Theme in Web Content", - "@Use Dark Theme in Web Content": { - "description": "Label for the switch that toggles dark mode for webviews", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Appearance": "Appearance", - "@Appearance": { - "description": "Label for the appearance section in the settings page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Successfully submitted!": "Successfully submitted!", - "@Successfully submitted!": { - "description": "Title displayed in the grade cell for an assignment that has been submitted", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "submissionStatusSuccessSubtitle": "This assignment was submitted on {date} at {time} and is waiting to be graded", - "@submissionStatusSuccessSubtitle": { - "description": "Subtitle displayed in the grade cell for an assignment that has been submitted and is awaiting a grade", - "type": "text", - "placeholders_order": [ - "date", - "time" - ], - "placeholders": { - "date": {}, - "time": {} - } - }, - "outOfPoints": "{howMany,plural, =1{Out of 1 point}other{Out of {points} points}}", - "@outOfPoints": { - "description": "Description for an assignment grade that has points without a current scoroe", - "type": "text", - "placeholders_order": [ - "points", - "howMany" - ], - "placeholders": { - "points": {}, - "howMany": {} - } - }, - "Excused": "Excused", - "@Excused": { - "description": "Grading status for an assignment marked as excused", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Complete": "Complete", - "@Complete": { - "description": "Grading status for an assignment marked as complete", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Incomplete": "Incomplete", - "@Incomplete": { - "description": "Grading status for an assignment marked as incomplete", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "minus": "minus", - "@minus": { - "description": "Screen reader-friendly replacement for the \"-\" character in letter grades like \"A-\"", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "latePenalty": "Late penalty (-{pointsLost})", - "@latePenalty": { - "description": "Text displayed when a late penalty has been applied to the assignment", - "type": "text", - "placeholders_order": [ - "pointsLost" - ], - "placeholders": { - "pointsLost": {} - } - }, - "finalGrade": "Final Grade: {grade}", - "@finalGrade": { - "description": "Text that displays the final grade of an assignment", - "type": "text", - "placeholders_order": [ - "grade" - ], - "placeholders": { - "grade": {} - } - }, - "Alert Settings": "Alert Settings", - "@Alert Settings": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Alert me when…": "Alert me when…", - "@Alert me when…": { - "description": "Header for the screen where the observer chooses the thresholds that will determine when they receive alerts (e.g. when an assignment is graded below 70%)", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Course grade below": "Course grade below", - "@Course grade below": { - "description": "Label describing the threshold for when the course grade is below a certain percentage", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Course grade above": "Course grade above", - "@Course grade above": { - "description": "Label describing the threshold for when the course grade is above a certain percentage", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Assignment missing": "Assignment missing", - "@Assignment missing": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Assignment grade below": "Assignment grade below", - "@Assignment grade below": { - "description": "Label describing the threshold for when an assignment is graded below a certain percentage", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Assignment grade above": "Assignment grade above", - "@Assignment grade above": { - "description": "Label describing the threshold for when an assignment is graded above a certain percentage", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Course Announcements": "Course Announcements", - "@Course Announcements": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Institution Announcements": "Institution Announcements", - "@Institution Announcements": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Never": "Never", - "@Never": { - "description": "Indication that tells the user they will not receive alert notifications of a specific kind", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Grade percentage": "Grade percentage", - "@Grade percentage": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading your student's alerts.": "There was an error loading your student's alerts.", - "@There was an error loading your student's alerts.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Must be below 100": "Must be below 100", - "@Must be below 100": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "mustBeBelowN": "Must be below {percentage}", - "@mustBeBelowN": { - "description": "Validation error to the user that they must choose a percentage below 'n'", - "type": "text", - "placeholders_order": [ - "percentage" - ], - "placeholders": { - "percentage": { - "example": 5 - } - } - }, - "mustBeAboveN": "Must be above {percentage}", - "@mustBeAboveN": { - "description": "Validation error to the user that they must choose a percentage above 'n'", - "type": "text", - "placeholders_order": [ - "percentage" - ], - "placeholders": { - "percentage": { - "example": 5 - } - } - }, - "Select Student Color": "Select Student Color", - "@Select Student Color": { - "description": "Title for screen that allows users to assign a color to a specific student", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Electric, blue": "Electric, blue", - "@Electric, blue": { - "description": "Name of the Electric (blue) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Plum, Purple": "Plum, Purple", - "@Plum, Purple": { - "description": "Name of the Plum (purple) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Barney, Fuschia": "Barney, Fuschia", - "@Barney, Fuschia": { - "description": "Name of the Barney (fuschia) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Raspberry, Red": "Raspberry, Red", - "@Raspberry, Red": { - "description": "Name of the Raspberry (red) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Fire, Orange": "Fire, Orange", - "@Fire, Orange": { - "description": "Name of the Fire (orange) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Shamrock, Green": "Shamrock, Green", - "@Shamrock, Green": { - "description": "Name of the Shamrock (green) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "An error occurred while saving your selection. Please try again.": "An error occurred while saving your selection. Please try again.", - "@An error occurred while saving your selection. Please try again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "changeStudentColorLabel": "Change color for {studentName}", - "@changeStudentColorLabel": { - "description": "Accessibility label for the button that lets users change the color associated with a specific student", - "type": "text", - "placeholders_order": [ - "studentName" - ], - "placeholders": { - "studentName": {} - } - }, - "Teacher": "Teacher", - "@Teacher": { - "description": "Label for the Teacher enrollment type", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Student": "Student", - "@Student": { - "description": "Label for the Student enrollment type", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "TA": "TA", - "@TA": { - "description": "Label for the Teaching Assistant enrollment type (also known as Teacher Aid or Education Assistant), reduced to a short acronym/initialism if appropriate.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Observer": "Observer", - "@Observer": { - "description": "Label for the Observer enrollment type", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Use Camera": "Use Camera", - "@Use Camera": { - "description": "Label for the action item that lets the user capture a photo using the device camera", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Upload File": "Upload File", - "@Upload File": { - "description": "Label for the action item that lets the user upload a file from their device", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Choose from Gallery": "Choose from Gallery", - "@Choose from Gallery": { - "description": "Label for the action item that lets the user select a photo from their device gallery", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Preparing…": "Preparing…", - "@Preparing…": { - "description": "Message shown while a file is being prepared to attach to a message", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Add student with…": "Add student with…", - "@Add student with…": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Add Student": "Add Student", - "@Add Student": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You are not observing any students.": "You are not observing any students.", - "@You are not observing any students.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading your students.": "There was an error loading your students.", - "@There was an error loading your students.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Pairing Code": "Pairing Code", - "@Pairing Code": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Students can obtain a pairing code through the Canvas website": "Students can obtain a pairing code through the Canvas website", - "@Students can obtain a pairing code through the Canvas website": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Enter the student pairing code provided to you. If the pairing code doesn't work, it may have expired": "Enter the student pairing code provided to you. If the pairing code doesn't work, it may have expired", - "@Enter the student pairing code provided to you. If the pairing code doesn't work, it may have expired": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Your code is incorrect or expired.": "Your code is incorrect or expired.", - "@Your code is incorrect or expired.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Something went wrong trying to create your account, please reach out to your school for assistance.": "Something went wrong trying to create your account, please reach out to your school for assistance.", - "@Something went wrong trying to create your account, please reach out to your school for assistance.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "QR Code": "QR Code", - "@QR Code": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Students can create a QR code using the Canvas Student app on their mobile device": "Students can create a QR code using the Canvas Student app on their mobile device", - "@Students can create a QR code using the Canvas Student app on their mobile device": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Add new student": "Add new student", - "@Add new student": { - "description": "Semantics label for the FAB on the Manage Students Screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Select": "Select", - "@Select": { - "description": "Hint text to tell the user to choose one of two options", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I have a Canvas account": "I have a Canvas account", - "@I have a Canvas account": { - "description": "Option to select for users that have a canvas account", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I don't have a Canvas account": "I don't have a Canvas account", - "@I don't have a Canvas account": { - "description": "Option to select for users that don't have a canvas account", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Create Account": "Create Account", - "@Create Account": { - "description": "Button text for account creation confirmation", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Full Name": "Full Name", - "@Full Name": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Email Address": "Email Address", - "@Email Address": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Password": "Password", - "@Password": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Full Name…": "Full Name…", - "@Full Name…": { - "description": "hint label for inside form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Email…": "Email…", - "@Email…": { - "description": "hint label for inside form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Password…": "Password…", - "@Password…": { - "description": "hint label for inside form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Please enter full name": "Please enter full name", - "@Please enter full name": { - "description": "Error message for form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Please enter an email address": "Please enter an email address", - "@Please enter an email address": { - "description": "Error message for form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Please enter a valid email address": "Please enter a valid email address", - "@Please enter a valid email address": { - "description": "Error message for form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Password is required": "Password is required", - "@Password is required": { - "description": "Error message for form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Password must contain at least 8 characters": "Password must contain at least 8 characters", - "@Password must contain at least 8 characters": { - "description": "Error message for form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "qrCreateAccountTos": "By tapping 'Create Account', you agree to the {termsOfService} and acknowledge the {privacyPolicy}", - "@qrCreateAccountTos": { - "description": "The text show on the account creation screen", - "type": "text", - "placeholders_order": [ - "termsOfService", - "privacyPolicy" - ], - "placeholders": { - "termsOfService": {}, - "privacyPolicy": {} - } - }, - "Terms of Service": "Terms of Service", - "@Terms of Service": { - "description": "Label for the Canvas Terms of Service agreement. This will be used in the qrCreateAccountTos text and will be highlighted and clickable", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Privacy Policy": "Privacy Policy", - "@Privacy Policy": { - "description": "Label for the Canvas Privacy Policy agreement. This will be used in the qrCreateAccountTos text and will be highlighted and clickable", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "View the Privacy Policy": "View the Privacy Policy", - "@View the Privacy Policy": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Already have an account? ": "Already have an account? ", - "@Already have an account? ": { - "description": "Part of multiline text span, includes AccountSignIn1-2, in that order", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Sign In": "Sign In", - "@Sign In": { - "description": "Part of multiline text span, includes AccountSignIn1-2, in that order", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Hide Password": "Hide Password", - "@Hide Password": { - "description": "content description for password hide button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Show Password": "Show Password", - "@Show Password": { - "description": "content description for password show button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Terms of Service Link": "Terms of Service Link", - "@Terms of Service Link": { - "description": "content description for terms of service link", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Privacy Policy Link": "Privacy Policy Link", - "@Privacy Policy Link": { - "description": "content description for privacy policy link", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Event": "Event", - "@Event": { - "description": "Title for the event details screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Date": "Date", - "@Date": { - "description": "Label for the event date", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Location": "Location", - "@Location": { - "description": "Label for the location information", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Location Specified": "No Location Specified", - "@No Location Specified": { - "description": "Description for events that do not have a location", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "eventTime": "{startAt} - {endAt}", - "@eventTime": { - "description": "The time the event is happening, example: \"2:00 pm - 4:00 pm\"", - "type": "text", - "placeholders_order": [ - "startAt", - "endAt" - ], - "placeholders": { - "startAt": {}, - "endAt": {} - } - }, - "Set a date and time to be notified of this event.": "Set a date and time to be notified of this event.", - "@Set a date and time to be notified of this event.": { - "description": "Description for row to set event reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You will be notified about this event on…": "You will be notified about this event on…", - "@You will be notified about this event on…": { - "description": "Description for when an event reminder is set", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Share Your Love for the App": "Share Your Love for the App", - "@Share Your Love for the App": { - "description": "Label for option to open the app store", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Tell us about your favorite parts of the app": "Tell us about your favorite parts of the app", - "@Tell us about your favorite parts of the app": { - "description": "Description for option to open the app store", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Legal": "Legal", - "@Legal": { - "description": "Label for legal information option", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Privacy policy, terms of use, open source": "Privacy policy, terms of use, open source", - "@Privacy policy, terms of use, open source": { - "description": "Description for legal information option", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Idea for Canvas Parent App [Android]": "Idea for Canvas Parent App [Android]", - "@Idea for Canvas Parent App [Android]": { - "description": "The subject for the email to request a feature", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The following information will help us better understand your idea:": "The following information will help us better understand your idea:", - "@The following information will help us better understand your idea:": { - "description": "The header for the users information that is attached to a feature request", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Domain:": "Domain:", - "@Domain:": { - "description": "The label for the Canvas domain of the logged in user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "User ID:": "User ID:", - "@User ID:": { - "description": "The label for the Canvas user ID of the logged in user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Email:": "Email:", - "@Email:": { - "description": "The label for the eamil of the logged in user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Locale:": "Locale:", - "@Locale:": { - "description": "The label for the locale of the logged in user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Terms of Use": "Terms of Use", - "@Terms of Use": { - "description": "Label for the terms of use", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Canvas on GitHub": "Canvas on GitHub", - "@Canvas on GitHub": { - "description": "Label for the button that opens the Canvas project on GitHub's website", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was a problem loading the Terms of Use": "There was a problem loading the Terms of Use", - "@There was a problem loading the Terms of Use": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Device": "Device", - "@Device": { - "description": "Label used for device manufacturer/model in the error report", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "OS Version": "OS Version", - "@OS Version": { - "description": "Label used for device operating system version in the error report", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Version Number": "Version Number", - "@Version Number": { - "description": "Label used for the app version number in the error report", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Report A Problem": "Report A Problem", - "@Report A Problem": { - "description": "Title used for generic dialog to report problems", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Subject": "Subject", - "@Subject": { - "description": "Label used for Subject text field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "A subject is required.": "A subject is required.", - "@A subject is required.": { - "description": "Error shown when the subject field is empty", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "An email address is required.": "An email address is required.", - "@An email address is required.": { - "description": "Error shown when the email field is empty", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Description": "Description", - "@Description": { - "description": "Label used for Description text field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "A description is required.": "A description is required.", - "@A description is required.": { - "description": "Error shown when the description field is empty", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "How is this affecting you?": "How is this affecting you?", - "@How is this affecting you?": { - "description": "Label used for the dropdown to select how severe the issue is", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "send": "send", - "@send": { - "description": "Label used for send button when reporting a problem", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Just a casual question, comment, idea, suggestion…": "Just a casual question, comment, idea, suggestion…", - "@Just a casual question, comment, idea, suggestion…": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I need some help but it's not urgent.": "I need some help but it's not urgent.", - "@I need some help but it's not urgent.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Something's broken but I can work around it to get what I need done.": "Something's broken but I can work around it to get what I need done.", - "@Something's broken but I can work around it to get what I need done.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I can't get things done until I hear back from you.": "I can't get things done until I hear back from you.", - "@I can't get things done until I hear back from you.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "EXTREME CRITICAL EMERGENCY!!": "EXTREME CRITICAL EMERGENCY!!", - "@EXTREME CRITICAL EMERGENCY!!": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Not Graded": "Not Graded", - "@Not Graded": { - "description": "Description for an assignment has not been graded.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Login flow: Normal": "Login flow: Normal", - "@Login flow: Normal": { - "description": "Description for the normal login flow", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Login flow: Canvas": "Login flow: Canvas", - "@Login flow: Canvas": { - "description": "Description for the Canvas login flow", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Login flow: Site Admin": "Login flow: Site Admin", - "@Login flow: Site Admin": { - "description": "Description for the Site Admin login flow", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Login flow: Skip mobile verify": "Login flow: Skip mobile verify", - "@Login flow: Skip mobile verify": { - "description": "Description for the login flow that skips domain verification for mobile", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Act As User": "Act As User", - "@Act As User": { - "description": "Label for the button that allows the user to act (masquerade) as another user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Stop Acting as User": "Stop Acting as User", - "@Stop Acting as User": { - "description": "Label for the button that allows the user to stop acting (masquerading) as another user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "actingAsUser": "You are acting as {userName}", - "@actingAsUser": { - "description": "Message shown while acting (masquerading) as another user", - "type": "text", - "placeholders_order": [ - "userName" - ], - "placeholders": { - "userName": {} - } - }, - "\"Act as\" is essentially logging in as this user without a password. You will be able to take any action as if you were this user, and from other users' points of views, it will be as if this user performed them. However, audit logs record that you were the one who performed the actions on behalf of this user.": "\"Act as\" is essentially logging in as this user without a password. You will be able to take any action as if you were this user, and from other users' points of views, it will be as if this user performed them. However, audit logs record that you were the one who performed the actions on behalf of this user.", - "@\"Act as\" is essentially logging in as this user without a password. You will be able to take any action as if you were this user, and from other users' points of views, it will be as if this user performed them. However, audit logs record that you were the one who performed the actions on behalf of this user.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Domain": "Domain", - "@Domain": { - "description": "Text field hint for domain url input", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You must enter a valid domain": "You must enter a valid domain", - "@You must enter a valid domain": { - "description": "Message displayed for domain input error", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "User ID": "User ID", - "@User ID": { - "description": "Text field hint for user ID input", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You must enter a user id": "You must enter a user id", - "@You must enter a user id": { - "description": "Message displayed for user Id input error", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error trying to act as this user. Please check the Domain and User ID and try again.": "There was an error trying to act as this user. Please check the Domain and User ID and try again.", - "@There was an error trying to act as this user. Please check the Domain and User ID and try again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "endMasqueradeMessage": "You will stop acting as {userName} and return to your original account.", - "@endMasqueradeMessage": { - "description": "Confirmation message displayed when the user wants to stop acting (masquerading) as another user", - "type": "text", - "placeholders_order": [ - "userName" - ], - "placeholders": { - "userName": {} - } - }, - "endMasqueradeLogoutMessage": "You will stop acting as {userName} and will be logged out.", - "@endMasqueradeLogoutMessage": { - "description": "Confirmation message displayed when the user wants to stop acting (masquerading) as another user and will be logged out.", - "type": "text", - "placeholders_order": [ - "userName" - ], - "placeholders": { - "userName": {} - } - }, - "How are we doing?": "How are we doing?", - "@How are we doing?": { - "description": "Title for dialog asking user to rate the app out of 5 stars.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Don't show again": "Don't show again", - "@Don't show again": { - "description": "Button to prevent the rating dialog from showing again.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "What can we do better?": "What can we do better?", - "@What can we do better?": { - "description": "Hint text for providing a comment with the rating.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Send Feedback": "Send Feedback", - "@Send Feedback": { - "description": "Button to send rating with feedback", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "ratingDialogEmailSubject": "Suggestions for Android - Canvas Parent {version}", - "@ratingDialogEmailSubject": { - "description": "The subject for an email to provide feedback for CanvasParent.", - "type": "text", - "placeholders_order": [ - "version" - ], - "placeholders": { - "version": {} - } - }, - "starRating": "{position,plural, =1{{position} star}other{{position} stars}}", - "@starRating": { - "description": "Accessibility label for the 1 stars to 5 stars rating", - "type": "text", - "placeholders_order": [ - "position" - ], - "placeholders": { - "position": { - "example": 1 - } - } - }, - "Student Pairing": "Student Pairing", - "@Student Pairing": { - "description": "Title for the screen where users can pair to students using a QR code", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Open Canvas Student": "Open Canvas Student", - "@Open Canvas Student": { - "description": "Title for QR pairing tutorial screen instructing users to open the Canvas Student app", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You'll need to open your student's Canvas Student app to continue. Go into Main Menu > Settings > Pair with Observer and scan the QR code you see there.": "You'll need to open your student's Canvas Student app to continue. Go into Main Menu > Settings > Pair with Observer and scan the QR code you see there.", - "@You'll need to open your student's Canvas Student app to continue. Go into Main Menu > Settings > Pair with Observer and scan the QR code you see there.": { - "description": "Message explaining how QR code pairing works", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Screenshot showing location of pairing QR code generation in the Canvas Student app": "Screenshot showing location of pairing QR code generation in the Canvas Student app", - "@Screenshot showing location of pairing QR code generation in the Canvas Student app": { - "description": "Content Description for qr pairing tutorial screenshot", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Expired QR Code": "Expired QR Code", - "@Expired QR Code": { - "description": "Error title shown when the users scans a QR code that has expired", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The QR code you scanned may have expired. Refresh the code on the student's device and try again.": "The QR code you scanned may have expired. Refresh the code on the student's device and try again.", - "@The QR code you scanned may have expired. Refresh the code on the student's device and try again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "A network error occurred when adding this student. Check your connection and try again.": "A network error occurred when adding this student. Check your connection and try again.", - "@A network error occurred when adding this student. Check your connection and try again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Invalid QR Code": "Invalid QR Code", - "@Invalid QR Code": { - "description": "Error title shown when the user scans an invalid QR code", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Incorrect Domain": "Incorrect Domain", - "@Incorrect Domain": { - "description": "Error title shown when the users scane a QR code for a student that belongs to a different domain", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The student you are trying to add belongs to a different school. Log in or create an account with that school to scan this code.": "The student you are trying to add belongs to a different school. Log in or create an account with that school to scan this code.", - "@The student you are trying to add belongs to a different school. Log in or create an account with that school to scan this code.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Camera Permission": "Camera Permission", - "@Camera Permission": { - "description": "Error title shown when the user wans to scan a QR code but has denied the camera permission", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "This will unpair and remove all enrollments for this student from your account.": "This will unpair and remove all enrollments for this student from your account.", - "@This will unpair and remove all enrollments for this student from your account.": { - "description": "Confirmation message shown when the user tries to delete a student from their account", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was a problem removing this student from your account. Please check your connection and try again.": "There was a problem removing this student from your account. Please check your connection and try again.", - "@There was a problem removing this student from your account. Please check your connection and try again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Cancel": "Cancel", - "@Cancel": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "next": "Next", - "@next": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "ok": "OK", - "@ok": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Yes": "Yes", - "@Yes": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No": "No", - "@No": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Retry": "Retry", - "@Retry": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Delete": "Delete", - "@Delete": { - "description": "Label used for general delete/remove actions", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Done": "Done", - "@Done": { - "description": "Label for general done/finished actions", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Refresh": "Refresh", - "@Refresh": { - "description": "Label for button to refresh data from the web", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "View Description": "View Description", - "@View Description": { - "description": "Button to view the description for an event or assignment", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "expanded": "expanded", - "@expanded": { - "description": "Description for the accessibility reader for list groups that are expanded", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "collapsed": "collapsed", - "@collapsed": { - "description": "Description for the accessibility reader for list groups that are expanded", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "An unexpected error occurred": "An unexpected error occurred", - "@An unexpected error occurred": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No description": "No description", - "@No description": { - "description": "Message used when the assignment has no description", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Launch External Tool": "Launch External Tool", - "@Launch External Tool": { - "description": "Button text added to webviews to let users open external tools in their browser", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Interactions on this page are limited by your institution.": "Interactions on this page are limited by your institution.", - "@Interactions on this page are limited by your institution.": { - "description": "Message describing how the webview has limited access due to an instution setting", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "dateAtTime": "{date} at {time}", - "@dateAtTime": { - "description": "The string to format dates", - "type": "text", - "placeholders_order": [ - "date", - "time" - ], - "placeholders": { - "date": {}, - "time": {} - } - }, - "dueDateAtTime": "Due {date} at {time}", - "@dueDateAtTime": { - "description": "The string to format due dates", - "type": "text", - "placeholders_order": [ - "date", - "time" - ], - "placeholders": { - "date": {}, - "time": {} - } - }, - "No Due Date": "No Due Date", - "@No Due Date": { - "description": "Label for assignments that do not have a due date", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Filter": "Filter", - "@Filter": { - "description": "Label for buttons to filter what items are visible", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "unread": "unread", - "@unread": { - "description": "Label for things that are marked as unread", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "unreadCount": "{count} unread", - "@unreadCount": { - "description": "Formatted string for when there are a number of unread items", - "type": "text", - "placeholders_order": [ - "count" - ], - "placeholders": { - "count": {} - } - }, - "badgeNumberPlus": "{count}+", - "@badgeNumberPlus": { - "description": "Formatted string for when too many items are being notified in a badge, generally something like: 99+", - "type": "text", - "placeholders_order": [ - "count" - ], - "placeholders": { - "count": {} - } - }, - "There was an error loading this announcement": "There was an error loading this announcement", - "@There was an error loading this announcement": { - "description": "Message shown when an announcement detail screen fails to load", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Network error": "Network error", - "@Network error": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Under Construction": "Under Construction", - "@Under Construction": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "We are currently building this feature for your viewing pleasure.": "We are currently building this feature for your viewing pleasure.", - "@We are currently building this feature for your viewing pleasure.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Request Login Help Button": "Request Login Help Button", - "@Request Login Help Button": { - "description": "Accessibility hint for button that opens help dialog for a login help request", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Request Login Help": "Request Login Help", - "@Request Login Help": { - "description": "Title of help dialog for a login help request", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I'm having trouble logging in": "I'm having trouble logging in", - "@I'm having trouble logging in": { - "description": "Subject of help dialog for a login help request", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "An error occurred when trying to display this link": "An error occurred when trying to display this link", - "@An error occurred when trying to display this link": { - "description": "Error message shown when a link can't be opened", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "We are unable to display this link, it may belong to an institution you currently aren't logged in to.": "We are unable to display this link, it may belong to an institution you currently aren't logged in to.", - "@We are unable to display this link, it may belong to an institution you currently aren't logged in to.": { - "description": "Description for error page shown when clicking a link", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Link Error": "Link Error", - "@Link Error": { - "description": "Title for error page shown when clicking a link", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Open In Browser": "Open In Browser", - "@Open In Browser": { - "description": "Text for button to open a link in the browswer", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You'll find the QR code on the web in your account profile. Click 'QR for Mobile Login' in the list.": "You'll find the QR code on the web in your account profile. Click 'QR for Mobile Login' in the list.", - "@You'll find the QR code on the web in your account profile. Click 'QR for Mobile Login' in the list.": { - "description": "Text for qr login tutorial screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Locate QR Code": "Locate QR Code", - "@Locate QR Code": { - "description": "Text for qr login button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Please scan a QR code generated by Canvas": "Please scan a QR code generated by Canvas", - "@Please scan a QR code generated by Canvas": { - "description": "Text for qr login error with incorrect qr code", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error logging in. Please generate another QR Code and try again.": "There was an error logging in. Please generate another QR Code and try again.", - "@There was an error logging in. Please generate another QR Code and try again.": { - "description": "Text for qr login error", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Screenshot showing location of QR code generation in browser": "Screenshot showing location of QR code generation in browser", - "@Screenshot showing location of QR code generation in browser": { - "description": "Content Description for qr login tutorial screenshot", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "QR scanning requires camera access": "QR scanning requires camera access", - "@QR scanning requires camera access": { - "description": "placeholder for camera error for QR code scan", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The linked item is no longer available": "The linked item is no longer available", - "@The linked item is no longer available": { - "description": "error message when the alert could no be opened", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Message sent": "Message sent", - "@Message sent": { - "description": "confirmation message on the screen when the user succesfully sends a message", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Acceptable Use Policy": "Acceptable Use Policy", - "@Acceptable Use Policy": { - "description": "title for the acceptable use policy screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Submit": "Submit", - "@Submit": { - "description": "submit button title for acceptable use policy screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Either you're a new user or the Acceptable Use Policy has changed since you last agreed to it. Please agree to the Acceptable Use Policy before you continue.": "Either you're a new user or the Acceptable Use Policy has changed since you last agreed to it. Please agree to the Acceptable Use Policy before you continue.", - "@Either you're a new user or the Acceptable Use Policy has changed since you last agreed to it. Please agree to the Acceptable Use Policy before you continue.": { - "description": "acceptable use policy screen description", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I agree to the Acceptable Use Policy.": "I agree to the Acceptable Use Policy.", - "@I agree to the Acceptable Use Policy.": { - "description": "acceptable use policy switch title", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "About": "About", - "@About": { - "description": "Title for about menu item in settings", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "App": "App", - "@App": { - "description": "Title for App field on about page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Login ID": "Login ID", - "@Login ID": { - "description": "Title for Login ID field on about page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Email": "Email", - "@Email": { - "description": "Title for Email field on about page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Version": "Version", - "@Version": { - "description": "Title for Version field on about page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Instructure logo": "Instructure logo", - "@Instructure logo": { - "description": "Semantics label for the Instructure logo on the about page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - } -} \ No newline at end of file diff --git a/apps/flutter_parent/lib/l10n/res/intl_en_AU.arb b/apps/flutter_parent/lib/l10n/res/intl_en_AU.arb deleted file mode 100644 index 1436c15ccb..0000000000 --- a/apps/flutter_parent/lib/l10n/res/intl_en_AU.arb +++ /dev/null @@ -1,2753 +0,0 @@ -{ - "@@last_modified": "2023-08-25T11:04:20.901151", - "alertsLabel": "Alerts", - "@alertsLabel": { - "description": "The label for the Alerts tab", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "calendarLabel": "Calendar", - "@calendarLabel": { - "description": "The label for the Calendar tab", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "coursesLabel": "Courses", - "@coursesLabel": { - "description": "The label for the Courses tab", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Students": "No Students", - "@No Students": { - "description": "Text for when an observer has no students they are observing", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Tap to show student selector": "Tap to show student selector", - "@Tap to show student selector": { - "description": "Semantics label for the area that will show the student selector when tapped", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Tap to pair with a new student": "Tap to pair with a new student", - "@Tap to pair with a new student": { - "description": "Semantics label for the add student button in the student selector", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Tap to select this student": "Tap to select this student", - "@Tap to select this student": { - "description": "Semantics label on individual students in the student switcher", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Manage Students": "Manage Students", - "@Manage Students": { - "description": "Label text for the Manage Students nav drawer button as well as the title for the Manage Students screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Help": "Help", - "@Help": { - "description": "Label text for the help nav drawer button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Log Out": "Log Out", - "@Log Out": { - "description": "Label text for the Log Out nav drawer button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Switch Users": "Switch Users", - "@Switch Users": { - "description": "Label text for the Switch Users nav drawer button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "appVersion": "v. {version}", - "@appVersion": { - "description": "App version shown in the navigation drawer", - "type": "text", - "placeholders_order": [ - "version" - ], - "placeholders": { - "version": {} - } - }, - "Are you sure you want to log out?": "Are you sure you want to log out?", - "@Are you sure you want to log out?": { - "description": "Confirmation message displayed when the user tries to log out", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Calendars": "Calendars", - "@Calendars": { - "description": "Label for button that lets users select which calendars to display", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "nextMonth": "Next month: {month}", - "@nextMonth": { - "description": "Label for the button that switches the calendar to the next month", - "type": "text", - "placeholders_order": [ - "month" - ], - "placeholders": { - "month": {} - } - }, - "previousMonth": "Previous month: {month}", - "@previousMonth": { - "description": "Label for the button that switches the calendar to the previous month", - "type": "text", - "placeholders_order": [ - "month" - ], - "placeholders": { - "month": {} - } - }, - "nextWeek": "Next week starting {date}", - "@nextWeek": { - "description": "Label for the button that switches the calendar to the next week", - "type": "text", - "placeholders_order": [ - "date" - ], - "placeholders": { - "date": {} - } - }, - "previousWeek": "Previous week starting {date}", - "@previousWeek": { - "description": "Label for the button that switches the calendar to the previous week", - "type": "text", - "placeholders_order": [ - "date" - ], - "placeholders": { - "date": {} - } - }, - "selectedMonthLabel": "Month of {month}", - "@selectedMonthLabel": { - "description": "Accessibility label for the button that expands/collapses the month view", - "type": "text", - "placeholders_order": [ - "month" - ], - "placeholders": { - "month": {} - } - }, - "expand": "expand", - "@expand": { - "description": "Accessibility label for the on-tap hint for the button that expands/collapses the month view", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "collapse": "collapse", - "@collapse": { - "description": "Accessibility label for the on-tap hint for the button that expands/collapses the month view", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "pointsPossible": "{points} points possible", - "@pointsPossible": { - "description": "Screen reader label used for the points possible for an assignment, quiz, etc.", - "type": "text", - "placeholders_order": [ - "points" - ], - "placeholders": { - "points": {} - } - }, - "calendarDaySemanticsLabel": "{eventCount,plural, =1{{date}, {eventCount} event}other{{date}, {eventCount} events}}", - "@calendarDaySemanticsLabel": { - "description": "Screen reader label used for calendar day, reads the date and count of events", - "type": "text", - "placeholders_order": [ - "date", - "eventCount" - ], - "placeholders": { - "date": {}, - "eventCount": {} - } - }, - "No Events Today!": "No Events Today!", - "@No Events Today!": { - "description": "Title displayed when there are no calendar events for the current day", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "It looks like a great day to rest, relax, and recharge.": "It looks like a great day to rest, relax, and recharge.", - "@It looks like a great day to rest, relax, and recharge.": { - "description": "Message displayed when there are no calendar events for the current day", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading your student's calendar": "There was an error loading your student's calendar", - "@There was an error loading your student's calendar": { - "description": "Message displayed when calendar events could not be loaded for the current student", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Tap to favorite the courses you want to see on the Calendar. Select up to 10.": "Tap to favourite the courses you want to see on the Calendar. Select up to 10.", - "@Tap to favorite the courses you want to see on the Calendar. Select up to 10.": { - "description": "Description text on calendar filter screen.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You may only choose 10 calendars to display": "You may only choose 10 calendars to display", - "@You may only choose 10 calendars to display": { - "description": "Error text when trying to select more than 10 calendars", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You must select at least one calendar to display": "You must select at least one calendar to display", - "@You must select at least one calendar to display": { - "description": "Error text when trying to de-select all calendars", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Planner Note": "Planner Note", - "@Planner Note": { - "description": "Label used for notes in the planner", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Go to today": "Go to today", - "@Go to today": { - "description": "Accessibility label used for the today button in the planner", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Previous Logins": "Previous Logins", - "@Previous Logins": { - "description": "Label for the list of previous user logins", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "canvasLogoLabel": "Canvas logo", - "@canvasLogoLabel": { - "description": "The semantics label for the Canvas logo", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "findSchool": "Find School", - "@findSchool": { - "description": "Text for the find-my-school button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "findAnotherSchool": "Find another school", - "@findAnotherSchool": { - "description": "Text for the find-another-school button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "domainSearchInputHint": "Enter school name or district…", - "@domainSearchInputHint": { - "description": "Input hint for the text box on the domain search screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "noDomainResults": "Unable to find schools matching \"{query}\"", - "@noDomainResults": { - "description": "Message shown to users when the domain search query did not return any results", - "type": "text", - "placeholders_order": [ - "query" - ], - "placeholders": { - "query": {} - } - }, - "domainSearchHelpLabel": "How do I find my school or district?", - "@domainSearchHelpLabel": { - "description": "Label for the help button on the domain search screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "canvasGuides": "Canvas Guides", - "@canvasGuides": { - "description": "Proper name for the Canvas Guides. This will be used in the domainSearchHelpBody text and will be highlighted and clickable", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "canvasSupport": "Canvas Support", - "@canvasSupport": { - "description": "Proper name for Canvas Support. This will be used in the domainSearchHelpBody text and will be highlighted and clickable", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "domainSearchHelpBody": "Try searching for the name of the school or district you’re attempting to access, like “Smith Private School” or “Smith County Schools.” You can also enter a Canvas domain directly, like “smith.instructure.com.”\n\nFor more information on finding your institution’s Canvas account, you can visit the {canvasGuides}, reach out to {canvasSupport}, or contact your school for assistance.", - "@domainSearchHelpBody": { - "description": "The body text shown in the help dialog on the domain search screen", - "type": "text", - "placeholders_order": [ - "canvasGuides", - "canvasSupport" - ], - "placeholders": { - "canvasGuides": {}, - "canvasSupport": {} - } - }, - "Uh oh!": "Uh oh!", - "@Uh oh!": { - "description": "Title of the screen that shows when a crash has occurred", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "We’re not sure what happened, but it wasn’t good. Contact us if this keeps happening.": "We’re not sure what happened, but it wasn’t good. Contact us if this keeps happening.", - "@We’re not sure what happened, but it wasn’t good. Contact us if this keeps happening.": { - "description": "Message shown when a crash has occurred", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Contact Support": "Contact Support", - "@Contact Support": { - "description": "Label for the button that allows users to contact support after a crash has occurred", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "View error details": "View error details", - "@View error details": { - "description": "Label for the button that allowed users to view crash details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Restart app": "Restart app", - "@Restart app": { - "description": "Label for the button that will restart the entire application", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Application version": "Application version", - "@Application version": { - "description": "Label for the application version displayed in the crash details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Device model": "Device model", - "@Device model": { - "description": "Label for the device model displayed in the crash details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Android OS version": "Android OS version", - "@Android OS version": { - "description": "Label for the Android operating system version displayed in the crash details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Full error message": "Full error message", - "@Full error message": { - "description": "Label for the full error message displayed in the crash details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Inbox": "Inbox", - "@Inbox": { - "description": "Title for the Inbox screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading your inbox messages.": "There was an error loading your inbox messages.", - "@There was an error loading your inbox messages.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Subject": "No Subject", - "@No Subject": { - "description": "Title used for inbox messages that have no subject", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unable to fetch courses. Please check your connection and try again.": "Unable to fetch courses. Please check your connection and try again.", - "@Unable to fetch courses. Please check your connection and try again.": { - "description": "Message shown when an error occured while loading courses", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Choose a course to message": "Choose a course to message", - "@Choose a course to message": { - "description": "Header in the course list shown when the user is choosing which course to associate with a new message", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Inbox Zero": "Inbox Zero", - "@Inbox Zero": { - "description": "Title of the message shown when there are no inbox messages", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You’re all caught up!": "You’re all caught up!", - "@You’re all caught up!": { - "description": "Subtitle of the message shown when there are no inbox messages", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading recipients for this course": "There was an error loading recipients for this course", - "@There was an error loading recipients for this course": { - "description": "Message shown when attempting to create a new message but the recipients list failed to load", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unable to send message. Check your connection and try again.": "Unable to send message. Check your connection and try again.", - "@Unable to send message. Check your connection and try again.": { - "description": "Message show when there was an error creating or sending a new message", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unsaved changes": "Unsaved changes", - "@Unsaved changes": { - "description": "Title of the dialog shown when the user tries to leave with unsaved changes", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Are you sure you wish to close this page? Your unsent message will be lost.": "Are you sure you wish to close this page? Your unsent message will be lost.", - "@Are you sure you wish to close this page? Your unsent message will be lost.": { - "description": "Body text of the dialog shown when the user tries leave with unsaved changes", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "New message": "New message", - "@New message": { - "description": "Title of the new-message screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Add attachment": "Add attachment", - "@Add attachment": { - "description": "Tooltip for the add-attachment button in the new-message screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Send message": "Send message", - "@Send message": { - "description": "Tooltip for the send-message button in the new-message screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Select recipients": "Select recipients", - "@Select recipients": { - "description": "Tooltip for the button that allows users to select message recipients", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No recipients selected": "No recipients selected", - "@No recipients selected": { - "description": "Hint displayed when the user has not selected any message recipients", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Message subject": "Message subject", - "@Message subject": { - "description": "Hint text displayed in the input field for the message subject", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Message": "Message", - "@Message": { - "description": "Hint text displayed in the input field for the message body", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Recipients": "Recipients", - "@Recipients": { - "description": "Label for message recipients", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "plusRecipientCount": "+{count}", - "@plusRecipientCount": { - "description": "Shows the number of recipients that are selected but not displayed on screen.", - "type": "text", - "placeholders_order": [ - "count" - ], - "placeholders": { - "count": { - "example": 5 - } - } - }, - "Failed. Tap for options.": "Failed. Tap for options.", - "@Failed. Tap for options.": { - "description": "Short message shown on a message attachment when uploading has failed", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "courseForWhom": "for {studentShortName}", - "@courseForWhom": { - "description": "Describes for whom a course is for (i.e. for Bill)", - "type": "text", - "placeholders_order": [ - "studentShortName" - ], - "placeholders": { - "studentShortName": {} - } - }, - "messageLinkPostscript": "Regarding: {studentName}, {linkUrl}", - "@messageLinkPostscript": { - "description": "A postscript appended to new messages that clarifies which student is the subject of the message and also includes a URL for the related Canvas component (course, assignment, event, etc).", - "type": "text", - "placeholders_order": [ - "studentName", - "linkUrl" - ], - "placeholders": { - "studentName": {}, - "linkUrl": {} - } - }, - "There was an error loading this conversation": "There was an error loading this conversation", - "@There was an error loading this conversation": { - "description": "Message shown when a conversation fails to load", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Reply": "Reply", - "@Reply": { - "description": "Button label for replying to a conversation", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Reply All": "Reply All", - "@Reply All": { - "description": "Button label for replying to all conversation participants", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unknown User": "Unknown User", - "@Unknown User": { - "description": "Label used where the user name is not known", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "me": "me", - "@me": { - "description": "First-person pronoun (i.e. 'me') that will be used in message author info, e.g. 'Me to 4 others' or 'Jon Snow to me'", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "authorToRecipient": "{authorName} to {recipientName}", - "@authorToRecipient": { - "description": "Author info for a single-recipient message; includes both the author name and the recipient name.", - "type": "text", - "placeholders_order": [ - "authorName", - "recipientName" - ], - "placeholders": { - "authorName": {}, - "recipientName": {} - } - }, - "authorToNOthers": "{howMany,plural, =1{{authorName} to 1 other}other{{authorName} to {howMany} others}}", - "@authorToNOthers": { - "description": "Author info for a mutli-recipient message; includes the author name and the number of recipients", - "type": "text", - "placeholders_order": [ - "authorName", - "howMany" - ], - "placeholders": { - "authorName": {}, - "howMany": {} - } - }, - "authorToRecipientAndNOthers": "{howMany,plural, =1{{authorName} to {recipientName} & 1 other}other{{authorName} to {recipientName} & {howMany} others}}", - "@authorToRecipientAndNOthers": { - "description": "Author info for a multi-recipient message; includes the author name, one recipient name, and the number of other recipients", - "type": "text", - "placeholders_order": [ - "authorName", - "recipientName", - "howMany" - ], - "placeholders": { - "authorName": {}, - "recipientName": {}, - "howMany": {} - } - }, - "Download": "Download", - "@Download": { - "description": "Label for the button that will begin downloading a file", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Open with another app": "Open with another app", - "@Open with another app": { - "description": "Label for the button that will allow users to open a file with another app", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There are no installed applications that can open this file": "There are no installed applications that can open this file", - "@There are no installed applications that can open this file": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unsupported File": "Unsupported File", - "@Unsupported File": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "This file is unsupported and can’t be viewed through the app": "This file is unsupported and can’t be viewed through the app", - "@This file is unsupported and can’t be viewed through the app": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unable to play this media file": "Unable to play this media file", - "@Unable to play this media file": { - "description": "Message shown when audio or video media could not be played", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unable to load this image": "Unable to load this image", - "@Unable to load this image": { - "description": "Message shown when an image file could not be loaded or displayed", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading this file": "There was an error loading this file", - "@There was an error loading this file": { - "description": "Message shown when a file could not be loaded or displayed", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Courses": "No Courses", - "@No Courses": { - "description": "Title for having no courses", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Your student’s courses might not be published yet.": "Your students' courses might not be published yet.", - "@Your student’s courses might not be published yet.": { - "description": "Message for having no courses", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading your student’s courses.": "There was an error loading your student’s courses.", - "@There was an error loading your student’s courses.": { - "description": "Message displayed when the list of student courses could not be loaded", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Grade": "No Mark", - "@No Grade": { - "description": "Message shown when there is currently no grade available for a course", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Filter by": "Filter by", - "@Filter by": { - "description": "Title for list of terms to filter grades by", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Grades": "Marks", - "@Grades": { - "description": "Label for the \"Grades\" tab in course details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Syllabus": "Syllabus", - "@Syllabus": { - "description": "Label for the \"Syllabus\" tab in course details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Front Page": "Front Page", - "@Front Page": { - "description": "Label for the \"Front Page\" tab in course details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Summary": "Summary", - "@Summary": { - "description": "Label for the \"Summary\" tab in course details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Send a message about this course": "Send a message about this course", - "@Send a message about this course": { - "description": "Accessibility hint for the course messaage floating action button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Total Grade": "Total Mark", - "@Total Grade": { - "description": "Label for the total grade in the course", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Graded": "Marked", - "@Graded": { - "description": "Label for assignments that have been graded", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Submitted": "Submitted", - "@Submitted": { - "description": "Label for assignments that have been submitted", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Not Submitted": "Not Submitted", - "@Not Submitted": { - "description": "Label for assignments that have not been submitted", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Late": "Late", - "@Late": { - "description": "Label for assignments that have been marked late or submitted late", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Missing": "Missing", - "@Missing": { - "description": "Label for assignments that have been marked missing or are not submitted and past the due date", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "-": "-", - "@-": { - "description": "Value representing no score for student submission", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "All Grading Periods": "All Marking Periods", - "@All Grading Periods": { - "description": "Label for selecting all grading periods", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Assignments": "No Assignments", - "@No Assignments": { - "description": "Title for the no assignments message", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "It looks like assignments haven't been created in this space yet.": "It looks like assignments haven't been created in this space yet.", - "@It looks like assignments haven't been created in this space yet.": { - "description": "Message for no assignments", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading the summary details for this course.": "There was an error loading the summary details for this course.", - "@There was an error loading the summary details for this course.": { - "description": "Message shown when the course summary could not be loaded", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Summary": "No Summary", - "@No Summary": { - "description": "Title displayed when there are no items in the course summary", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "This course does not have any assignments or calendar events yet.": "This course does not have any assignments or calendar events yet.", - "@This course does not have any assignments or calendar events yet.": { - "description": "Message displayed when there are no items in the course summary", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "gradeFormatScoreOutOfPointsPossible": "{score} / {pointsPossible}", - "@gradeFormatScoreOutOfPointsPossible": { - "description": "Formatted string for a student score out of the points possible", - "type": "text", - "placeholders_order": [ - "score", - "pointsPossible" - ], - "placeholders": { - "score": {}, - "pointsPossible": {} - } - }, - "contentDescriptionScoreOutOfPointsPossible": "{score} out of {pointsPossible} points", - "@contentDescriptionScoreOutOfPointsPossible": { - "description": "Formatted string for a student score out of the points possible", - "type": "text", - "placeholders_order": [ - "score", - "pointsPossible" - ], - "placeholders": { - "score": {}, - "pointsPossible": {} - } - }, - "gradesSubjectMessage": "Regarding: {studentName}, Marks", - "@gradesSubjectMessage": { - "description": "The subject line for a message to a teacher regarding a student's grades", - "type": "text", - "placeholders_order": [ - "studentName" - ], - "placeholders": { - "studentName": {} - } - }, - "syllabusSubjectMessage": "Regarding: {studentName}, Syllabus", - "@syllabusSubjectMessage": { - "description": "The subject line for a message to a teacher regarding a course syllabus", - "type": "text", - "placeholders_order": [ - "studentName" - ], - "placeholders": { - "studentName": {} - } - }, - "frontPageSubjectMessage": "Regarding: {studentName}, Front Page", - "@frontPageSubjectMessage": { - "description": "The subject line for a message to a teacher regarding a course front page", - "type": "text", - "placeholders_order": [ - "studentName" - ], - "placeholders": { - "studentName": {} - } - }, - "assignmentSubjectMessage": "Regarding: {studentName}, Assignment - {assignmentName}", - "@assignmentSubjectMessage": { - "description": "The subject line for a message to a teacher regarding a student's assignment", - "type": "text", - "placeholders_order": [ - "studentName", - "assignmentName" - ], - "placeholders": { - "studentName": {}, - "assignmentName": {} - } - }, - "eventSubjectMessage": "Regarding: {studentName}, Event - {eventTitle}", - "@eventSubjectMessage": { - "description": "The subject line for a message to a teacher regarding a calendar event", - "type": "text", - "placeholders_order": [ - "studentName", - "eventTitle" - ], - "placeholders": { - "studentName": {}, - "eventTitle": {} - } - }, - "There is no page information available.": "There is no page information available.", - "@There is no page information available.": { - "description": "Description for when no page information is available", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Assignment Details": "Assignment Details", - "@Assignment Details": { - "description": "Title for the page that shows details for an assignment", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "assignmentTotalPoints": "{points} pts", - "@assignmentTotalPoints": { - "description": "Label used for the total points the assignment is worth", - "type": "text", - "placeholders_order": [ - "points" - ], - "placeholders": { - "points": {} - } - }, - "assignmentTotalPointsAccessible": "{points} points", - "@assignmentTotalPointsAccessible": { - "description": "Screen reader label used for the total points the assignment is worth", - "type": "text", - "placeholders_order": [ - "points" - ], - "placeholders": { - "points": {} - } - }, - "Due": "Due", - "@Due": { - "description": "Label for an assignment due date", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Grade": "Mark", - "@Grade": { - "description": "Label for the section that displays an assignment's grade", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Locked": "Locked", - "@Locked": { - "description": "Label for when an assignment is locked", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "assignmentLockedModule": "This assignment is locked by the module \"{moduleName}\".", - "@assignmentLockedModule": { - "description": "The locked description when an assignment is locked by a module", - "type": "text", - "placeholders_order": [ - "moduleName" - ], - "placeholders": { - "moduleName": {} - } - }, - "Remind Me": "Remind Me", - "@Remind Me": { - "description": "Label for the row to set reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Set a date and time to be notified of this specific assignment.": "Set a date and time to be notified of this specific assignment.", - "@Set a date and time to be notified of this specific assignment.": { - "description": "Description for row to set reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You will be notified about this assignment on…": "You will be notified about this assignment on…", - "@You will be notified about this assignment on…": { - "description": "Description for when a reminder is set", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Instructions": "Instructions", - "@Instructions": { - "description": "Label for the description of the assignment when it has quiz instructions", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Send a message about this assignment": "Send a message about this assignment", - "@Send a message about this assignment": { - "description": "Accessibility hint for the assignment messaage floating action button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "This app is not authorized for use.": "This app is not authorised for use.", - "@This app is not authorized for use.": { - "description": "The error shown when the app being used is not verified by Canvas", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The server you entered is not authorized for this app.": "The server you entered is not authorised for this app.", - "@The server you entered is not authorized for this app.": { - "description": "The error shown when the desired login domain is not verified by Canvas", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The user agent for this app is not authorized.": "The user agent for this app is not authorised.", - "@The user agent for this app is not authorized.": { - "description": "The error shown when the user agent during verification is not verified by Canvas", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "We were unable to verify the server for use with this app.": "We were unable to verify the server for use with this app.", - "@We were unable to verify the server for use with this app.": { - "description": "The generic error shown when we are unable to verify with Canvas", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Reminders": "Reminders", - "@Reminders": { - "description": "Name of the system notification channel for assignment and event reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Notifications for reminders about assignments and calendar events": "Notifications for reminders about assignments and calendar events", - "@Notifications for reminders about assignments and calendar events": { - "description": "Description of the system notification channel for assignment and event reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Reminders have changed!": "Reminders have changed!", - "@Reminders have changed!": { - "description": "Title of the dialog shown when the user needs to update their reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "In order to provide you with a better experience, we have updated how reminders work. You can add new reminders by viewing an assignment or calendar event and tapping the switch under the \"Remind Me\" section.\n\nBe aware that any reminders created with older versions of this app will not be compatible with the new changes and you will need to create them again.": "In order to provide you with a better experience, we have updated how reminders work. You can add new reminders by viewing an assignment or calendar event and tapping the switch under the \"Remind Me\" section.\n\nBe aware that any reminders created with older versions of this app will not be compatible with the new changes and you will need to create them again.", - "@In order to provide you with a better experience, we have updated how reminders work. You can add new reminders by viewing an assignment or calendar event and tapping the switch under the \"Remind Me\" section.\n\nBe aware that any reminders created with older versions of this app will not be compatible with the new changes and you will need to create them again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Not a parent?": "Not a parent?", - "@Not a parent?": { - "description": "Title for the screen that shows when the user is not observing any students", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "We couldn't find any students associated with this account": "We couldn't find any students associated with this account", - "@We couldn't find any students associated with this account": { - "description": "Subtitle for the screen that shows when the user is not observing any students", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Are you a student or teacher?": "Are you a student or teacher?", - "@Are you a student or teacher?": { - "description": "Label for button that will show users the option to view other Canvas apps in the Play Store", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "One of our other apps might be a better fit. Tap one to visit the Play Store.": "One of our other apps might be a better fit. Tap one to visit the Play Store.", - "@One of our other apps might be a better fit. Tap one to visit the Play Store.": { - "description": "Description of options to view other Canvas apps in the Play Store", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Return to Login": "Return to Login", - "@Return to Login": { - "description": "Label for the button that returns the user to the login screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "STUDENT": "STUDENT", - "@STUDENT": { - "description": "The \"student\" portion of the \"Canvas Student\" app name, in all caps. \"Canvas\" is excluded in this context as it will be displayed to the user as a wordmark image", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "TEACHER": "TEACHER", - "@TEACHER": { - "description": "The \"teacher\" portion of the \"Canvas Teacher\" app name, in all caps. \"Canvas\" is excluded in this context as it will be displayed to the user as a wordmark image", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Canvas Student": "Canvas Student", - "@Canvas Student": { - "description": "The name of the Canvas Student app. Only \"Student\" should be translated as \"Canvas\" is a brand name in this context and should not be translated.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Canvas Teacher": "Canvas Teacher", - "@Canvas Teacher": { - "description": "The name of the Canvas Teacher app. Only \"Teacher\" should be translated as \"Canvas\" is a brand name in this context and should not be translated.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Alerts": "No Alerts", - "@No Alerts": { - "description": "The title for the empty message to show to users when there are no alerts for the student.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There’s nothing to be notified of yet.": "There’s nothing to be notified of yet.", - "@There’s nothing to be notified of yet.": { - "description": "The empty message to show to users when there are no alerts for the student.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "dismissAlertLabel": "Dismiss {alertTitle}", - "@dismissAlertLabel": { - "description": "Accessibility label to dismiss an alert", - "type": "text", - "placeholders_order": [ - "alertTitle" - ], - "placeholders": { - "alertTitle": {} - } - }, - "Course Announcement": "Course Announcement", - "@Course Announcement": { - "description": "Title for alerts when there is a course announcement", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Institution Announcement": "Institution Announcement", - "@Institution Announcement": { - "description": "Title for alerts when there is an institution announcement", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "assignmentGradeAboveThreshold": "Assignment Mark Above {threshold}", - "@assignmentGradeAboveThreshold": { - "description": "Title for alerts when an assignment grade is above the threshold value", - "type": "text", - "placeholders_order": [ - "threshold" - ], - "placeholders": { - "threshold": {} - } - }, - "assignmentGradeBelowThreshold": "Assignment Mark Below {threshold}", - "@assignmentGradeBelowThreshold": { - "description": "Title for alerts when an assignment grade is below the threshold value", - "type": "text", - "placeholders_order": [ - "threshold" - ], - "placeholders": { - "threshold": {} - } - }, - "courseGradeAboveThreshold": "Course Mark Above {threshold}", - "@courseGradeAboveThreshold": { - "description": "Title for alerts when a course grade is above the threshold value", - "type": "text", - "placeholders_order": [ - "threshold" - ], - "placeholders": { - "threshold": {} - } - }, - "courseGradeBelowThreshold": "Course Mark Below {threshold}", - "@courseGradeBelowThreshold": { - "description": "Title for alerts when a course grade is below the threshold value", - "type": "text", - "placeholders_order": [ - "threshold" - ], - "placeholders": { - "threshold": {} - } - }, - "Settings": "Settings", - "@Settings": { - "description": "Title for the settings screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Theme": "Theme", - "@Theme": { - "description": "Label for the light/dark theme section in the settings page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Dark Mode": "Dark Mode", - "@Dark Mode": { - "description": "Label for the button that enables dark mode", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Light Mode": "Light Mode", - "@Light Mode": { - "description": "Label for the button that enables light mode", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "High Contrast Mode": "High Contrast Mode", - "@High Contrast Mode": { - "description": "Label for the switch that toggles high contrast mode", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Use Dark Theme in Web Content": "Use Dark Theme in Web Content", - "@Use Dark Theme in Web Content": { - "description": "Label for the switch that toggles dark mode for webviews", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Appearance": "Appearance", - "@Appearance": { - "description": "Label for the appearance section in the settings page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Successfully submitted!": "Successfully submitted!", - "@Successfully submitted!": { - "description": "Title displayed in the grade cell for an assignment that has been submitted", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "submissionStatusSuccessSubtitle": "This assignment was submitted on {date} at {time} and is waiting to be marked", - "@submissionStatusSuccessSubtitle": { - "description": "Subtitle displayed in the grade cell for an assignment that has been submitted and is awaiting a grade", - "type": "text", - "placeholders_order": [ - "date", - "time" - ], - "placeholders": { - "date": {}, - "time": {} - } - }, - "outOfPoints": "{howMany,plural, =1{Out of 1 point}other{Out of {points} points}}", - "@outOfPoints": { - "description": "Description for an assignment grade that has points without a current scoroe", - "type": "text", - "placeholders_order": [ - "points", - "howMany" - ], - "placeholders": { - "points": {}, - "howMany": {} - } - }, - "Excused": "Excused", - "@Excused": { - "description": "Grading status for an assignment marked as excused", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Complete": "Complete", - "@Complete": { - "description": "Grading status for an assignment marked as complete", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Incomplete": "Incomplete", - "@Incomplete": { - "description": "Grading status for an assignment marked as incomplete", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "minus": "minus", - "@minus": { - "description": "Screen reader-friendly replacement for the \"-\" character in letter grades like \"A-\"", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "latePenalty": "Late penalty (-{pointsLost})", - "@latePenalty": { - "description": "Text displayed when a late penalty has been applied to the assignment", - "type": "text", - "placeholders_order": [ - "pointsLost" - ], - "placeholders": { - "pointsLost": {} - } - }, - "finalGrade": "Final Mark: {grade}", - "@finalGrade": { - "description": "Text that displays the final grade of an assignment", - "type": "text", - "placeholders_order": [ - "grade" - ], - "placeholders": { - "grade": {} - } - }, - "Alert Settings": "Alert Settings", - "@Alert Settings": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Alert me when…": "Alert me when…", - "@Alert me when…": { - "description": "Header for the screen where the observer chooses the thresholds that will determine when they receive alerts (e.g. when an assignment is graded below 70%)", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Course grade below": "Course mark below", - "@Course grade below": { - "description": "Label describing the threshold for when the course grade is below a certain percentage", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Course grade above": "Course mark above", - "@Course grade above": { - "description": "Label describing the threshold for when the course grade is above a certain percentage", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Assignment missing": "Assignment missing", - "@Assignment missing": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Assignment grade below": "Assignment mark below", - "@Assignment grade below": { - "description": "Label describing the threshold for when an assignment is graded below a certain percentage", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Assignment grade above": "Assignment mark above", - "@Assignment grade above": { - "description": "Label describing the threshold for when an assignment is graded above a certain percentage", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Course Announcements": "Course Announcements", - "@Course Announcements": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Institution Announcements": "Institution Announcements", - "@Institution Announcements": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Never": "Never", - "@Never": { - "description": "Indication that tells the user they will not receive alert notifications of a specific kind", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Grade percentage": "Mark percentage", - "@Grade percentage": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading your student's alerts.": "There was an error loading your students' alerts.", - "@There was an error loading your student's alerts.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Must be below 100": "Must be below 100", - "@Must be below 100": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "mustBeBelowN": "Must be below {percentage}", - "@mustBeBelowN": { - "description": "Validation error to the user that they must choose a percentage below 'n'", - "type": "text", - "placeholders_order": [ - "percentage" - ], - "placeholders": { - "percentage": { - "example": 5 - } - } - }, - "mustBeAboveN": "Must be above {percentage}", - "@mustBeAboveN": { - "description": "Validation error to the user that they must choose a percentage above 'n'", - "type": "text", - "placeholders_order": [ - "percentage" - ], - "placeholders": { - "percentage": { - "example": 5 - } - } - }, - "Select Student Color": "Select Student Colour", - "@Select Student Color": { - "description": "Title for screen that allows users to assign a color to a specific student", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Electric, blue": "Electric, blue", - "@Electric, blue": { - "description": "Name of the Electric (blue) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Plum, Purple": "Plum, Purple", - "@Plum, Purple": { - "description": "Name of the Plum (purple) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Barney, Fuschia": "Barney, Fuchsia", - "@Barney, Fuschia": { - "description": "Name of the Barney (fuschia) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Raspberry, Red": "Raspberry, Red", - "@Raspberry, Red": { - "description": "Name of the Raspberry (red) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Fire, Orange": "Fire, Orange", - "@Fire, Orange": { - "description": "Name of the Fire (orange) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Shamrock, Green": "Shamrock, Green", - "@Shamrock, Green": { - "description": "Name of the Shamrock (green) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "An error occurred while saving your selection. Please try again.": "An error occurred while saving your selection. Please try again.", - "@An error occurred while saving your selection. Please try again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "changeStudentColorLabel": "Change colour for {studentName}", - "@changeStudentColorLabel": { - "description": "Accessibility label for the button that lets users change the color associated with a specific student", - "type": "text", - "placeholders_order": [ - "studentName" - ], - "placeholders": { - "studentName": {} - } - }, - "Teacher": "Teacher", - "@Teacher": { - "description": "Label for the Teacher enrollment type", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Student": "Student", - "@Student": { - "description": "Label for the Student enrollment type", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "TA": "TA", - "@TA": { - "description": "Label for the Teaching Assistant enrollment type (also known as Teacher Aid or Education Assistant), reduced to a short acronym/initialism if appropriate.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Observer": "Observer", - "@Observer": { - "description": "Label for the Observer enrollment type", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Use Camera": "Use Camera", - "@Use Camera": { - "description": "Label for the action item that lets the user capture a photo using the device camera", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Upload File": "Upload File", - "@Upload File": { - "description": "Label for the action item that lets the user upload a file from their device", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Choose from Gallery": "Choose from Gallery", - "@Choose from Gallery": { - "description": "Label for the action item that lets the user select a photo from their device gallery", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Preparing…": "Preparing…", - "@Preparing…": { - "description": "Message shown while a file is being prepared to attach to a message", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Add student with…": "Add student with…", - "@Add student with…": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Add Student": "Add Student", - "@Add Student": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You are not observing any students.": "You are not observing any students.", - "@You are not observing any students.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading your students.": "There was an error loading your students.", - "@There was an error loading your students.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Pairing Code": "Pairing Code", - "@Pairing Code": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Students can obtain a pairing code through the Canvas website": "Students can obtain a pairing code through the Canvas website", - "@Students can obtain a pairing code through the Canvas website": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Enter the student pairing code provided to you. If the pairing code doesn't work, it may have expired": "Enter the student pairing code provided to you. If the pairing code doesn't work, it may have expired", - "@Enter the student pairing code provided to you. If the pairing code doesn't work, it may have expired": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Your code is incorrect or expired.": "Your code is incorrect or expired.", - "@Your code is incorrect or expired.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Something went wrong trying to create your account, please reach out to your school for assistance.": "Something went wrong trying to create your account, please reach out to your school for assistance.", - "@Something went wrong trying to create your account, please reach out to your school for assistance.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "QR Code": "QR Code", - "@QR Code": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Students can create a QR code using the Canvas Student app on their mobile device": "Students can create a QR code using the Canvas Student app on their mobile device", - "@Students can create a QR code using the Canvas Student app on their mobile device": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Add new student": "Add new student", - "@Add new student": { - "description": "Semantics label for the FAB on the Manage Students Screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Select": "Select", - "@Select": { - "description": "Hint text to tell the user to choose one of two options", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I have a Canvas account": "I have a Canvas account", - "@I have a Canvas account": { - "description": "Option to select for users that have a canvas account", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I don't have a Canvas account": "I don't have a Canvas account", - "@I don't have a Canvas account": { - "description": "Option to select for users that don't have a canvas account", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Create Account": "Create Account", - "@Create Account": { - "description": "Button text for account creation confirmation", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Full Name": "Full Name", - "@Full Name": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Email Address": "Email Address", - "@Email Address": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Password": "Password", - "@Password": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Full Name…": "Full Name…", - "@Full Name…": { - "description": "hint label for inside form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Email…": "Email…", - "@Email…": { - "description": "hint label for inside form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Password…": "Password…", - "@Password…": { - "description": "hint label for inside form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Please enter full name": "Please enter full name", - "@Please enter full name": { - "description": "Error message for form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Please enter an email address": "Please enter an email address", - "@Please enter an email address": { - "description": "Error message for form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Please enter a valid email address": "Please enter a valid email address", - "@Please enter a valid email address": { - "description": "Error message for form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Password is required": "Password is required", - "@Password is required": { - "description": "Error message for form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Password must contain at least 8 characters": "Password must contain at least 8 characters", - "@Password must contain at least 8 characters": { - "description": "Error message for form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "qrCreateAccountTos": "By tapping 'Create Account', you agree to the {termsOfService} and acknowledge the {privacyPolicy}", - "@qrCreateAccountTos": { - "description": "The text show on the account creation screen", - "type": "text", - "placeholders_order": [ - "termsOfService", - "privacyPolicy" - ], - "placeholders": { - "termsOfService": {}, - "privacyPolicy": {} - } - }, - "Terms of Service": "Terms of Service", - "@Terms of Service": { - "description": "Label for the Canvas Terms of Service agreement. This will be used in the qrCreateAccountTos text and will be highlighted and clickable", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Privacy Policy": "Privacy Policy", - "@Privacy Policy": { - "description": "Label for the Canvas Privacy Policy agreement. This will be used in the qrCreateAccountTos text and will be highlighted and clickable", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "View the Privacy Policy": "View the Privacy Policy", - "@View the Privacy Policy": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Already have an account? ": "Already have an account? ", - "@Already have an account? ": { - "description": "Part of multiline text span, includes AccountSignIn1-2, in that order", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Sign In": "Sign In", - "@Sign In": { - "description": "Part of multiline text span, includes AccountSignIn1-2, in that order", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Hide Password": "Hide Password", - "@Hide Password": { - "description": "content description for password hide button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Show Password": "Show Password", - "@Show Password": { - "description": "content description for password show button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Terms of Service Link": "Terms of Service Link", - "@Terms of Service Link": { - "description": "content description for terms of service link", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Privacy Policy Link": "Privacy Policy Link", - "@Privacy Policy Link": { - "description": "content description for privacy policy link", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Event": "Event", - "@Event": { - "description": "Title for the event details screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Date": "Date", - "@Date": { - "description": "Label for the event date", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Location": "Location", - "@Location": { - "description": "Label for the location information", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Location Specified": "No Location Specified", - "@No Location Specified": { - "description": "Description for events that do not have a location", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "eventTime": "{startAt} - {endAt}", - "@eventTime": { - "description": "The time the event is happening, example: \"2:00 pm - 4:00 pm\"", - "type": "text", - "placeholders_order": [ - "startAt", - "endAt" - ], - "placeholders": { - "startAt": {}, - "endAt": {} - } - }, - "Set a date and time to be notified of this event.": "Set a date and time to be notified of this event.", - "@Set a date and time to be notified of this event.": { - "description": "Description for row to set event reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You will be notified about this event on…": "You will be notified about this event on…", - "@You will be notified about this event on…": { - "description": "Description for when an event reminder is set", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Share Your Love for the App": "Share Your Love for the App", - "@Share Your Love for the App": { - "description": "Label for option to open the app store", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Tell us about your favorite parts of the app": "Tell us about your favourite parts of the app.", - "@Tell us about your favorite parts of the app": { - "description": "Description for option to open the app store", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Legal": "Legal", - "@Legal": { - "description": "Label for legal information option", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Privacy policy, terms of use, open source": "Privacy policy, terms of use, open source", - "@Privacy policy, terms of use, open source": { - "description": "Description for legal information option", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Idea for Canvas Parent App [Android]": "Idea for Canvas Parent App [Android]", - "@Idea for Canvas Parent App [Android]": { - "description": "The subject for the email to request a feature", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The following information will help us better understand your idea:": "The following information will help us better understand your idea:", - "@The following information will help us better understand your idea:": { - "description": "The header for the users information that is attached to a feature request", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Domain:": "Domain:", - "@Domain:": { - "description": "The label for the Canvas domain of the logged in user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "User ID:": "User ID:", - "@User ID:": { - "description": "The label for the Canvas user ID of the logged in user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Email:": "Email:", - "@Email:": { - "description": "The label for the eamil of the logged in user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Locale:": "Locale:", - "@Locale:": { - "description": "The label for the locale of the logged in user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Terms of Use": "Terms of Use", - "@Terms of Use": { - "description": "Label for the terms of use", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Canvas on GitHub": "Canvas on GitHub", - "@Canvas on GitHub": { - "description": "Label for the button that opens the Canvas project on GitHub's website", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was a problem loading the Terms of Use": "There was a problem loading the Terms of Use", - "@There was a problem loading the Terms of Use": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Device": "Device", - "@Device": { - "description": "Label used for device manufacturer/model in the error report", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "OS Version": "OS Version", - "@OS Version": { - "description": "Label used for device operating system version in the error report", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Version Number": "Version Number", - "@Version Number": { - "description": "Label used for the app version number in the error report", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Report A Problem": "Report A Problem", - "@Report A Problem": { - "description": "Title used for generic dialog to report problems", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Subject": "Subject", - "@Subject": { - "description": "Label used for Subject text field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "A subject is required.": "A subject is required.", - "@A subject is required.": { - "description": "Error shown when the subject field is empty", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "An email address is required.": "An email address is required.", - "@An email address is required.": { - "description": "Error shown when the email field is empty", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Description": "Description", - "@Description": { - "description": "Label used for Description text field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "A description is required.": "A description is required.", - "@A description is required.": { - "description": "Error shown when the description field is empty", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "How is this affecting you?": "How is this affecting you?", - "@How is this affecting you?": { - "description": "Label used for the dropdown to select how severe the issue is", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "send": "send", - "@send": { - "description": "Label used for send button when reporting a problem", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Just a casual question, comment, idea, suggestion…": "Just a casual question, comment, idea, suggestion…", - "@Just a casual question, comment, idea, suggestion…": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I need some help but it's not urgent.": "I need some help, but it's not urgent.", - "@I need some help but it's not urgent.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Something's broken but I can work around it to get what I need done.": "Something's broken, but I can work around it to get what I need done.", - "@Something's broken but I can work around it to get what I need done.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I can't get things done until I hear back from you.": "I can't get things done until I hear back from you.", - "@I can't get things done until I hear back from you.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "EXTREME CRITICAL EMERGENCY!!": "EXTREME CRITICAL EMERGENCY!!", - "@EXTREME CRITICAL EMERGENCY!!": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Not Graded": "Not Marked", - "@Not Graded": { - "description": "Description for an assignment has not been graded.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Login flow: Normal": "Login flow: Normal", - "@Login flow: Normal": { - "description": "Description for the normal login flow", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Login flow: Canvas": "Login flow: Canvas", - "@Login flow: Canvas": { - "description": "Description for the Canvas login flow", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Login flow: Site Admin": "Login flow: Site Admin", - "@Login flow: Site Admin": { - "description": "Description for the Site Admin login flow", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Login flow: Skip mobile verify": "Login flow: Skip mobile verify", - "@Login flow: Skip mobile verify": { - "description": "Description for the login flow that skips domain verification for mobile", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Act As User": "Act As User", - "@Act As User": { - "description": "Label for the button that allows the user to act (masquerade) as another user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Stop Acting as User": "Stop Acting as User", - "@Stop Acting as User": { - "description": "Label for the button that allows the user to stop acting (masquerading) as another user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "actingAsUser": "You are acting as {userName}", - "@actingAsUser": { - "description": "Message shown while acting (masquerading) as another user", - "type": "text", - "placeholders_order": [ - "userName" - ], - "placeholders": { - "userName": {} - } - }, - "\"Act as\" is essentially logging in as this user without a password. You will be able to take any action as if you were this user, and from other users' points of views, it will be as if this user performed them. However, audit logs record that you were the one who performed the actions on behalf of this user.": "\"Act as\" is essentially logging in as this user without a password. You will be able to take any action as if you were this user, and from other users' points of views, it will be as if this user performed them. However, audit logs record that you were the one who performed the actions on behalf of this user.", - "@\"Act as\" is essentially logging in as this user without a password. You will be able to take any action as if you were this user, and from other users' points of views, it will be as if this user performed them. However, audit logs record that you were the one who performed the actions on behalf of this user.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Domain": "Domain", - "@Domain": { - "description": "Text field hint for domain url input", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You must enter a valid domain": "You must enter a valid domain", - "@You must enter a valid domain": { - "description": "Message displayed for domain input error", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "User ID": "User ID", - "@User ID": { - "description": "Text field hint for user ID input", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You must enter a user id": "You must enter a user id", - "@You must enter a user id": { - "description": "Message displayed for user Id input error", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error trying to act as this user. Please check the Domain and User ID and try again.": "There was an error trying to act as this user. Please check the Domain and User ID and try again.", - "@There was an error trying to act as this user. Please check the Domain and User ID and try again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "endMasqueradeMessage": "You will stop acting as {userName} and return to your original account.", - "@endMasqueradeMessage": { - "description": "Confirmation message displayed when the user wants to stop acting (masquerading) as another user", - "type": "text", - "placeholders_order": [ - "userName" - ], - "placeholders": { - "userName": {} - } - }, - "endMasqueradeLogoutMessage": "You will stop acting as {userName} and will be logged out.", - "@endMasqueradeLogoutMessage": { - "description": "Confirmation message displayed when the user wants to stop acting (masquerading) as another user and will be logged out.", - "type": "text", - "placeholders_order": [ - "userName" - ], - "placeholders": { - "userName": {} - } - }, - "How are we doing?": "How are we doing?", - "@How are we doing?": { - "description": "Title for dialog asking user to rate the app out of 5 stars.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Don't show again": "Don't show again", - "@Don't show again": { - "description": "Button to prevent the rating dialog from showing again.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "What can we do better?": "What can we do better?", - "@What can we do better?": { - "description": "Hint text for providing a comment with the rating.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Send Feedback": "Send Feedback", - "@Send Feedback": { - "description": "Button to send rating with feedback", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "ratingDialogEmailSubject": "Suggestions for Android - Canvas Parent {version}", - "@ratingDialogEmailSubject": { - "description": "The subject for an email to provide feedback for CanvasParent.", - "type": "text", - "placeholders_order": [ - "version" - ], - "placeholders": { - "version": {} - } - }, - "starRating": "{position,plural, =1{{position} star}other{{position} stars}}", - "@starRating": { - "description": "Accessibility label for the 1 stars to 5 stars rating", - "type": "text", - "placeholders_order": [ - "position" - ], - "placeholders": { - "position": { - "example": 1 - } - } - }, - "Student Pairing": "Student Pairing", - "@Student Pairing": { - "description": "Title for the screen where users can pair to students using a QR code", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Open Canvas Student": "Open Canvas Student", - "@Open Canvas Student": { - "description": "Title for QR pairing tutorial screen instructing users to open the Canvas Student app", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You'll need to open your student's Canvas Student app to continue. Go into Main Menu > Settings > Pair with Observer and scan the QR code you see there.": "You'll need to open your student's Canvas Student app to continue. Go into Main Menu > Settings > Pair with Observer and scan the QR code you see there.", - "@You'll need to open your student's Canvas Student app to continue. Go into Main Menu > Settings > Pair with Observer and scan the QR code you see there.": { - "description": "Message explaining how QR code pairing works", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Screenshot showing location of pairing QR code generation in the Canvas Student app": "Screenshot showing location of pairing QR code generation in the Canvas Student app", - "@Screenshot showing location of pairing QR code generation in the Canvas Student app": { - "description": "Content Description for qr pairing tutorial screenshot", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Expired QR Code": "Expired QR Code", - "@Expired QR Code": { - "description": "Error title shown when the users scans a QR code that has expired", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The QR code you scanned may have expired. Refresh the code on the student's device and try again.": "The QR code you scanned may have expired. Refresh the code on the student's device and try again.", - "@The QR code you scanned may have expired. Refresh the code on the student's device and try again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "A network error occurred when adding this student. Check your connection and try again.": "A network error occurred when adding this student. Check your connection and try again.", - "@A network error occurred when adding this student. Check your connection and try again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Invalid QR Code": "Invalid QR Code", - "@Invalid QR Code": { - "description": "Error title shown when the user scans an invalid QR code", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Incorrect Domain": "Incorrect Domain", - "@Incorrect Domain": { - "description": "Error title shown when the users scane a QR code for a student that belongs to a different domain", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The student you are trying to add belongs to a different school. Log in or create an account with that school to scan this code.": "The student you are trying to add belongs to a different school. Log in or create an account with that school to scan this code.", - "@The student you are trying to add belongs to a different school. Log in or create an account with that school to scan this code.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Camera Permission": "Camera Permission", - "@Camera Permission": { - "description": "Error title shown when the user wans to scan a QR code but has denied the camera permission", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "This will unpair and remove all enrollments for this student from your account.": "This will unpair and remove all enrolments for this student from your account.", - "@This will unpair and remove all enrollments for this student from your account.": { - "description": "Confirmation message shown when the user tries to delete a student from their account", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was a problem removing this student from your account. Please check your connection and try again.": "There was a problem removing this student from your account. Please check your connection and try again.", - "@There was a problem removing this student from your account. Please check your connection and try again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Cancel": "Cancel", - "@Cancel": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "next": "Next", - "@next": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "ok": "OK", - "@ok": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Yes": "Yes", - "@Yes": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No": "No", - "@No": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Retry": "Retry", - "@Retry": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Delete": "Delete", - "@Delete": { - "description": "Label used for general delete/remove actions", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Done": "Done", - "@Done": { - "description": "Label for general done/finished actions", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Refresh": "Refresh", - "@Refresh": { - "description": "Label for button to refresh data from the web", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "View Description": "View Description", - "@View Description": { - "description": "Button to view the description for an event or assignment", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "expanded": "expanded", - "@expanded": { - "description": "Description for the accessibility reader for list groups that are expanded", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "collapsed": "collapsed", - "@collapsed": { - "description": "Description for the accessibility reader for list groups that are expanded", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "An unexpected error occurred": "An unexpected error occurred", - "@An unexpected error occurred": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No description": "No description", - "@No description": { - "description": "Message used when the assignment has no description", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Launch External Tool": "Launch External Tool", - "@Launch External Tool": { - "description": "Button text added to webviews to let users open external tools in their browser", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Interactions on this page are limited by your institution.": "Interactions on this page are limited by your institution.", - "@Interactions on this page are limited by your institution.": { - "description": "Message describing how the webview has limited access due to an instution setting", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "dateAtTime": "{date} at {time}", - "@dateAtTime": { - "description": "The string to format dates", - "type": "text", - "placeholders_order": [ - "date", - "time" - ], - "placeholders": { - "date": {}, - "time": {} - } - }, - "dueDateAtTime": "Due {date} at {time}", - "@dueDateAtTime": { - "description": "The string to format due dates", - "type": "text", - "placeholders_order": [ - "date", - "time" - ], - "placeholders": { - "date": {}, - "time": {} - } - }, - "No Due Date": "No Due Date", - "@No Due Date": { - "description": "Label for assignments that do not have a due date", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Filter": "Filter", - "@Filter": { - "description": "Label for buttons to filter what items are visible", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "unread": "unread", - "@unread": { - "description": "Label for things that are marked as unread", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "unreadCount": "{count} unread", - "@unreadCount": { - "description": "Formatted string for when there are a number of unread items", - "type": "text", - "placeholders_order": [ - "count" - ], - "placeholders": { - "count": {} - } - }, - "badgeNumberPlus": "{count}+", - "@badgeNumberPlus": { - "description": "Formatted string for when too many items are being notified in a badge, generally something like: 99+", - "type": "text", - "placeholders_order": [ - "count" - ], - "placeholders": { - "count": {} - } - }, - "There was an error loading this announcement": "There was an error loading this announcement", - "@There was an error loading this announcement": { - "description": "Message shown when an announcement detail screen fails to load", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Network error": "Network error", - "@Network error": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Under Construction": "Under Construction", - "@Under Construction": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "We are currently building this feature for your viewing pleasure.": "We are currently building this feature for your viewing pleasure.", - "@We are currently building this feature for your viewing pleasure.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Request Login Help Button": "Request Login Help Button", - "@Request Login Help Button": { - "description": "Accessibility hint for button that opens help dialog for a login help request", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Request Login Help": "Request Login Help", - "@Request Login Help": { - "description": "Title of help dialog for a login help request", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I'm having trouble logging in": "I'm having trouble logging in", - "@I'm having trouble logging in": { - "description": "Subject of help dialog for a login help request", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "An error occurred when trying to display this link": "An error occurred when trying to display this link", - "@An error occurred when trying to display this link": { - "description": "Error message shown when a link can't be opened", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "We are unable to display this link, it may belong to an institution you currently aren't logged in to.": "We are unable to display this link; it may belong to an institution you currently aren't logged in to.", - "@We are unable to display this link, it may belong to an institution you currently aren't logged in to.": { - "description": "Description for error page shown when clicking a link", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Link Error": "Link Error", - "@Link Error": { - "description": "Title for error page shown when clicking a link", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Open In Browser": "Open In Browser", - "@Open In Browser": { - "description": "Text for button to open a link in the browswer", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You'll find the QR code on the web in your account profile. Click 'QR for Mobile Login' in the list.": "You'll find the QR code on the web in your account profile. Click 'QR for Mobile Login' in the list.", - "@You'll find the QR code on the web in your account profile. Click 'QR for Mobile Login' in the list.": { - "description": "Text for qr login tutorial screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Locate QR Code": "Locate QR Code", - "@Locate QR Code": { - "description": "Text for qr login button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Please scan a QR code generated by Canvas": "Please scan a QR code generated by Canvas", - "@Please scan a QR code generated by Canvas": { - "description": "Text for qr login error with incorrect qr code", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error logging in. Please generate another QR Code and try again.": "There was an error logging in. Please generate another QR Code and try again.", - "@There was an error logging in. Please generate another QR Code and try again.": { - "description": "Text for qr login error", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Screenshot showing location of QR code generation in browser": "Screenshot showing location of QR code generation in browser", - "@Screenshot showing location of QR code generation in browser": { - "description": "Content Description for qr login tutorial screenshot", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "QR scanning requires camera access": "QR scanning requires camera access", - "@QR scanning requires camera access": { - "description": "placeholder for camera error for QR code scan", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The linked item is no longer available": "The linked item is no longer available", - "@The linked item is no longer available": { - "description": "error message when the alert could no be opened", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Message sent": "Message sent", - "@Message sent": { - "description": "confirmation message on the screen when the user succesfully sends a message", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Acceptable Use Policy": "Acceptable Use Policy", - "@Acceptable Use Policy": { - "description": "title for the acceptable use policy screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Submit": "Submit", - "@Submit": { - "description": "submit button title for acceptable use policy screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Either you're a new user or the Acceptable Use Policy has changed since you last agreed to it. Please agree to the Acceptable Use Policy before you continue.": "Either you're a new user or the Acceptable Use Policy has changed since you last agreed to it. Please agree to the Acceptable Use Policy before you continue.", - "@Either you're a new user or the Acceptable Use Policy has changed since you last agreed to it. Please agree to the Acceptable Use Policy before you continue.": { - "description": "acceptable use policy screen description", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I agree to the Acceptable Use Policy.": "I agree to the Acceptable Use Policy.", - "@I agree to the Acceptable Use Policy.": { - "description": "acceptable use policy switch title", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "About": "About", - "@About": { - "description": "Title for about menu item in settings", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "App": "App", - "@App": { - "description": "Title for App field on about page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Login ID": "Login ID", - "@Login ID": { - "description": "Title for Login ID field on about page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Email": "Email", - "@Email": { - "description": "Title for Email field on about page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Version": "Version", - "@Version": { - "description": "Title for Version field on about page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Instructure logo": "Instructure logo", - "@Instructure logo": { - "description": "Semantics label for the Instructure logo on the about page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - } -} \ No newline at end of file diff --git a/apps/flutter_parent/lib/l10n/res/intl_en_AU_unimelb.arb b/apps/flutter_parent/lib/l10n/res/intl_en_AU_unimelb.arb deleted file mode 100644 index 3a866f3833..0000000000 --- a/apps/flutter_parent/lib/l10n/res/intl_en_AU_unimelb.arb +++ /dev/null @@ -1,2753 +0,0 @@ -{ - "@@last_modified": "2023-08-25T11:04:20.901151", - "alertsLabel": "Alerts", - "@alertsLabel": { - "description": "The label for the Alerts tab", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "calendarLabel": "Calendar", - "@calendarLabel": { - "description": "The label for the Calendar tab", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "coursesLabel": "Subjects", - "@coursesLabel": { - "description": "The label for the Courses tab", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Students": "No Students", - "@No Students": { - "description": "Text for when an observer has no students they are observing", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Tap to show student selector": "Tap to show student selector", - "@Tap to show student selector": { - "description": "Semantics label for the area that will show the student selector when tapped", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Tap to pair with a new student": "Tap to pair with a new student", - "@Tap to pair with a new student": { - "description": "Semantics label for the add student button in the student selector", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Tap to select this student": "Tap to select this student", - "@Tap to select this student": { - "description": "Semantics label on individual students in the student switcher", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Manage Students": "Manage Students", - "@Manage Students": { - "description": "Label text for the Manage Students nav drawer button as well as the title for the Manage Students screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Help": "Help", - "@Help": { - "description": "Label text for the help nav drawer button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Log Out": "Log Out", - "@Log Out": { - "description": "Label text for the Log Out nav drawer button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Switch Users": "Switch Users", - "@Switch Users": { - "description": "Label text for the Switch Users nav drawer button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "appVersion": "v. {version}", - "@appVersion": { - "description": "App version shown in the navigation drawer", - "type": "text", - "placeholders_order": [ - "version" - ], - "placeholders": { - "version": {} - } - }, - "Are you sure you want to log out?": "Are you sure you want to log out?", - "@Are you sure you want to log out?": { - "description": "Confirmation message displayed when the user tries to log out", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Calendars": "Calendars", - "@Calendars": { - "description": "Label for button that lets users select which calendars to display", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "nextMonth": "Next month: {month}", - "@nextMonth": { - "description": "Label for the button that switches the calendar to the next month", - "type": "text", - "placeholders_order": [ - "month" - ], - "placeholders": { - "month": {} - } - }, - "previousMonth": "Previous month: {month}", - "@previousMonth": { - "description": "Label for the button that switches the calendar to the previous month", - "type": "text", - "placeholders_order": [ - "month" - ], - "placeholders": { - "month": {} - } - }, - "nextWeek": "Next week starting {date}", - "@nextWeek": { - "description": "Label for the button that switches the calendar to the next week", - "type": "text", - "placeholders_order": [ - "date" - ], - "placeholders": { - "date": {} - } - }, - "previousWeek": "Previous week starting {date}", - "@previousWeek": { - "description": "Label for the button that switches the calendar to the previous week", - "type": "text", - "placeholders_order": [ - "date" - ], - "placeholders": { - "date": {} - } - }, - "selectedMonthLabel": "Month of {month}", - "@selectedMonthLabel": { - "description": "Accessibility label for the button that expands/collapses the month view", - "type": "text", - "placeholders_order": [ - "month" - ], - "placeholders": { - "month": {} - } - }, - "expand": "expand", - "@expand": { - "description": "Accessibility label for the on-tap hint for the button that expands/collapses the month view", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "collapse": "collapse", - "@collapse": { - "description": "Accessibility label for the on-tap hint for the button that expands/collapses the month view", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "pointsPossible": "{points} points possible", - "@pointsPossible": { - "description": "Screen reader label used for the points possible for an assignment, quiz, etc.", - "type": "text", - "placeholders_order": [ - "points" - ], - "placeholders": { - "points": {} - } - }, - "calendarDaySemanticsLabel": "{eventCount,plural, =1{{date}, {eventCount} event}other{{date}, {eventCount} events}}", - "@calendarDaySemanticsLabel": { - "description": "Screen reader label used for calendar day, reads the date and count of events", - "type": "text", - "placeholders_order": [ - "date", - "eventCount" - ], - "placeholders": { - "date": {}, - "eventCount": {} - } - }, - "No Events Today!": "No Events Today!", - "@No Events Today!": { - "description": "Title displayed when there are no calendar events for the current day", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "It looks like a great day to rest, relax, and recharge.": "It looks like a great day to rest, relax, and recharge.", - "@It looks like a great day to rest, relax, and recharge.": { - "description": "Message displayed when there are no calendar events for the current day", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading your student's calendar": "There was an error loading your student's calendar", - "@There was an error loading your student's calendar": { - "description": "Message displayed when calendar events could not be loaded for the current student", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Tap to favorite the courses you want to see on the Calendar. Select up to 10.": "Tap to favourite the subjects you want to see on the Calendar. Select up to 10.", - "@Tap to favorite the courses you want to see on the Calendar. Select up to 10.": { - "description": "Description text on calendar filter screen.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You may only choose 10 calendars to display": "You may only choose 10 calendars to display", - "@You may only choose 10 calendars to display": { - "description": "Error text when trying to select more than 10 calendars", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You must select at least one calendar to display": "You must select at least one calendar to display", - "@You must select at least one calendar to display": { - "description": "Error text when trying to de-select all calendars", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Planner Note": "Planner Note", - "@Planner Note": { - "description": "Label used for notes in the planner", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Go to today": "Go to today", - "@Go to today": { - "description": "Accessibility label used for the today button in the planner", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Previous Logins": "Previous Logins", - "@Previous Logins": { - "description": "Label for the list of previous user logins", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "canvasLogoLabel": "Canvas logo", - "@canvasLogoLabel": { - "description": "The semantics label for the Canvas logo", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "findSchool": "Find School", - "@findSchool": { - "description": "Text for the find-my-school button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "findAnotherSchool": "Find another school", - "@findAnotherSchool": { - "description": "Text for the find-another-school button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "domainSearchInputHint": "Enter school name or district…", - "@domainSearchInputHint": { - "description": "Input hint for the text box on the domain search screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "noDomainResults": "Unable to find schools matching \"{query}\"", - "@noDomainResults": { - "description": "Message shown to users when the domain search query did not return any results", - "type": "text", - "placeholders_order": [ - "query" - ], - "placeholders": { - "query": {} - } - }, - "domainSearchHelpLabel": "How do I find my school or district?", - "@domainSearchHelpLabel": { - "description": "Label for the help button on the domain search screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "canvasGuides": "Canvas Guides", - "@canvasGuides": { - "description": "Proper name for the Canvas Guides. This will be used in the domainSearchHelpBody text and will be highlighted and clickable", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "canvasSupport": "Canvas Support", - "@canvasSupport": { - "description": "Proper name for Canvas Support. This will be used in the domainSearchHelpBody text and will be highlighted and clickable", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "domainSearchHelpBody": "Try searching for the name of the school or district you’re attempting to access, like “Smith Private School” or “Smith County Schools.” You can also enter a Canvas domain directly, like “smith.instructure.com.”\n\nFor more information on finding your institution’s Canvas account, you can visit the {canvasGuides}, reach out to {canvasSupport}, or contact your school for assistance.", - "@domainSearchHelpBody": { - "description": "The body text shown in the help dialog on the domain search screen", - "type": "text", - "placeholders_order": [ - "canvasGuides", - "canvasSupport" - ], - "placeholders": { - "canvasGuides": {}, - "canvasSupport": {} - } - }, - "Uh oh!": "Uh oh!", - "@Uh oh!": { - "description": "Title of the screen that shows when a crash has occurred", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "We’re not sure what happened, but it wasn’t good. Contact us if this keeps happening.": "We’re not sure what happened, but it wasn’t good. Contact us if this keeps happening.", - "@We’re not sure what happened, but it wasn’t good. Contact us if this keeps happening.": { - "description": "Message shown when a crash has occurred", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Contact Support": "Contact Support", - "@Contact Support": { - "description": "Label for the button that allows users to contact support after a crash has occurred", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "View error details": "View error details", - "@View error details": { - "description": "Label for the button that allowed users to view crash details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Restart app": "Restart app", - "@Restart app": { - "description": "Label for the button that will restart the entire application", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Application version": "Application version", - "@Application version": { - "description": "Label for the application version displayed in the crash details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Device model": "Device model", - "@Device model": { - "description": "Label for the device model displayed in the crash details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Android OS version": "Android OS version", - "@Android OS version": { - "description": "Label for the Android operating system version displayed in the crash details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Full error message": "Full error message", - "@Full error message": { - "description": "Label for the full error message displayed in the crash details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Inbox": "Inbox", - "@Inbox": { - "description": "Title for the Inbox screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading your inbox messages.": "There was an error loading your inbox messages.", - "@There was an error loading your inbox messages.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Subject": "No Topic", - "@No Subject": { - "description": "Title used for inbox messages that have no subject", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unable to fetch courses. Please check your connection and try again.": "Unable to fetch subjects. Please check your connection and try again.", - "@Unable to fetch courses. Please check your connection and try again.": { - "description": "Message shown when an error occured while loading courses", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Choose a course to message": "Choose a subject to message", - "@Choose a course to message": { - "description": "Header in the course list shown when the user is choosing which course to associate with a new message", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Inbox Zero": "Inbox Zero", - "@Inbox Zero": { - "description": "Title of the message shown when there are no inbox messages", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You’re all caught up!": "You’re all caught up!", - "@You’re all caught up!": { - "description": "Subtitle of the message shown when there are no inbox messages", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading recipients for this course": "There was an error loading recipients for this subject", - "@There was an error loading recipients for this course": { - "description": "Message shown when attempting to create a new message but the recipients list failed to load", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unable to send message. Check your connection and try again.": "Unable to send message. Check your connection and try again.", - "@Unable to send message. Check your connection and try again.": { - "description": "Message show when there was an error creating or sending a new message", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unsaved changes": "Unsaved changes", - "@Unsaved changes": { - "description": "Title of the dialog shown when the user tries to leave with unsaved changes", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Are you sure you wish to close this page? Your unsent message will be lost.": "Are you sure you wish to close this page? Your unsent message will be lost.", - "@Are you sure you wish to close this page? Your unsent message will be lost.": { - "description": "Body text of the dialog shown when the user tries leave with unsaved changes", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "New message": "New message", - "@New message": { - "description": "Title of the new-message screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Add attachment": "Add attachment", - "@Add attachment": { - "description": "Tooltip for the add-attachment button in the new-message screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Send message": "Send message", - "@Send message": { - "description": "Tooltip for the send-message button in the new-message screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Select recipients": "Select recipients", - "@Select recipients": { - "description": "Tooltip for the button that allows users to select message recipients", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No recipients selected": "No recipients selected", - "@No recipients selected": { - "description": "Hint displayed when the user has not selected any message recipients", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Message subject": "Message topic", - "@Message subject": { - "description": "Hint text displayed in the input field for the message subject", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Message": "Message", - "@Message": { - "description": "Hint text displayed in the input field for the message body", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Recipients": "Recipients", - "@Recipients": { - "description": "Label for message recipients", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "plusRecipientCount": "+{count}", - "@plusRecipientCount": { - "description": "Shows the number of recipients that are selected but not displayed on screen.", - "type": "text", - "placeholders_order": [ - "count" - ], - "placeholders": { - "count": { - "example": 5 - } - } - }, - "Failed. Tap for options.": "Failed. Tap for options.", - "@Failed. Tap for options.": { - "description": "Short message shown on a message attachment when uploading has failed", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "courseForWhom": "for {studentShortName}", - "@courseForWhom": { - "description": "Describes for whom a course is for (i.e. for Bill)", - "type": "text", - "placeholders_order": [ - "studentShortName" - ], - "placeholders": { - "studentShortName": {} - } - }, - "messageLinkPostscript": "Regarding: {studentName}, {linkUrl}", - "@messageLinkPostscript": { - "description": "A postscript appended to new messages that clarifies which student is the subject of the message and also includes a URL for the related Canvas component (course, assignment, event, etc).", - "type": "text", - "placeholders_order": [ - "studentName", - "linkUrl" - ], - "placeholders": { - "studentName": {}, - "linkUrl": {} - } - }, - "There was an error loading this conversation": "There was an error loading this conversation", - "@There was an error loading this conversation": { - "description": "Message shown when a conversation fails to load", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Reply": "Reply", - "@Reply": { - "description": "Button label for replying to a conversation", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Reply All": "Reply All", - "@Reply All": { - "description": "Button label for replying to all conversation participants", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unknown User": "Unknown User", - "@Unknown User": { - "description": "Label used where the user name is not known", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "me": "me", - "@me": { - "description": "First-person pronoun (i.e. 'me') that will be used in message author info, e.g. 'Me to 4 others' or 'Jon Snow to me'", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "authorToRecipient": "{authorName} to {recipientName}", - "@authorToRecipient": { - "description": "Author info for a single-recipient message; includes both the author name and the recipient name.", - "type": "text", - "placeholders_order": [ - "authorName", - "recipientName" - ], - "placeholders": { - "authorName": {}, - "recipientName": {} - } - }, - "authorToNOthers": "{howMany,plural, =1{{authorName} to 1 other}other{{authorName} to {howMany} others}}", - "@authorToNOthers": { - "description": "Author info for a mutli-recipient message; includes the author name and the number of recipients", - "type": "text", - "placeholders_order": [ - "authorName", - "howMany" - ], - "placeholders": { - "authorName": {}, - "howMany": {} - } - }, - "authorToRecipientAndNOthers": "{howMany,plural, =1{{authorName} to {recipientName} & 1 other}other{{authorName} to {recipientName} & {howMany} others}}", - "@authorToRecipientAndNOthers": { - "description": "Author info for a multi-recipient message; includes the author name, one recipient name, and the number of other recipients", - "type": "text", - "placeholders_order": [ - "authorName", - "recipientName", - "howMany" - ], - "placeholders": { - "authorName": {}, - "recipientName": {}, - "howMany": {} - } - }, - "Download": "Download", - "@Download": { - "description": "Label for the button that will begin downloading a file", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Open with another app": "Open with another app", - "@Open with another app": { - "description": "Label for the button that will allow users to open a file with another app", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There are no installed applications that can open this file": "There are no installed applications that can open this file", - "@There are no installed applications that can open this file": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unsupported File": "Unsupported File", - "@Unsupported File": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "This file is unsupported and can’t be viewed through the app": "This file is unsupported and can’t be viewed through the app", - "@This file is unsupported and can’t be viewed through the app": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unable to play this media file": "Unable to play this media file", - "@Unable to play this media file": { - "description": "Message shown when audio or video media could not be played", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unable to load this image": "Unable to load this image", - "@Unable to load this image": { - "description": "Message shown when an image file could not be loaded or displayed", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading this file": "There was an error loading this file", - "@There was an error loading this file": { - "description": "Message shown when a file could not be loaded or displayed", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Courses": "No Subjects", - "@No Courses": { - "description": "Title for having no courses", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Your student’s courses might not be published yet.": "Your students' subjects might not be published yet.", - "@Your student’s courses might not be published yet.": { - "description": "Message for having no courses", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading your student’s courses.": "There was an error loading your student’s subjects.", - "@There was an error loading your student’s courses.": { - "description": "Message displayed when the list of student courses could not be loaded", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Grade": "No Grade", - "@No Grade": { - "description": "Message shown when there is currently no grade available for a course", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Filter by": "Filter by", - "@Filter by": { - "description": "Title for list of terms to filter grades by", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Grades": "Grades", - "@Grades": { - "description": "Label for the \"Grades\" tab in course details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Syllabus": "Subject Overview", - "@Syllabus": { - "description": "Label for the \"Syllabus\" tab in course details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Front Page": "Front Page", - "@Front Page": { - "description": "Label for the \"Front Page\" tab in course details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Summary": "Summary", - "@Summary": { - "description": "Label for the \"Summary\" tab in course details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Send a message about this course": "Send a message about this subject", - "@Send a message about this course": { - "description": "Accessibility hint for the course messaage floating action button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Total Grade": "Total Grade", - "@Total Grade": { - "description": "Label for the total grade in the course", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Graded": "Graded", - "@Graded": { - "description": "Label for assignments that have been graded", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Submitted": "Submitted", - "@Submitted": { - "description": "Label for assignments that have been submitted", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Not Submitted": "Not Submitted", - "@Not Submitted": { - "description": "Label for assignments that have not been submitted", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Late": "Late", - "@Late": { - "description": "Label for assignments that have been marked late or submitted late", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Missing": "Missing", - "@Missing": { - "description": "Label for assignments that have been marked missing or are not submitted and past the due date", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "-": "-", - "@-": { - "description": "Value representing no score for student submission", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "All Grading Periods": "All Grading Periods", - "@All Grading Periods": { - "description": "Label for selecting all grading periods", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Assignments": "No Assignments", - "@No Assignments": { - "description": "Title for the no assignments message", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "It looks like assignments haven't been created in this space yet.": "It looks like assignments haven't been created in this space yet.", - "@It looks like assignments haven't been created in this space yet.": { - "description": "Message for no assignments", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading the summary details for this course.": "There was an error loading the summary details for this subject.", - "@There was an error loading the summary details for this course.": { - "description": "Message shown when the course summary could not be loaded", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Summary": "No Summary", - "@No Summary": { - "description": "Title displayed when there are no items in the course summary", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "This course does not have any assignments or calendar events yet.": "This subject does not have any assignments or calendar events yet.", - "@This course does not have any assignments or calendar events yet.": { - "description": "Message displayed when there are no items in the course summary", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "gradeFormatScoreOutOfPointsPossible": "{score} / {pointsPossible}", - "@gradeFormatScoreOutOfPointsPossible": { - "description": "Formatted string for a student score out of the points possible", - "type": "text", - "placeholders_order": [ - "score", - "pointsPossible" - ], - "placeholders": { - "score": {}, - "pointsPossible": {} - } - }, - "contentDescriptionScoreOutOfPointsPossible": "{score} out of {pointsPossible} points", - "@contentDescriptionScoreOutOfPointsPossible": { - "description": "Formatted string for a student score out of the points possible", - "type": "text", - "placeholders_order": [ - "score", - "pointsPossible" - ], - "placeholders": { - "score": {}, - "pointsPossible": {} - } - }, - "gradesSubjectMessage": "Regarding: {studentName}, Grades", - "@gradesSubjectMessage": { - "description": "The subject line for a message to a teacher regarding a student's grades", - "type": "text", - "placeholders_order": [ - "studentName" - ], - "placeholders": { - "studentName": {} - } - }, - "syllabusSubjectMessage": "Regarding: {studentName}, Subject Overview", - "@syllabusSubjectMessage": { - "description": "The subject line for a message to a teacher regarding a course syllabus", - "type": "text", - "placeholders_order": [ - "studentName" - ], - "placeholders": { - "studentName": {} - } - }, - "frontPageSubjectMessage": "Regarding: {studentName}, Front Page", - "@frontPageSubjectMessage": { - "description": "The subject line for a message to a teacher regarding a course front page", - "type": "text", - "placeholders_order": [ - "studentName" - ], - "placeholders": { - "studentName": {} - } - }, - "assignmentSubjectMessage": "Regarding: {studentName}, Assignment - {assignmentName}", - "@assignmentSubjectMessage": { - "description": "The subject line for a message to a teacher regarding a student's assignment", - "type": "text", - "placeholders_order": [ - "studentName", - "assignmentName" - ], - "placeholders": { - "studentName": {}, - "assignmentName": {} - } - }, - "eventSubjectMessage": "Regarding: {studentName}, Event - {eventTitle}", - "@eventSubjectMessage": { - "description": "The subject line for a message to a teacher regarding a calendar event", - "type": "text", - "placeholders_order": [ - "studentName", - "eventTitle" - ], - "placeholders": { - "studentName": {}, - "eventTitle": {} - } - }, - "There is no page information available.": "There is no page information available.", - "@There is no page information available.": { - "description": "Description for when no page information is available", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Assignment Details": "Assignment Details", - "@Assignment Details": { - "description": "Title for the page that shows details for an assignment", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "assignmentTotalPoints": "{points} pts", - "@assignmentTotalPoints": { - "description": "Label used for the total points the assignment is worth", - "type": "text", - "placeholders_order": [ - "points" - ], - "placeholders": { - "points": {} - } - }, - "assignmentTotalPointsAccessible": "{points} points", - "@assignmentTotalPointsAccessible": { - "description": "Screen reader label used for the total points the assignment is worth", - "type": "text", - "placeholders_order": [ - "points" - ], - "placeholders": { - "points": {} - } - }, - "Due": "Due", - "@Due": { - "description": "Label for an assignment due date", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Grade": "Grade", - "@Grade": { - "description": "Label for the section that displays an assignment's grade", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Locked": "Locked", - "@Locked": { - "description": "Label for when an assignment is locked", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "assignmentLockedModule": "This assignment is locked by the module \"{moduleName}\".", - "@assignmentLockedModule": { - "description": "The locked description when an assignment is locked by a module", - "type": "text", - "placeholders_order": [ - "moduleName" - ], - "placeholders": { - "moduleName": {} - } - }, - "Remind Me": "Remind Me", - "@Remind Me": { - "description": "Label for the row to set reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Set a date and time to be notified of this specific assignment.": "Set a date and time to be notified of this specific assignment.", - "@Set a date and time to be notified of this specific assignment.": { - "description": "Description for row to set reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You will be notified about this assignment on…": "You will be notified about this assignment on…", - "@You will be notified about this assignment on…": { - "description": "Description for when a reminder is set", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Instructions": "Instructions", - "@Instructions": { - "description": "Label for the description of the assignment when it has quiz instructions", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Send a message about this assignment": "Send a message about this assignment", - "@Send a message about this assignment": { - "description": "Accessibility hint for the assignment messaage floating action button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "This app is not authorized for use.": "This app is not authorised for use.", - "@This app is not authorized for use.": { - "description": "The error shown when the app being used is not verified by Canvas", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The server you entered is not authorized for this app.": "The server you entered is not authorised for this app.", - "@The server you entered is not authorized for this app.": { - "description": "The error shown when the desired login domain is not verified by Canvas", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The user agent for this app is not authorized.": "The user agent for this app is not authorised.", - "@The user agent for this app is not authorized.": { - "description": "The error shown when the user agent during verification is not verified by Canvas", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "We were unable to verify the server for use with this app.": "We were unable to verify the server for use with this app.", - "@We were unable to verify the server for use with this app.": { - "description": "The generic error shown when we are unable to verify with Canvas", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Reminders": "Reminders", - "@Reminders": { - "description": "Name of the system notification channel for assignment and event reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Notifications for reminders about assignments and calendar events": "Notifications for reminders about assignments and calendar events", - "@Notifications for reminders about assignments and calendar events": { - "description": "Description of the system notification channel for assignment and event reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Reminders have changed!": "Reminders have changed!", - "@Reminders have changed!": { - "description": "Title of the dialog shown when the user needs to update their reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "In order to provide you with a better experience, we have updated how reminders work. You can add new reminders by viewing an assignment or calendar event and tapping the switch under the \"Remind Me\" section.\n\nBe aware that any reminders created with older versions of this app will not be compatible with the new changes and you will need to create them again.": "In order to provide you with a better experience, we have updated how reminders work. You can add new reminders by viewing an assignment or calendar event and tapping the switch under the \"Remind Me\" section.\n\nBe aware that any reminders created with older versions of this app will not be compatible with the new changes and you will need to create them again.", - "@In order to provide you with a better experience, we have updated how reminders work. You can add new reminders by viewing an assignment or calendar event and tapping the switch under the \"Remind Me\" section.\n\nBe aware that any reminders created with older versions of this app will not be compatible with the new changes and you will need to create them again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Not a parent?": "Not a parent?", - "@Not a parent?": { - "description": "Title for the screen that shows when the user is not observing any students", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "We couldn't find any students associated with this account": "We couldn't find any students associated with this account", - "@We couldn't find any students associated with this account": { - "description": "Subtitle for the screen that shows when the user is not observing any students", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Are you a student or teacher?": "Are you a student or instructor?", - "@Are you a student or teacher?": { - "description": "Label for button that will show users the option to view other Canvas apps in the Play Store", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "One of our other apps might be a better fit. Tap one to visit the Play Store.": "One of our other apps might be a better fit. Tap one to visit the Play Store.", - "@One of our other apps might be a better fit. Tap one to visit the Play Store.": { - "description": "Description of options to view other Canvas apps in the Play Store", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Return to Login": "Return to Login", - "@Return to Login": { - "description": "Label for the button that returns the user to the login screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "STUDENT": "STUDENT", - "@STUDENT": { - "description": "The \"student\" portion of the \"Canvas Student\" app name, in all caps. \"Canvas\" is excluded in this context as it will be displayed to the user as a wordmark image", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "TEACHER": "INSTRUCTOR", - "@TEACHER": { - "description": "The \"teacher\" portion of the \"Canvas Teacher\" app name, in all caps. \"Canvas\" is excluded in this context as it will be displayed to the user as a wordmark image", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Canvas Student": "Canvas Student", - "@Canvas Student": { - "description": "The name of the Canvas Student app. Only \"Student\" should be translated as \"Canvas\" is a brand name in this context and should not be translated.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Canvas Teacher": "Canvas Instructor", - "@Canvas Teacher": { - "description": "The name of the Canvas Teacher app. Only \"Teacher\" should be translated as \"Canvas\" is a brand name in this context and should not be translated.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Alerts": "No Alerts", - "@No Alerts": { - "description": "The title for the empty message to show to users when there are no alerts for the student.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There’s nothing to be notified of yet.": "There’s nothing to be notified of yet.", - "@There’s nothing to be notified of yet.": { - "description": "The empty message to show to users when there are no alerts for the student.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "dismissAlertLabel": "Dismiss {alertTitle}", - "@dismissAlertLabel": { - "description": "Accessibility label to dismiss an alert", - "type": "text", - "placeholders_order": [ - "alertTitle" - ], - "placeholders": { - "alertTitle": {} - } - }, - "Course Announcement": "Subject Announcement", - "@Course Announcement": { - "description": "Title for alerts when there is a course announcement", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Institution Announcement": "Institution Announcement", - "@Institution Announcement": { - "description": "Title for alerts when there is an institution announcement", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "assignmentGradeAboveThreshold": "Assignment Grade Above {threshold}", - "@assignmentGradeAboveThreshold": { - "description": "Title for alerts when an assignment grade is above the threshold value", - "type": "text", - "placeholders_order": [ - "threshold" - ], - "placeholders": { - "threshold": {} - } - }, - "assignmentGradeBelowThreshold": "Assignment Grade Below {threshold}", - "@assignmentGradeBelowThreshold": { - "description": "Title for alerts when an assignment grade is below the threshold value", - "type": "text", - "placeholders_order": [ - "threshold" - ], - "placeholders": { - "threshold": {} - } - }, - "courseGradeAboveThreshold": "Subject Grade Above {threshold}", - "@courseGradeAboveThreshold": { - "description": "Title for alerts when a course grade is above the threshold value", - "type": "text", - "placeholders_order": [ - "threshold" - ], - "placeholders": { - "threshold": {} - } - }, - "courseGradeBelowThreshold": "Subject Grade Below {threshold}", - "@courseGradeBelowThreshold": { - "description": "Title for alerts when a course grade is below the threshold value", - "type": "text", - "placeholders_order": [ - "threshold" - ], - "placeholders": { - "threshold": {} - } - }, - "Settings": "Settings", - "@Settings": { - "description": "Title for the settings screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Theme": "Theme", - "@Theme": { - "description": "Label for the light/dark theme section in the settings page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Dark Mode": "Dark Mode", - "@Dark Mode": { - "description": "Label for the button that enables dark mode", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Light Mode": "Light Mode", - "@Light Mode": { - "description": "Label for the button that enables light mode", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "High Contrast Mode": "High Contrast Mode", - "@High Contrast Mode": { - "description": "Label for the switch that toggles high contrast mode", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Use Dark Theme in Web Content": "Use Dark Theme in Web Content", - "@Use Dark Theme in Web Content": { - "description": "Label for the switch that toggles dark mode for webviews", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Appearance": "Appearance", - "@Appearance": { - "description": "Label for the appearance section in the settings page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Successfully submitted!": "Successfully submitted!", - "@Successfully submitted!": { - "description": "Title displayed in the grade cell for an assignment that has been submitted", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "submissionStatusSuccessSubtitle": "This assignment was submitted on {date} at {time} and is waiting to be graded", - "@submissionStatusSuccessSubtitle": { - "description": "Subtitle displayed in the grade cell for an assignment that has been submitted and is awaiting a grade", - "type": "text", - "placeholders_order": [ - "date", - "time" - ], - "placeholders": { - "date": {}, - "time": {} - } - }, - "outOfPoints": "{howMany,plural, =1{Out of 1 point}other{Out of {points} points}}", - "@outOfPoints": { - "description": "Description for an assignment grade that has points without a current scoroe", - "type": "text", - "placeholders_order": [ - "points", - "howMany" - ], - "placeholders": { - "points": {}, - "howMany": {} - } - }, - "Excused": "Excused", - "@Excused": { - "description": "Grading status for an assignment marked as excused", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Complete": "Complete", - "@Complete": { - "description": "Grading status for an assignment marked as complete", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Incomplete": "Incomplete", - "@Incomplete": { - "description": "Grading status for an assignment marked as incomplete", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "minus": "minus", - "@minus": { - "description": "Screen reader-friendly replacement for the \"-\" character in letter grades like \"A-\"", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "latePenalty": "Late penalty (-{pointsLost})", - "@latePenalty": { - "description": "Text displayed when a late penalty has been applied to the assignment", - "type": "text", - "placeholders_order": [ - "pointsLost" - ], - "placeholders": { - "pointsLost": {} - } - }, - "finalGrade": "Final Grade: {grade}", - "@finalGrade": { - "description": "Text that displays the final grade of an assignment", - "type": "text", - "placeholders_order": [ - "grade" - ], - "placeholders": { - "grade": {} - } - }, - "Alert Settings": "Alert Settings", - "@Alert Settings": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Alert me when…": "Alert me when…", - "@Alert me when…": { - "description": "Header for the screen where the observer chooses the thresholds that will determine when they receive alerts (e.g. when an assignment is graded below 70%)", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Course grade below": "Subject grade below", - "@Course grade below": { - "description": "Label describing the threshold for when the course grade is below a certain percentage", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Course grade above": "Subject grade above", - "@Course grade above": { - "description": "Label describing the threshold for when the course grade is above a certain percentage", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Assignment missing": "Assignment missing", - "@Assignment missing": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Assignment grade below": "Assignment grade below", - "@Assignment grade below": { - "description": "Label describing the threshold for when an assignment is graded below a certain percentage", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Assignment grade above": "Assignment grade above", - "@Assignment grade above": { - "description": "Label describing the threshold for when an assignment is graded above a certain percentage", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Course Announcements": "Subject Announcements", - "@Course Announcements": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Institution Announcements": "Institution Announcements", - "@Institution Announcements": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Never": "Never", - "@Never": { - "description": "Indication that tells the user they will not receive alert notifications of a specific kind", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Grade percentage": "Grade percentage", - "@Grade percentage": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading your student's alerts.": "There was an error loading your students' alerts.", - "@There was an error loading your student's alerts.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Must be below 100": "Must be below 100", - "@Must be below 100": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "mustBeBelowN": "Must be below {percentage}", - "@mustBeBelowN": { - "description": "Validation error to the user that they must choose a percentage below 'n'", - "type": "text", - "placeholders_order": [ - "percentage" - ], - "placeholders": { - "percentage": { - "example": 5 - } - } - }, - "mustBeAboveN": "Must be above {percentage}", - "@mustBeAboveN": { - "description": "Validation error to the user that they must choose a percentage above 'n'", - "type": "text", - "placeholders_order": [ - "percentage" - ], - "placeholders": { - "percentage": { - "example": 5 - } - } - }, - "Select Student Color": "Select Student Colour", - "@Select Student Color": { - "description": "Title for screen that allows users to assign a color to a specific student", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Electric, blue": "Electric, blue", - "@Electric, blue": { - "description": "Name of the Electric (blue) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Plum, Purple": "Plum, Purple", - "@Plum, Purple": { - "description": "Name of the Plum (purple) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Barney, Fuschia": "Barney, Fuchsia", - "@Barney, Fuschia": { - "description": "Name of the Barney (fuschia) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Raspberry, Red": "Raspberry, Red", - "@Raspberry, Red": { - "description": "Name of the Raspberry (red) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Fire, Orange": "Fire, Orange", - "@Fire, Orange": { - "description": "Name of the Fire (orange) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Shamrock, Green": "Shamrock, Green", - "@Shamrock, Green": { - "description": "Name of the Shamrock (green) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "An error occurred while saving your selection. Please try again.": "An error occurred while saving your selection. Please try again.", - "@An error occurred while saving your selection. Please try again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "changeStudentColorLabel": "Change colour for {studentName}", - "@changeStudentColorLabel": { - "description": "Accessibility label for the button that lets users change the color associated with a specific student", - "type": "text", - "placeholders_order": [ - "studentName" - ], - "placeholders": { - "studentName": {} - } - }, - "Teacher": "Instructor", - "@Teacher": { - "description": "Label for the Teacher enrollment type", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Student": "Student", - "@Student": { - "description": "Label for the Student enrollment type", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "TA": "Tutor", - "@TA": { - "description": "Label for the Teaching Assistant enrollment type (also known as Teacher Aid or Education Assistant), reduced to a short acronym/initialism if appropriate.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Observer": "Auditor", - "@Observer": { - "description": "Label for the Observer enrollment type", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Use Camera": "Use Camera", - "@Use Camera": { - "description": "Label for the action item that lets the user capture a photo using the device camera", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Upload File": "Upload File", - "@Upload File": { - "description": "Label for the action item that lets the user upload a file from their device", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Choose from Gallery": "Choose from Gallery", - "@Choose from Gallery": { - "description": "Label for the action item that lets the user select a photo from their device gallery", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Preparing…": "Preparing…", - "@Preparing…": { - "description": "Message shown while a file is being prepared to attach to a message", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Add student with…": "Add student with…", - "@Add student with…": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Add Student": "Add Student", - "@Add Student": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You are not observing any students.": "You are not observing any students.", - "@You are not observing any students.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading your students.": "There was an error loading your students.", - "@There was an error loading your students.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Pairing Code": "Pairing Code", - "@Pairing Code": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Students can obtain a pairing code through the Canvas website": "Students can obtain a pairing code through the Canvas website", - "@Students can obtain a pairing code through the Canvas website": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Enter the student pairing code provided to you. If the pairing code doesn't work, it may have expired": "Enter the student pairing code provided to you. If the pairing code doesn't work, it may have expired", - "@Enter the student pairing code provided to you. If the pairing code doesn't work, it may have expired": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Your code is incorrect or expired.": "Your code is incorrect or expired.", - "@Your code is incorrect or expired.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Something went wrong trying to create your account, please reach out to your school for assistance.": "Something went wrong trying to create your account, please reach out to your school for assistance.", - "@Something went wrong trying to create your account, please reach out to your school for assistance.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "QR Code": "QR Code", - "@QR Code": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Students can create a QR code using the Canvas Student app on their mobile device": "Students can create a QR code using the Canvas Student app on their mobile device", - "@Students can create a QR code using the Canvas Student app on their mobile device": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Add new student": "Add new student", - "@Add new student": { - "description": "Semantics label for the FAB on the Manage Students Screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Select": "Select", - "@Select": { - "description": "Hint text to tell the user to choose one of two options", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I have a Canvas account": "I have a Canvas account", - "@I have a Canvas account": { - "description": "Option to select for users that have a canvas account", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I don't have a Canvas account": "I don't have a Canvas account", - "@I don't have a Canvas account": { - "description": "Option to select for users that don't have a canvas account", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Create Account": "Create Account", - "@Create Account": { - "description": "Button text for account creation confirmation", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Full Name": "Full Name", - "@Full Name": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Email Address": "Email Address", - "@Email Address": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Password": "Password", - "@Password": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Full Name…": "Full Name…", - "@Full Name…": { - "description": "hint label for inside form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Email…": "Email…", - "@Email…": { - "description": "hint label for inside form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Password…": "Password…", - "@Password…": { - "description": "hint label for inside form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Please enter full name": "Please enter full name", - "@Please enter full name": { - "description": "Error message for form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Please enter an email address": "Please enter an email address", - "@Please enter an email address": { - "description": "Error message for form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Please enter a valid email address": "Please enter a valid email address", - "@Please enter a valid email address": { - "description": "Error message for form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Password is required": "Password is required", - "@Password is required": { - "description": "Error message for form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Password must contain at least 8 characters": "Password must contain at least 8 characters", - "@Password must contain at least 8 characters": { - "description": "Error message for form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "qrCreateAccountTos": "By tapping 'Create Account', you agree to the {termsOfService} and acknowledge the {privacyPolicy}", - "@qrCreateAccountTos": { - "description": "The text show on the account creation screen", - "type": "text", - "placeholders_order": [ - "termsOfService", - "privacyPolicy" - ], - "placeholders": { - "termsOfService": {}, - "privacyPolicy": {} - } - }, - "Terms of Service": "Terms of Service", - "@Terms of Service": { - "description": "Label for the Canvas Terms of Service agreement. This will be used in the qrCreateAccountTos text and will be highlighted and clickable", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Privacy Policy": "Privacy Policy", - "@Privacy Policy": { - "description": "Label for the Canvas Privacy Policy agreement. This will be used in the qrCreateAccountTos text and will be highlighted and clickable", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "View the Privacy Policy": "View the Privacy Policy", - "@View the Privacy Policy": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Already have an account? ": "Already have an account? ", - "@Already have an account? ": { - "description": "Part of multiline text span, includes AccountSignIn1-2, in that order", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Sign In": "Sign In", - "@Sign In": { - "description": "Part of multiline text span, includes AccountSignIn1-2, in that order", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Hide Password": "Hide Password", - "@Hide Password": { - "description": "content description for password hide button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Show Password": "Show Password", - "@Show Password": { - "description": "content description for password show button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Terms of Service Link": "Terms of Service Link", - "@Terms of Service Link": { - "description": "content description for terms of service link", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Privacy Policy Link": "Privacy Policy Link", - "@Privacy Policy Link": { - "description": "content description for privacy policy link", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Event": "Event", - "@Event": { - "description": "Title for the event details screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Date": "Date", - "@Date": { - "description": "Label for the event date", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Location": "Location", - "@Location": { - "description": "Label for the location information", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Location Specified": "No Location Specified", - "@No Location Specified": { - "description": "Description for events that do not have a location", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "eventTime": "{startAt} - {endAt}", - "@eventTime": { - "description": "The time the event is happening, example: \"2:00 pm - 4:00 pm\"", - "type": "text", - "placeholders_order": [ - "startAt", - "endAt" - ], - "placeholders": { - "startAt": {}, - "endAt": {} - } - }, - "Set a date and time to be notified of this event.": "Set a date and time to be notified of this event.", - "@Set a date and time to be notified of this event.": { - "description": "Description for row to set event reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You will be notified about this event on…": "You will be notified about this event on…", - "@You will be notified about this event on…": { - "description": "Description for when an event reminder is set", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Share Your Love for the App": "Share Your Love for the App", - "@Share Your Love for the App": { - "description": "Label for option to open the app store", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Tell us about your favorite parts of the app": "Tell us about your favourite parts of the app.", - "@Tell us about your favorite parts of the app": { - "description": "Description for option to open the app store", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Legal": "Legal", - "@Legal": { - "description": "Label for legal information option", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Privacy policy, terms of use, open source": "Privacy policy, terms of use, open source", - "@Privacy policy, terms of use, open source": { - "description": "Description for legal information option", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Idea for Canvas Parent App [Android]": "Idea for Canvas Parent App [Android]", - "@Idea for Canvas Parent App [Android]": { - "description": "The subject for the email to request a feature", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The following information will help us better understand your idea:": "The following information will help us better understand your idea:", - "@The following information will help us better understand your idea:": { - "description": "The header for the users information that is attached to a feature request", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Domain:": "Domain:", - "@Domain:": { - "description": "The label for the Canvas domain of the logged in user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "User ID:": "User ID:", - "@User ID:": { - "description": "The label for the Canvas user ID of the logged in user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Email:": "Email:", - "@Email:": { - "description": "The label for the eamil of the logged in user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Locale:": "Locale:", - "@Locale:": { - "description": "The label for the locale of the logged in user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Terms of Use": "Terms of Use", - "@Terms of Use": { - "description": "Label for the terms of use", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Canvas on GitHub": "Canvas on GitHub", - "@Canvas on GitHub": { - "description": "Label for the button that opens the Canvas project on GitHub's website", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was a problem loading the Terms of Use": "There was a problem loading the Terms of Use", - "@There was a problem loading the Terms of Use": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Device": "Device", - "@Device": { - "description": "Label used for device manufacturer/model in the error report", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "OS Version": "OS Version", - "@OS Version": { - "description": "Label used for device operating system version in the error report", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Version Number": "Version Number", - "@Version Number": { - "description": "Label used for the app version number in the error report", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Report A Problem": "Report A Problem", - "@Report A Problem": { - "description": "Title used for generic dialog to report problems", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Subject": "Topic", - "@Subject": { - "description": "Label used for Subject text field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "A subject is required.": "A topic is required.", - "@A subject is required.": { - "description": "Error shown when the subject field is empty", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "An email address is required.": "An email address is required.", - "@An email address is required.": { - "description": "Error shown when the email field is empty", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Description": "Description", - "@Description": { - "description": "Label used for Description text field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "A description is required.": "A description is required.", - "@A description is required.": { - "description": "Error shown when the description field is empty", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "How is this affecting you?": "How is this affecting you?", - "@How is this affecting you?": { - "description": "Label used for the dropdown to select how severe the issue is", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "send": "send", - "@send": { - "description": "Label used for send button when reporting a problem", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Just a casual question, comment, idea, suggestion…": "Just a casual question, comment, idea, suggestion…", - "@Just a casual question, comment, idea, suggestion…": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I need some help but it's not urgent.": "I need some help, but it's not urgent.", - "@I need some help but it's not urgent.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Something's broken but I can work around it to get what I need done.": "Something's broken, but I can work around it to get what I need done.", - "@Something's broken but I can work around it to get what I need done.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I can't get things done until I hear back from you.": "I can't get things done until I hear back from you.", - "@I can't get things done until I hear back from you.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "EXTREME CRITICAL EMERGENCY!!": "EXTREME CRITICAL EMERGENCY!!", - "@EXTREME CRITICAL EMERGENCY!!": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Not Graded": "Not Marked", - "@Not Graded": { - "description": "Description for an assignment has not been graded.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Login flow: Normal": "Login flow: Normal", - "@Login flow: Normal": { - "description": "Description for the normal login flow", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Login flow: Canvas": "Login flow: Canvas", - "@Login flow: Canvas": { - "description": "Description for the Canvas login flow", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Login flow: Site Admin": "Login flow: Site Admin", - "@Login flow: Site Admin": { - "description": "Description for the Site Admin login flow", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Login flow: Skip mobile verify": "Login flow: Skip mobile verify", - "@Login flow: Skip mobile verify": { - "description": "Description for the login flow that skips domain verification for mobile", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Act As User": "Act As User", - "@Act As User": { - "description": "Label for the button that allows the user to act (masquerade) as another user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Stop Acting as User": "Stop Acting as User", - "@Stop Acting as User": { - "description": "Label for the button that allows the user to stop acting (masquerading) as another user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "actingAsUser": "You are acting as {userName}", - "@actingAsUser": { - "description": "Message shown while acting (masquerading) as another user", - "type": "text", - "placeholders_order": [ - "userName" - ], - "placeholders": { - "userName": {} - } - }, - "\"Act as\" is essentially logging in as this user without a password. You will be able to take any action as if you were this user, and from other users' points of views, it will be as if this user performed them. However, audit logs record that you were the one who performed the actions on behalf of this user.": "\"Act as\" is essentially logging in as this user without a password. You will be able to take any action as if you were this user, and from other users' points of views, it will be as if this user performed them. However, audit logs record that you were the one who performed the actions on behalf of this user.", - "@\"Act as\" is essentially logging in as this user without a password. You will be able to take any action as if you were this user, and from other users' points of views, it will be as if this user performed them. However, audit logs record that you were the one who performed the actions on behalf of this user.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Domain": "Domain", - "@Domain": { - "description": "Text field hint for domain url input", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You must enter a valid domain": "You must enter a valid domain", - "@You must enter a valid domain": { - "description": "Message displayed for domain input error", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "User ID": "User ID", - "@User ID": { - "description": "Text field hint for user ID input", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You must enter a user id": "You must enter a user id", - "@You must enter a user id": { - "description": "Message displayed for user Id input error", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error trying to act as this user. Please check the Domain and User ID and try again.": "There was an error trying to act as this user. Please check the Domain and User ID and try again.", - "@There was an error trying to act as this user. Please check the Domain and User ID and try again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "endMasqueradeMessage": "You will stop acting as {userName} and return to your original account.", - "@endMasqueradeMessage": { - "description": "Confirmation message displayed when the user wants to stop acting (masquerading) as another user", - "type": "text", - "placeholders_order": [ - "userName" - ], - "placeholders": { - "userName": {} - } - }, - "endMasqueradeLogoutMessage": "You will stop acting as {userName} and will be logged out.", - "@endMasqueradeLogoutMessage": { - "description": "Confirmation message displayed when the user wants to stop acting (masquerading) as another user and will be logged out.", - "type": "text", - "placeholders_order": [ - "userName" - ], - "placeholders": { - "userName": {} - } - }, - "How are we doing?": "How are we doing?", - "@How are we doing?": { - "description": "Title for dialog asking user to rate the app out of 5 stars.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Don't show again": "Don't show again", - "@Don't show again": { - "description": "Button to prevent the rating dialog from showing again.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "What can we do better?": "What can we do better?", - "@What can we do better?": { - "description": "Hint text for providing a comment with the rating.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Send Feedback": "Send Feedback", - "@Send Feedback": { - "description": "Button to send rating with feedback", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "ratingDialogEmailSubject": "Suggestions for Android - Canvas Parent {version}", - "@ratingDialogEmailSubject": { - "description": "The subject for an email to provide feedback for CanvasParent.", - "type": "text", - "placeholders_order": [ - "version" - ], - "placeholders": { - "version": {} - } - }, - "starRating": "{position,plural, =1{{position} star}other{{position} stars}}", - "@starRating": { - "description": "Accessibility label for the 1 stars to 5 stars rating", - "type": "text", - "placeholders_order": [ - "position" - ], - "placeholders": { - "position": { - "example": 1 - } - } - }, - "Student Pairing": "Student Pairing", - "@Student Pairing": { - "description": "Title for the screen where users can pair to students using a QR code", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Open Canvas Student": "Open Canvas Student", - "@Open Canvas Student": { - "description": "Title for QR pairing tutorial screen instructing users to open the Canvas Student app", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You'll need to open your student's Canvas Student app to continue. Go into Main Menu > Settings > Pair with Observer and scan the QR code you see there.": "You'll need to open your student's Canvas Student app to continue. Go into Main Menu > Settings > Pair with Auditor and scan the QR code you see there.", - "@You'll need to open your student's Canvas Student app to continue. Go into Main Menu > Settings > Pair with Observer and scan the QR code you see there.": { - "description": "Message explaining how QR code pairing works", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Screenshot showing location of pairing QR code generation in the Canvas Student app": "Screenshot showing location of pairing QR code generation in the Canvas Student app", - "@Screenshot showing location of pairing QR code generation in the Canvas Student app": { - "description": "Content Description for qr pairing tutorial screenshot", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Expired QR Code": "Expired QR Code", - "@Expired QR Code": { - "description": "Error title shown when the users scans a QR code that has expired", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The QR code you scanned may have expired. Refresh the code on the student's device and try again.": "The QR code you scanned may have expired. Refresh the code on the student's device and try again.", - "@The QR code you scanned may have expired. Refresh the code on the student's device and try again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "A network error occurred when adding this student. Check your connection and try again.": "A network error occurred when adding this student. Check your connection and try again.", - "@A network error occurred when adding this student. Check your connection and try again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Invalid QR Code": "Invalid QR Code", - "@Invalid QR Code": { - "description": "Error title shown when the user scans an invalid QR code", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Incorrect Domain": "Incorrect Domain", - "@Incorrect Domain": { - "description": "Error title shown when the users scane a QR code for a student that belongs to a different domain", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The student you are trying to add belongs to a different school. Log in or create an account with that school to scan this code.": "The student you are trying to add belongs to a different school. Log in or create an account with that school to scan this code.", - "@The student you are trying to add belongs to a different school. Log in or create an account with that school to scan this code.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Camera Permission": "Camera Permission", - "@Camera Permission": { - "description": "Error title shown when the user wans to scan a QR code but has denied the camera permission", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "This will unpair and remove all enrollments for this student from your account.": "This will unpair and remove all enrolments for this student from your account.", - "@This will unpair and remove all enrollments for this student from your account.": { - "description": "Confirmation message shown when the user tries to delete a student from their account", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was a problem removing this student from your account. Please check your connection and try again.": "There was a problem removing this student from your account. Please check your connection and try again.", - "@There was a problem removing this student from your account. Please check your connection and try again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Cancel": "Cancel", - "@Cancel": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "next": "Next", - "@next": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "ok": "OK", - "@ok": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Yes": "Yes", - "@Yes": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No": "No", - "@No": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Retry": "Retry", - "@Retry": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Delete": "Delete", - "@Delete": { - "description": "Label used for general delete/remove actions", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Done": "Done", - "@Done": { - "description": "Label for general done/finished actions", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Refresh": "Refresh", - "@Refresh": { - "description": "Label for button to refresh data from the web", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "View Description": "View Description", - "@View Description": { - "description": "Button to view the description for an event or assignment", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "expanded": "expanded", - "@expanded": { - "description": "Description for the accessibility reader for list groups that are expanded", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "collapsed": "collapsed", - "@collapsed": { - "description": "Description for the accessibility reader for list groups that are expanded", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "An unexpected error occurred": "An unexpected error occurred", - "@An unexpected error occurred": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No description": "No description", - "@No description": { - "description": "Message used when the assignment has no description", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Launch External Tool": "Launch External Tool", - "@Launch External Tool": { - "description": "Button text added to webviews to let users open external tools in their browser", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Interactions on this page are limited by your institution.": "Interactions on this page are limited by your institution.", - "@Interactions on this page are limited by your institution.": { - "description": "Message describing how the webview has limited access due to an instution setting", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "dateAtTime": "{date} at {time}", - "@dateAtTime": { - "description": "The string to format dates", - "type": "text", - "placeholders_order": [ - "date", - "time" - ], - "placeholders": { - "date": {}, - "time": {} - } - }, - "dueDateAtTime": "Due {date} at {time}", - "@dueDateAtTime": { - "description": "The string to format due dates", - "type": "text", - "placeholders_order": [ - "date", - "time" - ], - "placeholders": { - "date": {}, - "time": {} - } - }, - "No Due Date": "No Due Date", - "@No Due Date": { - "description": "Label for assignments that do not have a due date", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Filter": "Filter", - "@Filter": { - "description": "Label for buttons to filter what items are visible", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "unread": "unread", - "@unread": { - "description": "Label for things that are marked as unread", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "unreadCount": "{count} unread", - "@unreadCount": { - "description": "Formatted string for when there are a number of unread items", - "type": "text", - "placeholders_order": [ - "count" - ], - "placeholders": { - "count": {} - } - }, - "badgeNumberPlus": "{count}+", - "@badgeNumberPlus": { - "description": "Formatted string for when too many items are being notified in a badge, generally something like: 99+", - "type": "text", - "placeholders_order": [ - "count" - ], - "placeholders": { - "count": {} - } - }, - "There was an error loading this announcement": "There was an error loading this announcement", - "@There was an error loading this announcement": { - "description": "Message shown when an announcement detail screen fails to load", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Network error": "Network error", - "@Network error": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Under Construction": "Under Construction", - "@Under Construction": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "We are currently building this feature for your viewing pleasure.": "We are currently building this feature for your viewing pleasure.", - "@We are currently building this feature for your viewing pleasure.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Request Login Help Button": "Request Login Help Button", - "@Request Login Help Button": { - "description": "Accessibility hint for button that opens help dialog for a login help request", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Request Login Help": "Request Login Help", - "@Request Login Help": { - "description": "Title of help dialog for a login help request", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I'm having trouble logging in": "I'm having trouble logging in", - "@I'm having trouble logging in": { - "description": "Subject of help dialog for a login help request", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "An error occurred when trying to display this link": "An error occurred when trying to display this link", - "@An error occurred when trying to display this link": { - "description": "Error message shown when a link can't be opened", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "We are unable to display this link, it may belong to an institution you currently aren't logged in to.": "We are unable to display this link; it may belong to an institution you currently aren't logged in to.", - "@We are unable to display this link, it may belong to an institution you currently aren't logged in to.": { - "description": "Description for error page shown when clicking a link", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Link Error": "Link Error", - "@Link Error": { - "description": "Title for error page shown when clicking a link", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Open In Browser": "Open In Browser", - "@Open In Browser": { - "description": "Text for button to open a link in the browswer", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You'll find the QR code on the web in your account profile. Click 'QR for Mobile Login' in the list.": "You'll find the QR code on the web in your account profile. Click 'QR for Mobile Login' in the list.", - "@You'll find the QR code on the web in your account profile. Click 'QR for Mobile Login' in the list.": { - "description": "Text for qr login tutorial screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Locate QR Code": "Locate QR Code", - "@Locate QR Code": { - "description": "Text for qr login button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Please scan a QR code generated by Canvas": "Please scan a QR code generated by Canvas", - "@Please scan a QR code generated by Canvas": { - "description": "Text for qr login error with incorrect qr code", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error logging in. Please generate another QR Code and try again.": "There was an error logging in. Please generate another QR Code and try again.", - "@There was an error logging in. Please generate another QR Code and try again.": { - "description": "Text for qr login error", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Screenshot showing location of QR code generation in browser": "Screenshot showing location of QR code generation in browser", - "@Screenshot showing location of QR code generation in browser": { - "description": "Content Description for qr login tutorial screenshot", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "QR scanning requires camera access": "QR scanning requires camera access", - "@QR scanning requires camera access": { - "description": "placeholder for camera error for QR code scan", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The linked item is no longer available": "The linked item is no longer available", - "@The linked item is no longer available": { - "description": "error message when the alert could no be opened", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Message sent": "Message sent", - "@Message sent": { - "description": "confirmation message on the screen when the user succesfully sends a message", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Acceptable Use Policy": "Acceptable Use Policy", - "@Acceptable Use Policy": { - "description": "title for the acceptable use policy screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Submit": "Submit", - "@Submit": { - "description": "submit button title for acceptable use policy screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Either you're a new user or the Acceptable Use Policy has changed since you last agreed to it. Please agree to the Acceptable Use Policy before you continue.": "Either you're a new user or the Acceptable Use Policy has changed since you last agreed to it. Please agree to the Acceptable Use Policy before you continue.", - "@Either you're a new user or the Acceptable Use Policy has changed since you last agreed to it. Please agree to the Acceptable Use Policy before you continue.": { - "description": "acceptable use policy screen description", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I agree to the Acceptable Use Policy.": "I agree to the Acceptable Use Policy.", - "@I agree to the Acceptable Use Policy.": { - "description": "acceptable use policy switch title", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "About": "About", - "@About": { - "description": "Title for about menu item in settings", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "App": "App", - "@App": { - "description": "Title for App field on about page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Login ID": "Login ID", - "@Login ID": { - "description": "Title for Login ID field on about page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Email": "Email", - "@Email": { - "description": "Title for Email field on about page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Version": "Version", - "@Version": { - "description": "Title for Version field on about page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Instructure logo": "Instructure logo", - "@Instructure logo": { - "description": "Semantics label for the Instructure logo on the about page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - } -} \ No newline at end of file diff --git a/apps/flutter_parent/lib/l10n/res/intl_en_CA.arb b/apps/flutter_parent/lib/l10n/res/intl_en_CA.arb deleted file mode 100644 index 30ee6a6194..0000000000 --- a/apps/flutter_parent/lib/l10n/res/intl_en_CA.arb +++ /dev/null @@ -1,2663 +0,0 @@ -{ - "@@last_modified": "2022-01-28T12:37:40.360857", - "alertsLabel": "Alerts", - "@alertsLabel": { - "description": "The label for the Alerts tab", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "calendarLabel": "Calendar", - "@calendarLabel": { - "description": "The label for the Calendar tab", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "coursesLabel": "Courses", - "@coursesLabel": { - "description": "The label for the Courses tab", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Students": "No Students", - "@No Students": { - "description": "Text for when an observer has no students they are observing", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Tap to show student selector": "Tap to show student selector", - "@Tap to show student selector": { - "description": "Semantics label for the area that will show the student selector when tapped", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Tap to pair with a new student": "Tap to pair with a new student", - "@Tap to pair with a new student": { - "description": "Semantics label for the add student button in the student selector", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Tap to select this student": "Tap to select this student", - "@Tap to select this student": { - "description": "Semantics label on individual students in the student switcher", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Manage Students": "Manage Students", - "@Manage Students": { - "description": "Label text for the Manage Students nav drawer button as well as the title for the Manage Students screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Help": "Help", - "@Help": { - "description": "Label text for the help nav drawer button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Log Out": "Log Out", - "@Log Out": { - "description": "Label text for the Log Out nav drawer button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Switch Users": "Switch Users", - "@Switch Users": { - "description": "Label text for the Switch Users nav drawer button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "appVersion": "v. {version}", - "@appVersion": { - "description": "App version shown in the navigation drawer", - "type": "text", - "placeholders_order": [ - "version" - ], - "placeholders": { - "version": {} - } - }, - "Are you sure you want to log out?": "Are you sure you want to log out?", - "@Are you sure you want to log out?": { - "description": "Confirmation message displayed when the user tries to log out", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Calendars": "Calendars", - "@Calendars": { - "description": "Label for button that lets users select which calendars to display", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "nextMonth": "Next month: {month}", - "@nextMonth": { - "description": "Label for the button that switches the calendar to the next month", - "type": "text", - "placeholders_order": [ - "month" - ], - "placeholders": { - "month": {} - } - }, - "previousMonth": "Previous month: {month}", - "@previousMonth": { - "description": "Label for the button that switches the calendar to the previous month", - "type": "text", - "placeholders_order": [ - "month" - ], - "placeholders": { - "month": {} - } - }, - "nextWeek": "Next week starting {date}", - "@nextWeek": { - "description": "Label for the button that switches the calendar to the next week", - "type": "text", - "placeholders_order": [ - "date" - ], - "placeholders": { - "date": {} - } - }, - "previousWeek": "Previous week starting {date}", - "@previousWeek": { - "description": "Label for the button that switches the calendar to the previous week", - "type": "text", - "placeholders_order": [ - "date" - ], - "placeholders": { - "date": {} - } - }, - "selectedMonthLabel": "Month of {month}", - "@selectedMonthLabel": { - "description": "Accessibility label for the button that expands/collapses the month view", - "type": "text", - "placeholders_order": [ - "month" - ], - "placeholders": { - "month": {} - } - }, - "expand": "expand", - "@expand": { - "description": "Accessibility label for the on-tap hint for the button that expands/collapses the month view", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "collapse": "collapse", - "@collapse": { - "description": "Accessibility label for the on-tap hint for the button that expands/collapses the month view", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "pointsPossible": "{points} points possible", - "@pointsPossible": { - "description": "Screen reader label used for the points possible for an assignment, quiz, etc.", - "type": "text", - "placeholders_order": [ - "points" - ], - "placeholders": { - "points": {} - } - }, - "No Events Today!": "No Events Today!", - "@No Events Today!": { - "description": "Title displayed when there are no calendar events for the current day", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "It looks like a great day to rest, relax, and recharge.": "It looks like a great day to rest, relax, and recharge.", - "@It looks like a great day to rest, relax, and recharge.": { - "description": "Message displayed when there are no calendar events for the current day", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading your student's calendar": "There was an error loading your student's calendar", - "@There was an error loading your student's calendar": { - "description": "Message displayed when calendar events could not be loaded for the current student", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Tap to favorite the courses you want to see on the Calendar. Select up to 10.": "Tap to favorite the courses you want to see on the Calendar. Select up to 10.", - "@Tap to favorite the courses you want to see on the Calendar. Select up to 10.": { - "description": "Description text on calendar filter screen.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You may only choose 10 calendars to display": "You may only choose 10 calendars to display", - "@You may only choose 10 calendars to display": { - "description": "Error text when trying to select more than 10 calendars", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You must select at least one calendar to display": "You must select at least one calendar to display", - "@You must select at least one calendar to display": { - "description": "Error text when trying to de-select all calendars", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Planner Note": "Planner Note", - "@Planner Note": { - "description": "Label used for notes in the planner", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Go to today": "Go to today", - "@Go to today": { - "description": "Accessibility label used for the today button in the planner", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Previous Logins": "Previous Logins", - "@Previous Logins": { - "description": "Label for the list of previous user logins", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "canvasLogoLabel": "Canvas logo", - "@canvasLogoLabel": { - "description": "The semantics label for the Canvas logo", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "findSchool": "Find School", - "@findSchool": { - "description": "Text for the find-my-school button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "domainSearchInputHint": "Enter school name or district…", - "@domainSearchInputHint": { - "description": "Input hint for the text box on the domain search screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "noDomainResults": "Unable to find schools matching \"{query}\"", - "@noDomainResults": { - "description": "Message shown to users when the domain search query did not return any results", - "type": "text", - "placeholders_order": [ - "query" - ], - "placeholders": { - "query": {} - } - }, - "domainSearchHelpLabel": "How do I find my school or district?", - "@domainSearchHelpLabel": { - "description": "Label for the help button on the domain search screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "canvasGuides": "Canvas Guides", - "@canvasGuides": { - "description": "Proper name for the Canvas Guides. This will be used in the domainSearchHelpBody text and will be highlighted and clickable", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "canvasSupport": "Canvas Support", - "@canvasSupport": { - "description": "Proper name for Canvas Support. This will be used in the domainSearchHelpBody text and will be highlighted and clickable", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "domainSearchHelpBody": "Try searching for the name of the school or district you’re attempting to access, like “Smith Private School” or “Smith County Schools.” You can also enter a Canvas domain directly, like “smith.instructure.com.”\n\nFor more information on finding your institution’s Canvas account, you can visit the {canvasGuides}, reach out to {canvasSupport}, or contact your school for assistance.", - "@domainSearchHelpBody": { - "description": "The body text shown in the help dialog on the domain search screen", - "type": "text", - "placeholders_order": [ - "canvasGuides", - "canvasSupport" - ], - "placeholders": { - "canvasGuides": {}, - "canvasSupport": {} - } - }, - "Uh oh!": "Uh oh!", - "@Uh oh!": { - "description": "Title of the screen that shows when a crash has occurred", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "We’re not sure what happened, but it wasn’t good. Contact us if this keeps happening.": "We’re not sure what happened, but it wasn’t good. Contact us if this keeps happening.", - "@We’re not sure what happened, but it wasn’t good. Contact us if this keeps happening.": { - "description": "Message shown when a crash has occurred", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Contact Support": "Contact Support", - "@Contact Support": { - "description": "Label for the button that allows users to contact support after a crash has occurred", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "View error details": "View error details", - "@View error details": { - "description": "Label for the button that allowed users to view crash details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Restart app": "Restart app", - "@Restart app": { - "description": "Label for the button that will restart the entire application", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Application version": "Application version", - "@Application version": { - "description": "Label for the application version displayed in the crash details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Device model": "Device model", - "@Device model": { - "description": "Label for the device model displayed in the crash details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Android OS version": "Android OS version", - "@Android OS version": { - "description": "Label for the Android operating system version displayed in the crash details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Full error message": "Full error message", - "@Full error message": { - "description": "Label for the full error message displayed in the crash details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Inbox": "Inbox", - "@Inbox": { - "description": "Title for the Inbox screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading your inbox messages.": "There was an error loading your inbox messages.", - "@There was an error loading your inbox messages.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Subject": "No Subject", - "@No Subject": { - "description": "Title used for inbox messages that have no subject", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unable to fetch courses. Please check your connection and try again.": "Unable to fetch courses. Please check your connection and try again.", - "@Unable to fetch courses. Please check your connection and try again.": { - "description": "Message shown when an error occured while loading courses", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Choose a course to message": "Choose a course to message", - "@Choose a course to message": { - "description": "Header in the course list shown when the user is choosing which course to associate with a new message", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Inbox Zero": "Inbox Zero", - "@Inbox Zero": { - "description": "Title of the message shown when there are no inbox messages", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You’re all caught up!": "You’re all caught up!", - "@You’re all caught up!": { - "description": "Subtitle of the message shown when there are no inbox messages", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading recipients for this course": "There was an error loading recipients for this course", - "@There was an error loading recipients for this course": { - "description": "Message shown when attempting to create a new message but the recipients list failed to load", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unable to send message. Check your connection and try again.": "Unable to send message. Check your connection and try again.", - "@Unable to send message. Check your connection and try again.": { - "description": "Message show when there was an error creating or sending a new message", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unsaved changes": "Unsaved changes", - "@Unsaved changes": { - "description": "Title of the dialog shown when the user tries to leave with unsaved changes", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Are you sure you wish to close this page? Your unsent message will be lost.": "Are you sure you wish to close this page? Your unsent message will be lost.", - "@Are you sure you wish to close this page? Your unsent message will be lost.": { - "description": "Body text of the dialog shown when the user tries leave with unsaved changes", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "New message": "New message", - "@New message": { - "description": "Title of the new-message screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Add attachment": "Add attachment", - "@Add attachment": { - "description": "Tooltip for the add-attachment button in the new-message screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Send message": "Send message", - "@Send message": { - "description": "Tooltip for the send-message button in the new-message screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Select recipients": "Select recipients", - "@Select recipients": { - "description": "Tooltip for the button that allows users to select message recipients", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No recipients selected": "No recipients selected", - "@No recipients selected": { - "description": "Hint displayed when the user has not selected any message recipients", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Message subject": "Message subject", - "@Message subject": { - "description": "Hint text displayed in the input field for the message subject", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Message": "Message", - "@Message": { - "description": "Hint text displayed in the input field for the message body", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Recipients": "Recipients", - "@Recipients": { - "description": "Label for message recipients", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "plusRecipientCount": "+{count}", - "@plusRecipientCount": { - "description": "Shows the number of recipients that are selected but not displayed on screen.", - "type": "text", - "placeholders_order": [ - "count" - ], - "placeholders": { - "count": { - "example": 5 - } - } - }, - "Failed. Tap for options.": "Failed. Tap for options.", - "@Failed. Tap for options.": { - "description": "Short message shown on a message attachment when uploading has failed", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "courseForWhom": "for {studentShortName}", - "@courseForWhom": { - "description": "Describes for whom a course is for (i.e. for Bill)", - "type": "text", - "placeholders_order": [ - "studentShortName" - ], - "placeholders": { - "studentShortName": {} - } - }, - "messageLinkPostscript": "Regarding: {studentName}, {linkUrl}", - "@messageLinkPostscript": { - "description": "A postscript appended to new messages that clarifies which student is the subject of the message and also includes a URL for the related Canvas component (course, assignment, event, etc).", - "type": "text", - "placeholders_order": [ - "studentName", - "linkUrl" - ], - "placeholders": { - "studentName": {}, - "linkUrl": {} - } - }, - "There was an error loading this conversation": "There was an error loading this conversation", - "@There was an error loading this conversation": { - "description": "Message shown when a conversation fails to load", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Reply": "Reply", - "@Reply": { - "description": "Button label for replying to a conversation", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Reply All": "Reply All", - "@Reply All": { - "description": "Button label for replying to all conversation participants", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unknown User": "Unknown User", - "@Unknown User": { - "description": "Label used where the user name is not known", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "me": "me", - "@me": { - "description": "First-person pronoun (i.e. 'me') that will be used in message author info, e.g. 'Me to 4 others' or 'Jon Snow to me'", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "authorToRecipient": "{authorName} to {recipientName}", - "@authorToRecipient": { - "description": "Author info for a single-recipient message; includes both the author name and the recipient name.", - "type": "text", - "placeholders_order": [ - "authorName", - "recipientName" - ], - "placeholders": { - "authorName": {}, - "recipientName": {} - } - }, - "authorToNOthers": "{howMany,plural, =1{{authorName} to 1 other}other{{authorName} to {howMany} others}}", - "@authorToNOthers": { - "description": "Author info for a mutli-recipient message; includes the author name and the number of recipients", - "type": "text", - "placeholders_order": [ - "authorName", - "howMany" - ], - "placeholders": { - "authorName": {}, - "howMany": {} - } - }, - "authorToRecipientAndNOthers": "{howMany,plural, =1{{authorName} to {recipientName} & 1 other}other{{authorName} to {recipientName} & {howMany} others}}", - "@authorToRecipientAndNOthers": { - "description": "Author info for a multi-recipient message; includes the author name, one recipient name, and the number of other recipients", - "type": "text", - "placeholders_order": [ - "authorName", - "recipientName", - "howMany" - ], - "placeholders": { - "authorName": {}, - "recipientName": {}, - "howMany": {} - } - }, - "Download": "Download", - "@Download": { - "description": "Label for the button that will begin downloading a file", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Open with another app": "Open with another app", - "@Open with another app": { - "description": "Label for the button that will allow users to open a file with another app", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There are no installed applications that can open this file": "There are no installed applications that can open this file", - "@There are no installed applications that can open this file": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unsupported File": "Unsupported File", - "@Unsupported File": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "This file is unsupported and can’t be viewed through the app": "This file is unsupported and can’t be viewed through the app", - "@This file is unsupported and can’t be viewed through the app": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unable to play this media file": "Unable to play this media file", - "@Unable to play this media file": { - "description": "Message shown when audio or video media could not be played", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unable to load this image": "Unable to load this image", - "@Unable to load this image": { - "description": "Message shown when an image file could not be loaded or displayed", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading this file": "There was an error loading this file", - "@There was an error loading this file": { - "description": "Message shown when a file could not be loaded or displayed", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Courses": "No Courses", - "@No Courses": { - "description": "Title for having no courses", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Your student’s courses might not be published yet.": "Your student’s courses might not be published yet.", - "@Your student’s courses might not be published yet.": { - "description": "Message for having no courses", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading your student’s courses.": "There was an error loading your student’s courses.", - "@There was an error loading your student’s courses.": { - "description": "Message displayed when the list of student courses could not be loaded", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Grade": "No Grade", - "@No Grade": { - "description": "Message shown when there is currently no grade available for a course", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Filter by": "Filter by", - "@Filter by": { - "description": "Title for list of terms to filter grades by", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Grades": "Grades", - "@Grades": { - "description": "Label for the \"Grades\" tab in course details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Syllabus": "Syllabus", - "@Syllabus": { - "description": "Label for the \"Syllabus\" tab in course details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Front Page": "Front Page", - "@Front Page": { - "description": "Label for the \"Front Page\" tab in course details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Summary": "Summary", - "@Summary": { - "description": "Label for the \"Summary\" tab in course details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Send a message about this course": "Send a message about this course", - "@Send a message about this course": { - "description": "Accessibility hint for the course messaage floating action button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Total Grade": "Total Grade", - "@Total Grade": { - "description": "Label for the total grade in the course", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Graded": "Graded", - "@Graded": { - "description": "Label for assignments that have been graded", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Submitted": "Submitted", - "@Submitted": { - "description": "Label for assignments that have been submitted", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Not Submitted": "Not Submitted", - "@Not Submitted": { - "description": "Label for assignments that have not been submitted", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Late": "Late", - "@Late": { - "description": "Label for assignments that have been marked late or submitted late", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Missing": "Missing", - "@Missing": { - "description": "Label for assignments that have been marked missing or are not submitted and past the due date", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "-": "-", - "@-": { - "description": "Value representing no score for student submission", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "All Grading Periods": "All Grading Periods", - "@All Grading Periods": { - "description": "Label for selecting all grading periods", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Assignments": "No Assignments", - "@No Assignments": { - "description": "Title for the no assignments message", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "It looks like assignments haven't been created in this space yet.": "It looks like assignments haven't been created in this space yet.", - "@It looks like assignments haven't been created in this space yet.": { - "description": "Message for no assignments", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading the summary details for this course.": "There was an error loading the summary details for this course.", - "@There was an error loading the summary details for this course.": { - "description": "Message shown when the course summary could not be loaded", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Summary": "No Summary", - "@No Summary": { - "description": "Title displayed when there are no items in the course summary", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "This course does not have any assignments or calendar events yet.": "This course does not have any assignments or calendar events yet.", - "@This course does not have any assignments or calendar events yet.": { - "description": "Message displayed when there are no items in the course summary", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "gradeFormatScoreOutOfPointsPossible": "{score} / {pointsPossible}", - "@gradeFormatScoreOutOfPointsPossible": { - "description": "Formatted string for a student score out of the points possible", - "type": "text", - "placeholders_order": [ - "score", - "pointsPossible" - ], - "placeholders": { - "score": {}, - "pointsPossible": {} - } - }, - "contentDescriptionScoreOutOfPointsPossible": "{score} out of {pointsPossible} points", - "@contentDescriptionScoreOutOfPointsPossible": { - "description": "Formatted string for a student score out of the points possible", - "type": "text", - "placeholders_order": [ - "score", - "pointsPossible" - ], - "placeholders": { - "score": {}, - "pointsPossible": {} - } - }, - "gradesSubjectMessage": "Regarding: {studentName}, Grades", - "@gradesSubjectMessage": { - "description": "The subject line for a message to a teacher regarding a student's grades", - "type": "text", - "placeholders_order": [ - "studentName" - ], - "placeholders": { - "studentName": {} - } - }, - "syllabusSubjectMessage": "Regarding: {studentName}, Syllabus", - "@syllabusSubjectMessage": { - "description": "The subject line for a message to a teacher regarding a course syllabus", - "type": "text", - "placeholders_order": [ - "studentName" - ], - "placeholders": { - "studentName": {} - } - }, - "frontPageSubjectMessage": "Regarding: {studentName}, Front Page", - "@frontPageSubjectMessage": { - "description": "The subject line for a message to a teacher regarding a course front page", - "type": "text", - "placeholders_order": [ - "studentName" - ], - "placeholders": { - "studentName": {} - } - }, - "assignmentSubjectMessage": "Regarding: {studentName}, Assignment - {assignmentName}", - "@assignmentSubjectMessage": { - "description": "The subject line for a message to a teacher regarding a student's assignment", - "type": "text", - "placeholders_order": [ - "studentName", - "assignmentName" - ], - "placeholders": { - "studentName": {}, - "assignmentName": {} - } - }, - "eventSubjectMessage": "Regarding: {studentName}, Event - {eventTitle}", - "@eventSubjectMessage": { - "description": "The subject line for a message to a teacher regarding a calendar event", - "type": "text", - "placeholders_order": [ - "studentName", - "eventTitle" - ], - "placeholders": { - "studentName": {}, - "eventTitle": {} - } - }, - "There is no page information available.": "There is no page information available.", - "@There is no page information available.": { - "description": "Description for when no page information is available", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Assignment Details": "Assignment Details", - "@Assignment Details": { - "description": "Title for the page that shows details for an assignment", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "assignmentTotalPoints": "{points} pts", - "@assignmentTotalPoints": { - "description": "Label used for the total points the assignment is worth", - "type": "text", - "placeholders_order": [ - "points" - ], - "placeholders": { - "points": {} - } - }, - "assignmentTotalPointsAccessible": "{points} points", - "@assignmentTotalPointsAccessible": { - "description": "Screen reader label used for the total points the assignment is worth", - "type": "text", - "placeholders_order": [ - "points" - ], - "placeholders": { - "points": {} - } - }, - "Due": "Due", - "@Due": { - "description": "Label for an assignment due date", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Grade": "Grade", - "@Grade": { - "description": "Label for the section that displays an assignment's grade", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Locked": "Locked", - "@Locked": { - "description": "Label for when an assignment is locked", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "assignmentLockedModule": "This assignment is locked by the module \"{moduleName}\".", - "@assignmentLockedModule": { - "description": "The locked description when an assignment is locked by a module", - "type": "text", - "placeholders_order": [ - "moduleName" - ], - "placeholders": { - "moduleName": {} - } - }, - "Remind Me": "Remind Me", - "@Remind Me": { - "description": "Label for the row to set reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Set a date and time to be notified of this specific assignment.": "Set a date and time to be notified of this specific assignment.", - "@Set a date and time to be notified of this specific assignment.": { - "description": "Description for row to set reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You will be notified about this assignment on…": "You will be notified about this assignment on…", - "@You will be notified about this assignment on…": { - "description": "Description for when a reminder is set", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Instructions": "Instructions", - "@Instructions": { - "description": "Label for the description of the assignment when it has quiz instructions", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Send a message about this assignment": "Send a message about this assignment", - "@Send a message about this assignment": { - "description": "Accessibility hint for the assignment messaage floating action button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "This app is not authorized for use.": "This app is not authorized for use.", - "@This app is not authorized for use.": { - "description": "The error shown when the app being used is not verified by Canvas", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The server you entered is not authorized for this app.": "The server you entered is not authorized for this app.", - "@The server you entered is not authorized for this app.": { - "description": "The error shown when the desired login domain is not verified by Canvas", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The user agent for this app is not authorized.": "The user agent for this app is not authorized.", - "@The user agent for this app is not authorized.": { - "description": "The error shown when the user agent during verification is not verified by Canvas", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "We were unable to verify the server for use with this app.": "We were unable to verify the server for use with this app.", - "@We were unable to verify the server for use with this app.": { - "description": "The generic error shown when we are unable to verify with Canvas", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Reminders": "Reminders", - "@Reminders": { - "description": "Name of the system notification channel for assignment and event reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Notifications for reminders about assignments and calendar events": "Notifications for reminders about assignments and calendar events", - "@Notifications for reminders about assignments and calendar events": { - "description": "Description of the system notification channel for assignment and event reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Reminders have changed!": "Reminders have changed!", - "@Reminders have changed!": { - "description": "Title of the dialog shown when the user needs to update their reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "In order to provide you with a better experience, we have updated how reminders work. You can add new reminders by viewing an assignment or calendar event and tapping the switch under the \"Remind Me\" section.\n\nBe aware that any reminders created with older versions of this app will not be compatible with the new changes and you will need to create them again.": "In order to provide you with a better experience, we have updated how reminders work. You can add new reminders by viewing an assignment or calendar event and tapping the switch under the \"Remind Me\" section.\n\nBe aware that any reminders created with older versions of this app will not be compatible with the new changes and you will need to create them again.", - "@In order to provide you with a better experience, we have updated how reminders work. You can add new reminders by viewing an assignment or calendar event and tapping the switch under the \"Remind Me\" section.\n\nBe aware that any reminders created with older versions of this app will not be compatible with the new changes and you will need to create them again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Not a parent?": "Not a parent?", - "@Not a parent?": { - "description": "Title for the screen that shows when the user is not observing any students", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "We couldn't find any students associated with this account": "We couldn't find any students associated with this account", - "@We couldn't find any students associated with this account": { - "description": "Subtitle for the screen that shows when the user is not observing any students", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Are you a student or teacher?": "Are you a student or teacher?", - "@Are you a student or teacher?": { - "description": "Label for button that will show users the option to view other Canvas apps in the Play Store", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "One of our other apps might be a better fit. Tap one to visit the Play Store.": "One of our other apps might be a better fit. Tap one to visit the Play Store.", - "@One of our other apps might be a better fit. Tap one to visit the Play Store.": { - "description": "Description of options to view other Canvas apps in the Play Store", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Return to Login": "Return to Login", - "@Return to Login": { - "description": "Label for the button that returns the user to the login screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "STUDENT": "STUDENT", - "@STUDENT": { - "description": "The \"student\" portion of the \"Canvas Student\" app name, in all caps. \"Canvas\" is excluded in this context as it will be displayed to the user as a wordmark image", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "TEACHER": "TEACHER", - "@TEACHER": { - "description": "The \"teacher\" portion of the \"Canvas Teacher\" app name, in all caps. \"Canvas\" is excluded in this context as it will be displayed to the user as a wordmark image", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Canvas Student": "Canvas Student", - "@Canvas Student": { - "description": "The name of the Canvas Student app. Only \"Student\" should be translated as \"Canvas\" is a brand name in this context and should not be translated.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Canvas Teacher": "Canvas Teacher", - "@Canvas Teacher": { - "description": "The name of the Canvas Teacher app. Only \"Teacher\" should be translated as \"Canvas\" is a brand name in this context and should not be translated.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Alerts": "No Alerts", - "@No Alerts": { - "description": "The title for the empty message to show to users when there are no alerts for the student.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There’s nothing to be notified of yet.": "There’s nothing to be notified of yet.", - "@There’s nothing to be notified of yet.": { - "description": "The empty message to show to users when there are no alerts for the student.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "dismissAlertLabel": "Dismiss {alertTitle}", - "@dismissAlertLabel": { - "description": "Accessibility label to dismiss an alert", - "type": "text", - "placeholders_order": [ - "alertTitle" - ], - "placeholders": { - "alertTitle": {} - } - }, - "Course Announcement": "Course Announcement", - "@Course Announcement": { - "description": "Title for alerts when there is a course announcement", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Institution Announcement": "Institution Announcement", - "@Institution Announcement": { - "description": "Title for alerts when there is an institution announcement", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "assignmentGradeAboveThreshold": "Assignment Grade Above {threshold}", - "@assignmentGradeAboveThreshold": { - "description": "Title for alerts when an assignment grade is above the threshold value", - "type": "text", - "placeholders_order": [ - "threshold" - ], - "placeholders": { - "threshold": {} - } - }, - "assignmentGradeBelowThreshold": "Assignment Grade Below {threshold}", - "@assignmentGradeBelowThreshold": { - "description": "Title for alerts when an assignment grade is below the threshold value", - "type": "text", - "placeholders_order": [ - "threshold" - ], - "placeholders": { - "threshold": {} - } - }, - "courseGradeAboveThreshold": "Course Grade Above {threshold}", - "@courseGradeAboveThreshold": { - "description": "Title for alerts when a course grade is above the threshold value", - "type": "text", - "placeholders_order": [ - "threshold" - ], - "placeholders": { - "threshold": {} - } - }, - "courseGradeBelowThreshold": "Course Grade Below {threshold}", - "@courseGradeBelowThreshold": { - "description": "Title for alerts when a course grade is below the threshold value", - "type": "text", - "placeholders_order": [ - "threshold" - ], - "placeholders": { - "threshold": {} - } - }, - "Settings": "Settings", - "@Settings": { - "description": "Title for the settings screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Theme": "Theme", - "@Theme": { - "description": "Label for the light/dark theme section in the settings page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Dark Mode": "Dark Mode", - "@Dark Mode": { - "description": "Label for the button that enables dark mode", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Light Mode": "Light Mode", - "@Light Mode": { - "description": "Label for the button that enables light mode", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "High Contrast Mode": "High Contrast Mode", - "@High Contrast Mode": { - "description": "Label for the switch that toggles high contrast mode", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Use Dark Theme in Web Content": "Use Dark Theme in Web Content", - "@Use Dark Theme in Web Content": { - "description": "Label for the switch that toggles dark mode for webviews", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Appearance": "Appearance", - "@Appearance": { - "description": "Label for the appearance section in the settings page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Successfully submitted!": "Successfully submitted!", - "@Successfully submitted!": { - "description": "Title displayed in the grade cell for an assignment that has been submitted", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "submissionStatusSuccessSubtitle": "This assignment was submitted on {date} at {time} and is waiting to be graded", - "@submissionStatusSuccessSubtitle": { - "description": "Subtitle displayed in the grade cell for an assignment that has been submitted and is awaiting a grade", - "type": "text", - "placeholders_order": [ - "date", - "time" - ], - "placeholders": { - "date": {}, - "time": {} - } - }, - "outOfPoints": "{howMany,plural, =1{Out of 1 point}other{Out of {points} points}}", - "@outOfPoints": { - "description": "Description for an assignment grade that has points without a current scoroe", - "type": "text", - "placeholders_order": [ - "points", - "howMany" - ], - "placeholders": { - "points": {}, - "howMany": {} - } - }, - "Excused": "Excused", - "@Excused": { - "description": "Grading status for an assignment marked as excused", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Complete": "Complete", - "@Complete": { - "description": "Grading status for an assignment marked as complete", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Incomplete": "Incomplete", - "@Incomplete": { - "description": "Grading status for an assignment marked as incomplete", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "minus": "minus", - "@minus": { - "description": "Screen reader-friendly replacement for the \"-\" character in letter grades like \"A-\"", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "latePenalty": "Late penalty (-{pointsLost})", - "@latePenalty": { - "description": "Text displayed when a late penalty has been applied to the assignment", - "type": "text", - "placeholders_order": [ - "pointsLost" - ], - "placeholders": { - "pointsLost": {} - } - }, - "finalGrade": "Final Grade: {grade}", - "@finalGrade": { - "description": "Text that displays the final grade of an assignment", - "type": "text", - "placeholders_order": [ - "grade" - ], - "placeholders": { - "grade": {} - } - }, - "Alert Settings": "Alert Settings", - "@Alert Settings": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Alert me when…": "Alert me when…", - "@Alert me when…": { - "description": "Header for the screen where the observer chooses the thresholds that will determine when they receive alerts (e.g. when an assignment is graded below 70%)", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Course grade below": "Course grade below", - "@Course grade below": { - "description": "Label describing the threshold for when the course grade is below a certain percentage", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Course grade above": "Course grade above", - "@Course grade above": { - "description": "Label describing the threshold for when the course grade is above a certain percentage", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Assignment missing": "Assignment missing", - "@Assignment missing": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Assignment grade below": "Assignment grade below", - "@Assignment grade below": { - "description": "Label describing the threshold for when an assignment is graded below a certain percentage", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Assignment grade above": "Assignment grade above", - "@Assignment grade above": { - "description": "Label describing the threshold for when an assignment is graded above a certain percentage", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Course Announcements": "Course Announcements", - "@Course Announcements": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Institution Announcements": "Institution Announcements", - "@Institution Announcements": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Never": "Never", - "@Never": { - "description": "Indication that tells the user they will not receive alert notifications of a specific kind", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Grade percentage": "Grade percentage", - "@Grade percentage": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading your student's alerts.": "There was an error loading your student's alerts.", - "@There was an error loading your student's alerts.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Must be below 100": "Must be below 100", - "@Must be below 100": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "mustBeBelowN": "Must be below {percentage}", - "@mustBeBelowN": { - "description": "Validation error to the user that they must choose a percentage below 'n'", - "type": "text", - "placeholders_order": [ - "percentage" - ], - "placeholders": { - "percentage": { - "example": 5 - } - } - }, - "mustBeAboveN": "Must be above {percentage}", - "@mustBeAboveN": { - "description": "Validation error to the user that they must choose a percentage above 'n'", - "type": "text", - "placeholders_order": [ - "percentage" - ], - "placeholders": { - "percentage": { - "example": 5 - } - } - }, - "Select Student Color": "Select Student Color", - "@Select Student Color": { - "description": "Title for screen that allows users to assign a color to a specific student", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Electric, blue": "Electric, blue", - "@Electric, blue": { - "description": "Name of the Electric (blue) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Plum, Purple": "Plum, Purple", - "@Plum, Purple": { - "description": "Name of the Plum (purple) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Barney, Fuschia": "Barney, Fuschia", - "@Barney, Fuschia": { - "description": "Name of the Barney (fuschia) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Raspberry, Red": "Raspberry, Red", - "@Raspberry, Red": { - "description": "Name of the Raspberry (red) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Fire, Orange": "Fire, Orange", - "@Fire, Orange": { - "description": "Name of the Fire (orange) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Shamrock, Green": "Shamrock, Green", - "@Shamrock, Green": { - "description": "Name of the Shamrock (green) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "An error occurred while saving your selection. Please try again.": "An error occurred while saving your selection. Please try again.", - "@An error occurred while saving your selection. Please try again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "changeStudentColorLabel": "Change color for {studentName}", - "@changeStudentColorLabel": { - "description": "Accessibility label for the button that lets users change the color associated with a specific student", - "type": "text", - "placeholders_order": [ - "studentName" - ], - "placeholders": { - "studentName": {} - } - }, - "Teacher": "Teacher", - "@Teacher": { - "description": "Label for the Teacher enrollment type", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Student": "Student", - "@Student": { - "description": "Label for the Student enrollment type", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "TA": "TA", - "@TA": { - "description": "Label for the Teaching Assistant enrollment type (also known as Teacher Aid or Education Assistant), reduced to a short acronym/initialism if appropriate.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Observer": "Observer", - "@Observer": { - "description": "Label for the Observer enrollment type", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Use Camera": "Use Camera", - "@Use Camera": { - "description": "Label for the action item that lets the user capture a photo using the device camera", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Upload File": "Upload File", - "@Upload File": { - "description": "Label for the action item that lets the user upload a file from their device", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Choose from Gallery": "Choose from Gallery", - "@Choose from Gallery": { - "description": "Label for the action item that lets the user select a photo from their device gallery", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Preparing…": "Preparing…", - "@Preparing…": { - "description": "Message shown while a file is being prepared to attach to a message", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Add student with…": "Add student with…", - "@Add student with…": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Add Student": "Add Student", - "@Add Student": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You are not observing any students.": "You are not observing any students.", - "@You are not observing any students.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading your students.": "There was an error loading your students.", - "@There was an error loading your students.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Pairing Code": "Pairing Code", - "@Pairing Code": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Students can obtain a pairing code through the Canvas website": "Students can obtain a pairing code through the Canvas website", - "@Students can obtain a pairing code through the Canvas website": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Enter the student pairing code provided to you. If the pairing code doesn't work, it may have expired": "Enter the student pairing code provided to you. If the pairing code doesn't work, it may have expired", - "@Enter the student pairing code provided to you. If the pairing code doesn't work, it may have expired": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Your code is incorrect or expired.": "Your code is incorrect or expired.", - "@Your code is incorrect or expired.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Something went wrong trying to create your account, please reach out to your school for assistance.": "Something went wrong trying to create your account, please reach out to your school for assistance.", - "@Something went wrong trying to create your account, please reach out to your school for assistance.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "QR Code": "QR Code", - "@QR Code": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Students can create a QR code using the Canvas Student app on their mobile device": "Students can create a QR code using the Canvas Student app on their mobile device", - "@Students can create a QR code using the Canvas Student app on their mobile device": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Add new student": "Add new student", - "@Add new student": { - "description": "Semantics label for the FAB on the Manage Students Screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Select": "Select", - "@Select": { - "description": "Hint text to tell the user to choose one of two options", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I have a Canvas account": "I have a Canvas account", - "@I have a Canvas account": { - "description": "Option to select for users that have a canvas account", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I don't have a Canvas account": "I don't have a Canvas account", - "@I don't have a Canvas account": { - "description": "Option to select for users that don't have a canvas account", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Create Account": "Create Account", - "@Create Account": { - "description": "Button text for account creation confirmation", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Full Name": "Full Name", - "@Full Name": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Email Address": "Email Address", - "@Email Address": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Password": "Password", - "@Password": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Full Name…": "Full Name…", - "@Full Name…": { - "description": "hint label for inside form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Email…": "Email…", - "@Email…": { - "description": "hint label for inside form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Password…": "Password…", - "@Password…": { - "description": "hint label for inside form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Please enter full name": "Please enter full name", - "@Please enter full name": { - "description": "Error message for form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Please enter an email address": "Please enter an email address", - "@Please enter an email address": { - "description": "Error message for form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Please enter a valid email address": "Please enter a valid email address", - "@Please enter a valid email address": { - "description": "Error message for form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Password is required": "Password is required", - "@Password is required": { - "description": "Error message for form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Password must contain at least 8 characters": "Password must contain at least 8 characters", - "@Password must contain at least 8 characters": { - "description": "Error message for form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "qrCreateAccountTos": "By tapping 'Create Account', you agree to the {termsOfService} and acknowledge the {privacyPolicy}", - "@qrCreateAccountTos": { - "description": "The text show on the account creation screen", - "type": "text", - "placeholders_order": [ - "termsOfService", - "privacyPolicy" - ], - "placeholders": { - "termsOfService": {}, - "privacyPolicy": {} - } - }, - "Terms of Service": "Terms of Service", - "@Terms of Service": { - "description": "Label for the Canvas Terms of Service agreement. This will be used in the qrCreateAccountTos text and will be highlighted and clickable", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Privacy Policy": "Privacy Policy", - "@Privacy Policy": { - "description": "Label for the Canvas Privacy Policy agreement. This will be used in the qrCreateAccountTos text and will be highlighted and clickable", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "View the Privacy Policy": "View the Privacy Policy", - "@View the Privacy Policy": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Already have an account? ": "Already have an account? ", - "@Already have an account? ": { - "description": "Part of multiline text span, includes AccountSignIn1-2, in that order", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Sign In": "Sign In", - "@Sign In": { - "description": "Part of multiline text span, includes AccountSignIn1-2, in that order", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Hide Password": "Hide Password", - "@Hide Password": { - "description": "content description for password hide button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Show Password": "Show Password", - "@Show Password": { - "description": "content description for password show button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Terms of Service Link": "Terms of Service Link", - "@Terms of Service Link": { - "description": "content description for terms of service link", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Privacy Policy Link": "Privacy Policy Link", - "@Privacy Policy Link": { - "description": "content description for privacy policy link", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Event": "Event", - "@Event": { - "description": "Title for the event details screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Date": "Date", - "@Date": { - "description": "Label for the event date", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Location": "Location", - "@Location": { - "description": "Label for the location information", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Location Specified": "No Location Specified", - "@No Location Specified": { - "description": "Description for events that do not have a location", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "eventTime": "{startAt} - {endAt}", - "@eventTime": { - "description": "The time the event is happening, example: \"2:00 pm - 4:00 pm\"", - "type": "text", - "placeholders_order": [ - "startAt", - "endAt" - ], - "placeholders": { - "startAt": {}, - "endAt": {} - } - }, - "Set a date and time to be notified of this event.": "Set a date and time to be notified of this event.", - "@Set a date and time to be notified of this event.": { - "description": "Description for row to set event reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You will be notified about this event on…": "You will be notified about this event on…", - "@You will be notified about this event on…": { - "description": "Description for when an event reminder is set", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Share Your Love for the App": "Share Your Love for the App", - "@Share Your Love for the App": { - "description": "Label for option to open the app store", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Tell us about your favorite parts of the app": "Tell us about your favorite parts of the app", - "@Tell us about your favorite parts of the app": { - "description": "Description for option to open the app store", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Legal": "Legal", - "@Legal": { - "description": "Label for legal information option", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Privacy policy, terms of use, open source": "Privacy policy, terms of use, open source", - "@Privacy policy, terms of use, open source": { - "description": "Description for legal information option", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Idea for Canvas Parent App [Android]": "Idea for Canvas Parent App [Android]", - "@Idea for Canvas Parent App [Android]": { - "description": "The subject for the email to request a feature", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The following information will help us better understand your idea:": "The following information will help us better understand your idea:", - "@The following information will help us better understand your idea:": { - "description": "The header for the users information that is attached to a feature request", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Domain:": "Domain:", - "@Domain:": { - "description": "The label for the Canvas domain of the logged in user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "User ID:": "User ID:", - "@User ID:": { - "description": "The label for the Canvas user ID of the logged in user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Email:": "Email:", - "@Email:": { - "description": "The label for the eamil of the logged in user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Locale:": "Locale:", - "@Locale:": { - "description": "The label for the locale of the logged in user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Terms of Use": "Terms of Use", - "@Terms of Use": { - "description": "Label for the terms of use", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Canvas on GitHub": "Canvas on GitHub", - "@Canvas on GitHub": { - "description": "Label for the button that opens the Canvas project on GitHub's website", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was a problem loading the Terms of Use": "There was a problem loading the Terms of Use", - "@There was a problem loading the Terms of Use": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Device": "Device", - "@Device": { - "description": "Label used for device manufacturer/model in the error report", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "OS Version": "OS Version", - "@OS Version": { - "description": "Label used for device operating system version in the error report", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Version Number": "Version Number", - "@Version Number": { - "description": "Label used for the app version number in the error report", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Report A Problem": "Report A Problem", - "@Report A Problem": { - "description": "Title used for generic dialog to report problems", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Subject": "Subject", - "@Subject": { - "description": "Label used for Subject text field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "A subject is required.": "A subject is required.", - "@A subject is required.": { - "description": "Error shown when the subject field is empty", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "An email address is required.": "An email address is required.", - "@An email address is required.": { - "description": "Error shown when the email field is empty", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Description": "Description", - "@Description": { - "description": "Label used for Description text field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "A description is required.": "A description is required.", - "@A description is required.": { - "description": "Error shown when the description field is empty", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "How is this affecting you?": "How is this affecting you?", - "@How is this affecting you?": { - "description": "Label used for the dropdown to select how severe the issue is", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "send": "send", - "@send": { - "description": "Label used for send button when reporting a problem", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Just a casual question, comment, idea, suggestion…": "Just a casual question, comment, idea, suggestion…", - "@Just a casual question, comment, idea, suggestion…": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I need some help but it's not urgent.": "I need some help but it's not urgent.", - "@I need some help but it's not urgent.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Something's broken but I can work around it to get what I need done.": "Something's broken but I can work around it to get what I need done.", - "@Something's broken but I can work around it to get what I need done.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I can't get things done until I hear back from you.": "I can't get things done until I hear back from you.", - "@I can't get things done until I hear back from you.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "EXTREME CRITICAL EMERGENCY!!": "EXTREME CRITICAL EMERGENCY!!", - "@EXTREME CRITICAL EMERGENCY!!": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Not Graded": "Not Graded", - "@Not Graded": { - "description": "Description for an assignment has not been graded.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Login flow: Normal": "Login flow: Normal", - "@Login flow: Normal": { - "description": "Description for the normal login flow", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Login flow: Canvas": "Login flow: Canvas", - "@Login flow: Canvas": { - "description": "Description for the Canvas login flow", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Login flow: Site Admin": "Login flow: Site Admin", - "@Login flow: Site Admin": { - "description": "Description for the Site Admin login flow", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Login flow: Skip mobile verify": "Login flow: Skip mobile verify", - "@Login flow: Skip mobile verify": { - "description": "Description for the login flow that skips domain verification for mobile", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Act As User": "Act As User", - "@Act As User": { - "description": "Label for the button that allows the user to act (masquerade) as another user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Stop Acting as User": "Stop Acting as User", - "@Stop Acting as User": { - "description": "Label for the button that allows the user to stop acting (masquerading) as another user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "actingAsUser": "You are acting as {userName}", - "@actingAsUser": { - "description": "Message shown while acting (masquerading) as another user", - "type": "text", - "placeholders_order": [ - "userName" - ], - "placeholders": { - "userName": {} - } - }, - "\"Act as\" is essentially logging in as this user without a password. You will be able to take any action as if you were this user, and from other users' points of views, it will be as if this user performed them. However, audit logs record that you were the one who performed the actions on behalf of this user.": "\"Act as\" is essentially logging in as this user without a password. You will be able to take any action as if you were this user, and from other users' points of views, it will be as if this user performed them. However, audit logs record that you were the one who performed the actions on behalf of this user.", - "@\"Act as\" is essentially logging in as this user without a password. You will be able to take any action as if you were this user, and from other users' points of views, it will be as if this user performed them. However, audit logs record that you were the one who performed the actions on behalf of this user.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Domain": "Domain", - "@Domain": { - "description": "Text field hint for domain url input", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You must enter a valid domain": "You must enter a valid domain", - "@You must enter a valid domain": { - "description": "Message displayed for domain input error", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "User ID": "User ID", - "@User ID": { - "description": "Text field hint for user ID input", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You must enter a user id": "You must enter a user id", - "@You must enter a user id": { - "description": "Message displayed for user Id input error", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error trying to act as this user. Please check the Domain and User ID and try again.": "There was an error trying to act as this user. Please check the Domain and User ID and try again.", - "@There was an error trying to act as this user. Please check the Domain and User ID and try again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "endMasqueradeMessage": "You will stop acting as {userName} and return to your original account.", - "@endMasqueradeMessage": { - "description": "Confirmation message displayed when the user wants to stop acting (masquerading) as another user", - "type": "text", - "placeholders_order": [ - "userName" - ], - "placeholders": { - "userName": {} - } - }, - "endMasqueradeLogoutMessage": "You will stop acting as {userName} and will be logged out.", - "@endMasqueradeLogoutMessage": { - "description": "Confirmation message displayed when the user wants to stop acting (masquerading) as another user and will be logged out.", - "type": "text", - "placeholders_order": [ - "userName" - ], - "placeholders": { - "userName": {} - } - }, - "How are we doing?": "How are we doing?", - "@How are we doing?": { - "description": "Title for dialog asking user to rate the app out of 5 stars.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Don't show again": "Don't show again", - "@Don't show again": { - "description": "Button to prevent the rating dialog from showing again.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "What can we do better?": "What can we do better?", - "@What can we do better?": { - "description": "Hint text for providing a comment with the rating.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Send Feedback": "Send Feedback", - "@Send Feedback": { - "description": "Button to send rating with feedback", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "ratingDialogEmailSubject": "Suggestions for Android - Canvas Parent {version}", - "@ratingDialogEmailSubject": { - "description": "The subject for an email to provide feedback for CanvasParent.", - "type": "text", - "placeholders_order": [ - "version" - ], - "placeholders": { - "version": {} - } - }, - "starRating": "{position,plural, =1{{position} star}other{{position} stars}}", - "@starRating": { - "description": "Accessibility label for the 1 stars to 5 stars rating", - "type": "text", - "placeholders_order": [ - "position" - ], - "placeholders": { - "position": { - "example": 1 - } - } - }, - "Student Pairing": "Student Pairing", - "@Student Pairing": { - "description": "Title for the screen where users can pair to students using a QR code", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Open Canvas Student": "Open Canvas Student", - "@Open Canvas Student": { - "description": "Title for QR pairing tutorial screen instructing users to open the Canvas Student app", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You'll need to open your student's Canvas Student app to continue. Go into Main Menu > Settings > Pair with Observer and scan the QR code you see there.": "You'll need to open your student's Canvas Student app to continue. Go into Main Menu > Settings > Pair with Observer and scan the QR code you see there.", - "@You'll need to open your student's Canvas Student app to continue. Go into Main Menu > Settings > Pair with Observer and scan the QR code you see there.": { - "description": "Message explaining how QR code pairing works", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Screenshot showing location of pairing QR code generation in the Canvas Student app": "Screenshot showing location of pairing QR code generation in the Canvas Student app", - "@Screenshot showing location of pairing QR code generation in the Canvas Student app": { - "description": "Content Description for qr pairing tutorial screenshot", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Expired QR Code": "Expired QR Code", - "@Expired QR Code": { - "description": "Error title shown when the users scans a QR code that has expired", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The QR code you scanned may have expired. Refresh the code on the student's device and try again.": "The QR code you scanned may have expired. Refresh the code on the student's device and try again.", - "@The QR code you scanned may have expired. Refresh the code on the student's device and try again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "A network error occurred when adding this student. Check your connection and try again.": "A network error occurred when adding this student. Check your connection and try again.", - "@A network error occurred when adding this student. Check your connection and try again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Invalid QR Code": "Invalid QR Code", - "@Invalid QR Code": { - "description": "Error title shown when the user scans an invalid QR code", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Incorrect Domain": "Incorrect Domain", - "@Incorrect Domain": { - "description": "Error title shown when the users scane a QR code for a student that belongs to a different domain", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The student you are trying to add belongs to a different school. Log in or create an account with that school to scan this code.": "The student you are trying to add belongs to a different school. Log in or create an account with that school to scan this code.", - "@The student you are trying to add belongs to a different school. Log in or create an account with that school to scan this code.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Camera Permission": "Camera Permission", - "@Camera Permission": { - "description": "Error title shown when the user wans to scan a QR code but has denied the camera permission", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "This will unpair and remove all enrollments for this student from your account.": "This will unpair and remove all enrollments for this student from your account.", - "@This will unpair and remove all enrollments for this student from your account.": { - "description": "Confirmation message shown when the user tries to delete a student from their account", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was a problem removing this student from your account. Please check your connection and try again.": "There was a problem removing this student from your account. Please check your connection and try again.", - "@There was a problem removing this student from your account. Please check your connection and try again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Cancel": "Cancel", - "@Cancel": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "next": "Next", - "@next": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "ok": "OK", - "@ok": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Yes": "Yes", - "@Yes": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No": "No", - "@No": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Retry": "Retry", - "@Retry": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Delete": "Delete", - "@Delete": { - "description": "Label used for general delete/remove actions", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Done": "Done", - "@Done": { - "description": "Label for general done/finished actions", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Refresh": "Refresh", - "@Refresh": { - "description": "Label for button to refresh data from the web", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "View Description": "View Description", - "@View Description": { - "description": "Button to view the description for an event or assignment", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "expanded": "expanded", - "@expanded": { - "description": "Description for the accessibility reader for list groups that are expanded", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "collapsed": "collapsed", - "@collapsed": { - "description": "Description for the accessibility reader for list groups that are expanded", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "An unexpected error occurred": "An unexpected error occurred", - "@An unexpected error occurred": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No description": "No description", - "@No description": { - "description": "Message used when the assignment has no description", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Launch External Tool": "Launch External Tool", - "@Launch External Tool": { - "description": "Button text added to webviews to let users open external tools in their browser", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Interactions on this page are limited by your institution.": "Interactions on this page are limited by your institution.", - "@Interactions on this page are limited by your institution.": { - "description": "Message describing how the webview has limited access due to an instution setting", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "dateAtTime": "{date} at {time}", - "@dateAtTime": { - "description": "The string to format dates", - "type": "text", - "placeholders_order": [ - "date", - "time" - ], - "placeholders": { - "date": {}, - "time": {} - } - }, - "dueDateAtTime": "Due {date} at {time}", - "@dueDateAtTime": { - "description": "The string to format due dates", - "type": "text", - "placeholders_order": [ - "date", - "time" - ], - "placeholders": { - "date": {}, - "time": {} - } - }, - "No Due Date": "No Due Date", - "@No Due Date": { - "description": "Label for assignments that do not have a due date", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Filter": "Filter", - "@Filter": { - "description": "Label for buttons to filter what items are visible", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "unread": "unread", - "@unread": { - "description": "Label for things that are marked as unread", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "unreadCount": "{count} unread", - "@unreadCount": { - "description": "Formatted string for when there are a number of unread items", - "type": "text", - "placeholders_order": [ - "count" - ], - "placeholders": { - "count": {} - } - }, - "badgeNumberPlus": "{count}+", - "@badgeNumberPlus": { - "description": "Formatted string for when too many items are being notified in a badge, generally something like: 99+", - "type": "text", - "placeholders_order": [ - "count" - ], - "placeholders": { - "count": {} - } - }, - "There was an error loading this announcement": "There was an error loading this announcement", - "@There was an error loading this announcement": { - "description": "Message shown when an announcement detail screen fails to load", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Network error": "Network error", - "@Network error": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Under Construction": "Under Construction", - "@Under Construction": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "We are currently building this feature for your viewing pleasure.": "We are currently building this feature for your viewing pleasure.", - "@We are currently building this feature for your viewing pleasure.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Request Login Help Button": "Request Login Help Button", - "@Request Login Help Button": { - "description": "Accessibility hint for button that opens help dialog for a login help request", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Request Login Help": "Request Login Help", - "@Request Login Help": { - "description": "Title of help dialog for a login help request", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I'm having trouble logging in": "I'm having trouble logging in", - "@I'm having trouble logging in": { - "description": "Subject of help dialog for a login help request", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "An error occurred when trying to display this link": "An error occurred when trying to display this link", - "@An error occurred when trying to display this link": { - "description": "Error message shown when a link can't be opened", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "We are unable to display this link, it may belong to an institution you currently aren't logged in to.": "We are unable to display this link, it may belong to an institution you currently aren't logged in to.", - "@We are unable to display this link, it may belong to an institution you currently aren't logged in to.": { - "description": "Description for error page shown when clicking a link", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Link Error": "Link Error", - "@Link Error": { - "description": "Title for error page shown when clicking a link", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Open In Browser": "Open In Browser", - "@Open In Browser": { - "description": "Text for button to open a link in the browswer", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You'll find the QR code on the web in your account profile. Click 'QR for Mobile Login' in the list.": "You'll find the QR code on the web in your account profile. Click 'QR for Mobile Login' in the list.", - "@You'll find the QR code on the web in your account profile. Click 'QR for Mobile Login' in the list.": { - "description": "Text for qr login tutorial screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Locate QR Code": "Locate QR Code", - "@Locate QR Code": { - "description": "Text for qr login button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Please scan a QR code generated by Canvas": "Please scan a QR code generated by Canvas", - "@Please scan a QR code generated by Canvas": { - "description": "Text for qr login error with incorrect qr code", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error logging in. Please generate another QR Code and try again.": "There was an error logging in. Please generate another QR Code and try again.", - "@There was an error logging in. Please generate another QR Code and try again.": { - "description": "Text for qr login error", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Screenshot showing location of QR code generation in browser": "Screenshot showing location of QR code generation in browser", - "@Screenshot showing location of QR code generation in browser": { - "description": "Content Description for qr login tutorial screenshot", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "QR scanning requires camera access": "QR scanning requires camera access", - "@QR scanning requires camera access": { - "description": "placeholder for camera error for QR code scan", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The linked item is no longer available": "The linked item is no longer available", - "@The linked item is no longer available": { - "description": "error message when the alert could no be opened", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Message sent": "Message sent", - "@Message sent": { - "description": "confirmation message on the screen when the user succesfully sends a message", - "type": "text", - "placeholders_order": [], - "placeholders": {} - } -} \ No newline at end of file diff --git a/apps/flutter_parent/lib/l10n/res/intl_en_CY.arb b/apps/flutter_parent/lib/l10n/res/intl_en_CY.arb deleted file mode 100644 index 3fa7227f2d..0000000000 --- a/apps/flutter_parent/lib/l10n/res/intl_en_CY.arb +++ /dev/null @@ -1,2753 +0,0 @@ -{ - "@@last_modified": "2023-08-25T11:04:20.901151", - "alertsLabel": "Alerts", - "@alertsLabel": { - "description": "The label for the Alerts tab", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "calendarLabel": "Calendar", - "@calendarLabel": { - "description": "The label for the Calendar tab", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "coursesLabel": "Modules", - "@coursesLabel": { - "description": "The label for the Courses tab", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Students": "No Students", - "@No Students": { - "description": "Text for when an observer has no students they are observing", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Tap to show student selector": "Tap to show student selector", - "@Tap to show student selector": { - "description": "Semantics label for the area that will show the student selector when tapped", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Tap to pair with a new student": "Tap to pair with a new student", - "@Tap to pair with a new student": { - "description": "Semantics label for the add student button in the student selector", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Tap to select this student": "Tap to select this student", - "@Tap to select this student": { - "description": "Semantics label on individual students in the student switcher", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Manage Students": "Manage Students", - "@Manage Students": { - "description": "Label text for the Manage Students nav drawer button as well as the title for the Manage Students screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Help": "Help", - "@Help": { - "description": "Label text for the help nav drawer button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Log Out": "Log out", - "@Log Out": { - "description": "Label text for the Log Out nav drawer button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Switch Users": "Switch Users", - "@Switch Users": { - "description": "Label text for the Switch Users nav drawer button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "appVersion": "v. {version}", - "@appVersion": { - "description": "App version shown in the navigation drawer", - "type": "text", - "placeholders_order": [ - "version" - ], - "placeholders": { - "version": {} - } - }, - "Are you sure you want to log out?": "Are you sure you want to log out?", - "@Are you sure you want to log out?": { - "description": "Confirmation message displayed when the user tries to log out", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Calendars": "Calendars", - "@Calendars": { - "description": "Label for button that lets users select which calendars to display", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "nextMonth": "Next month: {month}", - "@nextMonth": { - "description": "Label for the button that switches the calendar to the next month", - "type": "text", - "placeholders_order": [ - "month" - ], - "placeholders": { - "month": {} - } - }, - "previousMonth": "Previous month: {month}", - "@previousMonth": { - "description": "Label for the button that switches the calendar to the previous month", - "type": "text", - "placeholders_order": [ - "month" - ], - "placeholders": { - "month": {} - } - }, - "nextWeek": "Next week starting {date}", - "@nextWeek": { - "description": "Label for the button that switches the calendar to the next week", - "type": "text", - "placeholders_order": [ - "date" - ], - "placeholders": { - "date": {} - } - }, - "previousWeek": "Previous week starting {date}", - "@previousWeek": { - "description": "Label for the button that switches the calendar to the previous week", - "type": "text", - "placeholders_order": [ - "date" - ], - "placeholders": { - "date": {} - } - }, - "selectedMonthLabel": "Month of {month}", - "@selectedMonthLabel": { - "description": "Accessibility label for the button that expands/collapses the month view", - "type": "text", - "placeholders_order": [ - "month" - ], - "placeholders": { - "month": {} - } - }, - "expand": "expand", - "@expand": { - "description": "Accessibility label for the on-tap hint for the button that expands/collapses the month view", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "collapse": "collapse", - "@collapse": { - "description": "Accessibility label for the on-tap hint for the button that expands/collapses the month view", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "pointsPossible": "{points} points possible", - "@pointsPossible": { - "description": "Screen reader label used for the points possible for an assignment, quiz, etc.", - "type": "text", - "placeholders_order": [ - "points" - ], - "placeholders": { - "points": {} - } - }, - "calendarDaySemanticsLabel": "{eventCount,plural, =1{{date}, {eventCount} event}other{{date}, {eventCount} events}}", - "@calendarDaySemanticsLabel": { - "description": "Screen reader label used for calendar day, reads the date and count of events", - "type": "text", - "placeholders_order": [ - "date", - "eventCount" - ], - "placeholders": { - "date": {}, - "eventCount": {} - } - }, - "No Events Today!": "No Events Today!", - "@No Events Today!": { - "description": "Title displayed when there are no calendar events for the current day", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "It looks like a great day to rest, relax, and recharge.": "It looks like a great day to rest, relax, and recharge.", - "@It looks like a great day to rest, relax, and recharge.": { - "description": "Message displayed when there are no calendar events for the current day", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading your student's calendar": "There was an error loading your student's calendar", - "@There was an error loading your student's calendar": { - "description": "Message displayed when calendar events could not be loaded for the current student", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Tap to favorite the courses you want to see on the Calendar. Select up to 10.": "Tap to favourite the modules you want to see on the Calendar. Select up to 10.", - "@Tap to favorite the courses you want to see on the Calendar. Select up to 10.": { - "description": "Description text on calendar filter screen.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You may only choose 10 calendars to display": "You may only choose 10 calendars to display", - "@You may only choose 10 calendars to display": { - "description": "Error text when trying to select more than 10 calendars", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You must select at least one calendar to display": "You must select at least one calendar to display", - "@You must select at least one calendar to display": { - "description": "Error text when trying to de-select all calendars", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Planner Note": "Planner note", - "@Planner Note": { - "description": "Label used for notes in the planner", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Go to today": "Go to today", - "@Go to today": { - "description": "Accessibility label used for the today button in the planner", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Previous Logins": "Previous logins", - "@Previous Logins": { - "description": "Label for the list of previous user logins", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "canvasLogoLabel": "Canvas logo", - "@canvasLogoLabel": { - "description": "The semantics label for the Canvas logo", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "findSchool": "Find School", - "@findSchool": { - "description": "Text for the find-my-school button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "findAnotherSchool": "Find another school", - "@findAnotherSchool": { - "description": "Text for the find-another-school button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "domainSearchInputHint": "Enter school name or district…", - "@domainSearchInputHint": { - "description": "Input hint for the text box on the domain search screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "noDomainResults": "Unable to find schools matching \"{query}\"", - "@noDomainResults": { - "description": "Message shown to users when the domain search query did not return any results", - "type": "text", - "placeholders_order": [ - "query" - ], - "placeholders": { - "query": {} - } - }, - "domainSearchHelpLabel": "How do I find my school or district?", - "@domainSearchHelpLabel": { - "description": "Label for the help button on the domain search screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "canvasGuides": "Canvas Guides", - "@canvasGuides": { - "description": "Proper name for the Canvas Guides. This will be used in the domainSearchHelpBody text and will be highlighted and clickable", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "canvasSupport": "Canvas Support", - "@canvasSupport": { - "description": "Proper name for Canvas Support. This will be used in the domainSearchHelpBody text and will be highlighted and clickable", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "domainSearchHelpBody": "Try searching for the name of the school or district you’re attempting to access, like “Smith Private School” or “Smith County Schools.” You can also enter a Canvas domain directly, like “smith.instructure.com.”\n\nFor more information on finding your institution’s Canvas account, you can visit the {canvasGuides}, reach out to {canvasSupport}, or contact your school for assistance.", - "@domainSearchHelpBody": { - "description": "The body text shown in the help dialog on the domain search screen", - "type": "text", - "placeholders_order": [ - "canvasGuides", - "canvasSupport" - ], - "placeholders": { - "canvasGuides": {}, - "canvasSupport": {} - } - }, - "Uh oh!": "Uh oh!", - "@Uh oh!": { - "description": "Title of the screen that shows when a crash has occurred", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "We’re not sure what happened, but it wasn’t good. Contact us if this keeps happening.": "We’re not sure what happened, but it wasn’t good. Contact us if this keeps happening.", - "@We’re not sure what happened, but it wasn’t good. Contact us if this keeps happening.": { - "description": "Message shown when a crash has occurred", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Contact Support": "Contact support", - "@Contact Support": { - "description": "Label for the button that allows users to contact support after a crash has occurred", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "View error details": "View error details", - "@View error details": { - "description": "Label for the button that allowed users to view crash details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Restart app": "Restart app", - "@Restart app": { - "description": "Label for the button that will restart the entire application", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Application version": "Application version", - "@Application version": { - "description": "Label for the application version displayed in the crash details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Device model": "Device model", - "@Device model": { - "description": "Label for the device model displayed in the crash details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Android OS version": "Android OS version", - "@Android OS version": { - "description": "Label for the Android operating system version displayed in the crash details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Full error message": "Full error message", - "@Full error message": { - "description": "Label for the full error message displayed in the crash details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Inbox": "Inbox", - "@Inbox": { - "description": "Title for the Inbox screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading your inbox messages.": "There was an error loading your inbox messages.", - "@There was an error loading your inbox messages.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Subject": "No Subject", - "@No Subject": { - "description": "Title used for inbox messages that have no subject", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unable to fetch courses. Please check your connection and try again.": "Unable to fetch modules. Please check your connection and try again.", - "@Unable to fetch courses. Please check your connection and try again.": { - "description": "Message shown when an error occured while loading courses", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Choose a course to message": "Choose a module to message", - "@Choose a course to message": { - "description": "Header in the course list shown when the user is choosing which course to associate with a new message", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Inbox Zero": "Inbox zero", - "@Inbox Zero": { - "description": "Title of the message shown when there are no inbox messages", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You’re all caught up!": "You’re all caught up!", - "@You’re all caught up!": { - "description": "Subtitle of the message shown when there are no inbox messages", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading recipients for this course": "There was an error loading recipients for this module", - "@There was an error loading recipients for this course": { - "description": "Message shown when attempting to create a new message but the recipients list failed to load", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unable to send message. Check your connection and try again.": "Unable to send message. Check your connection and try again.", - "@Unable to send message. Check your connection and try again.": { - "description": "Message show when there was an error creating or sending a new message", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unsaved changes": "Unsaved changes", - "@Unsaved changes": { - "description": "Title of the dialog shown when the user tries to leave with unsaved changes", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Are you sure you wish to close this page? Your unsent message will be lost.": "Are you sure you wish to close this page? Your unsent message will be lost.", - "@Are you sure you wish to close this page? Your unsent message will be lost.": { - "description": "Body text of the dialog shown when the user tries leave with unsaved changes", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "New message": "New message", - "@New message": { - "description": "Title of the new-message screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Add attachment": "Add attachment", - "@Add attachment": { - "description": "Tooltip for the add-attachment button in the new-message screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Send message": "Send message", - "@Send message": { - "description": "Tooltip for the send-message button in the new-message screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Select recipients": "Select recipients", - "@Select recipients": { - "description": "Tooltip for the button that allows users to select message recipients", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No recipients selected": "No recipients selected", - "@No recipients selected": { - "description": "Hint displayed when the user has not selected any message recipients", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Message subject": "Message subject", - "@Message subject": { - "description": "Hint text displayed in the input field for the message subject", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Message": "Message", - "@Message": { - "description": "Hint text displayed in the input field for the message body", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Recipients": "Recipients", - "@Recipients": { - "description": "Label for message recipients", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "plusRecipientCount": "+{count}", - "@plusRecipientCount": { - "description": "Shows the number of recipients that are selected but not displayed on screen.", - "type": "text", - "placeholders_order": [ - "count" - ], - "placeholders": { - "count": { - "example": 5 - } - } - }, - "Failed. Tap for options.": "Failed. Tap for options.", - "@Failed. Tap for options.": { - "description": "Short message shown on a message attachment when uploading has failed", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "courseForWhom": "for {studentShortName}", - "@courseForWhom": { - "description": "Describes for whom a course is for (i.e. for Bill)", - "type": "text", - "placeholders_order": [ - "studentShortName" - ], - "placeholders": { - "studentShortName": {} - } - }, - "messageLinkPostscript": "Regarding: {studentName}, {linkUrl}", - "@messageLinkPostscript": { - "description": "A postscript appended to new messages that clarifies which student is the subject of the message and also includes a URL for the related Canvas component (course, assignment, event, etc).", - "type": "text", - "placeholders_order": [ - "studentName", - "linkUrl" - ], - "placeholders": { - "studentName": {}, - "linkUrl": {} - } - }, - "There was an error loading this conversation": "There was an error loading this conversation", - "@There was an error loading this conversation": { - "description": "Message shown when a conversation fails to load", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Reply": "Reply", - "@Reply": { - "description": "Button label for replying to a conversation", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Reply All": "Reply All", - "@Reply All": { - "description": "Button label for replying to all conversation participants", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unknown User": "Unknown User", - "@Unknown User": { - "description": "Label used where the user name is not known", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "me": "me", - "@me": { - "description": "First-person pronoun (i.e. 'me') that will be used in message author info, e.g. 'Me to 4 others' or 'Jon Snow to me'", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "authorToRecipient": "{authorName} to {recipientName}", - "@authorToRecipient": { - "description": "Author info for a single-recipient message; includes both the author name and the recipient name.", - "type": "text", - "placeholders_order": [ - "authorName", - "recipientName" - ], - "placeholders": { - "authorName": {}, - "recipientName": {} - } - }, - "authorToNOthers": "{howMany,plural, =1{{authorName} to 1 other}other{{authorName} to {howMany} others}}", - "@authorToNOthers": { - "description": "Author info for a mutli-recipient message; includes the author name and the number of recipients", - "type": "text", - "placeholders_order": [ - "authorName", - "howMany" - ], - "placeholders": { - "authorName": {}, - "howMany": {} - } - }, - "authorToRecipientAndNOthers": "{howMany,plural, =1{{authorName} to {recipientName} & 1 other}other{{authorName} to {recipientName} & {howMany} others}}", - "@authorToRecipientAndNOthers": { - "description": "Author info for a multi-recipient message; includes the author name, one recipient name, and the number of other recipients", - "type": "text", - "placeholders_order": [ - "authorName", - "recipientName", - "howMany" - ], - "placeholders": { - "authorName": {}, - "recipientName": {}, - "howMany": {} - } - }, - "Download": "Download", - "@Download": { - "description": "Label for the button that will begin downloading a file", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Open with another app": "Open with another app", - "@Open with another app": { - "description": "Label for the button that will allow users to open a file with another app", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There are no installed applications that can open this file": "There are no installed applications that can open this file", - "@There are no installed applications that can open this file": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unsupported File": "Unsupported File", - "@Unsupported File": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "This file is unsupported and can’t be viewed through the app": "This file is unsupported and can’t be viewed through the app", - "@This file is unsupported and can’t be viewed through the app": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unable to play this media file": "Unable to play this media file", - "@Unable to play this media file": { - "description": "Message shown when audio or video media could not be played", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unable to load this image": "Unable to load this image", - "@Unable to load this image": { - "description": "Message shown when an image file could not be loaded or displayed", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading this file": "There was an error loading this file", - "@There was an error loading this file": { - "description": "Message shown when a file could not be loaded or displayed", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Courses": "No Modules", - "@No Courses": { - "description": "Title for having no courses", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Your student’s courses might not be published yet.": "Your student’s modules might not be published yet.", - "@Your student’s courses might not be published yet.": { - "description": "Message for having no courses", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading your student’s courses.": "There was an error loading your student’s modules.", - "@There was an error loading your student’s courses.": { - "description": "Message displayed when the list of student courses could not be loaded", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Grade": "No Mark", - "@No Grade": { - "description": "Message shown when there is currently no grade available for a course", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Filter by": "Filter by", - "@Filter by": { - "description": "Title for list of terms to filter grades by", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Grades": "Grades", - "@Grades": { - "description": "Label for the \"Grades\" tab in course details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Syllabus": "Syllabus", - "@Syllabus": { - "description": "Label for the \"Syllabus\" tab in course details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Front Page": "Front page", - "@Front Page": { - "description": "Label for the \"Front Page\" tab in course details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Summary": "Summary", - "@Summary": { - "description": "Label for the \"Summary\" tab in course details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Send a message about this course": "Send a message about this module", - "@Send a message about this course": { - "description": "Accessibility hint for the course messaage floating action button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Total Grade": "Total Mark", - "@Total Grade": { - "description": "Label for the total grade in the course", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Graded": "Graded", - "@Graded": { - "description": "Label for assignments that have been graded", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Submitted": "Submitted", - "@Submitted": { - "description": "Label for assignments that have been submitted", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Not Submitted": "Not Submitted", - "@Not Submitted": { - "description": "Label for assignments that have not been submitted", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Late": "Late", - "@Late": { - "description": "Label for assignments that have been marked late or submitted late", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Missing": "Missing", - "@Missing": { - "description": "Label for assignments that have been marked missing or are not submitted and past the due date", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "-": "-", - "@-": { - "description": "Value representing no score for student submission", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "All Grading Periods": "All Grading Periods", - "@All Grading Periods": { - "description": "Label for selecting all grading periods", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Assignments": "No Assignments", - "@No Assignments": { - "description": "Title for the no assignments message", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "It looks like assignments haven't been created in this space yet.": "It looks like assignments haven't been created in this space yet.", - "@It looks like assignments haven't been created in this space yet.": { - "description": "Message for no assignments", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading the summary details for this course.": "There was an error loading the summary details for this module.", - "@There was an error loading the summary details for this course.": { - "description": "Message shown when the course summary could not be loaded", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Summary": "No Summary", - "@No Summary": { - "description": "Title displayed when there are no items in the course summary", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "This course does not have any assignments or calendar events yet.": "This module does not have any assignments or calendar events yet.", - "@This course does not have any assignments or calendar events yet.": { - "description": "Message displayed when there are no items in the course summary", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "gradeFormatScoreOutOfPointsPossible": "{score} / {pointsPossible}", - "@gradeFormatScoreOutOfPointsPossible": { - "description": "Formatted string for a student score out of the points possible", - "type": "text", - "placeholders_order": [ - "score", - "pointsPossible" - ], - "placeholders": { - "score": {}, - "pointsPossible": {} - } - }, - "contentDescriptionScoreOutOfPointsPossible": "{score} out of {pointsPossible} points", - "@contentDescriptionScoreOutOfPointsPossible": { - "description": "Formatted string for a student score out of the points possible", - "type": "text", - "placeholders_order": [ - "score", - "pointsPossible" - ], - "placeholders": { - "score": {}, - "pointsPossible": {} - } - }, - "gradesSubjectMessage": "Regarding: {studentName}, Grades", - "@gradesSubjectMessage": { - "description": "The subject line for a message to a teacher regarding a student's grades", - "type": "text", - "placeholders_order": [ - "studentName" - ], - "placeholders": { - "studentName": {} - } - }, - "syllabusSubjectMessage": "Regarding: {studentName}, Syllabus", - "@syllabusSubjectMessage": { - "description": "The subject line for a message to a teacher regarding a course syllabus", - "type": "text", - "placeholders_order": [ - "studentName" - ], - "placeholders": { - "studentName": {} - } - }, - "frontPageSubjectMessage": "Regarding: {studentName}, Front Page", - "@frontPageSubjectMessage": { - "description": "The subject line for a message to a teacher regarding a course front page", - "type": "text", - "placeholders_order": [ - "studentName" - ], - "placeholders": { - "studentName": {} - } - }, - "assignmentSubjectMessage": "Regarding: {studentName}, Assignment - {assignmentName}", - "@assignmentSubjectMessage": { - "description": "The subject line for a message to a teacher regarding a student's assignment", - "type": "text", - "placeholders_order": [ - "studentName", - "assignmentName" - ], - "placeholders": { - "studentName": {}, - "assignmentName": {} - } - }, - "eventSubjectMessage": "Regarding: {studentName}, Event - {eventTitle}", - "@eventSubjectMessage": { - "description": "The subject line for a message to a teacher regarding a calendar event", - "type": "text", - "placeholders_order": [ - "studentName", - "eventTitle" - ], - "placeholders": { - "studentName": {}, - "eventTitle": {} - } - }, - "There is no page information available.": "There is no page information available.", - "@There is no page information available.": { - "description": "Description for when no page information is available", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Assignment Details": "Assignment details", - "@Assignment Details": { - "description": "Title for the page that shows details for an assignment", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "assignmentTotalPoints": "{points} pts", - "@assignmentTotalPoints": { - "description": "Label used for the total points the assignment is worth", - "type": "text", - "placeholders_order": [ - "points" - ], - "placeholders": { - "points": {} - } - }, - "assignmentTotalPointsAccessible": "{points} points", - "@assignmentTotalPointsAccessible": { - "description": "Screen reader label used for the total points the assignment is worth", - "type": "text", - "placeholders_order": [ - "points" - ], - "placeholders": { - "points": {} - } - }, - "Due": "Due", - "@Due": { - "description": "Label for an assignment due date", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Grade": "Grade", - "@Grade": { - "description": "Label for the section that displays an assignment's grade", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Locked": "Locked", - "@Locked": { - "description": "Label for when an assignment is locked", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "assignmentLockedModule": "This assignment is locked by the unit \"{moduleName}\".", - "@assignmentLockedModule": { - "description": "The locked description when an assignment is locked by a module", - "type": "text", - "placeholders_order": [ - "moduleName" - ], - "placeholders": { - "moduleName": {} - } - }, - "Remind Me": "Remind Me", - "@Remind Me": { - "description": "Label for the row to set reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Set a date and time to be notified of this specific assignment.": "Set a date and time to be notified of this specific assignment.", - "@Set a date and time to be notified of this specific assignment.": { - "description": "Description for row to set reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You will be notified about this assignment on…": "You will be notified about this assignment on…", - "@You will be notified about this assignment on…": { - "description": "Description for when a reminder is set", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Instructions": "Instructions", - "@Instructions": { - "description": "Label for the description of the assignment when it has quiz instructions", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Send a message about this assignment": "Send a message about this assignment", - "@Send a message about this assignment": { - "description": "Accessibility hint for the assignment messaage floating action button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "This app is not authorized for use.": "This app is not authorised for use.", - "@This app is not authorized for use.": { - "description": "The error shown when the app being used is not verified by Canvas", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The server you entered is not authorized for this app.": "The server you entered is not authorised for this app.", - "@The server you entered is not authorized for this app.": { - "description": "The error shown when the desired login domain is not verified by Canvas", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The user agent for this app is not authorized.": "The user agent for this app is not authorised.", - "@The user agent for this app is not authorized.": { - "description": "The error shown when the user agent during verification is not verified by Canvas", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "We were unable to verify the server for use with this app.": "We were unable to verify the server for use with this app.", - "@We were unable to verify the server for use with this app.": { - "description": "The generic error shown when we are unable to verify with Canvas", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Reminders": "Reminders", - "@Reminders": { - "description": "Name of the system notification channel for assignment and event reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Notifications for reminders about assignments and calendar events": "Notifications for reminders about assignments and calendar events", - "@Notifications for reminders about assignments and calendar events": { - "description": "Description of the system notification channel for assignment and event reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Reminders have changed!": "Reminders have changed!", - "@Reminders have changed!": { - "description": "Title of the dialog shown when the user needs to update their reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "In order to provide you with a better experience, we have updated how reminders work. You can add new reminders by viewing an assignment or calendar event and tapping the switch under the \"Remind Me\" section.\n\nBe aware that any reminders created with older versions of this app will not be compatible with the new changes and you will need to create them again.": "In order to provide you with a better experience, we have updated how reminders work. You can add new reminders by viewing an assignment or calendar event and tapping the switch under the \"Remind Me\" section.\n\nBe aware that any reminders created with older versions of this app will not be compatible with the new changes and you will need to create them again.", - "@In order to provide you with a better experience, we have updated how reminders work. You can add new reminders by viewing an assignment or calendar event and tapping the switch under the \"Remind Me\" section.\n\nBe aware that any reminders created with older versions of this app will not be compatible with the new changes and you will need to create them again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Not a parent?": "Not a parent?", - "@Not a parent?": { - "description": "Title for the screen that shows when the user is not observing any students", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "We couldn't find any students associated with this account": "We couldn't find any students associated with this account", - "@We couldn't find any students associated with this account": { - "description": "Subtitle for the screen that shows when the user is not observing any students", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Are you a student or teacher?": "Are you a student or teacher?", - "@Are you a student or teacher?": { - "description": "Label for button that will show users the option to view other Canvas apps in the Play Store", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "One of our other apps might be a better fit. Tap one to visit the Play Store.": "One of our other apps may be a better fit. Tap one to visit the Play Store.", - "@One of our other apps might be a better fit. Tap one to visit the Play Store.": { - "description": "Description of options to view other Canvas apps in the Play Store", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Return to Login": "Return to login", - "@Return to Login": { - "description": "Label for the button that returns the user to the login screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "STUDENT": "STUDENT", - "@STUDENT": { - "description": "The \"student\" portion of the \"Canvas Student\" app name, in all caps. \"Canvas\" is excluded in this context as it will be displayed to the user as a wordmark image", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "TEACHER": "TEACHER", - "@TEACHER": { - "description": "The \"teacher\" portion of the \"Canvas Teacher\" app name, in all caps. \"Canvas\" is excluded in this context as it will be displayed to the user as a wordmark image", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Canvas Student": "Canvas student", - "@Canvas Student": { - "description": "The name of the Canvas Student app. Only \"Student\" should be translated as \"Canvas\" is a brand name in this context and should not be translated.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Canvas Teacher": "Canvas teacher", - "@Canvas Teacher": { - "description": "The name of the Canvas Teacher app. Only \"Teacher\" should be translated as \"Canvas\" is a brand name in this context and should not be translated.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Alerts": "No Alerts", - "@No Alerts": { - "description": "The title for the empty message to show to users when there are no alerts for the student.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There’s nothing to be notified of yet.": "There’s nothing to be notified of yet.", - "@There’s nothing to be notified of yet.": { - "description": "The empty message to show to users when there are no alerts for the student.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "dismissAlertLabel": "Dismiss {alertTitle}", - "@dismissAlertLabel": { - "description": "Accessibility label to dismiss an alert", - "type": "text", - "placeholders_order": [ - "alertTitle" - ], - "placeholders": { - "alertTitle": {} - } - }, - "Course Announcement": "Module announcement", - "@Course Announcement": { - "description": "Title for alerts when there is a course announcement", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Institution Announcement": "Institution announcement", - "@Institution Announcement": { - "description": "Title for alerts when there is an institution announcement", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "assignmentGradeAboveThreshold": "Assignment Grade Above {threshold}", - "@assignmentGradeAboveThreshold": { - "description": "Title for alerts when an assignment grade is above the threshold value", - "type": "text", - "placeholders_order": [ - "threshold" - ], - "placeholders": { - "threshold": {} - } - }, - "assignmentGradeBelowThreshold": "Assignment Grade Below {threshold}", - "@assignmentGradeBelowThreshold": { - "description": "Title for alerts when an assignment grade is below the threshold value", - "type": "text", - "placeholders_order": [ - "threshold" - ], - "placeholders": { - "threshold": {} - } - }, - "courseGradeAboveThreshold": "Module Grade Above {threshold}", - "@courseGradeAboveThreshold": { - "description": "Title for alerts when a course grade is above the threshold value", - "type": "text", - "placeholders_order": [ - "threshold" - ], - "placeholders": { - "threshold": {} - } - }, - "courseGradeBelowThreshold": "Module Grade Below {threshold}", - "@courseGradeBelowThreshold": { - "description": "Title for alerts when a course grade is below the threshold value", - "type": "text", - "placeholders_order": [ - "threshold" - ], - "placeholders": { - "threshold": {} - } - }, - "Settings": "Settings", - "@Settings": { - "description": "Title for the settings screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Theme": "Theme", - "@Theme": { - "description": "Label for the light/dark theme section in the settings page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Dark Mode": "Dark Mode", - "@Dark Mode": { - "description": "Label for the button that enables dark mode", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Light Mode": "Light Mode", - "@Light Mode": { - "description": "Label for the button that enables light mode", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "High Contrast Mode": "High Contrast Mode", - "@High Contrast Mode": { - "description": "Label for the switch that toggles high contrast mode", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Use Dark Theme in Web Content": "Use Dark Theme in Web Content", - "@Use Dark Theme in Web Content": { - "description": "Label for the switch that toggles dark mode for webviews", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Appearance": "Appearance", - "@Appearance": { - "description": "Label for the appearance section in the settings page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Successfully submitted!": "Successfully submitted!", - "@Successfully submitted!": { - "description": "Title displayed in the grade cell for an assignment that has been submitted", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "submissionStatusSuccessSubtitle": "This assignment was submitted on {date} at {time} and is waiting to be graded", - "@submissionStatusSuccessSubtitle": { - "description": "Subtitle displayed in the grade cell for an assignment that has been submitted and is awaiting a grade", - "type": "text", - "placeholders_order": [ - "date", - "time" - ], - "placeholders": { - "date": {}, - "time": {} - } - }, - "outOfPoints": "{howMany,plural, =1{Out of 1 point}other{Out of {points} points}}", - "@outOfPoints": { - "description": "Description for an assignment grade that has points without a current scoroe", - "type": "text", - "placeholders_order": [ - "points", - "howMany" - ], - "placeholders": { - "points": {}, - "howMany": {} - } - }, - "Excused": "Excused", - "@Excused": { - "description": "Grading status for an assignment marked as excused", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Complete": "Complete", - "@Complete": { - "description": "Grading status for an assignment marked as complete", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Incomplete": "Incomplete", - "@Incomplete": { - "description": "Grading status for an assignment marked as incomplete", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "minus": "minus", - "@minus": { - "description": "Screen reader-friendly replacement for the \"-\" character in letter grades like \"A-\"", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "latePenalty": "Late penalty (-{pointsLost})", - "@latePenalty": { - "description": "Text displayed when a late penalty has been applied to the assignment", - "type": "text", - "placeholders_order": [ - "pointsLost" - ], - "placeholders": { - "pointsLost": {} - } - }, - "finalGrade": "Final grade: {grade}", - "@finalGrade": { - "description": "Text that displays the final grade of an assignment", - "type": "text", - "placeholders_order": [ - "grade" - ], - "placeholders": { - "grade": {} - } - }, - "Alert Settings": "Alert Settings", - "@Alert Settings": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Alert me when…": "Alert me when…", - "@Alert me when…": { - "description": "Header for the screen where the observer chooses the thresholds that will determine when they receive alerts (e.g. when an assignment is graded below 70%)", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Course grade below": "Module mark below", - "@Course grade below": { - "description": "Label describing the threshold for when the course grade is below a certain percentage", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Course grade above": "Module mark above", - "@Course grade above": { - "description": "Label describing the threshold for when the course grade is above a certain percentage", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Assignment missing": "Assignment missing", - "@Assignment missing": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Assignment grade below": "Assignment mark below", - "@Assignment grade below": { - "description": "Label describing the threshold for when an assignment is graded below a certain percentage", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Assignment grade above": "Assignment mark above", - "@Assignment grade above": { - "description": "Label describing the threshold for when an assignment is graded above a certain percentage", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Course Announcements": "Module announcements", - "@Course Announcements": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Institution Announcements": "Institution announcements", - "@Institution Announcements": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Never": "Never", - "@Never": { - "description": "Indication that tells the user they will not receive alert notifications of a specific kind", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Grade percentage": "Grade percentage", - "@Grade percentage": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading your student's alerts.": "There was an error loading your student's alerts.", - "@There was an error loading your student's alerts.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Must be below 100": "Must be below 100", - "@Must be below 100": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "mustBeBelowN": "Must be below {percentage}", - "@mustBeBelowN": { - "description": "Validation error to the user that they must choose a percentage below 'n'", - "type": "text", - "placeholders_order": [ - "percentage" - ], - "placeholders": { - "percentage": { - "example": 5 - } - } - }, - "mustBeAboveN": "Must be above {percentage}", - "@mustBeAboveN": { - "description": "Validation error to the user that they must choose a percentage above 'n'", - "type": "text", - "placeholders_order": [ - "percentage" - ], - "placeholders": { - "percentage": { - "example": 5 - } - } - }, - "Select Student Color": "Select Student Colour", - "@Select Student Color": { - "description": "Title for screen that allows users to assign a color to a specific student", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Electric, blue": "Electric, blue", - "@Electric, blue": { - "description": "Name of the Electric (blue) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Plum, Purple": "Plum, Purple", - "@Plum, Purple": { - "description": "Name of the Plum (purple) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Barney, Fuschia": "Barney, Fuchsia", - "@Barney, Fuschia": { - "description": "Name of the Barney (fuschia) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Raspberry, Red": "Raspberry, Red", - "@Raspberry, Red": { - "description": "Name of the Raspberry (red) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Fire, Orange": "Fire, Orange", - "@Fire, Orange": { - "description": "Name of the Fire (orange) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Shamrock, Green": "Shamrock, Green", - "@Shamrock, Green": { - "description": "Name of the Shamrock (green) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "An error occurred while saving your selection. Please try again.": "An error occurred while saving your selection. Please try again.", - "@An error occurred while saving your selection. Please try again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "changeStudentColorLabel": "Change colour for {studentName}", - "@changeStudentColorLabel": { - "description": "Accessibility label for the button that lets users change the color associated with a specific student", - "type": "text", - "placeholders_order": [ - "studentName" - ], - "placeholders": { - "studentName": {} - } - }, - "Teacher": "Teacher", - "@Teacher": { - "description": "Label for the Teacher enrollment type", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Student": "Student", - "@Student": { - "description": "Label for the Student enrollment type", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "TA": "TA", - "@TA": { - "description": "Label for the Teaching Assistant enrollment type (also known as Teacher Aid or Education Assistant), reduced to a short acronym/initialism if appropriate.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Observer": "Observer", - "@Observer": { - "description": "Label for the Observer enrollment type", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Use Camera": "Use Camera", - "@Use Camera": { - "description": "Label for the action item that lets the user capture a photo using the device camera", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Upload File": "Upload file", - "@Upload File": { - "description": "Label for the action item that lets the user upload a file from their device", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Choose from Gallery": "Choose from Gallery", - "@Choose from Gallery": { - "description": "Label for the action item that lets the user select a photo from their device gallery", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Preparing…": "Preparing…", - "@Preparing…": { - "description": "Message shown while a file is being prepared to attach to a message", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Add student with…": "Add student with…", - "@Add student with…": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Add Student": "Add Student", - "@Add Student": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You are not observing any students.": "You are not observing any students.", - "@You are not observing any students.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading your students.": "There was an error loading your students.", - "@There was an error loading your students.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Pairing Code": "Pairing Code", - "@Pairing Code": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Students can obtain a pairing code through the Canvas website": "Students can obtain a pairing code through the Canvas website", - "@Students can obtain a pairing code through the Canvas website": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Enter the student pairing code provided to you. If the pairing code doesn't work, it may have expired": "Enter the student pairing code provided to you. If the pairing code doesn't work, it may have expired", - "@Enter the student pairing code provided to you. If the pairing code doesn't work, it may have expired": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Your code is incorrect or expired.": "Your code is incorrect or expired.", - "@Your code is incorrect or expired.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Something went wrong trying to create your account, please reach out to your school for assistance.": "Something went wrong trying to create your account, please reach out to your school for assistance.", - "@Something went wrong trying to create your account, please reach out to your school for assistance.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "QR Code": "QR Code", - "@QR Code": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Students can create a QR code using the Canvas Student app on their mobile device": "Students can create a QR code using the Canvas Student app on their mobile device", - "@Students can create a QR code using the Canvas Student app on their mobile device": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Add new student": "Add new student", - "@Add new student": { - "description": "Semantics label for the FAB on the Manage Students Screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Select": "Select", - "@Select": { - "description": "Hint text to tell the user to choose one of two options", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I have a Canvas account": "I have a Canvas account", - "@I have a Canvas account": { - "description": "Option to select for users that have a canvas account", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I don't have a Canvas account": "I don't have a Canvas account", - "@I don't have a Canvas account": { - "description": "Option to select for users that don't have a canvas account", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Create Account": "Create account", - "@Create Account": { - "description": "Button text for account creation confirmation", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Full Name": "Full Name", - "@Full Name": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Email Address": "Email Address", - "@Email Address": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Password": "Password", - "@Password": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Full Name…": "Full Name…", - "@Full Name…": { - "description": "hint label for inside form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Email…": "Email…", - "@Email…": { - "description": "hint label for inside form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Password…": "Password…", - "@Password…": { - "description": "hint label for inside form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Please enter full name": "Please enter full name", - "@Please enter full name": { - "description": "Error message for form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Please enter an email address": "Please enter an email address", - "@Please enter an email address": { - "description": "Error message for form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Please enter a valid email address": "Please enter a valid email address", - "@Please enter a valid email address": { - "description": "Error message for form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Password is required": "Password is required", - "@Password is required": { - "description": "Error message for form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Password must contain at least 8 characters": "Password must contain at least 8 characters", - "@Password must contain at least 8 characters": { - "description": "Error message for form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "qrCreateAccountTos": "By tapping 'Create Account', you agree to the {termsOfService} and acknowledge the {privacyPolicy}", - "@qrCreateAccountTos": { - "description": "The text show on the account creation screen", - "type": "text", - "placeholders_order": [ - "termsOfService", - "privacyPolicy" - ], - "placeholders": { - "termsOfService": {}, - "privacyPolicy": {} - } - }, - "Terms of Service": "Terms of Service", - "@Terms of Service": { - "description": "Label for the Canvas Terms of Service agreement. This will be used in the qrCreateAccountTos text and will be highlighted and clickable", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Privacy Policy": "Privacy Policy", - "@Privacy Policy": { - "description": "Label for the Canvas Privacy Policy agreement. This will be used in the qrCreateAccountTos text and will be highlighted and clickable", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "View the Privacy Policy": "View the Privacy Policy", - "@View the Privacy Policy": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Already have an account? ": "Already have an account? ", - "@Already have an account? ": { - "description": "Part of multiline text span, includes AccountSignIn1-2, in that order", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Sign In": "Sign In", - "@Sign In": { - "description": "Part of multiline text span, includes AccountSignIn1-2, in that order", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Hide Password": "Hide Password", - "@Hide Password": { - "description": "content description for password hide button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Show Password": "Show Password", - "@Show Password": { - "description": "content description for password show button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Terms of Service Link": "Terms of Service Link", - "@Terms of Service Link": { - "description": "content description for terms of service link", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Privacy Policy Link": "Privacy Policy Link", - "@Privacy Policy Link": { - "description": "content description for privacy policy link", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Event": "Event", - "@Event": { - "description": "Title for the event details screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Date": "Date", - "@Date": { - "description": "Label for the event date", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Location": "Location", - "@Location": { - "description": "Label for the location information", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Location Specified": "No Location Specified", - "@No Location Specified": { - "description": "Description for events that do not have a location", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "eventTime": "{startAt} - {endAt}", - "@eventTime": { - "description": "The time the event is happening, example: \"2:00 pm - 4:00 pm\"", - "type": "text", - "placeholders_order": [ - "startAt", - "endAt" - ], - "placeholders": { - "startAt": {}, - "endAt": {} - } - }, - "Set a date and time to be notified of this event.": "Set a date and time to be notified of this event.", - "@Set a date and time to be notified of this event.": { - "description": "Description for row to set event reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You will be notified about this event on…": "You will be notified about this event on…", - "@You will be notified about this event on…": { - "description": "Description for when an event reminder is set", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Share Your Love for the App": "Share your love for the app", - "@Share Your Love for the App": { - "description": "Label for option to open the app store", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Tell us about your favorite parts of the app": "Tell us about your favourite parts of the app", - "@Tell us about your favorite parts of the app": { - "description": "Description for option to open the app store", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Legal": "Legal", - "@Legal": { - "description": "Label for legal information option", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Privacy policy, terms of use, open source": "Privacy policy, terms of use, open source", - "@Privacy policy, terms of use, open source": { - "description": "Description for legal information option", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Idea for Canvas Parent App [Android]": "Idea for Canvas Parent App [Android]", - "@Idea for Canvas Parent App [Android]": { - "description": "The subject for the email to request a feature", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The following information will help us better understand your idea:": "The following information will help us better understand your idea:", - "@The following information will help us better understand your idea:": { - "description": "The header for the users information that is attached to a feature request", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Domain:": "Domain:", - "@Domain:": { - "description": "The label for the Canvas domain of the logged in user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "User ID:": "User ID", - "@User ID:": { - "description": "The label for the Canvas user ID of the logged in user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Email:": "Email:", - "@Email:": { - "description": "The label for the eamil of the logged in user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Locale:": "Locale:", - "@Locale:": { - "description": "The label for the locale of the logged in user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Terms of Use": "Terms of Use", - "@Terms of Use": { - "description": "Label for the terms of use", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Canvas on GitHub": "Canvas on GitHub", - "@Canvas on GitHub": { - "description": "Label for the button that opens the Canvas project on GitHub's website", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was a problem loading the Terms of Use": "There was a problem loading the Terms of Use", - "@There was a problem loading the Terms of Use": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Device": "Device", - "@Device": { - "description": "Label used for device manufacturer/model in the error report", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "OS Version": "OS version", - "@OS Version": { - "description": "Label used for device operating system version in the error report", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Version Number": "Version number", - "@Version Number": { - "description": "Label used for the app version number in the error report", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Report A Problem": "Report a problem", - "@Report A Problem": { - "description": "Title used for generic dialog to report problems", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Subject": "Subject", - "@Subject": { - "description": "Label used for Subject text field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "A subject is required.": "A subject is required.", - "@A subject is required.": { - "description": "Error shown when the subject field is empty", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "An email address is required.": "An email address is required.", - "@An email address is required.": { - "description": "Error shown when the email field is empty", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Description": "Description", - "@Description": { - "description": "Label used for Description text field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "A description is required.": "A description is required.", - "@A description is required.": { - "description": "Error shown when the description field is empty", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "How is this affecting you?": "How is this affecting you?", - "@How is this affecting you?": { - "description": "Label used for the dropdown to select how severe the issue is", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "send": "send", - "@send": { - "description": "Label used for send button when reporting a problem", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Just a casual question, comment, idea, suggestion…": "Just a casual question, comment, idea, suggestion…", - "@Just a casual question, comment, idea, suggestion…": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I need some help but it's not urgent.": "I need some help but it's not urgent.", - "@I need some help but it's not urgent.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Something's broken but I can work around it to get what I need done.": "Something's broken, but I can work around it to finish what I need to do.", - "@Something's broken but I can work around it to get what I need done.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I can't get things done until I hear back from you.": "I can't finish what I need to do until I hear back from you.", - "@I can't get things done until I hear back from you.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "EXTREME CRITICAL EMERGENCY!!": "EXTREME CRITICAL EMERGENCY!!", - "@EXTREME CRITICAL EMERGENCY!!": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Not Graded": "Not Graded", - "@Not Graded": { - "description": "Description for an assignment has not been graded.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Login flow: Normal": "Login flow: Normal", - "@Login flow: Normal": { - "description": "Description for the normal login flow", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Login flow: Canvas": "Login flow: Canvas", - "@Login flow: Canvas": { - "description": "Description for the Canvas login flow", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Login flow: Site Admin": "Login flow: Site admin", - "@Login flow: Site Admin": { - "description": "Description for the Site Admin login flow", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Login flow: Skip mobile verify": "Login flow: Skip mobile verify", - "@Login flow: Skip mobile verify": { - "description": "Description for the login flow that skips domain verification for mobile", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Act As User": "Act As User", - "@Act As User": { - "description": "Label for the button that allows the user to act (masquerade) as another user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Stop Acting as User": "Stop acting as user", - "@Stop Acting as User": { - "description": "Label for the button that allows the user to stop acting (masquerading) as another user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "actingAsUser": "You are acting as {userName}", - "@actingAsUser": { - "description": "Message shown while acting (masquerading) as another user", - "type": "text", - "placeholders_order": [ - "userName" - ], - "placeholders": { - "userName": {} - } - }, - "\"Act as\" is essentially logging in as this user without a password. You will be able to take any action as if you were this user, and from other users' points of views, it will be as if this user performed them. However, audit logs record that you were the one who performed the actions on behalf of this user.": "\"Act as\" is essentially logging in as this user without a password. You will be able to take any action as if you were this user, and from other users' points of views, it will be as if this user performed them. However, audit logs record that you were the one who performed the actions on behalf of this user.", - "@\"Act as\" is essentially logging in as this user without a password. You will be able to take any action as if you were this user, and from other users' points of views, it will be as if this user performed them. However, audit logs record that you were the one who performed the actions on behalf of this user.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Domain": "Domain", - "@Domain": { - "description": "Text field hint for domain url input", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You must enter a valid domain": "You must enter a valid domain", - "@You must enter a valid domain": { - "description": "Message displayed for domain input error", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "User ID": "User ID", - "@User ID": { - "description": "Text field hint for user ID input", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You must enter a user id": "You must enter a user id", - "@You must enter a user id": { - "description": "Message displayed for user Id input error", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error trying to act as this user. Please check the Domain and User ID and try again.": "There was an error trying to act as this user. Please check the Domain and User ID and try again.", - "@There was an error trying to act as this user. Please check the Domain and User ID and try again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "endMasqueradeMessage": "You will stop acting as {userName} and return to your original account.", - "@endMasqueradeMessage": { - "description": "Confirmation message displayed when the user wants to stop acting (masquerading) as another user", - "type": "text", - "placeholders_order": [ - "userName" - ], - "placeholders": { - "userName": {} - } - }, - "endMasqueradeLogoutMessage": "You will stop acting as {userName} and will be logged out.", - "@endMasqueradeLogoutMessage": { - "description": "Confirmation message displayed when the user wants to stop acting (masquerading) as another user and will be logged out.", - "type": "text", - "placeholders_order": [ - "userName" - ], - "placeholders": { - "userName": {} - } - }, - "How are we doing?": "How are we doing?", - "@How are we doing?": { - "description": "Title for dialog asking user to rate the app out of 5 stars.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Don't show again": "Don't show again", - "@Don't show again": { - "description": "Button to prevent the rating dialog from showing again.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "What can we do better?": "What can we do better?", - "@What can we do better?": { - "description": "Hint text for providing a comment with the rating.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Send Feedback": "Send Feedback", - "@Send Feedback": { - "description": "Button to send rating with feedback", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "ratingDialogEmailSubject": "Suggestions for Android - Canvas Parent {version}", - "@ratingDialogEmailSubject": { - "description": "The subject for an email to provide feedback for CanvasParent.", - "type": "text", - "placeholders_order": [ - "version" - ], - "placeholders": { - "version": {} - } - }, - "starRating": "{position,plural, =1{{position} star}other{{position} stars}}", - "@starRating": { - "description": "Accessibility label for the 1 stars to 5 stars rating", - "type": "text", - "placeholders_order": [ - "position" - ], - "placeholders": { - "position": { - "example": 1 - } - } - }, - "Student Pairing": "Student Pairing", - "@Student Pairing": { - "description": "Title for the screen where users can pair to students using a QR code", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Open Canvas Student": "Open Canvas Student", - "@Open Canvas Student": { - "description": "Title for QR pairing tutorial screen instructing users to open the Canvas Student app", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You'll need to open your student's Canvas Student app to continue. Go into Main Menu > Settings > Pair with Observer and scan the QR code you see there.": "You'll need to open your student's Canvas Student app to continue. Go into Main Menu > Settings > Pair with Observer and scan the QR code you see there.", - "@You'll need to open your student's Canvas Student app to continue. Go into Main Menu > Settings > Pair with Observer and scan the QR code you see there.": { - "description": "Message explaining how QR code pairing works", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Screenshot showing location of pairing QR code generation in the Canvas Student app": "Screenshot showing location of pairing QR code generation in the Canvas Student app", - "@Screenshot showing location of pairing QR code generation in the Canvas Student app": { - "description": "Content Description for qr pairing tutorial screenshot", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Expired QR Code": "Expired QR Code", - "@Expired QR Code": { - "description": "Error title shown when the users scans a QR code that has expired", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The QR code you scanned may have expired. Refresh the code on the student's device and try again.": "The QR code you scanned may have expired. Refresh the code on the student's device and try again.", - "@The QR code you scanned may have expired. Refresh the code on the student's device and try again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "A network error occurred when adding this student. Check your connection and try again.": "A network error occurred when adding this student. Check your connection and try again.", - "@A network error occurred when adding this student. Check your connection and try again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Invalid QR Code": "Invalid QR Code", - "@Invalid QR Code": { - "description": "Error title shown when the user scans an invalid QR code", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Incorrect Domain": "Incorrect Domain", - "@Incorrect Domain": { - "description": "Error title shown when the users scane a QR code for a student that belongs to a different domain", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The student you are trying to add belongs to a different school. Log in or create an account with that school to scan this code.": "The student you are trying to add belongs to a different school. Log in or create an account with that school to scan this code.", - "@The student you are trying to add belongs to a different school. Log in or create an account with that school to scan this code.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Camera Permission": "Camera Permission", - "@Camera Permission": { - "description": "Error title shown when the user wans to scan a QR code but has denied the camera permission", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "This will unpair and remove all enrollments for this student from your account.": "This will unpair and remove all enrolments for this student from your account.", - "@This will unpair and remove all enrollments for this student from your account.": { - "description": "Confirmation message shown when the user tries to delete a student from their account", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was a problem removing this student from your account. Please check your connection and try again.": "There was a problem removing this student from your account. Please check your connection and try again.", - "@There was a problem removing this student from your account. Please check your connection and try again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Cancel": "Cancel", - "@Cancel": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "next": "Next", - "@next": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "ok": "OK", - "@ok": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Yes": "Yes", - "@Yes": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No": "No", - "@No": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Retry": "Retry", - "@Retry": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Delete": "Delete", - "@Delete": { - "description": "Label used for general delete/remove actions", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Done": "Done", - "@Done": { - "description": "Label for general done/finished actions", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Refresh": "Refresh", - "@Refresh": { - "description": "Label for button to refresh data from the web", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "View Description": "View Description", - "@View Description": { - "description": "Button to view the description for an event or assignment", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "expanded": "expanded", - "@expanded": { - "description": "Description for the accessibility reader for list groups that are expanded", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "collapsed": "collapsed", - "@collapsed": { - "description": "Description for the accessibility reader for list groups that are expanded", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "An unexpected error occurred": "An unexpected error occurred", - "@An unexpected error occurred": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No description": "No description", - "@No description": { - "description": "Message used when the assignment has no description", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Launch External Tool": "Launch External Tool", - "@Launch External Tool": { - "description": "Button text added to webviews to let users open external tools in their browser", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Interactions on this page are limited by your institution.": "Interactions on this page are limited by your institution.", - "@Interactions on this page are limited by your institution.": { - "description": "Message describing how the webview has limited access due to an instution setting", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "dateAtTime": "{date} at {time}", - "@dateAtTime": { - "description": "The string to format dates", - "type": "text", - "placeholders_order": [ - "date", - "time" - ], - "placeholders": { - "date": {}, - "time": {} - } - }, - "dueDateAtTime": "Due {date} at {time}", - "@dueDateAtTime": { - "description": "The string to format due dates", - "type": "text", - "placeholders_order": [ - "date", - "time" - ], - "placeholders": { - "date": {}, - "time": {} - } - }, - "No Due Date": "No Due Date", - "@No Due Date": { - "description": "Label for assignments that do not have a due date", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Filter": "Filter", - "@Filter": { - "description": "Label for buttons to filter what items are visible", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "unread": "unread", - "@unread": { - "description": "Label for things that are marked as unread", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "unreadCount": "{count} unread", - "@unreadCount": { - "description": "Formatted string for when there are a number of unread items", - "type": "text", - "placeholders_order": [ - "count" - ], - "placeholders": { - "count": {} - } - }, - "badgeNumberPlus": "{count}+", - "@badgeNumberPlus": { - "description": "Formatted string for when too many items are being notified in a badge, generally something like: 99+", - "type": "text", - "placeholders_order": [ - "count" - ], - "placeholders": { - "count": {} - } - }, - "There was an error loading this announcement": "There was an error loading this announcement", - "@There was an error loading this announcement": { - "description": "Message shown when an announcement detail screen fails to load", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Network error": "Network error", - "@Network error": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Under Construction": "Under Construction", - "@Under Construction": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "We are currently building this feature for your viewing pleasure.": "We are currently building this feature for your viewing pleasure.", - "@We are currently building this feature for your viewing pleasure.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Request Login Help Button": "Request Login Help Button", - "@Request Login Help Button": { - "description": "Accessibility hint for button that opens help dialog for a login help request", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Request Login Help": "Request Login Help", - "@Request Login Help": { - "description": "Title of help dialog for a login help request", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I'm having trouble logging in": "I'm having trouble logging in", - "@I'm having trouble logging in": { - "description": "Subject of help dialog for a login help request", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "An error occurred when trying to display this link": "An error occurred when trying to display this link", - "@An error occurred when trying to display this link": { - "description": "Error message shown when a link can't be opened", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "We are unable to display this link, it may belong to an institution you currently aren't logged in to.": "We are unable to display this link, it may belong to an institution you currently aren't logged in to.", - "@We are unable to display this link, it may belong to an institution you currently aren't logged in to.": { - "description": "Description for error page shown when clicking a link", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Link Error": "Link Error", - "@Link Error": { - "description": "Title for error page shown when clicking a link", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Open In Browser": "Open In browser", - "@Open In Browser": { - "description": "Text for button to open a link in the browswer", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You'll find the QR code on the web in your account profile. Click 'QR for Mobile Login' in the list.": "You'll find the QR code on the web in your account profile. Click 'QR for Mobile Login' in the list.", - "@You'll find the QR code on the web in your account profile. Click 'QR for Mobile Login' in the list.": { - "description": "Text for qr login tutorial screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Locate QR Code": "Locate QR Code", - "@Locate QR Code": { - "description": "Text for qr login button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Please scan a QR code generated by Canvas": "Please scan a QR code generated by Canvas", - "@Please scan a QR code generated by Canvas": { - "description": "Text for qr login error with incorrect qr code", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error logging in. Please generate another QR Code and try again.": "There was an error logging in. Please generate another QR Code and try again.", - "@There was an error logging in. Please generate another QR Code and try again.": { - "description": "Text for qr login error", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Screenshot showing location of QR code generation in browser": "Screenshot showing location of QR code generation in browser", - "@Screenshot showing location of QR code generation in browser": { - "description": "Content Description for qr login tutorial screenshot", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "QR scanning requires camera access": "QR scanning requires camera access", - "@QR scanning requires camera access": { - "description": "placeholder for camera error for QR code scan", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The linked item is no longer available": "The linked item is no longer available", - "@The linked item is no longer available": { - "description": "error message when the alert could no be opened", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Message sent": "Message sent", - "@Message sent": { - "description": "confirmation message on the screen when the user succesfully sends a message", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Acceptable Use Policy": "Acceptable Use Policy", - "@Acceptable Use Policy": { - "description": "title for the acceptable use policy screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Submit": "Submit", - "@Submit": { - "description": "submit button title for acceptable use policy screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Either you're a new user or the Acceptable Use Policy has changed since you last agreed to it. Please agree to the Acceptable Use Policy before you continue.": "Either you're a new user or the Acceptable Use Policy has changed since you last agreed to it. Please agree to the Acceptable Use Policy before you continue.", - "@Either you're a new user or the Acceptable Use Policy has changed since you last agreed to it. Please agree to the Acceptable Use Policy before you continue.": { - "description": "acceptable use policy screen description", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I agree to the Acceptable Use Policy.": "I agree to the Acceptable Use Policy.", - "@I agree to the Acceptable Use Policy.": { - "description": "acceptable use policy switch title", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "About": "About", - "@About": { - "description": "Title for about menu item in settings", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "App": "App", - "@App": { - "description": "Title for App field on about page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Login ID": "Login ID", - "@Login ID": { - "description": "Title for Login ID field on about page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Email": "Email", - "@Email": { - "description": "Title for Email field on about page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Version": "Version", - "@Version": { - "description": "Title for Version field on about page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Instructure logo": "Instructure logo", - "@Instructure logo": { - "description": "Semantics label for the Instructure logo on the about page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - } -} \ No newline at end of file diff --git a/apps/flutter_parent/lib/l10n/res/intl_en_GB.arb b/apps/flutter_parent/lib/l10n/res/intl_en_GB.arb deleted file mode 100644 index cc92a7ec53..0000000000 --- a/apps/flutter_parent/lib/l10n/res/intl_en_GB.arb +++ /dev/null @@ -1,2753 +0,0 @@ -{ - "@@last_modified": "2023-08-25T11:04:20.901151", - "alertsLabel": "Alerts", - "@alertsLabel": { - "description": "The label for the Alerts tab", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "calendarLabel": "Calendar", - "@calendarLabel": { - "description": "The label for the Calendar tab", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "coursesLabel": "Courses", - "@coursesLabel": { - "description": "The label for the Courses tab", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Students": "No Students", - "@No Students": { - "description": "Text for when an observer has no students they are observing", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Tap to show student selector": "Tap to show student selector", - "@Tap to show student selector": { - "description": "Semantics label for the area that will show the student selector when tapped", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Tap to pair with a new student": "Tap to pair with a new student", - "@Tap to pair with a new student": { - "description": "Semantics label for the add student button in the student selector", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Tap to select this student": "Tap to select this student", - "@Tap to select this student": { - "description": "Semantics label on individual students in the student switcher", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Manage Students": "Manage Students", - "@Manage Students": { - "description": "Label text for the Manage Students nav drawer button as well as the title for the Manage Students screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Help": "Help", - "@Help": { - "description": "Label text for the help nav drawer button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Log Out": "Log out", - "@Log Out": { - "description": "Label text for the Log Out nav drawer button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Switch Users": "Switch Users", - "@Switch Users": { - "description": "Label text for the Switch Users nav drawer button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "appVersion": "v. {version}", - "@appVersion": { - "description": "App version shown in the navigation drawer", - "type": "text", - "placeholders_order": [ - "version" - ], - "placeholders": { - "version": {} - } - }, - "Are you sure you want to log out?": "Are you sure you want to log out?", - "@Are you sure you want to log out?": { - "description": "Confirmation message displayed when the user tries to log out", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Calendars": "Calendars", - "@Calendars": { - "description": "Label for button that lets users select which calendars to display", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "nextMonth": "Next month: {month}", - "@nextMonth": { - "description": "Label for the button that switches the calendar to the next month", - "type": "text", - "placeholders_order": [ - "month" - ], - "placeholders": { - "month": {} - } - }, - "previousMonth": "Previous month: {month}", - "@previousMonth": { - "description": "Label for the button that switches the calendar to the previous month", - "type": "text", - "placeholders_order": [ - "month" - ], - "placeholders": { - "month": {} - } - }, - "nextWeek": "Next week starting {date}", - "@nextWeek": { - "description": "Label for the button that switches the calendar to the next week", - "type": "text", - "placeholders_order": [ - "date" - ], - "placeholders": { - "date": {} - } - }, - "previousWeek": "Previous week starting {date}", - "@previousWeek": { - "description": "Label for the button that switches the calendar to the previous week", - "type": "text", - "placeholders_order": [ - "date" - ], - "placeholders": { - "date": {} - } - }, - "selectedMonthLabel": "Month of {month}", - "@selectedMonthLabel": { - "description": "Accessibility label for the button that expands/collapses the month view", - "type": "text", - "placeholders_order": [ - "month" - ], - "placeholders": { - "month": {} - } - }, - "expand": "expand", - "@expand": { - "description": "Accessibility label for the on-tap hint for the button that expands/collapses the month view", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "collapse": "collapse", - "@collapse": { - "description": "Accessibility label for the on-tap hint for the button that expands/collapses the month view", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "pointsPossible": "{points} points possible", - "@pointsPossible": { - "description": "Screen reader label used for the points possible for an assignment, quiz, etc.", - "type": "text", - "placeholders_order": [ - "points" - ], - "placeholders": { - "points": {} - } - }, - "calendarDaySemanticsLabel": "{eventCount,plural, =1{{date}, {eventCount} event}other{{date}, {eventCount} events}}", - "@calendarDaySemanticsLabel": { - "description": "Screen reader label used for calendar day, reads the date and count of events", - "type": "text", - "placeholders_order": [ - "date", - "eventCount" - ], - "placeholders": { - "date": {}, - "eventCount": {} - } - }, - "No Events Today!": "No Events Today!", - "@No Events Today!": { - "description": "Title displayed when there are no calendar events for the current day", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "It looks like a great day to rest, relax, and recharge.": "It looks like a great day to rest, relax, and recharge.", - "@It looks like a great day to rest, relax, and recharge.": { - "description": "Message displayed when there are no calendar events for the current day", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading your student's calendar": "There was an error loading your student's calendar", - "@There was an error loading your student's calendar": { - "description": "Message displayed when calendar events could not be loaded for the current student", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Tap to favorite the courses you want to see on the Calendar. Select up to 10.": "Tap to favourite the courses you want to see on the Calendar. Select up to 10.", - "@Tap to favorite the courses you want to see on the Calendar. Select up to 10.": { - "description": "Description text on calendar filter screen.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You may only choose 10 calendars to display": "You may only choose 10 calendars to display", - "@You may only choose 10 calendars to display": { - "description": "Error text when trying to select more than 10 calendars", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You must select at least one calendar to display": "You must select at least one calendar to display", - "@You must select at least one calendar to display": { - "description": "Error text when trying to de-select all calendars", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Planner Note": "Planner note", - "@Planner Note": { - "description": "Label used for notes in the planner", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Go to today": "Go to today", - "@Go to today": { - "description": "Accessibility label used for the today button in the planner", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Previous Logins": "Previous logins", - "@Previous Logins": { - "description": "Label for the list of previous user logins", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "canvasLogoLabel": "Canvas logo", - "@canvasLogoLabel": { - "description": "The semantics label for the Canvas logo", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "findSchool": "Find School", - "@findSchool": { - "description": "Text for the find-my-school button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "findAnotherSchool": "Find another school", - "@findAnotherSchool": { - "description": "Text for the find-another-school button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "domainSearchInputHint": "Enter school name or district…", - "@domainSearchInputHint": { - "description": "Input hint for the text box on the domain search screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "noDomainResults": "Unable to find schools matching \"{query}\"", - "@noDomainResults": { - "description": "Message shown to users when the domain search query did not return any results", - "type": "text", - "placeholders_order": [ - "query" - ], - "placeholders": { - "query": {} - } - }, - "domainSearchHelpLabel": "How do I find my school or district?", - "@domainSearchHelpLabel": { - "description": "Label for the help button on the domain search screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "canvasGuides": "Canvas Guides", - "@canvasGuides": { - "description": "Proper name for the Canvas Guides. This will be used in the domainSearchHelpBody text and will be highlighted and clickable", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "canvasSupport": "Canvas Support", - "@canvasSupport": { - "description": "Proper name for Canvas Support. This will be used in the domainSearchHelpBody text and will be highlighted and clickable", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "domainSearchHelpBody": "Try searching for the name of the school or district you’re attempting to access, like “Smith Private School” or “Smith County Schools.” You can also enter a Canvas domain directly, like “smith.instructure.com.”\n\nFor more information on finding your institution’s Canvas account, you can visit the {canvasGuides}, reach out to {canvasSupport}, or contact your school for assistance.", - "@domainSearchHelpBody": { - "description": "The body text shown in the help dialog on the domain search screen", - "type": "text", - "placeholders_order": [ - "canvasGuides", - "canvasSupport" - ], - "placeholders": { - "canvasGuides": {}, - "canvasSupport": {} - } - }, - "Uh oh!": "Uh oh!", - "@Uh oh!": { - "description": "Title of the screen that shows when a crash has occurred", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "We’re not sure what happened, but it wasn’t good. Contact us if this keeps happening.": "We’re not sure what happened, but it wasn’t good. Contact us if this keeps happening.", - "@We’re not sure what happened, but it wasn’t good. Contact us if this keeps happening.": { - "description": "Message shown when a crash has occurred", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Contact Support": "Contact support", - "@Contact Support": { - "description": "Label for the button that allows users to contact support after a crash has occurred", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "View error details": "View error details", - "@View error details": { - "description": "Label for the button that allowed users to view crash details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Restart app": "Restart app", - "@Restart app": { - "description": "Label for the button that will restart the entire application", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Application version": "Application version", - "@Application version": { - "description": "Label for the application version displayed in the crash details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Device model": "Device model", - "@Device model": { - "description": "Label for the device model displayed in the crash details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Android OS version": "Android OS version", - "@Android OS version": { - "description": "Label for the Android operating system version displayed in the crash details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Full error message": "Full error message", - "@Full error message": { - "description": "Label for the full error message displayed in the crash details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Inbox": "Inbox", - "@Inbox": { - "description": "Title for the Inbox screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading your inbox messages.": "There was an error loading your inbox messages.", - "@There was an error loading your inbox messages.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Subject": "No Subject", - "@No Subject": { - "description": "Title used for inbox messages that have no subject", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unable to fetch courses. Please check your connection and try again.": "Unable to fetch courses. Please check your connection and try again.", - "@Unable to fetch courses. Please check your connection and try again.": { - "description": "Message shown when an error occured while loading courses", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Choose a course to message": "Choose a course to message", - "@Choose a course to message": { - "description": "Header in the course list shown when the user is choosing which course to associate with a new message", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Inbox Zero": "Inbox zero", - "@Inbox Zero": { - "description": "Title of the message shown when there are no inbox messages", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You’re all caught up!": "You’re all caught up!", - "@You’re all caught up!": { - "description": "Subtitle of the message shown when there are no inbox messages", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading recipients for this course": "There was an error loading recipients for this course", - "@There was an error loading recipients for this course": { - "description": "Message shown when attempting to create a new message but the recipients list failed to load", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unable to send message. Check your connection and try again.": "Unable to send message. Check your connection and try again.", - "@Unable to send message. Check your connection and try again.": { - "description": "Message show when there was an error creating or sending a new message", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unsaved changes": "Unsaved changes", - "@Unsaved changes": { - "description": "Title of the dialog shown when the user tries to leave with unsaved changes", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Are you sure you wish to close this page? Your unsent message will be lost.": "Are you sure you wish to close this page? Your unsent message will be lost.", - "@Are you sure you wish to close this page? Your unsent message will be lost.": { - "description": "Body text of the dialog shown when the user tries leave with unsaved changes", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "New message": "New message", - "@New message": { - "description": "Title of the new-message screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Add attachment": "Add attachment", - "@Add attachment": { - "description": "Tooltip for the add-attachment button in the new-message screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Send message": "Send message", - "@Send message": { - "description": "Tooltip for the send-message button in the new-message screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Select recipients": "Select recipients", - "@Select recipients": { - "description": "Tooltip for the button that allows users to select message recipients", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No recipients selected": "No recipients selected", - "@No recipients selected": { - "description": "Hint displayed when the user has not selected any message recipients", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Message subject": "Message subject", - "@Message subject": { - "description": "Hint text displayed in the input field for the message subject", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Message": "Message", - "@Message": { - "description": "Hint text displayed in the input field for the message body", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Recipients": "Recipients", - "@Recipients": { - "description": "Label for message recipients", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "plusRecipientCount": "+{count}", - "@plusRecipientCount": { - "description": "Shows the number of recipients that are selected but not displayed on screen.", - "type": "text", - "placeholders_order": [ - "count" - ], - "placeholders": { - "count": { - "example": 5 - } - } - }, - "Failed. Tap for options.": "Failed. Tap for options.", - "@Failed. Tap for options.": { - "description": "Short message shown on a message attachment when uploading has failed", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "courseForWhom": "for {studentShortName}", - "@courseForWhom": { - "description": "Describes for whom a course is for (i.e. for Bill)", - "type": "text", - "placeholders_order": [ - "studentShortName" - ], - "placeholders": { - "studentShortName": {} - } - }, - "messageLinkPostscript": "Regarding: {studentName}, {linkUrl}", - "@messageLinkPostscript": { - "description": "A postscript appended to new messages that clarifies which student is the subject of the message and also includes a URL for the related Canvas component (course, assignment, event, etc).", - "type": "text", - "placeholders_order": [ - "studentName", - "linkUrl" - ], - "placeholders": { - "studentName": {}, - "linkUrl": {} - } - }, - "There was an error loading this conversation": "There was an error loading this conversation", - "@There was an error loading this conversation": { - "description": "Message shown when a conversation fails to load", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Reply": "Reply", - "@Reply": { - "description": "Button label for replying to a conversation", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Reply All": "Reply All", - "@Reply All": { - "description": "Button label for replying to all conversation participants", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unknown User": "Unknown User", - "@Unknown User": { - "description": "Label used where the user name is not known", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "me": "me", - "@me": { - "description": "First-person pronoun (i.e. 'me') that will be used in message author info, e.g. 'Me to 4 others' or 'Jon Snow to me'", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "authorToRecipient": "{authorName} to {recipientName}", - "@authorToRecipient": { - "description": "Author info for a single-recipient message; includes both the author name and the recipient name.", - "type": "text", - "placeholders_order": [ - "authorName", - "recipientName" - ], - "placeholders": { - "authorName": {}, - "recipientName": {} - } - }, - "authorToNOthers": "{howMany,plural, =1{{authorName} to 1 other}other{{authorName} to {howMany} others}}", - "@authorToNOthers": { - "description": "Author info for a mutli-recipient message; includes the author name and the number of recipients", - "type": "text", - "placeholders_order": [ - "authorName", - "howMany" - ], - "placeholders": { - "authorName": {}, - "howMany": {} - } - }, - "authorToRecipientAndNOthers": "{howMany,plural, =1{{authorName} to {recipientName} & 1 other}other{{authorName} to {recipientName} & {howMany} others}}", - "@authorToRecipientAndNOthers": { - "description": "Author info for a multi-recipient message; includes the author name, one recipient name, and the number of other recipients", - "type": "text", - "placeholders_order": [ - "authorName", - "recipientName", - "howMany" - ], - "placeholders": { - "authorName": {}, - "recipientName": {}, - "howMany": {} - } - }, - "Download": "Download", - "@Download": { - "description": "Label for the button that will begin downloading a file", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Open with another app": "Open with another app", - "@Open with another app": { - "description": "Label for the button that will allow users to open a file with another app", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There are no installed applications that can open this file": "There are no installed applications that can open this file", - "@There are no installed applications that can open this file": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unsupported File": "Unsupported File", - "@Unsupported File": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "This file is unsupported and can’t be viewed through the app": "This file is unsupported and can’t be viewed through the app", - "@This file is unsupported and can’t be viewed through the app": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unable to play this media file": "Unable to play this media file", - "@Unable to play this media file": { - "description": "Message shown when audio or video media could not be played", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unable to load this image": "Unable to load this image", - "@Unable to load this image": { - "description": "Message shown when an image file could not be loaded or displayed", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading this file": "There was an error loading this file", - "@There was an error loading this file": { - "description": "Message shown when a file could not be loaded or displayed", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Courses": "No Courses", - "@No Courses": { - "description": "Title for having no courses", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Your student’s courses might not be published yet.": "Your student’s courses might not be published yet.", - "@Your student’s courses might not be published yet.": { - "description": "Message for having no courses", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading your student’s courses.": "There was an error loading your student’s courses.", - "@There was an error loading your student’s courses.": { - "description": "Message displayed when the list of student courses could not be loaded", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Grade": "No Mark", - "@No Grade": { - "description": "Message shown when there is currently no grade available for a course", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Filter by": "Filter by", - "@Filter by": { - "description": "Title for list of terms to filter grades by", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Grades": "Grades", - "@Grades": { - "description": "Label for the \"Grades\" tab in course details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Syllabus": "Syllabus", - "@Syllabus": { - "description": "Label for the \"Syllabus\" tab in course details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Front Page": "Front page", - "@Front Page": { - "description": "Label for the \"Front Page\" tab in course details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Summary": "Summary", - "@Summary": { - "description": "Label for the \"Summary\" tab in course details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Send a message about this course": "Send a message about this course", - "@Send a message about this course": { - "description": "Accessibility hint for the course messaage floating action button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Total Grade": "Total Mark", - "@Total Grade": { - "description": "Label for the total grade in the course", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Graded": "Graded", - "@Graded": { - "description": "Label for assignments that have been graded", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Submitted": "Submitted", - "@Submitted": { - "description": "Label for assignments that have been submitted", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Not Submitted": "Not Submitted", - "@Not Submitted": { - "description": "Label for assignments that have not been submitted", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Late": "Late", - "@Late": { - "description": "Label for assignments that have been marked late or submitted late", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Missing": "Missing", - "@Missing": { - "description": "Label for assignments that have been marked missing or are not submitted and past the due date", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "-": "-", - "@-": { - "description": "Value representing no score for student submission", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "All Grading Periods": "All Grading Periods", - "@All Grading Periods": { - "description": "Label for selecting all grading periods", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Assignments": "No Assignments", - "@No Assignments": { - "description": "Title for the no assignments message", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "It looks like assignments haven't been created in this space yet.": "It looks like assignments haven't been created in this space yet.", - "@It looks like assignments haven't been created in this space yet.": { - "description": "Message for no assignments", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading the summary details for this course.": "There was an error loading the summary details for this course.", - "@There was an error loading the summary details for this course.": { - "description": "Message shown when the course summary could not be loaded", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Summary": "No Summary", - "@No Summary": { - "description": "Title displayed when there are no items in the course summary", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "This course does not have any assignments or calendar events yet.": "This course does not have any assignments or calendar events yet.", - "@This course does not have any assignments or calendar events yet.": { - "description": "Message displayed when there are no items in the course summary", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "gradeFormatScoreOutOfPointsPossible": "{score} / {pointsPossible}", - "@gradeFormatScoreOutOfPointsPossible": { - "description": "Formatted string for a student score out of the points possible", - "type": "text", - "placeholders_order": [ - "score", - "pointsPossible" - ], - "placeholders": { - "score": {}, - "pointsPossible": {} - } - }, - "contentDescriptionScoreOutOfPointsPossible": "{score} out of {pointsPossible} points", - "@contentDescriptionScoreOutOfPointsPossible": { - "description": "Formatted string for a student score out of the points possible", - "type": "text", - "placeholders_order": [ - "score", - "pointsPossible" - ], - "placeholders": { - "score": {}, - "pointsPossible": {} - } - }, - "gradesSubjectMessage": "Regarding: {studentName}, Grades", - "@gradesSubjectMessage": { - "description": "The subject line for a message to a teacher regarding a student's grades", - "type": "text", - "placeholders_order": [ - "studentName" - ], - "placeholders": { - "studentName": {} - } - }, - "syllabusSubjectMessage": "Regarding: {studentName}, Syllabus", - "@syllabusSubjectMessage": { - "description": "The subject line for a message to a teacher regarding a course syllabus", - "type": "text", - "placeholders_order": [ - "studentName" - ], - "placeholders": { - "studentName": {} - } - }, - "frontPageSubjectMessage": "Regarding: {studentName}, Front Page", - "@frontPageSubjectMessage": { - "description": "The subject line for a message to a teacher regarding a course front page", - "type": "text", - "placeholders_order": [ - "studentName" - ], - "placeholders": { - "studentName": {} - } - }, - "assignmentSubjectMessage": "Regarding: {studentName}, Assignment - {assignmentName}", - "@assignmentSubjectMessage": { - "description": "The subject line for a message to a teacher regarding a student's assignment", - "type": "text", - "placeholders_order": [ - "studentName", - "assignmentName" - ], - "placeholders": { - "studentName": {}, - "assignmentName": {} - } - }, - "eventSubjectMessage": "Regarding: {studentName}, Event - {eventTitle}", - "@eventSubjectMessage": { - "description": "The subject line for a message to a teacher regarding a calendar event", - "type": "text", - "placeholders_order": [ - "studentName", - "eventTitle" - ], - "placeholders": { - "studentName": {}, - "eventTitle": {} - } - }, - "There is no page information available.": "There is no page information available.", - "@There is no page information available.": { - "description": "Description for when no page information is available", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Assignment Details": "Assignment details", - "@Assignment Details": { - "description": "Title for the page that shows details for an assignment", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "assignmentTotalPoints": "{points} pts", - "@assignmentTotalPoints": { - "description": "Label used for the total points the assignment is worth", - "type": "text", - "placeholders_order": [ - "points" - ], - "placeholders": { - "points": {} - } - }, - "assignmentTotalPointsAccessible": "{points} points", - "@assignmentTotalPointsAccessible": { - "description": "Screen reader label used for the total points the assignment is worth", - "type": "text", - "placeholders_order": [ - "points" - ], - "placeholders": { - "points": {} - } - }, - "Due": "Due", - "@Due": { - "description": "Label for an assignment due date", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Grade": "Grade", - "@Grade": { - "description": "Label for the section that displays an assignment's grade", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Locked": "Locked", - "@Locked": { - "description": "Label for when an assignment is locked", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "assignmentLockedModule": "This assignment is locked by the module \"{moduleName}\".", - "@assignmentLockedModule": { - "description": "The locked description when an assignment is locked by a module", - "type": "text", - "placeholders_order": [ - "moduleName" - ], - "placeholders": { - "moduleName": {} - } - }, - "Remind Me": "Remind Me", - "@Remind Me": { - "description": "Label for the row to set reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Set a date and time to be notified of this specific assignment.": "Set a date and time to be notified of this specific assignment.", - "@Set a date and time to be notified of this specific assignment.": { - "description": "Description for row to set reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You will be notified about this assignment on…": "You will be notified about this assignment on…", - "@You will be notified about this assignment on…": { - "description": "Description for when a reminder is set", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Instructions": "Instructions", - "@Instructions": { - "description": "Label for the description of the assignment when it has quiz instructions", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Send a message about this assignment": "Send a message about this assignment", - "@Send a message about this assignment": { - "description": "Accessibility hint for the assignment messaage floating action button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "This app is not authorized for use.": "This app is not authorised for use.", - "@This app is not authorized for use.": { - "description": "The error shown when the app being used is not verified by Canvas", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The server you entered is not authorized for this app.": "The server you entered is not authorised for this app.", - "@The server you entered is not authorized for this app.": { - "description": "The error shown when the desired login domain is not verified by Canvas", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The user agent for this app is not authorized.": "The user agent for this app is not authorised.", - "@The user agent for this app is not authorized.": { - "description": "The error shown when the user agent during verification is not verified by Canvas", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "We were unable to verify the server for use with this app.": "We were unable to verify the server for use with this app.", - "@We were unable to verify the server for use with this app.": { - "description": "The generic error shown when we are unable to verify with Canvas", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Reminders": "Reminders", - "@Reminders": { - "description": "Name of the system notification channel for assignment and event reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Notifications for reminders about assignments and calendar events": "Notifications for reminders about assignments and calendar events", - "@Notifications for reminders about assignments and calendar events": { - "description": "Description of the system notification channel for assignment and event reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Reminders have changed!": "Reminders have changed!", - "@Reminders have changed!": { - "description": "Title of the dialog shown when the user needs to update their reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "In order to provide you with a better experience, we have updated how reminders work. You can add new reminders by viewing an assignment or calendar event and tapping the switch under the \"Remind Me\" section.\n\nBe aware that any reminders created with older versions of this app will not be compatible with the new changes and you will need to create them again.": "In order to provide you with a better experience, we have updated how reminders work. You can add new reminders by viewing an assignment or calendar event and tapping the switch under the \"Remind Me\" section.\n\nBe aware that any reminders created with older versions of this app will not be compatible with the new changes and you will need to create them again.", - "@In order to provide you with a better experience, we have updated how reminders work. You can add new reminders by viewing an assignment or calendar event and tapping the switch under the \"Remind Me\" section.\n\nBe aware that any reminders created with older versions of this app will not be compatible with the new changes and you will need to create them again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Not a parent?": "Not a parent?", - "@Not a parent?": { - "description": "Title for the screen that shows when the user is not observing any students", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "We couldn't find any students associated with this account": "We couldn't find any students associated with this account", - "@We couldn't find any students associated with this account": { - "description": "Subtitle for the screen that shows when the user is not observing any students", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Are you a student or teacher?": "Are you a student or teacher?", - "@Are you a student or teacher?": { - "description": "Label for button that will show users the option to view other Canvas apps in the Play Store", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "One of our other apps might be a better fit. Tap one to visit the Play Store.": "One of our other apps may be a better fit. Tap one to visit the Play Store.", - "@One of our other apps might be a better fit. Tap one to visit the Play Store.": { - "description": "Description of options to view other Canvas apps in the Play Store", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Return to Login": "Return to login", - "@Return to Login": { - "description": "Label for the button that returns the user to the login screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "STUDENT": "STUDENT", - "@STUDENT": { - "description": "The \"student\" portion of the \"Canvas Student\" app name, in all caps. \"Canvas\" is excluded in this context as it will be displayed to the user as a wordmark image", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "TEACHER": "TEACHER", - "@TEACHER": { - "description": "The \"teacher\" portion of the \"Canvas Teacher\" app name, in all caps. \"Canvas\" is excluded in this context as it will be displayed to the user as a wordmark image", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Canvas Student": "Canvas student", - "@Canvas Student": { - "description": "The name of the Canvas Student app. Only \"Student\" should be translated as \"Canvas\" is a brand name in this context and should not be translated.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Canvas Teacher": "Canvas teacher", - "@Canvas Teacher": { - "description": "The name of the Canvas Teacher app. Only \"Teacher\" should be translated as \"Canvas\" is a brand name in this context and should not be translated.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Alerts": "No Alerts", - "@No Alerts": { - "description": "The title for the empty message to show to users when there are no alerts for the student.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There’s nothing to be notified of yet.": "There’s nothing to be notified of yet.", - "@There’s nothing to be notified of yet.": { - "description": "The empty message to show to users when there are no alerts for the student.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "dismissAlertLabel": "Dismiss {alertTitle}", - "@dismissAlertLabel": { - "description": "Accessibility label to dismiss an alert", - "type": "text", - "placeholders_order": [ - "alertTitle" - ], - "placeholders": { - "alertTitle": {} - } - }, - "Course Announcement": "Course announcement", - "@Course Announcement": { - "description": "Title for alerts when there is a course announcement", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Institution Announcement": "Institution announcement", - "@Institution Announcement": { - "description": "Title for alerts when there is an institution announcement", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "assignmentGradeAboveThreshold": "Assignment Grade Above {threshold}", - "@assignmentGradeAboveThreshold": { - "description": "Title for alerts when an assignment grade is above the threshold value", - "type": "text", - "placeholders_order": [ - "threshold" - ], - "placeholders": { - "threshold": {} - } - }, - "assignmentGradeBelowThreshold": "Assignment Grade Below {threshold}", - "@assignmentGradeBelowThreshold": { - "description": "Title for alerts when an assignment grade is below the threshold value", - "type": "text", - "placeholders_order": [ - "threshold" - ], - "placeholders": { - "threshold": {} - } - }, - "courseGradeAboveThreshold": "Course Grade Above {threshold}", - "@courseGradeAboveThreshold": { - "description": "Title for alerts when a course grade is above the threshold value", - "type": "text", - "placeholders_order": [ - "threshold" - ], - "placeholders": { - "threshold": {} - } - }, - "courseGradeBelowThreshold": "Course Grade Below {threshold}", - "@courseGradeBelowThreshold": { - "description": "Title for alerts when a course grade is below the threshold value", - "type": "text", - "placeholders_order": [ - "threshold" - ], - "placeholders": { - "threshold": {} - } - }, - "Settings": "Settings", - "@Settings": { - "description": "Title for the settings screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Theme": "Theme", - "@Theme": { - "description": "Label for the light/dark theme section in the settings page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Dark Mode": "Dark Mode", - "@Dark Mode": { - "description": "Label for the button that enables dark mode", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Light Mode": "Light Mode", - "@Light Mode": { - "description": "Label for the button that enables light mode", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "High Contrast Mode": "High Contrast Mode", - "@High Contrast Mode": { - "description": "Label for the switch that toggles high contrast mode", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Use Dark Theme in Web Content": "Use Dark Theme in Web Content", - "@Use Dark Theme in Web Content": { - "description": "Label for the switch that toggles dark mode for webviews", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Appearance": "Appearance", - "@Appearance": { - "description": "Label for the appearance section in the settings page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Successfully submitted!": "Successfully submitted!", - "@Successfully submitted!": { - "description": "Title displayed in the grade cell for an assignment that has been submitted", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "submissionStatusSuccessSubtitle": "This assignment was submitted on {date} at {time} and is waiting to be graded", - "@submissionStatusSuccessSubtitle": { - "description": "Subtitle displayed in the grade cell for an assignment that has been submitted and is awaiting a grade", - "type": "text", - "placeholders_order": [ - "date", - "time" - ], - "placeholders": { - "date": {}, - "time": {} - } - }, - "outOfPoints": "{howMany,plural, =1{Out of 1 point}other{Out of {points} points}}", - "@outOfPoints": { - "description": "Description for an assignment grade that has points without a current scoroe", - "type": "text", - "placeholders_order": [ - "points", - "howMany" - ], - "placeholders": { - "points": {}, - "howMany": {} - } - }, - "Excused": "Excused", - "@Excused": { - "description": "Grading status for an assignment marked as excused", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Complete": "Complete", - "@Complete": { - "description": "Grading status for an assignment marked as complete", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Incomplete": "Incomplete", - "@Incomplete": { - "description": "Grading status for an assignment marked as incomplete", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "minus": "minus", - "@minus": { - "description": "Screen reader-friendly replacement for the \"-\" character in letter grades like \"A-\"", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "latePenalty": "Late penalty (-{pointsLost})", - "@latePenalty": { - "description": "Text displayed when a late penalty has been applied to the assignment", - "type": "text", - "placeholders_order": [ - "pointsLost" - ], - "placeholders": { - "pointsLost": {} - } - }, - "finalGrade": "Final grade: {grade}", - "@finalGrade": { - "description": "Text that displays the final grade of an assignment", - "type": "text", - "placeholders_order": [ - "grade" - ], - "placeholders": { - "grade": {} - } - }, - "Alert Settings": "Alert Settings", - "@Alert Settings": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Alert me when…": "Alert me when…", - "@Alert me when…": { - "description": "Header for the screen where the observer chooses the thresholds that will determine when they receive alerts (e.g. when an assignment is graded below 70%)", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Course grade below": "Course mark below", - "@Course grade below": { - "description": "Label describing the threshold for when the course grade is below a certain percentage", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Course grade above": "Course mark above", - "@Course grade above": { - "description": "Label describing the threshold for when the course grade is above a certain percentage", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Assignment missing": "Assignment missing", - "@Assignment missing": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Assignment grade below": "Assignment mark below", - "@Assignment grade below": { - "description": "Label describing the threshold for when an assignment is graded below a certain percentage", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Assignment grade above": "Assignment mark above", - "@Assignment grade above": { - "description": "Label describing the threshold for when an assignment is graded above a certain percentage", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Course Announcements": "Course announcements", - "@Course Announcements": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Institution Announcements": "Institution announcements", - "@Institution Announcements": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Never": "Never", - "@Never": { - "description": "Indication that tells the user they will not receive alert notifications of a specific kind", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Grade percentage": "Grade percentage", - "@Grade percentage": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading your student's alerts.": "There was an error loading your student's alerts.", - "@There was an error loading your student's alerts.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Must be below 100": "Must be below 100", - "@Must be below 100": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "mustBeBelowN": "Must be below {percentage}", - "@mustBeBelowN": { - "description": "Validation error to the user that they must choose a percentage below 'n'", - "type": "text", - "placeholders_order": [ - "percentage" - ], - "placeholders": { - "percentage": { - "example": 5 - } - } - }, - "mustBeAboveN": "Must be above {percentage}", - "@mustBeAboveN": { - "description": "Validation error to the user that they must choose a percentage above 'n'", - "type": "text", - "placeholders_order": [ - "percentage" - ], - "placeholders": { - "percentage": { - "example": 5 - } - } - }, - "Select Student Color": "Select Student Colour", - "@Select Student Color": { - "description": "Title for screen that allows users to assign a color to a specific student", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Electric, blue": "Electric, blue", - "@Electric, blue": { - "description": "Name of the Electric (blue) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Plum, Purple": "Plum, Purple", - "@Plum, Purple": { - "description": "Name of the Plum (purple) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Barney, Fuschia": "Barney, Fuchsia", - "@Barney, Fuschia": { - "description": "Name of the Barney (fuschia) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Raspberry, Red": "Raspberry, Red", - "@Raspberry, Red": { - "description": "Name of the Raspberry (red) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Fire, Orange": "Fire, Orange", - "@Fire, Orange": { - "description": "Name of the Fire (orange) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Shamrock, Green": "Shamrock, Green", - "@Shamrock, Green": { - "description": "Name of the Shamrock (green) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "An error occurred while saving your selection. Please try again.": "An error occurred while saving your selection. Please try again.", - "@An error occurred while saving your selection. Please try again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "changeStudentColorLabel": "Change colour for {studentName}", - "@changeStudentColorLabel": { - "description": "Accessibility label for the button that lets users change the color associated with a specific student", - "type": "text", - "placeholders_order": [ - "studentName" - ], - "placeholders": { - "studentName": {} - } - }, - "Teacher": "Teacher", - "@Teacher": { - "description": "Label for the Teacher enrollment type", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Student": "Student", - "@Student": { - "description": "Label for the Student enrollment type", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "TA": "TA", - "@TA": { - "description": "Label for the Teaching Assistant enrollment type (also known as Teacher Aid or Education Assistant), reduced to a short acronym/initialism if appropriate.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Observer": "Observer", - "@Observer": { - "description": "Label for the Observer enrollment type", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Use Camera": "Use Camera", - "@Use Camera": { - "description": "Label for the action item that lets the user capture a photo using the device camera", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Upload File": "Upload file", - "@Upload File": { - "description": "Label for the action item that lets the user upload a file from their device", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Choose from Gallery": "Choose from Gallery", - "@Choose from Gallery": { - "description": "Label for the action item that lets the user select a photo from their device gallery", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Preparing…": "Preparing…", - "@Preparing…": { - "description": "Message shown while a file is being prepared to attach to a message", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Add student with…": "Add student with…", - "@Add student with…": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Add Student": "Add Student", - "@Add Student": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You are not observing any students.": "You are not observing any students.", - "@You are not observing any students.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading your students.": "There was an error loading your students.", - "@There was an error loading your students.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Pairing Code": "Pairing Code", - "@Pairing Code": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Students can obtain a pairing code through the Canvas website": "Students can obtain a pairing code through the Canvas website", - "@Students can obtain a pairing code through the Canvas website": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Enter the student pairing code provided to you. If the pairing code doesn't work, it may have expired": "Enter the student pairing code provided to you. If the pairing code doesn't work, it may have expired", - "@Enter the student pairing code provided to you. If the pairing code doesn't work, it may have expired": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Your code is incorrect or expired.": "Your code is incorrect or expired.", - "@Your code is incorrect or expired.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Something went wrong trying to create your account, please reach out to your school for assistance.": "Something went wrong trying to create your account, please reach out to your school for assistance.", - "@Something went wrong trying to create your account, please reach out to your school for assistance.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "QR Code": "QR Code", - "@QR Code": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Students can create a QR code using the Canvas Student app on their mobile device": "Students can create a QR code using the Canvas Student app on their mobile device", - "@Students can create a QR code using the Canvas Student app on their mobile device": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Add new student": "Add new student", - "@Add new student": { - "description": "Semantics label for the FAB on the Manage Students Screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Select": "Select", - "@Select": { - "description": "Hint text to tell the user to choose one of two options", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I have a Canvas account": "I have a Canvas account", - "@I have a Canvas account": { - "description": "Option to select for users that have a canvas account", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I don't have a Canvas account": "I don't have a Canvas account", - "@I don't have a Canvas account": { - "description": "Option to select for users that don't have a canvas account", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Create Account": "Create account", - "@Create Account": { - "description": "Button text for account creation confirmation", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Full Name": "Full Name", - "@Full Name": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Email Address": "Email Address", - "@Email Address": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Password": "Password", - "@Password": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Full Name…": "Full Name…", - "@Full Name…": { - "description": "hint label for inside form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Email…": "Email…", - "@Email…": { - "description": "hint label for inside form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Password…": "Password…", - "@Password…": { - "description": "hint label for inside form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Please enter full name": "Please enter full name", - "@Please enter full name": { - "description": "Error message for form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Please enter an email address": "Please enter an email address", - "@Please enter an email address": { - "description": "Error message for form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Please enter a valid email address": "Please enter a valid email address", - "@Please enter a valid email address": { - "description": "Error message for form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Password is required": "Password is required", - "@Password is required": { - "description": "Error message for form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Password must contain at least 8 characters": "Password must contain at least 8 characters", - "@Password must contain at least 8 characters": { - "description": "Error message for form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "qrCreateAccountTos": "By tapping 'Create Account', you agree to the {termsOfService} and acknowledge the {privacyPolicy}", - "@qrCreateAccountTos": { - "description": "The text show on the account creation screen", - "type": "text", - "placeholders_order": [ - "termsOfService", - "privacyPolicy" - ], - "placeholders": { - "termsOfService": {}, - "privacyPolicy": {} - } - }, - "Terms of Service": "Terms of Service", - "@Terms of Service": { - "description": "Label for the Canvas Terms of Service agreement. This will be used in the qrCreateAccountTos text and will be highlighted and clickable", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Privacy Policy": "Privacy Policy", - "@Privacy Policy": { - "description": "Label for the Canvas Privacy Policy agreement. This will be used in the qrCreateAccountTos text and will be highlighted and clickable", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "View the Privacy Policy": "View the Privacy Policy", - "@View the Privacy Policy": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Already have an account? ": "Already have an account? ", - "@Already have an account? ": { - "description": "Part of multiline text span, includes AccountSignIn1-2, in that order", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Sign In": "Sign In", - "@Sign In": { - "description": "Part of multiline text span, includes AccountSignIn1-2, in that order", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Hide Password": "Hide Password", - "@Hide Password": { - "description": "content description for password hide button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Show Password": "Show Password", - "@Show Password": { - "description": "content description for password show button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Terms of Service Link": "Terms of Service Link", - "@Terms of Service Link": { - "description": "content description for terms of service link", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Privacy Policy Link": "Privacy Policy Link", - "@Privacy Policy Link": { - "description": "content description for privacy policy link", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Event": "Event", - "@Event": { - "description": "Title for the event details screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Date": "Date", - "@Date": { - "description": "Label for the event date", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Location": "Location", - "@Location": { - "description": "Label for the location information", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Location Specified": "No Location Specified", - "@No Location Specified": { - "description": "Description for events that do not have a location", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "eventTime": "{startAt} - {endAt}", - "@eventTime": { - "description": "The time the event is happening, example: \"2:00 pm - 4:00 pm\"", - "type": "text", - "placeholders_order": [ - "startAt", - "endAt" - ], - "placeholders": { - "startAt": {}, - "endAt": {} - } - }, - "Set a date and time to be notified of this event.": "Set a date and time to be notified of this event.", - "@Set a date and time to be notified of this event.": { - "description": "Description for row to set event reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You will be notified about this event on…": "You will be notified about this event on…", - "@You will be notified about this event on…": { - "description": "Description for when an event reminder is set", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Share Your Love for the App": "Share your love for the app", - "@Share Your Love for the App": { - "description": "Label for option to open the app store", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Tell us about your favorite parts of the app": "Tell us about your favourite parts of the app", - "@Tell us about your favorite parts of the app": { - "description": "Description for option to open the app store", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Legal": "Legal", - "@Legal": { - "description": "Label for legal information option", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Privacy policy, terms of use, open source": "Privacy policy, terms of use, open source", - "@Privacy policy, terms of use, open source": { - "description": "Description for legal information option", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Idea for Canvas Parent App [Android]": "Idea for Canvas Parent App [Android]", - "@Idea for Canvas Parent App [Android]": { - "description": "The subject for the email to request a feature", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The following information will help us better understand your idea:": "The following information will help us better understand your idea:", - "@The following information will help us better understand your idea:": { - "description": "The header for the users information that is attached to a feature request", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Domain:": "Domain:", - "@Domain:": { - "description": "The label for the Canvas domain of the logged in user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "User ID:": "User ID", - "@User ID:": { - "description": "The label for the Canvas user ID of the logged in user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Email:": "Email:", - "@Email:": { - "description": "The label for the eamil of the logged in user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Locale:": "Locale:", - "@Locale:": { - "description": "The label for the locale of the logged in user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Terms of Use": "Terms of Use", - "@Terms of Use": { - "description": "Label for the terms of use", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Canvas on GitHub": "Canvas on GitHub", - "@Canvas on GitHub": { - "description": "Label for the button that opens the Canvas project on GitHub's website", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was a problem loading the Terms of Use": "There was a problem loading the Terms of Use", - "@There was a problem loading the Terms of Use": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Device": "Device", - "@Device": { - "description": "Label used for device manufacturer/model in the error report", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "OS Version": "OS version", - "@OS Version": { - "description": "Label used for device operating system version in the error report", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Version Number": "Version number", - "@Version Number": { - "description": "Label used for the app version number in the error report", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Report A Problem": "Report a problem", - "@Report A Problem": { - "description": "Title used for generic dialog to report problems", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Subject": "Subject", - "@Subject": { - "description": "Label used for Subject text field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "A subject is required.": "A subject is required.", - "@A subject is required.": { - "description": "Error shown when the subject field is empty", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "An email address is required.": "An email address is required.", - "@An email address is required.": { - "description": "Error shown when the email field is empty", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Description": "Description", - "@Description": { - "description": "Label used for Description text field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "A description is required.": "A description is required.", - "@A description is required.": { - "description": "Error shown when the description field is empty", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "How is this affecting you?": "How is this affecting you?", - "@How is this affecting you?": { - "description": "Label used for the dropdown to select how severe the issue is", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "send": "send", - "@send": { - "description": "Label used for send button when reporting a problem", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Just a casual question, comment, idea, suggestion…": "Just a casual question, comment, idea, suggestion…", - "@Just a casual question, comment, idea, suggestion…": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I need some help but it's not urgent.": "I need some help but it's not urgent.", - "@I need some help but it's not urgent.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Something's broken but I can work around it to get what I need done.": "Something's broken, but I can work around it to finish what I need to do.", - "@Something's broken but I can work around it to get what I need done.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I can't get things done until I hear back from you.": "I can't finish what I need to do until I hear back from you.", - "@I can't get things done until I hear back from you.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "EXTREME CRITICAL EMERGENCY!!": "EXTREME CRITICAL EMERGENCY!!", - "@EXTREME CRITICAL EMERGENCY!!": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Not Graded": "Not Graded", - "@Not Graded": { - "description": "Description for an assignment has not been graded.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Login flow: Normal": "Login flow: Normal", - "@Login flow: Normal": { - "description": "Description for the normal login flow", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Login flow: Canvas": "Login flow: Canvas", - "@Login flow: Canvas": { - "description": "Description for the Canvas login flow", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Login flow: Site Admin": "Login flow: Site admin", - "@Login flow: Site Admin": { - "description": "Description for the Site Admin login flow", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Login flow: Skip mobile verify": "Login flow: Skip mobile verify", - "@Login flow: Skip mobile verify": { - "description": "Description for the login flow that skips domain verification for mobile", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Act As User": "Act As User", - "@Act As User": { - "description": "Label for the button that allows the user to act (masquerade) as another user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Stop Acting as User": "Stop acting as user", - "@Stop Acting as User": { - "description": "Label for the button that allows the user to stop acting (masquerading) as another user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "actingAsUser": "You are acting as {userName}", - "@actingAsUser": { - "description": "Message shown while acting (masquerading) as another user", - "type": "text", - "placeholders_order": [ - "userName" - ], - "placeholders": { - "userName": {} - } - }, - "\"Act as\" is essentially logging in as this user without a password. You will be able to take any action as if you were this user, and from other users' points of views, it will be as if this user performed them. However, audit logs record that you were the one who performed the actions on behalf of this user.": "\"Act as\" is essentially logging in as this user without a password. You will be able to take any action as if you were this user, and from other users' points of views, it will be as if this user performed them. However, audit logs record that you were the one who performed the actions on behalf of this user.", - "@\"Act as\" is essentially logging in as this user without a password. You will be able to take any action as if you were this user, and from other users' points of views, it will be as if this user performed them. However, audit logs record that you were the one who performed the actions on behalf of this user.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Domain": "Domain", - "@Domain": { - "description": "Text field hint for domain url input", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You must enter a valid domain": "You must enter a valid domain", - "@You must enter a valid domain": { - "description": "Message displayed for domain input error", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "User ID": "User ID", - "@User ID": { - "description": "Text field hint for user ID input", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You must enter a user id": "You must enter a user id", - "@You must enter a user id": { - "description": "Message displayed for user Id input error", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error trying to act as this user. Please check the Domain and User ID and try again.": "There was an error trying to act as this user. Please check the Domain and User ID and try again.", - "@There was an error trying to act as this user. Please check the Domain and User ID and try again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "endMasqueradeMessage": "You will stop acting as {userName} and return to your original account.", - "@endMasqueradeMessage": { - "description": "Confirmation message displayed when the user wants to stop acting (masquerading) as another user", - "type": "text", - "placeholders_order": [ - "userName" - ], - "placeholders": { - "userName": {} - } - }, - "endMasqueradeLogoutMessage": "You will stop acting as {userName} and will be logged out.", - "@endMasqueradeLogoutMessage": { - "description": "Confirmation message displayed when the user wants to stop acting (masquerading) as another user and will be logged out.", - "type": "text", - "placeholders_order": [ - "userName" - ], - "placeholders": { - "userName": {} - } - }, - "How are we doing?": "How are we doing?", - "@How are we doing?": { - "description": "Title for dialog asking user to rate the app out of 5 stars.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Don't show again": "Don't show again", - "@Don't show again": { - "description": "Button to prevent the rating dialog from showing again.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "What can we do better?": "What can we do better?", - "@What can we do better?": { - "description": "Hint text for providing a comment with the rating.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Send Feedback": "Send Feedback", - "@Send Feedback": { - "description": "Button to send rating with feedback", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "ratingDialogEmailSubject": "Suggestions for Android - Canvas Parent {version}", - "@ratingDialogEmailSubject": { - "description": "The subject for an email to provide feedback for CanvasParent.", - "type": "text", - "placeholders_order": [ - "version" - ], - "placeholders": { - "version": {} - } - }, - "starRating": "{position,plural, =1{{position} star}other{{position} stars}}", - "@starRating": { - "description": "Accessibility label for the 1 stars to 5 stars rating", - "type": "text", - "placeholders_order": [ - "position" - ], - "placeholders": { - "position": { - "example": 1 - } - } - }, - "Student Pairing": "Student Pairing", - "@Student Pairing": { - "description": "Title for the screen where users can pair to students using a QR code", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Open Canvas Student": "Open Canvas Student", - "@Open Canvas Student": { - "description": "Title for QR pairing tutorial screen instructing users to open the Canvas Student app", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You'll need to open your student's Canvas Student app to continue. Go into Main Menu > Settings > Pair with Observer and scan the QR code you see there.": "You'll need to open your student's Canvas Student app to continue. Go into Main Menu > Settings > Pair with Observer and scan the QR code you see there.", - "@You'll need to open your student's Canvas Student app to continue. Go into Main Menu > Settings > Pair with Observer and scan the QR code you see there.": { - "description": "Message explaining how QR code pairing works", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Screenshot showing location of pairing QR code generation in the Canvas Student app": "Screenshot showing location of pairing QR code generation in the Canvas Student app", - "@Screenshot showing location of pairing QR code generation in the Canvas Student app": { - "description": "Content Description for qr pairing tutorial screenshot", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Expired QR Code": "Expired QR Code", - "@Expired QR Code": { - "description": "Error title shown when the users scans a QR code that has expired", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The QR code you scanned may have expired. Refresh the code on the student's device and try again.": "The QR code you scanned may have expired. Refresh the code on the student's device and try again.", - "@The QR code you scanned may have expired. Refresh the code on the student's device and try again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "A network error occurred when adding this student. Check your connection and try again.": "A network error occurred when adding this student. Check your connection and try again.", - "@A network error occurred when adding this student. Check your connection and try again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Invalid QR Code": "Invalid QR Code", - "@Invalid QR Code": { - "description": "Error title shown when the user scans an invalid QR code", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Incorrect Domain": "Incorrect Domain", - "@Incorrect Domain": { - "description": "Error title shown when the users scane a QR code for a student that belongs to a different domain", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The student you are trying to add belongs to a different school. Log in or create an account with that school to scan this code.": "The student you are trying to add belongs to a different school. Log in or create an account with that school to scan this code.", - "@The student you are trying to add belongs to a different school. Log in or create an account with that school to scan this code.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Camera Permission": "Camera Permission", - "@Camera Permission": { - "description": "Error title shown when the user wans to scan a QR code but has denied the camera permission", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "This will unpair and remove all enrollments for this student from your account.": "This will unpair and remove all enrolments for this student from your account.", - "@This will unpair and remove all enrollments for this student from your account.": { - "description": "Confirmation message shown when the user tries to delete a student from their account", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was a problem removing this student from your account. Please check your connection and try again.": "There was a problem removing this student from your account. Please check your connection and try again.", - "@There was a problem removing this student from your account. Please check your connection and try again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Cancel": "Cancel", - "@Cancel": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "next": "Next", - "@next": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "ok": "OK", - "@ok": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Yes": "Yes", - "@Yes": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No": "No", - "@No": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Retry": "Retry", - "@Retry": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Delete": "Delete", - "@Delete": { - "description": "Label used for general delete/remove actions", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Done": "Done", - "@Done": { - "description": "Label for general done/finished actions", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Refresh": "Refresh", - "@Refresh": { - "description": "Label for button to refresh data from the web", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "View Description": "View Description", - "@View Description": { - "description": "Button to view the description for an event or assignment", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "expanded": "expanded", - "@expanded": { - "description": "Description for the accessibility reader for list groups that are expanded", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "collapsed": "collapsed", - "@collapsed": { - "description": "Description for the accessibility reader for list groups that are expanded", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "An unexpected error occurred": "An unexpected error occurred", - "@An unexpected error occurred": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No description": "No description", - "@No description": { - "description": "Message used when the assignment has no description", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Launch External Tool": "Launch External Tool", - "@Launch External Tool": { - "description": "Button text added to webviews to let users open external tools in their browser", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Interactions on this page are limited by your institution.": "Interactions on this page are limited by your institution.", - "@Interactions on this page are limited by your institution.": { - "description": "Message describing how the webview has limited access due to an instution setting", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "dateAtTime": "{date} at {time}", - "@dateAtTime": { - "description": "The string to format dates", - "type": "text", - "placeholders_order": [ - "date", - "time" - ], - "placeholders": { - "date": {}, - "time": {} - } - }, - "dueDateAtTime": "Due {date} at {time}", - "@dueDateAtTime": { - "description": "The string to format due dates", - "type": "text", - "placeholders_order": [ - "date", - "time" - ], - "placeholders": { - "date": {}, - "time": {} - } - }, - "No Due Date": "No Due Date", - "@No Due Date": { - "description": "Label for assignments that do not have a due date", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Filter": "Filter", - "@Filter": { - "description": "Label for buttons to filter what items are visible", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "unread": "unread", - "@unread": { - "description": "Label for things that are marked as unread", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "unreadCount": "{count} unread", - "@unreadCount": { - "description": "Formatted string for when there are a number of unread items", - "type": "text", - "placeholders_order": [ - "count" - ], - "placeholders": { - "count": {} - } - }, - "badgeNumberPlus": "{count}+", - "@badgeNumberPlus": { - "description": "Formatted string for when too many items are being notified in a badge, generally something like: 99+", - "type": "text", - "placeholders_order": [ - "count" - ], - "placeholders": { - "count": {} - } - }, - "There was an error loading this announcement": "There was an error loading this announcement", - "@There was an error loading this announcement": { - "description": "Message shown when an announcement detail screen fails to load", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Network error": "Network error", - "@Network error": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Under Construction": "Under Construction", - "@Under Construction": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "We are currently building this feature for your viewing pleasure.": "We are currently building this feature for your viewing pleasure.", - "@We are currently building this feature for your viewing pleasure.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Request Login Help Button": "Request Login Help Button", - "@Request Login Help Button": { - "description": "Accessibility hint for button that opens help dialog for a login help request", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Request Login Help": "Request Login Help", - "@Request Login Help": { - "description": "Title of help dialog for a login help request", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I'm having trouble logging in": "I'm having trouble logging in", - "@I'm having trouble logging in": { - "description": "Subject of help dialog for a login help request", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "An error occurred when trying to display this link": "An error occurred when trying to display this link", - "@An error occurred when trying to display this link": { - "description": "Error message shown when a link can't be opened", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "We are unable to display this link, it may belong to an institution you currently aren't logged in to.": "We are unable to display this link, it may belong to an institution you currently aren't logged in to.", - "@We are unable to display this link, it may belong to an institution you currently aren't logged in to.": { - "description": "Description for error page shown when clicking a link", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Link Error": "Link Error", - "@Link Error": { - "description": "Title for error page shown when clicking a link", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Open In Browser": "Open In browser", - "@Open In Browser": { - "description": "Text for button to open a link in the browswer", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You'll find the QR code on the web in your account profile. Click 'QR for Mobile Login' in the list.": "You'll find the QR code on the web in your account profile. Click 'QR for Mobile Login' in the list.", - "@You'll find the QR code on the web in your account profile. Click 'QR for Mobile Login' in the list.": { - "description": "Text for qr login tutorial screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Locate QR Code": "Locate QR Code", - "@Locate QR Code": { - "description": "Text for qr login button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Please scan a QR code generated by Canvas": "Please scan a QR code generated by Canvas", - "@Please scan a QR code generated by Canvas": { - "description": "Text for qr login error with incorrect qr code", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error logging in. Please generate another QR Code and try again.": "There was an error logging in. Please generate another QR Code and try again.", - "@There was an error logging in. Please generate another QR Code and try again.": { - "description": "Text for qr login error", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Screenshot showing location of QR code generation in browser": "Screenshot showing location of QR code generation in browser", - "@Screenshot showing location of QR code generation in browser": { - "description": "Content Description for qr login tutorial screenshot", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "QR scanning requires camera access": "QR scanning requires camera access", - "@QR scanning requires camera access": { - "description": "placeholder for camera error for QR code scan", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The linked item is no longer available": "The linked item is no longer available", - "@The linked item is no longer available": { - "description": "error message when the alert could no be opened", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Message sent": "Message sent", - "@Message sent": { - "description": "confirmation message on the screen when the user succesfully sends a message", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Acceptable Use Policy": "Acceptable Use Policy", - "@Acceptable Use Policy": { - "description": "title for the acceptable use policy screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Submit": "Submit", - "@Submit": { - "description": "submit button title for acceptable use policy screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Either you're a new user or the Acceptable Use Policy has changed since you last agreed to it. Please agree to the Acceptable Use Policy before you continue.": "Either you're a new user or the Acceptable Use Policy has changed since you last agreed to it. Please agree to the Acceptable Use Policy before you continue.", - "@Either you're a new user or the Acceptable Use Policy has changed since you last agreed to it. Please agree to the Acceptable Use Policy before you continue.": { - "description": "acceptable use policy screen description", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I agree to the Acceptable Use Policy.": "I agree to the Acceptable Use Policy.", - "@I agree to the Acceptable Use Policy.": { - "description": "acceptable use policy switch title", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "About": "About", - "@About": { - "description": "Title for about menu item in settings", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "App": "App", - "@App": { - "description": "Title for App field on about page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Login ID": "Login ID", - "@Login ID": { - "description": "Title for Login ID field on about page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Email": "Email", - "@Email": { - "description": "Title for Email field on about page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Version": "Version", - "@Version": { - "description": "Title for Version field on about page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Instructure logo": "Instructure logo", - "@Instructure logo": { - "description": "Semantics label for the Instructure logo on the about page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - } -} \ No newline at end of file diff --git a/apps/flutter_parent/lib/l10n/res/intl_en_GB_instukhe.arb b/apps/flutter_parent/lib/l10n/res/intl_en_GB_instukhe.arb deleted file mode 100644 index 8fe52d88ba..0000000000 --- a/apps/flutter_parent/lib/l10n/res/intl_en_GB_instukhe.arb +++ /dev/null @@ -1,2746 +0,0 @@ -{ - "@@last_modified": "2023-04-14T11:04:46.988317", - "alertsLabel": "Alerts", - "@alertsLabel": { - "description": "The label for the Alerts tab", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "calendarLabel": "Calendar", - "@calendarLabel": { - "description": "The label for the Calendar tab", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "coursesLabel": "Modules", - "@coursesLabel": { - "description": "The label for the Courses tab", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Students": "No Students", - "@No Students": { - "description": "Text for when an observer has no students they are observing", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Tap to show student selector": "Tap to show student selector", - "@Tap to show student selector": { - "description": "Semantics label for the area that will show the student selector when tapped", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Tap to pair with a new student": "Tap to pair with a new student", - "@Tap to pair with a new student": { - "description": "Semantics label for the add student button in the student selector", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Tap to select this student": "Tap to select this student", - "@Tap to select this student": { - "description": "Semantics label on individual students in the student switcher", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Manage Students": "Manage Students", - "@Manage Students": { - "description": "Label text for the Manage Students nav drawer button as well as the title for the Manage Students screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Help": "Help", - "@Help": { - "description": "Label text for the help nav drawer button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Log Out": "Log out", - "@Log Out": { - "description": "Label text for the Log Out nav drawer button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Switch Users": "Switch Users", - "@Switch Users": { - "description": "Label text for the Switch Users nav drawer button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "appVersion": "v. {version}", - "@appVersion": { - "description": "App version shown in the navigation drawer", - "type": "text", - "placeholders_order": [ - "version" - ], - "placeholders": { - "version": {} - } - }, - "Are you sure you want to log out?": "Are you sure you want to log out?", - "@Are you sure you want to log out?": { - "description": "Confirmation message displayed when the user tries to log out", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Calendars": "Calendars", - "@Calendars": { - "description": "Label for button that lets users select which calendars to display", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "nextMonth": "Next month: {month}", - "@nextMonth": { - "description": "Label for the button that switches the calendar to the next month", - "type": "text", - "placeholders_order": [ - "month" - ], - "placeholders": { - "month": {} - } - }, - "previousMonth": "Previous month: {month}", - "@previousMonth": { - "description": "Label for the button that switches the calendar to the previous month", - "type": "text", - "placeholders_order": [ - "month" - ], - "placeholders": { - "month": {} - } - }, - "nextWeek": "Next week starting {date}", - "@nextWeek": { - "description": "Label for the button that switches the calendar to the next week", - "type": "text", - "placeholders_order": [ - "date" - ], - "placeholders": { - "date": {} - } - }, - "previousWeek": "Previous week starting {date}", - "@previousWeek": { - "description": "Label for the button that switches the calendar to the previous week", - "type": "text", - "placeholders_order": [ - "date" - ], - "placeholders": { - "date": {} - } - }, - "selectedMonthLabel": "Month of {month}", - "@selectedMonthLabel": { - "description": "Accessibility label for the button that expands/collapses the month view", - "type": "text", - "placeholders_order": [ - "month" - ], - "placeholders": { - "month": {} - } - }, - "expand": "expand", - "@expand": { - "description": "Accessibility label for the on-tap hint for the button that expands/collapses the month view", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "collapse": "collapse", - "@collapse": { - "description": "Accessibility label for the on-tap hint for the button that expands/collapses the month view", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "pointsPossible": "{points} points possible", - "@pointsPossible": { - "description": "Screen reader label used for the points possible for an assignment, quiz, etc.", - "type": "text", - "placeholders_order": [ - "points" - ], - "placeholders": { - "points": {} - } - }, - "calendarDaySemanticsLabel": "{eventCount,plural, =1{{date}, {eventCount} event}other{{date}, {eventCount} events}}", - "@calendarDaySemanticsLabel": { - "description": "Screen reader label used for calendar day, reads the date and count of events", - "type": "text", - "placeholders_order": [ - "date", - "eventCount" - ], - "placeholders": { - "date": {}, - "eventCount": {} - } - }, - "No Events Today!": "No Events Today!", - "@No Events Today!": { - "description": "Title displayed when there are no calendar events for the current day", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "It looks like a great day to rest, relax, and recharge.": "It looks like a great day to rest, relax, and recharge.", - "@It looks like a great day to rest, relax, and recharge.": { - "description": "Message displayed when there are no calendar events for the current day", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading your student's calendar": "There was an error loading your student's calendar", - "@There was an error loading your student's calendar": { - "description": "Message displayed when calendar events could not be loaded for the current student", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Tap to favorite the courses you want to see on the Calendar. Select up to 10.": "Tap to favourite the modules you want to see on the Calendar. Select up to 10.", - "@Tap to favorite the courses you want to see on the Calendar. Select up to 10.": { - "description": "Description text on calendar filter screen.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You may only choose 10 calendars to display": "You may only choose 10 calendars to display", - "@You may only choose 10 calendars to display": { - "description": "Error text when trying to select more than 10 calendars", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You must select at least one calendar to display": "You must select at least one calendar to display", - "@You must select at least one calendar to display": { - "description": "Error text when trying to de-select all calendars", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Planner Note": "Planner note", - "@Planner Note": { - "description": "Label used for notes in the planner", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Go to today": "Go to today", - "@Go to today": { - "description": "Accessibility label used for the today button in the planner", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Previous Logins": "Previous logins", - "@Previous Logins": { - "description": "Label for the list of previous user logins", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "canvasLogoLabel": "Canvas logo", - "@canvasLogoLabel": { - "description": "The semantics label for the Canvas logo", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "findSchool": "Find School", - "@findSchool": { - "description": "Text for the find-my-school button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "findAnotherSchool": "Find another school", - "@findAnotherSchool": { - "description": "Text for the find-another-school button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "domainSearchInputHint": "Enter school name or district…", - "@domainSearchInputHint": { - "description": "Input hint for the text box on the domain search screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "noDomainResults": "Unable to find schools matching \"{query}\"", - "@noDomainResults": { - "description": "Message shown to users when the domain search query did not return any results", - "type": "text", - "placeholders_order": [ - "query" - ], - "placeholders": { - "query": {} - } - }, - "domainSearchHelpLabel": "How do I find my school or district?", - "@domainSearchHelpLabel": { - "description": "Label for the help button on the domain search screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "canvasGuides": "Canvas Guides", - "@canvasGuides": { - "description": "Proper name for the Canvas Guides. This will be used in the domainSearchHelpBody text and will be highlighted and clickable", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "canvasSupport": "Canvas Support", - "@canvasSupport": { - "description": "Proper name for Canvas Support. This will be used in the domainSearchHelpBody text and will be highlighted and clickable", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "domainSearchHelpBody": "Try searching for the name of the school or district you’re attempting to access, like “Smith Private School” or “Smith County Schools.” You can also enter a Canvas domain directly, like “smith.instructure.com.”\n\nFor more information on finding your institution’s Canvas account, you can visit the {canvasGuides}, reach out to {canvasSupport}, or contact your school for assistance.", - "@domainSearchHelpBody": { - "description": "The body text shown in the help dialog on the domain search screen", - "type": "text", - "placeholders_order": [ - "canvasGuides", - "canvasSupport" - ], - "placeholders": { - "canvasGuides": {}, - "canvasSupport": {} - } - }, - "Uh oh!": "Uh oh!", - "@Uh oh!": { - "description": "Title of the screen that shows when a crash has occurred", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "We’re not sure what happened, but it wasn’t good. Contact us if this keeps happening.": "We’re not sure what happened, but it wasn’t good. Contact us if this keeps happening.", - "@We’re not sure what happened, but it wasn’t good. Contact us if this keeps happening.": { - "description": "Message shown when a crash has occurred", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Contact Support": "Contact support", - "@Contact Support": { - "description": "Label for the button that allows users to contact support after a crash has occurred", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "View error details": "View error details", - "@View error details": { - "description": "Label for the button that allowed users to view crash details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Restart app": "Restart app", - "@Restart app": { - "description": "Label for the button that will restart the entire application", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Application version": "Application version", - "@Application version": { - "description": "Label for the application version displayed in the crash details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Device model": "Device model", - "@Device model": { - "description": "Label for the device model displayed in the crash details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Android OS version": "Android OS version", - "@Android OS version": { - "description": "Label for the Android operating system version displayed in the crash details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Full error message": "Full error message", - "@Full error message": { - "description": "Label for the full error message displayed in the crash details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Inbox": "Inbox", - "@Inbox": { - "description": "Title for the Inbox screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading your inbox messages.": "There was an error loading your inbox messages.", - "@There was an error loading your inbox messages.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Subject": "No Subject", - "@No Subject": { - "description": "Title used for inbox messages that have no subject", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unable to fetch courses. Please check your connection and try again.": "Unable to fetch modules. Please check your connection and try again.", - "@Unable to fetch courses. Please check your connection and try again.": { - "description": "Message shown when an error occured while loading courses", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Choose a course to message": "Choose a module to message", - "@Choose a course to message": { - "description": "Header in the course list shown when the user is choosing which course to associate with a new message", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Inbox Zero": "Inbox zero", - "@Inbox Zero": { - "description": "Title of the message shown when there are no inbox messages", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You’re all caught up!": "You’re all caught up!", - "@You’re all caught up!": { - "description": "Subtitle of the message shown when there are no inbox messages", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading recipients for this course": "There was an error loading recipients for this module", - "@There was an error loading recipients for this course": { - "description": "Message shown when attempting to create a new message but the recipients list failed to load", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unable to send message. Check your connection and try again.": "Unable to send message. Check your connection and try again.", - "@Unable to send message. Check your connection and try again.": { - "description": "Message show when there was an error creating or sending a new message", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unsaved changes": "Unsaved changes", - "@Unsaved changes": { - "description": "Title of the dialog shown when the user tries to leave with unsaved changes", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Are you sure you wish to close this page? Your unsent message will be lost.": "Are you sure you wish to close this page? Your unsent message will be lost.", - "@Are you sure you wish to close this page? Your unsent message will be lost.": { - "description": "Body text of the dialog shown when the user tries leave with unsaved changes", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "New message": "New message", - "@New message": { - "description": "Title of the new-message screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Add attachment": "Add attachment", - "@Add attachment": { - "description": "Tooltip for the add-attachment button in the new-message screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Send message": "Send message", - "@Send message": { - "description": "Tooltip for the send-message button in the new-message screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Select recipients": "Select recipients", - "@Select recipients": { - "description": "Tooltip for the button that allows users to select message recipients", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No recipients selected": "No recipients selected", - "@No recipients selected": { - "description": "Hint displayed when the user has not selected any message recipients", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Message subject": "Message subject", - "@Message subject": { - "description": "Hint text displayed in the input field for the message subject", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Message": "Message", - "@Message": { - "description": "Hint text displayed in the input field for the message body", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Recipients": "Recipients", - "@Recipients": { - "description": "Label for message recipients", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "plusRecipientCount": "+{count}", - "@plusRecipientCount": { - "description": "Shows the number of recipients that are selected but not displayed on screen.", - "type": "text", - "placeholders_order": [ - "count" - ], - "placeholders": { - "count": { - "example": 5 - } - } - }, - "Failed. Tap for options.": "Failed. Tap for options.", - "@Failed. Tap for options.": { - "description": "Short message shown on a message attachment when uploading has failed", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "courseForWhom": "for {studentShortName}", - "@courseForWhom": { - "description": "Describes for whom a course is for (i.e. for Bill)", - "type": "text", - "placeholders_order": [ - "studentShortName" - ], - "placeholders": { - "studentShortName": {} - } - }, - "messageLinkPostscript": "Regarding: {studentName}, {linkUrl}", - "@messageLinkPostscript": { - "description": "A postscript appended to new messages that clarifies which student is the subject of the message and also includes a URL for the related Canvas component (course, assignment, event, etc).", - "type": "text", - "placeholders_order": [ - "studentName", - "linkUrl" - ], - "placeholders": { - "studentName": {}, - "linkUrl": {} - } - }, - "There was an error loading this conversation": "There was an error loading this conversation", - "@There was an error loading this conversation": { - "description": "Message shown when a conversation fails to load", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Reply": "Reply", - "@Reply": { - "description": "Button label for replying to a conversation", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Reply All": "Reply All", - "@Reply All": { - "description": "Button label for replying to all conversation participants", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unknown User": "Unknown User", - "@Unknown User": { - "description": "Label used where the user name is not known", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "me": "me", - "@me": { - "description": "First-person pronoun (i.e. 'me') that will be used in message author info, e.g. 'Me to 4 others' or 'Jon Snow to me'", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "authorToRecipient": "{authorName} to {recipientName}", - "@authorToRecipient": { - "description": "Author info for a single-recipient message; includes both the author name and the recipient name.", - "type": "text", - "placeholders_order": [ - "authorName", - "recipientName" - ], - "placeholders": { - "authorName": {}, - "recipientName": {} - } - }, - "authorToNOthers": "{howMany,plural, =1{{authorName} to 1 other}other{{authorName} to {howMany} others}}", - "@authorToNOthers": { - "description": "Author info for a mutli-recipient message; includes the author name and the number of recipients", - "type": "text", - "placeholders_order": [ - "authorName", - "howMany" - ], - "placeholders": { - "authorName": {}, - "howMany": {} - } - }, - "authorToRecipientAndNOthers": "{howMany,plural, =1{{authorName} to {recipientName} & 1 other}other{{authorName} to {recipientName} & {howMany} others}}", - "@authorToRecipientAndNOthers": { - "description": "Author info for a multi-recipient message; includes the author name, one recipient name, and the number of other recipients", - "type": "text", - "placeholders_order": [ - "authorName", - "recipientName", - "howMany" - ], - "placeholders": { - "authorName": {}, - "recipientName": {}, - "howMany": {} - } - }, - "Download": "Download", - "@Download": { - "description": "Label for the button that will begin downloading a file", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Open with another app": "Open with another app", - "@Open with another app": { - "description": "Label for the button that will allow users to open a file with another app", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There are no installed applications that can open this file": "There are no installed applications that can open this file", - "@There are no installed applications that can open this file": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unsupported File": "Unsupported File", - "@Unsupported File": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "This file is unsupported and can’t be viewed through the app": "This file is unsupported and can’t be viewed through the app", - "@This file is unsupported and can’t be viewed through the app": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unable to play this media file": "Unable to play this media file", - "@Unable to play this media file": { - "description": "Message shown when audio or video media could not be played", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unable to load this image": "Unable to load this image", - "@Unable to load this image": { - "description": "Message shown when an image file could not be loaded or displayed", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading this file": "There was an error loading this file", - "@There was an error loading this file": { - "description": "Message shown when a file could not be loaded or displayed", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Courses": "No Modules", - "@No Courses": { - "description": "Title for having no courses", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Your student’s courses might not be published yet.": "Your student’s modules might not be published yet.", - "@Your student’s courses might not be published yet.": { - "description": "Message for having no courses", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading your student’s courses.": "There was an error loading your student’s modules.", - "@There was an error loading your student’s courses.": { - "description": "Message displayed when the list of student courses could not be loaded", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Grade": "No Mark", - "@No Grade": { - "description": "Message shown when there is currently no grade available for a course", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Filter by": "Filter by", - "@Filter by": { - "description": "Title for list of terms to filter grades by", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Grades": "Grades", - "@Grades": { - "description": "Label for the \"Grades\" tab in course details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Syllabus": "Syllabus", - "@Syllabus": { - "description": "Label for the \"Syllabus\" tab in course details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Front Page": "Front page", - "@Front Page": { - "description": "Label for the \"Front Page\" tab in course details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Summary": "Summary", - "@Summary": { - "description": "Label for the \"Summary\" tab in course details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Send a message about this course": "Send a message about this module", - "@Send a message about this course": { - "description": "Accessibility hint for the course messaage floating action button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Total Grade": "Total Mark", - "@Total Grade": { - "description": "Label for the total grade in the course", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Graded": "Graded", - "@Graded": { - "description": "Label for assignments that have been graded", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Submitted": "Submitted", - "@Submitted": { - "description": "Label for assignments that have been submitted", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Not Submitted": "Not Submitted", - "@Not Submitted": { - "description": "Label for assignments that have not been submitted", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Late": "Late", - "@Late": { - "description": "Label for assignments that have been marked late or submitted late", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Missing": "Missing", - "@Missing": { - "description": "Label for assignments that have been marked missing or are not submitted and past the due date", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "-": "-", - "@-": { - "description": "Value representing no score for student submission", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "All Grading Periods": "All Grading Periods", - "@All Grading Periods": { - "description": "Label for selecting all grading periods", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Assignments": "No Assignments", - "@No Assignments": { - "description": "Title for the no assignments message", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "It looks like assignments haven't been created in this space yet.": "It looks like assignments haven't been created in this space yet.", - "@It looks like assignments haven't been created in this space yet.": { - "description": "Message for no assignments", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading the summary details for this course.": "There was an error loading the summary details for this module.", - "@There was an error loading the summary details for this course.": { - "description": "Message shown when the course summary could not be loaded", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Summary": "No Summary", - "@No Summary": { - "description": "Title displayed when there are no items in the course summary", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "This course does not have any assignments or calendar events yet.": "This module does not have any assignments or calendar events yet.", - "@This course does not have any assignments or calendar events yet.": { - "description": "Message displayed when there are no items in the course summary", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "gradeFormatScoreOutOfPointsPossible": "{score} / {pointsPossible}", - "@gradeFormatScoreOutOfPointsPossible": { - "description": "Formatted string for a student score out of the points possible", - "type": "text", - "placeholders_order": [ - "score", - "pointsPossible" - ], - "placeholders": { - "score": {}, - "pointsPossible": {} - } - }, - "contentDescriptionScoreOutOfPointsPossible": "{score} out of {pointsPossible} points", - "@contentDescriptionScoreOutOfPointsPossible": { - "description": "Formatted string for a student score out of the points possible", - "type": "text", - "placeholders_order": [ - "score", - "pointsPossible" - ], - "placeholders": { - "score": {}, - "pointsPossible": {} - } - }, - "gradesSubjectMessage": "Regarding: {studentName}, Grades", - "@gradesSubjectMessage": { - "description": "The subject line for a message to a teacher regarding a student's grades", - "type": "text", - "placeholders_order": [ - "studentName" - ], - "placeholders": { - "studentName": {} - } - }, - "syllabusSubjectMessage": "Regarding: {studentName}, Syllabus", - "@syllabusSubjectMessage": { - "description": "The subject line for a message to a teacher regarding a course syllabus", - "type": "text", - "placeholders_order": [ - "studentName" - ], - "placeholders": { - "studentName": {} - } - }, - "frontPageSubjectMessage": "Regarding: {studentName}, Front Page", - "@frontPageSubjectMessage": { - "description": "The subject line for a message to a teacher regarding a course front page", - "type": "text", - "placeholders_order": [ - "studentName" - ], - "placeholders": { - "studentName": {} - } - }, - "assignmentSubjectMessage": "Regarding: {studentName}, Assignment - {assignmentName}", - "@assignmentSubjectMessage": { - "description": "The subject line for a message to a teacher regarding a student's assignment", - "type": "text", - "placeholders_order": [ - "studentName", - "assignmentName" - ], - "placeholders": { - "studentName": {}, - "assignmentName": {} - } - }, - "eventSubjectMessage": "Regarding: {studentName}, Event - {eventTitle}", - "@eventSubjectMessage": { - "description": "The subject line for a message to a teacher regarding a calendar event", - "type": "text", - "placeholders_order": [ - "studentName", - "eventTitle" - ], - "placeholders": { - "studentName": {}, - "eventTitle": {} - } - }, - "There is no page information available.": "There is no page information available.", - "@There is no page information available.": { - "description": "Description for when no page information is available", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Assignment Details": "Assignment details", - "@Assignment Details": { - "description": "Title for the page that shows details for an assignment", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "assignmentTotalPoints": "{points} pts", - "@assignmentTotalPoints": { - "description": "Label used for the total points the assignment is worth", - "type": "text", - "placeholders_order": [ - "points" - ], - "placeholders": { - "points": {} - } - }, - "assignmentTotalPointsAccessible": "{points} points", - "@assignmentTotalPointsAccessible": { - "description": "Screen reader label used for the total points the assignment is worth", - "type": "text", - "placeholders_order": [ - "points" - ], - "placeholders": { - "points": {} - } - }, - "Due": "Due", - "@Due": { - "description": "Label for an assignment due date", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Grade": "Grade", - "@Grade": { - "description": "Label for the section that displays an assignment's grade", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Locked": "Locked", - "@Locked": { - "description": "Label for when an assignment is locked", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "assignmentLockedModule": "This assignment is locked by the unit \"{moduleName}\".", - "@assignmentLockedModule": { - "description": "The locked description when an assignment is locked by a module", - "type": "text", - "placeholders_order": [ - "moduleName" - ], - "placeholders": { - "moduleName": {} - } - }, - "Remind Me": "Remind Me", - "@Remind Me": { - "description": "Label for the row to set reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Set a date and time to be notified of this specific assignment.": "Set a date and time to be notified of this specific assignment.", - "@Set a date and time to be notified of this specific assignment.": { - "description": "Description for row to set reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You will be notified about this assignment on…": "You will be notified about this assignment on…", - "@You will be notified about this assignment on…": { - "description": "Description for when a reminder is set", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Instructions": "Instructions", - "@Instructions": { - "description": "Label for the description of the assignment when it has quiz instructions", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Send a message about this assignment": "Send a message about this assignment", - "@Send a message about this assignment": { - "description": "Accessibility hint for the assignment messaage floating action button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "This app is not authorized for use.": "This app is not authorised for use.", - "@This app is not authorized for use.": { - "description": "The error shown when the app being used is not verified by Canvas", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The server you entered is not authorized for this app.": "The server you entered is not authorised for this app.", - "@The server you entered is not authorized for this app.": { - "description": "The error shown when the desired login domain is not verified by Canvas", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The user agent for this app is not authorized.": "The user agent for this app is not authorised.", - "@The user agent for this app is not authorized.": { - "description": "The error shown when the user agent during verification is not verified by Canvas", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "We were unable to verify the server for use with this app.": "We were unable to verify the server for use with this app.", - "@We were unable to verify the server for use with this app.": { - "description": "The generic error shown when we are unable to verify with Canvas", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Reminders": "Reminders", - "@Reminders": { - "description": "Name of the system notification channel for assignment and event reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Notifications for reminders about assignments and calendar events": "Notifications for reminders about assignments and calendar events", - "@Notifications for reminders about assignments and calendar events": { - "description": "Description of the system notification channel for assignment and event reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Reminders have changed!": "Reminders have changed!", - "@Reminders have changed!": { - "description": "Title of the dialog shown when the user needs to update their reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "In order to provide you with a better experience, we have updated how reminders work. You can add new reminders by viewing an assignment or calendar event and tapping the switch under the \"Remind Me\" section.\n\nBe aware that any reminders created with older versions of this app will not be compatible with the new changes and you will need to create them again.": "In order to provide you with a better experience, we have updated how reminders work. You can add new reminders by viewing an assignment or calendar event and tapping the switch under the \"Remind Me\" section.\n\nBe aware that any reminders created with older versions of this app will not be compatible with the new changes and you will need to create them again.", - "@In order to provide you with a better experience, we have updated how reminders work. You can add new reminders by viewing an assignment or calendar event and tapping the switch under the \"Remind Me\" section.\n\nBe aware that any reminders created with older versions of this app will not be compatible with the new changes and you will need to create them again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Not a parent?": "Not a parent?", - "@Not a parent?": { - "description": "Title for the screen that shows when the user is not observing any students", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "We couldn't find any students associated with this account": "We couldn't find any students associated with this account", - "@We couldn't find any students associated with this account": { - "description": "Subtitle for the screen that shows when the user is not observing any students", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Are you a student or teacher?": "Are you a student or teacher?", - "@Are you a student or teacher?": { - "description": "Label for button that will show users the option to view other Canvas apps in the Play Store", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "One of our other apps might be a better fit. Tap one to visit the Play Store.": "One of our other apps may be a better fit. Tap one to visit the Play Store.", - "@One of our other apps might be a better fit. Tap one to visit the Play Store.": { - "description": "Description of options to view other Canvas apps in the Play Store", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Return to Login": "Return to login", - "@Return to Login": { - "description": "Label for the button that returns the user to the login screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "STUDENT": "STUDENT", - "@STUDENT": { - "description": "The \"student\" portion of the \"Canvas Student\" app name, in all caps. \"Canvas\" is excluded in this context as it will be displayed to the user as a wordmark image", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "TEACHER": "TEACHER", - "@TEACHER": { - "description": "The \"teacher\" portion of the \"Canvas Teacher\" app name, in all caps. \"Canvas\" is excluded in this context as it will be displayed to the user as a wordmark image", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Canvas Student": "Canvas student", - "@Canvas Student": { - "description": "The name of the Canvas Student app. Only \"Student\" should be translated as \"Canvas\" is a brand name in this context and should not be translated.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Canvas Teacher": "Canvas teacher", - "@Canvas Teacher": { - "description": "The name of the Canvas Teacher app. Only \"Teacher\" should be translated as \"Canvas\" is a brand name in this context and should not be translated.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Alerts": "No Alerts", - "@No Alerts": { - "description": "The title for the empty message to show to users when there are no alerts for the student.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There’s nothing to be notified of yet.": "There’s nothing to be notified of yet.", - "@There’s nothing to be notified of yet.": { - "description": "The empty message to show to users when there are no alerts for the student.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "dismissAlertLabel": "Dismiss {alertTitle}", - "@dismissAlertLabel": { - "description": "Accessibility label to dismiss an alert", - "type": "text", - "placeholders_order": [ - "alertTitle" - ], - "placeholders": { - "alertTitle": {} - } - }, - "Course Announcement": "Module announcement", - "@Course Announcement": { - "description": "Title for alerts when there is a course announcement", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Institution Announcement": "Institution announcement", - "@Institution Announcement": { - "description": "Title for alerts when there is an institution announcement", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "assignmentGradeAboveThreshold": "Assignment Grade Above {threshold}", - "@assignmentGradeAboveThreshold": { - "description": "Title for alerts when an assignment grade is above the threshold value", - "type": "text", - "placeholders_order": [ - "threshold" - ], - "placeholders": { - "threshold": {} - } - }, - "assignmentGradeBelowThreshold": "Assignment Grade Below {threshold}", - "@assignmentGradeBelowThreshold": { - "description": "Title for alerts when an assignment grade is below the threshold value", - "type": "text", - "placeholders_order": [ - "threshold" - ], - "placeholders": { - "threshold": {} - } - }, - "courseGradeAboveThreshold": "Module Grade Above {threshold}", - "@courseGradeAboveThreshold": { - "description": "Title for alerts when a course grade is above the threshold value", - "type": "text", - "placeholders_order": [ - "threshold" - ], - "placeholders": { - "threshold": {} - } - }, - "courseGradeBelowThreshold": "Module Grade Below {threshold}", - "@courseGradeBelowThreshold": { - "description": "Title for alerts when a course grade is below the threshold value", - "type": "text", - "placeholders_order": [ - "threshold" - ], - "placeholders": { - "threshold": {} - } - }, - "Settings": "Settings", - "@Settings": { - "description": "Title for the settings screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Theme": "Theme", - "@Theme": { - "description": "Label for the light/dark theme section in the settings page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Dark Mode": "Dark Mode", - "@Dark Mode": { - "description": "Label for the button that enables dark mode", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Light Mode": "Light Mode", - "@Light Mode": { - "description": "Label for the button that enables light mode", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "High Contrast Mode": "High Contrast Mode", - "@High Contrast Mode": { - "description": "Label for the switch that toggles high contrast mode", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Use Dark Theme in Web Content": "Use Dark Theme in Web Content", - "@Use Dark Theme in Web Content": { - "description": "Label for the switch that toggles dark mode for webviews", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Appearance": "Appearance", - "@Appearance": { - "description": "Label for the appearance section in the settings page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Successfully submitted!": "Successfully submitted!", - "@Successfully submitted!": { - "description": "Title displayed in the grade cell for an assignment that has been submitted", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "submissionStatusSuccessSubtitle": "This assignment was submitted on {date} at {time} and is waiting to be graded", - "@submissionStatusSuccessSubtitle": { - "description": "Subtitle displayed in the grade cell for an assignment that has been submitted and is awaiting a grade", - "type": "text", - "placeholders_order": [ - "date", - "time" - ], - "placeholders": { - "date": {}, - "time": {} - } - }, - "outOfPoints": "{howMany,plural, =1{Out of 1 point}other{Out of {points} points}}", - "@outOfPoints": { - "description": "Description for an assignment grade that has points without a current scoroe", - "type": "text", - "placeholders_order": [ - "points", - "howMany" - ], - "placeholders": { - "points": {}, - "howMany": {} - } - }, - "Excused": "Excused", - "@Excused": { - "description": "Grading status for an assignment marked as excused", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Complete": "Complete", - "@Complete": { - "description": "Grading status for an assignment marked as complete", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Incomplete": "Incomplete", - "@Incomplete": { - "description": "Grading status for an assignment marked as incomplete", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "minus": "minus", - "@minus": { - "description": "Screen reader-friendly replacement for the \"-\" character in letter grades like \"A-\"", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "latePenalty": "Late penalty (-{pointsLost})", - "@latePenalty": { - "description": "Text displayed when a late penalty has been applied to the assignment", - "type": "text", - "placeholders_order": [ - "pointsLost" - ], - "placeholders": { - "pointsLost": {} - } - }, - "finalGrade": "Final grade: {grade}", - "@finalGrade": { - "description": "Text that displays the final grade of an assignment", - "type": "text", - "placeholders_order": [ - "grade" - ], - "placeholders": { - "grade": {} - } - }, - "Alert Settings": "Alert Settings", - "@Alert Settings": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Alert me when…": "Alert me when…", - "@Alert me when…": { - "description": "Header for the screen where the observer chooses the thresholds that will determine when they receive alerts (e.g. when an assignment is graded below 70%)", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Course grade below": "Module mark below", - "@Course grade below": { - "description": "Label describing the threshold for when the course grade is below a certain percentage", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Course grade above": "Module mark above", - "@Course grade above": { - "description": "Label describing the threshold for when the course grade is above a certain percentage", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Assignment missing": "Assignment missing", - "@Assignment missing": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Assignment grade below": "Assignment mark below", - "@Assignment grade below": { - "description": "Label describing the threshold for when an assignment is graded below a certain percentage", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Assignment grade above": "Assignment mark above", - "@Assignment grade above": { - "description": "Label describing the threshold for when an assignment is graded above a certain percentage", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Course Announcements": "Module announcements", - "@Course Announcements": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Institution Announcements": "Institution announcements", - "@Institution Announcements": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Never": "Never", - "@Never": { - "description": "Indication that tells the user they will not receive alert notifications of a specific kind", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Grade percentage": "Grade percentage", - "@Grade percentage": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading your student's alerts.": "There was an error loading your student's alerts.", - "@There was an error loading your student's alerts.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Must be below 100": "Must be below 100", - "@Must be below 100": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "mustBeBelowN": "Must be below {percentage}", - "@mustBeBelowN": { - "description": "Validation error to the user that they must choose a percentage below 'n'", - "type": "text", - "placeholders_order": [ - "percentage" - ], - "placeholders": { - "percentage": { - "example": 5 - } - } - }, - "mustBeAboveN": "Must be above {percentage}", - "@mustBeAboveN": { - "description": "Validation error to the user that they must choose a percentage above 'n'", - "type": "text", - "placeholders_order": [ - "percentage" - ], - "placeholders": { - "percentage": { - "example": 5 - } - } - }, - "Select Student Color": "Select Student Colour", - "@Select Student Color": { - "description": "Title for screen that allows users to assign a color to a specific student", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Electric, blue": "Electric, blue", - "@Electric, blue": { - "description": "Name of the Electric (blue) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Plum, Purple": "Plum, Purple", - "@Plum, Purple": { - "description": "Name of the Plum (purple) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Barney, Fuschia": "Barney, Fuchsia", - "@Barney, Fuschia": { - "description": "Name of the Barney (fuschia) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Raspberry, Red": "Raspberry, Red", - "@Raspberry, Red": { - "description": "Name of the Raspberry (red) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Fire, Orange": "Fire, Orange", - "@Fire, Orange": { - "description": "Name of the Fire (orange) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Shamrock, Green": "Shamrock, Green", - "@Shamrock, Green": { - "description": "Name of the Shamrock (green) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "An error occurred while saving your selection. Please try again.": "An error occurred while saving your selection. Please try again.", - "@An error occurred while saving your selection. Please try again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "changeStudentColorLabel": "Change colour for {studentName}", - "@changeStudentColorLabel": { - "description": "Accessibility label for the button that lets users change the color associated with a specific student", - "type": "text", - "placeholders_order": [ - "studentName" - ], - "placeholders": { - "studentName": {} - } - }, - "Teacher": "Teacher", - "@Teacher": { - "description": "Label for the Teacher enrollment type", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Student": "Student", - "@Student": { - "description": "Label for the Student enrollment type", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "TA": "TA", - "@TA": { - "description": "Label for the Teaching Assistant enrollment type (also known as Teacher Aid or Education Assistant), reduced to a short acronym/initialism if appropriate.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Observer": "Observer", - "@Observer": { - "description": "Label for the Observer enrollment type", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Use Camera": "Use Camera", - "@Use Camera": { - "description": "Label for the action item that lets the user capture a photo using the device camera", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Upload File": "Upload file", - "@Upload File": { - "description": "Label for the action item that lets the user upload a file from their device", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Choose from Gallery": "Choose from Gallery", - "@Choose from Gallery": { - "description": "Label for the action item that lets the user select a photo from their device gallery", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Preparing…": "Preparing…", - "@Preparing…": { - "description": "Message shown while a file is being prepared to attach to a message", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Add student with…": "Add student with…", - "@Add student with…": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Add Student": "Add Student", - "@Add Student": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You are not observing any students.": "You are not observing any students.", - "@You are not observing any students.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading your students.": "There was an error loading your students.", - "@There was an error loading your students.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Pairing Code": "Pairing Code", - "@Pairing Code": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Students can obtain a pairing code through the Canvas website": "Students can obtain a pairing code through the Canvas website", - "@Students can obtain a pairing code through the Canvas website": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Enter the student pairing code provided to you. If the pairing code doesn't work, it may have expired": "Enter the student pairing code provided to you. If the pairing code doesn't work, it may have expired", - "@Enter the student pairing code provided to you. If the pairing code doesn't work, it may have expired": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Your code is incorrect or expired.": "Your code is incorrect or expired.", - "@Your code is incorrect or expired.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Something went wrong trying to create your account, please reach out to your school for assistance.": "Something went wrong trying to create your account, please reach out to your school for assistance.", - "@Something went wrong trying to create your account, please reach out to your school for assistance.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "QR Code": "QR Code", - "@QR Code": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Students can create a QR code using the Canvas Student app on their mobile device": "Students can create a QR code using the Canvas Student app on their mobile device", - "@Students can create a QR code using the Canvas Student app on their mobile device": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Add new student": "Add new student", - "@Add new student": { - "description": "Semantics label for the FAB on the Manage Students Screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Select": "Select", - "@Select": { - "description": "Hint text to tell the user to choose one of two options", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I have a Canvas account": "I have a Canvas account", - "@I have a Canvas account": { - "description": "Option to select for users that have a canvas account", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I don't have a Canvas account": "I don't have a Canvas account", - "@I don't have a Canvas account": { - "description": "Option to select for users that don't have a canvas account", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Create Account": "Create account", - "@Create Account": { - "description": "Button text for account creation confirmation", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Full Name": "Full Name", - "@Full Name": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Email Address": "Email Address", - "@Email Address": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Password": "Password", - "@Password": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Full Name…": "Full Name…", - "@Full Name…": { - "description": "hint label for inside form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Email…": "Email…", - "@Email…": { - "description": "hint label for inside form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Password…": "Password…", - "@Password…": { - "description": "hint label for inside form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Please enter full name": "Please enter full name", - "@Please enter full name": { - "description": "Error message for form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Please enter an email address": "Please enter an email address", - "@Please enter an email address": { - "description": "Error message for form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Please enter a valid email address": "Please enter a valid email address", - "@Please enter a valid email address": { - "description": "Error message for form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Password is required": "Password is required", - "@Password is required": { - "description": "Error message for form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Password must contain at least 8 characters": "Password must contain at least 8 characters", - "@Password must contain at least 8 characters": { - "description": "Error message for form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "qrCreateAccountTos": "By tapping 'Create Account', you agree to the {termsOfService} and acknowledge the {privacyPolicy}", - "@qrCreateAccountTos": { - "description": "The text show on the account creation screen", - "type": "text", - "placeholders_order": [ - "termsOfService", - "privacyPolicy" - ], - "placeholders": { - "termsOfService": {}, - "privacyPolicy": {} - } - }, - "Terms of Service": "Terms of Service", - "@Terms of Service": { - "description": "Label for the Canvas Terms of Service agreement. This will be used in the qrCreateAccountTos text and will be highlighted and clickable", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Privacy Policy": "Privacy Policy", - "@Privacy Policy": { - "description": "Label for the Canvas Privacy Policy agreement. This will be used in the qrCreateAccountTos text and will be highlighted and clickable", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "View the Privacy Policy": "View the Privacy Policy", - "@View the Privacy Policy": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Already have an account? ": "Already have an account? ", - "@Already have an account? ": { - "description": "Part of multiline text span, includes AccountSignIn1-2, in that order", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Sign In": "Sign In", - "@Sign In": { - "description": "Part of multiline text span, includes AccountSignIn1-2, in that order", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Hide Password": "Hide Password", - "@Hide Password": { - "description": "content description for password hide button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Show Password": "Show Password", - "@Show Password": { - "description": "content description for password show button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Terms of Service Link": "Terms of Service Link", - "@Terms of Service Link": { - "description": "content description for terms of service link", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Privacy Policy Link": "Privacy Policy Link", - "@Privacy Policy Link": { - "description": "content description for privacy policy link", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Event": "Event", - "@Event": { - "description": "Title for the event details screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Date": "Date", - "@Date": { - "description": "Label for the event date", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Location": "Location", - "@Location": { - "description": "Label for the location information", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Location Specified": "No Location Specified", - "@No Location Specified": { - "description": "Description for events that do not have a location", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "eventTime": "{startAt} - {endAt}", - "@eventTime": { - "description": "The time the event is happening, example: \"2:00 pm - 4:00 pm\"", - "type": "text", - "placeholders_order": [ - "startAt", - "endAt" - ], - "placeholders": { - "startAt": {}, - "endAt": {} - } - }, - "Set a date and time to be notified of this event.": "Set a date and time to be notified of this event.", - "@Set a date and time to be notified of this event.": { - "description": "Description for row to set event reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You will be notified about this event on…": "You will be notified about this event on…", - "@You will be notified about this event on…": { - "description": "Description for when an event reminder is set", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Share Your Love for the App": "Share your love for the app", - "@Share Your Love for the App": { - "description": "Label for option to open the app store", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Tell us about your favorite parts of the app": "Tell us about your favourite parts of the app", - "@Tell us about your favorite parts of the app": { - "description": "Description for option to open the app store", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Legal": "Legal", - "@Legal": { - "description": "Label for legal information option", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Privacy policy, terms of use, open source": "Privacy policy, terms of use, open source", - "@Privacy policy, terms of use, open source": { - "description": "Description for legal information option", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Idea for Canvas Parent App [Android]": "Idea for Canvas Parent App [Android]", - "@Idea for Canvas Parent App [Android]": { - "description": "The subject for the email to request a feature", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The following information will help us better understand your idea:": "The following information will help us better understand your idea:", - "@The following information will help us better understand your idea:": { - "description": "The header for the users information that is attached to a feature request", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Domain:": "Domain:", - "@Domain:": { - "description": "The label for the Canvas domain of the logged in user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "User ID:": "User ID", - "@User ID:": { - "description": "The label for the Canvas user ID of the logged in user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Email:": "Email:", - "@Email:": { - "description": "The label for the eamil of the logged in user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Locale:": "Locale:", - "@Locale:": { - "description": "The label for the locale of the logged in user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Terms of Use": "Terms of Use", - "@Terms of Use": { - "description": "Label for the terms of use", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Canvas on GitHub": "Canvas on GitHub", - "@Canvas on GitHub": { - "description": "Label for the button that opens the Canvas project on GitHub's website", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was a problem loading the Terms of Use": "There was a problem loading the Terms of Use", - "@There was a problem loading the Terms of Use": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Device": "Device", - "@Device": { - "description": "Label used for device manufacturer/model in the error report", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "OS Version": "OS version", - "@OS Version": { - "description": "Label used for device operating system version in the error report", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Version Number": "Version number", - "@Version Number": { - "description": "Label used for the app version number in the error report", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Report A Problem": "Report a problem", - "@Report A Problem": { - "description": "Title used for generic dialog to report problems", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Subject": "Subject", - "@Subject": { - "description": "Label used for Subject text field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "A subject is required.": "A subject is required.", - "@A subject is required.": { - "description": "Error shown when the subject field is empty", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "An email address is required.": "An email address is required.", - "@An email address is required.": { - "description": "Error shown when the email field is empty", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Description": "Description", - "@Description": { - "description": "Label used for Description text field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "A description is required.": "A description is required.", - "@A description is required.": { - "description": "Error shown when the description field is empty", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "How is this affecting you?": "How is this affecting you?", - "@How is this affecting you?": { - "description": "Label used for the dropdown to select how severe the issue is", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "send": "send", - "@send": { - "description": "Label used for send button when reporting a problem", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Just a casual question, comment, idea, suggestion…": "Just a casual question, comment, idea, suggestion…", - "@Just a casual question, comment, idea, suggestion…": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I need some help but it's not urgent.": "I need some help but it's not urgent.", - "@I need some help but it's not urgent.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Something's broken but I can work around it to get what I need done.": "Something's broken, but I can work around it to finish what I need to do.", - "@Something's broken but I can work around it to get what I need done.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I can't get things done until I hear back from you.": "I can't finish what I need to do until I hear back from you.", - "@I can't get things done until I hear back from you.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "EXTREME CRITICAL EMERGENCY!!": "EXTREME CRITICAL EMERGENCY!!", - "@EXTREME CRITICAL EMERGENCY!!": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Not Graded": "Not Graded", - "@Not Graded": { - "description": "Description for an assignment has not been graded.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Login flow: Normal": "Login flow: Normal", - "@Login flow: Normal": { - "description": "Description for the normal login flow", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Login flow: Canvas": "Login flow: Canvas", - "@Login flow: Canvas": { - "description": "Description for the Canvas login flow", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Login flow: Site Admin": "Login flow: Site admin", - "@Login flow: Site Admin": { - "description": "Description for the Site Admin login flow", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Login flow: Skip mobile verify": "Login flow: Skip mobile verify", - "@Login flow: Skip mobile verify": { - "description": "Description for the login flow that skips domain verification for mobile", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Act As User": "Act As User", - "@Act As User": { - "description": "Label for the button that allows the user to act (masquerade) as another user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Stop Acting as User": "Stop acting as user", - "@Stop Acting as User": { - "description": "Label for the button that allows the user to stop acting (masquerading) as another user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "actingAsUser": "You are acting as {userName}", - "@actingAsUser": { - "description": "Message shown while acting (masquerading) as another user", - "type": "text", - "placeholders_order": [ - "userName" - ], - "placeholders": { - "userName": {} - } - }, - "\"Act as\" is essentially logging in as this user without a password. You will be able to take any action as if you were this user, and from other users' points of views, it will be as if this user performed them. However, audit logs record that you were the one who performed the actions on behalf of this user.": "\"Act as\" is essentially logging in as this user without a password. You will be able to take any action as if you were this user, and from other users' points of views, it will be as if this user performed them. However, audit logs record that you were the one who performed the actions on behalf of this user.", - "@\"Act as\" is essentially logging in as this user without a password. You will be able to take any action as if you were this user, and from other users' points of views, it will be as if this user performed them. However, audit logs record that you were the one who performed the actions on behalf of this user.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Domain": "Domain", - "@Domain": { - "description": "Text field hint for domain url input", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You must enter a valid domain": "You must enter a valid domain", - "@You must enter a valid domain": { - "description": "Message displayed for domain input error", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "User ID": "User ID", - "@User ID": { - "description": "Text field hint for user ID input", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You must enter a user id": "You must enter a user id", - "@You must enter a user id": { - "description": "Message displayed for user Id input error", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error trying to act as this user. Please check the Domain and User ID and try again.": "There was an error trying to act as this user. Please check the Domain and User ID and try again.", - "@There was an error trying to act as this user. Please check the Domain and User ID and try again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "endMasqueradeMessage": "You will stop acting as {userName} and return to your original account.", - "@endMasqueradeMessage": { - "description": "Confirmation message displayed when the user wants to stop acting (masquerading) as another user", - "type": "text", - "placeholders_order": [ - "userName" - ], - "placeholders": { - "userName": {} - } - }, - "endMasqueradeLogoutMessage": "You will stop acting as {userName} and will be logged out.", - "@endMasqueradeLogoutMessage": { - "description": "Confirmation message displayed when the user wants to stop acting (masquerading) as another user and will be logged out.", - "type": "text", - "placeholders_order": [ - "userName" - ], - "placeholders": { - "userName": {} - } - }, - "How are we doing?": "How are we doing?", - "@How are we doing?": { - "description": "Title for dialog asking user to rate the app out of 5 stars.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Don't show again": "Don't show again", - "@Don't show again": { - "description": "Button to prevent the rating dialog from showing again.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "What can we do better?": "What can we do better?", - "@What can we do better?": { - "description": "Hint text for providing a comment with the rating.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Send Feedback": "Send Feedback", - "@Send Feedback": { - "description": "Button to send rating with feedback", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "ratingDialogEmailSubject": "Suggestions for Android - Canvas Parent {version}", - "@ratingDialogEmailSubject": { - "description": "The subject for an email to provide feedback for CanvasParent.", - "type": "text", - "placeholders_order": [ - "version" - ], - "placeholders": { - "version": {} - } - }, - "starRating": "{position,plural, =1{{position} star}other{{position} stars}}", - "@starRating": { - "description": "Accessibility label for the 1 stars to 5 stars rating", - "type": "text", - "placeholders_order": [ - "position" - ], - "placeholders": { - "position": { - "example": 1 - } - } - }, - "Student Pairing": "Student Pairing", - "@Student Pairing": { - "description": "Title for the screen where users can pair to students using a QR code", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Open Canvas Student": "Open Canvas Student", - "@Open Canvas Student": { - "description": "Title for QR pairing tutorial screen instructing users to open the Canvas Student app", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You'll need to open your student's Canvas Student app to continue. Go into Main Menu > Settings > Pair with Observer and scan the QR code you see there.": "You'll need to open your student's Canvas Student app to continue. Go into Main Menu > Settings > Pair with Observer and scan the QR code you see there.", - "@You'll need to open your student's Canvas Student app to continue. Go into Main Menu > Settings > Pair with Observer and scan the QR code you see there.": { - "description": "Message explaining how QR code pairing works", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Screenshot showing location of pairing QR code generation in the Canvas Student app": "Screenshot showing location of pairing QR code generation in the Canvas Student app", - "@Screenshot showing location of pairing QR code generation in the Canvas Student app": { - "description": "Content Description for qr pairing tutorial screenshot", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Expired QR Code": "Expired QR Code", - "@Expired QR Code": { - "description": "Error title shown when the users scans a QR code that has expired", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The QR code you scanned may have expired. Refresh the code on the student's device and try again.": "The QR code you scanned may have expired. Refresh the code on the student's device and try again.", - "@The QR code you scanned may have expired. Refresh the code on the student's device and try again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "A network error occurred when adding this student. Check your connection and try again.": "A network error occurred when adding this student. Check your connection and try again.", - "@A network error occurred when adding this student. Check your connection and try again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Invalid QR Code": "Invalid QR Code", - "@Invalid QR Code": { - "description": "Error title shown when the user scans an invalid QR code", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Incorrect Domain": "Incorrect Domain", - "@Incorrect Domain": { - "description": "Error title shown when the users scane a QR code for a student that belongs to a different domain", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The student you are trying to add belongs to a different school. Log in or create an account with that school to scan this code.": "The student you are trying to add belongs to a different school. Log in or create an account with that school to scan this code.", - "@The student you are trying to add belongs to a different school. Log in or create an account with that school to scan this code.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Camera Permission": "Camera Permission", - "@Camera Permission": { - "description": "Error title shown when the user wans to scan a QR code but has denied the camera permission", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "This will unpair and remove all enrollments for this student from your account.": "This will unpair and remove all enrolments for this student from your account.", - "@This will unpair and remove all enrollments for this student from your account.": { - "description": "Confirmation message shown when the user tries to delete a student from their account", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was a problem removing this student from your account. Please check your connection and try again.": "There was a problem removing this student from your account. Please check your connection and try again.", - "@There was a problem removing this student from your account. Please check your connection and try again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Cancel": "Cancel", - "@Cancel": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "next": "Next", - "@next": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "ok": "OK", - "@ok": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Yes": "Yes", - "@Yes": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No": "No", - "@No": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Retry": "Retry", - "@Retry": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Delete": "Delete", - "@Delete": { - "description": "Label used for general delete/remove actions", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Done": "Done", - "@Done": { - "description": "Label for general done/finished actions", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Refresh": "Refresh", - "@Refresh": { - "description": "Label for button to refresh data from the web", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "View Description": "View Description", - "@View Description": { - "description": "Button to view the description for an event or assignment", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "expanded": "expanded", - "@expanded": { - "description": "Description for the accessibility reader for list groups that are expanded", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "collapsed": "collapsed", - "@collapsed": { - "description": "Description for the accessibility reader for list groups that are expanded", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "An unexpected error occurred": "An unexpected error occurred", - "@An unexpected error occurred": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No description": "No description", - "@No description": { - "description": "Message used when the assignment has no description", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Launch External Tool": "Launch External Tool", - "@Launch External Tool": { - "description": "Button text added to webviews to let users open external tools in their browser", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Interactions on this page are limited by your institution.": "Interactions on this page are limited by your institution.", - "@Interactions on this page are limited by your institution.": { - "description": "Message describing how the webview has limited access due to an instution setting", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "dateAtTime": "{date} at {time}", - "@dateAtTime": { - "description": "The string to format dates", - "type": "text", - "placeholders_order": [ - "date", - "time" - ], - "placeholders": { - "date": {}, - "time": {} - } - }, - "dueDateAtTime": "Due {date} at {time}", - "@dueDateAtTime": { - "description": "The string to format due dates", - "type": "text", - "placeholders_order": [ - "date", - "time" - ], - "placeholders": { - "date": {}, - "time": {} - } - }, - "No Due Date": "No Due Date", - "@No Due Date": { - "description": "Label for assignments that do not have a due date", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Filter": "Filter", - "@Filter": { - "description": "Label for buttons to filter what items are visible", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "unread": "unread", - "@unread": { - "description": "Label for things that are marked as unread", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "unreadCount": "{count} unread", - "@unreadCount": { - "description": "Formatted string for when there are a number of unread items", - "type": "text", - "placeholders_order": [ - "count" - ], - "placeholders": { - "count": {} - } - }, - "badgeNumberPlus": "{count}+", - "@badgeNumberPlus": { - "description": "Formatted string for when too many items are being notified in a badge, generally something like: 99+", - "type": "text", - "placeholders_order": [ - "count" - ], - "placeholders": { - "count": {} - } - }, - "There was an error loading this announcement": "There was an error loading this announcement", - "@There was an error loading this announcement": { - "description": "Message shown when an announcement detail screen fails to load", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Network error": "Network error", - "@Network error": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Under Construction": "Under Construction", - "@Under Construction": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "We are currently building this feature for your viewing pleasure.": "We are currently building this feature for your viewing pleasure.", - "@We are currently building this feature for your viewing pleasure.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Request Login Help Button": "Request Login Help Button", - "@Request Login Help Button": { - "description": "Accessibility hint for button that opens help dialog for a login help request", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Request Login Help": "Request Login Help", - "@Request Login Help": { - "description": "Title of help dialog for a login help request", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I'm having trouble logging in": "I'm having trouble logging in", - "@I'm having trouble logging in": { - "description": "Subject of help dialog for a login help request", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "An error occurred when trying to display this link": "An error occurred when trying to display this link", - "@An error occurred when trying to display this link": { - "description": "Error message shown when a link can't be opened", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "We are unable to display this link, it may belong to an institution you currently aren't logged in to.": "We are unable to display this link, it may belong to an institution you currently aren't logged in to.", - "@We are unable to display this link, it may belong to an institution you currently aren't logged in to.": { - "description": "Description for error page shown when clicking a link", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Link Error": "Link Error", - "@Link Error": { - "description": "Title for error page shown when clicking a link", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Open In Browser": "Open In browser", - "@Open In Browser": { - "description": "Text for button to open a link in the browswer", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You'll find the QR code on the web in your account profile. Click 'QR for Mobile Login' in the list.": "You'll find the QR code on the web in your account profile. Click 'QR for Mobile Login' in the list.", - "@You'll find the QR code on the web in your account profile. Click 'QR for Mobile Login' in the list.": { - "description": "Text for qr login tutorial screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Locate QR Code": "Locate QR Code", - "@Locate QR Code": { - "description": "Text for qr login button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Please scan a QR code generated by Canvas": "Please scan a QR code generated by Canvas", - "@Please scan a QR code generated by Canvas": { - "description": "Text for qr login error with incorrect qr code", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error logging in. Please generate another QR Code and try again.": "There was an error logging in. Please generate another QR Code and try again.", - "@There was an error logging in. Please generate another QR Code and try again.": { - "description": "Text for qr login error", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Screenshot showing location of QR code generation in browser": "Screenshot showing location of QR code generation in browser", - "@Screenshot showing location of QR code generation in browser": { - "description": "Content Description for qr login tutorial screenshot", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "QR scanning requires camera access": "QR scanning requires camera access", - "@QR scanning requires camera access": { - "description": "placeholder for camera error for QR code scan", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The linked item is no longer available": "The linked item is no longer available", - "@The linked item is no longer available": { - "description": "error message when the alert could no be opened", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Message sent": "Message sent", - "@Message sent": { - "description": "confirmation message on the screen when the user succesfully sends a message", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Acceptable Use Policy": "Acceptable Use Policy", - "@Acceptable Use Policy": { - "description": "title for the acceptable use policy screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Submit": "Submit", - "@Submit": { - "description": "submit button title for acceptable use policy screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Either you're a new user or the Acceptable Use Policy has changed since you last agreed to it. Please agree to the Acceptable Use Policy before you continue.": "Either you're a new user or the Acceptable Use Policy has changed since you last agreed to it. Please agree to the Acceptable Use Policy before you continue.", - "@Either you're a new user or the Acceptable Use Policy has changed since you last agreed to it. Please agree to the Acceptable Use Policy before you continue.": { - "description": "acceptable use policy screen description", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I agree to the Acceptable Use Policy.": "I agree to the Acceptable Use Policy.", - "@I agree to the Acceptable Use Policy.": { - "description": "acceptable use policy switch title", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "About": "About", - "@About": { - "description": "Title for about menu item in settings", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "App": "App", - "@App": { - "description": "Title for App field on about page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Login ID": "Login ID", - "@Login ID": { - "description": "Title for Login ID field on about page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Email": "Email", - "@Email": { - "description": "Title for Email field on about page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Version": "Version", - "@Version": { - "description": "Title for Version field on about page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - } -} \ No newline at end of file diff --git a/apps/flutter_parent/lib/l10n/res/intl_es.arb b/apps/flutter_parent/lib/l10n/res/intl_es.arb deleted file mode 100644 index 82a7065d8d..0000000000 --- a/apps/flutter_parent/lib/l10n/res/intl_es.arb +++ /dev/null @@ -1,2753 +0,0 @@ -{ - "@@last_modified": "2023-08-25T11:04:20.901151", - "alertsLabel": "Alertas", - "@alertsLabel": { - "description": "The label for the Alerts tab", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "calendarLabel": "Calendario", - "@calendarLabel": { - "description": "The label for the Calendar tab", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "coursesLabel": "Cursos", - "@coursesLabel": { - "description": "The label for the Courses tab", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Students": "No hay estudiantes", - "@No Students": { - "description": "Text for when an observer has no students they are observing", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Tap to show student selector": "Pulse para ver el selector de estudiantes", - "@Tap to show student selector": { - "description": "Semantics label for the area that will show the student selector when tapped", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Tap to pair with a new student": "Pulse para emparejar con un nuevo estudiante", - "@Tap to pair with a new student": { - "description": "Semantics label for the add student button in the student selector", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Tap to select this student": "Pulse para seleccionar este estudiante", - "@Tap to select this student": { - "description": "Semantics label on individual students in the student switcher", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Manage Students": "Administrar estudiantes", - "@Manage Students": { - "description": "Label text for the Manage Students nav drawer button as well as the title for the Manage Students screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Help": "Ayuda", - "@Help": { - "description": "Label text for the help nav drawer button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Log Out": "Cerrar sesión", - "@Log Out": { - "description": "Label text for the Log Out nav drawer button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Switch Users": "Intercambiar usuarios", - "@Switch Users": { - "description": "Label text for the Switch Users nav drawer button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "appVersion": "v. {version}", - "@appVersion": { - "description": "App version shown in the navigation drawer", - "type": "text", - "placeholders_order": [ - "version" - ], - "placeholders": { - "version": {} - } - }, - "Are you sure you want to log out?": "¿Está seguro de que desea salir?", - "@Are you sure you want to log out?": { - "description": "Confirmation message displayed when the user tries to log out", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Calendars": "Calendarios", - "@Calendars": { - "description": "Label for button that lets users select which calendars to display", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "nextMonth": "Próximo mes: {month}", - "@nextMonth": { - "description": "Label for the button that switches the calendar to the next month", - "type": "text", - "placeholders_order": [ - "month" - ], - "placeholders": { - "month": {} - } - }, - "previousMonth": "Mes anterior: {month}", - "@previousMonth": { - "description": "Label for the button that switches the calendar to the previous month", - "type": "text", - "placeholders_order": [ - "month" - ], - "placeholders": { - "month": {} - } - }, - "nextWeek": "La próxima semana comienza el {date}", - "@nextWeek": { - "description": "Label for the button that switches the calendar to the next week", - "type": "text", - "placeholders_order": [ - "date" - ], - "placeholders": { - "date": {} - } - }, - "previousWeek": "La semana anterior comienza el {date}", - "@previousWeek": { - "description": "Label for the button that switches the calendar to the previous week", - "type": "text", - "placeholders_order": [ - "date" - ], - "placeholders": { - "date": {} - } - }, - "selectedMonthLabel": "Mes de {month}", - "@selectedMonthLabel": { - "description": "Accessibility label for the button that expands/collapses the month view", - "type": "text", - "placeholders_order": [ - "month" - ], - "placeholders": { - "month": {} - } - }, - "expand": "expandir", - "@expand": { - "description": "Accessibility label for the on-tap hint for the button that expands/collapses the month view", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "collapse": "colapsar", - "@collapse": { - "description": "Accessibility label for the on-tap hint for the button that expands/collapses the month view", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "pointsPossible": "{points} puntos posibles", - "@pointsPossible": { - "description": "Screen reader label used for the points possible for an assignment, quiz, etc.", - "type": "text", - "placeholders_order": [ - "points" - ], - "placeholders": { - "points": {} - } - }, - "calendarDaySemanticsLabel": "{eventCount,plural, =1{{date}, {eventCount} evento}other{{date}, {eventCount} eventos}}", - "@calendarDaySemanticsLabel": { - "description": "Screen reader label used for calendar day, reads the date and count of events", - "type": "text", - "placeholders_order": [ - "date", - "eventCount" - ], - "placeholders": { - "date": {}, - "eventCount": {} - } - }, - "No Events Today!": "¡No hay ningún evento hoy!", - "@No Events Today!": { - "description": "Title displayed when there are no calendar events for the current day", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "It looks like a great day to rest, relax, and recharge.": "Este parece ser un día excelente para descansar, relajarse y recargar energías.", - "@It looks like a great day to rest, relax, and recharge.": { - "description": "Message displayed when there are no calendar events for the current day", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading your student's calendar": "Hubo un error al cargar el calendario de su estudiante", - "@There was an error loading your student's calendar": { - "description": "Message displayed when calendar events could not be loaded for the current student", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Tap to favorite the courses you want to see on the Calendar. Select up to 10.": "Pulse para marcar los cursos que desea ver en el Calendario como favoritos. Seleccione hasta 10.", - "@Tap to favorite the courses you want to see on the Calendar. Select up to 10.": { - "description": "Description text on calendar filter screen.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You may only choose 10 calendars to display": "Solo puede elegir 10 calendarios para mostrar", - "@You may only choose 10 calendars to display": { - "description": "Error text when trying to select more than 10 calendars", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You must select at least one calendar to display": "Debe seleccionar al menos un calendario para mostrar", - "@You must select at least one calendar to display": { - "description": "Error text when trying to de-select all calendars", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Planner Note": "Nota de la agenda organizadora", - "@Planner Note": { - "description": "Label used for notes in the planner", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Go to today": "Ir a la fecha de hoy", - "@Go to today": { - "description": "Accessibility label used for the today button in the planner", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Previous Logins": "Inicios de sesión anteriores", - "@Previous Logins": { - "description": "Label for the list of previous user logins", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "canvasLogoLabel": "Logotipo de Canvas", - "@canvasLogoLabel": { - "description": "The semantics label for the Canvas logo", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "findSchool": "Buscar escuela", - "@findSchool": { - "description": "Text for the find-my-school button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "findAnotherSchool": "Buscar otra escuela", - "@findAnotherSchool": { - "description": "Text for the find-another-school button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "domainSearchInputHint": "Ingresar el nombre de la escuela o el distrito...", - "@domainSearchInputHint": { - "description": "Input hint for the text box on the domain search screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "noDomainResults": "No se pudieron encontrar escuelas que coincidan con \"{query}\".", - "@noDomainResults": { - "description": "Message shown to users when the domain search query did not return any results", - "type": "text", - "placeholders_order": [ - "query" - ], - "placeholders": { - "query": {} - } - }, - "domainSearchHelpLabel": "¿Cómo encuentro mi escuela o distrito?", - "@domainSearchHelpLabel": { - "description": "Label for the help button on the domain search screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "canvasGuides": "Guías de Canvas", - "@canvasGuides": { - "description": "Proper name for the Canvas Guides. This will be used in the domainSearchHelpBody text and will be highlighted and clickable", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "canvasSupport": "Soporte técnico de Canvas", - "@canvasSupport": { - "description": "Proper name for Canvas Support. This will be used in the domainSearchHelpBody text and will be highlighted and clickable", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "domainSearchHelpBody": "Intente buscar el nombre de la escuela o el distrito al que intenta acceder, como “Smith Private School” o “Smith County Schools”. También puede ingresar directamente a un dominio de Canvas, como “smith.instructure.com”.\n\nA fin de obtener más información sobre cómo encontrar la cuenta de Canvas de su institución, puede visitar {canvasGuides}, comunicarse con {canvasSupport} o ponerse en contacto con su escuela para recibir asistencia.", - "@domainSearchHelpBody": { - "description": "The body text shown in the help dialog on the domain search screen", - "type": "text", - "placeholders_order": [ - "canvasGuides", - "canvasSupport" - ], - "placeholders": { - "canvasGuides": {}, - "canvasSupport": {} - } - }, - "Uh oh!": "¡Ay, no!", - "@Uh oh!": { - "description": "Title of the screen that shows when a crash has occurred", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "We’re not sure what happened, but it wasn’t good. Contact us if this keeps happening.": "No sabemos bien qué sucedió, pero no fue bueno. Comuníquese con nosotros si esto sigue sucediendo.", - "@We’re not sure what happened, but it wasn’t good. Contact us if this keeps happening.": { - "description": "Message shown when a crash has occurred", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Contact Support": "Póngase en contacto con el Soporte Técnico", - "@Contact Support": { - "description": "Label for the button that allows users to contact support after a crash has occurred", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "View error details": "Ver detalles del error", - "@View error details": { - "description": "Label for the button that allowed users to view crash details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Restart app": "Reiniciar aplicación", - "@Restart app": { - "description": "Label for the button that will restart the entire application", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Application version": "Versión de la aplicación", - "@Application version": { - "description": "Label for the application version displayed in the crash details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Device model": "Modelo del dispositivo", - "@Device model": { - "description": "Label for the device model displayed in the crash details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Android OS version": "Versión del SO de Android", - "@Android OS version": { - "description": "Label for the Android operating system version displayed in the crash details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Full error message": "Mensaje de error completo", - "@Full error message": { - "description": "Label for the full error message displayed in the crash details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Inbox": "Bandeja de entrada", - "@Inbox": { - "description": "Title for the Inbox screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading your inbox messages.": "Hubo un error al cargar sus mensajes del buzón de entrada.", - "@There was an error loading your inbox messages.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Subject": "Sin asunto", - "@No Subject": { - "description": "Title used for inbox messages that have no subject", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unable to fetch courses. Please check your connection and try again.": "No se pueden recuperar los cursos. Compruebe su conexión y vuelva a intentarlo.", - "@Unable to fetch courses. Please check your connection and try again.": { - "description": "Message shown when an error occured while loading courses", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Choose a course to message": "Elija un curso para enviar un mensaje", - "@Choose a course to message": { - "description": "Header in the course list shown when the user is choosing which course to associate with a new message", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Inbox Zero": "Bandeja de entrada vacía", - "@Inbox Zero": { - "description": "Title of the message shown when there are no inbox messages", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You’re all caught up!": "¡Ya está al día!", - "@You’re all caught up!": { - "description": "Subtitle of the message shown when there are no inbox messages", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading recipients for this course": "Hubo un error al cargar los destinatarios de este curso", - "@There was an error loading recipients for this course": { - "description": "Message shown when attempting to create a new message but the recipients list failed to load", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unable to send message. Check your connection and try again.": "No se puede enviar el mensaje. Compruebe su conexión y vuelva a intentarlo.", - "@Unable to send message. Check your connection and try again.": { - "description": "Message show when there was an error creating or sending a new message", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unsaved changes": "Cambios no guardados", - "@Unsaved changes": { - "description": "Title of the dialog shown when the user tries to leave with unsaved changes", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Are you sure you wish to close this page? Your unsent message will be lost.": "¿Está seguro de que desea cerrar esta página? Su mensaje no enviado se perderá.", - "@Are you sure you wish to close this page? Your unsent message will be lost.": { - "description": "Body text of the dialog shown when the user tries leave with unsaved changes", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "New message": "Nuevo mensaje", - "@New message": { - "description": "Title of the new-message screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Add attachment": "Agregar adjunto", - "@Add attachment": { - "description": "Tooltip for the add-attachment button in the new-message screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Send message": "Enviar mensaje", - "@Send message": { - "description": "Tooltip for the send-message button in the new-message screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Select recipients": "Seleccionar destinatarios", - "@Select recipients": { - "description": "Tooltip for the button that allows users to select message recipients", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No recipients selected": "No seleccionó ningún destinatario", - "@No recipients selected": { - "description": "Hint displayed when the user has not selected any message recipients", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Message subject": "Asunto del mensaje", - "@Message subject": { - "description": "Hint text displayed in the input field for the message subject", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Message": "Mensaje", - "@Message": { - "description": "Hint text displayed in the input field for the message body", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Recipients": "Destinatarios", - "@Recipients": { - "description": "Label for message recipients", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "plusRecipientCount": "+{count}", - "@plusRecipientCount": { - "description": "Shows the number of recipients that are selected but not displayed on screen.", - "type": "text", - "placeholders_order": [ - "count" - ], - "placeholders": { - "count": { - "example": 5 - } - } - }, - "Failed. Tap for options.": "Se produjo un error. Pulse para ver las opciones.", - "@Failed. Tap for options.": { - "description": "Short message shown on a message attachment when uploading has failed", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "courseForWhom": "para {studentShortName}", - "@courseForWhom": { - "description": "Describes for whom a course is for (i.e. for Bill)", - "type": "text", - "placeholders_order": [ - "studentShortName" - ], - "placeholders": { - "studentShortName": {} - } - }, - "messageLinkPostscript": "Asunto: {studentName}, {linkUrl}", - "@messageLinkPostscript": { - "description": "A postscript appended to new messages that clarifies which student is the subject of the message and also includes a URL for the related Canvas component (course, assignment, event, etc).", - "type": "text", - "placeholders_order": [ - "studentName", - "linkUrl" - ], - "placeholders": { - "studentName": {}, - "linkUrl": {} - } - }, - "There was an error loading this conversation": "Hubo un error al cargar esta conversación", - "@There was an error loading this conversation": { - "description": "Message shown when a conversation fails to load", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Reply": "Respuesta", - "@Reply": { - "description": "Button label for replying to a conversation", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Reply All": "Responder a todos", - "@Reply All": { - "description": "Button label for replying to all conversation participants", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unknown User": "Usuario desconocido", - "@Unknown User": { - "description": "Label used where the user name is not known", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "me": "yo", - "@me": { - "description": "First-person pronoun (i.e. 'me') that will be used in message author info, e.g. 'Me to 4 others' or 'Jon Snow to me'", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "authorToRecipient": "{authorName} a {recipientName}", - "@authorToRecipient": { - "description": "Author info for a single-recipient message; includes both the author name and the recipient name.", - "type": "text", - "placeholders_order": [ - "authorName", - "recipientName" - ], - "placeholders": { - "authorName": {}, - "recipientName": {} - } - }, - "authorToNOthers": "{howMany,plural, =1{{authorName} a 1 otro}other{{authorName} a {howMany} otros}}", - "@authorToNOthers": { - "description": "Author info for a mutli-recipient message; includes the author name and the number of recipients", - "type": "text", - "placeholders_order": [ - "authorName", - "howMany" - ], - "placeholders": { - "authorName": {}, - "howMany": {} - } - }, - "authorToRecipientAndNOthers": "{howMany,plural, =1{{authorName} a {recipientName} y 1 otro}other{{authorName} a {recipientName} y {howMany} otros}}", - "@authorToRecipientAndNOthers": { - "description": "Author info for a multi-recipient message; includes the author name, one recipient name, and the number of other recipients", - "type": "text", - "placeholders_order": [ - "authorName", - "recipientName", - "howMany" - ], - "placeholders": { - "authorName": {}, - "recipientName": {}, - "howMany": {} - } - }, - "Download": "Descargar", - "@Download": { - "description": "Label for the button that will begin downloading a file", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Open with another app": "Abrir con otra aplicación", - "@Open with another app": { - "description": "Label for the button that will allow users to open a file with another app", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There are no installed applications that can open this file": "No hay aplicaciones instaladas que puedan abrir este archivo", - "@There are no installed applications that can open this file": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unsupported File": "Archivo no admitido", - "@Unsupported File": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "This file is unsupported and can’t be viewed through the app": "Este archivo no está admitido y no se puede ver con la aplicación", - "@This file is unsupported and can’t be viewed through the app": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unable to play this media file": "No se puede reproducir este archivo multimedia", - "@Unable to play this media file": { - "description": "Message shown when audio or video media could not be played", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unable to load this image": "No se puede cargar esta imagen", - "@Unable to load this image": { - "description": "Message shown when an image file could not be loaded or displayed", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading this file": "Hubo un error al cargar este archivo", - "@There was an error loading this file": { - "description": "Message shown when a file could not be loaded or displayed", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Courses": "Sin cursos", - "@No Courses": { - "description": "Title for having no courses", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Your student’s courses might not be published yet.": "Es posible que los cursos de sus estudiantes aún no estén publicados.", - "@Your student’s courses might not be published yet.": { - "description": "Message for having no courses", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading your student’s courses.": "Hubo un error al cargar los cursos de su estudiante.", - "@There was an error loading your student’s courses.": { - "description": "Message displayed when the list of student courses could not be loaded", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Grade": "Sin calificación", - "@No Grade": { - "description": "Message shown when there is currently no grade available for a course", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Filter by": "Filtrar según", - "@Filter by": { - "description": "Title for list of terms to filter grades by", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Grades": "Notas", - "@Grades": { - "description": "Label for the \"Grades\" tab in course details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Syllabus": "Programa del curso", - "@Syllabus": { - "description": "Label for the \"Syllabus\" tab in course details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Front Page": "Página de inicio", - "@Front Page": { - "description": "Label for the \"Front Page\" tab in course details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Summary": "Resumen", - "@Summary": { - "description": "Label for the \"Summary\" tab in course details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Send a message about this course": "Enviar un mensaje acerca de este curso", - "@Send a message about this course": { - "description": "Accessibility hint for the course messaage floating action button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Total Grade": "Calificación total", - "@Total Grade": { - "description": "Label for the total grade in the course", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Graded": "Calificado", - "@Graded": { - "description": "Label for assignments that have been graded", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Submitted": "Entregado", - "@Submitted": { - "description": "Label for assignments that have been submitted", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Not Submitted": "No entregado", - "@Not Submitted": { - "description": "Label for assignments that have not been submitted", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Late": "Atrasado", - "@Late": { - "description": "Label for assignments that have been marked late or submitted late", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Missing": "Faltante", - "@Missing": { - "description": "Label for assignments that have been marked missing or are not submitted and past the due date", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "-": "-", - "@-": { - "description": "Value representing no score for student submission", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "All Grading Periods": "Todos los períodos de calificación", - "@All Grading Periods": { - "description": "Label for selecting all grading periods", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Assignments": "No hay tareas", - "@No Assignments": { - "description": "Title for the no assignments message", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "It looks like assignments haven't been created in this space yet.": "Parece que aún no se han creado tareas en este espacio.", - "@It looks like assignments haven't been created in this space yet.": { - "description": "Message for no assignments", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading the summary details for this course.": "Hubo un error al cargar los detalles del resumen de este curso.", - "@There was an error loading the summary details for this course.": { - "description": "Message shown when the course summary could not be loaded", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Summary": "Sin resumen", - "@No Summary": { - "description": "Title displayed when there are no items in the course summary", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "This course does not have any assignments or calendar events yet.": "Este curso aún no tiene ninguna tarea ni eventos en el calendario.", - "@This course does not have any assignments or calendar events yet.": { - "description": "Message displayed when there are no items in the course summary", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "gradeFormatScoreOutOfPointsPossible": "{score} / {pointsPossible}", - "@gradeFormatScoreOutOfPointsPossible": { - "description": "Formatted string for a student score out of the points possible", - "type": "text", - "placeholders_order": [ - "score", - "pointsPossible" - ], - "placeholders": { - "score": {}, - "pointsPossible": {} - } - }, - "contentDescriptionScoreOutOfPointsPossible": "{score} de {pointsPossible} puntos", - "@contentDescriptionScoreOutOfPointsPossible": { - "description": "Formatted string for a student score out of the points possible", - "type": "text", - "placeholders_order": [ - "score", - "pointsPossible" - ], - "placeholders": { - "score": {}, - "pointsPossible": {} - } - }, - "gradesSubjectMessage": "Asunto: {studentName}, Calificaciones", - "@gradesSubjectMessage": { - "description": "The subject line for a message to a teacher regarding a student's grades", - "type": "text", - "placeholders_order": [ - "studentName" - ], - "placeholders": { - "studentName": {} - } - }, - "syllabusSubjectMessage": "Asunto: {studentName}, Programa del curso", - "@syllabusSubjectMessage": { - "description": "The subject line for a message to a teacher regarding a course syllabus", - "type": "text", - "placeholders_order": [ - "studentName" - ], - "placeholders": { - "studentName": {} - } - }, - "frontPageSubjectMessage": "Asunto: {studentName}, Página de inicio", - "@frontPageSubjectMessage": { - "description": "The subject line for a message to a teacher regarding a course front page", - "type": "text", - "placeholders_order": [ - "studentName" - ], - "placeholders": { - "studentName": {} - } - }, - "assignmentSubjectMessage": "Asunto: {studentName}, Tarea: {assignmentName}", - "@assignmentSubjectMessage": { - "description": "The subject line for a message to a teacher regarding a student's assignment", - "type": "text", - "placeholders_order": [ - "studentName", - "assignmentName" - ], - "placeholders": { - "studentName": {}, - "assignmentName": {} - } - }, - "eventSubjectMessage": "Asunto: {studentName}, Evento: {eventTitle}", - "@eventSubjectMessage": { - "description": "The subject line for a message to a teacher regarding a calendar event", - "type": "text", - "placeholders_order": [ - "studentName", - "eventTitle" - ], - "placeholders": { - "studentName": {}, - "eventTitle": {} - } - }, - "There is no page information available.": "No hay información disponible de la página.", - "@There is no page information available.": { - "description": "Description for when no page information is available", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Assignment Details": "Detalles de la tarea", - "@Assignment Details": { - "description": "Title for the page that shows details for an assignment", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "assignmentTotalPoints": "{points} ptos.", - "@assignmentTotalPoints": { - "description": "Label used for the total points the assignment is worth", - "type": "text", - "placeholders_order": [ - "points" - ], - "placeholders": { - "points": {} - } - }, - "assignmentTotalPointsAccessible": "{points} puntos", - "@assignmentTotalPointsAccessible": { - "description": "Screen reader label used for the total points the assignment is worth", - "type": "text", - "placeholders_order": [ - "points" - ], - "placeholders": { - "points": {} - } - }, - "Due": "Fecha de entrega", - "@Due": { - "description": "Label for an assignment due date", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Grade": "Calificación", - "@Grade": { - "description": "Label for the section that displays an assignment's grade", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Locked": "Bloqueado", - "@Locked": { - "description": "Label for when an assignment is locked", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "assignmentLockedModule": "Esta tarea está bloqueada por el módulo \"{moduleName}\".", - "@assignmentLockedModule": { - "description": "The locked description when an assignment is locked by a module", - "type": "text", - "placeholders_order": [ - "moduleName" - ], - "placeholders": { - "moduleName": {} - } - }, - "Remind Me": "Recordármelo", - "@Remind Me": { - "description": "Label for the row to set reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Set a date and time to be notified of this specific assignment.": "Establecer una fecha y un horario para que se me notifique esta tarea específica.", - "@Set a date and time to be notified of this specific assignment.": { - "description": "Description for row to set reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You will be notified about this assignment on…": "Se le notificará acerca de esta tarea el...", - "@You will be notified about this assignment on…": { - "description": "Description for when a reminder is set", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Instructions": "Instrucciones", - "@Instructions": { - "description": "Label for the description of the assignment when it has quiz instructions", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Send a message about this assignment": "Enviar un mensaje acerca de esta tarea", - "@Send a message about this assignment": { - "description": "Accessibility hint for the assignment messaage floating action button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "This app is not authorized for use.": "Esta aplicación no está autorizada para usarse.", - "@This app is not authorized for use.": { - "description": "The error shown when the app being used is not verified by Canvas", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The server you entered is not authorized for this app.": "El servidor ingresado no está autorizado para esta aplicación.", - "@The server you entered is not authorized for this app.": { - "description": "The error shown when the desired login domain is not verified by Canvas", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The user agent for this app is not authorized.": "El agente de usuario de esta aplicación no está autorizado.", - "@The user agent for this app is not authorized.": { - "description": "The error shown when the user agent during verification is not verified by Canvas", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "We were unable to verify the server for use with this app.": "No pudimos verificar el servidor para su uso con esta aplicación.", - "@We were unable to verify the server for use with this app.": { - "description": "The generic error shown when we are unable to verify with Canvas", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Reminders": "Recordatorios", - "@Reminders": { - "description": "Name of the system notification channel for assignment and event reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Notifications for reminders about assignments and calendar events": "Notificaciones de recordatorios de tareas y eventos en el calendario", - "@Notifications for reminders about assignments and calendar events": { - "description": "Description of the system notification channel for assignment and event reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Reminders have changed!": "¡Se cambiaron los recordatorios!", - "@Reminders have changed!": { - "description": "Title of the dialog shown when the user needs to update their reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "In order to provide you with a better experience, we have updated how reminders work. You can add new reminders by viewing an assignment or calendar event and tapping the switch under the \"Remind Me\" section.\n\nBe aware that any reminders created with older versions of this app will not be compatible with the new changes and you will need to create them again.": "Para brindarle una mejor experiencia, hemos actualizado el funcionamiento de los recordatorios. Para agregar nuevos recordatorios, vea una tarea o evento del calendario y pulse el botón en la sección \"Recordarme\" (\"Remind Me\").\n\nTenga presente que cualquier recordatorio creado con versiones anteriores de esta aplicación no será compatible con los nuevos cambios, y deberá volver a crearlo.", - "@In order to provide you with a better experience, we have updated how reminders work. You can add new reminders by viewing an assignment or calendar event and tapping the switch under the \"Remind Me\" section.\n\nBe aware that any reminders created with older versions of this app will not be compatible with the new changes and you will need to create them again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Not a parent?": "¿No es padre?", - "@Not a parent?": { - "description": "Title for the screen that shows when the user is not observing any students", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "We couldn't find any students associated with this account": "No pudimos encontrar ningún estudiante relacionado con esta cuenta", - "@We couldn't find any students associated with this account": { - "description": "Subtitle for the screen that shows when the user is not observing any students", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Are you a student or teacher?": "¿Es estudiante o profesor?", - "@Are you a student or teacher?": { - "description": "Label for button that will show users the option to view other Canvas apps in the Play Store", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "One of our other apps might be a better fit. Tap one to visit the Play Store.": "Una de nuestras otras aplicaciones podría ser más adecuada. Toque una para visitar la Play Store.", - "@One of our other apps might be a better fit. Tap one to visit the Play Store.": { - "description": "Description of options to view other Canvas apps in the Play Store", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Return to Login": "Volver al inicio de sesión", - "@Return to Login": { - "description": "Label for the button that returns the user to the login screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "STUDENT": "ESTUDIANTE", - "@STUDENT": { - "description": "The \"student\" portion of the \"Canvas Student\" app name, in all caps. \"Canvas\" is excluded in this context as it will be displayed to the user as a wordmark image", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "TEACHER": "PROFESOR", - "@TEACHER": { - "description": "The \"teacher\" portion of the \"Canvas Teacher\" app name, in all caps. \"Canvas\" is excluded in this context as it will be displayed to the user as a wordmark image", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Canvas Student": "Estudiante de Canvas", - "@Canvas Student": { - "description": "The name of the Canvas Student app. Only \"Student\" should be translated as \"Canvas\" is a brand name in this context and should not be translated.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Canvas Teacher": "Canvas Teacher", - "@Canvas Teacher": { - "description": "The name of the Canvas Teacher app. Only \"Teacher\" should be translated as \"Canvas\" is a brand name in this context and should not be translated.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Alerts": "Sin alertas", - "@No Alerts": { - "description": "The title for the empty message to show to users when there are no alerts for the student.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There’s nothing to be notified of yet.": "Aún no hay ninguna notificación.", - "@There’s nothing to be notified of yet.": { - "description": "The empty message to show to users when there are no alerts for the student.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "dismissAlertLabel": "Descartar {alertTitle}", - "@dismissAlertLabel": { - "description": "Accessibility label to dismiss an alert", - "type": "text", - "placeholders_order": [ - "alertTitle" - ], - "placeholders": { - "alertTitle": {} - } - }, - "Course Announcement": "Anuncio del curso", - "@Course Announcement": { - "description": "Title for alerts when there is a course announcement", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Institution Announcement": "Anuncio de la institución", - "@Institution Announcement": { - "description": "Title for alerts when there is an institution announcement", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "assignmentGradeAboveThreshold": "Calificación de la tarea superior a {threshold}", - "@assignmentGradeAboveThreshold": { - "description": "Title for alerts when an assignment grade is above the threshold value", - "type": "text", - "placeholders_order": [ - "threshold" - ], - "placeholders": { - "threshold": {} - } - }, - "assignmentGradeBelowThreshold": "Calificación de la tarea inferior a {threshold}", - "@assignmentGradeBelowThreshold": { - "description": "Title for alerts when an assignment grade is below the threshold value", - "type": "text", - "placeholders_order": [ - "threshold" - ], - "placeholders": { - "threshold": {} - } - }, - "courseGradeAboveThreshold": "Calificación del curso superior a {threshold}", - "@courseGradeAboveThreshold": { - "description": "Title for alerts when a course grade is above the threshold value", - "type": "text", - "placeholders_order": [ - "threshold" - ], - "placeholders": { - "threshold": {} - } - }, - "courseGradeBelowThreshold": "Calificación del curso inferior a {threshold}", - "@courseGradeBelowThreshold": { - "description": "Title for alerts when a course grade is below the threshold value", - "type": "text", - "placeholders_order": [ - "threshold" - ], - "placeholders": { - "threshold": {} - } - }, - "Settings": "Configuraciones", - "@Settings": { - "description": "Title for the settings screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Theme": "Tema", - "@Theme": { - "description": "Label for the light/dark theme section in the settings page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Dark Mode": "Modo oscuro", - "@Dark Mode": { - "description": "Label for the button that enables dark mode", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Light Mode": "Modo claro", - "@Light Mode": { - "description": "Label for the button that enables light mode", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "High Contrast Mode": "Modo de alto contraste", - "@High Contrast Mode": { - "description": "Label for the switch that toggles high contrast mode", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Use Dark Theme in Web Content": "Usar tema oscuro en el contenido web", - "@Use Dark Theme in Web Content": { - "description": "Label for the switch that toggles dark mode for webviews", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Appearance": "Apariencia", - "@Appearance": { - "description": "Label for the appearance section in the settings page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Successfully submitted!": "¡Enviada correctamente!", - "@Successfully submitted!": { - "description": "Title displayed in the grade cell for an assignment that has been submitted", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "submissionStatusSuccessSubtitle": "Esta tarea se envió el {date} a las {time} y está a la espera de su calificación", - "@submissionStatusSuccessSubtitle": { - "description": "Subtitle displayed in the grade cell for an assignment that has been submitted and is awaiting a grade", - "type": "text", - "placeholders_order": [ - "date", - "time" - ], - "placeholders": { - "date": {}, - "time": {} - } - }, - "outOfPoints": "{howMany,plural, =1{De 1 punto}other{De {points} puntos}}", - "@outOfPoints": { - "description": "Description for an assignment grade that has points without a current scoroe", - "type": "text", - "placeholders_order": [ - "points", - "howMany" - ], - "placeholders": { - "points": {}, - "howMany": {} - } - }, - "Excused": "Justificado", - "@Excused": { - "description": "Grading status for an assignment marked as excused", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Complete": "Completo/a", - "@Complete": { - "description": "Grading status for an assignment marked as complete", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Incomplete": "Incompleta", - "@Incomplete": { - "description": "Grading status for an assignment marked as incomplete", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "minus": "menos", - "@minus": { - "description": "Screen reader-friendly replacement for the \"-\" character in letter grades like \"A-\"", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "latePenalty": "Sanción por presentación con atraso (-{pointsLost})", - "@latePenalty": { - "description": "Text displayed when a late penalty has been applied to the assignment", - "type": "text", - "placeholders_order": [ - "pointsLost" - ], - "placeholders": { - "pointsLost": {} - } - }, - "finalGrade": "Calificación final: {grade}", - "@finalGrade": { - "description": "Text that displays the final grade of an assignment", - "type": "text", - "placeholders_order": [ - "grade" - ], - "placeholders": { - "grade": {} - } - }, - "Alert Settings": "Configuraciones de alertas", - "@Alert Settings": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Alert me when…": "Enviarme una alerta cuando...", - "@Alert me when…": { - "description": "Header for the screen where the observer chooses the thresholds that will determine when they receive alerts (e.g. when an assignment is graded below 70%)", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Course grade below": "Calificación del curso inferior a", - "@Course grade below": { - "description": "Label describing the threshold for when the course grade is below a certain percentage", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Course grade above": "Calificación del curso superior a", - "@Course grade above": { - "description": "Label describing the threshold for when the course grade is above a certain percentage", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Assignment missing": "Tarea faltante", - "@Assignment missing": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Assignment grade below": "Calificación de la tarea inferior a", - "@Assignment grade below": { - "description": "Label describing the threshold for when an assignment is graded below a certain percentage", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Assignment grade above": "Calificación de la tarea superior a", - "@Assignment grade above": { - "description": "Label describing the threshold for when an assignment is graded above a certain percentage", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Course Announcements": "Anuncios del curso", - "@Course Announcements": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Institution Announcements": "Anuncios de la institución", - "@Institution Announcements": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Never": "Nunca", - "@Never": { - "description": "Indication that tells the user they will not receive alert notifications of a specific kind", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Grade percentage": "Porcentaje de calificación", - "@Grade percentage": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading your student's alerts.": "Hubo un error al cargar las alertas de sus estudiantes.", - "@There was an error loading your student's alerts.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Must be below 100": "Debe ser inferior a 100", - "@Must be below 100": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "mustBeBelowN": "Debe ser inferior a {percentage}", - "@mustBeBelowN": { - "description": "Validation error to the user that they must choose a percentage below 'n'", - "type": "text", - "placeholders_order": [ - "percentage" - ], - "placeholders": { - "percentage": { - "example": 5 - } - } - }, - "mustBeAboveN": "Debe ser superior a {percentage}", - "@mustBeAboveN": { - "description": "Validation error to the user that they must choose a percentage above 'n'", - "type": "text", - "placeholders_order": [ - "percentage" - ], - "placeholders": { - "percentage": { - "example": 5 - } - } - }, - "Select Student Color": "Seleccionar color del estudiante", - "@Select Student Color": { - "description": "Title for screen that allows users to assign a color to a specific student", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Electric, blue": "Azul eléctrico", - "@Electric, blue": { - "description": "Name of the Electric (blue) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Plum, Purple": "Morado tipo ciruela", - "@Plum, Purple": { - "description": "Name of the Plum (purple) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Barney, Fuschia": "Fucsia tipo Barney", - "@Barney, Fuschia": { - "description": "Name of the Barney (fuschia) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Raspberry, Red": "Rojo tipo mora", - "@Raspberry, Red": { - "description": "Name of the Raspberry (red) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Fire, Orange": "Naranja tipo fuego", - "@Fire, Orange": { - "description": "Name of the Fire (orange) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Shamrock, Green": "Verde tipo trébol", - "@Shamrock, Green": { - "description": "Name of the Shamrock (green) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "An error occurred while saving your selection. Please try again.": "Ocurrió un error al guardar su selección. Inténtelo de nuevo.", - "@An error occurred while saving your selection. Please try again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "changeStudentColorLabel": "Cambiar color para {studentName}", - "@changeStudentColorLabel": { - "description": "Accessibility label for the button that lets users change the color associated with a specific student", - "type": "text", - "placeholders_order": [ - "studentName" - ], - "placeholders": { - "studentName": {} - } - }, - "Teacher": "Profesor", - "@Teacher": { - "description": "Label for the Teacher enrollment type", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Student": "Estudiante", - "@Student": { - "description": "Label for the Student enrollment type", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "TA": "Profesor asistente", - "@TA": { - "description": "Label for the Teaching Assistant enrollment type (also known as Teacher Aid or Education Assistant), reduced to a short acronym/initialism if appropriate.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Observer": "Observador", - "@Observer": { - "description": "Label for the Observer enrollment type", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Use Camera": "Usar cámara", - "@Use Camera": { - "description": "Label for the action item that lets the user capture a photo using the device camera", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Upload File": "Cargar archivo", - "@Upload File": { - "description": "Label for the action item that lets the user upload a file from their device", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Choose from Gallery": "Elegir de la galería", - "@Choose from Gallery": { - "description": "Label for the action item that lets the user select a photo from their device gallery", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Preparing…": "En preparación...", - "@Preparing…": { - "description": "Message shown while a file is being prepared to attach to a message", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Add student with…": "Agregar estudiante con...", - "@Add student with…": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Add Student": "Agregar estudiante", - "@Add Student": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You are not observing any students.": "No está observando a ningún estudiante.", - "@You are not observing any students.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading your students.": "Hubo un error al cargar sus estudiantes.", - "@There was an error loading your students.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Pairing Code": "Código de emparejamiento", - "@Pairing Code": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Students can obtain a pairing code through the Canvas website": "Los estudiantes pueden obtener un código de emparejamiento a través del sitio web de Canvas", - "@Students can obtain a pairing code through the Canvas website": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Enter the student pairing code provided to you. If the pairing code doesn't work, it may have expired": "Ingrese el código de emparejamiento de estudiantes que se le proporcionó. Si el código de emparejamiento no funciona, es posible que haya caducado", - "@Enter the student pairing code provided to you. If the pairing code doesn't work, it may have expired": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Your code is incorrect or expired.": "Su código es incorrecto o ha caducado.", - "@Your code is incorrect or expired.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Something went wrong trying to create your account, please reach out to your school for assistance.": "Algo salió mal al intentar crear su cuenta; comuníquese con su escuela para obtener asistencia.", - "@Something went wrong trying to create your account, please reach out to your school for assistance.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "QR Code": "Código QR", - "@QR Code": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Students can create a QR code using the Canvas Student app on their mobile device": "Los estudiantes pueden crear un código QR mediante la aplicación Canvas Student en sus dispositivos móviles", - "@Students can create a QR code using the Canvas Student app on their mobile device": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Add new student": "Agregar nuevo estudiante", - "@Add new student": { - "description": "Semantics label for the FAB on the Manage Students Screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Select": "Seleccionar", - "@Select": { - "description": "Hint text to tell the user to choose one of two options", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I have a Canvas account": "Tengo una cuenta de Canvas", - "@I have a Canvas account": { - "description": "Option to select for users that have a canvas account", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I don't have a Canvas account": "No tengo cuenta de Canvas", - "@I don't have a Canvas account": { - "description": "Option to select for users that don't have a canvas account", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Create Account": "Crear cuenta", - "@Create Account": { - "description": "Button text for account creation confirmation", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Full Name": "Nombre completo", - "@Full Name": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Email Address": "Dirección de correo electrónico", - "@Email Address": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Password": "Contraseña", - "@Password": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Full Name…": "Nombre completo…", - "@Full Name…": { - "description": "hint label for inside form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Email…": "Correo electrónico…", - "@Email…": { - "description": "hint label for inside form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Password…": "Contraseña…", - "@Password…": { - "description": "hint label for inside form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Please enter full name": "Ingrese el nombre completo", - "@Please enter full name": { - "description": "Error message for form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Please enter an email address": "Ingrese una dirección de correo electrónico", - "@Please enter an email address": { - "description": "Error message for form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Please enter a valid email address": "Ingrese una dirección de correo electrónico válida", - "@Please enter a valid email address": { - "description": "Error message for form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Password is required": "La contraseña es obligatoria", - "@Password is required": { - "description": "Error message for form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Password must contain at least 8 characters": "La contraseña debe contener 8 caracteres como mínimo", - "@Password must contain at least 8 characters": { - "description": "Error message for form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "qrCreateAccountTos": "Al pulsar en ‘Crear cuenta’ (Create Account), acepta los {termsOfService} y la {privacyPolicy}", - "@qrCreateAccountTos": { - "description": "The text show on the account creation screen", - "type": "text", - "placeholders_order": [ - "termsOfService", - "privacyPolicy" - ], - "placeholders": { - "termsOfService": {}, - "privacyPolicy": {} - } - }, - "Terms of Service": "Términos de servicio", - "@Terms of Service": { - "description": "Label for the Canvas Terms of Service agreement. This will be used in the qrCreateAccountTos text and will be highlighted and clickable", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Privacy Policy": "Política de privacidad", - "@Privacy Policy": { - "description": "Label for the Canvas Privacy Policy agreement. This will be used in the qrCreateAccountTos text and will be highlighted and clickable", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "View the Privacy Policy": "Ver la Política de privacidad", - "@View the Privacy Policy": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Already have an account? ": "¿Ya tiene una cuenta? ", - "@Already have an account? ": { - "description": "Part of multiline text span, includes AccountSignIn1-2, in that order", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Sign In": "Iniciar sesión", - "@Sign In": { - "description": "Part of multiline text span, includes AccountSignIn1-2, in that order", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Hide Password": "Ocultar contraseña", - "@Hide Password": { - "description": "content description for password hide button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Show Password": "Mostrar contraseña", - "@Show Password": { - "description": "content description for password show button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Terms of Service Link": "Enlace a los términos de servicio", - "@Terms of Service Link": { - "description": "content description for terms of service link", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Privacy Policy Link": "Enlace a la política de privacidad", - "@Privacy Policy Link": { - "description": "content description for privacy policy link", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Event": "Evento", - "@Event": { - "description": "Title for the event details screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Date": "Fecha", - "@Date": { - "description": "Label for the event date", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Location": "Ubicación", - "@Location": { - "description": "Label for the location information", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Location Specified": "Sin ubicación especificada", - "@No Location Specified": { - "description": "Description for events that do not have a location", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "eventTime": "{startAt} - {endAt}", - "@eventTime": { - "description": "The time the event is happening, example: \"2:00 pm - 4:00 pm\"", - "type": "text", - "placeholders_order": [ - "startAt", - "endAt" - ], - "placeholders": { - "startAt": {}, - "endAt": {} - } - }, - "Set a date and time to be notified of this event.": "Establecer una fecha y un horario para que se me notifique este evento.", - "@Set a date and time to be notified of this event.": { - "description": "Description for row to set event reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You will be notified about this event on…": "Se le notificará acerca de este evento el...", - "@You will be notified about this event on…": { - "description": "Description for when an event reminder is set", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Share Your Love for the App": "Comparta su amor por la aplicación", - "@Share Your Love for the App": { - "description": "Label for option to open the app store", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Tell us about your favorite parts of the app": "Cuéntenos sobre sus partes favoritas de la aplicación", - "@Tell us about your favorite parts of the app": { - "description": "Description for option to open the app store", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Legal": "Legal", - "@Legal": { - "description": "Label for legal information option", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Privacy policy, terms of use, open source": "Política de privacidad, términos de uso, código abierto", - "@Privacy policy, terms of use, open source": { - "description": "Description for legal information option", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Idea for Canvas Parent App [Android]": "Ideas para la aplicación de Canvas Parent [Android]", - "@Idea for Canvas Parent App [Android]": { - "description": "The subject for the email to request a feature", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The following information will help us better understand your idea:": "La siguiente información nos ayudará a comprender mejor su idea:", - "@The following information will help us better understand your idea:": { - "description": "The header for the users information that is attached to a feature request", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Domain:": "Dominio:", - "@Domain:": { - "description": "The label for the Canvas domain of the logged in user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "User ID:": "Identificación del usuario:", - "@User ID:": { - "description": "The label for the Canvas user ID of the logged in user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Email:": "Correo electrónico:", - "@Email:": { - "description": "The label for the eamil of the logged in user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Locale:": "Lugar:", - "@Locale:": { - "description": "The label for the locale of the logged in user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Terms of Use": "Términos de uso", - "@Terms of Use": { - "description": "Label for the terms of use", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Canvas on GitHub": "Canvas en GitHub", - "@Canvas on GitHub": { - "description": "Label for the button that opens the Canvas project on GitHub's website", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was a problem loading the Terms of Use": "Hubo un problema al cargar los Términos de uso", - "@There was a problem loading the Terms of Use": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Device": "Dispositivo", - "@Device": { - "description": "Label used for device manufacturer/model in the error report", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "OS Version": "Versión del SO", - "@OS Version": { - "description": "Label used for device operating system version in the error report", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Version Number": "Número de versión", - "@Version Number": { - "description": "Label used for the app version number in the error report", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Report A Problem": "Reportar un problema", - "@Report A Problem": { - "description": "Title used for generic dialog to report problems", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Subject": "Asunto", - "@Subject": { - "description": "Label used for Subject text field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "A subject is required.": "El asunto es obligatorio.", - "@A subject is required.": { - "description": "Error shown when the subject field is empty", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "An email address is required.": "La dirección de correo electrónico es obligatoria.", - "@An email address is required.": { - "description": "Error shown when the email field is empty", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Description": "Descripción", - "@Description": { - "description": "Label used for Description text field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "A description is required.": "La descripción es obligatoria.", - "@A description is required.": { - "description": "Error shown when the description field is empty", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "How is this affecting you?": "¿Cómo le afecta esto?", - "@How is this affecting you?": { - "description": "Label used for the dropdown to select how severe the issue is", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "send": "enviar", - "@send": { - "description": "Label used for send button when reporting a problem", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Just a casual question, comment, idea, suggestion…": "Sólo una pregunta, comentario, idea, sugerencia casual...", - "@Just a casual question, comment, idea, suggestion…": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I need some help but it's not urgent.": "Necesito un poco de ayuda, pero no es urgente.", - "@I need some help but it's not urgent.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Something's broken but I can work around it to get what I need done.": "Algo no funciona pero puedo trabajar sin ello para terminar lo que necesito.", - "@Something's broken but I can work around it to get what I need done.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I can't get things done until I hear back from you.": "No puedo terminar mis asuntos hasta que reciba una respuesta suya.", - "@I can't get things done until I hear back from you.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "EXTREME CRITICAL EMERGENCY!!": "EMERGENCIA CRÍTICA", - "@EXTREME CRITICAL EMERGENCY!!": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Not Graded": "Sin calificar", - "@Not Graded": { - "description": "Description for an assignment has not been graded.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Login flow: Normal": "Flujo de inicio de sesión: Normal", - "@Login flow: Normal": { - "description": "Description for the normal login flow", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Login flow: Canvas": "Flujo de inicio de sesión: Canvas", - "@Login flow: Canvas": { - "description": "Description for the Canvas login flow", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Login flow: Site Admin": "Flujo de inicio de sesión: Administrador del sitio", - "@Login flow: Site Admin": { - "description": "Description for the Site Admin login flow", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Login flow: Skip mobile verify": "Flujo de inicio de sesión: Saltear verificación móvil", - "@Login flow: Skip mobile verify": { - "description": "Description for the login flow that skips domain verification for mobile", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Act As User": "Actuar en nombre de Usuario", - "@Act As User": { - "description": "Label for the button that allows the user to act (masquerade) as another user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Stop Acting as User": "Dejar de actuar en nombre de Usuario", - "@Stop Acting as User": { - "description": "Label for the button that allows the user to stop acting (masquerading) as another user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "actingAsUser": "Está actuando en nombre de {userName}", - "@actingAsUser": { - "description": "Message shown while acting (masquerading) as another user", - "type": "text", - "placeholders_order": [ - "userName" - ], - "placeholders": { - "userName": {} - } - }, - "\"Act as\" is essentially logging in as this user without a password. You will be able to take any action as if you were this user, and from other users' points of views, it will be as if this user performed them. However, audit logs record that you were the one who performed the actions on behalf of this user.": "\"Actuar en nombre de\" es esencialmente iniciar sesión como este usuario sin una contraseña. Podrá realizar cualquier acción como si fuera este usuario y, desde el punto de vista de los demás usuarios, será como si este usuario las hubiera realizado. Sin embargo, los registros de auditoría indican que usted es quien realizó las acciones en representación de este usuario.", - "@\"Act as\" is essentially logging in as this user without a password. You will be able to take any action as if you were this user, and from other users' points of views, it will be as if this user performed them. However, audit logs record that you were the one who performed the actions on behalf of this user.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Domain": "Dominio", - "@Domain": { - "description": "Text field hint for domain url input", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You must enter a valid domain": "Debe ingresar un dominio válido", - "@You must enter a valid domain": { - "description": "Message displayed for domain input error", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "User ID": "Identificación de usuario", - "@User ID": { - "description": "Text field hint for user ID input", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You must enter a user id": "Debe ingresar una identificación de usuario", - "@You must enter a user id": { - "description": "Message displayed for user Id input error", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error trying to act as this user. Please check the Domain and User ID and try again.": "Hubo un error al intentar actuar en nombre de este usuario. Revise el dominio y la identificación de usuario y vuelva a intentarlo.", - "@There was an error trying to act as this user. Please check the Domain and User ID and try again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "endMasqueradeMessage": "Dejará de actuar en nombre de {userName} y regresará a su cuenta original.", - "@endMasqueradeMessage": { - "description": "Confirmation message displayed when the user wants to stop acting (masquerading) as another user", - "type": "text", - "placeholders_order": [ - "userName" - ], - "placeholders": { - "userName": {} - } - }, - "endMasqueradeLogoutMessage": "Dejará de actuar en nombre de {userName} y cerrará la sesión.", - "@endMasqueradeLogoutMessage": { - "description": "Confirmation message displayed when the user wants to stop acting (masquerading) as another user and will be logged out.", - "type": "text", - "placeholders_order": [ - "userName" - ], - "placeholders": { - "userName": {} - } - }, - "How are we doing?": "¿Cómo está?", - "@How are we doing?": { - "description": "Title for dialog asking user to rate the app out of 5 stars.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Don't show again": "No mostrar nuevamente", - "@Don't show again": { - "description": "Button to prevent the rating dialog from showing again.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "What can we do better?": "¿Qué podemos mejorar?", - "@What can we do better?": { - "description": "Hint text for providing a comment with the rating.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Send Feedback": "Enviar retroalimentación", - "@Send Feedback": { - "description": "Button to send rating with feedback", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "ratingDialogEmailSubject": "Sugerencias para Android: Canvas Parent {version}", - "@ratingDialogEmailSubject": { - "description": "The subject for an email to provide feedback for CanvasParent.", - "type": "text", - "placeholders_order": [ - "version" - ], - "placeholders": { - "version": {} - } - }, - "starRating": "{position,plural, =1{{position} estrella}other{{position} estrellas}}", - "@starRating": { - "description": "Accessibility label for the 1 stars to 5 stars rating", - "type": "text", - "placeholders_order": [ - "position" - ], - "placeholders": { - "position": { - "example": 1 - } - } - }, - "Student Pairing": "Emparejamiento del estudiante", - "@Student Pairing": { - "description": "Title for the screen where users can pair to students using a QR code", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Open Canvas Student": "Abrir Canvas Student", - "@Open Canvas Student": { - "description": "Title for QR pairing tutorial screen instructing users to open the Canvas Student app", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You'll need to open your student's Canvas Student app to continue. Go into Main Menu > Settings > Pair with Observer and scan the QR code you see there.": "Para continuar, debe abrir la aplicación Canvas Student de su estudiante. Diríjase a Menú Principal > Configuraciones > Emparejar con Observador (Main Menu > Settings > Pair with Observer) y escanee el código QR que aparece allí.", - "@You'll need to open your student's Canvas Student app to continue. Go into Main Menu > Settings > Pair with Observer and scan the QR code you see there.": { - "description": "Message explaining how QR code pairing works", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Screenshot showing location of pairing QR code generation in the Canvas Student app": "Captura de pantalla en la que se muestra la ubicación de la generación del código QR de emparejamiento en la aplicación Canvas Student", - "@Screenshot showing location of pairing QR code generation in the Canvas Student app": { - "description": "Content Description for qr pairing tutorial screenshot", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Expired QR Code": "Código QR vencido", - "@Expired QR Code": { - "description": "Error title shown when the users scans a QR code that has expired", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The QR code you scanned may have expired. Refresh the code on the student's device and try again.": "Es posible que el código QR que escaneó haya vencido. Actualice el código en el dispositivo del estudiante y vuelva a intentarlo.", - "@The QR code you scanned may have expired. Refresh the code on the student's device and try again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "A network error occurred when adding this student. Check your connection and try again.": "Hubo un error de la red al agregar a este estudiante. Compruebe su conexión y vuelva a intentarlo.", - "@A network error occurred when adding this student. Check your connection and try again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Invalid QR Code": "Código QR inválido", - "@Invalid QR Code": { - "description": "Error title shown when the user scans an invalid QR code", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Incorrect Domain": "Dominio incorrecto", - "@Incorrect Domain": { - "description": "Error title shown when the users scane a QR code for a student that belongs to a different domain", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The student you are trying to add belongs to a different school. Log in or create an account with that school to scan this code.": "El estudiante que está intentando agregar pertenece a una escuela diferente. Inicie sesión o cree una cuenta con esa escuela para escanear el código.", - "@The student you are trying to add belongs to a different school. Log in or create an account with that school to scan this code.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Camera Permission": "Permiso de la cámara", - "@Camera Permission": { - "description": "Error title shown when the user wans to scan a QR code but has denied the camera permission", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "This will unpair and remove all enrollments for this student from your account.": "Deshará el emparejamiento y eliminará todas las inscripciones de este estudiante en su cuenta.", - "@This will unpair and remove all enrollments for this student from your account.": { - "description": "Confirmation message shown when the user tries to delete a student from their account", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was a problem removing this student from your account. Please check your connection and try again.": "Ocurrió un problema al eliminar a este estudiante de su cuenta. Compruebe su conexión y vuelva a intentarlo.", - "@There was a problem removing this student from your account. Please check your connection and try again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Cancel": "Cancelar", - "@Cancel": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "next": "Siguiente", - "@next": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "ok": "Aceptar", - "@ok": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Yes": "Sí", - "@Yes": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No": "No", - "@No": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Retry": "Reintentar", - "@Retry": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Delete": "Eliminar", - "@Delete": { - "description": "Label used for general delete/remove actions", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Done": "Listo", - "@Done": { - "description": "Label for general done/finished actions", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Refresh": "Actualizar", - "@Refresh": { - "description": "Label for button to refresh data from the web", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "View Description": "Ver descripción", - "@View Description": { - "description": "Button to view the description for an event or assignment", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "expanded": "expandido", - "@expanded": { - "description": "Description for the accessibility reader for list groups that are expanded", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "collapsed": "colapsado", - "@collapsed": { - "description": "Description for the accessibility reader for list groups that are expanded", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "An unexpected error occurred": "Ha ocurrido un error inesperado", - "@An unexpected error occurred": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No description": "Sin descripción", - "@No description": { - "description": "Message used when the assignment has no description", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Launch External Tool": "Iniciar la herramienta externa", - "@Launch External Tool": { - "description": "Button text added to webviews to let users open external tools in their browser", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Interactions on this page are limited by your institution.": "Las interacciones en esta página están limitadas por su institución.", - "@Interactions on this page are limited by your institution.": { - "description": "Message describing how the webview has limited access due to an instution setting", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "dateAtTime": "{date} a las {time}", - "@dateAtTime": { - "description": "The string to format dates", - "type": "text", - "placeholders_order": [ - "date", - "time" - ], - "placeholders": { - "date": {}, - "time": {} - } - }, - "dueDateAtTime": "Fecha límite el {date} a las {time}", - "@dueDateAtTime": { - "description": "The string to format due dates", - "type": "text", - "placeholders_order": [ - "date", - "time" - ], - "placeholders": { - "date": {}, - "time": {} - } - }, - "No Due Date": "No hay fecha límite", - "@No Due Date": { - "description": "Label for assignments that do not have a due date", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Filter": "Filtrar", - "@Filter": { - "description": "Label for buttons to filter what items are visible", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "unread": "no leído", - "@unread": { - "description": "Label for things that are marked as unread", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "unreadCount": "{count} no leído", - "@unreadCount": { - "description": "Formatted string for when there are a number of unread items", - "type": "text", - "placeholders_order": [ - "count" - ], - "placeholders": { - "count": {} - } - }, - "badgeNumberPlus": "{count}+", - "@badgeNumberPlus": { - "description": "Formatted string for when too many items are being notified in a badge, generally something like: 99+", - "type": "text", - "placeholders_order": [ - "count" - ], - "placeholders": { - "count": {} - } - }, - "There was an error loading this announcement": "Hubo un error al cargar este anuncio", - "@There was an error loading this announcement": { - "description": "Message shown when an announcement detail screen fails to load", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Network error": "Error de red", - "@Network error": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Under Construction": "En construcción", - "@Under Construction": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "We are currently building this feature for your viewing pleasure.": "Actualmente estamos desarrollando esta función para que pueda disfrutarla.", - "@We are currently building this feature for your viewing pleasure.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Request Login Help Button": "Botón Solicitar ayuda para iniciar sesión", - "@Request Login Help Button": { - "description": "Accessibility hint for button that opens help dialog for a login help request", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Request Login Help": "Solicitar ayuda para iniciar sesión", - "@Request Login Help": { - "description": "Title of help dialog for a login help request", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I'm having trouble logging in": "Tengo problemas para iniciar sesión", - "@I'm having trouble logging in": { - "description": "Subject of help dialog for a login help request", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "An error occurred when trying to display this link": "Se produjo un error al intentar mostrar este enlace", - "@An error occurred when trying to display this link": { - "description": "Error message shown when a link can't be opened", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "We are unable to display this link, it may belong to an institution you currently aren't logged in to.": "No podemos mostrar este enlace; es posible que pertenezca a una institución en la que no tiene sesión abierta actualmente.", - "@We are unable to display this link, it may belong to an institution you currently aren't logged in to.": { - "description": "Description for error page shown when clicking a link", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Link Error": "Error de enlace", - "@Link Error": { - "description": "Title for error page shown when clicking a link", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Open In Browser": "Abrir en el navegador", - "@Open In Browser": { - "description": "Text for button to open a link in the browswer", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You'll find the QR code on the web in your account profile. Click 'QR for Mobile Login' in the list.": "Encontrará el código QR en el sitio web, en su perfil de la cuenta. Hacer clic en \"QR para inicio de sesión móvil\" (\"QR for Mobile Login\") en la lista.", - "@You'll find the QR code on the web in your account profile. Click 'QR for Mobile Login' in the list.": { - "description": "Text for qr login tutorial screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Locate QR Code": "Ubicar código QR", - "@Locate QR Code": { - "description": "Text for qr login button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Please scan a QR code generated by Canvas": "Escanee un código QR generado por Canvas", - "@Please scan a QR code generated by Canvas": { - "description": "Text for qr login error with incorrect qr code", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error logging in. Please generate another QR Code and try again.": "Hubo un error al iniciar sesión. Genere otro código QR y vuelva a intentarlo.", - "@There was an error logging in. Please generate another QR Code and try again.": { - "description": "Text for qr login error", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Screenshot showing location of QR code generation in browser": "Captura de pantalla en la que se muestra la ubicación de la generación del código QR en el navegador", - "@Screenshot showing location of QR code generation in browser": { - "description": "Content Description for qr login tutorial screenshot", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "QR scanning requires camera access": "Se requiere acceso a la cámara para escanear el código QR", - "@QR scanning requires camera access": { - "description": "placeholder for camera error for QR code scan", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The linked item is no longer available": "El ítem vinculado ya no está disponible", - "@The linked item is no longer available": { - "description": "error message when the alert could no be opened", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Message sent": "Mensaje enviado", - "@Message sent": { - "description": "confirmation message on the screen when the user succesfully sends a message", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Acceptable Use Policy": "Política de uso aceptable", - "@Acceptable Use Policy": { - "description": "title for the acceptable use policy screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Submit": "Entregar", - "@Submit": { - "description": "submit button title for acceptable use policy screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Either you're a new user or the Acceptable Use Policy has changed since you last agreed to it. Please agree to the Acceptable Use Policy before you continue.": "Tanto si es un usuario nuevo como si la Política de uso aceptable cambió desde la última vez que la aceptó. Indique que está de acuerdo con la Política de uso aceptable antes de continuar.", - "@Either you're a new user or the Acceptable Use Policy has changed since you last agreed to it. Please agree to the Acceptable Use Policy before you continue.": { - "description": "acceptable use policy screen description", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I agree to the Acceptable Use Policy.": "Estoy de acuerdo con la Política de uso aceptable.", - "@I agree to the Acceptable Use Policy.": { - "description": "acceptable use policy switch title", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "About": "Acerca de", - "@About": { - "description": "Title for about menu item in settings", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "App": "Aplicación", - "@App": { - "description": "Title for App field on about page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Login ID": "ID de inicio de sesión", - "@Login ID": { - "description": "Title for Login ID field on about page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Email": "Correo electrónico", - "@Email": { - "description": "Title for Email field on about page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Version": "Versión", - "@Version": { - "description": "Title for Version field on about page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Instructure logo": "Logotipo de Instructure", - "@Instructure logo": { - "description": "Semantics label for the Instructure logo on the about page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - } -} \ No newline at end of file diff --git a/apps/flutter_parent/lib/l10n/res/intl_es_ES.arb b/apps/flutter_parent/lib/l10n/res/intl_es_ES.arb deleted file mode 100644 index 8e0e5d6820..0000000000 --- a/apps/flutter_parent/lib/l10n/res/intl_es_ES.arb +++ /dev/null @@ -1,2753 +0,0 @@ -{ - "@@last_modified": "2023-08-25T11:04:20.901151", - "alertsLabel": "Alertas", - "@alertsLabel": { - "description": "The label for the Alerts tab", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "calendarLabel": "Calendario", - "@calendarLabel": { - "description": "The label for the Calendar tab", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "coursesLabel": "Asignaturas", - "@coursesLabel": { - "description": "The label for the Courses tab", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Students": "No hay estudiantes", - "@No Students": { - "description": "Text for when an observer has no students they are observing", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Tap to show student selector": "Pulsa para ver el selector de estudiantes", - "@Tap to show student selector": { - "description": "Semantics label for the area that will show the student selector when tapped", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Tap to pair with a new student": "Pulsa para emparejar con un nuevo estudiante", - "@Tap to pair with a new student": { - "description": "Semantics label for the add student button in the student selector", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Tap to select this student": "Pulsa para seleccionar este estudiante", - "@Tap to select this student": { - "description": "Semantics label on individual students in the student switcher", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Manage Students": "Administrar estudiantes", - "@Manage Students": { - "description": "Label text for the Manage Students nav drawer button as well as the title for the Manage Students screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Help": "Ayuda", - "@Help": { - "description": "Label text for the help nav drawer button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Log Out": "Cerrar sesión", - "@Log Out": { - "description": "Label text for the Log Out nav drawer button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Switch Users": "Intercambiar usuarios", - "@Switch Users": { - "description": "Label text for the Switch Users nav drawer button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "appVersion": "v. {version}", - "@appVersion": { - "description": "App version shown in the navigation drawer", - "type": "text", - "placeholders_order": [ - "version" - ], - "placeholders": { - "version": {} - } - }, - "Are you sure you want to log out?": "¿Estás seguro de que quieres salir?", - "@Are you sure you want to log out?": { - "description": "Confirmation message displayed when the user tries to log out", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Calendars": "Calendarios", - "@Calendars": { - "description": "Label for button that lets users select which calendars to display", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "nextMonth": "Mes siguiente: {month}", - "@nextMonth": { - "description": "Label for the button that switches the calendar to the next month", - "type": "text", - "placeholders_order": [ - "month" - ], - "placeholders": { - "month": {} - } - }, - "previousMonth": "Mes anterior: {month}", - "@previousMonth": { - "description": "Label for the button that switches the calendar to the previous month", - "type": "text", - "placeholders_order": [ - "month" - ], - "placeholders": { - "month": {} - } - }, - "nextWeek": "La próxima semana comienza el {date}", - "@nextWeek": { - "description": "Label for the button that switches the calendar to the next week", - "type": "text", - "placeholders_order": [ - "date" - ], - "placeholders": { - "date": {} - } - }, - "previousWeek": "La semana anterior comenzó el {date}", - "@previousWeek": { - "description": "Label for the button that switches the calendar to the previous week", - "type": "text", - "placeholders_order": [ - "date" - ], - "placeholders": { - "date": {} - } - }, - "selectedMonthLabel": "Mes de {month}", - "@selectedMonthLabel": { - "description": "Accessibility label for the button that expands/collapses the month view", - "type": "text", - "placeholders_order": [ - "month" - ], - "placeholders": { - "month": {} - } - }, - "expand": "expandir", - "@expand": { - "description": "Accessibility label for the on-tap hint for the button that expands/collapses the month view", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "collapse": "colapsar", - "@collapse": { - "description": "Accessibility label for the on-tap hint for the button that expands/collapses the month view", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "pointsPossible": "{points} puntos posibles", - "@pointsPossible": { - "description": "Screen reader label used for the points possible for an assignment, quiz, etc.", - "type": "text", - "placeholders_order": [ - "points" - ], - "placeholders": { - "points": {} - } - }, - "calendarDaySemanticsLabel": "{eventCount,plural, =1{{date}, {eventCount} evento}other{{date}, {eventCount} eventos}}", - "@calendarDaySemanticsLabel": { - "description": "Screen reader label used for calendar day, reads the date and count of events", - "type": "text", - "placeholders_order": [ - "date", - "eventCount" - ], - "placeholders": { - "date": {}, - "eventCount": {} - } - }, - "No Events Today!": "No hay ningún evento hoy", - "@No Events Today!": { - "description": "Title displayed when there are no calendar events for the current day", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "It looks like a great day to rest, relax, and recharge.": "Parece un día perfecto para descansar, relajarse y recargar energías.", - "@It looks like a great day to rest, relax, and recharge.": { - "description": "Message displayed when there are no calendar events for the current day", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading your student's calendar": "Ha habido un error al cargar el calendario de tu estudiante", - "@There was an error loading your student's calendar": { - "description": "Message displayed when calendar events could not be loaded for the current student", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Tap to favorite the courses you want to see on the Calendar. Select up to 10.": "Pulsa para marcar las asignaturas que quieres ver en el calendario como favoritos. Selecciona hasta 10.", - "@Tap to favorite the courses you want to see on the Calendar. Select up to 10.": { - "description": "Description text on calendar filter screen.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You may only choose 10 calendars to display": "Solo se pueden elegir 10 calendarios para mostrar", - "@You may only choose 10 calendars to display": { - "description": "Error text when trying to select more than 10 calendars", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You must select at least one calendar to display": "Debes seleccionar al menos un calendario para mostrar", - "@You must select at least one calendar to display": { - "description": "Error text when trying to de-select all calendars", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Planner Note": "Nota del planificador", - "@Planner Note": { - "description": "Label used for notes in the planner", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Go to today": "Ir a la fecha de hoy", - "@Go to today": { - "description": "Accessibility label used for the today button in the planner", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Previous Logins": "Inicios de sesión anteriores", - "@Previous Logins": { - "description": "Label for the list of previous user logins", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "canvasLogoLabel": "Logotipo de Canvas", - "@canvasLogoLabel": { - "description": "The semantics label for the Canvas logo", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "findSchool": "Buscar escuela", - "@findSchool": { - "description": "Text for the find-my-school button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "findAnotherSchool": "Encontrar otra escuela", - "@findAnotherSchool": { - "description": "Text for the find-another-school button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "domainSearchInputHint": "Introduce el nombre de la escuela o el distrito...", - "@domainSearchInputHint": { - "description": "Input hint for the text box on the domain search screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "noDomainResults": "No se han podido encontrar escuelas que coincidan con \"{query}\".", - "@noDomainResults": { - "description": "Message shown to users when the domain search query did not return any results", - "type": "text", - "placeholders_order": [ - "query" - ], - "placeholders": { - "query": {} - } - }, - "domainSearchHelpLabel": "¿Cómo encuentro mi escuela o distrito?", - "@domainSearchHelpLabel": { - "description": "Label for the help button on the domain search screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "canvasGuides": "Guías de Canvas", - "@canvasGuides": { - "description": "Proper name for the Canvas Guides. This will be used in the domainSearchHelpBody text and will be highlighted and clickable", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "canvasSupport": "Soporte técnico de Canvas", - "@canvasSupport": { - "description": "Proper name for Canvas Support. This will be used in the domainSearchHelpBody text and will be highlighted and clickable", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "domainSearchHelpBody": "Intenta buscar el nombre de la escuela o el distrito al que intentas acceder, como “Smith Private School” o “Smith County Schools”. También puedes introducir directamente un dominio de Canvas, como “smith.instructure.com”.\n\nPara obtener más información sobre cómo encontrar la cuenta de Canvas de tu institución, puedes visitar {canvasGuides}, ponerte en contacto con {canvasSupport} o con tu escuela para recibir asistencia.", - "@domainSearchHelpBody": { - "description": "The body text shown in the help dialog on the domain search screen", - "type": "text", - "placeholders_order": [ - "canvasGuides", - "canvasSupport" - ], - "placeholders": { - "canvasGuides": {}, - "canvasSupport": {} - } - }, - "Uh oh!": "¡Ay, no!", - "@Uh oh!": { - "description": "Title of the screen that shows when a crash has occurred", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "We’re not sure what happened, but it wasn’t good. Contact us if this keeps happening.": "No sabemos qué ha ocurrido, pero no es nada bueno. Ponte en contacto con nosotros si el problema continúa.", - "@We’re not sure what happened, but it wasn’t good. Contact us if this keeps happening.": { - "description": "Message shown when a crash has occurred", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Contact Support": "Ponte en contacto con el soporte técnico", - "@Contact Support": { - "description": "Label for the button that allows users to contact support after a crash has occurred", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "View error details": "Ver detalles del error", - "@View error details": { - "description": "Label for the button that allowed users to view crash details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Restart app": "Reiniciar aplicación", - "@Restart app": { - "description": "Label for the button that will restart the entire application", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Application version": "Versión de la aplicación", - "@Application version": { - "description": "Label for the application version displayed in the crash details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Device model": "Modelo del dispositivo", - "@Device model": { - "description": "Label for the device model displayed in the crash details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Android OS version": "Versión del sistema operativo de Android", - "@Android OS version": { - "description": "Label for the Android operating system version displayed in the crash details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Full error message": "Mensaje de error completo", - "@Full error message": { - "description": "Label for the full error message displayed in the crash details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Inbox": "Bandeja de entrada", - "@Inbox": { - "description": "Title for the Inbox screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading your inbox messages.": "Ha habido un error al cargar tus mensajes de la bandeja de entrada.", - "@There was an error loading your inbox messages.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Subject": "No hay temas", - "@No Subject": { - "description": "Title used for inbox messages that have no subject", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unable to fetch courses. Please check your connection and try again.": "No se han podido obtener las asignaturas. Comprueba tu conexión y vuelve a intentarlo.", - "@Unable to fetch courses. Please check your connection and try again.": { - "description": "Message shown when an error occured while loading courses", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Choose a course to message": "Elige una asignatura para enviar un mensaje", - "@Choose a course to message": { - "description": "Header in the course list shown when the user is choosing which course to associate with a new message", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Inbox Zero": "Bandeja de entrada vacía", - "@Inbox Zero": { - "description": "Title of the message shown when there are no inbox messages", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You’re all caught up!": "¡Ya estás al día!", - "@You’re all caught up!": { - "description": "Subtitle of the message shown when there are no inbox messages", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading recipients for this course": "Ha habido un error al cargar los destinatarios de esta asignatura", - "@There was an error loading recipients for this course": { - "description": "Message shown when attempting to create a new message but the recipients list failed to load", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unable to send message. Check your connection and try again.": "No se puede enviar el mensaje. Comprueba tu conexión y vuelve a intentarlo.", - "@Unable to send message. Check your connection and try again.": { - "description": "Message show when there was an error creating or sending a new message", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unsaved changes": "Cambios no guardados", - "@Unsaved changes": { - "description": "Title of the dialog shown when the user tries to leave with unsaved changes", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Are you sure you wish to close this page? Your unsent message will be lost.": "¿Estás seguro de que quieres cerrar esta página? Tu mensaje no enviado se perderá.", - "@Are you sure you wish to close this page? Your unsent message will be lost.": { - "description": "Body text of the dialog shown when the user tries leave with unsaved changes", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "New message": "Mensaje nuevo", - "@New message": { - "description": "Title of the new-message screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Add attachment": "Añadir adjunto", - "@Add attachment": { - "description": "Tooltip for the add-attachment button in the new-message screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Send message": "Enviar mensaje", - "@Send message": { - "description": "Tooltip for the send-message button in the new-message screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Select recipients": "Seleccionar destinatarios", - "@Select recipients": { - "description": "Tooltip for the button that allows users to select message recipients", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No recipients selected": "No has seleccionado ningún destinatario", - "@No recipients selected": { - "description": "Hint displayed when the user has not selected any message recipients", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Message subject": "Asunto del mensaje", - "@Message subject": { - "description": "Hint text displayed in the input field for the message subject", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Message": "Mensaje", - "@Message": { - "description": "Hint text displayed in the input field for the message body", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Recipients": "Destinatarios", - "@Recipients": { - "description": "Label for message recipients", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "plusRecipientCount": "+{count}", - "@plusRecipientCount": { - "description": "Shows the number of recipients that are selected but not displayed on screen.", - "type": "text", - "placeholders_order": [ - "count" - ], - "placeholders": { - "count": { - "example": 5 - } - } - }, - "Failed. Tap for options.": "Ha habido un error. Toca para ver las opciones.", - "@Failed. Tap for options.": { - "description": "Short message shown on a message attachment when uploading has failed", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "courseForWhom": "para {studentShortName}", - "@courseForWhom": { - "description": "Describes for whom a course is for (i.e. for Bill)", - "type": "text", - "placeholders_order": [ - "studentShortName" - ], - "placeholders": { - "studentShortName": {} - } - }, - "messageLinkPostscript": "Asunto: {studentName}, {linkUrl}", - "@messageLinkPostscript": { - "description": "A postscript appended to new messages that clarifies which student is the subject of the message and also includes a URL for the related Canvas component (course, assignment, event, etc).", - "type": "text", - "placeholders_order": [ - "studentName", - "linkUrl" - ], - "placeholders": { - "studentName": {}, - "linkUrl": {} - } - }, - "There was an error loading this conversation": "Ha habido un error al cargar esta conversación", - "@There was an error loading this conversation": { - "description": "Message shown when a conversation fails to load", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Reply": "Respuesta", - "@Reply": { - "description": "Button label for replying to a conversation", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Reply All": "Responder a todos", - "@Reply All": { - "description": "Button label for replying to all conversation participants", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unknown User": "Usuario desconocido", - "@Unknown User": { - "description": "Label used where the user name is not known", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "me": "yo", - "@me": { - "description": "First-person pronoun (i.e. 'me') that will be used in message author info, e.g. 'Me to 4 others' or 'Jon Snow to me'", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "authorToRecipient": "{authorName} a {recipientName}", - "@authorToRecipient": { - "description": "Author info for a single-recipient message; includes both the author name and the recipient name.", - "type": "text", - "placeholders_order": [ - "authorName", - "recipientName" - ], - "placeholders": { - "authorName": {}, - "recipientName": {} - } - }, - "authorToNOthers": "{howMany,plural, =1{{authorName} a 1 otro}other{{authorName} a {howMany} otros}}", - "@authorToNOthers": { - "description": "Author info for a mutli-recipient message; includes the author name and the number of recipients", - "type": "text", - "placeholders_order": [ - "authorName", - "howMany" - ], - "placeholders": { - "authorName": {}, - "howMany": {} - } - }, - "authorToRecipientAndNOthers": "{howMany,plural, =1{{authorName} a {recipientName} y 1 otro}other{{authorName} a {recipientName} y {howMany} otros}}", - "@authorToRecipientAndNOthers": { - "description": "Author info for a multi-recipient message; includes the author name, one recipient name, and the number of other recipients", - "type": "text", - "placeholders_order": [ - "authorName", - "recipientName", - "howMany" - ], - "placeholders": { - "authorName": {}, - "recipientName": {}, - "howMany": {} - } - }, - "Download": "Descargar", - "@Download": { - "description": "Label for the button that will begin downloading a file", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Open with another app": "Abrir con otra aplicación", - "@Open with another app": { - "description": "Label for the button that will allow users to open a file with another app", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There are no installed applications that can open this file": "No hay aplicaciones instaladas que puedan abrir este archivo", - "@There are no installed applications that can open this file": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unsupported File": "Archivo no compatible", - "@Unsupported File": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "This file is unsupported and can’t be viewed through the app": "Este archivo no es compatible y no se puede ver con la aplicación", - "@This file is unsupported and can’t be viewed through the app": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unable to play this media file": "No se puede reproducir este archivo multimedia", - "@Unable to play this media file": { - "description": "Message shown when audio or video media could not be played", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unable to load this image": "No se puede cargar esta imagen", - "@Unable to load this image": { - "description": "Message shown when an image file could not be loaded or displayed", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading this file": "Ha habido un error al cargar este archivo", - "@There was an error loading this file": { - "description": "Message shown when a file could not be loaded or displayed", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Courses": "No hay asignaturas", - "@No Courses": { - "description": "Title for having no courses", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Your student’s courses might not be published yet.": "Es posible que las asignaturas de tus estudiantes aún no estén publicadas.", - "@Your student’s courses might not be published yet.": { - "description": "Message for having no courses", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading your student’s courses.": "Ha habido un error al cargar las asignaturas de tu estudiante.", - "@There was an error loading your student’s courses.": { - "description": "Message displayed when the list of student courses could not be loaded", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Grade": "No hay nota", - "@No Grade": { - "description": "Message shown when there is currently no grade available for a course", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Filter by": "Filtrar por", - "@Filter by": { - "description": "Title for list of terms to filter grades by", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Grades": "Notas", - "@Grades": { - "description": "Label for the \"Grades\" tab in course details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Syllabus": "Programa de la asignatura", - "@Syllabus": { - "description": "Label for the \"Syllabus\" tab in course details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Front Page": "Página de inicio", - "@Front Page": { - "description": "Label for the \"Front Page\" tab in course details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Summary": "Resumen", - "@Summary": { - "description": "Label for the \"Summary\" tab in course details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Send a message about this course": "Enviar un mensaje acerca de esta asignatura", - "@Send a message about this course": { - "description": "Accessibility hint for the course messaage floating action button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Total Grade": "Nota total", - "@Total Grade": { - "description": "Label for the total grade in the course", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Graded": "Evaluado", - "@Graded": { - "description": "Label for assignments that have been graded", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Submitted": "Entregado", - "@Submitted": { - "description": "Label for assignments that have been submitted", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Not Submitted": "No entregado", - "@Not Submitted": { - "description": "Label for assignments that have not been submitted", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Late": "Con retraso", - "@Late": { - "description": "Label for assignments that have been marked late or submitted late", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Missing": "No presentado", - "@Missing": { - "description": "Label for assignments that have been marked missing or are not submitted and past the due date", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "-": "-", - "@-": { - "description": "Value representing no score for student submission", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "All Grading Periods": "Todos los períodos de evaluación", - "@All Grading Periods": { - "description": "Label for selecting all grading periods", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Assignments": "No hay actividades", - "@No Assignments": { - "description": "Title for the no assignments message", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "It looks like assignments haven't been created in this space yet.": "Parece que aún no se han creado actividades en este espacio.", - "@It looks like assignments haven't been created in this space yet.": { - "description": "Message for no assignments", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading the summary details for this course.": "Ha habido un error al cargar los detalles del resumen de esta asignatura.", - "@There was an error loading the summary details for this course.": { - "description": "Message shown when the course summary could not be loaded", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Summary": "No hay resumen", - "@No Summary": { - "description": "Title displayed when there are no items in the course summary", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "This course does not have any assignments or calendar events yet.": "Esta asignatura aún no tiene ninguna actividad ni eventos en el calendario.", - "@This course does not have any assignments or calendar events yet.": { - "description": "Message displayed when there are no items in the course summary", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "gradeFormatScoreOutOfPointsPossible": "{score} / {pointsPossible}", - "@gradeFormatScoreOutOfPointsPossible": { - "description": "Formatted string for a student score out of the points possible", - "type": "text", - "placeholders_order": [ - "score", - "pointsPossible" - ], - "placeholders": { - "score": {}, - "pointsPossible": {} - } - }, - "contentDescriptionScoreOutOfPointsPossible": "{score} de {pointsPossible} puntos", - "@contentDescriptionScoreOutOfPointsPossible": { - "description": "Formatted string for a student score out of the points possible", - "type": "text", - "placeholders_order": [ - "score", - "pointsPossible" - ], - "placeholders": { - "score": {}, - "pointsPossible": {} - } - }, - "gradesSubjectMessage": "Asunto: {studentName}, notas", - "@gradesSubjectMessage": { - "description": "The subject line for a message to a teacher regarding a student's grades", - "type": "text", - "placeholders_order": [ - "studentName" - ], - "placeholders": { - "studentName": {} - } - }, - "syllabusSubjectMessage": "Asunto: {studentName}, programa de la asignatura", - "@syllabusSubjectMessage": { - "description": "The subject line for a message to a teacher regarding a course syllabus", - "type": "text", - "placeholders_order": [ - "studentName" - ], - "placeholders": { - "studentName": {} - } - }, - "frontPageSubjectMessage": "Asunto: {studentName}, página de inicio", - "@frontPageSubjectMessage": { - "description": "The subject line for a message to a teacher regarding a course front page", - "type": "text", - "placeholders_order": [ - "studentName" - ], - "placeholders": { - "studentName": {} - } - }, - "assignmentSubjectMessage": "Asunto: {studentName}, actividad: {assignmentName}", - "@assignmentSubjectMessage": { - "description": "The subject line for a message to a teacher regarding a student's assignment", - "type": "text", - "placeholders_order": [ - "studentName", - "assignmentName" - ], - "placeholders": { - "studentName": {}, - "assignmentName": {} - } - }, - "eventSubjectMessage": "Asunto: {studentName}, evento: {eventTitle}", - "@eventSubjectMessage": { - "description": "The subject line for a message to a teacher regarding a calendar event", - "type": "text", - "placeholders_order": [ - "studentName", - "eventTitle" - ], - "placeholders": { - "studentName": {}, - "eventTitle": {} - } - }, - "There is no page information available.": "No hay información disponible de la página.", - "@There is no page information available.": { - "description": "Description for when no page information is available", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Assignment Details": "Detalles de la actividad", - "@Assignment Details": { - "description": "Title for the page that shows details for an assignment", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "assignmentTotalPoints": "{points} puntos", - "@assignmentTotalPoints": { - "description": "Label used for the total points the assignment is worth", - "type": "text", - "placeholders_order": [ - "points" - ], - "placeholders": { - "points": {} - } - }, - "assignmentTotalPointsAccessible": "{points} puntos", - "@assignmentTotalPointsAccessible": { - "description": "Screen reader label used for the total points the assignment is worth", - "type": "text", - "placeholders_order": [ - "points" - ], - "placeholders": { - "points": {} - } - }, - "Due": "Fecha de entrega", - "@Due": { - "description": "Label for an assignment due date", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Grade": "Nota", - "@Grade": { - "description": "Label for the section that displays an assignment's grade", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Locked": "Bloqueado", - "@Locked": { - "description": "Label for when an assignment is locked", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "assignmentLockedModule": "Esta actividad está bloqueada por el contenido \"{moduleName}\".", - "@assignmentLockedModule": { - "description": "The locked description when an assignment is locked by a module", - "type": "text", - "placeholders_order": [ - "moduleName" - ], - "placeholders": { - "moduleName": {} - } - }, - "Remind Me": "Recordármelo", - "@Remind Me": { - "description": "Label for the row to set reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Set a date and time to be notified of this specific assignment.": "Establecer una fecha y un horario para que se me notifique esta actividad específica.", - "@Set a date and time to be notified of this specific assignment.": { - "description": "Description for row to set reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You will be notified about this assignment on…": "Se te notificará acerca de esta actividad el...", - "@You will be notified about this assignment on…": { - "description": "Description for when a reminder is set", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Instructions": "Instrucciones", - "@Instructions": { - "description": "Label for the description of the assignment when it has quiz instructions", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Send a message about this assignment": "Enviar un mensaje acerca de esta actividad", - "@Send a message about this assignment": { - "description": "Accessibility hint for the assignment messaage floating action button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "This app is not authorized for use.": "Esta aplicación no está autorizada para su uso.", - "@This app is not authorized for use.": { - "description": "The error shown when the app being used is not verified by Canvas", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The server you entered is not authorized for this app.": "El servidor introducido no está autorizado para esta aplicación.", - "@The server you entered is not authorized for this app.": { - "description": "The error shown when the desired login domain is not verified by Canvas", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The user agent for this app is not authorized.": "El agente de usuario de esta aplicación no está autorizado.", - "@The user agent for this app is not authorized.": { - "description": "The error shown when the user agent during verification is not verified by Canvas", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "We were unable to verify the server for use with this app.": "No hemos podido verificar el servidor para su uso con esta aplicación.", - "@We were unable to verify the server for use with this app.": { - "description": "The generic error shown when we are unable to verify with Canvas", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Reminders": "Recordatorios", - "@Reminders": { - "description": "Name of the system notification channel for assignment and event reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Notifications for reminders about assignments and calendar events": "Notificaciones de recordatorios de actividades y eventos en el calendario", - "@Notifications for reminders about assignments and calendar events": { - "description": "Description of the system notification channel for assignment and event reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Reminders have changed!": "Se han cambiado los recordatorios", - "@Reminders have changed!": { - "description": "Title of the dialog shown when the user needs to update their reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "In order to provide you with a better experience, we have updated how reminders work. You can add new reminders by viewing an assignment or calendar event and tapping the switch under the \"Remind Me\" section.\n\nBe aware that any reminders created with older versions of this app will not be compatible with the new changes and you will need to create them again.": "Para brindarte una mejor experiencia, hemos actualizado el funcionamiento de los recordatorios. Para añadir nuevos recordatorios, consulta una actividad o evento del calendario y pulsa el botón en la sección \"Recordarme\" (\"Remind Me\").\n\nTen presente que cualquier recordatorio creado con versiones anteriores de esta aplicación no será compatible con los nuevos cambios, y deberás volver a crearlo.", - "@In order to provide you with a better experience, we have updated how reminders work. You can add new reminders by viewing an assignment or calendar event and tapping the switch under the \"Remind Me\" section.\n\nBe aware that any reminders created with older versions of this app will not be compatible with the new changes and you will need to create them again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Not a parent?": "¿No es un padre o madre?", - "@Not a parent?": { - "description": "Title for the screen that shows when the user is not observing any students", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "We couldn't find any students associated with this account": "No hemos podido encontrar ningún estudiante relacionado con esta cuenta", - "@We couldn't find any students associated with this account": { - "description": "Subtitle for the screen that shows when the user is not observing any students", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Are you a student or teacher?": "¿Es estudiante o profesor?", - "@Are you a student or teacher?": { - "description": "Label for button that will show users the option to view other Canvas apps in the Play Store", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "One of our other apps might be a better fit. Tap one to visit the Play Store.": "Una de nuestras otras aplicaciones podría ser más adecuada. Toca una para visitar la Play Store.", - "@One of our other apps might be a better fit. Tap one to visit the Play Store.": { - "description": "Description of options to view other Canvas apps in the Play Store", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Return to Login": "Volver al inicio de sesión", - "@Return to Login": { - "description": "Label for the button that returns the user to the login screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "STUDENT": "ESTUDIANTE", - "@STUDENT": { - "description": "The \"student\" portion of the \"Canvas Student\" app name, in all caps. \"Canvas\" is excluded in this context as it will be displayed to the user as a wordmark image", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "TEACHER": "PROFESOR", - "@TEACHER": { - "description": "The \"teacher\" portion of the \"Canvas Teacher\" app name, in all caps. \"Canvas\" is excluded in this context as it will be displayed to the user as a wordmark image", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Canvas Student": "Canvas Student", - "@Canvas Student": { - "description": "The name of the Canvas Student app. Only \"Student\" should be translated as \"Canvas\" is a brand name in this context and should not be translated.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Canvas Teacher": "Canvas Teacher", - "@Canvas Teacher": { - "description": "The name of the Canvas Teacher app. Only \"Teacher\" should be translated as \"Canvas\" is a brand name in this context and should not be translated.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Alerts": "No hay alertas", - "@No Alerts": { - "description": "The title for the empty message to show to users when there are no alerts for the student.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There’s nothing to be notified of yet.": "Aún no hay ninguna notificación.", - "@There’s nothing to be notified of yet.": { - "description": "The empty message to show to users when there are no alerts for the student.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "dismissAlertLabel": "Descartar {alertTitle}", - "@dismissAlertLabel": { - "description": "Accessibility label to dismiss an alert", - "type": "text", - "placeholders_order": [ - "alertTitle" - ], - "placeholders": { - "alertTitle": {} - } - }, - "Course Announcement": "Anuncio de la asignatura", - "@Course Announcement": { - "description": "Title for alerts when there is a course announcement", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Institution Announcement": "Anuncio de la institución", - "@Institution Announcement": { - "description": "Title for alerts when there is an institution announcement", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "assignmentGradeAboveThreshold": "Nota de la actividad superior a {threshold}", - "@assignmentGradeAboveThreshold": { - "description": "Title for alerts when an assignment grade is above the threshold value", - "type": "text", - "placeholders_order": [ - "threshold" - ], - "placeholders": { - "threshold": {} - } - }, - "assignmentGradeBelowThreshold": "Nota de la actividad inferior a {threshold}", - "@assignmentGradeBelowThreshold": { - "description": "Title for alerts when an assignment grade is below the threshold value", - "type": "text", - "placeholders_order": [ - "threshold" - ], - "placeholders": { - "threshold": {} - } - }, - "courseGradeAboveThreshold": "Nota de la asignatura superior a {threshold}", - "@courseGradeAboveThreshold": { - "description": "Title for alerts when a course grade is above the threshold value", - "type": "text", - "placeholders_order": [ - "threshold" - ], - "placeholders": { - "threshold": {} - } - }, - "courseGradeBelowThreshold": "Nota de la asignatura inferior a {threshold}", - "@courseGradeBelowThreshold": { - "description": "Title for alerts when a course grade is below the threshold value", - "type": "text", - "placeholders_order": [ - "threshold" - ], - "placeholders": { - "threshold": {} - } - }, - "Settings": "Configuraciones", - "@Settings": { - "description": "Title for the settings screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Theme": "Tema", - "@Theme": { - "description": "Label for the light/dark theme section in the settings page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Dark Mode": "Modo oscuro", - "@Dark Mode": { - "description": "Label for the button that enables dark mode", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Light Mode": "Modo claro", - "@Light Mode": { - "description": "Label for the button that enables light mode", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "High Contrast Mode": "Modo de alto contraste", - "@High Contrast Mode": { - "description": "Label for the switch that toggles high contrast mode", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Use Dark Theme in Web Content": "Usar tema oscuro en el contenido web", - "@Use Dark Theme in Web Content": { - "description": "Label for the switch that toggles dark mode for webviews", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Appearance": "Apariencia", - "@Appearance": { - "description": "Label for the appearance section in the settings page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Successfully submitted!": "Entrega realizada", - "@Successfully submitted!": { - "description": "Title displayed in the grade cell for an assignment that has been submitted", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "submissionStatusSuccessSubtitle": "Esta actividad se envió el {date} a las {time} y está a la espera de la nota", - "@submissionStatusSuccessSubtitle": { - "description": "Subtitle displayed in the grade cell for an assignment that has been submitted and is awaiting a grade", - "type": "text", - "placeholders_order": [ - "date", - "time" - ], - "placeholders": { - "date": {}, - "time": {} - } - }, - "outOfPoints": "{howMany,plural, =1{De 1 punto}other{De {points} puntos}}", - "@outOfPoints": { - "description": "Description for an assignment grade that has points without a current scoroe", - "type": "text", - "placeholders_order": [ - "points", - "howMany" - ], - "placeholders": { - "points": {}, - "howMany": {} - } - }, - "Excused": "Justificado", - "@Excused": { - "description": "Grading status for an assignment marked as excused", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Complete": "Completo", - "@Complete": { - "description": "Grading status for an assignment marked as complete", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Incomplete": "Incompleto", - "@Incomplete": { - "description": "Grading status for an assignment marked as incomplete", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "minus": "menos", - "@minus": { - "description": "Screen reader-friendly replacement for the \"-\" character in letter grades like \"A-\"", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "latePenalty": "Sanción por entrega con retraso (-{pointsLost})", - "@latePenalty": { - "description": "Text displayed when a late penalty has been applied to the assignment", - "type": "text", - "placeholders_order": [ - "pointsLost" - ], - "placeholders": { - "pointsLost": {} - } - }, - "finalGrade": "Nota final: {grade}", - "@finalGrade": { - "description": "Text that displays the final grade of an assignment", - "type": "text", - "placeholders_order": [ - "grade" - ], - "placeholders": { - "grade": {} - } - }, - "Alert Settings": "Configuraciones de alertas", - "@Alert Settings": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Alert me when…": "Enviarme una alerta cuando...", - "@Alert me when…": { - "description": "Header for the screen where the observer chooses the thresholds that will determine when they receive alerts (e.g. when an assignment is graded below 70%)", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Course grade below": "Nota de la asignatura inferior a", - "@Course grade below": { - "description": "Label describing the threshold for when the course grade is below a certain percentage", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Course grade above": "Nota de la asignatura superior a", - "@Course grade above": { - "description": "Label describing the threshold for when the course grade is above a certain percentage", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Assignment missing": "Actividad no presentada", - "@Assignment missing": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Assignment grade below": "Nota de la actividad inferior a", - "@Assignment grade below": { - "description": "Label describing the threshold for when an assignment is graded below a certain percentage", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Assignment grade above": "Nota de la actividad superior a", - "@Assignment grade above": { - "description": "Label describing the threshold for when an assignment is graded above a certain percentage", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Course Announcements": "Anuncios de la asignatura", - "@Course Announcements": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Institution Announcements": "Anuncios de la institución", - "@Institution Announcements": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Never": "Nunca", - "@Never": { - "description": "Indication that tells the user they will not receive alert notifications of a specific kind", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Grade percentage": "Porcentaje de nota", - "@Grade percentage": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading your student's alerts.": "Ha habido un error al cargar las alertas de tus estudiantes.", - "@There was an error loading your student's alerts.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Must be below 100": "Debe ser inferior a 100", - "@Must be below 100": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "mustBeBelowN": "Debe ser inferior a {percentage}", - "@mustBeBelowN": { - "description": "Validation error to the user that they must choose a percentage below 'n'", - "type": "text", - "placeholders_order": [ - "percentage" - ], - "placeholders": { - "percentage": { - "example": 5 - } - } - }, - "mustBeAboveN": "Debe ser superior a {percentage}", - "@mustBeAboveN": { - "description": "Validation error to the user that they must choose a percentage above 'n'", - "type": "text", - "placeholders_order": [ - "percentage" - ], - "placeholders": { - "percentage": { - "example": 5 - } - } - }, - "Select Student Color": "Seleccionar color del estudiante", - "@Select Student Color": { - "description": "Title for screen that allows users to assign a color to a specific student", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Electric, blue": "Azul eléctrico", - "@Electric, blue": { - "description": "Name of the Electric (blue) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Plum, Purple": "Morado tipo ciruela", - "@Plum, Purple": { - "description": "Name of the Plum (purple) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Barney, Fuschia": "Fucsia tipo Barney", - "@Barney, Fuschia": { - "description": "Name of the Barney (fuschia) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Raspberry, Red": "Rojo tipo mora", - "@Raspberry, Red": { - "description": "Name of the Raspberry (red) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Fire, Orange": "Naranja tipo fuego", - "@Fire, Orange": { - "description": "Name of the Fire (orange) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Shamrock, Green": "Verde tipo trébol", - "@Shamrock, Green": { - "description": "Name of the Shamrock (green) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "An error occurred while saving your selection. Please try again.": "Ha habido un error al guardar tu selección. Inténtalo de nuevo.", - "@An error occurred while saving your selection. Please try again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "changeStudentColorLabel": "Cambiar color para {studentName}", - "@changeStudentColorLabel": { - "description": "Accessibility label for the button that lets users change the color associated with a specific student", - "type": "text", - "placeholders_order": [ - "studentName" - ], - "placeholders": { - "studentName": {} - } - }, - "Teacher": "Profesor", - "@Teacher": { - "description": "Label for the Teacher enrollment type", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Student": "Estudiante", - "@Student": { - "description": "Label for the Student enrollment type", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "TA": "Profesor auxiliar", - "@TA": { - "description": "Label for the Teaching Assistant enrollment type (also known as Teacher Aid or Education Assistant), reduced to a short acronym/initialism if appropriate.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Observer": "Observador", - "@Observer": { - "description": "Label for the Observer enrollment type", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Use Camera": "Usar cámara", - "@Use Camera": { - "description": "Label for the action item that lets the user capture a photo using the device camera", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Upload File": "Cargar archivo", - "@Upload File": { - "description": "Label for the action item that lets the user upload a file from their device", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Choose from Gallery": "Seleccionar de la galería", - "@Choose from Gallery": { - "description": "Label for the action item that lets the user select a photo from their device gallery", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Preparing…": "En preparación...", - "@Preparing…": { - "description": "Message shown while a file is being prepared to attach to a message", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Add student with…": "Añadir estudiante con...", - "@Add student with…": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Add Student": "Añadir estudiante", - "@Add Student": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You are not observing any students.": "No estás observando a ningún estudiante.", - "@You are not observing any students.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading your students.": "Ha habido un error al cargar tus estudiantes.", - "@There was an error loading your students.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Pairing Code": "Código de emparejamiento", - "@Pairing Code": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Students can obtain a pairing code through the Canvas website": "Los estudiantes pueden obtener un código de emparejamiento a través del sitio web de Canvas", - "@Students can obtain a pairing code through the Canvas website": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Enter the student pairing code provided to you. If the pairing code doesn't work, it may have expired": "Introduce el código de emparejamiento de estudiante que se te ha proporcionado. Si el código de emparejamiento no funciona, es posible que haya caducado", - "@Enter the student pairing code provided to you. If the pairing code doesn't work, it may have expired": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Your code is incorrect or expired.": "Tu código es incorrecto o ha caducado.", - "@Your code is incorrect or expired.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Something went wrong trying to create your account, please reach out to your school for assistance.": "Algo ha salido mal al intentar crear tu cuenta; ponte en contacto con tu escuela para obtener asistencia.", - "@Something went wrong trying to create your account, please reach out to your school for assistance.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "QR Code": "Código QR", - "@QR Code": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Students can create a QR code using the Canvas Student app on their mobile device": "Los estudiantes pueden crear un código QR mediante la aplicación Canvas Student en sus dispositivos móviles", - "@Students can create a QR code using the Canvas Student app on their mobile device": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Add new student": "Añadir nuevo estudiante", - "@Add new student": { - "description": "Semantics label for the FAB on the Manage Students Screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Select": "Seleccionar", - "@Select": { - "description": "Hint text to tell the user to choose one of two options", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I have a Canvas account": "Tengo una cuenta de Canvas", - "@I have a Canvas account": { - "description": "Option to select for users that have a canvas account", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I don't have a Canvas account": "No tengo cuenta de Canvas", - "@I don't have a Canvas account": { - "description": "Option to select for users that don't have a canvas account", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Create Account": "Crear cuenta", - "@Create Account": { - "description": "Button text for account creation confirmation", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Full Name": "Nombre completo", - "@Full Name": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Email Address": "Dirección de correo electrónico", - "@Email Address": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Password": "Contraseña", - "@Password": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Full Name…": "Nombre completo…", - "@Full Name…": { - "description": "hint label for inside form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Email…": "Correo electrónico…", - "@Email…": { - "description": "hint label for inside form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Password…": "Contraseña…", - "@Password…": { - "description": "hint label for inside form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Please enter full name": "Introduce el nombre completo", - "@Please enter full name": { - "description": "Error message for form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Please enter an email address": "Introduce una dirección de correo electrónico", - "@Please enter an email address": { - "description": "Error message for form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Please enter a valid email address": "Introduce una dirección de correo electrónico válida", - "@Please enter a valid email address": { - "description": "Error message for form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Password is required": "La contraseña es obligatoria", - "@Password is required": { - "description": "Error message for form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Password must contain at least 8 characters": "La contraseña debe contener 8 caracteres como mínimo", - "@Password must contain at least 8 characters": { - "description": "Error message for form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "qrCreateAccountTos": "Al tocar en “Crear usuario”, aceptas los {termsOfService} y la {privacyPolicy}", - "@qrCreateAccountTos": { - "description": "The text show on the account creation screen", - "type": "text", - "placeholders_order": [ - "termsOfService", - "privacyPolicy" - ], - "placeholders": { - "termsOfService": {}, - "privacyPolicy": {} - } - }, - "Terms of Service": "Términos de servicio", - "@Terms of Service": { - "description": "Label for the Canvas Terms of Service agreement. This will be used in the qrCreateAccountTos text and will be highlighted and clickable", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Privacy Policy": "Política de privacidad", - "@Privacy Policy": { - "description": "Label for the Canvas Privacy Policy agreement. This will be used in the qrCreateAccountTos text and will be highlighted and clickable", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "View the Privacy Policy": "Ver la política de privacidad", - "@View the Privacy Policy": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Already have an account? ": "¿Ya tienes una cuenta? ", - "@Already have an account? ": { - "description": "Part of multiline text span, includes AccountSignIn1-2, in that order", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Sign In": "Iniciar sesión", - "@Sign In": { - "description": "Part of multiline text span, includes AccountSignIn1-2, in that order", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Hide Password": "Ocultar contraseña", - "@Hide Password": { - "description": "content description for password hide button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Show Password": "Mostrar contraseña", - "@Show Password": { - "description": "content description for password show button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Terms of Service Link": "Enlace a los términos de servicio", - "@Terms of Service Link": { - "description": "content description for terms of service link", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Privacy Policy Link": "Enlace a la política de privacidad", - "@Privacy Policy Link": { - "description": "content description for privacy policy link", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Event": "Evento", - "@Event": { - "description": "Title for the event details screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Date": "Fecha", - "@Date": { - "description": "Label for the event date", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Location": "Ubicación", - "@Location": { - "description": "Label for the location information", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Location Specified": "No hay ninguna ubicación especificada", - "@No Location Specified": { - "description": "Description for events that do not have a location", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "eventTime": "{startAt} - {endAt}", - "@eventTime": { - "description": "The time the event is happening, example: \"2:00 pm - 4:00 pm\"", - "type": "text", - "placeholders_order": [ - "startAt", - "endAt" - ], - "placeholders": { - "startAt": {}, - "endAt": {} - } - }, - "Set a date and time to be notified of this event.": "Establecer una fecha y un horario para que se me notifique este evento.", - "@Set a date and time to be notified of this event.": { - "description": "Description for row to set event reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You will be notified about this event on…": "Se te notificará acerca de este evento el...", - "@You will be notified about this event on…": { - "description": "Description for when an event reminder is set", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Share Your Love for the App": "Comparte tu amor por la aplicación", - "@Share Your Love for the App": { - "description": "Label for option to open the app store", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Tell us about your favorite parts of the app": "Dinos cuáles son las partes de la aplicación que más te gustan", - "@Tell us about your favorite parts of the app": { - "description": "Description for option to open the app store", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Legal": "Legal", - "@Legal": { - "description": "Label for legal information option", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Privacy policy, terms of use, open source": "Política de privacidad, términos de uso, código abierto", - "@Privacy policy, terms of use, open source": { - "description": "Description for legal information option", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Idea for Canvas Parent App [Android]": "Ideas para la aplicación de Canvas Parent [Android]", - "@Idea for Canvas Parent App [Android]": { - "description": "The subject for the email to request a feature", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The following information will help us better understand your idea:": "La siguiente información nos ayudará a comprender mejor tu idea:", - "@The following information will help us better understand your idea:": { - "description": "The header for the users information that is attached to a feature request", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Domain:": "Dominio:", - "@Domain:": { - "description": "The label for the Canvas domain of the logged in user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "User ID:": "Identificación de usuario:", - "@User ID:": { - "description": "The label for the Canvas user ID of the logged in user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Email:": "Correo electrónico:", - "@Email:": { - "description": "The label for the eamil of the logged in user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Locale:": "Lugar:", - "@Locale:": { - "description": "The label for the locale of the logged in user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Terms of Use": "Términos de uso", - "@Terms of Use": { - "description": "Label for the terms of use", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Canvas on GitHub": "Canvas en GitHub", - "@Canvas on GitHub": { - "description": "Label for the button that opens the Canvas project on GitHub's website", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was a problem loading the Terms of Use": "Ha habido un problema al cargar los términos de uso", - "@There was a problem loading the Terms of Use": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Device": "Dispositivo", - "@Device": { - "description": "Label used for device manufacturer/model in the error report", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "OS Version": "Versión del sistema operativo", - "@OS Version": { - "description": "Label used for device operating system version in the error report", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Version Number": "Número de versión", - "@Version Number": { - "description": "Label used for the app version number in the error report", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Report A Problem": "Informar sobre un problema", - "@Report A Problem": { - "description": "Title used for generic dialog to report problems", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Subject": "Tema", - "@Subject": { - "description": "Label used for Subject text field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "A subject is required.": "El asunto es obligatorio.", - "@A subject is required.": { - "description": "Error shown when the subject field is empty", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "An email address is required.": "La dirección de correo electrónico es obligatoria.", - "@An email address is required.": { - "description": "Error shown when the email field is empty", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Description": "Descripción", - "@Description": { - "description": "Label used for Description text field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "A description is required.": "Se requiere una descripción.", - "@A description is required.": { - "description": "Error shown when the description field is empty", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "How is this affecting you?": "¿Cómo te afecta esto?", - "@How is this affecting you?": { - "description": "Label used for the dropdown to select how severe the issue is", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "send": "enviar", - "@send": { - "description": "Label used for send button when reporting a problem", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Just a casual question, comment, idea, suggestion…": "Solo una pregunta, comentario, idea o sugerencia informal...", - "@Just a casual question, comment, idea, suggestion…": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I need some help but it's not urgent.": "Necesito algo de ayuda, pero no es urgente", - "@I need some help but it's not urgent.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Something's broken but I can work around it to get what I need done.": "Algo no funciona pero puedo trabajar sin ello para terminar lo que necesito.", - "@Something's broken but I can work around it to get what I need done.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I can't get things done until I hear back from you.": "No puedo hacer nada hasta que me contestéis.", - "@I can't get things done until I hear back from you.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "EXTREME CRITICAL EMERGENCY!!": "EMERGENCIA CRÍTICA", - "@EXTREME CRITICAL EMERGENCY!!": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Not Graded": "Sin evaluar", - "@Not Graded": { - "description": "Description for an assignment has not been graded.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Login flow: Normal": "Flujo de inicio de sesión: Normal", - "@Login flow: Normal": { - "description": "Description for the normal login flow", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Login flow: Canvas": "Flujo de inicio de sesión: Canvas", - "@Login flow: Canvas": { - "description": "Description for the Canvas login flow", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Login flow: Site Admin": "Flujo de inicio de sesión: Administrador del sitio", - "@Login flow: Site Admin": { - "description": "Description for the Site Admin login flow", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Login flow: Skip mobile verify": "Flujo de inicio de sesión: Omitir verificación móvil", - "@Login flow: Skip mobile verify": { - "description": "Description for the login flow that skips domain verification for mobile", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Act As User": "Actuar como usuario", - "@Act As User": { - "description": "Label for the button that allows the user to act (masquerade) as another user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Stop Acting as User": "Dejar de actuar como usuario", - "@Stop Acting as User": { - "description": "Label for the button that allows the user to stop acting (masquerading) as another user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "actingAsUser": "Está actuando como {userName}", - "@actingAsUser": { - "description": "Message shown while acting (masquerading) as another user", - "type": "text", - "placeholders_order": [ - "userName" - ], - "placeholders": { - "userName": {} - } - }, - "\"Act as\" is essentially logging in as this user without a password. You will be able to take any action as if you were this user, and from other users' points of views, it will be as if this user performed them. However, audit logs record that you were the one who performed the actions on behalf of this user.": "\"Actuar como\" es básicamente iniciar sesión como si fuera este usuario pero sin una contraseña. Podrás realizar cualquier acción como si fueras este usuario y, desde el punto de vista de los demás usuarios, será como si este usuario las hubiera realizado. Sin embargo, los registros de auditoría indican que tu eres quien ha realizado las acciones en representación de este usuario.", - "@\"Act as\" is essentially logging in as this user without a password. You will be able to take any action as if you were this user, and from other users' points of views, it will be as if this user performed them. However, audit logs record that you were the one who performed the actions on behalf of this user.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Domain": "Dominio", - "@Domain": { - "description": "Text field hint for domain url input", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You must enter a valid domain": "Debes introducir un dominio válido", - "@You must enter a valid domain": { - "description": "Message displayed for domain input error", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "User ID": "Identificación de usuario", - "@User ID": { - "description": "Text field hint for user ID input", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You must enter a user id": "Debes introducir una identificación de usuario", - "@You must enter a user id": { - "description": "Message displayed for user Id input error", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error trying to act as this user. Please check the Domain and User ID and try again.": "Ha habido un error al intentar actuar en nombre de este usuario. Revisa el dominio y la identificación de usuario y vuelve a intentarlo.", - "@There was an error trying to act as this user. Please check the Domain and User ID and try again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "endMasqueradeMessage": "Dejarás de actuar como {userName} y volverás a tu cuenta original.", - "@endMasqueradeMessage": { - "description": "Confirmation message displayed when the user wants to stop acting (masquerading) as another user", - "type": "text", - "placeholders_order": [ - "userName" - ], - "placeholders": { - "userName": {} - } - }, - "endMasqueradeLogoutMessage": "Dejarás de actuar como {userName} y cerrarás la sesión.", - "@endMasqueradeLogoutMessage": { - "description": "Confirmation message displayed when the user wants to stop acting (masquerading) as another user and will be logged out.", - "type": "text", - "placeholders_order": [ - "userName" - ], - "placeholders": { - "userName": {} - } - }, - "How are we doing?": "¿Cómo estás?", - "@How are we doing?": { - "description": "Title for dialog asking user to rate the app out of 5 stars.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Don't show again": "No volver a mostrar", - "@Don't show again": { - "description": "Button to prevent the rating dialog from showing again.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "What can we do better?": "¿Qué podemos mejorar?", - "@What can we do better?": { - "description": "Hint text for providing a comment with the rating.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Send Feedback": "Enviar comentarios", - "@Send Feedback": { - "description": "Button to send rating with feedback", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "ratingDialogEmailSubject": "Sugerencias para Android: Canvas Parent {version}", - "@ratingDialogEmailSubject": { - "description": "The subject for an email to provide feedback for CanvasParent.", - "type": "text", - "placeholders_order": [ - "version" - ], - "placeholders": { - "version": {} - } - }, - "starRating": "{position,plural, =1{{position} estrella}other{{position} estrellas}}", - "@starRating": { - "description": "Accessibility label for the 1 stars to 5 stars rating", - "type": "text", - "placeholders_order": [ - "position" - ], - "placeholders": { - "position": { - "example": 1 - } - } - }, - "Student Pairing": "Emparejamiento del estudiante", - "@Student Pairing": { - "description": "Title for the screen where users can pair to students using a QR code", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Open Canvas Student": "Abrir Canvas Student", - "@Open Canvas Student": { - "description": "Title for QR pairing tutorial screen instructing users to open the Canvas Student app", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You'll need to open your student's Canvas Student app to continue. Go into Main Menu > Settings > Pair with Observer and scan the QR code you see there.": "Para continuar, debes abrir la aplicación Canvas Student de tu estudiante. Ve a Menú Principal > Configuraciones > Emparejar con Observador y escanea el código QR que aparece allí.", - "@You'll need to open your student's Canvas Student app to continue. Go into Main Menu > Settings > Pair with Observer and scan the QR code you see there.": { - "description": "Message explaining how QR code pairing works", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Screenshot showing location of pairing QR code generation in the Canvas Student app": "Captura de pantalla en la que se muestra la ubicación de la generación del código QR de emparejamiento en la aplicación Canvas Student", - "@Screenshot showing location of pairing QR code generation in the Canvas Student app": { - "description": "Content Description for qr pairing tutorial screenshot", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Expired QR Code": "Código QR caducado", - "@Expired QR Code": { - "description": "Error title shown when the users scans a QR code that has expired", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The QR code you scanned may have expired. Refresh the code on the student's device and try again.": "Es posible que el código QR que has escaneado haya caducado. Actualiza el código en el dispositivo del estudiante y vuelve a intentarlo.", - "@The QR code you scanned may have expired. Refresh the code on the student's device and try again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "A network error occurred when adding this student. Check your connection and try again.": "Ha habido un error de la red al añadir a este estudiante. Comprueba tu conexión y vuelve a intentarlo.", - "@A network error occurred when adding this student. Check your connection and try again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Invalid QR Code": "Código QR inválido", - "@Invalid QR Code": { - "description": "Error title shown when the user scans an invalid QR code", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Incorrect Domain": "Dominio incorrecto", - "@Incorrect Domain": { - "description": "Error title shown when the users scane a QR code for a student that belongs to a different domain", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The student you are trying to add belongs to a different school. Log in or create an account with that school to scan this code.": "El estudiante que está intentando añadir pertenece a una escuela diferente. Inicia sesión o crea una cuenta con esa escuela para escanear el código.", - "@The student you are trying to add belongs to a different school. Log in or create an account with that school to scan this code.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Camera Permission": "Permiso de la cámara", - "@Camera Permission": { - "description": "Error title shown when the user wans to scan a QR code but has denied the camera permission", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "This will unpair and remove all enrollments for this student from your account.": "Esto deshará el emparejamiento y eliminará todas las inscripciones de este estudiante en tu cuenta.", - "@This will unpair and remove all enrollments for this student from your account.": { - "description": "Confirmation message shown when the user tries to delete a student from their account", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was a problem removing this student from your account. Please check your connection and try again.": "Ha habido un problema al eliminar a este estudiante de tu cuenta. Comprueba tu conexión y vuelve a intentarlo.", - "@There was a problem removing this student from your account. Please check your connection and try again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Cancel": "Cancelar", - "@Cancel": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "next": "Siguiente", - "@next": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "ok": "Aceptar", - "@ok": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Yes": "Sí", - "@Yes": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No": "No", - "@No": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Retry": "Reintentar", - "@Retry": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Delete": "Eliminar", - "@Delete": { - "description": "Label used for general delete/remove actions", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Done": "Hecho", - "@Done": { - "description": "Label for general done/finished actions", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Refresh": "Actualizar", - "@Refresh": { - "description": "Label for button to refresh data from the web", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "View Description": "Ver descripción", - "@View Description": { - "description": "Button to view the description for an event or assignment", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "expanded": "expandido", - "@expanded": { - "description": "Description for the accessibility reader for list groups that are expanded", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "collapsed": "colapsado", - "@collapsed": { - "description": "Description for the accessibility reader for list groups that are expanded", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "An unexpected error occurred": "Ha habido un error inesperado", - "@An unexpected error occurred": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No description": "Sin descripción", - "@No description": { - "description": "Message used when the assignment has no description", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Launch External Tool": "Iniciar la herramienta externa", - "@Launch External Tool": { - "description": "Button text added to webviews to let users open external tools in their browser", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Interactions on this page are limited by your institution.": "Las interacciones en esta página están limitadas por tu institución.", - "@Interactions on this page are limited by your institution.": { - "description": "Message describing how the webview has limited access due to an instution setting", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "dateAtTime": "{date} a las {time}", - "@dateAtTime": { - "description": "The string to format dates", - "type": "text", - "placeholders_order": [ - "date", - "time" - ], - "placeholders": { - "date": {}, - "time": {} - } - }, - "dueDateAtTime": "Fecha de entrega el {date} a las {time}", - "@dueDateAtTime": { - "description": "The string to format due dates", - "type": "text", - "placeholders_order": [ - "date", - "time" - ], - "placeholders": { - "date": {}, - "time": {} - } - }, - "No Due Date": "No hay fecha de entrega", - "@No Due Date": { - "description": "Label for assignments that do not have a due date", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Filter": "Filtrar", - "@Filter": { - "description": "Label for buttons to filter what items are visible", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "unread": "no leído", - "@unread": { - "description": "Label for things that are marked as unread", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "unreadCount": "{count} no leído", - "@unreadCount": { - "description": "Formatted string for when there are a number of unread items", - "type": "text", - "placeholders_order": [ - "count" - ], - "placeholders": { - "count": {} - } - }, - "badgeNumberPlus": "{count}+", - "@badgeNumberPlus": { - "description": "Formatted string for when too many items are being notified in a badge, generally something like: 99+", - "type": "text", - "placeholders_order": [ - "count" - ], - "placeholders": { - "count": {} - } - }, - "There was an error loading this announcement": "Ha habido un error al cargar este anuncio", - "@There was an error loading this announcement": { - "description": "Message shown when an announcement detail screen fails to load", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Network error": "Error de red", - "@Network error": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Under Construction": "En construcción", - "@Under Construction": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "We are currently building this feature for your viewing pleasure.": "Actualmente estamos desarrollando esta funcionalidad para que puedas disfrutarla.", - "@We are currently building this feature for your viewing pleasure.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Request Login Help Button": "Botón Solicitar ayuda para iniciar sesión", - "@Request Login Help Button": { - "description": "Accessibility hint for button that opens help dialog for a login help request", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Request Login Help": "Solicitar ayuda para iniciar sesión", - "@Request Login Help": { - "description": "Title of help dialog for a login help request", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I'm having trouble logging in": "Tengo problemas para iniciar sesión", - "@I'm having trouble logging in": { - "description": "Subject of help dialog for a login help request", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "An error occurred when trying to display this link": "Ha habido un error al intentar mostrar este enlace", - "@An error occurred when trying to display this link": { - "description": "Error message shown when a link can't be opened", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "We are unable to display this link, it may belong to an institution you currently aren't logged in to.": "No podemos mostrar este enlace; es posible que pertenezca a una institución en la que no tienes sesión abierta actualmente.", - "@We are unable to display this link, it may belong to an institution you currently aren't logged in to.": { - "description": "Description for error page shown when clicking a link", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Link Error": "Error de enlace", - "@Link Error": { - "description": "Title for error page shown when clicking a link", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Open In Browser": "Abrir en el navegador", - "@Open In Browser": { - "description": "Text for button to open a link in the browswer", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You'll find the QR code on the web in your account profile. Click 'QR for Mobile Login' in the list.": "Encontrarás el código QR en el sitio web, en tu perfil de la cuenta. Haz clic en “QR para Inicio de sesión móvil” en la lista.", - "@You'll find the QR code on the web in your account profile. Click 'QR for Mobile Login' in the list.": { - "description": "Text for qr login tutorial screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Locate QR Code": "Ubicar código QR", - "@Locate QR Code": { - "description": "Text for qr login button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Please scan a QR code generated by Canvas": "Escanea un código QR generado por Canvas", - "@Please scan a QR code generated by Canvas": { - "description": "Text for qr login error with incorrect qr code", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error logging in. Please generate another QR Code and try again.": "Ha habido un error al iniciar sesión. Genera otro código QR y vuelve a intentarlo.", - "@There was an error logging in. Please generate another QR Code and try again.": { - "description": "Text for qr login error", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Screenshot showing location of QR code generation in browser": "Captura de pantalla en la que se muestra la ubicación de la generación del código QR en el navegador", - "@Screenshot showing location of QR code generation in browser": { - "description": "Content Description for qr login tutorial screenshot", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "QR scanning requires camera access": "Para escanear un código QR se requiere acceso a la cámara", - "@QR scanning requires camera access": { - "description": "placeholder for camera error for QR code scan", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The linked item is no longer available": "El ítem enlazado ya no está disponible", - "@The linked item is no longer available": { - "description": "error message when the alert could no be opened", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Message sent": "Mensaje enviado", - "@Message sent": { - "description": "confirmation message on the screen when the user succesfully sends a message", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Acceptable Use Policy": "Política de uso aceptable", - "@Acceptable Use Policy": { - "description": "title for the acceptable use policy screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Submit": "Entregar", - "@Submit": { - "description": "submit button title for acceptable use policy screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Either you're a new user or the Acceptable Use Policy has changed since you last agreed to it. Please agree to the Acceptable Use Policy before you continue.": "Es un usuario nuevo o la Política de uso aceptable ha cambiado desde la última vez que la aceptó. Aceptar la política de uso aceptable antes de continuar.", - "@Either you're a new user or the Acceptable Use Policy has changed since you last agreed to it. Please agree to the Acceptable Use Policy before you continue.": { - "description": "acceptable use policy screen description", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I agree to the Acceptable Use Policy.": "Acepto la política de uso aceptable.", - "@I agree to the Acceptable Use Policy.": { - "description": "acceptable use policy switch title", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "About": "Acerca de", - "@About": { - "description": "Title for about menu item in settings", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "App": "Aplicación", - "@App": { - "description": "Title for App field on about page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Login ID": "Identificación de inicio de sesión", - "@Login ID": { - "description": "Title for Login ID field on about page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Email": "Correo electrónico", - "@Email": { - "description": "Title for Email field on about page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Version": "Versión", - "@Version": { - "description": "Title for Version field on about page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Instructure logo": "Logo de Instructure", - "@Instructure logo": { - "description": "Semantics label for the Instructure logo on the about page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - } -} \ No newline at end of file diff --git a/apps/flutter_parent/lib/l10n/res/intl_fi.arb b/apps/flutter_parent/lib/l10n/res/intl_fi.arb deleted file mode 100644 index 209d49a70d..0000000000 --- a/apps/flutter_parent/lib/l10n/res/intl_fi.arb +++ /dev/null @@ -1,2753 +0,0 @@ -{ - "@@last_modified": "2023-08-25T11:04:20.901151", - "alertsLabel": "Hälytykset", - "@alertsLabel": { - "description": "The label for the Alerts tab", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "calendarLabel": "Kalenteri", - "@calendarLabel": { - "description": "The label for the Calendar tab", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "coursesLabel": "Kurssit", - "@coursesLabel": { - "description": "The label for the Courses tab", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Students": "Ei opiskelijoita", - "@No Students": { - "description": "Text for when an observer has no students they are observing", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Tap to show student selector": "Näytä opiskelijan valintatoiminto napauttamalla", - "@Tap to show student selector": { - "description": "Semantics label for the area that will show the student selector when tapped", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Tap to pair with a new student": "Muodosta yhteys uuden opiskelijan kanssa napauttamalla", - "@Tap to pair with a new student": { - "description": "Semantics label for the add student button in the student selector", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Tap to select this student": "Valitse tämä opiskelija napauttamalla", - "@Tap to select this student": { - "description": "Semantics label on individual students in the student switcher", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Manage Students": "Hallitse opiskelijoita", - "@Manage Students": { - "description": "Label text for the Manage Students nav drawer button as well as the title for the Manage Students screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Help": "Ohje", - "@Help": { - "description": "Label text for the help nav drawer button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Log Out": "Kirjaudu ulos", - "@Log Out": { - "description": "Label text for the Log Out nav drawer button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Switch Users": "Vaihda käyttäjiä", - "@Switch Users": { - "description": "Label text for the Switch Users nav drawer button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "appVersion": "v. {version}", - "@appVersion": { - "description": "App version shown in the navigation drawer", - "type": "text", - "placeholders_order": [ - "version" - ], - "placeholders": { - "version": {} - } - }, - "Are you sure you want to log out?": "Haluatko varmasti kirjautua ulos?", - "@Are you sure you want to log out?": { - "description": "Confirmation message displayed when the user tries to log out", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Calendars": "Kalenterit", - "@Calendars": { - "description": "Label for button that lets users select which calendars to display", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "nextMonth": "Seuraava kuukausi: {month}", - "@nextMonth": { - "description": "Label for the button that switches the calendar to the next month", - "type": "text", - "placeholders_order": [ - "month" - ], - "placeholders": { - "month": {} - } - }, - "previousMonth": "Edellinen kuukausi: {month}", - "@previousMonth": { - "description": "Label for the button that switches the calendar to the previous month", - "type": "text", - "placeholders_order": [ - "month" - ], - "placeholders": { - "month": {} - } - }, - "nextWeek": "Seuraava viikko alkaen {date}", - "@nextWeek": { - "description": "Label for the button that switches the calendar to the next week", - "type": "text", - "placeholders_order": [ - "date" - ], - "placeholders": { - "date": {} - } - }, - "previousWeek": "Edellinen viikko alkaen {date}", - "@previousWeek": { - "description": "Label for the button that switches the calendar to the previous week", - "type": "text", - "placeholders_order": [ - "date" - ], - "placeholders": { - "date": {} - } - }, - "selectedMonthLabel": "Kuukausi {month}", - "@selectedMonthLabel": { - "description": "Accessibility label for the button that expands/collapses the month view", - "type": "text", - "placeholders_order": [ - "month" - ], - "placeholders": { - "month": {} - } - }, - "expand": "laajenna", - "@expand": { - "description": "Accessibility label for the on-tap hint for the button that expands/collapses the month view", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "collapse": "kutista", - "@collapse": { - "description": "Accessibility label for the on-tap hint for the button that expands/collapses the month view", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "pointsPossible": "{points} mahdollista pistettä", - "@pointsPossible": { - "description": "Screen reader label used for the points possible for an assignment, quiz, etc.", - "type": "text", - "placeholders_order": [ - "points" - ], - "placeholders": { - "points": {} - } - }, - "calendarDaySemanticsLabel": "{eventCount,plural, =1{{date}, {eventCount} tapahtuma}other{{date}, {eventCount} tapahtumaa}}", - "@calendarDaySemanticsLabel": { - "description": "Screen reader label used for calendar day, reads the date and count of events", - "type": "text", - "placeholders_order": [ - "date", - "eventCount" - ], - "placeholders": { - "date": {}, - "eventCount": {} - } - }, - "No Events Today!": "Ei tapahtumia tänään!", - "@No Events Today!": { - "description": "Title displayed when there are no calendar events for the current day", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "It looks like a great day to rest, relax, and recharge.": "Näyttää olevan hyvä päivä levätä, rentoutua ja latautua.", - "@It looks like a great day to rest, relax, and recharge.": { - "description": "Message displayed when there are no calendar events for the current day", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading your student's calendar": "Opiskelijakalenterin latauksessa ilmeni virhe", - "@There was an error loading your student's calendar": { - "description": "Message displayed when calendar events could not be loaded for the current student", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Tap to favorite the courses you want to see on the Calendar. Select up to 10.": "Valitse napauttamalla kurssit, jotka haluat nähdä kalenterissa. Valitse enintään 10.", - "@Tap to favorite the courses you want to see on the Calendar. Select up to 10.": { - "description": "Description text on calendar filter screen.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You may only choose 10 calendars to display": "Voit valita vain 10 kalenteria näytettäväksi", - "@You may only choose 10 calendars to display": { - "description": "Error text when trying to select more than 10 calendars", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You must select at least one calendar to display": "Sinun täytyy valita vähintään yksi kalenteri näytettäväksi", - "@You must select at least one calendar to display": { - "description": "Error text when trying to de-select all calendars", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Planner Note": "Kalenterin merkintä", - "@Planner Note": { - "description": "Label used for notes in the planner", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Go to today": "Siirry tähän päivään", - "@Go to today": { - "description": "Accessibility label used for the today button in the planner", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Previous Logins": "Edelliset kirjautumiset", - "@Previous Logins": { - "description": "Label for the list of previous user logins", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "canvasLogoLabel": "Canvas-logo", - "@canvasLogoLabel": { - "description": "The semantics label for the Canvas logo", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "findSchool": "Etsi koulu", - "@findSchool": { - "description": "Text for the find-my-school button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "findAnotherSchool": "Etsi muu koulu", - "@findAnotherSchool": { - "description": "Text for the find-another-school button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "domainSearchInputHint": "Kirjoita koulun nimi tai alue...", - "@domainSearchInputHint": { - "description": "Input hint for the text box on the domain search screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "noDomainResults": "Ei löydy kouluja, jotka täsmäävät haun ”{query}” kanssa", - "@noDomainResults": { - "description": "Message shown to users when the domain search query did not return any results", - "type": "text", - "placeholders_order": [ - "query" - ], - "placeholders": { - "query": {} - } - }, - "domainSearchHelpLabel": "Miten löydän kouluni tai alueeni?", - "@domainSearchHelpLabel": { - "description": "Label for the help button on the domain search screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "canvasGuides": "Canvas-oppaat", - "@canvasGuides": { - "description": "Proper name for the Canvas Guides. This will be used in the domainSearchHelpBody text and will be highlighted and clickable", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "canvasSupport": "Canvas-tuki", - "@canvasSupport": { - "description": "Proper name for Canvas Support. This will be used in the domainSearchHelpBody text and will be highlighted and clickable", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "domainSearchHelpBody": "Yritä etsiä sen koulun tai alueen nimeä, jolle yrität mennä, kuten “Smithin yksityiskoulu” tai “Smithin kunnan koulut”. Voit myös syöttää Canvasin verkko-osoitteen suoraan, kuten “smith.instructure.com”.\n\nLisätietoja laitoksesi Canvas-tilin etsimisestä löytyy seuraavasta {canvasGuides}, ota yhteyttä {canvasSupport}, tai pyydä apua koulustasi.", - "@domainSearchHelpBody": { - "description": "The body text shown in the help dialog on the domain search screen", - "type": "text", - "placeholders_order": [ - "canvasGuides", - "canvasSupport" - ], - "placeholders": { - "canvasGuides": {}, - "canvasSupport": {} - } - }, - "Uh oh!": "Voi ei!", - "@Uh oh!": { - "description": "Title of the screen that shows when a crash has occurred", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "We’re not sure what happened, but it wasn’t good. Contact us if this keeps happening.": "Emme ole varmoja, mitä tapahtui, mutta se ei ollut hyvä. Ota meihin yhteyttä, jos tätä tapahtuu edelleen.", - "@We’re not sure what happened, but it wasn’t good. Contact us if this keeps happening.": { - "description": "Message shown when a crash has occurred", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Contact Support": "Ota yhteyttä tukeen", - "@Contact Support": { - "description": "Label for the button that allows users to contact support after a crash has occurred", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "View error details": "Näytä virhetiedot", - "@View error details": { - "description": "Label for the button that allowed users to view crash details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Restart app": "Käynnistä sovellus uudelleen", - "@Restart app": { - "description": "Label for the button that will restart the entire application", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Application version": "Sovelluksen versio", - "@Application version": { - "description": "Label for the application version displayed in the crash details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Device model": "Laitteen malli", - "@Device model": { - "description": "Label for the device model displayed in the crash details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Android OS version": "Android-käyttöjärjestelmän versio", - "@Android OS version": { - "description": "Label for the Android operating system version displayed in the crash details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Full error message": "Koko virhesanoma", - "@Full error message": { - "description": "Label for the full error message displayed in the crash details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Inbox": "Viestit", - "@Inbox": { - "description": "Title for the Inbox screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading your inbox messages.": "Tulevien laatikon latauksessa ilmeni virhe.", - "@There was an error loading your inbox messages.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Subject": "Ei aihetta", - "@No Subject": { - "description": "Title used for inbox messages that have no subject", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unable to fetch courses. Please check your connection and try again.": "Ei voida noutaa kursseja. Tarkasta yhteytesi ja yritä uudelleen.", - "@Unable to fetch courses. Please check your connection and try again.": { - "description": "Message shown when an error occured while loading courses", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Choose a course to message": "Valitse kurssi, jolle lähetetään viesti", - "@Choose a course to message": { - "description": "Header in the course list shown when the user is choosing which course to associate with a new message", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Inbox Zero": "Saapuvia posteja nolla!", - "@Inbox Zero": { - "description": "Title of the message shown when there are no inbox messages", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You’re all caught up!": "Olet ajan tasalla!", - "@You’re all caught up!": { - "description": "Subtitle of the message shown when there are no inbox messages", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading recipients for this course": "Tämän kurssin vastaanottajien lataamisessa ilmeni virhe", - "@There was an error loading recipients for this course": { - "description": "Message shown when attempting to create a new message but the recipients list failed to load", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unable to send message. Check your connection and try again.": "Viestin lähetys ei onnistunut. Tarkasta verkkoyhteys ja yritä uudelleen.", - "@Unable to send message. Check your connection and try again.": { - "description": "Message show when there was an error creating or sending a new message", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unsaved changes": "Tallentamattomat muutokset", - "@Unsaved changes": { - "description": "Title of the dialog shown when the user tries to leave with unsaved changes", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Are you sure you wish to close this page? Your unsent message will be lost.": "Haluatko varmasti sulkea tämän sivun? Lähettämätön viestisi menetetään.", - "@Are you sure you wish to close this page? Your unsent message will be lost.": { - "description": "Body text of the dialog shown when the user tries leave with unsaved changes", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "New message": "Uusi viesti", - "@New message": { - "description": "Title of the new-message screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Add attachment": "Lisää liite", - "@Add attachment": { - "description": "Tooltip for the add-attachment button in the new-message screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Send message": "Lähetä viesti", - "@Send message": { - "description": "Tooltip for the send-message button in the new-message screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Select recipients": "Valitse vastaanottajat", - "@Select recipients": { - "description": "Tooltip for the button that allows users to select message recipients", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No recipients selected": "Vastaanottajia ei valittu", - "@No recipients selected": { - "description": "Hint displayed when the user has not selected any message recipients", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Message subject": "Viestin otsikko", - "@Message subject": { - "description": "Hint text displayed in the input field for the message subject", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Message": "Viesti", - "@Message": { - "description": "Hint text displayed in the input field for the message body", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Recipients": "Vastaanottajat", - "@Recipients": { - "description": "Label for message recipients", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "plusRecipientCount": "+{count}", - "@plusRecipientCount": { - "description": "Shows the number of recipients that are selected but not displayed on screen.", - "type": "text", - "placeholders_order": [ - "count" - ], - "placeholders": { - "count": { - "example": 5 - } - } - }, - "Failed. Tap for options.": "Epäonnistui. Asetukset napauttamalla.", - "@Failed. Tap for options.": { - "description": "Short message shown on a message attachment when uploading has failed", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "courseForWhom": "{studentShortName}", - "@courseForWhom": { - "description": "Describes for whom a course is for (i.e. for Bill)", - "type": "text", - "placeholders_order": [ - "studentShortName" - ], - "placeholders": { - "studentShortName": {} - } - }, - "messageLinkPostscript": "Koskee: {studentName}, {linkUrl}", - "@messageLinkPostscript": { - "description": "A postscript appended to new messages that clarifies which student is the subject of the message and also includes a URL for the related Canvas component (course, assignment, event, etc).", - "type": "text", - "placeholders_order": [ - "studentName", - "linkUrl" - ], - "placeholders": { - "studentName": {}, - "linkUrl": {} - } - }, - "There was an error loading this conversation": "Tämän keskustelun latauksessa ilmeni virhe", - "@There was an error loading this conversation": { - "description": "Message shown when a conversation fails to load", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Reply": "Vastaa", - "@Reply": { - "description": "Button label for replying to a conversation", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Reply All": "Vastaa kaikille", - "@Reply All": { - "description": "Button label for replying to all conversation participants", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unknown User": "Tuntematon käyttäjä", - "@Unknown User": { - "description": "Label used where the user name is not known", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "me": "minä", - "@me": { - "description": "First-person pronoun (i.e. 'me') that will be used in message author info, e.g. 'Me to 4 others' or 'Jon Snow to me'", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "authorToRecipient": "{authorName} - {recipientName}", - "@authorToRecipient": { - "description": "Author info for a single-recipient message; includes both the author name and the recipient name.", - "type": "text", - "placeholders_order": [ - "authorName", - "recipientName" - ], - "placeholders": { - "authorName": {}, - "recipientName": {} - } - }, - "authorToNOthers": "{howMany,plural, =1{{authorName} 1 muu}other{{authorName} {howMany} muuhun}}", - "@authorToNOthers": { - "description": "Author info for a mutli-recipient message; includes the author name and the number of recipients", - "type": "text", - "placeholders_order": [ - "authorName", - "howMany" - ], - "placeholders": { - "authorName": {}, - "howMany": {} - } - }, - "authorToRecipientAndNOthers": "{howMany,plural, =1{{authorName} {recipientName} ja 1 muu}other{{authorName} {recipientName} ja {howMany} muuta}}", - "@authorToRecipientAndNOthers": { - "description": "Author info for a multi-recipient message; includes the author name, one recipient name, and the number of other recipients", - "type": "text", - "placeholders_order": [ - "authorName", - "recipientName", - "howMany" - ], - "placeholders": { - "authorName": {}, - "recipientName": {}, - "howMany": {} - } - }, - "Download": "Lataa", - "@Download": { - "description": "Label for the button that will begin downloading a file", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Open with another app": "Avaa toisella sovelluksella", - "@Open with another app": { - "description": "Label for the button that will allow users to open a file with another app", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There are no installed applications that can open this file": "Ei ole asennettuna sovelluksia, joilla tämä tiedosto voidaan avata", - "@There are no installed applications that can open this file": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unsupported File": "Tukematon tiedosto", - "@Unsupported File": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "This file is unsupported and can’t be viewed through the app": "Tätä tiedostoa ei tueta eikä sitä voida tarkastella sovelluksen läpi", - "@This file is unsupported and can’t be viewed through the app": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unable to play this media file": "Tätä mediatiedostoa ei voida toistaa", - "@Unable to play this media file": { - "description": "Message shown when audio or video media could not be played", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unable to load this image": "Tätä kuvaa ei voida ladata", - "@Unable to load this image": { - "description": "Message shown when an image file could not be loaded or displayed", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading this file": "Tämän tiedoston latauksessa ilmeni virhe", - "@There was an error loading this file": { - "description": "Message shown when a file could not be loaded or displayed", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Courses": "Ei kursseja", - "@No Courses": { - "description": "Title for having no courses", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Your student’s courses might not be published yet.": "Tämän opiskelijan kursseja ei ehkä ole vielä julkaistu.", - "@Your student’s courses might not be published yet.": { - "description": "Message for having no courses", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading your student’s courses.": "Opiskelijasi kurssien latauksessa ilmeni virhe.", - "@There was an error loading your student’s courses.": { - "description": "Message displayed when the list of student courses could not be loaded", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Grade": "Ei arvosanaa", - "@No Grade": { - "description": "Message shown when there is currently no grade available for a course", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Filter by": "Suodatusperuste", - "@Filter by": { - "description": "Title for list of terms to filter grades by", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Grades": "Arvosanat", - "@Grades": { - "description": "Label for the \"Grades\" tab in course details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Syllabus": "Opinto-ohjelma", - "@Syllabus": { - "description": "Label for the \"Syllabus\" tab in course details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Front Page": "Etusivu", - "@Front Page": { - "description": "Label for the \"Front Page\" tab in course details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Summary": "Yhteenveto", - "@Summary": { - "description": "Label for the \"Summary\" tab in course details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Send a message about this course": "Lähetä viesti tästä kurssista", - "@Send a message about this course": { - "description": "Accessibility hint for the course messaage floating action button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Total Grade": "Kokonaisarvosana", - "@Total Grade": { - "description": "Label for the total grade in the course", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Graded": "Arvioitu", - "@Graded": { - "description": "Label for assignments that have been graded", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Submitted": "Lähetetty", - "@Submitted": { - "description": "Label for assignments that have been submitted", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Not Submitted": "Ei lähetetty", - "@Not Submitted": { - "description": "Label for assignments that have not been submitted", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Late": "Myöhään", - "@Late": { - "description": "Label for assignments that have been marked late or submitted late", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Missing": "Puuttuu", - "@Missing": { - "description": "Label for assignments that have been marked missing or are not submitted and past the due date", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "-": "-", - "@-": { - "description": "Value representing no score for student submission", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "All Grading Periods": "Kaikki arvosanojen antojaksot", - "@All Grading Periods": { - "description": "Label for selecting all grading periods", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Assignments": "Ei tehtäviä", - "@No Assignments": { - "description": "Title for the no assignments message", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "It looks like assignments haven't been created in this space yet.": "Näyttää siltä kuin tehtäviä ei vielä olisi luotu tässä tilassa.", - "@It looks like assignments haven't been created in this space yet.": { - "description": "Message for no assignments", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading the summary details for this course.": "Tämän kurssin yhteenvetotietojen lataamisessa ilmeni virhe.", - "@There was an error loading the summary details for this course.": { - "description": "Message shown when the course summary could not be loaded", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Summary": "Ei yhteenvetoa", - "@No Summary": { - "description": "Title displayed when there are no items in the course summary", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "This course does not have any assignments or calendar events yet.": "Kurssilla ei ole vielä tehtäviä tai kalenterin tehtäviä.", - "@This course does not have any assignments or calendar events yet.": { - "description": "Message displayed when there are no items in the course summary", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "gradeFormatScoreOutOfPointsPossible": "{score}/{pointsPossible}", - "@gradeFormatScoreOutOfPointsPossible": { - "description": "Formatted string for a student score out of the points possible", - "type": "text", - "placeholders_order": [ - "score", - "pointsPossible" - ], - "placeholders": { - "score": {}, - "pointsPossible": {} - } - }, - "contentDescriptionScoreOutOfPointsPossible": "{score}/{pointsPossible} pistettä", - "@contentDescriptionScoreOutOfPointsPossible": { - "description": "Formatted string for a student score out of the points possible", - "type": "text", - "placeholders_order": [ - "score", - "pointsPossible" - ], - "placeholders": { - "score": {}, - "pointsPossible": {} - } - }, - "gradesSubjectMessage": "Koskee: {studentName}, Arvosanat", - "@gradesSubjectMessage": { - "description": "The subject line for a message to a teacher regarding a student's grades", - "type": "text", - "placeholders_order": [ - "studentName" - ], - "placeholders": { - "studentName": {} - } - }, - "syllabusSubjectMessage": "Koskee: {studentName}, Opinto-ohjelma", - "@syllabusSubjectMessage": { - "description": "The subject line for a message to a teacher regarding a course syllabus", - "type": "text", - "placeholders_order": [ - "studentName" - ], - "placeholders": { - "studentName": {} - } - }, - "frontPageSubjectMessage": "Koskee: {studentName}, Etusivu", - "@frontPageSubjectMessage": { - "description": "The subject line for a message to a teacher regarding a course front page", - "type": "text", - "placeholders_order": [ - "studentName" - ], - "placeholders": { - "studentName": {} - } - }, - "assignmentSubjectMessage": "Koskee: {studentName}, Tehtävä - {assignmentName}", - "@assignmentSubjectMessage": { - "description": "The subject line for a message to a teacher regarding a student's assignment", - "type": "text", - "placeholders_order": [ - "studentName", - "assignmentName" - ], - "placeholders": { - "studentName": {}, - "assignmentName": {} - } - }, - "eventSubjectMessage": "Koskee: {studentName}, Tapahtuma - {eventTitle}", - "@eventSubjectMessage": { - "description": "The subject line for a message to a teacher regarding a calendar event", - "type": "text", - "placeholders_order": [ - "studentName", - "eventTitle" - ], - "placeholders": { - "studentName": {}, - "eventTitle": {} - } - }, - "There is no page information available.": "Sivutietoja ei ole saatavilla.", - "@There is no page information available.": { - "description": "Description for when no page information is available", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Assignment Details": "Tehtävän tiedot", - "@Assignment Details": { - "description": "Title for the page that shows details for an assignment", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "assignmentTotalPoints": "{points} pistettä", - "@assignmentTotalPoints": { - "description": "Label used for the total points the assignment is worth", - "type": "text", - "placeholders_order": [ - "points" - ], - "placeholders": { - "points": {} - } - }, - "assignmentTotalPointsAccessible": "{points} pistettä", - "@assignmentTotalPointsAccessible": { - "description": "Screen reader label used for the total points the assignment is worth", - "type": "text", - "placeholders_order": [ - "points" - ], - "placeholders": { - "points": {} - } - }, - "Due": "Määräpäivä", - "@Due": { - "description": "Label for an assignment due date", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Grade": "Arvosana", - "@Grade": { - "description": "Label for the section that displays an assignment's grade", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Locked": "Lukittu", - "@Locked": { - "description": "Label for when an assignment is locked", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "assignmentLockedModule": "Tehtävä on lukittu moduulilla ”{moduleName}”.", - "@assignmentLockedModule": { - "description": "The locked description when an assignment is locked by a module", - "type": "text", - "placeholders_order": [ - "moduleName" - ], - "placeholders": { - "moduleName": {} - } - }, - "Remind Me": "Muistuta minua", - "@Remind Me": { - "description": "Label for the row to set reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Set a date and time to be notified of this specific assignment.": "Määritä päivämäärä ja aika, jolloin sinulle ilmoitetaan tästä määrätystä tehtävästä.", - "@Set a date and time to be notified of this specific assignment.": { - "description": "Description for row to set reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You will be notified about this assignment on…": "Saat ilmoituksen tästä tehtävästä...", - "@You will be notified about this assignment on…": { - "description": "Description for when a reminder is set", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Instructions": "Ohjeet", - "@Instructions": { - "description": "Label for the description of the assignment when it has quiz instructions", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Send a message about this assignment": "Lähetä viesti tästä tehtävästä", - "@Send a message about this assignment": { - "description": "Accessibility hint for the assignment messaage floating action button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "This app is not authorized for use.": "Tätä sovellusta ei ole valtuutettu käyttöön.", - "@This app is not authorized for use.": { - "description": "The error shown when the app being used is not verified by Canvas", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The server you entered is not authorized for this app.": "Syöttämääsi palvelinta ei ole valtuutettu tälle sovellukselle.", - "@The server you entered is not authorized for this app.": { - "description": "The error shown when the desired login domain is not verified by Canvas", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The user agent for this app is not authorized.": "Tämän sovelluksen käyttäjän edustajalle ei ole annettu valtuutuksia.", - "@The user agent for this app is not authorized.": { - "description": "The error shown when the user agent during verification is not verified by Canvas", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "We were unable to verify the server for use with this app.": "Emme voineet vahvistaa tämän sovelluksen kanssa käytettävää palvelinta.", - "@We were unable to verify the server for use with this app.": { - "description": "The generic error shown when we are unable to verify with Canvas", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Reminders": "Muistutukset", - "@Reminders": { - "description": "Name of the system notification channel for assignment and event reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Notifications for reminders about assignments and calendar events": "Muistutusilmoitukset tehtävistä ja kalenteritapahtumista", - "@Notifications for reminders about assignments and calendar events": { - "description": "Description of the system notification channel for assignment and event reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Reminders have changed!": "Muistutukset ovat muuttuneet!", - "@Reminders have changed!": { - "description": "Title of the dialog shown when the user needs to update their reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "In order to provide you with a better experience, we have updated how reminders work. You can add new reminders by viewing an assignment or calendar event and tapping the switch under the \"Remind Me\" section.\n\nBe aware that any reminders created with older versions of this app will not be compatible with the new changes and you will need to create them again.": "Jotta voimme tarjota sinulle paremman kokemuksen, olemme päivittäneet sitä, miten muistutukset toimivat. Voit lisätä uusia muistutuksia tarkastelemalla tehtävää tai kalenteritapahtumaa ja napauttamalla kytkintä ”Muistuta minua” -osassa.\n\nOle tietoinen, että kaikki muistutukset, jotka on luotu tämän sovelluksen vanhemmilla versioilla, eivät ole yhteensopivia uusien muutosten kanssa ja sinun täytyy luoda ne uudelleen.", - "@In order to provide you with a better experience, we have updated how reminders work. You can add new reminders by viewing an assignment or calendar event and tapping the switch under the \"Remind Me\" section.\n\nBe aware that any reminders created with older versions of this app will not be compatible with the new changes and you will need to create them again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Not a parent?": "Et ole vanhempi?", - "@Not a parent?": { - "description": "Title for the screen that shows when the user is not observing any students", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "We couldn't find any students associated with this account": "Emme löytäneet opiskelijoita, jotka liittyisivät tähän tiliin", - "@We couldn't find any students associated with this account": { - "description": "Subtitle for the screen that shows when the user is not observing any students", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Are you a student or teacher?": "Oletko opiskelija vai opettaja?", - "@Are you a student or teacher?": { - "description": "Label for button that will show users the option to view other Canvas apps in the Play Store", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "One of our other apps might be a better fit. Tap one to visit the Play Store.": "Yksi muista sovelluksistamme saattaa olla paremmin sopiva. Napsauta yhtä vieraillaksesi Play Storessa.", - "@One of our other apps might be a better fit. Tap one to visit the Play Store.": { - "description": "Description of options to view other Canvas apps in the Play Store", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Return to Login": "Palaa kirjautumiseen", - "@Return to Login": { - "description": "Label for the button that returns the user to the login screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "STUDENT": "OPISKELIJA", - "@STUDENT": { - "description": "The \"student\" portion of the \"Canvas Student\" app name, in all caps. \"Canvas\" is excluded in this context as it will be displayed to the user as a wordmark image", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "TEACHER": "OPETTAJA", - "@TEACHER": { - "description": "The \"teacher\" portion of the \"Canvas Teacher\" app name, in all caps. \"Canvas\" is excluded in this context as it will be displayed to the user as a wordmark image", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Canvas Student": "Canvas-opiskelija", - "@Canvas Student": { - "description": "The name of the Canvas Student app. Only \"Student\" should be translated as \"Canvas\" is a brand name in this context and should not be translated.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Canvas Teacher": "Canvas-opettaja", - "@Canvas Teacher": { - "description": "The name of the Canvas Teacher app. Only \"Teacher\" should be translated as \"Canvas\" is a brand name in this context and should not be translated.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Alerts": "Ei hälytyksiä", - "@No Alerts": { - "description": "The title for the empty message to show to users when there are no alerts for the student.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There’s nothing to be notified of yet.": "Ei ole vielä mitään ilmoitettavaa.", - "@There’s nothing to be notified of yet.": { - "description": "The empty message to show to users when there are no alerts for the student.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "dismissAlertLabel": "Ohita {alertTitle}", - "@dismissAlertLabel": { - "description": "Accessibility label to dismiss an alert", - "type": "text", - "placeholders_order": [ - "alertTitle" - ], - "placeholders": { - "alertTitle": {} - } - }, - "Course Announcement": "Kurssin ilmoitus", - "@Course Announcement": { - "description": "Title for alerts when there is a course announcement", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Institution Announcement": "Laitoksen ilmoitus", - "@Institution Announcement": { - "description": "Title for alerts when there is an institution announcement", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "assignmentGradeAboveThreshold": "Tehtävän arvosana yllä {threshold}", - "@assignmentGradeAboveThreshold": { - "description": "Title for alerts when an assignment grade is above the threshold value", - "type": "text", - "placeholders_order": [ - "threshold" - ], - "placeholders": { - "threshold": {} - } - }, - "assignmentGradeBelowThreshold": "Tehtävän arvosana alla {threshold}", - "@assignmentGradeBelowThreshold": { - "description": "Title for alerts when an assignment grade is below the threshold value", - "type": "text", - "placeholders_order": [ - "threshold" - ], - "placeholders": { - "threshold": {} - } - }, - "courseGradeAboveThreshold": "Kurssin arvosana yllä {threshold}", - "@courseGradeAboveThreshold": { - "description": "Title for alerts when a course grade is above the threshold value", - "type": "text", - "placeholders_order": [ - "threshold" - ], - "placeholders": { - "threshold": {} - } - }, - "courseGradeBelowThreshold": "Kurssin arvosana alla {threshold}", - "@courseGradeBelowThreshold": { - "description": "Title for alerts when a course grade is below the threshold value", - "type": "text", - "placeholders_order": [ - "threshold" - ], - "placeholders": { - "threshold": {} - } - }, - "Settings": "Asetukset", - "@Settings": { - "description": "Title for the settings screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Theme": "Teema", - "@Theme": { - "description": "Label for the light/dark theme section in the settings page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Dark Mode": "Tumma tila", - "@Dark Mode": { - "description": "Label for the button that enables dark mode", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Light Mode": "Vaalea tila", - "@Light Mode": { - "description": "Label for the button that enables light mode", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "High Contrast Mode": "Korkean kontrastin tila", - "@High Contrast Mode": { - "description": "Label for the switch that toggles high contrast mode", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Use Dark Theme in Web Content": "Käytä pimeää teemaa verkon sisällössä", - "@Use Dark Theme in Web Content": { - "description": "Label for the switch that toggles dark mode for webviews", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Appearance": "Ulkoasu", - "@Appearance": { - "description": "Label for the appearance section in the settings page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Successfully submitted!": "Lähetetty onnistuneesti!", - "@Successfully submitted!": { - "description": "Title displayed in the grade cell for an assignment that has been submitted", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "submissionStatusSuccessSubtitle": "Tämä tehtävä lähetettiin {date} {time} ja odottaa arvosanan antoa", - "@submissionStatusSuccessSubtitle": { - "description": "Subtitle displayed in the grade cell for an assignment that has been submitted and is awaiting a grade", - "type": "text", - "placeholders_order": [ - "date", - "time" - ], - "placeholders": { - "date": {}, - "time": {} - } - }, - "outOfPoints": "{howMany,plural, =1{/1 piste}other{/{points} pistettä}}", - "@outOfPoints": { - "description": "Description for an assignment grade that has points without a current scoroe", - "type": "text", - "placeholders_order": [ - "points", - "howMany" - ], - "placeholders": { - "points": {}, - "howMany": {} - } - }, - "Excused": "Vapautettu", - "@Excused": { - "description": "Grading status for an assignment marked as excused", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Complete": "Valmis", - "@Complete": { - "description": "Grading status for an assignment marked as complete", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Incomplete": "Keskeneräinen", - "@Incomplete": { - "description": "Grading status for an assignment marked as incomplete", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "minus": "miinus", - "@minus": { - "description": "Screen reader-friendly replacement for the \"-\" character in letter grades like \"A-\"", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "latePenalty": "Rangaistus myöhästymisestä (-{pointsLost})", - "@latePenalty": { - "description": "Text displayed when a late penalty has been applied to the assignment", - "type": "text", - "placeholders_order": [ - "pointsLost" - ], - "placeholders": { - "pointsLost": {} - } - }, - "finalGrade": "Lopullinen arvosana: {grade}", - "@finalGrade": { - "description": "Text that displays the final grade of an assignment", - "type": "text", - "placeholders_order": [ - "grade" - ], - "placeholders": { - "grade": {} - } - }, - "Alert Settings": "Hälytykse asetukset", - "@Alert Settings": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Alert me when…": "Hälytä minua, kun...", - "@Alert me when…": { - "description": "Header for the screen where the observer chooses the thresholds that will determine when they receive alerts (e.g. when an assignment is graded below 70%)", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Course grade below": "Kurssin arvosana alapuolella", - "@Course grade below": { - "description": "Label describing the threshold for when the course grade is below a certain percentage", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Course grade above": "Kurssin arvosana yläpuolella", - "@Course grade above": { - "description": "Label describing the threshold for when the course grade is above a certain percentage", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Assignment missing": "Tehtävä puuttuu", - "@Assignment missing": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Assignment grade below": "Tehtävän arvosana alla", - "@Assignment grade below": { - "description": "Label describing the threshold for when an assignment is graded below a certain percentage", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Assignment grade above": "Tehtävän arvosana yllä", - "@Assignment grade above": { - "description": "Label describing the threshold for when an assignment is graded above a certain percentage", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Course Announcements": "Kurssin ilmoitukset", - "@Course Announcements": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Institution Announcements": "Laitoksen ilmoitukset", - "@Institution Announcements": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Never": "Ei koskaan", - "@Never": { - "description": "Indication that tells the user they will not receive alert notifications of a specific kind", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Grade percentage": "Arvosanan prosenttiosuus", - "@Grade percentage": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading your student's alerts.": "Opiskelijahälytysten latauksessa ilmeni virhe.", - "@There was an error loading your student's alerts.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Must be below 100": "Täytyy olla alle 100", - "@Must be below 100": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "mustBeBelowN": "Täytyy olla alle {percentage}", - "@mustBeBelowN": { - "description": "Validation error to the user that they must choose a percentage below 'n'", - "type": "text", - "placeholders_order": [ - "percentage" - ], - "placeholders": { - "percentage": { - "example": 5 - } - } - }, - "mustBeAboveN": "Täytyy olla yli {percentage}", - "@mustBeAboveN": { - "description": "Validation error to the user that they must choose a percentage above 'n'", - "type": "text", - "placeholders_order": [ - "percentage" - ], - "placeholders": { - "percentage": { - "example": 5 - } - } - }, - "Select Student Color": "Valitse Student-sovelluksen väri", - "@Select Student Color": { - "description": "Title for screen that allows users to assign a color to a specific student", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Electric, blue": "Sähkönsininen", - "@Electric, blue": { - "description": "Name of the Electric (blue) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Plum, Purple": "Luumu, purppura", - "@Plum, Purple": { - "description": "Name of the Plum (purple) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Barney, Fuschia": "Violetti, fuksia", - "@Barney, Fuschia": { - "description": "Name of the Barney (fuschia) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Raspberry, Red": "Vadelmanpunainen", - "@Raspberry, Red": { - "description": "Name of the Raspberry (red) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Fire, Orange": "Tulenoranssi", - "@Fire, Orange": { - "description": "Name of the Fire (orange) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Shamrock, Green": "Apilanvihreä", - "@Shamrock, Green": { - "description": "Name of the Shamrock (green) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "An error occurred while saving your selection. Please try again.": "Valintaasi tallennettaessa tapahtui virhe. Yritä uudelleen.", - "@An error occurred while saving your selection. Please try again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "changeStudentColorLabel": "Vaihda väri kohteelle {studentName}", - "@changeStudentColorLabel": { - "description": "Accessibility label for the button that lets users change the color associated with a specific student", - "type": "text", - "placeholders_order": [ - "studentName" - ], - "placeholders": { - "studentName": {} - } - }, - "Teacher": "Opettaja", - "@Teacher": { - "description": "Label for the Teacher enrollment type", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Student": "Opiskelija", - "@Student": { - "description": "Label for the Student enrollment type", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "TA": "Apuopettaja", - "@TA": { - "description": "Label for the Teaching Assistant enrollment type (also known as Teacher Aid or Education Assistant), reduced to a short acronym/initialism if appropriate.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Observer": "Tarkkailija", - "@Observer": { - "description": "Label for the Observer enrollment type", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Use Camera": "Käytä kameraa", - "@Use Camera": { - "description": "Label for the action item that lets the user capture a photo using the device camera", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Upload File": "Lataa tiedosto", - "@Upload File": { - "description": "Label for the action item that lets the user upload a file from their device", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Choose from Gallery": "Valitse galleriasta", - "@Choose from Gallery": { - "description": "Label for the action item that lets the user select a photo from their device gallery", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Preparing…": "Valmistellaan...", - "@Preparing…": { - "description": "Message shown while a file is being prepared to attach to a message", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Add student with…": "Lisää opiskelija, jolla on...", - "@Add student with…": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Add Student": "Lisää opiskelija", - "@Add Student": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You are not observing any students.": "Et tarkkaile yhtään opiskelijaa.", - "@You are not observing any students.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading your students.": "Opiskelijoidesi latauksessa ilmeni virhe.", - "@There was an error loading your students.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Pairing Code": "Parinmuodostuskoodi", - "@Pairing Code": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Students can obtain a pairing code through the Canvas website": "Opiskelijat voivat hankkia parinmuodostuskoodin Canvasin verkkosivustolta.", - "@Students can obtain a pairing code through the Canvas website": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Enter the student pairing code provided to you. If the pairing code doesn't work, it may have expired": "Kirjoita opiskelijan parinmuodostuskoodi, joka on toimitettu sinulle. Jos parinmuodostuskoodi ei toimi, se saattaa olla vanhentunut", - "@Enter the student pairing code provided to you. If the pairing code doesn't work, it may have expired": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Your code is incorrect or expired.": "Koodisi on virheellinen tai vanhentunut.", - "@Your code is incorrect or expired.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Something went wrong trying to create your account, please reach out to your school for assistance.": "Ilmeni virhe, kun tiliäsi yritettiin luoda. Pyydä apua koulultasi.", - "@Something went wrong trying to create your account, please reach out to your school for assistance.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "QR Code": "Viivakoodi", - "@QR Code": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Students can create a QR code using the Canvas Student app on their mobile device": "Opiskelijat voivat luoda viivakoodin Canvas Student -sovelluksen avulla mobiililaitteellaan.", - "@Students can create a QR code using the Canvas Student app on their mobile device": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Add new student": "Lisää uusi opiskelija", - "@Add new student": { - "description": "Semantics label for the FAB on the Manage Students Screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Select": "Valitse", - "@Select": { - "description": "Hint text to tell the user to choose one of two options", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I have a Canvas account": "Minulla on jo Canvas-tili", - "@I have a Canvas account": { - "description": "Option to select for users that have a canvas account", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I don't have a Canvas account": "Minulla ei ole Canvas-tiliä", - "@I don't have a Canvas account": { - "description": "Option to select for users that don't have a canvas account", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Create Account": "Luo tili", - "@Create Account": { - "description": "Button text for account creation confirmation", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Full Name": "Koko nimi", - "@Full Name": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Email Address": "Sähköpostiosoite", - "@Email Address": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Password": "Salasana", - "@Password": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Full Name…": "Koko nimi...", - "@Full Name…": { - "description": "hint label for inside form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Email…": "Sähköposti...", - "@Email…": { - "description": "hint label for inside form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Password…": "Salasana...", - "@Password…": { - "description": "hint label for inside form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Please enter full name": "Anna koko nimesi", - "@Please enter full name": { - "description": "Error message for form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Please enter an email address": "Anna sähköpostiosoite.", - "@Please enter an email address": { - "description": "Error message for form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Please enter a valid email address": "Anna voimassa oleva sähköpostiosoite", - "@Please enter a valid email address": { - "description": "Error message for form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Password is required": "Salasana vaaditaan", - "@Password is required": { - "description": "Error message for form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Password must contain at least 8 characters": "Salasanassa on oltava vähintään 8 merkkiä", - "@Password must contain at least 8 characters": { - "description": "Error message for form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "qrCreateAccountTos": "Kun napautat ”Luo tili”, hyväksyt {termsOfService} ja {privacyPolicy}", - "@qrCreateAccountTos": { - "description": "The text show on the account creation screen", - "type": "text", - "placeholders_order": [ - "termsOfService", - "privacyPolicy" - ], - "placeholders": { - "termsOfService": {}, - "privacyPolicy": {} - } - }, - "Terms of Service": "Käyttöehdot", - "@Terms of Service": { - "description": "Label for the Canvas Terms of Service agreement. This will be used in the qrCreateAccountTos text and will be highlighted and clickable", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Privacy Policy": "Tietosuojakäytäntö", - "@Privacy Policy": { - "description": "Label for the Canvas Privacy Policy agreement. This will be used in the qrCreateAccountTos text and will be highlighted and clickable", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "View the Privacy Policy": "Näytä tietosuojakäytäntö", - "@View the Privacy Policy": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Already have an account? ": "Onko sinulla jo tili? ", - "@Already have an account? ": { - "description": "Part of multiline text span, includes AccountSignIn1-2, in that order", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Sign In": "Kirjaudu sisään", - "@Sign In": { - "description": "Part of multiline text span, includes AccountSignIn1-2, in that order", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Hide Password": "Piilota salasana", - "@Hide Password": { - "description": "content description for password hide button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Show Password": "Näytä salasana", - "@Show Password": { - "description": "content description for password show button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Terms of Service Link": "Käyttöehdot-linkki", - "@Terms of Service Link": { - "description": "content description for terms of service link", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Privacy Policy Link": "Tietosuojakäytäntö-linkki", - "@Privacy Policy Link": { - "description": "content description for privacy policy link", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Event": "Tapahtuma", - "@Event": { - "description": "Title for the event details screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Date": "Päivämäärä", - "@Date": { - "description": "Label for the event date", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Location": "Sijainti", - "@Location": { - "description": "Label for the location information", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Location Specified": "Sijaintia ei ole määritetty", - "@No Location Specified": { - "description": "Description for events that do not have a location", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "eventTime": "{startAt} - {endAt}", - "@eventTime": { - "description": "The time the event is happening, example: \"2:00 pm - 4:00 pm\"", - "type": "text", - "placeholders_order": [ - "startAt", - "endAt" - ], - "placeholders": { - "startAt": {}, - "endAt": {} - } - }, - "Set a date and time to be notified of this event.": "Määritä päivämäärä ja aika, jolloin sinulle ilmoitetaan tästä tapahtumasta.", - "@Set a date and time to be notified of this event.": { - "description": "Description for row to set event reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You will be notified about this event on…": "Saat ilmoituksen tästä tapahtumasta...", - "@You will be notified about this event on…": { - "description": "Description for when an event reminder is set", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Share Your Love for the App": "Jaa rakkautesi sovellusta kohtaan", - "@Share Your Love for the App": { - "description": "Label for option to open the app store", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Tell us about your favorite parts of the app": "Kerro meille sovelluksen suosikkiosista", - "@Tell us about your favorite parts of the app": { - "description": "Description for option to open the app store", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Legal": "Lakitiedot", - "@Legal": { - "description": "Label for legal information option", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Privacy policy, terms of use, open source": "Tietosuojakäytäntö, käyttöehdot, avoin lähde", - "@Privacy policy, terms of use, open source": { - "description": "Description for legal information option", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Idea for Canvas Parent App [Android]": "Idea Canvas Parent App -sovellukselle [Android]", - "@Idea for Canvas Parent App [Android]": { - "description": "The subject for the email to request a feature", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The following information will help us better understand your idea:": "Seuraavat tiedot auttavat meitä ymmärtämään ideasi paremmin:", - "@The following information will help us better understand your idea:": { - "description": "The header for the users information that is attached to a feature request", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Domain:": "Verkkotunnus:", - "@Domain:": { - "description": "The label for the Canvas domain of the logged in user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "User ID:": "Käyttäjätunnus:", - "@User ID:": { - "description": "The label for the Canvas user ID of the logged in user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Email:": "Sähköposti:", - "@Email:": { - "description": "The label for the eamil of the logged in user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Locale:": "Kielialue:", - "@Locale:": { - "description": "The label for the locale of the logged in user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Terms of Use": "Käyttöehdot", - "@Terms of Use": { - "description": "Label for the terms of use", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Canvas on GitHub": "Canvas GitHubissa", - "@Canvas on GitHub": { - "description": "Label for the button that opens the Canvas project on GitHub's website", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was a problem loading the Terms of Use": "Ilmeni ongelma käyttöehtoja ladattaessa", - "@There was a problem loading the Terms of Use": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Device": "Laite", - "@Device": { - "description": "Label used for device manufacturer/model in the error report", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "OS Version": "Käyttöjärjestelmäversio", - "@OS Version": { - "description": "Label used for device operating system version in the error report", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Version Number": "Version numero", - "@Version Number": { - "description": "Label used for the app version number in the error report", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Report A Problem": "Raportoi ongelma", - "@Report A Problem": { - "description": "Title used for generic dialog to report problems", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Subject": "Aihe", - "@Subject": { - "description": "Label used for Subject text field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "A subject is required.": "Vaaditaan aihe.", - "@A subject is required.": { - "description": "Error shown when the subject field is empty", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "An email address is required.": "Sähköpostiosoite vaaditaan.", - "@An email address is required.": { - "description": "Error shown when the email field is empty", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Description": "Kuvaus", - "@Description": { - "description": "Label used for Description text field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "A description is required.": "Kuvaus vaaditaan.", - "@A description is required.": { - "description": "Error shown when the description field is empty", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "How is this affecting you?": "Kuinka tämä vaikuttaa sinuun?", - "@How is this affecting you?": { - "description": "Label used for the dropdown to select how severe the issue is", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "send": "lähettää", - "@send": { - "description": "Label used for send button when reporting a problem", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Just a casual question, comment, idea, suggestion…": "Vain satunnainen kysymys, kommentti, idea, ehdotus...", - "@Just a casual question, comment, idea, suggestion…": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I need some help but it's not urgent.": "Tarvitsen apua, mutta tämä ei ele kiireellistä.", - "@I need some help but it's not urgent.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Something's broken but I can work around it to get what I need done.": "Jotakin on rikki, mutta löydän tavan saada tehdyksi, mitä minun pitää saada tehdyksi.", - "@Something's broken but I can work around it to get what I need done.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I can't get things done until I hear back from you.": "En saa asioita tehtyä, ennen kuin kuulen sinusta.", - "@I can't get things done until I hear back from you.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "EXTREME CRITICAL EMERGENCY!!": "Erittäin kiireellinen hätätapaus!!", - "@EXTREME CRITICAL EMERGENCY!!": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Not Graded": "Ei arvioida", - "@Not Graded": { - "description": "Description for an assignment has not been graded.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Login flow: Normal": "Sisäänkirjautumisen kulku: Normaali", - "@Login flow: Normal": { - "description": "Description for the normal login flow", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Login flow: Canvas": "Sisäänkirjautumisen kulku: Canvas", - "@Login flow: Canvas": { - "description": "Description for the Canvas login flow", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Login flow: Site Admin": "Sisäänkirjautumisen kulku: Sivuston pääkäyttäjä", - "@Login flow: Site Admin": { - "description": "Description for the Site Admin login flow", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Login flow: Skip mobile verify": "Sisäänkirjautumisen kulku: Ohita mobiilivahvistus", - "@Login flow: Skip mobile verify": { - "description": "Description for the login flow that skips domain verification for mobile", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Act As User": "Toimi käyttäjänä", - "@Act As User": { - "description": "Label for the button that allows the user to act (masquerade) as another user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Stop Acting as User": "Lopeta käyttäjän roolissa toimiminen", - "@Stop Acting as User": { - "description": "Label for the button that allows the user to stop acting (masquerading) as another user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "actingAsUser": "Toimit käyttäjänä {userName}", - "@actingAsUser": { - "description": "Message shown while acting (masquerading) as another user", - "type": "text", - "placeholders_order": [ - "userName" - ], - "placeholders": { - "userName": {} - } - }, - "\"Act as\" is essentially logging in as this user without a password. You will be able to take any action as if you were this user, and from other users' points of views, it will be as if this user performed them. However, audit logs record that you were the one who performed the actions on behalf of this user.": "”Toimi käyttäjänä” kirjautuu periaatteessa sisään tänä käyttäjänä ilman salasanaa. Voit ryhtyä mihin tahansa toimenpiteeseen ikään kuin olisit tämä käyttäjä, ja muiden käyttäjien näkökulmasta näyttäisi siltä, että sinä olisit suorittanut nämä toimenpiteet. Tarkistuslokeihin kuitenkin kirjataan, että sinä suoritit toimenpiteet tämän käyttäjän puolesta.", - "@\"Act as\" is essentially logging in as this user without a password. You will be able to take any action as if you were this user, and from other users' points of views, it will be as if this user performed them. However, audit logs record that you were the one who performed the actions on behalf of this user.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Domain": "Verkkotunnus", - "@Domain": { - "description": "Text field hint for domain url input", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You must enter a valid domain": "Määritä kelvollinen toimialue", - "@You must enter a valid domain": { - "description": "Message displayed for domain input error", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "User ID": "Käyttäjätunnus", - "@User ID": { - "description": "Text field hint for user ID input", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You must enter a user id": "Sinun on annettava voimassa oleva tunnus", - "@You must enter a user id": { - "description": "Message displayed for user Id input error", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error trying to act as this user. Please check the Domain and User ID and try again.": "Ilmeni virhe yritettäessä toimia tänä käyttäjänä. Tarkista verkkotunnus ja käyttäjän tunnus ja yritä uudelleen.", - "@There was an error trying to act as this user. Please check the Domain and User ID and try again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "endMasqueradeMessage": "Lopetat toimimasta käyttäjänä {userName} ja palaat alkuperäiselle tilillesi.", - "@endMasqueradeMessage": { - "description": "Confirmation message displayed when the user wants to stop acting (masquerading) as another user", - "type": "text", - "placeholders_order": [ - "userName" - ], - "placeholders": { - "userName": {} - } - }, - "endMasqueradeLogoutMessage": "Lopetat toimimasta käyttäjänä {userName} ja sinut kirjataan ulos.", - "@endMasqueradeLogoutMessage": { - "description": "Confirmation message displayed when the user wants to stop acting (masquerading) as another user and will be logged out.", - "type": "text", - "placeholders_order": [ - "userName" - ], - "placeholders": { - "userName": {} - } - }, - "How are we doing?": "Miten menestymme?", - "@How are we doing?": { - "description": "Title for dialog asking user to rate the app out of 5 stars.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Don't show again": "Älä näytä uudelleen", - "@Don't show again": { - "description": "Button to prevent the rating dialog from showing again.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "What can we do better?": "Mitä voimme parantaa?", - "@What can we do better?": { - "description": "Hint text for providing a comment with the rating.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Send Feedback": "Lähetä palautetta", - "@Send Feedback": { - "description": "Button to send rating with feedback", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "ratingDialogEmailSubject": "Ehdotuksia Androidille - Canvas Parent {version}", - "@ratingDialogEmailSubject": { - "description": "The subject for an email to provide feedback for CanvasParent.", - "type": "text", - "placeholders_order": [ - "version" - ], - "placeholders": { - "version": {} - } - }, - "starRating": "{position,plural, =1{{position} tähti}other{{position} tähteä}}", - "@starRating": { - "description": "Accessibility label for the 1 stars to 5 stars rating", - "type": "text", - "placeholders_order": [ - "position" - ], - "placeholders": { - "position": { - "example": 1 - } - } - }, - "Student Pairing": "Opiskelijan parinmuodostus", - "@Student Pairing": { - "description": "Title for the screen where users can pair to students using a QR code", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Open Canvas Student": "Avaa Canvas Student", - "@Open Canvas Student": { - "description": "Title for QR pairing tutorial screen instructing users to open the Canvas Student app", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You'll need to open your student's Canvas Student app to continue. Go into Main Menu > Settings > Pair with Observer and scan the QR code you see there.": "Sinun täytyy avata opiskelijan Canvas Student -sovellus jatkaaksesi. Siirry Päävlikkoon > Asetukset > Muodosta laitepari havaitsijan kanssa ja skannaa siellä näkemäsi viivakoodi.", - "@You'll need to open your student's Canvas Student app to continue. Go into Main Menu > Settings > Pair with Observer and scan the QR code you see there.": { - "description": "Message explaining how QR code pairing works", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Screenshot showing location of pairing QR code generation in the Canvas Student app": "Kuvakaappaus, joka näyttää parinmuodostuskoodin luonnin sijainnin Canvas Student -sovelluksessa.", - "@Screenshot showing location of pairing QR code generation in the Canvas Student app": { - "description": "Content Description for qr pairing tutorial screenshot", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Expired QR Code": "Vanhentunut viivakoodi", - "@Expired QR Code": { - "description": "Error title shown when the users scans a QR code that has expired", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The QR code you scanned may have expired. Refresh the code on the student's device and try again.": "Skanaamasi viivakoodi on ehkä vanhentunut. Virkistä koodi opiskelijan laitteessa ja yritä uudelleen.", - "@The QR code you scanned may have expired. Refresh the code on the student's device and try again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "A network error occurred when adding this student. Check your connection and try again.": "Ilmeni verkkovirhe lisättäessä tätä opiskelijaa. Tarkasta verkkoyhteys ja yritä uudelleen.", - "@A network error occurred when adding this student. Check your connection and try again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Invalid QR Code": "Viivakoodi ei kelpaa", - "@Invalid QR Code": { - "description": "Error title shown when the user scans an invalid QR code", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Incorrect Domain": "Virheellinen verkkotunnus", - "@Incorrect Domain": { - "description": "Error title shown when the users scane a QR code for a student that belongs to a different domain", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The student you are trying to add belongs to a different school. Log in or create an account with that school to scan this code.": "Opiskelija, jota yrität lisätä, kuuluu toiseen kouluun! Kirjaudu sisään tai luo tili kyseisen koulun kanssa skannataksesi tämä koodi.", - "@The student you are trying to add belongs to a different school. Log in or create an account with that school to scan this code.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Camera Permission": "Kameran käyttöoikeudet", - "@Camera Permission": { - "description": "Error title shown when the user wans to scan a QR code but has denied the camera permission", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "This will unpair and remove all enrollments for this student from your account.": "Tämä kumoaa parinmuodostuksen ja poistaa kaikki rekisteröitymiset tällel opiskelijalle tililtäsi.", - "@This will unpair and remove all enrollments for this student from your account.": { - "description": "Confirmation message shown when the user tries to delete a student from their account", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was a problem removing this student from your account. Please check your connection and try again.": "Ilmeni ongelma tämän opiskelijan siirtämisessä tililtäsi. Tarkasta yhteytesi ja yritä uudelleen.", - "@There was a problem removing this student from your account. Please check your connection and try again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Cancel": "Peruuta", - "@Cancel": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "next": "Seuraava", - "@next": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "ok": "OK", - "@ok": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Yes": "Kyllä", - "@Yes": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No": "Ei", - "@No": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Retry": "Yritä uudelleen", - "@Retry": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Delete": "Poista", - "@Delete": { - "description": "Label used for general delete/remove actions", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Done": "Valmis", - "@Done": { - "description": "Label for general done/finished actions", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Refresh": "Päivitä", - "@Refresh": { - "description": "Label for button to refresh data from the web", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "View Description": "Näytä kuvaus", - "@View Description": { - "description": "Button to view the description for an event or assignment", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "expanded": "laajennettu", - "@expanded": { - "description": "Description for the accessibility reader for list groups that are expanded", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "collapsed": "kutistettu", - "@collapsed": { - "description": "Description for the accessibility reader for list groups that are expanded", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "An unexpected error occurred": "Ilmeni odottamaton virhe", - "@An unexpected error occurred": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No description": "Ei kuvausta", - "@No description": { - "description": "Message used when the assignment has no description", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Launch External Tool": "Käynnistä ulkoinen työkalu", - "@Launch External Tool": { - "description": "Button text added to webviews to let users open external tools in their browser", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Interactions on this page are limited by your institution.": "Vuorovaikutukset on rajoitettu tällä sivulla laitoksesi puolesta.", - "@Interactions on this page are limited by your institution.": { - "description": "Message describing how the webview has limited access due to an instution setting", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "dateAtTime": "{date} kohteessa {time}", - "@dateAtTime": { - "description": "The string to format dates", - "type": "text", - "placeholders_order": [ - "date", - "time" - ], - "placeholders": { - "date": {}, - "time": {} - } - }, - "dueDateAtTime": "Määräpäivä {date} kohteessa {time}", - "@dueDateAtTime": { - "description": "The string to format due dates", - "type": "text", - "placeholders_order": [ - "date", - "time" - ], - "placeholders": { - "date": {}, - "time": {} - } - }, - "No Due Date": "Ei määräpäivää", - "@No Due Date": { - "description": "Label for assignments that do not have a due date", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Filter": "Suodatin", - "@Filter": { - "description": "Label for buttons to filter what items are visible", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "unread": "lukematon", - "@unread": { - "description": "Label for things that are marked as unread", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "unreadCount": "{count} lukematon", - "@unreadCount": { - "description": "Formatted string for when there are a number of unread items", - "type": "text", - "placeholders_order": [ - "count" - ], - "placeholders": { - "count": {} - } - }, - "badgeNumberPlus": "{count}+", - "@badgeNumberPlus": { - "description": "Formatted string for when too many items are being notified in a badge, generally something like: 99+", - "type": "text", - "placeholders_order": [ - "count" - ], - "placeholders": { - "count": {} - } - }, - "There was an error loading this announcement": "Tämän ilmoituksen latauksessa ilmeni virhe", - "@There was an error loading this announcement": { - "description": "Message shown when an announcement detail screen fails to load", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Network error": "Verkkovirhe.", - "@Network error": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Under Construction": "Rakenteilla", - "@Under Construction": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "We are currently building this feature for your viewing pleasure.": "Rakennamme tätä ominaisuutta tarkastelun käytännöllisyyden vuoksi.", - "@We are currently building this feature for your viewing pleasure.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Request Login Help Button": "Pyydä sisäänkirjautumisohje -painike", - "@Request Login Help Button": { - "description": "Accessibility hint for button that opens help dialog for a login help request", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Request Login Help": "Pyydä sisäänkirjautumisohje", - "@Request Login Help": { - "description": "Title of help dialog for a login help request", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I'm having trouble logging in": "Sisäänkirjautumisessani on ongelma", - "@I'm having trouble logging in": { - "description": "Subject of help dialog for a login help request", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "An error occurred when trying to display this link": "Ilmeni virhe yritettäessä näyttää tätä linkkiä.", - "@An error occurred when trying to display this link": { - "description": "Error message shown when a link can't be opened", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "We are unable to display this link, it may belong to an institution you currently aren't logged in to.": "Emme pysty näyttämään tätä linkkiä. Se saattaa kuulua laitokselle, johon et ole parhaillaan kirjautuneena sisään.", - "@We are unable to display this link, it may belong to an institution you currently aren't logged in to.": { - "description": "Description for error page shown when clicking a link", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Link Error": "Linkin virhe", - "@Link Error": { - "description": "Title for error page shown when clicking a link", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Open In Browser": "Avaa selaimessa", - "@Open In Browser": { - "description": "Text for button to open a link in the browswer", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You'll find the QR code on the web in your account profile. Click 'QR for Mobile Login' in the list.": "Löydät viivakoodin verkosta tiliprofiilistasi. Napsauta luettelosta ”Mobiilikirjautumistunnuksen viivakoodi”.", - "@You'll find the QR code on the web in your account profile. Click 'QR for Mobile Login' in the list.": { - "description": "Text for qr login tutorial screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Locate QR Code": "Etsi viivakoodi", - "@Locate QR Code": { - "description": "Text for qr login button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Please scan a QR code generated by Canvas": "Skannaa Canvasin luoma viivakoodi.", - "@Please scan a QR code generated by Canvas": { - "description": "Text for qr login error with incorrect qr code", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error logging in. Please generate another QR Code and try again.": "Sisäänkirjautumisessa tapahtui virhe. Luo toinen viivakoodi ja yritä uudelleen.", - "@There was an error logging in. Please generate another QR Code and try again.": { - "description": "Text for qr login error", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Screenshot showing location of QR code generation in browser": "Leikekuva, joka näyttää viivakoodin sijainnin selaimessa.", - "@Screenshot showing location of QR code generation in browser": { - "description": "Content Description for qr login tutorial screenshot", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "QR scanning requires camera access": "Viivakoodin skannaukseen tarvitaan pääsy kameraan.", - "@QR scanning requires camera access": { - "description": "placeholder for camera error for QR code scan", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The linked item is no longer available": "Linkitetty kohde ei ole enää saatavissa", - "@The linked item is no longer available": { - "description": "error message when the alert could no be opened", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Message sent": "Viesti lähetetty", - "@Message sent": { - "description": "confirmation message on the screen when the user succesfully sends a message", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Acceptable Use Policy": "Hyväksyttävää käyttöä koskeva käytäntö", - "@Acceptable Use Policy": { - "description": "title for the acceptable use policy screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Submit": "Lähetä", - "@Submit": { - "description": "submit button title for acceptable use policy screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Either you're a new user or the Acceptable Use Policy has changed since you last agreed to it. Please agree to the Acceptable Use Policy before you continue.": "Olet joko uusi käyttäjä tai hyväksyttävää käyttöä koskeva käytäntö on muuttunut sen jälkeen, kun viimeksi hyväksyit sen. Hyväksy hyväksyttävää käyttöä koskeva käytäntö ennen kuin jatkat.", - "@Either you're a new user or the Acceptable Use Policy has changed since you last agreed to it. Please agree to the Acceptable Use Policy before you continue.": { - "description": "acceptable use policy screen description", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I agree to the Acceptable Use Policy.": "Sinun täytyy hyväksyä hyväksyttävää käyttöä koskeva käytäntö", - "@I agree to the Acceptable Use Policy.": { - "description": "acceptable use policy switch title", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "About": "Tietoja", - "@About": { - "description": "Title for about menu item in settings", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "App": "Sovellus", - "@App": { - "description": "Title for App field on about page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Login ID": "Käyttäjätunnus", - "@Login ID": { - "description": "Title for Login ID field on about page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Email": "Sähköposti", - "@Email": { - "description": "Title for Email field on about page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Version": "Versio", - "@Version": { - "description": "Title for Version field on about page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Instructure logo": "Instructure-logo", - "@Instructure logo": { - "description": "Semantics label for the Instructure logo on the about page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - } -} \ No newline at end of file diff --git a/apps/flutter_parent/lib/l10n/res/intl_fr.arb b/apps/flutter_parent/lib/l10n/res/intl_fr.arb deleted file mode 100644 index 63ef1d3ea6..0000000000 --- a/apps/flutter_parent/lib/l10n/res/intl_fr.arb +++ /dev/null @@ -1,2753 +0,0 @@ -{ - "@@last_modified": "2023-08-25T11:04:20.901151", - "alertsLabel": "Alertes", - "@alertsLabel": { - "description": "The label for the Alerts tab", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "calendarLabel": "Agenda", - "@calendarLabel": { - "description": "The label for the Calendar tab", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "coursesLabel": "Cours", - "@coursesLabel": { - "description": "The label for the Courses tab", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Students": "Pas d'étudiants", - "@No Students": { - "description": "Text for when an observer has no students they are observing", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Tap to show student selector": "Appuyez pour afficher le sélecteur d'élève", - "@Tap to show student selector": { - "description": "Semantics label for the area that will show the student selector when tapped", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Tap to pair with a new student": "Appuyez pour apparier à un nouvel élève", - "@Tap to pair with a new student": { - "description": "Semantics label for the add student button in the student selector", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Tap to select this student": "Appuyez pour sélectionner cet élève", - "@Tap to select this student": { - "description": "Semantics label on individual students in the student switcher", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Manage Students": "Gérer les élèves", - "@Manage Students": { - "description": "Label text for the Manage Students nav drawer button as well as the title for the Manage Students screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Help": "Aide", - "@Help": { - "description": "Label text for the help nav drawer button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Log Out": "Se déconnecter", - "@Log Out": { - "description": "Label text for the Log Out nav drawer button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Switch Users": "Changer d'utilisateurs", - "@Switch Users": { - "description": "Label text for the Switch Users nav drawer button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "appVersion": "v. {version}", - "@appVersion": { - "description": "App version shown in the navigation drawer", - "type": "text", - "placeholders_order": [ - "version" - ], - "placeholders": { - "version": {} - } - }, - "Are you sure you want to log out?": "Voulez-vous vraiment vous déconnecter ?", - "@Are you sure you want to log out?": { - "description": "Confirmation message displayed when the user tries to log out", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Calendars": "Calendriers", - "@Calendars": { - "description": "Label for button that lets users select which calendars to display", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "nextMonth": "Mois suivant : {month}", - "@nextMonth": { - "description": "Label for the button that switches the calendar to the next month", - "type": "text", - "placeholders_order": [ - "month" - ], - "placeholders": { - "month": {} - } - }, - "previousMonth": "Mois précédent : {month}", - "@previousMonth": { - "description": "Label for the button that switches the calendar to the previous month", - "type": "text", - "placeholders_order": [ - "month" - ], - "placeholders": { - "month": {} - } - }, - "nextWeek": "La semaine suivante démarre le {date}", - "@nextWeek": { - "description": "Label for the button that switches the calendar to the next week", - "type": "text", - "placeholders_order": [ - "date" - ], - "placeholders": { - "date": {} - } - }, - "previousWeek": "La semaine précédente démarrait le {date}", - "@previousWeek": { - "description": "Label for the button that switches the calendar to the previous week", - "type": "text", - "placeholders_order": [ - "date" - ], - "placeholders": { - "date": {} - } - }, - "selectedMonthLabel": "Mois de {month}", - "@selectedMonthLabel": { - "description": "Accessibility label for the button that expands/collapses the month view", - "type": "text", - "placeholders_order": [ - "month" - ], - "placeholders": { - "month": {} - } - }, - "expand": "étendre", - "@expand": { - "description": "Accessibility label for the on-tap hint for the button that expands/collapses the month view", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "collapse": "réduire", - "@collapse": { - "description": "Accessibility label for the on-tap hint for the button that expands/collapses the month view", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "pointsPossible": "{points} points possibles", - "@pointsPossible": { - "description": "Screen reader label used for the points possible for an assignment, quiz, etc.", - "type": "text", - "placeholders_order": [ - "points" - ], - "placeholders": { - "points": {} - } - }, - "calendarDaySemanticsLabel": "{eventCount,plural, =1{{date}, {eventCount} événement}other{{date}, {eventCount} événements}}", - "@calendarDaySemanticsLabel": { - "description": "Screen reader label used for calendar day, reads the date and count of events", - "type": "text", - "placeholders_order": [ - "date", - "eventCount" - ], - "placeholders": { - "date": {}, - "eventCount": {} - } - }, - "No Events Today!": "Aucun événement aujourd'hui !", - "@No Events Today!": { - "description": "Title displayed when there are no calendar events for the current day", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "It looks like a great day to rest, relax, and recharge.": "Voilà une bien belle journée pour se reposer, se relaxer et faire le plein d'énergie.", - "@It looks like a great day to rest, relax, and recharge.": { - "description": "Message displayed when there are no calendar events for the current day", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading your student's calendar": "Une erreur est survenue lors du chargement du calendrier d'élève", - "@There was an error loading your student's calendar": { - "description": "Message displayed when calendar events could not be loaded for the current student", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Tap to favorite the courses you want to see on the Calendar. Select up to 10.": "Appuyez pour mettre en favoris les cours que vous souhaitez afficher sur le calendrier. Sélectionnez-en jusqu'à 10", - "@Tap to favorite the courses you want to see on the Calendar. Select up to 10.": { - "description": "Description text on calendar filter screen.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You may only choose 10 calendars to display": "Vous pouvez seulement choisir 10 calendriers à afficher", - "@You may only choose 10 calendars to display": { - "description": "Error text when trying to select more than 10 calendars", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You must select at least one calendar to display": "Vous devez sélectionner au moins un calendrier à afficher.", - "@You must select at least one calendar to display": { - "description": "Error text when trying to de-select all calendars", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Planner Note": "Note à l'intention du planificateur", - "@Planner Note": { - "description": "Label used for notes in the planner", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Go to today": "Aller à « Aujourd'hui »", - "@Go to today": { - "description": "Accessibility label used for the today button in the planner", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Previous Logins": "Identifiants précédents", - "@Previous Logins": { - "description": "Label for the list of previous user logins", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "canvasLogoLabel": "Logo Canvas", - "@canvasLogoLabel": { - "description": "The semantics label for the Canvas logo", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "findSchool": "Trouver une école", - "@findSchool": { - "description": "Text for the find-my-school button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "findAnotherSchool": "Trouver une autre école", - "@findAnotherSchool": { - "description": "Text for the find-another-school button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "domainSearchInputHint": "Saisissez le district ou le nom de l'école...", - "@domainSearchInputHint": { - "description": "Input hint for the text box on the domain search screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "noDomainResults": "Impossible de trouver une école correspondant à « {query} »", - "@noDomainResults": { - "description": "Message shown to users when the domain search query did not return any results", - "type": "text", - "placeholders_order": [ - "query" - ], - "placeholders": { - "query": {} - } - }, - "domainSearchHelpLabel": "Comment trouver mon école ou mon district ?", - "@domainSearchHelpLabel": { - "description": "Label for the help button on the domain search screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "canvasGuides": "Guides de Canvas", - "@canvasGuides": { - "description": "Proper name for the Canvas Guides. This will be used in the domainSearchHelpBody text and will be highlighted and clickable", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "canvasSupport": "Assistance Canvas", - "@canvasSupport": { - "description": "Proper name for Canvas Support. This will be used in the domainSearchHelpBody text and will be highlighted and clickable", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "domainSearchHelpBody": "Essayez de rechercher le nom de l’école ou du district auquel vous essayez d'accéder, par ex. « École privée Smith » ou « Écoles du comté de Smith ». Vous pouvez également saisir directement un domaine Canvas, par ex. « smith.instructure.com ».\n\nPour de plus amples informations sur la recherche du compte Canvas de votre établissement, vous pouvez consulter le {canvasGuides}, contacter {canvasSupport}, ou encore contacter votre école pour recevoir de l'aide.", - "@domainSearchHelpBody": { - "description": "The body text shown in the help dialog on the domain search screen", - "type": "text", - "placeholders_order": [ - "canvasGuides", - "canvasSupport" - ], - "placeholders": { - "canvasGuides": {}, - "canvasSupport": {} - } - }, - "Uh oh!": "Oups !", - "@Uh oh!": { - "description": "Title of the screen that shows when a crash has occurred", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "We’re not sure what happened, but it wasn’t good. Contact us if this keeps happening.": "On ne sait pas trop ce qui s’est passé, mais ça a mal fini. Contactez-nous si le problème persiste.", - "@We’re not sure what happened, but it wasn’t good. Contact us if this keeps happening.": { - "description": "Message shown when a crash has occurred", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Contact Support": "Contacter l’assistance", - "@Contact Support": { - "description": "Label for the button that allows users to contact support after a crash has occurred", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "View error details": "Afficher les détails de l’erreur", - "@View error details": { - "description": "Label for the button that allowed users to view crash details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Restart app": "Redémarrer l’application", - "@Restart app": { - "description": "Label for the button that will restart the entire application", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Application version": "Version de l'application", - "@Application version": { - "description": "Label for the application version displayed in the crash details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Device model": "Modèle d'appareil", - "@Device model": { - "description": "Label for the device model displayed in the crash details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Android OS version": "Version de l’OS Android", - "@Android OS version": { - "description": "Label for the Android operating system version displayed in the crash details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Full error message": "Message d’erreur complet", - "@Full error message": { - "description": "Label for the full error message displayed in the crash details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Inbox": "Boîte de réception", - "@Inbox": { - "description": "Title for the Inbox screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading your inbox messages.": "Une erreur est survenue lors du chargement des messages de votre boîte de réception.", - "@There was an error loading your inbox messages.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Subject": "Aucun sujet", - "@No Subject": { - "description": "Title used for inbox messages that have no subject", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unable to fetch courses. Please check your connection and try again.": "Impossible de récupérer les cours. Veuillez vérifier votre connexion, puis réessayez.", - "@Unable to fetch courses. Please check your connection and try again.": { - "description": "Message shown when an error occured while loading courses", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Choose a course to message": "Sélectionnez un cours à envoyer en message", - "@Choose a course to message": { - "description": "Header in the course list shown when the user is choosing which course to associate with a new message", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Inbox Zero": "Boîte de réception Zéro", - "@Inbox Zero": { - "description": "Title of the message shown when there are no inbox messages", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You’re all caught up!": "Vous êtes à jour !", - "@You’re all caught up!": { - "description": "Subtitle of the message shown when there are no inbox messages", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading recipients for this course": "Une erreur est survenue lors du chargement des destinataires de ce cours.", - "@There was an error loading recipients for this course": { - "description": "Message shown when attempting to create a new message but the recipients list failed to load", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unable to send message. Check your connection and try again.": "Impossible d’envoyer le message. Vérifiez votre connexion, puis réessayez.", - "@Unable to send message. Check your connection and try again.": { - "description": "Message show when there was an error creating or sending a new message", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unsaved changes": "Changements non enregistrés", - "@Unsaved changes": { - "description": "Title of the dialog shown when the user tries to leave with unsaved changes", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Are you sure you wish to close this page? Your unsent message will be lost.": "Voulez-vous vraiment fermer cette page ? Votre message n'a pas été envoyé et sera perdu.", - "@Are you sure you wish to close this page? Your unsent message will be lost.": { - "description": "Body text of the dialog shown when the user tries leave with unsaved changes", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "New message": "Nouveau message", - "@New message": { - "description": "Title of the new-message screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Add attachment": "Ajouter une pièce jointe", - "@Add attachment": { - "description": "Tooltip for the add-attachment button in the new-message screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Send message": "Envoyer un message", - "@Send message": { - "description": "Tooltip for the send-message button in the new-message screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Select recipients": "Sélectionner des destinataires", - "@Select recipients": { - "description": "Tooltip for the button that allows users to select message recipients", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No recipients selected": "Aucun destinataire sélectionné", - "@No recipients selected": { - "description": "Hint displayed when the user has not selected any message recipients", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Message subject": "Sujet du message", - "@Message subject": { - "description": "Hint text displayed in the input field for the message subject", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Message": "Message", - "@Message": { - "description": "Hint text displayed in the input field for the message body", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Recipients": "Destinataires", - "@Recipients": { - "description": "Label for message recipients", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "plusRecipientCount": "+{count}", - "@plusRecipientCount": { - "description": "Shows the number of recipients that are selected but not displayed on screen.", - "type": "text", - "placeholders_order": [ - "count" - ], - "placeholders": { - "count": { - "example": 5 - } - } - }, - "Failed. Tap for options.": "Échec. Appuyez pour les options", - "@Failed. Tap for options.": { - "description": "Short message shown on a message attachment when uploading has failed", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "courseForWhom": "pour {studentShortName}", - "@courseForWhom": { - "description": "Describes for whom a course is for (i.e. for Bill)", - "type": "text", - "placeholders_order": [ - "studentShortName" - ], - "placeholders": { - "studentShortName": {} - } - }, - "messageLinkPostscript": "À propos : {studentName}, {linkUrl}", - "@messageLinkPostscript": { - "description": "A postscript appended to new messages that clarifies which student is the subject of the message and also includes a URL for the related Canvas component (course, assignment, event, etc).", - "type": "text", - "placeholders_order": [ - "studentName", - "linkUrl" - ], - "placeholders": { - "studentName": {}, - "linkUrl": {} - } - }, - "There was an error loading this conversation": "Une erreur est survenue lors du chargement de cette conversation.", - "@There was an error loading this conversation": { - "description": "Message shown when a conversation fails to load", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Reply": "Répondre", - "@Reply": { - "description": "Button label for replying to a conversation", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Reply All": "Répondre à tous", - "@Reply All": { - "description": "Button label for replying to all conversation participants", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unknown User": "Utilisateur inconnu", - "@Unknown User": { - "description": "Label used where the user name is not known", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "me": "moi", - "@me": { - "description": "First-person pronoun (i.e. 'me') that will be used in message author info, e.g. 'Me to 4 others' or 'Jon Snow to me'", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "authorToRecipient": "{authorName} à {recipientName}", - "@authorToRecipient": { - "description": "Author info for a single-recipient message; includes both the author name and the recipient name.", - "type": "text", - "placeholders_order": [ - "authorName", - "recipientName" - ], - "placeholders": { - "authorName": {}, - "recipientName": {} - } - }, - "authorToNOthers": "{howMany,plural, =1{{authorName} à 1 autre}other{{authorName} à {howMany} autres}}", - "@authorToNOthers": { - "description": "Author info for a mutli-recipient message; includes the author name and the number of recipients", - "type": "text", - "placeholders_order": [ - "authorName", - "howMany" - ], - "placeholders": { - "authorName": {}, - "howMany": {} - } - }, - "authorToRecipientAndNOthers": "{howMany,plural, =1{{authorName} à {recipientName} et 1 autre}other{{authorName} à {recipientName} et {howMany} autres}}", - "@authorToRecipientAndNOthers": { - "description": "Author info for a multi-recipient message; includes the author name, one recipient name, and the number of other recipients", - "type": "text", - "placeholders_order": [ - "authorName", - "recipientName", - "howMany" - ], - "placeholders": { - "authorName": {}, - "recipientName": {}, - "howMany": {} - } - }, - "Download": "Télécharger", - "@Download": { - "description": "Label for the button that will begin downloading a file", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Open with another app": "Ouvrir avec une autre application", - "@Open with another app": { - "description": "Label for the button that will allow users to open a file with another app", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There are no installed applications that can open this file": "Aucune application installée ne sait ouvrir ce fichier", - "@There are no installed applications that can open this file": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unsupported File": "Fichier non pris en charge", - "@Unsupported File": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "This file is unsupported and can’t be viewed through the app": "Ce fichier n’est pas pris en charge et ne peut être visualisé depuis l’application.", - "@This file is unsupported and can’t be viewed through the app": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unable to play this media file": "Impossible de lire ce fichier multimédia", - "@Unable to play this media file": { - "description": "Message shown when audio or video media could not be played", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unable to load this image": "Impossible de charger cette image", - "@Unable to load this image": { - "description": "Message shown when an image file could not be loaded or displayed", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading this file": "Une erreur est survenue au chargement de ce fichier", - "@There was an error loading this file": { - "description": "Message shown when a file could not be loaded or displayed", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Courses": "Aucun cours", - "@No Courses": { - "description": "Title for having no courses", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Your student’s courses might not be published yet.": "Il est possible que les cours de l'élève n'aient pas encore été publiés.", - "@Your student’s courses might not be published yet.": { - "description": "Message for having no courses", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading your student’s courses.": "Une erreur est survenue lors du chargement des cours de l’élève.", - "@There was an error loading your student’s courses.": { - "description": "Message displayed when the list of student courses could not be loaded", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Grade": "Aucune note", - "@No Grade": { - "description": "Message shown when there is currently no grade available for a course", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Filter by": "Filtrer par", - "@Filter by": { - "description": "Title for list of terms to filter grades by", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Grades": "Notes", - "@Grades": { - "description": "Label for the \"Grades\" tab in course details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Syllabus": "Programme", - "@Syllabus": { - "description": "Label for the \"Syllabus\" tab in course details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Front Page": "Première page", - "@Front Page": { - "description": "Label for the \"Front Page\" tab in course details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Summary": "Résumé", - "@Summary": { - "description": "Label for the \"Summary\" tab in course details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Send a message about this course": "Envoyer un message à propos de ce cours", - "@Send a message about this course": { - "description": "Accessibility hint for the course messaage floating action button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Total Grade": "Note totale", - "@Total Grade": { - "description": "Label for the total grade in the course", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Graded": "Noté", - "@Graded": { - "description": "Label for assignments that have been graded", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Submitted": "Soumis", - "@Submitted": { - "description": "Label for assignments that have been submitted", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Not Submitted": "Non soumis", - "@Not Submitted": { - "description": "Label for assignments that have not been submitted", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Late": "En retard", - "@Late": { - "description": "Label for assignments that have been marked late or submitted late", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Missing": "Manquant", - "@Missing": { - "description": "Label for assignments that have been marked missing or are not submitted and past the due date", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "-": "-", - "@-": { - "description": "Value representing no score for student submission", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "All Grading Periods": "Toutes les périodes de notation", - "@All Grading Periods": { - "description": "Label for selecting all grading periods", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Assignments": "Aucun travail", - "@No Assignments": { - "description": "Title for the no assignments message", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "It looks like assignments haven't been created in this space yet.": "Il semble qu'aucun travail n’a été créé à cet endroit pour le moment.", - "@It looks like assignments haven't been created in this space yet.": { - "description": "Message for no assignments", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading the summary details for this course.": "Une erreur est survenue lors du chargement du résumé de ce cours.", - "@There was an error loading the summary details for this course.": { - "description": "Message shown when the course summary could not be loaded", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Summary": "Pas de résumé", - "@No Summary": { - "description": "Title displayed when there are no items in the course summary", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "This course does not have any assignments or calendar events yet.": "Ce cours ne possède pas encore de travaux ni d'événements de calendrier.", - "@This course does not have any assignments or calendar events yet.": { - "description": "Message displayed when there are no items in the course summary", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "gradeFormatScoreOutOfPointsPossible": "{score} / {pointsPossible}", - "@gradeFormatScoreOutOfPointsPossible": { - "description": "Formatted string for a student score out of the points possible", - "type": "text", - "placeholders_order": [ - "score", - "pointsPossible" - ], - "placeholders": { - "score": {}, - "pointsPossible": {} - } - }, - "contentDescriptionScoreOutOfPointsPossible": "{score} sur {pointsPossible} points", - "@contentDescriptionScoreOutOfPointsPossible": { - "description": "Formatted string for a student score out of the points possible", - "type": "text", - "placeholders_order": [ - "score", - "pointsPossible" - ], - "placeholders": { - "score": {}, - "pointsPossible": {} - } - }, - "gradesSubjectMessage": "À propos : {studentName}, Notes", - "@gradesSubjectMessage": { - "description": "The subject line for a message to a teacher regarding a student's grades", - "type": "text", - "placeholders_order": [ - "studentName" - ], - "placeholders": { - "studentName": {} - } - }, - "syllabusSubjectMessage": "À propos : {studentName}, Programme", - "@syllabusSubjectMessage": { - "description": "The subject line for a message to a teacher regarding a course syllabus", - "type": "text", - "placeholders_order": [ - "studentName" - ], - "placeholders": { - "studentName": {} - } - }, - "frontPageSubjectMessage": "À propos : {studentName}, Première page", - "@frontPageSubjectMessage": { - "description": "The subject line for a message to a teacher regarding a course front page", - "type": "text", - "placeholders_order": [ - "studentName" - ], - "placeholders": { - "studentName": {} - } - }, - "assignmentSubjectMessage": "À propos : {studentName}, Travaux - {assignmentName}", - "@assignmentSubjectMessage": { - "description": "The subject line for a message to a teacher regarding a student's assignment", - "type": "text", - "placeholders_order": [ - "studentName", - "assignmentName" - ], - "placeholders": { - "studentName": {}, - "assignmentName": {} - } - }, - "eventSubjectMessage": "À propos : {studentName}, Événement - {eventTitle}", - "@eventSubjectMessage": { - "description": "The subject line for a message to a teacher regarding a calendar event", - "type": "text", - "placeholders_order": [ - "studentName", - "eventTitle" - ], - "placeholders": { - "studentName": {}, - "eventTitle": {} - } - }, - "There is no page information available.": "Il n'y a aucune information de page disponible.", - "@There is no page information available.": { - "description": "Description for when no page information is available", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Assignment Details": "Informations sur le devoir", - "@Assignment Details": { - "description": "Title for the page that shows details for an assignment", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "assignmentTotalPoints": "{points} pts", - "@assignmentTotalPoints": { - "description": "Label used for the total points the assignment is worth", - "type": "text", - "placeholders_order": [ - "points" - ], - "placeholders": { - "points": {} - } - }, - "assignmentTotalPointsAccessible": "{points} points", - "@assignmentTotalPointsAccessible": { - "description": "Screen reader label used for the total points the assignment is worth", - "type": "text", - "placeholders_order": [ - "points" - ], - "placeholders": { - "points": {} - } - }, - "Due": "À rendre le", - "@Due": { - "description": "Label for an assignment due date", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Grade": "Note", - "@Grade": { - "description": "Label for the section that displays an assignment's grade", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Locked": "Verrouillé", - "@Locked": { - "description": "Label for when an assignment is locked", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "assignmentLockedModule": "Ce travail est verrouillé par le module « {moduleName}. »", - "@assignmentLockedModule": { - "description": "The locked description when an assignment is locked by a module", - "type": "text", - "placeholders_order": [ - "moduleName" - ], - "placeholders": { - "moduleName": {} - } - }, - "Remind Me": "Me le rappeler", - "@Remind Me": { - "description": "Label for the row to set reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Set a date and time to be notified of this specific assignment.": "Paramétrez une date et une heure à laquelle être informé de ce travail spécifique.", - "@Set a date and time to be notified of this specific assignment.": { - "description": "Description for row to set reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You will be notified about this assignment on…": "Vous serez prévenu de ce travail le...", - "@You will be notified about this assignment on…": { - "description": "Description for when a reminder is set", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Instructions": "Instructions", - "@Instructions": { - "description": "Label for the description of the assignment when it has quiz instructions", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Send a message about this assignment": "Envoyer un message à propos de ce travail", - "@Send a message about this assignment": { - "description": "Accessibility hint for the assignment messaage floating action button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "This app is not authorized for use.": "Cette application n'est pas autorisée à l'utilisation.", - "@This app is not authorized for use.": { - "description": "The error shown when the app being used is not verified by Canvas", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The server you entered is not authorized for this app.": "Le serveur que vous avez saisi n'est pas autorisé pour cette application.", - "@The server you entered is not authorized for this app.": { - "description": "The error shown when the desired login domain is not verified by Canvas", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The user agent for this app is not authorized.": "Cet agent utilisateur pour cette application n’est pas autorisé.", - "@The user agent for this app is not authorized.": { - "description": "The error shown when the user agent during verification is not verified by Canvas", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "We were unable to verify the server for use with this app.": "Nous n’avons pas pu vérifier que ce serveur est autorisé à utiliser cette application.", - "@We were unable to verify the server for use with this app.": { - "description": "The generic error shown when we are unable to verify with Canvas", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Reminders": "Rappels", - "@Reminders": { - "description": "Name of the system notification channel for assignment and event reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Notifications for reminders about assignments and calendar events": "Notifications de rappels de travaux et d'événement de calendrier", - "@Notifications for reminders about assignments and calendar events": { - "description": "Description of the system notification channel for assignment and event reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Reminders have changed!": "Les rappels ont été modifiés !", - "@Reminders have changed!": { - "description": "Title of the dialog shown when the user needs to update their reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "In order to provide you with a better experience, we have updated how reminders work. You can add new reminders by viewing an assignment or calendar event and tapping the switch under the \"Remind Me\" section.\n\nBe aware that any reminders created with older versions of this app will not be compatible with the new changes and you will need to create them again.": "Afin de vous fournir une meilleure expérience utilisateur, nous avons changé la façon dont les rappels fonctionnent : Vous pouvez ajouter de nouveaux rappels en affichant un travail ou un événement de calendrier, puis en appuyant sur l’interrupteur situé dans la section « Rappelez-moi » (Remind Me).\n\nAttention, tout rappel créé avec d'anciennes versions de l’application sera incompatible avec les nouveaux changements. Vous devrez donc créer à nouveau ces rappels.", - "@In order to provide you with a better experience, we have updated how reminders work. You can add new reminders by viewing an assignment or calendar event and tapping the switch under the \"Remind Me\" section.\n\nBe aware that any reminders created with older versions of this app will not be compatible with the new changes and you will need to create them again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Not a parent?": "Vous n'êtes pas un parent ?", - "@Not a parent?": { - "description": "Title for the screen that shows when the user is not observing any students", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "We couldn't find any students associated with this account": "Nous n’avons pas trouvé d'élève associé à ce compte", - "@We couldn't find any students associated with this account": { - "description": "Subtitle for the screen that shows when the user is not observing any students", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Are you a student or teacher?": "Êtes-vous un élève ou bien un enseignant ?", - "@Are you a student or teacher?": { - "description": "Label for button that will show users the option to view other Canvas apps in the Play Store", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "One of our other apps might be a better fit. Tap one to visit the Play Store.": "Une autre de nos applications conviendrait sans doute davantage. Appuyez une fois pour vous rendre sur le Play Store", - "@One of our other apps might be a better fit. Tap one to visit the Play Store.": { - "description": "Description of options to view other Canvas apps in the Play Store", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Return to Login": "Retourner à la page de connexion", - "@Return to Login": { - "description": "Label for the button that returns the user to the login screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "STUDENT": "ÉLÈVE", - "@STUDENT": { - "description": "The \"student\" portion of the \"Canvas Student\" app name, in all caps. \"Canvas\" is excluded in this context as it will be displayed to the user as a wordmark image", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "TEACHER": "ENSEIGNANT", - "@TEACHER": { - "description": "The \"teacher\" portion of the \"Canvas Teacher\" app name, in all caps. \"Canvas\" is excluded in this context as it will be displayed to the user as a wordmark image", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Canvas Student": "Canvas Élève", - "@Canvas Student": { - "description": "The name of the Canvas Student app. Only \"Student\" should be translated as \"Canvas\" is a brand name in this context and should not be translated.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Canvas Teacher": "Canvas Enseignant", - "@Canvas Teacher": { - "description": "The name of the Canvas Teacher app. Only \"Teacher\" should be translated as \"Canvas\" is a brand name in this context and should not be translated.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Alerts": "Pas d’alerte", - "@No Alerts": { - "description": "The title for the empty message to show to users when there are no alerts for the student.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There’s nothing to be notified of yet.": "Nous n’avons rien à vous notifier.", - "@There’s nothing to be notified of yet.": { - "description": "The empty message to show to users when there are no alerts for the student.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "dismissAlertLabel": "Rejeter {alertTitle}", - "@dismissAlertLabel": { - "description": "Accessibility label to dismiss an alert", - "type": "text", - "placeholders_order": [ - "alertTitle" - ], - "placeholders": { - "alertTitle": {} - } - }, - "Course Announcement": "Annonce de cours", - "@Course Announcement": { - "description": "Title for alerts when there is a course announcement", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Institution Announcement": "Annonce d'institution", - "@Institution Announcement": { - "description": "Title for alerts when there is an institution announcement", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "assignmentGradeAboveThreshold": "Note du devoir supérieure à {threshold}", - "@assignmentGradeAboveThreshold": { - "description": "Title for alerts when an assignment grade is above the threshold value", - "type": "text", - "placeholders_order": [ - "threshold" - ], - "placeholders": { - "threshold": {} - } - }, - "assignmentGradeBelowThreshold": "Note du devoir inférieure à {threshold}", - "@assignmentGradeBelowThreshold": { - "description": "Title for alerts when an assignment grade is below the threshold value", - "type": "text", - "placeholders_order": [ - "threshold" - ], - "placeholders": { - "threshold": {} - } - }, - "courseGradeAboveThreshold": "Note de cours supérieure à {threshold}", - "@courseGradeAboveThreshold": { - "description": "Title for alerts when a course grade is above the threshold value", - "type": "text", - "placeholders_order": [ - "threshold" - ], - "placeholders": { - "threshold": {} - } - }, - "courseGradeBelowThreshold": "Note de cours inférieure à {threshold}", - "@courseGradeBelowThreshold": { - "description": "Title for alerts when a course grade is below the threshold value", - "type": "text", - "placeholders_order": [ - "threshold" - ], - "placeholders": { - "threshold": {} - } - }, - "Settings": "Paramètres", - "@Settings": { - "description": "Title for the settings screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Theme": "Thème", - "@Theme": { - "description": "Label for the light/dark theme section in the settings page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Dark Mode": "Mode nuit", - "@Dark Mode": { - "description": "Label for the button that enables dark mode", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Light Mode": "Mode de couleur claire", - "@Light Mode": { - "description": "Label for the button that enables light mode", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "High Contrast Mode": "Mode contraste élevé", - "@High Contrast Mode": { - "description": "Label for the switch that toggles high contrast mode", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Use Dark Theme in Web Content": "Utiliser le thème sombre pour le contenu Web.", - "@Use Dark Theme in Web Content": { - "description": "Label for the switch that toggles dark mode for webviews", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Appearance": "Apparence", - "@Appearance": { - "description": "Label for the appearance section in the settings page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Successfully submitted!": "Soumission effectuée avec succès !", - "@Successfully submitted!": { - "description": "Title displayed in the grade cell for an assignment that has been submitted", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "submissionStatusSuccessSubtitle": "Ce travail a été soumis le {date} à {time} et attend sa note.", - "@submissionStatusSuccessSubtitle": { - "description": "Subtitle displayed in the grade cell for an assignment that has been submitted and is awaiting a grade", - "type": "text", - "placeholders_order": [ - "date", - "time" - ], - "placeholders": { - "date": {}, - "time": {} - } - }, - "outOfPoints": "{howMany,plural, =1{Sur 1 point}other{Sur {points} points}}", - "@outOfPoints": { - "description": "Description for an assignment grade that has points without a current scoroe", - "type": "text", - "placeholders_order": [ - "points", - "howMany" - ], - "placeholders": { - "points": {}, - "howMany": {} - } - }, - "Excused": "Excusé", - "@Excused": { - "description": "Grading status for an assignment marked as excused", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Complete": "Terminé", - "@Complete": { - "description": "Grading status for an assignment marked as complete", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Incomplete": "Incomplet", - "@Incomplete": { - "description": "Grading status for an assignment marked as incomplete", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "minus": "moins", - "@minus": { - "description": "Screen reader-friendly replacement for the \"-\" character in letter grades like \"A-\"", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "latePenalty": "Pénalité de retard (-{pointsLost})", - "@latePenalty": { - "description": "Text displayed when a late penalty has been applied to the assignment", - "type": "text", - "placeholders_order": [ - "pointsLost" - ], - "placeholders": { - "pointsLost": {} - } - }, - "finalGrade": "Note finale : {grade}", - "@finalGrade": { - "description": "Text that displays the final grade of an assignment", - "type": "text", - "placeholders_order": [ - "grade" - ], - "placeholders": { - "grade": {} - } - }, - "Alert Settings": "Paramètres d'alertes", - "@Alert Settings": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Alert me when…": "M'alerter quand...", - "@Alert me when…": { - "description": "Header for the screen where the observer chooses the thresholds that will determine when they receive alerts (e.g. when an assignment is graded below 70%)", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Course grade below": "Note du cours en dessous de", - "@Course grade below": { - "description": "Label describing the threshold for when the course grade is below a certain percentage", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Course grade above": "Note du cours au dessus de", - "@Course grade above": { - "description": "Label describing the threshold for when the course grade is above a certain percentage", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Assignment missing": "Devoir manquant", - "@Assignment missing": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Assignment grade below": "Note du devoir en dessous de", - "@Assignment grade below": { - "description": "Label describing the threshold for when an assignment is graded below a certain percentage", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Assignment grade above": "Note du devoir au dessus de", - "@Assignment grade above": { - "description": "Label describing the threshold for when an assignment is graded above a certain percentage", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Course Announcements": "Annonces de cours", - "@Course Announcements": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Institution Announcements": "Annonces de l'institution", - "@Institution Announcements": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Never": "Jamais", - "@Never": { - "description": "Indication that tells the user they will not receive alert notifications of a specific kind", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Grade percentage": "Note en pourcentage", - "@Grade percentage": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading your student's alerts.": "Une erreur est survenue lors du chargement des alertes de votre élève.", - "@There was an error loading your student's alerts.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Must be below 100": "Doit être inférieur à 100", - "@Must be below 100": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "mustBeBelowN": "Doit être inférieur à {percentage}", - "@mustBeBelowN": { - "description": "Validation error to the user that they must choose a percentage below 'n'", - "type": "text", - "placeholders_order": [ - "percentage" - ], - "placeholders": { - "percentage": { - "example": 5 - } - } - }, - "mustBeAboveN": "Doit être supérieur à {percentage}", - "@mustBeAboveN": { - "description": "Validation error to the user that they must choose a percentage above 'n'", - "type": "text", - "placeholders_order": [ - "percentage" - ], - "placeholders": { - "percentage": { - "example": 5 - } - } - }, - "Select Student Color": "Sélectionner la couleur de l’élève", - "@Select Student Color": { - "description": "Title for screen that allows users to assign a color to a specific student", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Electric, blue": "Électrique, bleu", - "@Electric, blue": { - "description": "Name of the Electric (blue) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Plum, Purple": "Prune, violet", - "@Plum, Purple": { - "description": "Name of the Plum (purple) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Barney, Fuschia": "Barney, Fuschia", - "@Barney, Fuschia": { - "description": "Name of the Barney (fuschia) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Raspberry, Red": "Framboise, Rouge", - "@Raspberry, Red": { - "description": "Name of the Raspberry (red) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Fire, Orange": "Feu, Orange", - "@Fire, Orange": { - "description": "Name of the Fire (orange) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Shamrock, Green": "Trèfle, vert", - "@Shamrock, Green": { - "description": "Name of the Shamrock (green) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "An error occurred while saving your selection. Please try again.": "Une erreur est survenue pendant l’enregistrement de votre sélection. Veuillez réessayer.", - "@An error occurred while saving your selection. Please try again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "changeStudentColorLabel": "Changer la couleur à {studentName}", - "@changeStudentColorLabel": { - "description": "Accessibility label for the button that lets users change the color associated with a specific student", - "type": "text", - "placeholders_order": [ - "studentName" - ], - "placeholders": { - "studentName": {} - } - }, - "Teacher": "Enseignant", - "@Teacher": { - "description": "Label for the Teacher enrollment type", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Student": "Élève", - "@Student": { - "description": "Label for the Student enrollment type", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "TA": "TA", - "@TA": { - "description": "Label for the Teaching Assistant enrollment type (also known as Teacher Aid or Education Assistant), reduced to a short acronym/initialism if appropriate.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Observer": "Observateur", - "@Observer": { - "description": "Label for the Observer enrollment type", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Use Camera": "Utiliser l’appareil photo", - "@Use Camera": { - "description": "Label for the action item that lets the user capture a photo using the device camera", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Upload File": "Envoyer fichier", - "@Upload File": { - "description": "Label for the action item that lets the user upload a file from their device", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Choose from Gallery": "Choisir dans la galerie", - "@Choose from Gallery": { - "description": "Label for the action item that lets the user select a photo from their device gallery", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Preparing…": "Préparation...", - "@Preparing…": { - "description": "Message shown while a file is being prepared to attach to a message", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Add student with…": "Ajouter un élève avec...", - "@Add student with…": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Add Student": "Ajouter un élève", - "@Add Student": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You are not observing any students.": "Vous n’observez aucun élève.", - "@You are not observing any students.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading your students.": "Une erreur est survenue lors du chargement de vos élèves.", - "@There was an error loading your students.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Pairing Code": "Code de jumelage", - "@Pairing Code": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Students can obtain a pairing code through the Canvas website": "Les élèves peuvent obtenir un code de jumelage via le site Web de Canvas.", - "@Students can obtain a pairing code through the Canvas website": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Enter the student pairing code provided to you. If the pairing code doesn't work, it may have expired": "Saisissez le code d’appariement élève qui vous a été transmis. Si le code ne fonctionne pas, il a peut-être expiré.", - "@Enter the student pairing code provided to you. If the pairing code doesn't work, it may have expired": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Your code is incorrect or expired.": "Votre code n’est pas correct, ou bien il a expiré.", - "@Your code is incorrect or expired.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Something went wrong trying to create your account, please reach out to your school for assistance.": "Un problème est survenu lors de la création de votre compte, veuillez contacter votre école pour obtenir de l'aide.", - "@Something went wrong trying to create your account, please reach out to your school for assistance.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "QR Code": "QR Code", - "@QR Code": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Students can create a QR code using the Canvas Student app on their mobile device": "Les élèves peuvent créer un code QR à l’aide de l’application Canvas Student sur leur appareil mobile.", - "@Students can create a QR code using the Canvas Student app on their mobile device": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Add new student": "Ajouter un nouvel élève", - "@Add new student": { - "description": "Semantics label for the FAB on the Manage Students Screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Select": "Sélectionner", - "@Select": { - "description": "Hint text to tell the user to choose one of two options", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I have a Canvas account": "J’ai un compte Canvas", - "@I have a Canvas account": { - "description": "Option to select for users that have a canvas account", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I don't have a Canvas account": "Je n’ai pas de compte Canvas", - "@I don't have a Canvas account": { - "description": "Option to select for users that don't have a canvas account", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Create Account": "Créer un compte", - "@Create Account": { - "description": "Button text for account creation confirmation", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Full Name": "Nom complet", - "@Full Name": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Email Address": "Adresse électronique", - "@Email Address": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Password": "Mot de passe", - "@Password": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Full Name…": "Nom complet...", - "@Full Name…": { - "description": "hint label for inside form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Email…": "Courriel...", - "@Email…": { - "description": "hint label for inside form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Password…": "Mot de passe...", - "@Password…": { - "description": "hint label for inside form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Please enter full name": "Veuillez saisir un nom complet.", - "@Please enter full name": { - "description": "Error message for form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Please enter an email address": "Veuillez saisir une adresse email", - "@Please enter an email address": { - "description": "Error message for form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Please enter a valid email address": "Veuillez saisir une adresse électronique valide", - "@Please enter a valid email address": { - "description": "Error message for form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Password is required": "Un mot de passe est requis.", - "@Password is required": { - "description": "Error message for form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Password must contain at least 8 characters": "Le mot de passe doit contenir au moins 8 caractères.", - "@Password must contain at least 8 characters": { - "description": "Error message for form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "qrCreateAccountTos": "En cliquant sur \"Créer un compte\", vous acceptez les {termsOfService} et confirmez la {privacyPolicy}", - "@qrCreateAccountTos": { - "description": "The text show on the account creation screen", - "type": "text", - "placeholders_order": [ - "termsOfService", - "privacyPolicy" - ], - "placeholders": { - "termsOfService": {}, - "privacyPolicy": {} - } - }, - "Terms of Service": "Conditions d’utilisation", - "@Terms of Service": { - "description": "Label for the Canvas Terms of Service agreement. This will be used in the qrCreateAccountTos text and will be highlighted and clickable", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Privacy Policy": "Politique de confidentialité", - "@Privacy Policy": { - "description": "Label for the Canvas Privacy Policy agreement. This will be used in the qrCreateAccountTos text and will be highlighted and clickable", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "View the Privacy Policy": "Afficher la politique de confidentialité", - "@View the Privacy Policy": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Already have an account? ": "Vous possédez déjà un compte ? ", - "@Already have an account? ": { - "description": "Part of multiline text span, includes AccountSignIn1-2, in that order", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Sign In": "Se connecter", - "@Sign In": { - "description": "Part of multiline text span, includes AccountSignIn1-2, in that order", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Hide Password": "Cacher le mot de passe", - "@Hide Password": { - "description": "content description for password hide button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Show Password": "Afficher le mot de passe", - "@Show Password": { - "description": "content description for password show button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Terms of Service Link": "Lien vers les Conditions d’utilisation", - "@Terms of Service Link": { - "description": "content description for terms of service link", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Privacy Policy Link": "Lien vers la Politique de confidentialité", - "@Privacy Policy Link": { - "description": "content description for privacy policy link", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Event": "Événement", - "@Event": { - "description": "Title for the event details screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Date": "Date", - "@Date": { - "description": "Label for the event date", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Location": "Lieu", - "@Location": { - "description": "Label for the location information", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Location Specified": "Aucun lieu spécifié", - "@No Location Specified": { - "description": "Description for events that do not have a location", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "eventTime": "{startAt} / {endAt}", - "@eventTime": { - "description": "The time the event is happening, example: \"2:00 pm - 4:00 pm\"", - "type": "text", - "placeholders_order": [ - "startAt", - "endAt" - ], - "placeholders": { - "startAt": {}, - "endAt": {} - } - }, - "Set a date and time to be notified of this event.": "Paramétrez une date et une heure à laquelle vous notifier de cet événement.", - "@Set a date and time to be notified of this event.": { - "description": "Description for row to set event reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You will be notified about this event on…": "Vous serez notifié de cet événement le...", - "@You will be notified about this event on…": { - "description": "Description for when an event reminder is set", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Share Your Love for the App": "Partager votre engouement pour l'application", - "@Share Your Love for the App": { - "description": "Label for option to open the app store", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Tell us about your favorite parts of the app": "Dites-nous quelles fonctions de l'application vous plaisent le plus", - "@Tell us about your favorite parts of the app": { - "description": "Description for option to open the app store", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Legal": "Légal", - "@Legal": { - "description": "Label for legal information option", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Privacy policy, terms of use, open source": "Vie privée, conditions d’utilisation, open source", - "@Privacy policy, terms of use, open source": { - "description": "Description for legal information option", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Idea for Canvas Parent App [Android]": "Idée pour l'application Canvas Parent [Android]", - "@Idea for Canvas Parent App [Android]": { - "description": "The subject for the email to request a feature", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The following information will help us better understand your idea:": "Les informations suivantes nous aideront à mieux comprendre votre idée :", - "@The following information will help us better understand your idea:": { - "description": "The header for the users information that is attached to a feature request", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Domain:": "Domaine :", - "@Domain:": { - "description": "The label for the Canvas domain of the logged in user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "User ID:": "ID d'utilisateur", - "@User ID:": { - "description": "The label for the Canvas user ID of the logged in user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Email:": "Courriel :", - "@Email:": { - "description": "The label for the eamil of the logged in user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Locale:": "Langue :", - "@Locale:": { - "description": "The label for the locale of the logged in user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Terms of Use": "Conditions d’utilisation", - "@Terms of Use": { - "description": "Label for the terms of use", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Canvas on GitHub": "Canvas sur GitHub", - "@Canvas on GitHub": { - "description": "Label for the button that opens the Canvas project on GitHub's website", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was a problem loading the Terms of Use": "Un problème est survenu lors du chargement des Conditions d’utilisation.", - "@There was a problem loading the Terms of Use": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Device": "Appareil", - "@Device": { - "description": "Label used for device manufacturer/model in the error report", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "OS Version": "Version de l'OS", - "@OS Version": { - "description": "Label used for device operating system version in the error report", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Version Number": "Numéro de version", - "@Version Number": { - "description": "Label used for the app version number in the error report", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Report A Problem": "Signaler un problème", - "@Report A Problem": { - "description": "Title used for generic dialog to report problems", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Subject": "Sujet", - "@Subject": { - "description": "Label used for Subject text field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "A subject is required.": "Un sujet est requis.", - "@A subject is required.": { - "description": "Error shown when the subject field is empty", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "An email address is required.": "Une adresse e-mail est requise.", - "@An email address is required.": { - "description": "Error shown when the email field is empty", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Description": "Description", - "@Description": { - "description": "Label used for Description text field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "A description is required.": "Une description est requise.", - "@A description is required.": { - "description": "Error shown when the description field is empty", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "How is this affecting you?": "Comment cela vous affecte-t-il ?", - "@How is this affecting you?": { - "description": "Label used for the dropdown to select how severe the issue is", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "send": "envoyer", - "@send": { - "description": "Label used for send button when reporting a problem", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Just a casual question, comment, idea, suggestion…": "Juste une question informelle, un commentaire, une idée, une suggestion...", - "@Just a casual question, comment, idea, suggestion…": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I need some help but it's not urgent.": "J'ai besoin d'aide mais ce n'est pas urgent.", - "@I need some help but it's not urgent.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Something's broken but I can work around it to get what I need done.": "Quelque chose ne fonctionne plus mais je peux quand même réaliser ce que je dois faire.", - "@Something's broken but I can work around it to get what I need done.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I can't get things done until I hear back from you.": "Je ne peux plus rien faire jusqu'à ce que vous me contactiez.", - "@I can't get things done until I hear back from you.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "EXTREME CRITICAL EMERGENCY!!": "URGENCE CRITIQUE EXTRÊME !!!", - "@EXTREME CRITICAL EMERGENCY!!": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Not Graded": "Non noté", - "@Not Graded": { - "description": "Description for an assignment has not been graded.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Login flow: Normal": "Flux d’identification : Normal", - "@Login flow: Normal": { - "description": "Description for the normal login flow", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Login flow: Canvas": "Flux d’identification : Canvas", - "@Login flow: Canvas": { - "description": "Description for the Canvas login flow", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Login flow: Site Admin": "Flux d’identification : Administrateur du site", - "@Login flow: Site Admin": { - "description": "Description for the Site Admin login flow", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Login flow: Skip mobile verify": "Flux d’identification : Passer la vérification par mobile", - "@Login flow: Skip mobile verify": { - "description": "Description for the login flow that skips domain verification for mobile", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Act As User": "Agir en tant qu'utilisateur", - "@Act As User": { - "description": "Label for the button that allows the user to act (masquerade) as another user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Stop Acting as User": "Cesser d'agir en tant qu'utilisateur", - "@Stop Acting as User": { - "description": "Label for the button that allows the user to stop acting (masquerading) as another user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "actingAsUser": "Vous agissez en tant que {userName}", - "@actingAsUser": { - "description": "Message shown while acting (masquerading) as another user", - "type": "text", - "placeholders_order": [ - "userName" - ], - "placeholders": { - "userName": {} - } - }, - "\"Act as\" is essentially logging in as this user without a password. You will be able to take any action as if you were this user, and from other users' points of views, it will be as if this user performed them. However, audit logs record that you were the one who performed the actions on behalf of this user.": "\"Agir comme\" permet essentiellement de se connecter en tant qu'utilisateur sans mot de passe. Vous pourrez effectuer toutes les actions que vous voulez comme si vous étiez cet utilisateur et, vu des autres utilisateurs, tout paraîtra comme si c’était cet utilisateur qui avait agi. Cependant, les journaux d’audit enregistrent le fait que c’est vous qui avez effectué ces actions au nom de l’utilisateur.", - "@\"Act as\" is essentially logging in as this user without a password. You will be able to take any action as if you were this user, and from other users' points of views, it will be as if this user performed them. However, audit logs record that you were the one who performed the actions on behalf of this user.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Domain": "Domaine", - "@Domain": { - "description": "Text field hint for domain url input", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You must enter a valid domain": "Vous devez entrer un domaine valide.", - "@You must enter a valid domain": { - "description": "Message displayed for domain input error", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "User ID": "ID utilisateur", - "@User ID": { - "description": "Text field hint for user ID input", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You must enter a user id": "Vous devez entrer un identifiant utilisateur.", - "@You must enter a user id": { - "description": "Message displayed for user Id input error", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error trying to act as this user. Please check the Domain and User ID and try again.": "Une erreur est survenue lors de la tentative d'agir au nom de cet utilisateur. Veuillez vérifier le domaine et l’identifiant utilisateur, puis réessayez.", - "@There was an error trying to act as this user. Please check the Domain and User ID and try again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "endMasqueradeMessage": "Vous n’agirez plus en tant que {userName} et reprendrez votre compte original.", - "@endMasqueradeMessage": { - "description": "Confirmation message displayed when the user wants to stop acting (masquerading) as another user", - "type": "text", - "placeholders_order": [ - "userName" - ], - "placeholders": { - "userName": {} - } - }, - "endMasqueradeLogoutMessage": "Vous n’agirez plus en tant que {userName} et serez déconnecté.", - "@endMasqueradeLogoutMessage": { - "description": "Confirmation message displayed when the user wants to stop acting (masquerading) as another user and will be logged out.", - "type": "text", - "placeholders_order": [ - "userName" - ], - "placeholders": { - "userName": {} - } - }, - "How are we doing?": "Comment nous débrouillons-nous ?", - "@How are we doing?": { - "description": "Title for dialog asking user to rate the app out of 5 stars.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Don't show again": "Ne plus montrer à nouveau", - "@Don't show again": { - "description": "Button to prevent the rating dialog from showing again.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "What can we do better?": "En quoi pouvons-nous nous améliorer ?", - "@What can we do better?": { - "description": "Hint text for providing a comment with the rating.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Send Feedback": "Envoyer un avis", - "@Send Feedback": { - "description": "Button to send rating with feedback", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "ratingDialogEmailSubject": "Suggestions pour Android - Canvas Parent {version}", - "@ratingDialogEmailSubject": { - "description": "The subject for an email to provide feedback for CanvasParent.", - "type": "text", - "placeholders_order": [ - "version" - ], - "placeholders": { - "version": {} - } - }, - "starRating": "{position,plural, =1{{position} étoile}other{{position} étoiles}}", - "@starRating": { - "description": "Accessibility label for the 1 stars to 5 stars rating", - "type": "text", - "placeholders_order": [ - "position" - ], - "placeholders": { - "position": { - "example": 1 - } - } - }, - "Student Pairing": "Jumelage élève", - "@Student Pairing": { - "description": "Title for the screen where users can pair to students using a QR code", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Open Canvas Student": "Ouvrir Canvas Student", - "@Open Canvas Student": { - "description": "Title for QR pairing tutorial screen instructing users to open the Canvas Student app", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You'll need to open your student's Canvas Student app to continue. Go into Main Menu > Settings > Pair with Observer and scan the QR code you see there.": "Vous devrez ouvrir votre application pour élèves Canvas Student pour continuer. Rendez-vous dans Menu Principal > Paramètres > Jumelage avec un observateur et scannez le code QR qui y apparaît.", - "@You'll need to open your student's Canvas Student app to continue. Go into Main Menu > Settings > Pair with Observer and scan the QR code you see there.": { - "description": "Message explaining how QR code pairing works", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Screenshot showing location of pairing QR code generation in the Canvas Student app": "Capture d'écran montrant l’emplacement où est généré le code QR de jumelage dans l’application Canvas Student", - "@Screenshot showing location of pairing QR code generation in the Canvas Student app": { - "description": "Content Description for qr pairing tutorial screenshot", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Expired QR Code": "Code QR expiré", - "@Expired QR Code": { - "description": "Error title shown when the users scans a QR code that has expired", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The QR code you scanned may have expired. Refresh the code on the student's device and try again.": "Le code QR que vous avez scanné a probablement expiré. Veuillez réactualiser le code depuis l’appareil de l'élève, puis réessayez.", - "@The QR code you scanned may have expired. Refresh the code on the student's device and try again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "A network error occurred when adding this student. Check your connection and try again.": "Une erreur réseau est survenue lors de l'ajout de l’élève. Vérifiez votre connexion, puis réessayez.", - "@A network error occurred when adding this student. Check your connection and try again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Invalid QR Code": "Code QR non valide", - "@Invalid QR Code": { - "description": "Error title shown when the user scans an invalid QR code", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Incorrect Domain": "Domaine incorrect", - "@Incorrect Domain": { - "description": "Error title shown when the users scane a QR code for a student that belongs to a different domain", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The student you are trying to add belongs to a different school. Log in or create an account with that school to scan this code.": "L'élève que vous essayez d'ajouter appartient à une autre école. Connectez-vous ou créez un compte auprès de cette école pour scanner ce code.", - "@The student you are trying to add belongs to a different school. Log in or create an account with that school to scan this code.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Camera Permission": "Autorisations d'appareil photo", - "@Camera Permission": { - "description": "Error title shown when the user wans to scan a QR code but has denied the camera permission", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "This will unpair and remove all enrollments for this student from your account.": "Cette action annulera le jumelage et supprimera toutes les inscriptions pour cet élève de votre compte.", - "@This will unpair and remove all enrollments for this student from your account.": { - "description": "Confirmation message shown when the user tries to delete a student from their account", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was a problem removing this student from your account. Please check your connection and try again.": "Un problème est survenu lors de la suppression de l'élève de votre compte. Veuillez vérifier votre connexion, puis réessayez.", - "@There was a problem removing this student from your account. Please check your connection and try again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Cancel": "Annuler", - "@Cancel": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "next": "Suivant", - "@next": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "ok": "OK", - "@ok": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Yes": "Oui", - "@Yes": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No": "Non", - "@No": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Retry": "Réessayer", - "@Retry": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Delete": "Supprimer", - "@Delete": { - "description": "Label used for general delete/remove actions", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Done": "Terminé", - "@Done": { - "description": "Label for general done/finished actions", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Refresh": "Actualiser", - "@Refresh": { - "description": "Label for button to refresh data from the web", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "View Description": "Afficher la description", - "@View Description": { - "description": "Button to view the description for an event or assignment", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "expanded": "étendu", - "@expanded": { - "description": "Description for the accessibility reader for list groups that are expanded", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "collapsed": "réduit", - "@collapsed": { - "description": "Description for the accessibility reader for list groups that are expanded", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "An unexpected error occurred": "Une erreur inattendue s'est produite", - "@An unexpected error occurred": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No description": "Aucune description", - "@No description": { - "description": "Message used when the assignment has no description", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Launch External Tool": "Lancer l'outil externe", - "@Launch External Tool": { - "description": "Button text added to webviews to let users open external tools in their browser", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Interactions on this page are limited by your institution.": "Les interactions sur cette page sont limités par votre institution.", - "@Interactions on this page are limited by your institution.": { - "description": "Message describing how the webview has limited access due to an instution setting", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "dateAtTime": "le {date} à {time}", - "@dateAtTime": { - "description": "The string to format dates", - "type": "text", - "placeholders_order": [ - "date", - "time" - ], - "placeholders": { - "date": {}, - "time": {} - } - }, - "dueDateAtTime": "Dû le {date} à {time}", - "@dueDateAtTime": { - "description": "The string to format due dates", - "type": "text", - "placeholders_order": [ - "date", - "time" - ], - "placeholders": { - "date": {}, - "time": {} - } - }, - "No Due Date": "Pas de date limite de rendu", - "@No Due Date": { - "description": "Label for assignments that do not have a due date", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Filter": "Filtre", - "@Filter": { - "description": "Label for buttons to filter what items are visible", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "unread": "non lu", - "@unread": { - "description": "Label for things that are marked as unread", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "unreadCount": "{count} non lu", - "@unreadCount": { - "description": "Formatted string for when there are a number of unread items", - "type": "text", - "placeholders_order": [ - "count" - ], - "placeholders": { - "count": {} - } - }, - "badgeNumberPlus": "{count}+", - "@badgeNumberPlus": { - "description": "Formatted string for when too many items are being notified in a badge, generally something like: 99+", - "type": "text", - "placeholders_order": [ - "count" - ], - "placeholders": { - "count": {} - } - }, - "There was an error loading this announcement": "Une erreur est survenue lors du chargement de cette annonce.", - "@There was an error loading this announcement": { - "description": "Message shown when an announcement detail screen fails to load", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Network error": "Erreur de réseau", - "@Network error": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Under Construction": "En construction", - "@Under Construction": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "We are currently building this feature for your viewing pleasure.": "Nous sommes actuellement en train de travailler sur cette fonctionnalité, rien que pour vous.", - "@We are currently building this feature for your viewing pleasure.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Request Login Help Button": "Bouton « Demander une assistance pour la connexion »", - "@Request Login Help Button": { - "description": "Accessibility hint for button that opens help dialog for a login help request", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Request Login Help": "Demander une assistance pour la connexion", - "@Request Login Help": { - "description": "Title of help dialog for a login help request", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I'm having trouble logging in": "J'ai du mal à me connecter", - "@I'm having trouble logging in": { - "description": "Subject of help dialog for a login help request", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "An error occurred when trying to display this link": "Une erreur est survenue lors de la tentative d’affichage de ce lien", - "@An error occurred when trying to display this link": { - "description": "Error message shown when a link can't be opened", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "We are unable to display this link, it may belong to an institution you currently aren't logged in to.": "Nous n’avons pas pu afficher ce lien. Il appartient peut-être à un établissement auquel vous n’êtes pas connecté.", - "@We are unable to display this link, it may belong to an institution you currently aren't logged in to.": { - "description": "Description for error page shown when clicking a link", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Link Error": "Erreur de lien", - "@Link Error": { - "description": "Title for error page shown when clicking a link", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Open In Browser": "Ouvrir dans le navigateur", - "@Open In Browser": { - "description": "Text for button to open a link in the browswer", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You'll find the QR code on the web in your account profile. Click 'QR for Mobile Login' in the list.": "Vous trouverez le code QR sur le Web dans votre profil. Cliquez sur « QR pour connexion mobile » dans la liste.", - "@You'll find the QR code on the web in your account profile. Click 'QR for Mobile Login' in the list.": { - "description": "Text for qr login tutorial screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Locate QR Code": "Localiser un code QR", - "@Locate QR Code": { - "description": "Text for qr login button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Please scan a QR code generated by Canvas": "Veuillez scanner un code QR généré par Canvas.", - "@Please scan a QR code generated by Canvas": { - "description": "Text for qr login error with incorrect qr code", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error logging in. Please generate another QR Code and try again.": "Une erreur est survenue pendant la connexion. Veuillez générer un autre code QR, puis réessayez.", - "@There was an error logging in. Please generate another QR Code and try again.": { - "description": "Text for qr login error", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Screenshot showing location of QR code generation in browser": "Capture d'écran montrant l’emplacement du générateur de code QR dans le navigateur.", - "@Screenshot showing location of QR code generation in browser": { - "description": "Content Description for qr login tutorial screenshot", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "QR scanning requires camera access": "Le scan de code QR nécessite l’accès à l'appareil photo.", - "@QR scanning requires camera access": { - "description": "placeholder for camera error for QR code scan", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The linked item is no longer available": "L'élément vers lequel pointe le lien n’est plus disponible", - "@The linked item is no longer available": { - "description": "error message when the alert could no be opened", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Message sent": "Message envoyé", - "@Message sent": { - "description": "confirmation message on the screen when the user succesfully sends a message", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Acceptable Use Policy": "Règlement d'utilisation acceptable", - "@Acceptable Use Policy": { - "description": "title for the acceptable use policy screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Submit": "Soumettre", - "@Submit": { - "description": "submit button title for acceptable use policy screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Either you're a new user or the Acceptable Use Policy has changed since you last agreed to it. Please agree to the Acceptable Use Policy before you continue.": "Vous êtes un nouvel utilisateur, ou bien le Règlement d'utilisation acceptable a changé depuis la dernière fois que vous l'avez accepté. Veuillez accepter le Règlement d'utilisation acceptable avant de continuer", - "@Either you're a new user or the Acceptable Use Policy has changed since you last agreed to it. Please agree to the Acceptable Use Policy before you continue.": { - "description": "acceptable use policy screen description", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I agree to the Acceptable Use Policy.": "J'accepte le Règlement d'utilisation acceptable", - "@I agree to the Acceptable Use Policy.": { - "description": "acceptable use policy switch title", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "About": "À propos de", - "@About": { - "description": "Title for about menu item in settings", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "App": "Application", - "@App": { - "description": "Title for App field on about page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Login ID": "ID d’authentification", - "@Login ID": { - "description": "Title for Login ID field on about page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Email": "Email", - "@Email": { - "description": "Title for Email field on about page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Version": "Version", - "@Version": { - "description": "Title for Version field on about page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Instructure logo": "Logo Instructure", - "@Instructure logo": { - "description": "Semantics label for the Instructure logo on the about page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - } -} \ No newline at end of file diff --git a/apps/flutter_parent/lib/l10n/res/intl_fr_CA.arb b/apps/flutter_parent/lib/l10n/res/intl_fr_CA.arb deleted file mode 100644 index 9cd6a1677b..0000000000 --- a/apps/flutter_parent/lib/l10n/res/intl_fr_CA.arb +++ /dev/null @@ -1,2753 +0,0 @@ -{ - "@@last_modified": "2023-08-25T11:04:20.901151", - "alertsLabel": "Alertes", - "@alertsLabel": { - "description": "The label for the Alerts tab", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "calendarLabel": "Calendrier", - "@calendarLabel": { - "description": "The label for the Calendar tab", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "coursesLabel": "Cours", - "@coursesLabel": { - "description": "The label for the Courses tab", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Students": "Aucun étudiant", - "@No Students": { - "description": "Text for when an observer has no students they are observing", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Tap to show student selector": "Appuyez pour afficher le sélecteur d’étudiant", - "@Tap to show student selector": { - "description": "Semantics label for the area that will show the student selector when tapped", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Tap to pair with a new student": "Appuyez pour apparier avec un nouvel étudiant", - "@Tap to pair with a new student": { - "description": "Semantics label for the add student button in the student selector", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Tap to select this student": "Appuyez pour sélectionner cet étudiant", - "@Tap to select this student": { - "description": "Semantics label on individual students in the student switcher", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Manage Students": "Gestion des participants", - "@Manage Students": { - "description": "Label text for the Manage Students nav drawer button as well as the title for the Manage Students screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Help": "Aide", - "@Help": { - "description": "Label text for the help nav drawer button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Log Out": "Déconnexion", - "@Log Out": { - "description": "Label text for the Log Out nav drawer button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Switch Users": "Changer d’utilisateurs", - "@Switch Users": { - "description": "Label text for the Switch Users nav drawer button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "appVersion": "v. {version}", - "@appVersion": { - "description": "App version shown in the navigation drawer", - "type": "text", - "placeholders_order": [ - "version" - ], - "placeholders": { - "version": {} - } - }, - "Are you sure you want to log out?": "Voulez-vous vraiment vous déconnecter?", - "@Are you sure you want to log out?": { - "description": "Confirmation message displayed when the user tries to log out", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Calendars": "Calendriers", - "@Calendars": { - "description": "Label for button that lets users select which calendars to display", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "nextMonth": "Mois suivant : {month}", - "@nextMonth": { - "description": "Label for the button that switches the calendar to the next month", - "type": "text", - "placeholders_order": [ - "month" - ], - "placeholders": { - "month": {} - } - }, - "previousMonth": "Mois précédent : {month}", - "@previousMonth": { - "description": "Label for the button that switches the calendar to the previous month", - "type": "text", - "placeholders_order": [ - "month" - ], - "placeholders": { - "month": {} - } - }, - "nextWeek": "Semaine prochaine commençant le {date}", - "@nextWeek": { - "description": "Label for the button that switches the calendar to the next week", - "type": "text", - "placeholders_order": [ - "date" - ], - "placeholders": { - "date": {} - } - }, - "previousWeek": "Semaine précédente commençant le {date}", - "@previousWeek": { - "description": "Label for the button that switches the calendar to the previous week", - "type": "text", - "placeholders_order": [ - "date" - ], - "placeholders": { - "date": {} - } - }, - "selectedMonthLabel": "Mois de {month}", - "@selectedMonthLabel": { - "description": "Accessibility label for the button that expands/collapses the month view", - "type": "text", - "placeholders_order": [ - "month" - ], - "placeholders": { - "month": {} - } - }, - "expand": "développer", - "@expand": { - "description": "Accessibility label for the on-tap hint for the button that expands/collapses the month view", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "collapse": "réduire", - "@collapse": { - "description": "Accessibility label for the on-tap hint for the button that expands/collapses the month view", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "pointsPossible": "{points} points possibles", - "@pointsPossible": { - "description": "Screen reader label used for the points possible for an assignment, quiz, etc.", - "type": "text", - "placeholders_order": [ - "points" - ], - "placeholders": { - "points": {} - } - }, - "calendarDaySemanticsLabel": "{eventCount,plural, =1{{date}, {eventCount} événement}other{{date}, {eventCount} événements}}", - "@calendarDaySemanticsLabel": { - "description": "Screen reader label used for calendar day, reads the date and count of events", - "type": "text", - "placeholders_order": [ - "date", - "eventCount" - ], - "placeholders": { - "date": {}, - "eventCount": {} - } - }, - "No Events Today!": "Aucun événement d’aujourd’hui!", - "@No Events Today!": { - "description": "Title displayed when there are no calendar events for the current day", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "It looks like a great day to rest, relax, and recharge.": "C’est une belle journée pour se reposer, se détendre et recharger nos batteries.", - "@It looks like a great day to rest, relax, and recharge.": { - "description": "Message displayed when there are no calendar events for the current day", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading your student's calendar": "Une erreur est survenue lors du chargement du calendrier de vos étudiants.", - "@There was an error loading your student's calendar": { - "description": "Message displayed when calendar events could not be loaded for the current student", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Tap to favorite the courses you want to see on the Calendar. Select up to 10.": "Appuyez pour mettre dans les favoris les cours que vous souhaitez voir sur le calendrier. Sélectionnez-en jusqu’à 10.", - "@Tap to favorite the courses you want to see on the Calendar. Select up to 10.": { - "description": "Description text on calendar filter screen.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You may only choose 10 calendars to display": "Vous pouvez seulement choisir 10 calendriers à afficher", - "@You may only choose 10 calendars to display": { - "description": "Error text when trying to select more than 10 calendars", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You must select at least one calendar to display": "Vous devez sélectionner au moins un calendrier à afficher.", - "@You must select at least one calendar to display": { - "description": "Error text when trying to de-select all calendars", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Planner Note": "Remarque du planificateur", - "@Planner Note": { - "description": "Label used for notes in the planner", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Go to today": "Aller à aujourd’hui", - "@Go to today": { - "description": "Accessibility label used for the today button in the planner", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Previous Logins": "Connexions précédentes", - "@Previous Logins": { - "description": "Label for the list of previous user logins", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "canvasLogoLabel": "Logo de Canvas", - "@canvasLogoLabel": { - "description": "The semantics label for the Canvas logo", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "findSchool": "Trouver une école", - "@findSchool": { - "description": "Text for the find-my-school button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "findAnotherSchool": "Chercher un autre école", - "@findAnotherSchool": { - "description": "Text for the find-another-school button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "domainSearchInputHint": "Saisir le nom de l’établissement scolaire ou du district…", - "@domainSearchInputHint": { - "description": "Input hint for the text box on the domain search screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "noDomainResults": "Impossible de trouver les écoles correspondant à « {query} »", - "@noDomainResults": { - "description": "Message shown to users when the domain search query did not return any results", - "type": "text", - "placeholders_order": [ - "query" - ], - "placeholders": { - "query": {} - } - }, - "domainSearchHelpLabel": "Comment puis-je trouver mon école ou district?", - "@domainSearchHelpLabel": { - "description": "Label for the help button on the domain search screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "canvasGuides": "Guides de Canvas", - "@canvasGuides": { - "description": "Proper name for the Canvas Guides. This will be used in the domainSearchHelpBody text and will be highlighted and clickable", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "canvasSupport": "Soutien technique de Canvas", - "@canvasSupport": { - "description": "Proper name for Canvas Support. This will be used in the domainSearchHelpBody text and will be highlighted and clickable", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "domainSearchHelpBody": "Essayez de rechercher le nom de l’école ou du district auquel vous tentez d’accéder, comme « École privée Smith » ou « Écoles régionales Smith ». Vous pouvez également saisir un domaine Canvas directement, comme « smith.instructure.com. »\n\nPour obtenir de plus amples renseignements sur la façon de trouver le compte Canvas de votre établissement, vous pouvez consulter {canvasGuides}, communiquer avec {canvasSupport}, ou contacter votre école pour obtenir de l’aide.", - "@domainSearchHelpBody": { - "description": "The body text shown in the help dialog on the domain search screen", - "type": "text", - "placeholders_order": [ - "canvasGuides", - "canvasSupport" - ], - "placeholders": { - "canvasGuides": {}, - "canvasSupport": {} - } - }, - "Uh oh!": "Oh oh!", - "@Uh oh!": { - "description": "Title of the screen that shows when a crash has occurred", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "We’re not sure what happened, but it wasn’t good. Contact us if this keeps happening.": "Nous ne sommes pas sûrs de ce qui s’est passé, mais ce n’était pas bon. Contactez-nous si cela continue.", - "@We’re not sure what happened, but it wasn’t good. Contact us if this keeps happening.": { - "description": "Message shown when a crash has occurred", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Contact Support": "Contacter l’équipe de soutien", - "@Contact Support": { - "description": "Label for the button that allows users to contact support after a crash has occurred", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "View error details": "Afficher les détails de l’erreur", - "@View error details": { - "description": "Label for the button that allowed users to view crash details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Restart app": "Redémarrer l’application", - "@Restart app": { - "description": "Label for the button that will restart the entire application", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Application version": "Version de l’application", - "@Application version": { - "description": "Label for the application version displayed in the crash details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Device model": "Modèle de l’appareil", - "@Device model": { - "description": "Label for the device model displayed in the crash details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Android OS version": "Version du SE Android", - "@Android OS version": { - "description": "Label for the Android operating system version displayed in the crash details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Full error message": "Message d’erreur complet", - "@Full error message": { - "description": "Label for the full error message displayed in the crash details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Inbox": "Boîte de réception", - "@Inbox": { - "description": "Title for the Inbox screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading your inbox messages.": "Une erreur est survenue lors du chargement de votre boîte de réception.", - "@There was an error loading your inbox messages.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Subject": "Aucun sujet", - "@No Subject": { - "description": "Title used for inbox messages that have no subject", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unable to fetch courses. Please check your connection and try again.": "Impossible de récupérer les cours. Veuillez vérifier votre connexion et réessayer.", - "@Unable to fetch courses. Please check your connection and try again.": { - "description": "Message shown when an error occured while loading courses", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Choose a course to message": "Choisissez un cours pour lequel envoyer un message", - "@Choose a course to message": { - "description": "Header in the course list shown when the user is choosing which course to associate with a new message", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Inbox Zero": "Boîte de réception Zéro", - "@Inbox Zero": { - "description": "Title of the message shown when there are no inbox messages", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You’re all caught up!": "Vous êtes coincé!", - "@You’re all caught up!": { - "description": "Subtitle of the message shown when there are no inbox messages", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading recipients for this course": "Une erreur est survenue lors du chargement des destinataires de ce cours.", - "@There was an error loading recipients for this course": { - "description": "Message shown when attempting to create a new message but the recipients list failed to load", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unable to send message. Check your connection and try again.": "Impossible d’envoyer un message. Vérifiez votre connexion puis réessayez.", - "@Unable to send message. Check your connection and try again.": { - "description": "Message show when there was an error creating or sending a new message", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unsaved changes": "Changements non enregistrés", - "@Unsaved changes": { - "description": "Title of the dialog shown when the user tries to leave with unsaved changes", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Are you sure you wish to close this page? Your unsent message will be lost.": "Voulez-vous vraiment fermer cette page? Vos messages non envoyés seront perdus.", - "@Are you sure you wish to close this page? Your unsent message will be lost.": { - "description": "Body text of the dialog shown when the user tries leave with unsaved changes", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "New message": "Nouveau message", - "@New message": { - "description": "Title of the new-message screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Add attachment": "Ajouter une pièce jointe", - "@Add attachment": { - "description": "Tooltip for the add-attachment button in the new-message screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Send message": "Envoyer un message", - "@Send message": { - "description": "Tooltip for the send-message button in the new-message screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Select recipients": "Sélectionner les destinataires", - "@Select recipients": { - "description": "Tooltip for the button that allows users to select message recipients", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No recipients selected": "Aucun destinataire sélectionné pour l’instant", - "@No recipients selected": { - "description": "Hint displayed when the user has not selected any message recipients", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Message subject": "Objet du message", - "@Message subject": { - "description": "Hint text displayed in the input field for the message subject", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Message": "Message", - "@Message": { - "description": "Hint text displayed in the input field for the message body", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Recipients": "Destinataires", - "@Recipients": { - "description": "Label for message recipients", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "plusRecipientCount": "+{count}", - "@plusRecipientCount": { - "description": "Shows the number of recipients that are selected but not displayed on screen.", - "type": "text", - "placeholders_order": [ - "count" - ], - "placeholders": { - "count": { - "example": 5 - } - } - }, - "Failed. Tap for options.": "Échec. Appuyez pour des options.", - "@Failed. Tap for options.": { - "description": "Short message shown on a message attachment when uploading has failed", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "courseForWhom": "pour {studentShortName}", - "@courseForWhom": { - "description": "Describes for whom a course is for (i.e. for Bill)", - "type": "text", - "placeholders_order": [ - "studentShortName" - ], - "placeholders": { - "studentShortName": {} - } - }, - "messageLinkPostscript": "En ce qui concerne : {studentName}, {linkUrl}", - "@messageLinkPostscript": { - "description": "A postscript appended to new messages that clarifies which student is the subject of the message and also includes a URL for the related Canvas component (course, assignment, event, etc).", - "type": "text", - "placeholders_order": [ - "studentName", - "linkUrl" - ], - "placeholders": { - "studentName": {}, - "linkUrl": {} - } - }, - "There was an error loading this conversation": "Une erreur est survenue lors du chargement de cette conversation", - "@There was an error loading this conversation": { - "description": "Message shown when a conversation fails to load", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Reply": "Répondre", - "@Reply": { - "description": "Button label for replying to a conversation", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Reply All": "Répondre à tous", - "@Reply All": { - "description": "Button label for replying to all conversation participants", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unknown User": "Utilisateur inconnu", - "@Unknown User": { - "description": "Label used where the user name is not known", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "me": "moi", - "@me": { - "description": "First-person pronoun (i.e. 'me') that will be used in message author info, e.g. 'Me to 4 others' or 'Jon Snow to me'", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "authorToRecipient": "{authorName} à {recipientName}", - "@authorToRecipient": { - "description": "Author info for a single-recipient message; includes both the author name and the recipient name.", - "type": "text", - "placeholders_order": [ - "authorName", - "recipientName" - ], - "placeholders": { - "authorName": {}, - "recipientName": {} - } - }, - "authorToNOthers": "{howMany,plural, =1{{authorName} à un autre}other{{authorName} à {howMany} autres}}", - "@authorToNOthers": { - "description": "Author info for a mutli-recipient message; includes the author name and the number of recipients", - "type": "text", - "placeholders_order": [ - "authorName", - "howMany" - ], - "placeholders": { - "authorName": {}, - "howMany": {} - } - }, - "authorToRecipientAndNOthers": "{howMany,plural, =1{{authorName} à {recipientName} et un autre}other{{authorName} à {recipientName} et {howMany} autres}}", - "@authorToRecipientAndNOthers": { - "description": "Author info for a multi-recipient message; includes the author name, one recipient name, and the number of other recipients", - "type": "text", - "placeholders_order": [ - "authorName", - "recipientName", - "howMany" - ], - "placeholders": { - "authorName": {}, - "recipientName": {}, - "howMany": {} - } - }, - "Download": "Télécharger", - "@Download": { - "description": "Label for the button that will begin downloading a file", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Open with another app": "Ouvrir avec une autre application", - "@Open with another app": { - "description": "Label for the button that will allow users to open a file with another app", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There are no installed applications that can open this file": "Aucune application installée ne peut ouvrir ce fichier", - "@There are no installed applications that can open this file": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unsupported File": "Type de fichier non pris en charge", - "@Unsupported File": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "This file is unsupported and can’t be viewed through the app": "Ce fichier n’est pas pris en charge et ne peut pas être consulté par l’application", - "@This file is unsupported and can’t be viewed through the app": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unable to play this media file": "Impossible de lire ce fichier multimédia", - "@Unable to play this media file": { - "description": "Message shown when audio or video media could not be played", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unable to load this image": "Impossible de charger cette image", - "@Unable to load this image": { - "description": "Message shown when an image file could not be loaded or displayed", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading this file": "Une erreur est survenue lors du chargement de ce fichier", - "@There was an error loading this file": { - "description": "Message shown when a file could not be loaded or displayed", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Courses": "Aucun cours", - "@No Courses": { - "description": "Title for having no courses", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Your student’s courses might not be published yet.": "Les cours de votre étudiant peuvent ne pas être encore publiés.", - "@Your student’s courses might not be published yet.": { - "description": "Message for having no courses", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading your student’s courses.": "Une erreur est survenue lors du chargement des cours de votre étudiant.", - "@There was an error loading your student’s courses.": { - "description": "Message displayed when the list of student courses could not be loaded", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Grade": "Non noté", - "@No Grade": { - "description": "Message shown when there is currently no grade available for a course", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Filter by": "Filtrer par", - "@Filter by": { - "description": "Title for list of terms to filter grades by", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Grades": "Notes", - "@Grades": { - "description": "Label for the \"Grades\" tab in course details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Syllabus": "Plan de cours", - "@Syllabus": { - "description": "Label for the \"Syllabus\" tab in course details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Front Page": "Page de couverture", - "@Front Page": { - "description": "Label for the \"Front Page\" tab in course details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Summary": "Résumé", - "@Summary": { - "description": "Label for the \"Summary\" tab in course details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Send a message about this course": "Envoyer un message à propos de ce cours", - "@Send a message about this course": { - "description": "Accessibility hint for the course messaage floating action button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Total Grade": "Note totale", - "@Total Grade": { - "description": "Label for the total grade in the course", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Graded": "Noté", - "@Graded": { - "description": "Label for assignments that have been graded", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Submitted": "Envoyé", - "@Submitted": { - "description": "Label for assignments that have been submitted", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Not Submitted": "Non soumis", - "@Not Submitted": { - "description": "Label for assignments that have not been submitted", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Late": "En retard", - "@Late": { - "description": "Label for assignments that have been marked late or submitted late", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Missing": "Manquant", - "@Missing": { - "description": "Label for assignments that have been marked missing or are not submitted and past the due date", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "-": "-", - "@-": { - "description": "Value representing no score for student submission", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "All Grading Periods": "Toutes les périodes de notation", - "@All Grading Periods": { - "description": "Label for selecting all grading periods", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Assignments": "Aucune tâche", - "@No Assignments": { - "description": "Title for the no assignments message", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "It looks like assignments haven't been created in this space yet.": "Il semblerait qu’il n’y ait pas encore de tâche créée dans cet espace.", - "@It looks like assignments haven't been created in this space yet.": { - "description": "Message for no assignments", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading the summary details for this course.": "Une erreur est survenue lors du chargement des détails de résumé de ce cours.", - "@There was an error loading the summary details for this course.": { - "description": "Message shown when the course summary could not be loaded", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Summary": "Aucun résumé", - "@No Summary": { - "description": "Title displayed when there are no items in the course summary", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "This course does not have any assignments or calendar events yet.": "Ce cours n’a pas encore de tâches ou d’événements de calendrier.", - "@This course does not have any assignments or calendar events yet.": { - "description": "Message displayed when there are no items in the course summary", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "gradeFormatScoreOutOfPointsPossible": "{score} / {pointsPossible}", - "@gradeFormatScoreOutOfPointsPossible": { - "description": "Formatted string for a student score out of the points possible", - "type": "text", - "placeholders_order": [ - "score", - "pointsPossible" - ], - "placeholders": { - "score": {}, - "pointsPossible": {} - } - }, - "contentDescriptionScoreOutOfPointsPossible": "{score} de {pointsPossible} points", - "@contentDescriptionScoreOutOfPointsPossible": { - "description": "Formatted string for a student score out of the points possible", - "type": "text", - "placeholders_order": [ - "score", - "pointsPossible" - ], - "placeholders": { - "score": {}, - "pointsPossible": {} - } - }, - "gradesSubjectMessage": "En ce qui concerne : {studentName}, notes", - "@gradesSubjectMessage": { - "description": "The subject line for a message to a teacher regarding a student's grades", - "type": "text", - "placeholders_order": [ - "studentName" - ], - "placeholders": { - "studentName": {} - } - }, - "syllabusSubjectMessage": "En ce qui concerne : {studentName}, plan de cours", - "@syllabusSubjectMessage": { - "description": "The subject line for a message to a teacher regarding a course syllabus", - "type": "text", - "placeholders_order": [ - "studentName" - ], - "placeholders": { - "studentName": {} - } - }, - "frontPageSubjectMessage": "En ce qui concerne : {studentName}, page de couverture", - "@frontPageSubjectMessage": { - "description": "The subject line for a message to a teacher regarding a course front page", - "type": "text", - "placeholders_order": [ - "studentName" - ], - "placeholders": { - "studentName": {} - } - }, - "assignmentSubjectMessage": "En ce qui concerne : {studentName}, tâche — {assignmentName}", - "@assignmentSubjectMessage": { - "description": "The subject line for a message to a teacher regarding a student's assignment", - "type": "text", - "placeholders_order": [ - "studentName", - "assignmentName" - ], - "placeholders": { - "studentName": {}, - "assignmentName": {} - } - }, - "eventSubjectMessage": "En ce qui concerne : {studentName}, événement — {eventTitle}", - "@eventSubjectMessage": { - "description": "The subject line for a message to a teacher regarding a calendar event", - "type": "text", - "placeholders_order": [ - "studentName", - "eventTitle" - ], - "placeholders": { - "studentName": {}, - "eventTitle": {} - } - }, - "There is no page information available.": "Il n’y a aucune information de page disponible.", - "@There is no page information available.": { - "description": "Description for when no page information is available", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Assignment Details": "Détails de la tâche", - "@Assignment Details": { - "description": "Title for the page that shows details for an assignment", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "assignmentTotalPoints": "{points} pts", - "@assignmentTotalPoints": { - "description": "Label used for the total points the assignment is worth", - "type": "text", - "placeholders_order": [ - "points" - ], - "placeholders": { - "points": {} - } - }, - "assignmentTotalPointsAccessible": "{points} points", - "@assignmentTotalPointsAccessible": { - "description": "Screen reader label used for the total points the assignment is worth", - "type": "text", - "placeholders_order": [ - "points" - ], - "placeholders": { - "points": {} - } - }, - "Due": "Échéance", - "@Due": { - "description": "Label for an assignment due date", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Grade": "Note", - "@Grade": { - "description": "Label for the section that displays an assignment's grade", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Locked": "Verrouillé", - "@Locked": { - "description": "Label for when an assignment is locked", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "assignmentLockedModule": "Cette tâche est verrouillée par le module « {moduleName} ».", - "@assignmentLockedModule": { - "description": "The locked description when an assignment is locked by a module", - "type": "text", - "placeholders_order": [ - "moduleName" - ], - "placeholders": { - "moduleName": {} - } - }, - "Remind Me": "Me rappeler", - "@Remind Me": { - "description": "Label for the row to set reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Set a date and time to be notified of this specific assignment.": "Définissez une date et une heure afin d’être averti de cette tâche spécifique.", - "@Set a date and time to be notified of this specific assignment.": { - "description": "Description for row to set reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You will be notified about this assignment on…": "Vous serez informé de cette tâche le…", - "@You will be notified about this assignment on…": { - "description": "Description for when a reminder is set", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Instructions": "Instructions", - "@Instructions": { - "description": "Label for the description of the assignment when it has quiz instructions", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Send a message about this assignment": "Envoyer un message à propos de cette tâche", - "@Send a message about this assignment": { - "description": "Accessibility hint for the assignment messaage floating action button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "This app is not authorized for use.": "Cette application n’est pas autorisée à l’utilisation.", - "@This app is not authorized for use.": { - "description": "The error shown when the app being used is not verified by Canvas", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The server you entered is not authorized for this app.": "Le serveur que vous avez saisi n’est pas autorisé pour cette application.", - "@The server you entered is not authorized for this app.": { - "description": "The error shown when the desired login domain is not verified by Canvas", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The user agent for this app is not authorized.": "L’agent utilisateur de cette application n’est pas autorisé.", - "@The user agent for this app is not authorized.": { - "description": "The error shown when the user agent during verification is not verified by Canvas", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "We were unable to verify the server for use with this app.": "Nous n’avons pas pu vérifier le serveur pour son utilisation avec cette application.", - "@We were unable to verify the server for use with this app.": { - "description": "The generic error shown when we are unable to verify with Canvas", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Reminders": "Rappels", - "@Reminders": { - "description": "Name of the system notification channel for assignment and event reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Notifications for reminders about assignments and calendar events": "Notifications pour les rappels sur les tâches et les événements du calendrier", - "@Notifications for reminders about assignments and calendar events": { - "description": "Description of the system notification channel for assignment and event reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Reminders have changed!": "Les rappels ont changé!", - "@Reminders have changed!": { - "description": "Title of the dialog shown when the user needs to update their reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "In order to provide you with a better experience, we have updated how reminders work. You can add new reminders by viewing an assignment or calendar event and tapping the switch under the \"Remind Me\" section.\n\nBe aware that any reminders created with older versions of this app will not be compatible with the new changes and you will need to create them again.": "Afin de vous offrir une meilleure expérience, nous avons mis à jour le fonctionnement des rappels. Vous pouvez ajouter de nouveaux rappels en visualisant une tâche ou un événement de calendrier et en appuyant sur le curseur dans la section « Me rappeler ».\n\nSachez que les rappels créés avec les anciennes versions de cette application ne seront pas compatibles avec les nouvelles modifications et que vous devrez les créer à nouveau.", - "@In order to provide you with a better experience, we have updated how reminders work. You can add new reminders by viewing an assignment or calendar event and tapping the switch under the \"Remind Me\" section.\n\nBe aware that any reminders created with older versions of this app will not be compatible with the new changes and you will need to create them again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Not a parent?": "Pas un parent?", - "@Not a parent?": { - "description": "Title for the screen that shows when the user is not observing any students", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "We couldn't find any students associated with this account": "Nous n’avons pas pu trouver d’étudiant associé à ce compte", - "@We couldn't find any students associated with this account": { - "description": "Subtitle for the screen that shows when the user is not observing any students", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Are you a student or teacher?": "Êtes-vous étudiant ou enseignant?", - "@Are you a student or teacher?": { - "description": "Label for button that will show users the option to view other Canvas apps in the Play Store", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "One of our other apps might be a better fit. Tap one to visit the Play Store.": "L’une de nos autres applis pourrait mieux convenir. Tapoter sur l’une d’entre elles pour vous rendre sur l’App Store.", - "@One of our other apps might be a better fit. Tap one to visit the Play Store.": { - "description": "Description of options to view other Canvas apps in the Play Store", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Return to Login": "Revenir à l’ouverture de session", - "@Return to Login": { - "description": "Label for the button that returns the user to the login screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "STUDENT": "ÉTUDIANT", - "@STUDENT": { - "description": "The \"student\" portion of the \"Canvas Student\" app name, in all caps. \"Canvas\" is excluded in this context as it will be displayed to the user as a wordmark image", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "TEACHER": "ENSEIGNANT", - "@TEACHER": { - "description": "The \"teacher\" portion of the \"Canvas Teacher\" app name, in all caps. \"Canvas\" is excluded in this context as it will be displayed to the user as a wordmark image", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Canvas Student": "Étudiant Canvas", - "@Canvas Student": { - "description": "The name of the Canvas Student app. Only \"Student\" should be translated as \"Canvas\" is a brand name in this context and should not be translated.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Canvas Teacher": "Enseignant Canvas", - "@Canvas Teacher": { - "description": "The name of the Canvas Teacher app. Only \"Teacher\" should be translated as \"Canvas\" is a brand name in this context and should not be translated.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Alerts": "Aucune alerte", - "@No Alerts": { - "description": "The title for the empty message to show to users when there are no alerts for the student.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There’s nothing to be notified of yet.": "Il n’y a encore rien à signaler.", - "@There’s nothing to be notified of yet.": { - "description": "The empty message to show to users when there are no alerts for the student.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "dismissAlertLabel": "Ignorer {alertTitle}", - "@dismissAlertLabel": { - "description": "Accessibility label to dismiss an alert", - "type": "text", - "placeholders_order": [ - "alertTitle" - ], - "placeholders": { - "alertTitle": {} - } - }, - "Course Announcement": "Annonce du cours", - "@Course Announcement": { - "description": "Title for alerts when there is a course announcement", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Institution Announcement": "Annonce de l’institution", - "@Institution Announcement": { - "description": "Title for alerts when there is an institution announcement", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "assignmentGradeAboveThreshold": "Note de la tâche supérieure à {threshold}", - "@assignmentGradeAboveThreshold": { - "description": "Title for alerts when an assignment grade is above the threshold value", - "type": "text", - "placeholders_order": [ - "threshold" - ], - "placeholders": { - "threshold": {} - } - }, - "assignmentGradeBelowThreshold": "Note de la tâche inférieure à {threshold}", - "@assignmentGradeBelowThreshold": { - "description": "Title for alerts when an assignment grade is below the threshold value", - "type": "text", - "placeholders_order": [ - "threshold" - ], - "placeholders": { - "threshold": {} - } - }, - "courseGradeAboveThreshold": "Note du cours supérieure à {threshold}", - "@courseGradeAboveThreshold": { - "description": "Title for alerts when a course grade is above the threshold value", - "type": "text", - "placeholders_order": [ - "threshold" - ], - "placeholders": { - "threshold": {} - } - }, - "courseGradeBelowThreshold": "Note du cours inférieure à {threshold}", - "@courseGradeBelowThreshold": { - "description": "Title for alerts when a course grade is below the threshold value", - "type": "text", - "placeholders_order": [ - "threshold" - ], - "placeholders": { - "threshold": {} - } - }, - "Settings": "Paramètres", - "@Settings": { - "description": "Title for the settings screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Theme": "Thème", - "@Theme": { - "description": "Label for the light/dark theme section in the settings page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Dark Mode": "Mode sombre", - "@Dark Mode": { - "description": "Label for the button that enables dark mode", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Light Mode": "Mode Jour", - "@Light Mode": { - "description": "Label for the button that enables light mode", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "High Contrast Mode": "Mode haut contraste", - "@High Contrast Mode": { - "description": "Label for the switch that toggles high contrast mode", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Use Dark Theme in Web Content": "Utiliser le thème sombre dans le contenu Web", - "@Use Dark Theme in Web Content": { - "description": "Label for the switch that toggles dark mode for webviews", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Appearance": "Apparence", - "@Appearance": { - "description": "Label for the appearance section in the settings page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Successfully submitted!": "Envoyé avec succès!", - "@Successfully submitted!": { - "description": "Title displayed in the grade cell for an assignment that has been submitted", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "submissionStatusSuccessSubtitle": "Cette tâche a été soumise le {date} à {time} et attend d’être notée", - "@submissionStatusSuccessSubtitle": { - "description": "Subtitle displayed in the grade cell for an assignment that has been submitted and is awaiting a grade", - "type": "text", - "placeholders_order": [ - "date", - "time" - ], - "placeholders": { - "date": {}, - "time": {} - } - }, - "outOfPoints": "{howMany,plural, =1{Sur 1 point}other{Sur {points} points}}", - "@outOfPoints": { - "description": "Description for an assignment grade that has points without a current scoroe", - "type": "text", - "placeholders_order": [ - "points", - "howMany" - ], - "placeholders": { - "points": {}, - "howMany": {} - } - }, - "Excused": "Exempté", - "@Excused": { - "description": "Grading status for an assignment marked as excused", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Complete": "Terminé", - "@Complete": { - "description": "Grading status for an assignment marked as complete", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Incomplete": "Incomplet", - "@Incomplete": { - "description": "Grading status for an assignment marked as incomplete", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "minus": "moins", - "@minus": { - "description": "Screen reader-friendly replacement for the \"-\" character in letter grades like \"A-\"", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "latePenalty": "Pénalité de retard (-{pointsLost})", - "@latePenalty": { - "description": "Text displayed when a late penalty has been applied to the assignment", - "type": "text", - "placeholders_order": [ - "pointsLost" - ], - "placeholders": { - "pointsLost": {} - } - }, - "finalGrade": "Note finale : {grade}", - "@finalGrade": { - "description": "Text that displays the final grade of an assignment", - "type": "text", - "placeholders_order": [ - "grade" - ], - "placeholders": { - "grade": {} - } - }, - "Alert Settings": "Réglages de l’alerte", - "@Alert Settings": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Alert me when…": "M’alerter lorsque…", - "@Alert me when…": { - "description": "Header for the screen where the observer chooses the thresholds that will determine when they receive alerts (e.g. when an assignment is graded below 70%)", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Course grade below": "Note du cours inférieure à", - "@Course grade below": { - "description": "Label describing the threshold for when the course grade is below a certain percentage", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Course grade above": "Note du cours supérieure à", - "@Course grade above": { - "description": "Label describing the threshold for when the course grade is above a certain percentage", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Assignment missing": "Tâche manquante", - "@Assignment missing": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Assignment grade below": "Note de la tâche inférieure à", - "@Assignment grade below": { - "description": "Label describing the threshold for when an assignment is graded below a certain percentage", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Assignment grade above": "Note de la tâche supérieure à", - "@Assignment grade above": { - "description": "Label describing the threshold for when an assignment is graded above a certain percentage", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Course Announcements": "Annonces de cours", - "@Course Announcements": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Institution Announcements": "Annonces de l’institution", - "@Institution Announcements": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Never": "Jamais", - "@Never": { - "description": "Indication that tells the user they will not receive alert notifications of a specific kind", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Grade percentage": "Pourcentage de notes", - "@Grade percentage": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading your student's alerts.": "Une erreur est survenue lors du chargement des alertes de votre étudiant.", - "@There was an error loading your student's alerts.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Must be below 100": "Moins de 100", - "@Must be below 100": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "mustBeBelowN": "Doit être inférieure à {percentage}", - "@mustBeBelowN": { - "description": "Validation error to the user that they must choose a percentage below 'n'", - "type": "text", - "placeholders_order": [ - "percentage" - ], - "placeholders": { - "percentage": { - "example": 5 - } - } - }, - "mustBeAboveN": "Doit être supérieure à {percentage}", - "@mustBeAboveN": { - "description": "Validation error to the user that they must choose a percentage above 'n'", - "type": "text", - "placeholders_order": [ - "percentage" - ], - "placeholders": { - "percentage": { - "example": 5 - } - } - }, - "Select Student Color": "Sélectionner la couleur de l’étudiant", - "@Select Student Color": { - "description": "Title for screen that allows users to assign a color to a specific student", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Electric, blue": "Bleu électrique", - "@Electric, blue": { - "description": "Name of the Electric (blue) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Plum, Purple": "Prune, violet", - "@Plum, Purple": { - "description": "Name of the Plum (purple) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Barney, Fuschia": "Fuschia Barney", - "@Barney, Fuschia": { - "description": "Name of the Barney (fuschia) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Raspberry, Red": "Framboise rouge", - "@Raspberry, Red": { - "description": "Name of the Raspberry (red) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Fire, Orange": "Orange feu", - "@Fire, Orange": { - "description": "Name of the Fire (orange) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Shamrock, Green": "Vert Shamrock", - "@Shamrock, Green": { - "description": "Name of the Shamrock (green) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "An error occurred while saving your selection. Please try again.": "Une erreur s’est produite lors de l’enregistrement de votre sélection. Veuillez réessayer.", - "@An error occurred while saving your selection. Please try again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "changeStudentColorLabel": "Changer la couleur pour {studentName}", - "@changeStudentColorLabel": { - "description": "Accessibility label for the button that lets users change the color associated with a specific student", - "type": "text", - "placeholders_order": [ - "studentName" - ], - "placeholders": { - "studentName": {} - } - }, - "Teacher": "Enseignant", - "@Teacher": { - "description": "Label for the Teacher enrollment type", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Student": "Étudiant", - "@Student": { - "description": "Label for the Student enrollment type", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "TA": "Instructeur-assistant", - "@TA": { - "description": "Label for the Teaching Assistant enrollment type (also known as Teacher Aid or Education Assistant), reduced to a short acronym/initialism if appropriate.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Observer": "Observateur", - "@Observer": { - "description": "Label for the Observer enrollment type", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Use Camera": "Utiliser la caméra", - "@Use Camera": { - "description": "Label for the action item that lets the user capture a photo using the device camera", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Upload File": "Téléverser le fichier", - "@Upload File": { - "description": "Label for the action item that lets the user upload a file from their device", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Choose from Gallery": "Choisir dans la galerie", - "@Choose from Gallery": { - "description": "Label for the action item that lets the user select a photo from their device gallery", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Preparing…": "En préparation…", - "@Preparing…": { - "description": "Message shown while a file is being prepared to attach to a message", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Add student with…": "Ajouter étudiant avec…", - "@Add student with…": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Add Student": "Ajouter un étudiant", - "@Add Student": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You are not observing any students.": "Vous n’observez aucun étudiant.", - "@You are not observing any students.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading your students.": "Une erreur est survenue lors du chargement de vos étudiants.", - "@There was an error loading your students.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Pairing Code": "Jumelage du code", - "@Pairing Code": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Students can obtain a pairing code through the Canvas website": "Les étudiants peuvent obtenir un code de jumelage sur le site Web de Canvas", - "@Students can obtain a pairing code through the Canvas website": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Enter the student pairing code provided to you. If the pairing code doesn't work, it may have expired": "Saisir le code d’appariement de l’étudiant qui vous a été fourni. Si le code d’appariement ne fonctionne pas, il peut avoir expiré", - "@Enter the student pairing code provided to you. If the pairing code doesn't work, it may have expired": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Your code is incorrect or expired.": "Votre code est incorrect ou expiré.", - "@Your code is incorrect or expired.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Something went wrong trying to create your account, please reach out to your school for assistance.": "Une erreur s’est produite lors de la création de votre compte, veuillez contacter votre école pour obtenir de l’aide.", - "@Something went wrong trying to create your account, please reach out to your school for assistance.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "QR Code": "Code QR", - "@QR Code": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Students can create a QR code using the Canvas Student app on their mobile device": "Les étudiants peuvent créer un code QR à l’aide de l’application Canvas Student sur leur appareil mobile", - "@Students can create a QR code using the Canvas Student app on their mobile device": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Add new student": "Ajouter un nouvel étudiant", - "@Add new student": { - "description": "Semantics label for the FAB on the Manage Students Screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Select": "Sélectionner", - "@Select": { - "description": "Hint text to tell the user to choose one of two options", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I have a Canvas account": "J’ai un compte Canvas", - "@I have a Canvas account": { - "description": "Option to select for users that have a canvas account", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I don't have a Canvas account": "Je n’ai pas de compte Canvas", - "@I don't have a Canvas account": { - "description": "Option to select for users that don't have a canvas account", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Create Account": "Créer un compte", - "@Create Account": { - "description": "Button text for account creation confirmation", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Full Name": "Nom complet", - "@Full Name": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Email Address": "Adresse de courriel", - "@Email Address": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Password": "Mot de passe", - "@Password": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Full Name…": "Nom complet...", - "@Full Name…": { - "description": "hint label for inside form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Email…": "Adresse courriel...", - "@Email…": { - "description": "hint label for inside form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Password…": "Mot de passe...", - "@Password…": { - "description": "hint label for inside form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Please enter full name": "Veuillez saisir votre nom complet", - "@Please enter full name": { - "description": "Error message for form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Please enter an email address": "Veuillez saisir une adresse courriel.", - "@Please enter an email address": { - "description": "Error message for form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Please enter a valid email address": "Veuillez saisir une adresse courriel valide", - "@Please enter a valid email address": { - "description": "Error message for form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Password is required": "Le mot de passe est requis", - "@Password is required": { - "description": "Error message for form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Password must contain at least 8 characters": "Le mot de passe doit contenir moins de 8 caractères", - "@Password must contain at least 8 characters": { - "description": "Error message for form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "qrCreateAccountTos": "En tapotant sur « Créer un compte », vous acceptez les {termsOfService} ainsi que {privacyPolicy}", - "@qrCreateAccountTos": { - "description": "The text show on the account creation screen", - "type": "text", - "placeholders_order": [ - "termsOfService", - "privacyPolicy" - ], - "placeholders": { - "termsOfService": {}, - "privacyPolicy": {} - } - }, - "Terms of Service": "Conditions d’utilisation", - "@Terms of Service": { - "description": "Label for the Canvas Terms of Service agreement. This will be used in the qrCreateAccountTos text and will be highlighted and clickable", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Privacy Policy": "Politique de confidentialité", - "@Privacy Policy": { - "description": "Label for the Canvas Privacy Policy agreement. This will be used in the qrCreateAccountTos text and will be highlighted and clickable", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "View the Privacy Policy": "Voir la politique de confidentialité", - "@View the Privacy Policy": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Already have an account? ": "Vous possédez déjà un compte? ", - "@Already have an account? ": { - "description": "Part of multiline text span, includes AccountSignIn1-2, in that order", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Sign In": "Se connecter", - "@Sign In": { - "description": "Part of multiline text span, includes AccountSignIn1-2, in that order", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Hide Password": "Cacher le mot de passe", - "@Hide Password": { - "description": "content description for password hide button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Show Password": "Afficher mot de passe", - "@Show Password": { - "description": "content description for password show button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Terms of Service Link": "Lien vers les conditions d’utilisation", - "@Terms of Service Link": { - "description": "content description for terms of service link", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Privacy Policy Link": "Lien vers la politique de confidentialité", - "@Privacy Policy Link": { - "description": "content description for privacy policy link", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Event": "Événement", - "@Event": { - "description": "Title for the event details screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Date": "Date", - "@Date": { - "description": "Label for the event date", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Location": "Emplacement", - "@Location": { - "description": "Label for the location information", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Location Specified": "Aucun lieu spécifié", - "@No Location Specified": { - "description": "Description for events that do not have a location", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "eventTime": "{startAt} — {endAt}", - "@eventTime": { - "description": "The time the event is happening, example: \"2:00 pm - 4:00 pm\"", - "type": "text", - "placeholders_order": [ - "startAt", - "endAt" - ], - "placeholders": { - "startAt": {}, - "endAt": {} - } - }, - "Set a date and time to be notified of this event.": "Définissez une date et une heure afin d’être averti de cet événement.", - "@Set a date and time to be notified of this event.": { - "description": "Description for row to set event reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You will be notified about this event on…": "Vous serez informé de cet événement le…", - "@You will be notified about this event on…": { - "description": "Description for when an event reminder is set", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Share Your Love for the App": "Partager votre engouement pour l’application", - "@Share Your Love for the App": { - "description": "Label for option to open the app store", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Tell us about your favorite parts of the app": "Dites-nous quelles fonctions de l’application vous plaisent le plus", - "@Tell us about your favorite parts of the app": { - "description": "Description for option to open the app store", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Legal": "Légal", - "@Legal": { - "description": "Label for legal information option", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Privacy policy, terms of use, open source": "Politique de confidentialité, conditions d’utilisation, source ouverte", - "@Privacy policy, terms of use, open source": { - "description": "Description for legal information option", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Idea for Canvas Parent App [Android]": "Idée pour l’application Canvas Parent [Android]", - "@Idea for Canvas Parent App [Android]": { - "description": "The subject for the email to request a feature", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The following information will help us better understand your idea:": "Les informations suivantes nous aideront à mieux comprendre votre idée :", - "@The following information will help us better understand your idea:": { - "description": "The header for the users information that is attached to a feature request", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Domain:": "Domaine :", - "@Domain:": { - "description": "The label for the Canvas domain of the logged in user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "User ID:": "Identifiant de l’utilisateur :", - "@User ID:": { - "description": "The label for the Canvas user ID of the logged in user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Email:": "Courriel :", - "@Email:": { - "description": "The label for the eamil of the logged in user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Locale:": "Paramètres régionaux :", - "@Locale:": { - "description": "The label for the locale of the logged in user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Terms of Use": "Conditions d’utilisation", - "@Terms of Use": { - "description": "Label for the terms of use", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Canvas on GitHub": "Canvas sur GitHub", - "@Canvas on GitHub": { - "description": "Label for the button that opens the Canvas project on GitHub's website", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was a problem loading the Terms of Use": "Un problème est survenu lors du chargement des conditions d’utilisation", - "@There was a problem loading the Terms of Use": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Device": "Dispositif", - "@Device": { - "description": "Label used for device manufacturer/model in the error report", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "OS Version": "Version du SE", - "@OS Version": { - "description": "Label used for device operating system version in the error report", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Version Number": "Numéro de version", - "@Version Number": { - "description": "Label used for the app version number in the error report", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Report A Problem": "Signaler un problème", - "@Report A Problem": { - "description": "Title used for generic dialog to report problems", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Subject": "Objet", - "@Subject": { - "description": "Label used for Subject text field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "A subject is required.": "Un objet est requis.", - "@A subject is required.": { - "description": "Error shown when the subject field is empty", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "An email address is required.": "Adresse de courriel nécessaire.", - "@An email address is required.": { - "description": "Error shown when the email field is empty", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Description": "Description", - "@Description": { - "description": "Label used for Description text field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "A description is required.": "Description obligatoire.", - "@A description is required.": { - "description": "Error shown when the description field is empty", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "How is this affecting you?": "Comment cela vous affecte-t-il?", - "@How is this affecting you?": { - "description": "Label used for the dropdown to select how severe the issue is", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "send": "envoyer", - "@send": { - "description": "Label used for send button when reporting a problem", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Just a casual question, comment, idea, suggestion…": "Juste une question informelle, commentaire, idée, suggestion…", - "@Just a casual question, comment, idea, suggestion…": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I need some help but it's not urgent.": "J’ai besoin d’aide, mais ce n’est pas urgent", - "@I need some help but it's not urgent.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Something's broken but I can work around it to get what I need done.": "Quelque chose ne fonctionne plus, mais je peux quand même réaliser ce que je dois faire.", - "@Something's broken but I can work around it to get what I need done.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I can't get things done until I hear back from you.": "Je ne peux plus rien faire jusqu’à ce que vous me contactiez.", - "@I can't get things done until I hear back from you.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "EXTREME CRITICAL EMERGENCY!!": "ÉTAT D’URGENCE EXTRÊMEMENT SÉRIEUX!!", - "@EXTREME CRITICAL EMERGENCY!!": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Not Graded": "Non noté", - "@Not Graded": { - "description": "Description for an assignment has not been graded.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Login flow: Normal": "Flux de connexion : Normal", - "@Login flow: Normal": { - "description": "Description for the normal login flow", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Login flow: Canvas": "Flux de connexion : Canvas", - "@Login flow: Canvas": { - "description": "Description for the Canvas login flow", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Login flow: Site Admin": "Flux de connexion : Administrateur du site", - "@Login flow: Site Admin": { - "description": "Description for the Site Admin login flow", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Login flow: Skip mobile verify": "Flux de connexion : Ignorer la vérification mobile", - "@Login flow: Skip mobile verify": { - "description": "Description for the login flow that skips domain verification for mobile", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Act As User": "Agir en tant qu’utilisateur", - "@Act As User": { - "description": "Label for the button that allows the user to act (masquerade) as another user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Stop Acting as User": "Arrêter d’agir en tant qu’utilisateur", - "@Stop Acting as User": { - "description": "Label for the button that allows the user to stop acting (masquerading) as another user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "actingAsUser": "Vous agissez en tant que {userName}", - "@actingAsUser": { - "description": "Message shown while acting (masquerading) as another user", - "type": "text", - "placeholders_order": [ - "userName" - ], - "placeholders": { - "userName": {} - } - }, - "\"Act as\" is essentially logging in as this user without a password. You will be able to take any action as if you were this user, and from other users' points of views, it will be as if this user performed them. However, audit logs record that you were the one who performed the actions on behalf of this user.": "« Agir en tant que » (Act as) est essentiellement d’ouvrir une session en tant que cet utilisateur sans mot de passe. Vous serez en mesure de prendre toute action comme si vous étiez cet utilisateur, et selon les points de vue des autres utilisateurs, ce sera comme si cet utilisateur aurait effectué ces actions. Toutefois, le journal d’événements a identifié que vous étiez celui qui a effectué les actions au nom de cet étudiant.", - "@\"Act as\" is essentially logging in as this user without a password. You will be able to take any action as if you were this user, and from other users' points of views, it will be as if this user performed them. However, audit logs record that you were the one who performed the actions on behalf of this user.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Domain": "Domaine", - "@Domain": { - "description": "Text field hint for domain url input", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You must enter a valid domain": "Vous devez saisir un nom de domaine valide", - "@You must enter a valid domain": { - "description": "Message displayed for domain input error", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "User ID": "ID utilisateur", - "@User ID": { - "description": "Text field hint for user ID input", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You must enter a user id": "Vous devez saisir un ID d’utilisateur", - "@You must enter a user id": { - "description": "Message displayed for user Id input error", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error trying to act as this user. Please check the Domain and User ID and try again.": "Une erreur s’est produite lors de la tentative d’agir en tant que cet utilisateur. Veuillez vérifier le domaine et l’ID utilisateur et réessayer.", - "@There was an error trying to act as this user. Please check the Domain and User ID and try again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "endMasqueradeMessage": "Vous allez cesser d’agir comme {userName} et retournerez à votre compte original.", - "@endMasqueradeMessage": { - "description": "Confirmation message displayed when the user wants to stop acting (masquerading) as another user", - "type": "text", - "placeholders_order": [ - "userName" - ], - "placeholders": { - "userName": {} - } - }, - "endMasqueradeLogoutMessage": "Vous allez cesser d’agir comme {userName} et serez déconnecté.", - "@endMasqueradeLogoutMessage": { - "description": "Confirmation message displayed when the user wants to stop acting (masquerading) as another user and will be logged out.", - "type": "text", - "placeholders_order": [ - "userName" - ], - "placeholders": { - "userName": {} - } - }, - "How are we doing?": "Comment nous débrouillons-nous?", - "@How are we doing?": { - "description": "Title for dialog asking user to rate the app out of 5 stars.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Don't show again": "Ne plus afficher à nouveau", - "@Don't show again": { - "description": "Button to prevent the rating dialog from showing again.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "What can we do better?": "Que pourrions-nous faire plus efficacement?", - "@What can we do better?": { - "description": "Hint text for providing a comment with the rating.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Send Feedback": "Envoyer une rétroaction", - "@Send Feedback": { - "description": "Button to send rating with feedback", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "ratingDialogEmailSubject": "Suggestions pour Android - Canvas Parent {version}", - "@ratingDialogEmailSubject": { - "description": "The subject for an email to provide feedback for CanvasParent.", - "type": "text", - "placeholders_order": [ - "version" - ], - "placeholders": { - "version": {} - } - }, - "starRating": "{position,plural, =1{{position} étoile}other{{position} étoiles}}", - "@starRating": { - "description": "Accessibility label for the 1 stars to 5 stars rating", - "type": "text", - "placeholders_order": [ - "position" - ], - "placeholders": { - "position": { - "example": 1 - } - } - }, - "Student Pairing": "Jumelage de l’étudiant", - "@Student Pairing": { - "description": "Title for the screen where users can pair to students using a QR code", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Open Canvas Student": "Ouvrir Canvas Student", - "@Open Canvas Student": { - "description": "Title for QR pairing tutorial screen instructing users to open the Canvas Student app", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You'll need to open your student's Canvas Student app to continue. Go into Main Menu > Settings > Pair with Observer and scan the QR code you see there.": "Vous devez ouvrir l’application Canvas Student de votre étudiant pour continuer. Allez dans Menu principal > Paramètres > Jumeler avec l’observateur et scannez le code QR que vous y voyez.", - "@You'll need to open your student's Canvas Student app to continue. Go into Main Menu > Settings > Pair with Observer and scan the QR code you see there.": { - "description": "Message explaining how QR code pairing works", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Screenshot showing location of pairing QR code generation in the Canvas Student app": "Capture d’écran montrant l’emplacement du jumelage de la génération de code QR dans l’application Canvas Student", - "@Screenshot showing location of pairing QR code generation in the Canvas Student app": { - "description": "Content Description for qr pairing tutorial screenshot", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Expired QR Code": "Code QR expiré", - "@Expired QR Code": { - "description": "Error title shown when the users scans a QR code that has expired", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The QR code you scanned may have expired. Refresh the code on the student's device and try again.": "Le code QR que vous avez scanné peut avoir expiré. Actualisez le code sur l’appareil de l’étudiant et essayez de nouveau.", - "@The QR code you scanned may have expired. Refresh the code on the student's device and try again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "A network error occurred when adding this student. Check your connection and try again.": "Une erreur réseau s’est produite lors de l’ajout de cet étudiant. Vérifiez votre connexion puis réessayez.", - "@A network error occurred when adding this student. Check your connection and try again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Invalid QR Code": "Code QR non valide", - "@Invalid QR Code": { - "description": "Error title shown when the user scans an invalid QR code", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Incorrect Domain": "Domaine incorrect", - "@Incorrect Domain": { - "description": "Error title shown when the users scane a QR code for a student that belongs to a different domain", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The student you are trying to add belongs to a different school. Log in or create an account with that school to scan this code.": "L’étudiant que vous tentez d’ajouter appartient à une autre école. Connectez-vous ou créez un compte auprès de cette école pour scanner ce code.", - "@The student you are trying to add belongs to a different school. Log in or create an account with that school to scan this code.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Camera Permission": "Autorisation de caméra", - "@Camera Permission": { - "description": "Error title shown when the user wans to scan a QR code but has denied the camera permission", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "This will unpair and remove all enrollments for this student from your account.": "Cela éliminera le jumelage et supprimera toutes les inscriptions de cet étudiant de votre compte.", - "@This will unpair and remove all enrollments for this student from your account.": { - "description": "Confirmation message shown when the user tries to delete a student from their account", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was a problem removing this student from your account. Please check your connection and try again.": "Un problème est survenu lors du retrait de cet étudiant de votre compte. Veuillez vérifier votre connexion et réessayer.", - "@There was a problem removing this student from your account. Please check your connection and try again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Cancel": "Annuler", - "@Cancel": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "next": "Suivant", - "@next": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "ok": "OK", - "@ok": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Yes": "Oui", - "@Yes": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No": "Non", - "@No": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Retry": "Réessayer", - "@Retry": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Delete": "Supprimer", - "@Delete": { - "description": "Label used for general delete/remove actions", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Done": "Terminé", - "@Done": { - "description": "Label for general done/finished actions", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Refresh": "Actualiser", - "@Refresh": { - "description": "Label for button to refresh data from the web", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "View Description": "Voir la description", - "@View Description": { - "description": "Button to view the description for an event or assignment", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "expanded": "développé", - "@expanded": { - "description": "Description for the accessibility reader for list groups that are expanded", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "collapsed": "réduit", - "@collapsed": { - "description": "Description for the accessibility reader for list groups that are expanded", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "An unexpected error occurred": "Une erreur inattendue s’est produite", - "@An unexpected error occurred": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No description": "Aucune description", - "@No description": { - "description": "Message used when the assignment has no description", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Launch External Tool": "Lancer l’outil externe", - "@Launch External Tool": { - "description": "Button text added to webviews to let users open external tools in their browser", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Interactions on this page are limited by your institution.": "Les interactions sur cette page sont limitées par votre institution.", - "@Interactions on this page are limited by your institution.": { - "description": "Message describing how the webview has limited access due to an instution setting", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "dateAtTime": "{date} à {time}", - "@dateAtTime": { - "description": "The string to format dates", - "type": "text", - "placeholders_order": [ - "date", - "time" - ], - "placeholders": { - "date": {}, - "time": {} - } - }, - "dueDateAtTime": "Dû le {date} à {time}", - "@dueDateAtTime": { - "description": "The string to format due dates", - "type": "text", - "placeholders_order": [ - "date", - "time" - ], - "placeholders": { - "date": {}, - "time": {} - } - }, - "No Due Date": "Aucune date d’échéance", - "@No Due Date": { - "description": "Label for assignments that do not have a due date", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Filter": "Filtre", - "@Filter": { - "description": "Label for buttons to filter what items are visible", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "unread": "non lu", - "@unread": { - "description": "Label for things that are marked as unread", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "unreadCount": "{count} non lu", - "@unreadCount": { - "description": "Formatted string for when there are a number of unread items", - "type": "text", - "placeholders_order": [ - "count" - ], - "placeholders": { - "count": {} - } - }, - "badgeNumberPlus": "{count}+", - "@badgeNumberPlus": { - "description": "Formatted string for when too many items are being notified in a badge, generally something like: 99+", - "type": "text", - "placeholders_order": [ - "count" - ], - "placeholders": { - "count": {} - } - }, - "There was an error loading this announcement": "Une erreur est survenue lors du chargement de cette annonce", - "@There was an error loading this announcement": { - "description": "Message shown when an announcement detail screen fails to load", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Network error": "Erreur de réseau", - "@Network error": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Under Construction": "En construction", - "@Under Construction": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "We are currently building this feature for your viewing pleasure.": "Nous construisons actuellement cette fonctionnalité pour votre plaisir de visionnement.", - "@We are currently building this feature for your viewing pleasure.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Request Login Help Button": "Demander de l’aide pour le bouton de connexion", - "@Request Login Help Button": { - "description": "Accessibility hint for button that opens help dialog for a login help request", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Request Login Help": "Demander de l’aide pour se connecter", - "@Request Login Help": { - "description": "Title of help dialog for a login help request", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I'm having trouble logging in": "J’ai des problèmes à me connecter", - "@I'm having trouble logging in": { - "description": "Subject of help dialog for a login help request", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "An error occurred when trying to display this link": "Une erreur s’est produite au moment de l’affichage de ce lien", - "@An error occurred when trying to display this link": { - "description": "Error message shown when a link can't be opened", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "We are unable to display this link, it may belong to an institution you currently aren't logged in to.": "Nous sommes dans l’impossibilité d’afficher ce lien, il peut appartenir à une institution à laquelle vous n’êtes pas actuellement connecté.", - "@We are unable to display this link, it may belong to an institution you currently aren't logged in to.": { - "description": "Description for error page shown when clicking a link", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Link Error": "Erreur de lien", - "@Link Error": { - "description": "Title for error page shown when clicking a link", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Open In Browser": "Ouvrir dans le navigateur", - "@Open In Browser": { - "description": "Text for button to open a link in the browswer", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You'll find the QR code on the web in your account profile. Click 'QR for Mobile Login' in the list.": "Vous trouverez le code QR sur le Web dans votre profil de compte. Cliquez sur « 'QR for Mobile Login » (QR pour connexion mobile) dans la liste.", - "@You'll find the QR code on the web in your account profile. Click 'QR for Mobile Login' in the list.": { - "description": "Text for qr login tutorial screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Locate QR Code": "Trouvez le code QR", - "@Locate QR Code": { - "description": "Text for qr login button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Please scan a QR code generated by Canvas": "Veuillez scanner un code QR généré par Canvas", - "@Please scan a QR code generated by Canvas": { - "description": "Text for qr login error with incorrect qr code", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error logging in. Please generate another QR Code and try again.": "Une erreur est survenue lors de la connexion. Veuillez générer un autre code QR et réessayer.", - "@There was an error logging in. Please generate another QR Code and try again.": { - "description": "Text for qr login error", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Screenshot showing location of QR code generation in browser": "Capture d’écran montrant l’emplacement de la génération de code QR dans le navigateur", - "@Screenshot showing location of QR code generation in browser": { - "description": "Content Description for qr login tutorial screenshot", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "QR scanning requires camera access": "La numérisation par balayage du code QR nécessite un accès à la caméra", - "@QR scanning requires camera access": { - "description": "placeholder for camera error for QR code scan", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The linked item is no longer available": "L’élément lié n’est plus disponible", - "@The linked item is no longer available": { - "description": "error message when the alert could no be opened", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Message sent": "Message envoyé.", - "@Message sent": { - "description": "confirmation message on the screen when the user succesfully sends a message", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Acceptable Use Policy": "Politique d’utilisation acceptable", - "@Acceptable Use Policy": { - "description": "title for the acceptable use policy screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Submit": "Envoyer", - "@Submit": { - "description": "submit button title for acceptable use policy screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Either you're a new user or the Acceptable Use Policy has changed since you last agreed to it. Please agree to the Acceptable Use Policy before you continue.": "Soit vous êtes un nouvel utilisateur, soit la politique d’utilisation acceptable a changé depuis que vous l’avez acceptée pour la dernière fois. Veuillez accepter la Politique d’utilisation acceptable avant de continuer.", - "@Either you're a new user or the Acceptable Use Policy has changed since you last agreed to it. Please agree to the Acceptable Use Policy before you continue.": { - "description": "acceptable use policy screen description", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I agree to the Acceptable Use Policy.": "J’accepte la Politique d’utilisation acceptable.", - "@I agree to the Acceptable Use Policy.": { - "description": "acceptable use policy switch title", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "About": "À propos", - "@About": { - "description": "Title for about menu item in settings", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "App": "Appl.", - "@App": { - "description": "Title for App field on about page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Login ID": "Identifiant de connexion", - "@Login ID": { - "description": "Title for Login ID field on about page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Email": "Adresse électronique", - "@Email": { - "description": "Title for Email field on about page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Version": "Version", - "@Version": { - "description": "Title for Version field on about page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Instructure logo": "Logo d’Instructure", - "@Instructure logo": { - "description": "Semantics label for the Instructure logo on the about page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - } -} \ No newline at end of file diff --git a/apps/flutter_parent/lib/l10n/res/intl_ga.arb b/apps/flutter_parent/lib/l10n/res/intl_ga.arb deleted file mode 100644 index bea1391b7a..0000000000 --- a/apps/flutter_parent/lib/l10n/res/intl_ga.arb +++ /dev/null @@ -1,2753 +0,0 @@ -{ - "@@last_modified": "2023-08-25T11:04:20.901151", - "alertsLabel": "Foláirimh", - "@alertsLabel": { - "description": "The label for the Alerts tab", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "calendarLabel": "Féilire", - "@calendarLabel": { - "description": "The label for the Calendar tab", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "coursesLabel": "Cúrsaí", - "@coursesLabel": { - "description": "The label for the Courses tab", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Students": "Níl Mic Léinn ann", - "@No Students": { - "description": "Text for when an observer has no students they are observing", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Tap to show student selector": "Tapáil chun roghnóir an mhic léinn a thaispeáint", - "@Tap to show student selector": { - "description": "Semantics label for the area that will show the student selector when tapped", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Tap to pair with a new student": "Tapáil chun péireáil le mac léinn nua", - "@Tap to pair with a new student": { - "description": "Semantics label for the add student button in the student selector", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Tap to select this student": "Tapáil chun an mac léinn seo a roghnú", - "@Tap to select this student": { - "description": "Semantics label on individual students in the student switcher", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Manage Students": "Bainistigh Mic Léinn", - "@Manage Students": { - "description": "Label text for the Manage Students nav drawer button as well as the title for the Manage Students screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Help": "Cabhair", - "@Help": { - "description": "Label text for the help nav drawer button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Log Out": "Logáil Amach", - "@Log Out": { - "description": "Label text for the Log Out nav drawer button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Switch Users": "Malartaigh Úsáideoirí", - "@Switch Users": { - "description": "Label text for the Switch Users nav drawer button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "appVersion": "v. {version}", - "@appVersion": { - "description": "App version shown in the navigation drawer", - "type": "text", - "placeholders_order": [ - "version" - ], - "placeholders": { - "version": {} - } - }, - "Are you sure you want to log out?": "An bhfuil tú cinnte gur mhaith leat logáil amach?", - "@Are you sure you want to log out?": { - "description": "Confirmation message displayed when the user tries to log out", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Calendars": "Féilirí", - "@Calendars": { - "description": "Label for button that lets users select which calendars to display", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "nextMonth": "An mhí seo chugainn: {month}", - "@nextMonth": { - "description": "Label for the button that switches the calendar to the next month", - "type": "text", - "placeholders_order": [ - "month" - ], - "placeholders": { - "month": {} - } - }, - "previousMonth": "An mhí roimhe sin: {month}", - "@previousMonth": { - "description": "Label for the button that switches the calendar to the previous month", - "type": "text", - "placeholders_order": [ - "month" - ], - "placeholders": { - "month": {} - } - }, - "nextWeek": "An tseachtain seo chugainn ag tosnú {date}", - "@nextWeek": { - "description": "Label for the button that switches the calendar to the next week", - "type": "text", - "placeholders_order": [ - "date" - ], - "placeholders": { - "date": {} - } - }, - "previousWeek": "An tseachtain roimhe ag tosnú {date}", - "@previousWeek": { - "description": "Label for the button that switches the calendar to the previous week", - "type": "text", - "placeholders_order": [ - "date" - ], - "placeholders": { - "date": {} - } - }, - "selectedMonthLabel": "Mí {month}", - "@selectedMonthLabel": { - "description": "Accessibility label for the button that expands/collapses the month view", - "type": "text", - "placeholders_order": [ - "month" - ], - "placeholders": { - "month": {} - } - }, - "expand": "leathnaigh", - "@expand": { - "description": "Accessibility label for the on-tap hint for the button that expands/collapses the month view", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "collapse": "leacaigh", - "@collapse": { - "description": "Accessibility label for the on-tap hint for the button that expands/collapses the month view", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "pointsPossible": "{points} pointe féideartha", - "@pointsPossible": { - "description": "Screen reader label used for the points possible for an assignment, quiz, etc.", - "type": "text", - "placeholders_order": [ - "points" - ], - "placeholders": { - "points": {} - } - }, - "calendarDaySemanticsLabel": "{eventCount,plural, =1{{date}, {eventCount} imeacht}other{{date}, {eventCount} imeacht}}", - "@calendarDaySemanticsLabel": { - "description": "Screen reader label used for calendar day, reads the date and count of events", - "type": "text", - "placeholders_order": [ - "date", - "eventCount" - ], - "placeholders": { - "date": {}, - "eventCount": {} - } - }, - "No Events Today!": "Gan Imeacht inniu!", - "@No Events Today!": { - "description": "Title displayed when there are no calendar events for the current day", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "It looks like a great day to rest, relax, and recharge.": "Breathnaíonn sé cosúil le lá iontach chun sos a ghlacadh, scíth a ligean, agus d'anáil a tharraingt.", - "@It looks like a great day to rest, relax, and recharge.": { - "description": "Message displayed when there are no calendar events for the current day", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading your student's calendar": "Tharla earráid agus féilire do mhic léinn á lódáil", - "@There was an error loading your student's calendar": { - "description": "Message displayed when calendar events could not be loaded for the current student", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Tap to favorite the courses you want to see on the Calendar. Select up to 10.": "Tapáil chun na cúrsaí is fearr leat a fheiceáil ar an bhFéilire. Roghnaigh suas le 10 gcinn.", - "@Tap to favorite the courses you want to see on the Calendar. Select up to 10.": { - "description": "Description text on calendar filter screen.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You may only choose 10 calendars to display": "Ní féidir leat ach 10 bhféilire a roghnú lena thaispeáint", - "@You may only choose 10 calendars to display": { - "description": "Error text when trying to select more than 10 calendars", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You must select at least one calendar to display": "Ní mór duit féilire amháin ar a laghad a roghnú lena thaispeáint", - "@You must select at least one calendar to display": { - "description": "Error text when trying to de-select all calendars", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Planner Note": "Nóta Pleanálaí", - "@Planner Note": { - "description": "Label used for notes in the planner", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Go to today": "Téigh go dtí inniu", - "@Go to today": { - "description": "Accessibility label used for the today button in the planner", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Previous Logins": "Logáil Isteach Roimhe Seo", - "@Previous Logins": { - "description": "Label for the list of previous user logins", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "canvasLogoLabel": "Lógó Canvas", - "@canvasLogoLabel": { - "description": "The semantics label for the Canvas logo", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "findSchool": "Aimsigh Scoil", - "@findSchool": { - "description": "Text for the find-my-school button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "findAnotherSchool": "Aimsigh scoil eile", - "@findAnotherSchool": { - "description": "Text for the find-another-school button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "domainSearchInputHint": "Cuir isteach ainm scoile nó ceantar…", - "@domainSearchInputHint": { - "description": "Input hint for the text box on the domain search screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "noDomainResults": "Ní féidir scoileanna a mheaitseálann \"{query}\" a aimsiú", - "@noDomainResults": { - "description": "Message shown to users when the domain search query did not return any results", - "type": "text", - "placeholders_order": [ - "query" - ], - "placeholders": { - "query": {} - } - }, - "domainSearchHelpLabel": "Conas a aimsím mo scoil nó mo cheantar?", - "@domainSearchHelpLabel": { - "description": "Label for the help button on the domain search screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "canvasGuides": "Treoracha Canvas", - "@canvasGuides": { - "description": "Proper name for the Canvas Guides. This will be used in the domainSearchHelpBody text and will be highlighted and clickable", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "canvasSupport": "Tacaíocht Canvas", - "@canvasSupport": { - "description": "Proper name for Canvas Support. This will be used in the domainSearchHelpBody text and will be highlighted and clickable", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "domainSearchHelpBody": "Déan iarracht ainm na scoile nó an cheantair a bhfuil tú ag iarraidh rochtain a fháil air a chuardach, ar nós “Smith Private School” nó “Smith County Schools”. Is féidir leat fearann Canvas a chur isteach go díreach freisin, amhail “smith.instructure.com.” \n\nChun tuilleadh faisnéise a fháil maidir le cuntas Canvas d’institiúide a aimsiú, is féidir leat cuairt a thabhairt ar an {canvasGuides}, déan teagmháil le {canvasSupport}, nó déan teagmháil le do scoil chun cúnamh a fháil.", - "@domainSearchHelpBody": { - "description": "The body text shown in the help dialog on the domain search screen", - "type": "text", - "placeholders_order": [ - "canvasGuides", - "canvasSupport" - ], - "placeholders": { - "canvasGuides": {}, - "canvasSupport": {} - } - }, - "Uh oh!": "Uh ó!", - "@Uh oh!": { - "description": "Title of the screen that shows when a crash has occurred", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "We’re not sure what happened, but it wasn’t good. Contact us if this keeps happening.": "Níl muid cinnte cad a tharla, ach ní raibh sé go maith. Déan teagmháil linn má leanann sé seo ag tarlú.", - "@We’re not sure what happened, but it wasn’t good. Contact us if this keeps happening.": { - "description": "Message shown when a crash has occurred", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Contact Support": "Tacaíocht Teagmhála", - "@Contact Support": { - "description": "Label for the button that allows users to contact support after a crash has occurred", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "View error details": "Féach ar shonraí earráide", - "@View error details": { - "description": "Label for the button that allowed users to view crash details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Restart app": "Atosaigh an aip", - "@Restart app": { - "description": "Label for the button that will restart the entire application", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Application version": "Leagan feidhmchláir", - "@Application version": { - "description": "Label for the application version displayed in the crash details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Device model": "Múnla gléas", - "@Device model": { - "description": "Label for the device model displayed in the crash details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Android OS version": "Android leagan OS", - "@Android OS version": { - "description": "Label for the Android operating system version displayed in the crash details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Full error message": "Teachtaireacht earráide iomlán", - "@Full error message": { - "description": "Label for the full error message displayed in the crash details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Inbox": "Bosca Isteach", - "@Inbox": { - "description": "Title for the Inbox screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading your inbox messages.": "Tharla earráid agus do theachtaireachtaí sa bhosca isteach á lódáil.", - "@There was an error loading your inbox messages.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Subject": "Níl aon Ábhar", - "@No Subject": { - "description": "Title used for inbox messages that have no subject", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unable to fetch courses. Please check your connection and try again.": "Ní féidir cúrsaí a fháil. Seiceáil do cheangal agus bain triail eile as.", - "@Unable to fetch courses. Please check your connection and try again.": { - "description": "Message shown when an error occured while loading courses", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Choose a course to message": "Roghnaigh cúrsa chun teachtaireacht a dhéanamh", - "@Choose a course to message": { - "description": "Header in the course list shown when the user is choosing which course to associate with a new message", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Inbox Zero": "Bosca Isteach Nialais", - "@Inbox Zero": { - "description": "Title of the message shown when there are no inbox messages", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You’re all caught up!": "Tá tú suas chun dáta ar fad!", - "@You’re all caught up!": { - "description": "Subtitle of the message shown when there are no inbox messages", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading recipients for this course": "Tharla earráid agus faighteoirí á lódáil don chúrsa seo", - "@There was an error loading recipients for this course": { - "description": "Message shown when attempting to create a new message but the recipients list failed to load", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unable to send message. Check your connection and try again.": "Ní féidir teachtaireacht a sheoladh. Seiceáil do cheangal agus bain triail eile as.", - "@Unable to send message. Check your connection and try again.": { - "description": "Message show when there was an error creating or sending a new message", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unsaved changes": "Athruithe nach bhfuil sábháilte", - "@Unsaved changes": { - "description": "Title of the dialog shown when the user tries to leave with unsaved changes", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Are you sure you wish to close this page? Your unsent message will be lost.": "An bhfuil tú cinnte gur mian leat an leathanach seo a dhúnadh? Caillfear do theachtaireacht nár seoladh.", - "@Are you sure you wish to close this page? Your unsent message will be lost.": { - "description": "Body text of the dialog shown when the user tries leave with unsaved changes", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "New message": "Teachtaireacht nua", - "@New message": { - "description": "Title of the new-message screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Add attachment": "Cuir ceangaltán leis", - "@Add attachment": { - "description": "Tooltip for the add-attachment button in the new-message screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Send message": "Seol teachtaireacht", - "@Send message": { - "description": "Tooltip for the send-message button in the new-message screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Select recipients": "Roghnaigh faighteoirí", - "@Select recipients": { - "description": "Tooltip for the button that allows users to select message recipients", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No recipients selected": "Níor roghnaíodh aon fhaighteoir", - "@No recipients selected": { - "description": "Hint displayed when the user has not selected any message recipients", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Message subject": "Ábhar na teachtaireachta", - "@Message subject": { - "description": "Hint text displayed in the input field for the message subject", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Message": "Teachtaireacht", - "@Message": { - "description": "Hint text displayed in the input field for the message body", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Recipients": "Faighteoirí", - "@Recipients": { - "description": "Label for message recipients", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "plusRecipientCount": "+{count}", - "@plusRecipientCount": { - "description": "Shows the number of recipients that are selected but not displayed on screen.", - "type": "text", - "placeholders_order": [ - "count" - ], - "placeholders": { - "count": { - "example": 5 - } - } - }, - "Failed. Tap for options.": "Theip air. Tapáil le haghaidh roghanna.", - "@Failed. Tap for options.": { - "description": "Short message shown on a message attachment when uploading has failed", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "courseForWhom": "le haghaidh {studentShortName}", - "@courseForWhom": { - "description": "Describes for whom a course is for (i.e. for Bill)", - "type": "text", - "placeholders_order": [ - "studentShortName" - ], - "placeholders": { - "studentShortName": {} - } - }, - "messageLinkPostscript": "Maidir le: {studentName}, {linkUrl}", - "@messageLinkPostscript": { - "description": "A postscript appended to new messages that clarifies which student is the subject of the message and also includes a URL for the related Canvas component (course, assignment, event, etc).", - "type": "text", - "placeholders_order": [ - "studentName", - "linkUrl" - ], - "placeholders": { - "studentName": {}, - "linkUrl": {} - } - }, - "There was an error loading this conversation": "Tharla earráid agus an comhrá seo á lódáil", - "@There was an error loading this conversation": { - "description": "Message shown when a conversation fails to load", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Reply": "Freagair", - "@Reply": { - "description": "Button label for replying to a conversation", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Reply All": "Freagair Do Chách", - "@Reply All": { - "description": "Button label for replying to all conversation participants", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unknown User": "Úsáideoir Anaithnid", - "@Unknown User": { - "description": "Label used where the user name is not known", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "me": "mé", - "@me": { - "description": "First-person pronoun (i.e. 'me') that will be used in message author info, e.g. 'Me to 4 others' or 'Jon Snow to me'", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "authorToRecipient": "{authorName} go {recipientName}", - "@authorToRecipient": { - "description": "Author info for a single-recipient message; includes both the author name and the recipient name.", - "type": "text", - "placeholders_order": [ - "authorName", - "recipientName" - ], - "placeholders": { - "authorName": {}, - "recipientName": {} - } - }, - "authorToNOthers": "{howMany,plural, =1{{authorName} go 1 eile}other{{authorName} go {howMany} daoine eile}}", - "@authorToNOthers": { - "description": "Author info for a mutli-recipient message; includes the author name and the number of recipients", - "type": "text", - "placeholders_order": [ - "authorName", - "howMany" - ], - "placeholders": { - "authorName": {}, - "howMany": {} - } - }, - "authorToRecipientAndNOthers": "{howMany,plural, =1{{authorName} go {recipientName} & 1 eile}other{{authorName} go {recipientName} & {howMany} daoine eile}}", - "@authorToRecipientAndNOthers": { - "description": "Author info for a multi-recipient message; includes the author name, one recipient name, and the number of other recipients", - "type": "text", - "placeholders_order": [ - "authorName", - "recipientName", - "howMany" - ], - "placeholders": { - "authorName": {}, - "recipientName": {}, - "howMany": {} - } - }, - "Download": "Íoslódáil", - "@Download": { - "description": "Label for the button that will begin downloading a file", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Open with another app": "Oscail le aip eile", - "@Open with another app": { - "description": "Label for the button that will allow users to open a file with another app", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There are no installed applications that can open this file": "Níl aon fheidhmchláir suiteáilte ar féidir an comhad seo a oscailt", - "@There are no installed applications that can open this file": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unsupported File": "Comhad nach dtacaítear leis", - "@Unsupported File": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "This file is unsupported and can’t be viewed through the app": "Ní thacaítear leis an gcomhad seo agus ní féidir é a fheiceáil tríd an aip", - "@This file is unsupported and can’t be viewed through the app": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unable to play this media file": "Ní féidir an comhad meáin seo a sheinm", - "@Unable to play this media file": { - "description": "Message shown when audio or video media could not be played", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unable to load this image": "Ní féidir an íomhá seo a lódáil", - "@Unable to load this image": { - "description": "Message shown when an image file could not be loaded or displayed", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading this file": "Tharla earráid agus an comhad seo á lódáil", - "@There was an error loading this file": { - "description": "Message shown when a file could not be loaded or displayed", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Courses": "Níl aon Chúrsaí", - "@No Courses": { - "description": "Title for having no courses", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Your student’s courses might not be published yet.": "Seans nach bhfuil cúrsaí do mhic léinn foilsithe fós.", - "@Your student’s courses might not be published yet.": { - "description": "Message for having no courses", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading your student’s courses.": "Tharla earráid agus cúrsaí do mhic léinn á lódáil.", - "@There was an error loading your student’s courses.": { - "description": "Message displayed when the list of student courses could not be loaded", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Grade": "Níl Marc Ann", - "@No Grade": { - "description": "Message shown when there is currently no grade available for a course", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Filter by": "Scag de réir", - "@Filter by": { - "description": "Title for list of terms to filter grades by", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Grades": "Marcanna", - "@Grades": { - "description": "Label for the \"Grades\" tab in course details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Syllabus": "Siollabas", - "@Syllabus": { - "description": "Label for the \"Syllabus\" tab in course details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Front Page": "Leathanach Tosaigh", - "@Front Page": { - "description": "Label for the \"Front Page\" tab in course details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Summary": "Achoimre", - "@Summary": { - "description": "Label for the \"Summary\" tab in course details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Send a message about this course": "Seol teachtaireacht faoin gcúrsa seo", - "@Send a message about this course": { - "description": "Accessibility hint for the course messaage floating action button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Total Grade": "Marc Iomlán", - "@Total Grade": { - "description": "Label for the total grade in the course", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Graded": "Marcáilte", - "@Graded": { - "description": "Label for assignments that have been graded", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Submitted": "Curtha isteach", - "@Submitted": { - "description": "Label for assignments that have been submitted", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Not Submitted": "Níl sé Curtha isteach", - "@Not Submitted": { - "description": "Label for assignments that have not been submitted", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Late": "Mall", - "@Late": { - "description": "Label for assignments that have been marked late or submitted late", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Missing": "Ar Iarraidh", - "@Missing": { - "description": "Label for assignments that have been marked missing or are not submitted and past the due date", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "-": "-", - "@-": { - "description": "Value representing no score for student submission", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "All Grading Periods": "Gach Tréimhse Mharcála", - "@All Grading Periods": { - "description": "Label for selecting all grading periods", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Assignments": "Níl aon Tascanna ann", - "@No Assignments": { - "description": "Title for the no assignments message", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "It looks like assignments haven't been created in this space yet.": "Tá an chuma ar an scéal nár cruthaíodh tascanna sa spás seo go fóill.", - "@It looks like assignments haven't been created in this space yet.": { - "description": "Message for no assignments", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading the summary details for this course.": "Tharla earráid agus na sonraí achoimre don chúrsa seo á lódáil.", - "@There was an error loading the summary details for this course.": { - "description": "Message shown when the course summary could not be loaded", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Summary": "Níl Achoimre Ann", - "@No Summary": { - "description": "Title displayed when there are no items in the course summary", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "This course does not have any assignments or calendar events yet.": "Níl aon tascanna ná imeachtaí féilire ag an gcúrsa seo fós.", - "@This course does not have any assignments or calendar events yet.": { - "description": "Message displayed when there are no items in the course summary", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "gradeFormatScoreOutOfPointsPossible": "{score} / {pointsPossible}", - "@gradeFormatScoreOutOfPointsPossible": { - "description": "Formatted string for a student score out of the points possible", - "type": "text", - "placeholders_order": [ - "score", - "pointsPossible" - ], - "placeholders": { - "score": {}, - "pointsPossible": {} - } - }, - "contentDescriptionScoreOutOfPointsPossible": "{score} as {pointsPossible} pointí", - "@contentDescriptionScoreOutOfPointsPossible": { - "description": "Formatted string for a student score out of the points possible", - "type": "text", - "placeholders_order": [ - "score", - "pointsPossible" - ], - "placeholders": { - "score": {}, - "pointsPossible": {} - } - }, - "gradesSubjectMessage": "Maidir le: {studentName}, Marcanna", - "@gradesSubjectMessage": { - "description": "The subject line for a message to a teacher regarding a student's grades", - "type": "text", - "placeholders_order": [ - "studentName" - ], - "placeholders": { - "studentName": {} - } - }, - "syllabusSubjectMessage": "Maidir le: {studentName}, Siollabas", - "@syllabusSubjectMessage": { - "description": "The subject line for a message to a teacher regarding a course syllabus", - "type": "text", - "placeholders_order": [ - "studentName" - ], - "placeholders": { - "studentName": {} - } - }, - "frontPageSubjectMessage": "Maidir le: {studentName}, Leathanach Tosaigh", - "@frontPageSubjectMessage": { - "description": "The subject line for a message to a teacher regarding a course front page", - "type": "text", - "placeholders_order": [ - "studentName" - ], - "placeholders": { - "studentName": {} - } - }, - "assignmentSubjectMessage": "Maidir le: {studentName}, Tasc - {assignmentName}", - "@assignmentSubjectMessage": { - "description": "The subject line for a message to a teacher regarding a student's assignment", - "type": "text", - "placeholders_order": [ - "studentName", - "assignmentName" - ], - "placeholders": { - "studentName": {}, - "assignmentName": {} - } - }, - "eventSubjectMessage": "Maidir le: {studentName}, Imeacht - {eventTitle}", - "@eventSubjectMessage": { - "description": "The subject line for a message to a teacher regarding a calendar event", - "type": "text", - "placeholders_order": [ - "studentName", - "eventTitle" - ], - "placeholders": { - "studentName": {}, - "eventTitle": {} - } - }, - "There is no page information available.": "Níl aon eolas leathanaigh ar fáil.", - "@There is no page information available.": { - "description": "Description for when no page information is available", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Assignment Details": "Sonraí an Taisc", - "@Assignment Details": { - "description": "Title for the page that shows details for an assignment", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "assignmentTotalPoints": "{points} pte", - "@assignmentTotalPoints": { - "description": "Label used for the total points the assignment is worth", - "type": "text", - "placeholders_order": [ - "points" - ], - "placeholders": { - "points": {} - } - }, - "assignmentTotalPointsAccessible": "{points} pointe", - "@assignmentTotalPointsAccessible": { - "description": "Screen reader label used for the total points the assignment is worth", - "type": "text", - "placeholders_order": [ - "points" - ], - "placeholders": { - "points": {} - } - }, - "Due": "Dlite", - "@Due": { - "description": "Label for an assignment due date", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Grade": "Marc", - "@Grade": { - "description": "Label for the section that displays an assignment's grade", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Locked": "Faoi ghlas", - "@Locked": { - "description": "Label for when an assignment is locked", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "assignmentLockedModule": "Tá an tasc seo glasáilte ag an modúl \"{moduleName}\".", - "@assignmentLockedModule": { - "description": "The locked description when an assignment is locked by a module", - "type": "text", - "placeholders_order": [ - "moduleName" - ], - "placeholders": { - "moduleName": {} - } - }, - "Remind Me": "Cuir i gcuimhne dom", - "@Remind Me": { - "description": "Label for the row to set reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Set a date and time to be notified of this specific assignment.": "Socraigh dáta agus am le bheith curtha ar an eolas faoin tasc ar leith seo.", - "@Set a date and time to be notified of this specific assignment.": { - "description": "Description for row to set reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You will be notified about this assignment on…": "Cuirfear ar an eolas thú faoin tasc seo ar…", - "@You will be notified about this assignment on…": { - "description": "Description for when a reminder is set", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Instructions": "Treoracha", - "@Instructions": { - "description": "Label for the description of the assignment when it has quiz instructions", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Send a message about this assignment": "Seol teachtaireacht faoin tasc seo", - "@Send a message about this assignment": { - "description": "Accessibility hint for the assignment messaage floating action button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "This app is not authorized for use.": "Níl an aip seo údaraithe le húsáid.", - "@This app is not authorized for use.": { - "description": "The error shown when the app being used is not verified by Canvas", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The server you entered is not authorized for this app.": "Níl an freastalaí a d'iontráil tú údaraithe don aip seo.", - "@The server you entered is not authorized for this app.": { - "description": "The error shown when the desired login domain is not verified by Canvas", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The user agent for this app is not authorized.": "Níl an gníomhaire úsáideora don aip seo údaraithe.", - "@The user agent for this app is not authorized.": { - "description": "The error shown when the user agent during verification is not verified by Canvas", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "We were unable to verify the server for use with this app.": "Níorbh fhéidir linn an freastalaí a fhíorú lena úsáid leis an aip seo.", - "@We were unable to verify the server for use with this app.": { - "description": "The generic error shown when we are unable to verify with Canvas", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Reminders": "Meabhrúcháin", - "@Reminders": { - "description": "Name of the system notification channel for assignment and event reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Notifications for reminders about assignments and calendar events": "Fógraí le haghaidh meabhrúcháin faoi thascanna agus imeachtaí féilire", - "@Notifications for reminders about assignments and calendar events": { - "description": "Description of the system notification channel for assignment and event reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Reminders have changed!": "Tá meabhrúcháin tar éis athrú!", - "@Reminders have changed!": { - "description": "Title of the dialog shown when the user needs to update their reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "In order to provide you with a better experience, we have updated how reminders work. You can add new reminders by viewing an assignment or calendar event and tapping the switch under the \"Remind Me\" section. \n\nBe aware that any reminders created with older versions of this app will not be compatible with the new changes and you will need to create them again.": "Chun eispéireas níos fearr a sholáthar duit, tá nuashonrú déanta againn ar an gcaoi a n-oibríonn meabhrúcháin. Is féidir leat meabhrúcháin nua a chur leis trí thasc nó imeacht féilire a fheiceáil agus an lasc a thapáil faoin rannán \"Cuir i gcuimhne dom\".\n\nTabhair faoi deara nach mbeidh aon mheabhrúcháin a chruthaítear le leaganacha níos sine den aip seo comhoiriúnach leis na hathruithe nua agus beidh ort iad a chruthú arís.", - "@In order to provide you with a better experience, we have updated how reminders work. You can add new reminders by viewing an assignment or calendar event and tapping the switch under the \"Remind Me\" section.\n\nBe aware that any reminders created with older versions of this app will not be compatible with the new changes and you will need to create them again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Not a parent?": "Ní tuismitheoir tú?", - "@Not a parent?": { - "description": "Title for the screen that shows when the user is not observing any students", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "We couldn't find any students associated with this account": "Níorbh fhéidir linn aon mhac léinn a bhaineann leis an gcuntas seo a aimsiú", - "@We couldn't find any students associated with this account": { - "description": "Subtitle for the screen that shows when the user is not observing any students", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Are you a student or teacher?": "An mac léinn nó múinteoir tú?", - "@Are you a student or teacher?": { - "description": "Label for button that will show users the option to view other Canvas apps in the Play Store", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "One of our other apps might be a better fit. Tap one to visit the Play Store.": "D'fhéadfadh go mbeadh ceann dár n-aipeanna eile níos oiriúnaí. Tapáil ceann amháin chun cuairt a thabhairt ar an Play Store.", - "@One of our other apps might be a better fit. Tap one to visit the Play Store.": { - "description": "Description of options to view other Canvas apps in the Play Store", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Return to Login": "Fill ar Logáil Isteach", - "@Return to Login": { - "description": "Label for the button that returns the user to the login screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "STUDENT": "MAC LÉINN", - "@STUDENT": { - "description": "The \"student\" portion of the \"Canvas Student\" app name, in all caps. \"Canvas\" is excluded in this context as it will be displayed to the user as a wordmark image", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "TEACHER": "MÚINTEOIR", - "@TEACHER": { - "description": "The \"teacher\" portion of the \"Canvas Teacher\" app name, in all caps. \"Canvas\" is excluded in this context as it will be displayed to the user as a wordmark image", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Canvas Student": "Mac Léinn Canvas", - "@Canvas Student": { - "description": "The name of the Canvas Student app. Only \"Student\" should be translated as \"Canvas\" is a brand name in this context and should not be translated.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Canvas Teacher": "Múinteoir Canvas", - "@Canvas Teacher": { - "description": "The name of the Canvas Teacher app. Only \"Teacher\" should be translated as \"Canvas\" is a brand name in this context and should not be translated.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Alerts": "Níl aon Fholáirimh", - "@No Alerts": { - "description": "The title for the empty message to show to users when there are no alerts for the student.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There’s nothing to be notified of yet.": "Níl aon rud le cur in iúl go fóill.", - "@There’s nothing to be notified of yet.": { - "description": "The empty message to show to users when there are no alerts for the student.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "dismissAlertLabel": "Diúltaigh {alertTitle}", - "@dismissAlertLabel": { - "description": "Accessibility label to dismiss an alert", - "type": "text", - "placeholders_order": [ - "alertTitle" - ], - "placeholders": { - "alertTitle": {} - } - }, - "Course Announcement": "Fógra an Chúrsa", - "@Course Announcement": { - "description": "Title for alerts when there is a course announcement", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Institution Announcement": "Fógra Institiúide", - "@Institution Announcement": { - "description": "Title for alerts when there is an institution announcement", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "assignmentGradeAboveThreshold": "Marc an Taisc Thar {threshold}", - "@assignmentGradeAboveThreshold": { - "description": "Title for alerts when an assignment grade is above the threshold value", - "type": "text", - "placeholders_order": [ - "threshold" - ], - "placeholders": { - "threshold": {} - } - }, - "assignmentGradeBelowThreshold": "Marc an Taisc Faoi {threshold}", - "@assignmentGradeBelowThreshold": { - "description": "Title for alerts when an assignment grade is below the threshold value", - "type": "text", - "placeholders_order": [ - "threshold" - ], - "placeholders": { - "threshold": {} - } - }, - "courseGradeAboveThreshold": "Marc an Chúrsa Thar {threshold}", - "@courseGradeAboveThreshold": { - "description": "Title for alerts when a course grade is above the threshold value", - "type": "text", - "placeholders_order": [ - "threshold" - ], - "placeholders": { - "threshold": {} - } - }, - "courseGradeBelowThreshold": "Marc an Chúrsa Faoi {threshold}", - "@courseGradeBelowThreshold": { - "description": "Title for alerts when a course grade is below the threshold value", - "type": "text", - "placeholders_order": [ - "threshold" - ], - "placeholders": { - "threshold": {} - } - }, - "Settings": "Socruithe", - "@Settings": { - "description": "Title for the settings screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Theme": "Téama", - "@Theme": { - "description": "Label for the light/dark theme section in the settings page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Dark Mode": "Mód Dorcha", - "@Dark Mode": { - "description": "Label for the button that enables dark mode", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Light Mode": "Mód Geall", - "@Light Mode": { - "description": "Label for the button that enables light mode", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "High Contrast Mode": "Mód Codarsnachta Ard", - "@High Contrast Mode": { - "description": "Label for the switch that toggles high contrast mode", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Use Dark Theme in Web Content": "Úsáid Téama Dorcha in Ábhar Gréasáin", - "@Use Dark Theme in Web Content": { - "description": "Label for the switch that toggles dark mode for webviews", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Appearance": "Dealramh", - "@Appearance": { - "description": "Label for the appearance section in the settings page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Successfully submitted!": "Curtha isteach go rathúil!", - "@Successfully submitted!": { - "description": "Title displayed in the grade cell for an assignment that has been submitted", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "submissionStatusSuccessSubtitle": "Cuireadh an tasc seo isteach ar {date} ag {time} agus tá sé ag fanacht le bheith marcáilte", - "@submissionStatusSuccessSubtitle": { - "description": "Subtitle displayed in the grade cell for an assignment that has been submitted and is awaiting a grade", - "type": "text", - "placeholders_order": [ - "date", - "time" - ], - "placeholders": { - "date": {}, - "time": {} - } - }, - "outOfPoints": "{howMany,plural, =1{As pointe 1}other{ as {points} pointe}}", - "@outOfPoints": { - "description": "Description for an assignment grade that has points without a current scoroe", - "type": "text", - "placeholders_order": [ - "points", - "howMany" - ], - "placeholders": { - "points": {}, - "howMany": {} - } - }, - "Excused": "Leithscéal faighte", - "@Excused": { - "description": "Grading status for an assignment marked as excused", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Complete": "Críochnaithe", - "@Complete": { - "description": "Grading status for an assignment marked as complete", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Incomplete": "Neamhchríochnaithe", - "@Incomplete": { - "description": "Grading status for an assignment marked as incomplete", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "minus": "lúide", - "@minus": { - "description": "Screen reader-friendly replacement for the \"-\" character in letter grades like \"A-\"", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "latePenalty": "Pionós déanach (-{pointsLost})", - "@latePenalty": { - "description": "Text displayed when a late penalty has been applied to the assignment", - "type": "text", - "placeholders_order": [ - "pointsLost" - ], - "placeholders": { - "pointsLost": {} - } - }, - "finalGrade": "Marc Deiridh: {grade}", - "@finalGrade": { - "description": "Text that displays the final grade of an assignment", - "type": "text", - "placeholders_order": [ - "grade" - ], - "placeholders": { - "grade": {} - } - }, - "Alert Settings": "Socruithe Foláirimh", - "@Alert Settings": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Alert me when…": "Tabhair foláireamh dom nuair…", - "@Alert me when…": { - "description": "Header for the screen where the observer chooses the thresholds that will determine when they receive alerts (e.g. when an assignment is graded below 70%)", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Course grade below": "Marc an chúrsa thar", - "@Course grade below": { - "description": "Label describing the threshold for when the course grade is below a certain percentage", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Course grade above": "Marc an chúrsa faoi", - "@Course grade above": { - "description": "Label describing the threshold for when the course grade is above a certain percentage", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Assignment missing": "Tasc in easnamh", - "@Assignment missing": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Assignment grade below": "Marc an taisc faoi", - "@Assignment grade below": { - "description": "Label describing the threshold for when an assignment is graded below a certain percentage", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Assignment grade above": "Marc an taisc thar", - "@Assignment grade above": { - "description": "Label describing the threshold for when an assignment is graded above a certain percentage", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Course Announcements": "Fógraí an Chúrsa", - "@Course Announcements": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Institution Announcements": "Fógraí na hInstitiúide", - "@Institution Announcements": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Never": "Riamh", - "@Never": { - "description": "Indication that tells the user they will not receive alert notifications of a specific kind", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Grade percentage": "Céatadán an mairc", - "@Grade percentage": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading your student's alerts.": "Tharla earráid agus foláirimh do mhic léinn á lódáil.", - "@There was an error loading your student's alerts.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Must be below 100": "Ní mór dó a bheith faoi 100", - "@Must be below 100": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "mustBeBelowN": "Ní mór dó a bheith faoi {percentage}", - "@mustBeBelowN": { - "description": "Validation error to the user that they must choose a percentage below 'n'", - "type": "text", - "placeholders_order": [ - "percentage" - ], - "placeholders": { - "percentage": { - "example": 5 - } - } - }, - "mustBeAboveN": "Ní mór dó a bheith thar {percentage}", - "@mustBeAboveN": { - "description": "Validation error to the user that they must choose a percentage above 'n'", - "type": "text", - "placeholders_order": [ - "percentage" - ], - "placeholders": { - "percentage": { - "example": 5 - } - } - }, - "Select Student Color": "Roghnaigh Dath an Mhic Léinn", - "@Select Student Color": { - "description": "Title for screen that allows users to assign a color to a specific student", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Electric, blue": "Leictreach, gorm", - "@Electric, blue": { - "description": "Name of the Electric (blue) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Plum, Purple": "Plumchorcra, Corcra", - "@Plum, Purple": { - "description": "Name of the Plum (purple) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Barney, Fuschia": "Barney, Fuschia", - "@Barney, Fuschia": { - "description": "Name of the Barney (fuschia) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Raspberry, Red": "Sú craobh, Dearg", - "@Raspberry, Red": { - "description": "Name of the Raspberry (red) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Fire, Orange": "Dóiteáin, Oráiste", - "@Fire, Orange": { - "description": "Name of the Fire (orange) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Shamrock, Green": "Seamróg, Glas", - "@Shamrock, Green": { - "description": "Name of the Shamrock (green) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "An error occurred while saving your selection. Please try again.": "Tharla earráid agus do rogha á shábháil. Bain triail as arís, le do thoil.", - "@An error occurred while saving your selection. Please try again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "changeStudentColorLabel": "Athraigh dath le haghaidh {studentName}", - "@changeStudentColorLabel": { - "description": "Accessibility label for the button that lets users change the color associated with a specific student", - "type": "text", - "placeholders_order": [ - "studentName" - ], - "placeholders": { - "studentName": {} - } - }, - "Teacher": "Múinteoir", - "@Teacher": { - "description": "Label for the Teacher enrollment type", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Student": "Mac léinn", - "@Student": { - "description": "Label for the Student enrollment type", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "TA": "CT", - "@TA": { - "description": "Label for the Teaching Assistant enrollment type (also known as Teacher Aid or Education Assistant), reduced to a short acronym/initialism if appropriate.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Observer": "Breathnóir", - "@Observer": { - "description": "Label for the Observer enrollment type", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Use Camera": "Úsáid Ceamara", - "@Use Camera": { - "description": "Label for the action item that lets the user capture a photo using the device camera", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Upload File": "Uaslódáil Comhad", - "@Upload File": { - "description": "Label for the action item that lets the user upload a file from their device", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Choose from Gallery": "Roghnaigh ón nGailearaí", - "@Choose from Gallery": { - "description": "Label for the action item that lets the user select a photo from their device gallery", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Preparing…": "Ag ullmhú…", - "@Preparing…": { - "description": "Message shown while a file is being prepared to attach to a message", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Add student with…": "Cuir mac léinn le…", - "@Add student with…": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Add Student": "Cuir Mac Léinn leis", - "@Add Student": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You are not observing any students.": "Níl tú ag breathnú ar mhac léinn ar bith.", - "@You are not observing any students.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading your students.": "Tharla earráid agus do mhic léinn á lódáil.", - "@There was an error loading your students.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Pairing Code": "Cód Péireála", - "@Pairing Code": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Students can obtain a pairing code through the Canvas website": "Is féidir le mic léinn cód péireála a fháil trí shuíomh Gréasáin Canvas", - "@Students can obtain a pairing code through the Canvas website": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Enter the student pairing code provided to you. If the pairing code doesn't work, it may have expired": "Cuir isteach an cód péireála mac léinn a thugtar duit. Mura n-oibríonn an cód péireála, seans go mbeidh sé imithe in éag", - "@Enter the student pairing code provided to you. If the pairing code doesn't work, it may have expired": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Your code is incorrect or expired.": "Tá do chód mícheart nó imithe in éag.", - "@Your code is incorrect or expired.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Something went wrong trying to create your account, please reach out to your school for assistance.": "Tharla earráid agus do chuntas a chruthú, déan teagmháil le do scoil le haghaidh cabhrach.", - "@Something went wrong trying to create your account, please reach out to your school for assistance.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "QR Code": "Cód MF", - "@QR Code": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Students can create a QR code using the Canvas Student app on their mobile device": "Is féidir le mic léinn cód MF a chruthú ag baint úsáide as an aip Canvas Mac Léinn ar a ngléas soghluaiste", - "@Students can create a QR code using the Canvas Student app on their mobile device": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Add new student": "Cuir mac léinn nua leis", - "@Add new student": { - "description": "Semantics label for the FAB on the Manage Students Screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Select": "Roghnaigh", - "@Select": { - "description": "Hint text to tell the user to choose one of two options", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I have a Canvas account": "Tá cuntas Canvas agam", - "@I have a Canvas account": { - "description": "Option to select for users that have a canvas account", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I don't have a Canvas account": "Níl cuntas Canvas agam", - "@I don't have a Canvas account": { - "description": "Option to select for users that don't have a canvas account", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Create Account": "Cruthaigh Cuntas", - "@Create Account": { - "description": "Button text for account creation confirmation", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Full Name": "Ainm iomlán", - "@Full Name": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Email Address": "Seoladh Ríomhphoist", - "@Email Address": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Password": "Pasfhocal", - "@Password": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Full Name…": "Ainm iomlán…", - "@Full Name…": { - "description": "hint label for inside form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Email…": "Ríomhphost…", - "@Email…": { - "description": "hint label for inside form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Password…": "Pasfhocal…", - "@Password…": { - "description": "hint label for inside form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Please enter full name": "Cuir isteach ainm iomlán", - "@Please enter full name": { - "description": "Error message for form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Please enter an email address": "Cuir isteach seoladh ríomhphoist", - "@Please enter an email address": { - "description": "Error message for form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Please enter a valid email address": "Cuir isteach seoladh ríomhphoist bailí", - "@Please enter a valid email address": { - "description": "Error message for form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Password is required": "Tá pasfhocal ag teastáil", - "@Password is required": { - "description": "Error message for form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Password must contain at least 8 characters": "Caithfidh 8 gcarachtar ar a laghad a bheith sa phasfhocal", - "@Password must contain at least 8 characters": { - "description": "Error message for form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "qrCreateAccountTos": "Trí ‘Cruthaigh Cuntas’ a thapáil, aontaíonn tú leis an {termsOfService} agus aithníonn tú an {privacyPolicy}", - "@qrCreateAccountTos": { - "description": "The text show on the account creation screen", - "type": "text", - "placeholders_order": [ - "termsOfService", - "privacyPolicy" - ], - "placeholders": { - "termsOfService": {}, - "privacyPolicy": {} - } - }, - "Terms of Service": "Tearmaí Seirbhíse", - "@Terms of Service": { - "description": "Label for the Canvas Terms of Service agreement. This will be used in the qrCreateAccountTos text and will be highlighted and clickable", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Privacy Policy": "Polasaí Príobháideachais", - "@Privacy Policy": { - "description": "Label for the Canvas Privacy Policy agreement. This will be used in the qrCreateAccountTos text and will be highlighted and clickable", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "View the Privacy Policy": "Féach ar an bPolasaí Príobháideachais", - "@View the Privacy Policy": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Already have an account? ": "An bhfuil cuntas agat cheana féin? ", - "@Already have an account? ": { - "description": "Part of multiline text span, includes AccountSignIn1-2, in that order", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Sign In": "Sínigh isteach", - "@Sign In": { - "description": "Part of multiline text span, includes AccountSignIn1-2, in that order", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Hide Password": "Folaigh Pasfhocal", - "@Hide Password": { - "description": "content description for password hide button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Show Password": "Taispeáin Pasfhocal", - "@Show Password": { - "description": "content description for password show button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Terms of Service Link": "Nasc Téarmaí Seirbhíse", - "@Terms of Service Link": { - "description": "content description for terms of service link", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Privacy Policy Link": "Nasc Polasaí Príobháideachais", - "@Privacy Policy Link": { - "description": "content description for privacy policy link", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Event": "Imeacht", - "@Event": { - "description": "Title for the event details screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Date": "Dáta", - "@Date": { - "description": "Label for the event date", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Location": "Suíomh", - "@Location": { - "description": "Label for the location information", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Location Specified": "Níl Suíomh Sonraithe", - "@No Location Specified": { - "description": "Description for events that do not have a location", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "eventTime": "{startAt} - {endAt}", - "@eventTime": { - "description": "The time the event is happening, example: \"2:00 pm - 4:00 pm\"", - "type": "text", - "placeholders_order": [ - "startAt", - "endAt" - ], - "placeholders": { - "startAt": {}, - "endAt": {} - } - }, - "Set a date and time to be notified of this event.": "Socraigh dáta agus am le cur ar an eolas faoin imeacht seo.", - "@Set a date and time to be notified of this event.": { - "description": "Description for row to set event reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You will be notified about this event on…": "Cuirfear ar an eolas thú faoin imeacht seo ar…", - "@You will be notified about this event on…": { - "description": "Description for when an event reminder is set", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Share Your Love for the App": "Comhroinn do Grá don Aip", - "@Share Your Love for the App": { - "description": "Label for option to open the app store", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Tell us about your favorite parts of the app": "Inis dúinn faoi na cuideanna is fearr leat den aip", - "@Tell us about your favorite parts of the app": { - "description": "Description for option to open the app store", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Legal": "Dlíthiúil", - "@Legal": { - "description": "Label for legal information option", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Privacy policy, terms of use, open source": "Polasaí príobháideachais, téarmaí úsáide, foinse oscailte", - "@Privacy policy, terms of use, open source": { - "description": "Description for legal information option", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Idea for Canvas Parent App [Android]": "Smaoineamh don Aip Máthairchúrsa Canvas [Android]", - "@Idea for Canvas Parent App [Android]": { - "description": "The subject for the email to request a feature", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The following information will help us better understand your idea:": "Cabhróidh an t-eolas seo a leanas linn do smaoineamh a thuiscint níos fearr:", - "@The following information will help us better understand your idea:": { - "description": "The header for the users information that is attached to a feature request", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Domain:": "Fearann:", - "@Domain:": { - "description": "The label for the Canvas domain of the logged in user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "User ID:": "ID an Úsáideora:", - "@User ID:": { - "description": "The label for the Canvas user ID of the logged in user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Email:": "Ríomhphost:", - "@Email:": { - "description": "The label for the eamil of the logged in user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Locale:": "Suíomh:", - "@Locale:": { - "description": "The label for the locale of the logged in user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Terms of Use": "Téarmaí Úsáide", - "@Terms of Use": { - "description": "Label for the terms of use", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Canvas on GitHub": "Canvas ar GitHub", - "@Canvas on GitHub": { - "description": "Label for the button that opens the Canvas project on GitHub's website", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was a problem loading the Terms of Use": "Bhí fadhb ann agus na Téarmaí Úsáide á lódáil", - "@There was a problem loading the Terms of Use": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Device": "Gléas", - "@Device": { - "description": "Label used for device manufacturer/model in the error report", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "OS Version": "Leagan OS", - "@OS Version": { - "description": "Label used for device operating system version in the error report", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Version Number": "Uimhir Leagan", - "@Version Number": { - "description": "Label used for the app version number in the error report", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Report A Problem": "Tuairiscigh Fadhb", - "@Report A Problem": { - "description": "Title used for generic dialog to report problems", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Subject": "Ábhar", - "@Subject": { - "description": "Label used for Subject text field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "A subject is required.": "Tá ábhar ag teastáil.", - "@A subject is required.": { - "description": "Error shown when the subject field is empty", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "An email address is required.": "Tá seoladh ríomhphoist ag teastáil.", - "@An email address is required.": { - "description": "Error shown when the email field is empty", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Description": "Cur síos", - "@Description": { - "description": "Label used for Description text field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "A description is required.": "Tá cur síos ag teastáil.", - "@A description is required.": { - "description": "Error shown when the description field is empty", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "How is this affecting you?": "Cén tionchar atá aige seo ort?", - "@How is this affecting you?": { - "description": "Label used for the dropdown to select how severe the issue is", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "send": "seol", - "@send": { - "description": "Label used for send button when reporting a problem", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Just a casual question, comment, idea, suggestion…": "Níl ann ach ceist ócáideach, ráiteas, smaoineamh, moladh…", - "@Just a casual question, comment, idea, suggestion…": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I need some help but it's not urgent.": "Tá roinnt cabhrach de dhíth orm ach níl sé práinneach.", - "@I need some help but it's not urgent.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Something's broken but I can work around it to get what I need done.": "Tá rud éigin briste ach is féidir liom oibriú timpeall air chun an méid a theastaíonn uaim a dhéanamh.", - "@Something's broken but I can work around it to get what I need done.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I can't get things done until I hear back from you.": "Ní féidir liom rudaí a dhéanamh go dtí go gcloisim ar ais uait.", - "@I can't get things done until I hear back from you.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "EXTREME CRITICAL EMERGENCY!!": "ÉIGEANDÁIL FÍORCHRITICIÚIL!!", - "@EXTREME CRITICAL EMERGENCY!!": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Not Graded": "Níl sé Marcáilte", - "@Not Graded": { - "description": "Description for an assignment has not been graded.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Login flow: Normal": "Sreabhadh logáil isteach: Gnáth", - "@Login flow: Normal": { - "description": "Description for the normal login flow", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Login flow: Canvas": "Sreabhadh logáil isteach: Canvas", - "@Login flow: Canvas": { - "description": "Description for the Canvas login flow", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Login flow: Site Admin": "Sreabhadh logáil isteach: Riarthóir an tSuímh", - "@Login flow: Site Admin": { - "description": "Description for the Site Admin login flow", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Login flow: Skip mobile verify": "Sreabhadh logáil isteach: Scipeáil deimhniú soghluaiste", - "@Login flow: Skip mobile verify": { - "description": "Description for the login flow that skips domain verification for mobile", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Act As User": "Gníomh mar Úsáideoir", - "@Act As User": { - "description": "Label for the button that allows the user to act (masquerade) as another user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Stop Acting as User": "Stop ag Gníomhú mar Úsáideoir", - "@Stop Acting as User": { - "description": "Label for the button that allows the user to stop acting (masquerading) as another user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "actingAsUser": "Tá tú ag gníomhú mar {userName}", - "@actingAsUser": { - "description": "Message shown while acting (masquerading) as another user", - "type": "text", - "placeholders_order": [ - "userName" - ], - "placeholders": { - "userName": {} - } - }, - "\"Act as\" is essentially logging in as this user without a password. You will be able to take any action as if you were this user, and from other users' points of views, it will be as if this user performed them. However, audit logs record that you were the one who performed the actions on behalf of this user.": "Go bunúsach is éard atá i gceist le \"Gníomh mar\" logáil isteach mar an úsáideoir seo gan pasfhocal. Beidh tú in ann aon ghníomg a dhéanamh amhail is gur tusa an t-úsáideoir seo, agus ó dhearcadh úsáideoirí eile, beidh sé mar a rinne an t-úsáideoir seo iad. Mar sin féin, taifeadann logaí iniúchta gurb tusa an té a rinne na gníomhartha thar ceann an úsáideora seo.", - "@\"Act as\" is essentially logging in as this user without a password. You will be able to take any action as if you were this user, and from other users' points of views, it will be as if this user performed them. However, audit logs record that you were the one who performed the actions on behalf of this user.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Domain": "Fearann", - "@Domain": { - "description": "Text field hint for domain url input", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You must enter a valid domain": "Ní mór duit fearann bailí a chur isteach", - "@You must enter a valid domain": { - "description": "Message displayed for domain input error", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "User ID": "ID an Úsáideora", - "@User ID": { - "description": "Text field hint for user ID input", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You must enter a user id": "Ní mór duit id an úsáideora a chur isteach", - "@You must enter a user id": { - "description": "Message displayed for user Id input error", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error trying to act as this user. Please check the Domain and User ID and try again.": "Tharla earráid agus iarracht á déanamh mar úsáideoir seo. Seiceáil an Fearainn agus ID an Úsáideora agus bain triail eile as.", - "@There was an error trying to act as this user. Please check the Domain and User ID and try again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "endMasqueradeMessage": "Stopfaidh tú ag gníomhú mar {userName} agus filleadh ar do chuntas bunaidh.", - "@endMasqueradeMessage": { - "description": "Confirmation message displayed when the user wants to stop acting (masquerading) as another user", - "type": "text", - "placeholders_order": [ - "userName" - ], - "placeholders": { - "userName": {} - } - }, - "endMasqueradeLogoutMessage": "Stopfaidh tú ag gníomhú mar {userName} agus logálfar amach thú.", - "@endMasqueradeLogoutMessage": { - "description": "Confirmation message displayed when the user wants to stop acting (masquerading) as another user and will be logged out.", - "type": "text", - "placeholders_order": [ - "userName" - ], - "placeholders": { - "userName": {} - } - }, - "How are we doing?": "Conas atá ag éirí linn?", - "@How are we doing?": { - "description": "Title for dialog asking user to rate the app out of 5 stars.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Don't show again": "Ná taispeáin arís", - "@Don't show again": { - "description": "Button to prevent the rating dialog from showing again.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "What can we do better?": "Cad is féidir linn a dhéanamh níos fearr?", - "@What can we do better?": { - "description": "Hint text for providing a comment with the rating.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Send Feedback": "Seol Aiseolas", - "@Send Feedback": { - "description": "Button to send rating with feedback", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "ratingDialogEmailSubject": "Moltaí le haghaidh Android - Máthairchúrsa Canvas {version}", - "@ratingDialogEmailSubject": { - "description": "The subject for an email to provide feedback for CanvasParent.", - "type": "text", - "placeholders_order": [ - "version" - ], - "placeholders": { - "version": {} - } - }, - "starRating": "{position,plural, =1{{position} réalta}other{{position} réalta}}", - "@starRating": { - "description": "Accessibility label for the 1 stars to 5 stars rating", - "type": "text", - "placeholders_order": [ - "position" - ], - "placeholders": { - "position": { - "example": 1 - } - } - }, - "Student Pairing": "Péireáil Mac Léinn", - "@Student Pairing": { - "description": "Title for the screen where users can pair to students using a QR code", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Open Canvas Student": "Oscail Mac Léinn Canvas", - "@Open Canvas Student": { - "description": "Title for QR pairing tutorial screen instructing users to open the Canvas Student app", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You'll need to open your student's Canvas Student app to continue. Go into Main Menu > Settings > Pair with Observer and scan the QR code you see there.": "Beidh ort aip Mac Léinn Canvas do mhic léinn a oscailt chun leanúint ar aghaidh. Téigh isteach sa Phríomh-Roghchlár > Socruithe > Péireáil le Breathnóir agus scanadh an cód MF a fheiceann tú ann.", - "@You'll need to open your student's Canvas Student app to continue. Go into Main Menu > Settings > Pair with Observer and scan the QR code you see there.": { - "description": "Message explaining how QR code pairing works", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Screenshot showing location of pairing QR code generation in the Canvas Student app": "Gabháil scáileáin a thaispeánann an áit inar péireáladh giniúint cód MF san aip Canvas Mac Léinn", - "@Screenshot showing location of pairing QR code generation in the Canvas Student app": { - "description": "Content Description for qr pairing tutorial screenshot", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Expired QR Code": "Cód MF imithe in éag", - "@Expired QR Code": { - "description": "Error title shown when the users scans a QR code that has expired", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The QR code you scanned may have expired. Refresh the code on the student's device and try again.": "Seans go bhfuil an cód MF a scanáil tú imithe in éag. Athnuaigh an cód ar ghléas an mac léinn agus bain triail eile as.", - "@The QR code you scanned may have expired. Refresh the code on the student's device and try again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "A network error occurred when adding this student. Check your connection and try again.": "Tharla earráid ghréasáin agus an mac léinn seo á chur leis. Seiceáil do cheangal agus bain triail eile as.", - "@A network error occurred when adding this student. Check your connection and try again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Invalid QR Code": "Cód MF neamhbhailí", - "@Invalid QR Code": { - "description": "Error title shown when the user scans an invalid QR code", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Incorrect Domain": "Fearann Mícheart", - "@Incorrect Domain": { - "description": "Error title shown when the users scane a QR code for a student that belongs to a different domain", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The student you are trying to add belongs to a different school. Log in or create an account with that school to scan this code.": "Is le scoil eile é an mac léinn seo a bhfuil tú ag iarraidh a chur leis. Logáil isteach nó cruthaigh cuntas leis an scoil sin chun an cód seo a scanadh.", - "@The student you are trying to add belongs to a different school. Log in or create an account with that school to scan this code.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Camera Permission": "Cead Ceamara", - "@Camera Permission": { - "description": "Error title shown when the user wans to scan a QR code but has denied the camera permission", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "This will unpair and remove all enrollments for this student from your account.": "Déanfaidh sé seo na rolluithe ar fad don mhac léinn seo a dhíphéireáil agus a bhaint de do chuntas.", - "@This will unpair and remove all enrollments for this student from your account.": { - "description": "Confirmation message shown when the user tries to delete a student from their account", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was a problem removing this student from your account. Please check your connection and try again.": "Bhí fadhb ann an mac léinn seo a bhaint de do chuntas. Seiceáil do cheangal agus bain triail eile as.", - "@There was a problem removing this student from your account. Please check your connection and try again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Cancel": "Cealaigh", - "@Cancel": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "next": "Ar aghaidh", - "@next": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "ok": "CGL", - "@ok": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Yes": "Tá", - "@Yes": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No": "Níl", - "@No": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Retry": "Bain triail eile as", - "@Retry": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Delete": "Scrios", - "@Delete": { - "description": "Label used for general delete/remove actions", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Done": "Déanta", - "@Done": { - "description": "Label for general done/finished actions", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Refresh": "Athnuaigh", - "@Refresh": { - "description": "Label for button to refresh data from the web", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "View Description": "Féach ar Chur síos", - "@View Description": { - "description": "Button to view the description for an event or assignment", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "expanded": "leathnaithe", - "@expanded": { - "description": "Description for the accessibility reader for list groups that are expanded", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "collapsed": "leacaithe", - "@collapsed": { - "description": "Description for the accessibility reader for list groups that are expanded", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "An unexpected error occurred": "Tharla earráid gan choinne", - "@An unexpected error occurred": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No description": "Gan cuir síos", - "@No description": { - "description": "Message used when the assignment has no description", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Launch External Tool": "Seol Uirlis Sheachtrach", - "@Launch External Tool": { - "description": "Button text added to webviews to let users open external tools in their browser", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Interactions on this page are limited by your institution.": "Tá idirghníomhaíochtaí ar an leathanach seo teoranta ag d'institiúid.", - "@Interactions on this page are limited by your institution.": { - "description": "Message describing how the webview has limited access due to an instution setting", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "dateAtTime": "{date} ag {time}", - "@dateAtTime": { - "description": "The string to format dates", - "type": "text", - "placeholders_order": [ - "date", - "time" - ], - "placeholders": { - "date": {}, - "time": {} - } - }, - "dueDateAtTime": "Dlite {date} ag {time}", - "@dueDateAtTime": { - "description": "The string to format due dates", - "type": "text", - "placeholders_order": [ - "date", - "time" - ], - "placeholders": { - "date": {}, - "time": {} - } - }, - "No Due Date": "Níl Dáta Dlite", - "@No Due Date": { - "description": "Label for assignments that do not have a due date", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Filter": "Scag", - "@Filter": { - "description": "Label for buttons to filter what items are visible", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "unread": "neamhléite", - "@unread": { - "description": "Label for things that are marked as unread", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "unreadCount": "{count} neamhléite", - "@unreadCount": { - "description": "Formatted string for when there are a number of unread items", - "type": "text", - "placeholders_order": [ - "count" - ], - "placeholders": { - "count": {} - } - }, - "badgeNumberPlus": "{count}+", - "@badgeNumberPlus": { - "description": "Formatted string for when too many items are being notified in a badge, generally something like: 99+", - "type": "text", - "placeholders_order": [ - "count" - ], - "placeholders": { - "count": {} - } - }, - "There was an error loading this announcement": "Tharla earráid agus an fógra seo á lódáil", - "@There was an error loading this announcement": { - "description": "Message shown when an announcement detail screen fails to load", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Network error": "Earráid ghréasáin", - "@Network error": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Under Construction": "Á dTógáil", - "@Under Construction": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "We are currently building this feature for your viewing pleasure.": "Táimid ag tógáil an ghné seo faoi láthair chun do phléisiúr féachana.", - "@We are currently building this feature for your viewing pleasure.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Request Login Help Button": "Cnaipe Iarr Cabhair ag Logáil Isteach", - "@Request Login Help Button": { - "description": "Accessibility hint for button that opens help dialog for a login help request", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Request Login Help": "Iarr Cabhair Logála Isteach", - "@Request Login Help": { - "description": "Title of help dialog for a login help request", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I'm having trouble logging in": "Tá deacracht agam logáil isteach", - "@I'm having trouble logging in": { - "description": "Subject of help dialog for a login help request", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "An error occurred when trying to display this link": "Tharla earráid agus an nasc seo á thaispeáint", - "@An error occurred when trying to display this link": { - "description": "Error message shown when a link can't be opened", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "We are unable to display this link, it may belong to an institution you currently aren't logged in to.": "Ní féidir linn an nasc seo a thaispeáint, seans gur le hinstitiúid nach bhfuil tú logáilte isteach inti faoi láthair.", - "@We are unable to display this link, it may belong to an institution you currently aren't logged in to.": { - "description": "Description for error page shown when clicking a link", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Link Error": "Earráid Naisc", - "@Link Error": { - "description": "Title for error page shown when clicking a link", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Open In Browser": "Oscail i mBrabhsálaí", - "@Open In Browser": { - "description": "Text for button to open a link in the browswer", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You'll find the QR code on the web in your account profile. Click 'QR for Mobile Login' in the list.": "Gheobhaidh tú an cód MF ar an ngréasán i do phróifíl chuntais. Cliceáil 'MF le haghaidh Logáil Isteach Móibíleach' sa liosta.", - "@You'll find the QR code on the web in your account profile. Click 'QR for Mobile Login' in the list.": { - "description": "Text for qr login tutorial screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Locate QR Code": "Aimsigh Cód MF", - "@Locate QR Code": { - "description": "Text for qr login button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Please scan a QR code generated by Canvas": "Scan cód MF ginte ag Canvas", - "@Please scan a QR code generated by Canvas": { - "description": "Text for qr login error with incorrect qr code", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error logging in. Please generate another QR Code and try again.": "Tharla earráid agus logáil isteach. Gin Cód MF eile agus bain triail eile as.", - "@There was an error logging in. Please generate another QR Code and try again.": { - "description": "Text for qr login error", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Screenshot showing location of QR code generation in browser": "Seit scáileáin a thaispeánann suíomh giniúna an chóid MF sa bhrabhsálaí", - "@Screenshot showing location of QR code generation in browser": { - "description": "Content Description for qr login tutorial screenshot", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "QR scanning requires camera access": "Teastaíonn rochtain ceamara le haghaidh scanadh MF", - "@QR scanning requires camera access": { - "description": "placeholder for camera error for QR code scan", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The linked item is no longer available": "Níl an mhír nasctha ar fáil a thuilleadh", - "@The linked item is no longer available": { - "description": "error message when the alert could no be opened", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Message sent": "Teachtaireacht seolta", - "@Message sent": { - "description": "confirmation message on the screen when the user succesfully sends a message", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Acceptable Use Policy": "Beartas Úsáide Sothuigthe", - "@Acceptable Use Policy": { - "description": "title for the acceptable use policy screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Submit": "Cuir isteach", - "@Submit": { - "description": "submit button title for acceptable use policy screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Either you're a new user or the Acceptable Use Policy has changed since you last agreed to it. Please agree to the Acceptable Use Policy before you continue.": "Is úsáideoir nua thú nó tá an Beartas um Úsáid Inghlactha athraithe ó d’aontaigh tú leis an uair dheireanach. Aontaigh leis an mBeartas um Úsáid Inghlactha sula leanann tú ar aghaidh.", - "@Either you're a new user or the Acceptable Use Policy has changed since you last agreed to it. Please agree to the Acceptable Use Policy before you continue.": { - "description": "acceptable use policy screen description", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I agree to the Acceptable Use Policy.": "Aontaím leis an mBeartas um Úsáid Inghlactha.", - "@I agree to the Acceptable Use Policy.": { - "description": "acceptable use policy switch title", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "About": "Faoi", - "@About": { - "description": "Title for about menu item in settings", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "App": "Aip", - "@App": { - "description": "Title for App field on about page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Login ID": "ID Logáil Isteach", - "@Login ID": { - "description": "Title for Login ID field on about page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Email": "Ríomhphost", - "@Email": { - "description": "Title for Email field on about page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Version": "Leagan", - "@Version": { - "description": "Title for Version field on about page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Instructure logo": "Lógó Instructure", - "@Instructure logo": { - "description": "Semantics label for the Instructure logo on the about page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - } -} \ No newline at end of file diff --git a/apps/flutter_parent/lib/l10n/res/intl_hi.arb b/apps/flutter_parent/lib/l10n/res/intl_hi.arb deleted file mode 100644 index bc0b681b83..0000000000 --- a/apps/flutter_parent/lib/l10n/res/intl_hi.arb +++ /dev/null @@ -1,2753 +0,0 @@ -{ - "@@last_modified": "2023-08-25T11:04:20.901151", - "alertsLabel": "चेतावनियां", - "@alertsLabel": { - "description": "The label for the Alerts tab", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "calendarLabel": "कैलेंडर", - "@calendarLabel": { - "description": "The label for the Calendar tab", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "coursesLabel": "पाठ्यक्रम", - "@coursesLabel": { - "description": "The label for the Courses tab", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Students": "कोई छात्र नहीं", - "@No Students": { - "description": "Text for when an observer has no students they are observing", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Tap to show student selector": "छात्र चयनकर्ता दिखाने के लिए टैप करें", - "@Tap to show student selector": { - "description": "Semantics label for the area that will show the student selector when tapped", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Tap to pair with a new student": "किसी नए छात्र के साथ जुड़ने के लिए टैप करें", - "@Tap to pair with a new student": { - "description": "Semantics label for the add student button in the student selector", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Tap to select this student": "इस छात्र को चुनने केलिए टैप करें", - "@Tap to select this student": { - "description": "Semantics label on individual students in the student switcher", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Manage Students": "छात्र प्रबंधित करें", - "@Manage Students": { - "description": "Label text for the Manage Students nav drawer button as well as the title for the Manage Students screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Help": "मदद", - "@Help": { - "description": "Label text for the help nav drawer button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Log Out": "लॉग आउट करें", - "@Log Out": { - "description": "Label text for the Log Out nav drawer button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Switch Users": "उपयोगकर्ता स्विच करें", - "@Switch Users": { - "description": "Label text for the Switch Users nav drawer button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "appVersion": "v. {version}", - "@appVersion": { - "description": "App version shown in the navigation drawer", - "type": "text", - "placeholders_order": [ - "version" - ], - "placeholders": { - "version": {} - } - }, - "Are you sure you want to log out?": "क्या आप सच में लॉग आउट होना चाहते हैं?", - "@Are you sure you want to log out?": { - "description": "Confirmation message displayed when the user tries to log out", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Calendars": "कैलेंडर", - "@Calendars": { - "description": "Label for button that lets users select which calendars to display", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "nextMonth": "अगला महीना: {month}", - "@nextMonth": { - "description": "Label for the button that switches the calendar to the next month", - "type": "text", - "placeholders_order": [ - "month" - ], - "placeholders": { - "month": {} - } - }, - "previousMonth": "पिछला महीना: {month}", - "@previousMonth": { - "description": "Label for the button that switches the calendar to the previous month", - "type": "text", - "placeholders_order": [ - "month" - ], - "placeholders": { - "month": {} - } - }, - "nextWeek": "अगला सप्ताह {date} से शुरू", - "@nextWeek": { - "description": "Label for the button that switches the calendar to the next week", - "type": "text", - "placeholders_order": [ - "date" - ], - "placeholders": { - "date": {} - } - }, - "previousWeek": "पिछला सप्ताह {date} से शुरू", - "@previousWeek": { - "description": "Label for the button that switches the calendar to the previous week", - "type": "text", - "placeholders_order": [ - "date" - ], - "placeholders": { - "date": {} - } - }, - "selectedMonthLabel": "{month} का महीना", - "@selectedMonthLabel": { - "description": "Accessibility label for the button that expands/collapses the month view", - "type": "text", - "placeholders_order": [ - "month" - ], - "placeholders": { - "month": {} - } - }, - "expand": "बढ़ाएं", - "@expand": { - "description": "Accessibility label for the on-tap hint for the button that expands/collapses the month view", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "collapse": "संक्षिप्त करें", - "@collapse": { - "description": "Accessibility label for the on-tap hint for the button that expands/collapses the month view", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "pointsPossible": "{points} पॉइंट्स संभव हैं", - "@pointsPossible": { - "description": "Screen reader label used for the points possible for an assignment, quiz, etc.", - "type": "text", - "placeholders_order": [ - "points" - ], - "placeholders": { - "points": {} - } - }, - "calendarDaySemanticsLabel": "{eventCount,plural, =1{{date}, {eventCount} घटना}other{{date}, {eventCount} घटनाएं}}", - "@calendarDaySemanticsLabel": { - "description": "Screen reader label used for calendar day, reads the date and count of events", - "type": "text", - "placeholders_order": [ - "date", - "eventCount" - ], - "placeholders": { - "date": {}, - "eventCount": {} - } - }, - "No Events Today!": "आज कोई घटना नहीं है!", - "@No Events Today!": { - "description": "Title displayed when there are no calendar events for the current day", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "It looks like a great day to rest, relax, and recharge.": "आज का दिन आराम, विश्राम करने और नई ऊर्जा पाने के लिए अच्छा लग रहा है।", - "@It looks like a great day to rest, relax, and recharge.": { - "description": "Message displayed when there are no calendar events for the current day", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading your student's calendar": "आपके छात्र के कैलेंडर को लोड करने में त्रुटि हुई", - "@There was an error loading your student's calendar": { - "description": "Message displayed when calendar events could not be loaded for the current student", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Tap to favorite the courses you want to see on the Calendar. Select up to 10.": "उन पाठ्यक्रमों को पसंदीदा बनाने के लिए टैप करें जिन्हें आप कैलेंडर पर देखना चाहते हैं। अधिकतम 10 चुनें।", - "@Tap to favorite the courses you want to see on the Calendar. Select up to 10.": { - "description": "Description text on calendar filter screen.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You may only choose 10 calendars to display": "आप प्रदर्शित करने के लिए केवल 10 कैलेंडर चुन सकते हैं", - "@You may only choose 10 calendars to display": { - "description": "Error text when trying to select more than 10 calendars", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You must select at least one calendar to display": "आपको प्रदर्शित करने के लिए कम से कम एक कैलेंडर का चयन करना होगा", - "@You must select at least one calendar to display": { - "description": "Error text when trying to de-select all calendars", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Planner Note": "योजनाकर्ता नोट", - "@Planner Note": { - "description": "Label used for notes in the planner", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Go to today": "आज पर जाएं", - "@Go to today": { - "description": "Accessibility label used for the today button in the planner", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Previous Logins": "पिछले लॉगिन", - "@Previous Logins": { - "description": "Label for the list of previous user logins", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "canvasLogoLabel": "Canvas लोगो", - "@canvasLogoLabel": { - "description": "The semantics label for the Canvas logo", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "findSchool": "स्कूल ढूंढें", - "@findSchool": { - "description": "Text for the find-my-school button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "findAnotherSchool": "कोई अन्य स्कूल ढूंढें", - "@findAnotherSchool": { - "description": "Text for the find-another-school button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "domainSearchInputHint": "स्कूल का नाम या डिस्ट्रिक्ट दर्ज करें…", - "@domainSearchInputHint": { - "description": "Input hint for the text box on the domain search screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "noDomainResults": "\"{query}\" से मेल खाते स्कूल ढूंढने में असमर्थ ", - "@noDomainResults": { - "description": "Message shown to users when the domain search query did not return any results", - "type": "text", - "placeholders_order": [ - "query" - ], - "placeholders": { - "query": {} - } - }, - "domainSearchHelpLabel": "मैं अपना स्कूल या डिस्ट्रिक्ट कैसे ढूंढूं?", - "@domainSearchHelpLabel": { - "description": "Label for the help button on the domain search screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "canvasGuides": "Canvas गाइड", - "@canvasGuides": { - "description": "Proper name for the Canvas Guides. This will be used in the domainSearchHelpBody text and will be highlighted and clickable", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "canvasSupport": "Canvas सपोर्ट", - "@canvasSupport": { - "description": "Proper name for Canvas Support. This will be used in the domainSearchHelpBody text and will be highlighted and clickable", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "domainSearchHelpBody": "आप जिस स्कूल या डिस्ट्रिक्ट को एक्सेस करने का प्रयास कर रहे हैं उसका नाम खोजने का प्रयास करें, जैसे \"Smith प्राइवेट स्कूल\" या \"Smith काउंटी स्कूल\"। आप सीधे Canvas डोमेन भी दर्ज कर सकते हैं, जैसे \"smith.instructure.com\" \n\nअपने संस्थान के Canvas खाते को खोजने के बारे में अधिक जानकारी के लिए, आप {canvasGuides} पर जा सकते हैं, {canvasSupport} से संपर्क कर सकते हैं, या सहायता के लिए अपने स्कूल से संपर्क कर सकते हैं।", - "@domainSearchHelpBody": { - "description": "The body text shown in the help dialog on the domain search screen", - "type": "text", - "placeholders_order": [ - "canvasGuides", - "canvasSupport" - ], - "placeholders": { - "canvasGuides": {}, - "canvasSupport": {} - } - }, - "Uh oh!": "उह ओह!", - "@Uh oh!": { - "description": "Title of the screen that shows when a crash has occurred", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "We’re not sure what happened, but it wasn’t good. Contact us if this keeps happening.": "हमें नहीं पता कि क्या हुआ, पर जो हुआ अच्छा नहीं था। यदि ऐसा बार-बार हो, तो हमसे संपर्क करें।", - "@We’re not sure what happened, but it wasn’t good. Contact us if this keeps happening.": { - "description": "Message shown when a crash has occurred", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Contact Support": "सपोर्ट से संपर्क करें", - "@Contact Support": { - "description": "Label for the button that allows users to contact support after a crash has occurred", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "View error details": "त्रुटि विवरण देखें", - "@View error details": { - "description": "Label for the button that allowed users to view crash details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Restart app": "ऐप फिर से शुरू करें", - "@Restart app": { - "description": "Label for the button that will restart the entire application", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Application version": "ऐप्लिकेशन संस्करण", - "@Application version": { - "description": "Label for the application version displayed in the crash details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Device model": "डिवाइस मॉडल", - "@Device model": { - "description": "Label for the device model displayed in the crash details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Android OS version": "Android OS संस्करण", - "@Android OS version": { - "description": "Label for the Android operating system version displayed in the crash details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Full error message": "पूर्ण त्रुटि संदेश", - "@Full error message": { - "description": "Label for the full error message displayed in the crash details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Inbox": "इनबॉक्स", - "@Inbox": { - "description": "Title for the Inbox screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading your inbox messages.": "आपके इनबॉक्स संदेशों को लोड करने में त्रुटि हुई।", - "@There was an error loading your inbox messages.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Subject": "कोई विषय नहीं", - "@No Subject": { - "description": "Title used for inbox messages that have no subject", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unable to fetch courses. Please check your connection and try again.": "पाठ्यक्रम प्राप्त करने में असमर्थ। कृपया अपने कनेक्शन की जांच करें और फिर से कोशिश करें।", - "@Unable to fetch courses. Please check your connection and try again.": { - "description": "Message shown when an error occured while loading courses", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Choose a course to message": "संदेश के लिए कोई पाठ्यक्रम चुनें", - "@Choose a course to message": { - "description": "Header in the course list shown when the user is choosing which course to associate with a new message", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Inbox Zero": "इनबॉक्स ज़ीरो", - "@Inbox Zero": { - "description": "Title of the message shown when there are no inbox messages", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You’re all caught up!": "आपका काम पूरा हुआ!", - "@You’re all caught up!": { - "description": "Subtitle of the message shown when there are no inbox messages", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading recipients for this course": "इस पाठ्यक्रम के लिए प्राप्तकर्ता लोड करने में त्रुटि हुई", - "@There was an error loading recipients for this course": { - "description": "Message shown when attempting to create a new message but the recipients list failed to load", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unable to send message. Check your connection and try again.": "संदेश भेजने में असमर्थ। अपने कनेक्शन की जांच करें और फिर से कोशिश करें।", - "@Unable to send message. Check your connection and try again.": { - "description": "Message show when there was an error creating or sending a new message", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unsaved changes": "बिना सहेजे गए बदलाव", - "@Unsaved changes": { - "description": "Title of the dialog shown when the user tries to leave with unsaved changes", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Are you sure you wish to close this page? Your unsent message will be lost.": "क्या आप सच में इस पेज को बंद करना चाहते हैं? आपका नहीं भेजा गया संदेश गुम हो जाएगा।", - "@Are you sure you wish to close this page? Your unsent message will be lost.": { - "description": "Body text of the dialog shown when the user tries leave with unsaved changes", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "New message": "नया संदेश", - "@New message": { - "description": "Title of the new-message screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Add attachment": "संलग्नक जोड़ें", - "@Add attachment": { - "description": "Tooltip for the add-attachment button in the new-message screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Send message": "संदेश भेजें", - "@Send message": { - "description": "Tooltip for the send-message button in the new-message screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Select recipients": "प्राप्तकर्ता चुनें", - "@Select recipients": { - "description": "Tooltip for the button that allows users to select message recipients", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No recipients selected": "कोई प्राप्तकर्ता नहीं चुना गया", - "@No recipients selected": { - "description": "Hint displayed when the user has not selected any message recipients", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Message subject": "संदेश विषय", - "@Message subject": { - "description": "Hint text displayed in the input field for the message subject", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Message": "संदेश", - "@Message": { - "description": "Hint text displayed in the input field for the message body", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Recipients": "प्राप्तकर्ता", - "@Recipients": { - "description": "Label for message recipients", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "plusRecipientCount": "+{count}", - "@plusRecipientCount": { - "description": "Shows the number of recipients that are selected but not displayed on screen.", - "type": "text", - "placeholders_order": [ - "count" - ], - "placeholders": { - "count": { - "example": 5 - } - } - }, - "Failed. Tap for options.": "विफल हुआ। विकल्पों के लिए टैप करें।", - "@Failed. Tap for options.": { - "description": "Short message shown on a message attachment when uploading has failed", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "courseForWhom": "{studentShortName} के लिए", - "@courseForWhom": { - "description": "Describes for whom a course is for (i.e. for Bill)", - "type": "text", - "placeholders_order": [ - "studentShortName" - ], - "placeholders": { - "studentShortName": {} - } - }, - "messageLinkPostscript": "इसके संबंध में: {studentName}, {linkUrl}", - "@messageLinkPostscript": { - "description": "A postscript appended to new messages that clarifies which student is the subject of the message and also includes a URL for the related Canvas component (course, assignment, event, etc).", - "type": "text", - "placeholders_order": [ - "studentName", - "linkUrl" - ], - "placeholders": { - "studentName": {}, - "linkUrl": {} - } - }, - "There was an error loading this conversation": "इस बातचीत को लोड करने में त्रुटि हुई", - "@There was an error loading this conversation": { - "description": "Message shown when a conversation fails to load", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Reply": "उत्तर दें", - "@Reply": { - "description": "Button label for replying to a conversation", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Reply All": "सभी के लिए उत्तर दें", - "@Reply All": { - "description": "Button label for replying to all conversation participants", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unknown User": "अज्ञात उपयोगकर्ता", - "@Unknown User": { - "description": "Label used where the user name is not known", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "me": "मैं", - "@me": { - "description": "First-person pronoun (i.e. 'me') that will be used in message author info, e.g. 'Me to 4 others' or 'Jon Snow to me'", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "authorToRecipient": "{authorName} से {recipientName} तक", - "@authorToRecipient": { - "description": "Author info for a single-recipient message; includes both the author name and the recipient name.", - "type": "text", - "placeholders_order": [ - "authorName", - "recipientName" - ], - "placeholders": { - "authorName": {}, - "recipientName": {} - } - }, - "authorToNOthers": "{howMany,plural, =1{{authorName} से 1 अन्य}other{{authorName} से {howMany} अन्य}}", - "@authorToNOthers": { - "description": "Author info for a mutli-recipient message; includes the author name and the number of recipients", - "type": "text", - "placeholders_order": [ - "authorName", - "howMany" - ], - "placeholders": { - "authorName": {}, - "howMany": {} - } - }, - "authorToRecipientAndNOthers": "{howMany,plural, =1{{authorName} से {recipientName} और 1 अन्य}other{{authorName} से {recipientName} और {howMany} अन्य}}", - "@authorToRecipientAndNOthers": { - "description": "Author info for a multi-recipient message; includes the author name, one recipient name, and the number of other recipients", - "type": "text", - "placeholders_order": [ - "authorName", - "recipientName", - "howMany" - ], - "placeholders": { - "authorName": {}, - "recipientName": {}, - "howMany": {} - } - }, - "Download": "डाउनलोड करें", - "@Download": { - "description": "Label for the button that will begin downloading a file", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Open with another app": "किसी अन्य ऐप से खोलें", - "@Open with another app": { - "description": "Label for the button that will allow users to open a file with another app", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There are no installed applications that can open this file": "ऐसे कोई इंस्टॉल किए गए ऐप्लिकेशन नहीं हैं जो इस फ़ाइल को खोल सकें", - "@There are no installed applications that can open this file": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unsupported File": "असमार्थित फ़ाइल", - "@Unsupported File": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "This file is unsupported and can’t be viewed through the app": "यह फ़ाइल असमर्थित है और इसे ऐप के माध्यम से नहीं देखा जा सकता है", - "@This file is unsupported and can’t be viewed through the app": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unable to play this media file": "इस मीडिया फ़ाइल को चलाने में असमर्थ", - "@Unable to play this media file": { - "description": "Message shown when audio or video media could not be played", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unable to load this image": "यह छवि लोड करने में असमर्थ", - "@Unable to load this image": { - "description": "Message shown when an image file could not be loaded or displayed", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading this file": "इस फ़ाइल को लोड करने में त्रुटि हुई", - "@There was an error loading this file": { - "description": "Message shown when a file could not be loaded or displayed", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Courses": "कोई पाठ्यक्रम नहीं", - "@No Courses": { - "description": "Title for having no courses", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Your student’s courses might not be published yet.": "हो सकता है कि आपके छात्र के पाठ्यक्रम अभी तक प्रकाशित न हुए हों।", - "@Your student’s courses might not be published yet.": { - "description": "Message for having no courses", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading your student’s courses.": "आपके छात्र के पाठ्यक्रम लोड करने में त्रुटि हुई।", - "@There was an error loading your student’s courses.": { - "description": "Message displayed when the list of student courses could not be loaded", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Grade": "कोई ग्रेड नहीं", - "@No Grade": { - "description": "Message shown when there is currently no grade available for a course", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Filter by": "इसके अनुसार फ़िल्टर करें", - "@Filter by": { - "description": "Title for list of terms to filter grades by", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Grades": "ग्रेड", - "@Grades": { - "description": "Label for the \"Grades\" tab in course details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Syllabus": "पाठ्यक्रम", - "@Syllabus": { - "description": "Label for the \"Syllabus\" tab in course details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Front Page": "मुख पृष्ठ", - "@Front Page": { - "description": "Label for the \"Front Page\" tab in course details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Summary": "संक्षिप्त विवरण", - "@Summary": { - "description": "Label for the \"Summary\" tab in course details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Send a message about this course": "इस पाठ्यक्रम के बारे में संदेश भेजें", - "@Send a message about this course": { - "description": "Accessibility hint for the course messaage floating action button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Total Grade": "कुल ग्रेड", - "@Total Grade": { - "description": "Label for the total grade in the course", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Graded": "ग्रेड किए गए", - "@Graded": { - "description": "Label for assignments that have been graded", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Submitted": "सबमिट किया गया", - "@Submitted": { - "description": "Label for assignments that have been submitted", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Not Submitted": "सबमिट नहीं किया गया", - "@Not Submitted": { - "description": "Label for assignments that have not been submitted", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Late": "विलंब", - "@Late": { - "description": "Label for assignments that have been marked late or submitted late", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Missing": "लापता", - "@Missing": { - "description": "Label for assignments that have been marked missing or are not submitted and past the due date", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "-": "-", - "@-": { - "description": "Value representing no score for student submission", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "All Grading Periods": "सभी ग्रेडिंग अवधियां", - "@All Grading Periods": { - "description": "Label for selecting all grading periods", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Assignments": "कोई असाइनमेंट नहीं", - "@No Assignments": { - "description": "Title for the no assignments message", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "It looks like assignments haven't been created in this space yet.": "लगता है इस खाली स्थान में अभी तक कोई असाइनमेंट नहीं बनाई गई है।", - "@It looks like assignments haven't been created in this space yet.": { - "description": "Message for no assignments", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading the summary details for this course.": "इस पाठ्यक्रम के लिए संक्षिप्त विवरण लोड करने में त्रुटि हुई।", - "@There was an error loading the summary details for this course.": { - "description": "Message shown when the course summary could not be loaded", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Summary": "कोई संक्षिप्त विवरण नहीं", - "@No Summary": { - "description": "Title displayed when there are no items in the course summary", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "This course does not have any assignments or calendar events yet.": "इस पाठ्यक्रम में अभी तक कोई असाइनमेंट या कैलेंडर घटना नहीं है।", - "@This course does not have any assignments or calendar events yet.": { - "description": "Message displayed when there are no items in the course summary", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "gradeFormatScoreOutOfPointsPossible": "{score} / {pointsPossible}", - "@gradeFormatScoreOutOfPointsPossible": { - "description": "Formatted string for a student score out of the points possible", - "type": "text", - "placeholders_order": [ - "score", - "pointsPossible" - ], - "placeholders": { - "score": {}, - "pointsPossible": {} - } - }, - "contentDescriptionScoreOutOfPointsPossible": "{pointsPossible} में से {score} पॉइंट्स", - "@contentDescriptionScoreOutOfPointsPossible": { - "description": "Formatted string for a student score out of the points possible", - "type": "text", - "placeholders_order": [ - "score", - "pointsPossible" - ], - "placeholders": { - "score": {}, - "pointsPossible": {} - } - }, - "gradesSubjectMessage": "इसके संबंध में: {studentName}, ग्रेड", - "@gradesSubjectMessage": { - "description": "The subject line for a message to a teacher regarding a student's grades", - "type": "text", - "placeholders_order": [ - "studentName" - ], - "placeholders": { - "studentName": {} - } - }, - "syllabusSubjectMessage": "इसके संबंध में: {studentName}, पाठ्यक्रम", - "@syllabusSubjectMessage": { - "description": "The subject line for a message to a teacher regarding a course syllabus", - "type": "text", - "placeholders_order": [ - "studentName" - ], - "placeholders": { - "studentName": {} - } - }, - "frontPageSubjectMessage": "इसके संबंध में: {studentName}, मुख पृष्ठ", - "@frontPageSubjectMessage": { - "description": "The subject line for a message to a teacher regarding a course front page", - "type": "text", - "placeholders_order": [ - "studentName" - ], - "placeholders": { - "studentName": {} - } - }, - "assignmentSubjectMessage": "इसके संबंध में: {studentName}, असाइनमेंट - {assignmentName}", - "@assignmentSubjectMessage": { - "description": "The subject line for a message to a teacher regarding a student's assignment", - "type": "text", - "placeholders_order": [ - "studentName", - "assignmentName" - ], - "placeholders": { - "studentName": {}, - "assignmentName": {} - } - }, - "eventSubjectMessage": "इसके संबंध में: {studentName}, घटना - {eventTitle}", - "@eventSubjectMessage": { - "description": "The subject line for a message to a teacher regarding a calendar event", - "type": "text", - "placeholders_order": [ - "studentName", - "eventTitle" - ], - "placeholders": { - "studentName": {}, - "eventTitle": {} - } - }, - "There is no page information available.": "पेज की कोई जानकारी उपलब्ध नहीं है।", - "@There is no page information available.": { - "description": "Description for when no page information is available", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Assignment Details": "असाइनमेंट विवरण", - "@Assignment Details": { - "description": "Title for the page that shows details for an assignment", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "assignmentTotalPoints": "{points} पॉइंट्स", - "@assignmentTotalPoints": { - "description": "Label used for the total points the assignment is worth", - "type": "text", - "placeholders_order": [ - "points" - ], - "placeholders": { - "points": {} - } - }, - "assignmentTotalPointsAccessible": "{points} पॉइंट्स", - "@assignmentTotalPointsAccessible": { - "description": "Screen reader label used for the total points the assignment is worth", - "type": "text", - "placeholders_order": [ - "points" - ], - "placeholders": { - "points": {} - } - }, - "Due": "नियत", - "@Due": { - "description": "Label for an assignment due date", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Grade": "ग्रेड", - "@Grade": { - "description": "Label for the section that displays an assignment's grade", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Locked": "लॉक किया गया", - "@Locked": { - "description": "Label for when an assignment is locked", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "assignmentLockedModule": "यह असाइनमेंट \"{moduleName}\" मॉड्यूल द्वारा लॉक की गई है।", - "@assignmentLockedModule": { - "description": "The locked description when an assignment is locked by a module", - "type": "text", - "placeholders_order": [ - "moduleName" - ], - "placeholders": { - "moduleName": {} - } - }, - "Remind Me": "मुझे याद दिलाएं", - "@Remind Me": { - "description": "Label for the row to set reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Set a date and time to be notified of this specific assignment.": "इस विशिष्ट असाइनमेंट की सूचना पाने के लिए कोई तिथि और समय निर्धारित करें।", - "@Set a date and time to be notified of this specific assignment.": { - "description": "Description for row to set reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You will be notified about this assignment on…": "आपको इस असाइनमेंट के बारे में सूचित किया जाएगा...", - "@You will be notified about this assignment on…": { - "description": "Description for when a reminder is set", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Instructions": "निर्देश", - "@Instructions": { - "description": "Label for the description of the assignment when it has quiz instructions", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Send a message about this assignment": "इस असाइनमेंट के बारे में संदेश भेजें", - "@Send a message about this assignment": { - "description": "Accessibility hint for the assignment messaage floating action button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "This app is not authorized for use.": "यह ऐप उपयोग के लिए अधिकृत नहीं है।", - "@This app is not authorized for use.": { - "description": "The error shown when the app being used is not verified by Canvas", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The server you entered is not authorized for this app.": "आपके द्वारा दर्ज किया गया सर्वर इस ऐप के लिए अधिकृत नहीं है।", - "@The server you entered is not authorized for this app.": { - "description": "The error shown when the desired login domain is not verified by Canvas", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The user agent for this app is not authorized.": "इस ऐप के लिए उपयोगकर्ता एजेंट अधिकृत नहीं है।", - "@The user agent for this app is not authorized.": { - "description": "The error shown when the user agent during verification is not verified by Canvas", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "We were unable to verify the server for use with this app.": "हम इस ऐप के उपयोग के लिए सर्वर को सत्यापित करने में असमर्थ थे।", - "@We were unable to verify the server for use with this app.": { - "description": "The generic error shown when we are unable to verify with Canvas", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Reminders": "अनुस्मारक", - "@Reminders": { - "description": "Name of the system notification channel for assignment and event reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Notifications for reminders about assignments and calendar events": "असाइनमेंट और कैलेंडर घटना के बारे में अनुस्मारक के लिए सूचनाएं", - "@Notifications for reminders about assignments and calendar events": { - "description": "Description of the system notification channel for assignment and event reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Reminders have changed!": "अनुस्मारक बदल गए हैं!", - "@Reminders have changed!": { - "description": "Title of the dialog shown when the user needs to update their reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "In order to provide you with a better experience, we have updated how reminders work. You can add new reminders by viewing an assignment or calendar event and tapping the switch under the \"Remind Me\" section. \n\nBe aware that any reminders created with older versions of this app will not be compatible with the new changes and you will need to create them again.": "आपके अनुभव को बेहतर बनाने के लिए, हमने अनुस्मारक की कार्यक्षमता को उन्नत किया है। आप किसी असाइनमेंट या कैलेंडर घटना को देखकर और \"मुझे याद दिलाएं\" अनुभाग के अंतर्गत स्विच को टैप करके नए अनुस्मारक जोड़ सकते हैं।\n\nध्यान रखें कि इस ऐप के पुराने संस्करणों के साथ बनाया गया कोई भी अनुस्मारक नए परिवर्तनों के साथ संगत नहीं होगा और आपको उन्हें फिर से बनाने की आवश्यकता होगी।", - "@In order to provide you with a better experience, we have updated how reminders work. You can add new reminders by viewing an assignment or calendar event and tapping the switch under the \"Remind Me\" section.\n\nBe aware that any reminders created with older versions of this app will not be compatible with the new changes and you will need to create them again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Not a parent?": "माता-पिता नहीं है?", - "@Not a parent?": { - "description": "Title for the screen that shows when the user is not observing any students", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "We couldn't find any students associated with this account": "हमें इस खाते से जुड़ा कोई भी छात्र नहीं मिला", - "@We couldn't find any students associated with this account": { - "description": "Subtitle for the screen that shows when the user is not observing any students", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Are you a student or teacher?": "कआप छात्र हैं या शिक्षक हैं?", - "@Are you a student or teacher?": { - "description": "Label for button that will show users the option to view other Canvas apps in the Play Store", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "One of our other apps might be a better fit. Tap one to visit the Play Store.": "हमारा एक अन्य ऐप संभावित रूप से आपकी आवश्यकताओं को बेहतर ढंग से पूरा कर सकता है। प्ले स्टोर पर जाने के लिए टैप करें।", - "@One of our other apps might be a better fit. Tap one to visit the Play Store.": { - "description": "Description of options to view other Canvas apps in the Play Store", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Return to Login": "लॉगिन पर वापस जाएं", - "@Return to Login": { - "description": "Label for the button that returns the user to the login screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "STUDENT": "छात्र", - "@STUDENT": { - "description": "The \"student\" portion of the \"Canvas Student\" app name, in all caps. \"Canvas\" is excluded in this context as it will be displayed to the user as a wordmark image", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "TEACHER": "शिक्षक", - "@TEACHER": { - "description": "The \"teacher\" portion of the \"Canvas Teacher\" app name, in all caps. \"Canvas\" is excluded in this context as it will be displayed to the user as a wordmark image", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Canvas Student": "Canvas छात्र", - "@Canvas Student": { - "description": "The name of the Canvas Student app. Only \"Student\" should be translated as \"Canvas\" is a brand name in this context and should not be translated.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Canvas Teacher": "Canvas शिक्षक", - "@Canvas Teacher": { - "description": "The name of the Canvas Teacher app. Only \"Teacher\" should be translated as \"Canvas\" is a brand name in this context and should not be translated.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Alerts": "कोई चेतावनी नहीं", - "@No Alerts": { - "description": "The title for the empty message to show to users when there are no alerts for the student.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There’s nothing to be notified of yet.": "अभी तक सूचित करने लायक कुछ भी नहीं है।", - "@There’s nothing to be notified of yet.": { - "description": "The empty message to show to users when there are no alerts for the student.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "dismissAlertLabel": "{alertTitle} खारिज करें", - "@dismissAlertLabel": { - "description": "Accessibility label to dismiss an alert", - "type": "text", - "placeholders_order": [ - "alertTitle" - ], - "placeholders": { - "alertTitle": {} - } - }, - "Course Announcement": "पाठ्यक्रम की घोषणा", - "@Course Announcement": { - "description": "Title for alerts when there is a course announcement", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Institution Announcement": "संस्थान की घोषणा", - "@Institution Announcement": { - "description": "Title for alerts when there is an institution announcement", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "assignmentGradeAboveThreshold": "{threshold} से ऊपर का असाइनमेंट ग्रेड", - "@assignmentGradeAboveThreshold": { - "description": "Title for alerts when an assignment grade is above the threshold value", - "type": "text", - "placeholders_order": [ - "threshold" - ], - "placeholders": { - "threshold": {} - } - }, - "assignmentGradeBelowThreshold": "{threshold} से नीचे का असाइनमेंट ग्रेड", - "@assignmentGradeBelowThreshold": { - "description": "Title for alerts when an assignment grade is below the threshold value", - "type": "text", - "placeholders_order": [ - "threshold" - ], - "placeholders": { - "threshold": {} - } - }, - "courseGradeAboveThreshold": "{threshold} से ऊपर का पाठ्यक्रम ग्रेड", - "@courseGradeAboveThreshold": { - "description": "Title for alerts when a course grade is above the threshold value", - "type": "text", - "placeholders_order": [ - "threshold" - ], - "placeholders": { - "threshold": {} - } - }, - "courseGradeBelowThreshold": "{threshold} से नीचे का पाठ्यक्रम ग्रेड", - "@courseGradeBelowThreshold": { - "description": "Title for alerts when a course grade is below the threshold value", - "type": "text", - "placeholders_order": [ - "threshold" - ], - "placeholders": { - "threshold": {} - } - }, - "Settings": "सेटिंग्स", - "@Settings": { - "description": "Title for the settings screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Theme": "थीम", - "@Theme": { - "description": "Label for the light/dark theme section in the settings page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Dark Mode": "डार्क मोड", - "@Dark Mode": { - "description": "Label for the button that enables dark mode", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Light Mode": "लाइट मोड", - "@Light Mode": { - "description": "Label for the button that enables light mode", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "High Contrast Mode": "हाई कंट्रास्ट मोड", - "@High Contrast Mode": { - "description": "Label for the switch that toggles high contrast mode", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Use Dark Theme in Web Content": "वेब सामग्री में डार्क थीम का उपयोग करें", - "@Use Dark Theme in Web Content": { - "description": "Label for the switch that toggles dark mode for webviews", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Appearance": "दिखावट", - "@Appearance": { - "description": "Label for the appearance section in the settings page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Successfully submitted!": "सफलतापूर्वक सबमिट किया गया!", - "@Successfully submitted!": { - "description": "Title displayed in the grade cell for an assignment that has been submitted", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "submissionStatusSuccessSubtitle": "यह असाइनमेंट {date} को {time} बजे सबमिट की गई थी और ग्रेड होने की प्रतीक्षा कर रही है", - "@submissionStatusSuccessSubtitle": { - "description": "Subtitle displayed in the grade cell for an assignment that has been submitted and is awaiting a grade", - "type": "text", - "placeholders_order": [ - "date", - "time" - ], - "placeholders": { - "date": {}, - "time": {} - } - }, - "outOfPoints": "{howMany,plural, =1{1 पॉइंट में से}other{{points} पॉइंट्स में से}}", - "@outOfPoints": { - "description": "Description for an assignment grade that has points without a current scoroe", - "type": "text", - "placeholders_order": [ - "points", - "howMany" - ], - "placeholders": { - "points": {}, - "howMany": {} - } - }, - "Excused": "माफ़ किया", - "@Excused": { - "description": "Grading status for an assignment marked as excused", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Complete": "पूरा हुआ", - "@Complete": { - "description": "Grading status for an assignment marked as complete", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Incomplete": "अधूरा", - "@Incomplete": { - "description": "Grading status for an assignment marked as incomplete", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "minus": "ऋण", - "@minus": { - "description": "Screen reader-friendly replacement for the \"-\" character in letter grades like \"A-\"", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "latePenalty": "विलंब दंड (-{pointsLost})", - "@latePenalty": { - "description": "Text displayed when a late penalty has been applied to the assignment", - "type": "text", - "placeholders_order": [ - "pointsLost" - ], - "placeholders": { - "pointsLost": {} - } - }, - "finalGrade": "अंतिम ग्रेड: {grade}", - "@finalGrade": { - "description": "Text that displays the final grade of an assignment", - "type": "text", - "placeholders_order": [ - "grade" - ], - "placeholders": { - "grade": {} - } - }, - "Alert Settings": "चेतावनी की सेटिंग्स", - "@Alert Settings": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Alert me when…": "मुझे चेतावनी दें जब…", - "@Alert me when…": { - "description": "Header for the screen where the observer chooses the thresholds that will determine when they receive alerts (e.g. when an assignment is graded below 70%)", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Course grade below": "इससे नीचे का पाठ्यक्रम ग्रेड:", - "@Course grade below": { - "description": "Label describing the threshold for when the course grade is below a certain percentage", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Course grade above": "इससे ऊपर का पाठ्यक्रम ग्रेड: ", - "@Course grade above": { - "description": "Label describing the threshold for when the course grade is above a certain percentage", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Assignment missing": "असाइनमेंट लापता है", - "@Assignment missing": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Assignment grade below": "इससे नीचे का असाइनमेंट ग्रेड:", - "@Assignment grade below": { - "description": "Label describing the threshold for when an assignment is graded below a certain percentage", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Assignment grade above": "इससे ऊपर का असाइनमेंट ग्रेड:", - "@Assignment grade above": { - "description": "Label describing the threshold for when an assignment is graded above a certain percentage", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Course Announcements": "पाठ्यक्रम घोषणाएं", - "@Course Announcements": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Institution Announcements": "संस्थान की घोषणाएं", - "@Institution Announcements": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Never": "कभी नहीं", - "@Never": { - "description": "Indication that tells the user they will not receive alert notifications of a specific kind", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Grade percentage": "ग्रेड प्रतिशत", - "@Grade percentage": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading your student's alerts.": "आपके छात्र की चेतावनियां लोड करने में त्रुटि हुई।", - "@There was an error loading your student's alerts.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Must be below 100": "100 से कम होना चाहिए", - "@Must be below 100": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "mustBeBelowN": "{percentage} से कम होना चाहिए", - "@mustBeBelowN": { - "description": "Validation error to the user that they must choose a percentage below 'n'", - "type": "text", - "placeholders_order": [ - "percentage" - ], - "placeholders": { - "percentage": { - "example": 5 - } - } - }, - "mustBeAboveN": "{percentage} से ऊपर होना चाहिए", - "@mustBeAboveN": { - "description": "Validation error to the user that they must choose a percentage above 'n'", - "type": "text", - "placeholders_order": [ - "percentage" - ], - "placeholders": { - "percentage": { - "example": 5 - } - } - }, - "Select Student Color": "छात्र रंग का चयन करें", - "@Select Student Color": { - "description": "Title for screen that allows users to assign a color to a specific student", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Electric, blue": "इलेक्ट्रिक, नीला", - "@Electric, blue": { - "description": "Name of the Electric (blue) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Plum, Purple": "प्लम, बैंगनी", - "@Plum, Purple": { - "description": "Name of the Plum (purple) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Barney, Fuschia": "बार्नी, रानी गुलाबी", - "@Barney, Fuschia": { - "description": "Name of the Barney (fuschia) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Raspberry, Red": "रास्पबेरी, लाल", - "@Raspberry, Red": { - "description": "Name of the Raspberry (red) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Fire, Orange": "आग, नारंगी", - "@Fire, Orange": { - "description": "Name of the Fire (orange) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Shamrock, Green": "शैमरॉक, हरा", - "@Shamrock, Green": { - "description": "Name of the Shamrock (green) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "An error occurred while saving your selection. Please try again.": "आपका चयन सहेजते समय त्रुटि उत्पन्न हुई। कृपया फिर से कोशिश करें।", - "@An error occurred while saving your selection. Please try again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "changeStudentColorLabel": "{studentName} के लिए रंग बदलें", - "@changeStudentColorLabel": { - "description": "Accessibility label for the button that lets users change the color associated with a specific student", - "type": "text", - "placeholders_order": [ - "studentName" - ], - "placeholders": { - "studentName": {} - } - }, - "Teacher": "शिक्षक", - "@Teacher": { - "description": "Label for the Teacher enrollment type", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Student": "छात्र", - "@Student": { - "description": "Label for the Student enrollment type", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "TA": "TA", - "@TA": { - "description": "Label for the Teaching Assistant enrollment type (also known as Teacher Aid or Education Assistant), reduced to a short acronym/initialism if appropriate.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Observer": "समीक्षक", - "@Observer": { - "description": "Label for the Observer enrollment type", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Use Camera": "कैमरे का उपयोग करें", - "@Use Camera": { - "description": "Label for the action item that lets the user capture a photo using the device camera", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Upload File": "फ़ाइल अपलोड करें", - "@Upload File": { - "description": "Label for the action item that lets the user upload a file from their device", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Choose from Gallery": "गैलरी से चुनें", - "@Choose from Gallery": { - "description": "Label for the action item that lets the user select a photo from their device gallery", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Preparing…": "तैयार किया जा रहा है…", - "@Preparing…": { - "description": "Message shown while a file is being prepared to attach to a message", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Add student with…": "छात्र को इसके साथ जोड़ें...", - "@Add student with…": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Add Student": "छात्र जोड़ें", - "@Add Student": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You are not observing any students.": "आप किसी भी छात्र की समीक्षा नहीं कर रहे हैं।", - "@You are not observing any students.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading your students.": "आपके छात्रों को लोड करने में त्रुटि हुई।", - "@There was an error loading your students.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Pairing Code": "पेयरिंग कोड", - "@Pairing Code": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Students can obtain a pairing code through the Canvas website": "छात्र Canvas वेबसाइट के माध्यम से पेयरिंग कोड प्राप्त कर सकते हैं", - "@Students can obtain a pairing code through the Canvas website": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Enter the student pairing code provided to you. If the pairing code doesn't work, it may have expired": "आपको प्रदान किया गया छात्र पेयरिंग कोड दर्ज करें। यदि पेयरिंग कोड काम नहीं करता है, तो हो सकता है वह समाप्त हो गया हो", - "@Enter the student pairing code provided to you. If the pairing code doesn't work, it may have expired": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Your code is incorrect or expired.": "आपका कोड गलत है या समाप्त हो गया है।", - "@Your code is incorrect or expired.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Something went wrong trying to create your account, please reach out to your school for assistance.": "अपना खाता बनाने की कोशिश में कुछ गलत हो गया, कृपया सहायता के लिए अपने स्कूल से संपर्क करें।", - "@Something went wrong trying to create your account, please reach out to your school for assistance.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "QR Code": "QR कोड", - "@QR Code": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Students can create a QR code using the Canvas Student app on their mobile device": "छात्र अपने मोबाइल डिवाइस पर Canvas छात्र ऐप का उपयोग करके QR कोड बना सकते हैं", - "@Students can create a QR code using the Canvas Student app on their mobile device": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Add new student": "नया छात्र जोड़ें", - "@Add new student": { - "description": "Semantics label for the FAB on the Manage Students Screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Select": "चयन करें", - "@Select": { - "description": "Hint text to tell the user to choose one of two options", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I have a Canvas account": "मेरे पास Canvas खाता है", - "@I have a Canvas account": { - "description": "Option to select for users that have a canvas account", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I don't have a Canvas account": "मेरे पास Canvas खाता नहीं है", - "@I don't have a Canvas account": { - "description": "Option to select for users that don't have a canvas account", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Create Account": "खाता बनाएं", - "@Create Account": { - "description": "Button text for account creation confirmation", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Full Name": "पूरा नाम", - "@Full Name": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Email Address": "ईमेल पता", - "@Email Address": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Password": "पासवर्ड", - "@Password": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Full Name…": "पूरा नाम…", - "@Full Name…": { - "description": "hint label for inside form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Email…": "ईमेल…", - "@Email…": { - "description": "hint label for inside form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Password…": "पासवर्ड…", - "@Password…": { - "description": "hint label for inside form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Please enter full name": "कृपया पूरा नाम दर्ज करें", - "@Please enter full name": { - "description": "Error message for form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Please enter an email address": "कृपया ईमेल पता दर्ज करें", - "@Please enter an email address": { - "description": "Error message for form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Please enter a valid email address": "कृपया मान्य ईमेल पता दर्ज करें", - "@Please enter a valid email address": { - "description": "Error message for form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Password is required": "पासवर्ड की आवश्यकता है", - "@Password is required": { - "description": "Error message for form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Password must contain at least 8 characters": "पासवर्ड में कम से कम 8 कैरेक्टर होने चाहिए", - "@Password must contain at least 8 characters": { - "description": "Error message for form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "qrCreateAccountTos": "'खाता बनाएं' पर टैप करके, आप {termsOfService} से सहमत होते हैं और {privacyPolicy} को स्वीकार करते हैं", - "@qrCreateAccountTos": { - "description": "The text show on the account creation screen", - "type": "text", - "placeholders_order": [ - "termsOfService", - "privacyPolicy" - ], - "placeholders": { - "termsOfService": {}, - "privacyPolicy": {} - } - }, - "Terms of Service": "सेवा की शर्तें", - "@Terms of Service": { - "description": "Label for the Canvas Terms of Service agreement. This will be used in the qrCreateAccountTos text and will be highlighted and clickable", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Privacy Policy": "गोपनीयता नीति", - "@Privacy Policy": { - "description": "Label for the Canvas Privacy Policy agreement. This will be used in the qrCreateAccountTos text and will be highlighted and clickable", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "View the Privacy Policy": "गोपनीयता नीति देखें", - "@View the Privacy Policy": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Already have an account? ": "पहले से कोई खाता है? ", - "@Already have an account? ": { - "description": "Part of multiline text span, includes AccountSignIn1-2, in that order", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Sign In": "साइन इन करें", - "@Sign In": { - "description": "Part of multiline text span, includes AccountSignIn1-2, in that order", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Hide Password": "पासवर्ड छिपाएं", - "@Hide Password": { - "description": "content description for password hide button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Show Password": "पासवर्ड दिखाएं", - "@Show Password": { - "description": "content description for password show button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Terms of Service Link": "सेवा की शर्तें लिंक", - "@Terms of Service Link": { - "description": "content description for terms of service link", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Privacy Policy Link": "गोपनीयता नीति लिंक", - "@Privacy Policy Link": { - "description": "content description for privacy policy link", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Event": "घटना", - "@Event": { - "description": "Title for the event details screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Date": "तिथि", - "@Date": { - "description": "Label for the event date", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Location": "लोकेशन", - "@Location": { - "description": "Label for the location information", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Location Specified": "कोई लोकेशन निर्दिष्ट नहीं", - "@No Location Specified": { - "description": "Description for events that do not have a location", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "eventTime": "{startAt} - {endAt}", - "@eventTime": { - "description": "The time the event is happening, example: \"2:00 pm - 4:00 pm\"", - "type": "text", - "placeholders_order": [ - "startAt", - "endAt" - ], - "placeholders": { - "startAt": {}, - "endAt": {} - } - }, - "Set a date and time to be notified of this event.": "इस घटना की सूचना पाने के लिए कोई तिथि और समय निर्धारित करें।", - "@Set a date and time to be notified of this event.": { - "description": "Description for row to set event reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You will be notified about this event on…": "आपको इस घटना के बारे में सूचित किया जाएगा...", - "@You will be notified about this event on…": { - "description": "Description for when an event reminder is set", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Share Your Love for the App": "ऐप के लिए अपना प्यार साझा करें", - "@Share Your Love for the App": { - "description": "Label for option to open the app store", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Tell us about your favorite parts of the app": "हमें ऐप के अपने पसंदीदा हिस्सों के बारे में बताएं", - "@Tell us about your favorite parts of the app": { - "description": "Description for option to open the app store", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Legal": "कानूनी", - "@Legal": { - "description": "Label for legal information option", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Privacy policy, terms of use, open source": "गोपनीयता नीति, उपयोग की शर्तें, ओपन सोर्स", - "@Privacy policy, terms of use, open source": { - "description": "Description for legal information option", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Idea for Canvas Parent App [Android]": "Canvas माता-पिता ऐप [Android] के लिए आइडिया", - "@Idea for Canvas Parent App [Android]": { - "description": "The subject for the email to request a feature", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The following information will help us better understand your idea:": "निम्नलिखित जानकारी हमें आपके आइडिया को बेहतर ढंग से समझने में मदद करेगी:", - "@The following information will help us better understand your idea:": { - "description": "The header for the users information that is attached to a feature request", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Domain:": "डोमेन:", - "@Domain:": { - "description": "The label for the Canvas domain of the logged in user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "User ID:": "उपयोगकर्ता आईडी:", - "@User ID:": { - "description": "The label for the Canvas user ID of the logged in user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Email:": "ईमेल:", - "@Email:": { - "description": "The label for the eamil of the logged in user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Locale:": "स्थान:", - "@Locale:": { - "description": "The label for the locale of the logged in user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Terms of Use": "उपयोग की शर्तें", - "@Terms of Use": { - "description": "Label for the terms of use", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Canvas on GitHub": "GitHub पर Canvas", - "@Canvas on GitHub": { - "description": "Label for the button that opens the Canvas project on GitHub's website", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was a problem loading the Terms of Use": "उपयोग की शर्तों को लोड करने में समस्या आई", - "@There was a problem loading the Terms of Use": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Device": "डिवाइस", - "@Device": { - "description": "Label used for device manufacturer/model in the error report", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "OS Version": "OS संस्करण", - "@OS Version": { - "description": "Label used for device operating system version in the error report", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Version Number": "संस्करण संख्या", - "@Version Number": { - "description": "Label used for the app version number in the error report", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Report A Problem": "समस्या की रिपोर्ट करें", - "@Report A Problem": { - "description": "Title used for generic dialog to report problems", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Subject": "विषय", - "@Subject": { - "description": "Label used for Subject text field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "A subject is required.": "विषय की आवश्यकता है।", - "@A subject is required.": { - "description": "Error shown when the subject field is empty", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "An email address is required.": "ईमेल पता आवश्यक है।", - "@An email address is required.": { - "description": "Error shown when the email field is empty", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Description": "विवरण", - "@Description": { - "description": "Label used for Description text field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "A description is required.": "विवरण आवश्यक है।", - "@A description is required.": { - "description": "Error shown when the description field is empty", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "How is this affecting you?": "इसका आप पर क्या प्रभाव पड़ रहा है?", - "@How is this affecting you?": { - "description": "Label used for the dropdown to select how severe the issue is", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "send": "भेजें", - "@send": { - "description": "Label used for send button when reporting a problem", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Just a casual question, comment, idea, suggestion…": "बस एक अनौपचारिक प्रश्न, टिप्पणी, आइडिया, सुझाव...", - "@Just a casual question, comment, idea, suggestion…": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I need some help but it's not urgent.": "मुझे कुछ मदद की ज़रूरत है, लेकिन यह अत्यावश्यक नहीं है।", - "@I need some help but it's not urgent.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Something's broken but I can work around it to get what I need done.": "एक समस्या है, लेकिन काम को पूरा करने के लिए कोई समाधान निकाल लिया जाएगा।", - "@Something's broken but I can work around it to get what I need done.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I can't get things done until I hear back from you.": "जब तक आपसे प्रतिक्रिया नहीं मिल जाती, काम पूरा नहीं किया जा सकता।", - "@I can't get things done until I hear back from you.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "EXTREME CRITICAL EMERGENCY!!": "अत्यधिक गंभीर आपातकालीन स्थिति!!", - "@EXTREME CRITICAL EMERGENCY!!": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Not Graded": "ग्रेड नहीं किया गया", - "@Not Graded": { - "description": "Description for an assignment has not been graded.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Login flow: Normal": "लॉगिन प्रवाह: सामान्य", - "@Login flow: Normal": { - "description": "Description for the normal login flow", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Login flow: Canvas": "लॉगिन प्रवाह: Canvas", - "@Login flow: Canvas": { - "description": "Description for the Canvas login flow", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Login flow: Site Admin": "लॉगिन प्रवाह: साइट व्यवस्थापक", - "@Login flow: Site Admin": { - "description": "Description for the Site Admin login flow", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Login flow: Skip mobile verify": "लॉगिन प्रवाह: मोबाइल सत्यापन छोड़ें", - "@Login flow: Skip mobile verify": { - "description": "Description for the login flow that skips domain verification for mobile", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Act As User": "उपयोगकर्ता के रूप में कार्य करें", - "@Act As User": { - "description": "Label for the button that allows the user to act (masquerade) as another user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Stop Acting as User": "उपयोगकर्ता के रूप में कार्य करना बंद करें", - "@Stop Acting as User": { - "description": "Label for the button that allows the user to stop acting (masquerading) as another user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "actingAsUser": "आप {userName} के रूप में कार्य कर रहे हैं", - "@actingAsUser": { - "description": "Message shown while acting (masquerading) as another user", - "type": "text", - "placeholders_order": [ - "userName" - ], - "placeholders": { - "userName": {} - } - }, - "\"Act as\" is essentially logging in as this user without a password. You will be able to take any action as if you were this user, and from other users' points of views, it will be as if this user performed them. However, audit logs record that you were the one who performed the actions on behalf of this user.": "\"इस रूप में कार्य करें\" अनिवार्य रूप से बिना पासवर्ड के इस उपयोगकर्ता के रूप में लॉग इन करना है। आपके पास ऐसे कार्य करने की क्षमता होगी जैसे कि आप यह उपयोगकर्ता थे, और अन्य उपयोगकर्ताओं को ऐसा प्रतीत होगा जैसे कि इस उपयोगकर्ता ने कार्य किए हैं। हालांकि, ऑडिट लॉग रिकॉर्ड बताते हैं कि वो आप ही थे जिन्होंने इस उपयोगकर्ता की ओर से कार्रवाई की थी।", - "@\"Act as\" is essentially logging in as this user without a password. You will be able to take any action as if you were this user, and from other users' points of views, it will be as if this user performed them. However, audit logs record that you were the one who performed the actions on behalf of this user.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Domain": "डोमेन", - "@Domain": { - "description": "Text field hint for domain url input", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You must enter a valid domain": "आपको कोई मान्य डोमेन दर्ज करना चाहिए", - "@You must enter a valid domain": { - "description": "Message displayed for domain input error", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "User ID": "उपयोगकर्ता आईडी", - "@User ID": { - "description": "Text field hint for user ID input", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You must enter a user id": "आपको उपयोगकर्ता आईडी दर्ज करनी चाहिए", - "@You must enter a user id": { - "description": "Message displayed for user Id input error", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error trying to act as this user. Please check the Domain and User ID and try again.": "इस उपयोगकर्ता के रूप में कार्य करने का प्रयास करते समय त्रुटि हुई। कृपया डोमेन और उपयोगकर्ता आईडी की जांच करें और फिर से कोशिश करें।", - "@There was an error trying to act as this user. Please check the Domain and User ID and try again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "endMasqueradeMessage": "आप {userName} के रूप में कार्य करना बंद कर देंगे और अपने मूल खाते में वापस आ जाएंगे।", - "@endMasqueradeMessage": { - "description": "Confirmation message displayed when the user wants to stop acting (masquerading) as another user", - "type": "text", - "placeholders_order": [ - "userName" - ], - "placeholders": { - "userName": {} - } - }, - "endMasqueradeLogoutMessage": "आप {userName} के रूप में कार्य करना बंद कर देंगे और आपको लॉग आउट कर दिया जाएगा।", - "@endMasqueradeLogoutMessage": { - "description": "Confirmation message displayed when the user wants to stop acting (masquerading) as another user and will be logged out.", - "type": "text", - "placeholders_order": [ - "userName" - ], - "placeholders": { - "userName": {} - } - }, - "How are we doing?": "हमारा कार्य कैसा चल रहा है?", - "@How are we doing?": { - "description": "Title for dialog asking user to rate the app out of 5 stars.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Don't show again": "फिर से न दिखाएं", - "@Don't show again": { - "description": "Button to prevent the rating dialog from showing again.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "What can we do better?": "हम क्या बेहतर कर सकते हैं?", - "@What can we do better?": { - "description": "Hint text for providing a comment with the rating.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Send Feedback": "फ़ीडबैक भेजें", - "@Send Feedback": { - "description": "Button to send rating with feedback", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "ratingDialogEmailSubject": "Android - Canvas Parent {version} के लिए सुझाव", - "@ratingDialogEmailSubject": { - "description": "The subject for an email to provide feedback for CanvasParent.", - "type": "text", - "placeholders_order": [ - "version" - ], - "placeholders": { - "version": {} - } - }, - "starRating": "{position,plural, =1{{position} तारा}other{{position} तारे}}", - "@starRating": { - "description": "Accessibility label for the 1 stars to 5 stars rating", - "type": "text", - "placeholders_order": [ - "position" - ], - "placeholders": { - "position": { - "example": 1 - } - } - }, - "Student Pairing": "छात्र पेयरिंग", - "@Student Pairing": { - "description": "Title for the screen where users can pair to students using a QR code", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Open Canvas Student": "Canvas Student खोलें", - "@Open Canvas Student": { - "description": "Title for QR pairing tutorial screen instructing users to open the Canvas Student app", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You'll need to open your student's Canvas Student app to continue. Go into Main Menu > Settings > Pair with Observer and scan the QR code you see there.": "जारी रखने के लिए आपको अपने छात्र का Canvas Student ऐप खोलना होगा। मुख्य मेनू > सेटिंग्स > समीक्षक के साथ पेयर करें में जाएं और वहां दिखाई देने वाले QR कोड को स्कैन करें।", - "@You'll need to open your student's Canvas Student app to continue. Go into Main Menu > Settings > Pair with Observer and scan the QR code you see there.": { - "description": "Message explaining how QR code pairing works", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Screenshot showing location of pairing QR code generation in the Canvas Student app": "Canvas Student ऐप में QR कोड जेनरेशन को पेयर करने का स्थान दिखाने वाला स्क्रीनशॉट", - "@Screenshot showing location of pairing QR code generation in the Canvas Student app": { - "description": "Content Description for qr pairing tutorial screenshot", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Expired QR Code": "समाप्त हुआ QR कोड", - "@Expired QR Code": { - "description": "Error title shown when the users scans a QR code that has expired", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The QR code you scanned may have expired. Refresh the code on the student's device and try again.": "हो सकता है कि आपके द्वारा स्कैन किए गए QR कोड का समय समाप्त हो गया हो। छात्र की डिवाइस पर कोड रीफ़्रेश करें और फिर से कोशिश करें।", - "@The QR code you scanned may have expired. Refresh the code on the student's device and try again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "A network error occurred when adding this student. Check your connection and try again.": "इस छात्र को जोड़ते समय कोई नेटवर्क त्रुटि उत्पन्न हुई। अपने कनेक्शन की जांच करें और फिर से कोशिश करें।", - "@A network error occurred when adding this student. Check your connection and try again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Invalid QR Code": "अमान्य QR कोड", - "@Invalid QR Code": { - "description": "Error title shown when the user scans an invalid QR code", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Incorrect Domain": "गलत डोमेन", - "@Incorrect Domain": { - "description": "Error title shown when the users scane a QR code for a student that belongs to a different domain", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The student you are trying to add belongs to a different school. Log in or create an account with that school to scan this code.": "जिस छात्र को आप जोड़ने का प्रयास कर रहे हैं वह एक अलग स्कूल से है। इस कोड को स्कैन करने के लिए लॉग इन करें या उस स्कूल में खाता बनाएं।", - "@The student you are trying to add belongs to a different school. Log in or create an account with that school to scan this code.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Camera Permission": "कैमरा अनुमति", - "@Camera Permission": { - "description": "Error title shown when the user wans to scan a QR code but has denied the camera permission", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "This will unpair and remove all enrollments for this student from your account.": "इस तरह से आपके खाते से इस छात्र के सभी नामांकन अनपेयर हो जाएंगे और निकाल दिए जाएंगे।", - "@This will unpair and remove all enrollments for this student from your account.": { - "description": "Confirmation message shown when the user tries to delete a student from their account", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was a problem removing this student from your account. Please check your connection and try again.": "इस छात्र को आपके खाते से निकालने में समस्या हुई। कृपया अपने कनेक्शन की जांच करें और फिर से कोशिश करें।", - "@There was a problem removing this student from your account. Please check your connection and try again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Cancel": "रद्द करें", - "@Cancel": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "next": "अगला", - "@next": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "ok": "ठीक है", - "@ok": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Yes": "हां", - "@Yes": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No": "नहीं", - "@No": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Retry": "पुन: प्रयास करें", - "@Retry": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Delete": "मिटाएं", - "@Delete": { - "description": "Label used for general delete/remove actions", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Done": "हो गया", - "@Done": { - "description": "Label for general done/finished actions", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Refresh": "रीफ़्रेश करें", - "@Refresh": { - "description": "Label for button to refresh data from the web", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "View Description": "विवरण देखें", - "@View Description": { - "description": "Button to view the description for an event or assignment", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "expanded": "बढ़ाया गया", - "@expanded": { - "description": "Description for the accessibility reader for list groups that are expanded", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "collapsed": "संक्षिप्त किया गया", - "@collapsed": { - "description": "Description for the accessibility reader for list groups that are expanded", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "An unexpected error occurred": "एक अप्रत्याशित त्रुटि हुई", - "@An unexpected error occurred": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No description": "कोई विवरण नहीं", - "@No description": { - "description": "Message used when the assignment has no description", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Launch External Tool": "बाहरी उपकरण लॉन्च करें", - "@Launch External Tool": { - "description": "Button text added to webviews to let users open external tools in their browser", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Interactions on this page are limited by your institution.": "इस पेज पर बातचीत आपके संस्थान द्वारा सीमित हैं।", - "@Interactions on this page are limited by your institution.": { - "description": "Message describing how the webview has limited access due to an instution setting", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "dateAtTime": "{time} पर {date}", - "@dateAtTime": { - "description": "The string to format dates", - "type": "text", - "placeholders_order": [ - "date", - "time" - ], - "placeholders": { - "date": {}, - "time": {} - } - }, - "dueDateAtTime": "{date} को {time} बजे नियत", - "@dueDateAtTime": { - "description": "The string to format due dates", - "type": "text", - "placeholders_order": [ - "date", - "time" - ], - "placeholders": { - "date": {}, - "time": {} - } - }, - "No Due Date": "कोई नियत तिथि नहीं", - "@No Due Date": { - "description": "Label for assignments that do not have a due date", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Filter": "फ़िल्टर", - "@Filter": { - "description": "Label for buttons to filter what items are visible", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "unread": "अपठित", - "@unread": { - "description": "Label for things that are marked as unread", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "unreadCount": "{count} अपठित", - "@unreadCount": { - "description": "Formatted string for when there are a number of unread items", - "type": "text", - "placeholders_order": [ - "count" - ], - "placeholders": { - "count": {} - } - }, - "badgeNumberPlus": "{count}+", - "@badgeNumberPlus": { - "description": "Formatted string for when too many items are being notified in a badge, generally something like: 99+", - "type": "text", - "placeholders_order": [ - "count" - ], - "placeholders": { - "count": {} - } - }, - "There was an error loading this announcement": "इस घोषणा को लोड करने में त्रुटि हुई", - "@There was an error loading this announcement": { - "description": "Message shown when an announcement detail screen fails to load", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Network error": "नेटवर्क त्रुटि", - "@Network error": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Under Construction": "निर्माणाधीन", - "@Under Construction": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "We are currently building this feature for your viewing pleasure.": "हम वर्तमान में आपके देखने के अनुभव को बेहतर बनाने के लिए इस फ़ीचर को विकसित कर रहे हैं।", - "@We are currently building this feature for your viewing pleasure.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Request Login Help Button": "लॉगिन मदद बटन का अनुरोध करें", - "@Request Login Help Button": { - "description": "Accessibility hint for button that opens help dialog for a login help request", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Request Login Help": "लॉगिन मदद का अनुरोध करें", - "@Request Login Help": { - "description": "Title of help dialog for a login help request", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I'm having trouble logging in": "मुझे लॉग इन करने में समस्या हो रही है", - "@I'm having trouble logging in": { - "description": "Subject of help dialog for a login help request", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "An error occurred when trying to display this link": "इस लिंक को प्रदर्शित करने का प्रयास करते समय त्रुटि उत्पन्न हुई", - "@An error occurred when trying to display this link": { - "description": "Error message shown when a link can't be opened", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "We are unable to display this link, it may belong to an institution you currently aren't logged in to.": "हम इस लिंक को प्रदर्शित करने में असमर्थ हैं, यह किसी ऐसे संस्थान से संबंधित हो सकता है जिसमें आप वर्तमान में लॉग इन नहीं हैं।", - "@We are unable to display this link, it may belong to an institution you currently aren't logged in to.": { - "description": "Description for error page shown when clicking a link", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Link Error": "लिंक त्रुटि", - "@Link Error": { - "description": "Title for error page shown when clicking a link", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Open In Browser": "ब्राउज़र में खोलें", - "@Open In Browser": { - "description": "Text for button to open a link in the browswer", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You'll find the QR code on the web in your account profile. Click 'QR for Mobile Login' in the list.": "आपको वेब पर अपनी खाता प्रोफ़ाइल में QR कोड मिलेगा। सूची में 'मोबाइल लॉगिन के लिए QR' पर क्लिक करें।", - "@You'll find the QR code on the web in your account profile. Click 'QR for Mobile Login' in the list.": { - "description": "Text for qr login tutorial screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Locate QR Code": "QR कोड का पता लगाएं", - "@Locate QR Code": { - "description": "Text for qr login button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Please scan a QR code generated by Canvas": "कृपया Canvas द्वारा जेनरेट किए गए QR कोड को स्कैन करें", - "@Please scan a QR code generated by Canvas": { - "description": "Text for qr login error with incorrect qr code", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error logging in. Please generate another QR Code and try again.": "लॉग इन करने में त्रुटि हुई। कृपया कोई अन्य QR कोड जेनरेट करें और फिर से कोशिश करें।", - "@There was an error logging in. Please generate another QR Code and try again.": { - "description": "Text for qr login error", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Screenshot showing location of QR code generation in browser": "ब्राउज़र में QR कोड जेनरेशन का स्थान दिखाने वाला स्क्रीनशॉट", - "@Screenshot showing location of QR code generation in browser": { - "description": "Content Description for qr login tutorial screenshot", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "QR scanning requires camera access": "QR स्कैनिंग के लिए कैमरा एक्सेस की आवश्यकता होती है", - "@QR scanning requires camera access": { - "description": "placeholder for camera error for QR code scan", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The linked item is no longer available": "लिंक किया गया आइटम अब उपलब्ध नहीं है", - "@The linked item is no longer available": { - "description": "error message when the alert could no be opened", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Message sent": "संदेश भेजा गया", - "@Message sent": { - "description": "confirmation message on the screen when the user succesfully sends a message", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Acceptable Use Policy": "स्वीकार्य उपयोग नीति", - "@Acceptable Use Policy": { - "description": "title for the acceptable use policy screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Submit": "सबमिट करें", - "@Submit": { - "description": "submit button title for acceptable use policy screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Either you're a new user or the Acceptable Use Policy has changed since you last agreed to it. Please agree to the Acceptable Use Policy before you continue.": "या तो आप नए उपयोगकर्ता हैं या स्वीकार्य उपयोग नीति तब से बदल गई है जब आप पिछली बार इसके लिए सहमत हुए थे। जारी रखने से पहले कृपया स्वीकार्य उपयोग नीति से सहमत हों।", - "@Either you're a new user or the Acceptable Use Policy has changed since you last agreed to it. Please agree to the Acceptable Use Policy before you continue.": { - "description": "acceptable use policy screen description", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I agree to the Acceptable Use Policy.": "मैं स्वीकार्य उपयोग नीति से सहमत हूं।", - "@I agree to the Acceptable Use Policy.": { - "description": "acceptable use policy switch title", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "About": "इसके बारे में", - "@About": { - "description": "Title for about menu item in settings", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "App": "ऐप", - "@App": { - "description": "Title for App field on about page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Login ID": "लॉगिन आईडी", - "@Login ID": { - "description": "Title for Login ID field on about page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Email": "ईमेल", - "@Email": { - "description": "Title for Email field on about page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Version": "संस्करण", - "@Version": { - "description": "Title for Version field on about page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Instructure logo": "Instructure लोगो", - "@Instructure logo": { - "description": "Semantics label for the Instructure logo on the about page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - } -} \ No newline at end of file diff --git a/apps/flutter_parent/lib/l10n/res/intl_ht.arb b/apps/flutter_parent/lib/l10n/res/intl_ht.arb deleted file mode 100644 index e6dd7ec069..0000000000 --- a/apps/flutter_parent/lib/l10n/res/intl_ht.arb +++ /dev/null @@ -1,2753 +0,0 @@ -{ - "@@last_modified": "2023-08-25T11:04:20.901151", - "alertsLabel": "Alèt", - "@alertsLabel": { - "description": "The label for the Alerts tab", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "calendarLabel": "Kalandriye", - "@calendarLabel": { - "description": "The label for the Calendar tab", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "coursesLabel": "Kou", - "@coursesLabel": { - "description": "The label for the Courses tab", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Students": "Pa gen Elèv", - "@No Students": { - "description": "Text for when an observer has no students they are observing", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Tap to show student selector": "Tape pou afiche seleksyonè elèv", - "@Tap to show student selector": { - "description": "Semantics label for the area that will show the student selector when tapped", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Tap to pair with a new student": "Tape pou kapab asosye ak yon nouvo elèv", - "@Tap to pair with a new student": { - "description": "Semantics label for the add student button in the student selector", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Tap to select this student": "Tape pou ka seleksyone elèv sa a", - "@Tap to select this student": { - "description": "Semantics label on individual students in the student switcher", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Manage Students": "Jere Elèv", - "@Manage Students": { - "description": "Label text for the Manage Students nav drawer button as well as the title for the Manage Students screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Help": "Èd", - "@Help": { - "description": "Label text for the help nav drawer button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Log Out": "Dekonekte", - "@Log Out": { - "description": "Label text for the Log Out nav drawer button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Switch Users": "Chanje Itilizatè", - "@Switch Users": { - "description": "Label text for the Switch Users nav drawer button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "appVersion": "v. {version}", - "@appVersion": { - "description": "App version shown in the navigation drawer", - "type": "text", - "placeholders_order": [ - "version" - ], - "placeholders": { - "version": {} - } - }, - "Are you sure you want to log out?": "Ou kwè vrèman ou vle dekonekte?", - "@Are you sure you want to log out?": { - "description": "Confirmation message displayed when the user tries to log out", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Calendars": "Kalandriye", - "@Calendars": { - "description": "Label for button that lets users select which calendars to display", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "nextMonth": "Pwochen mwa: {month}", - "@nextMonth": { - "description": "Label for the button that switches the calendar to the next month", - "type": "text", - "placeholders_order": [ - "month" - ], - "placeholders": { - "month": {} - } - }, - "previousMonth": "Mwa pase: {month}", - "@previousMonth": { - "description": "Label for the button that switches the calendar to the previous month", - "type": "text", - "placeholders_order": [ - "month" - ], - "placeholders": { - "month": {} - } - }, - "nextWeek": "Semenn pwochen kòmanse {date}", - "@nextWeek": { - "description": "Label for the button that switches the calendar to the next week", - "type": "text", - "placeholders_order": [ - "date" - ], - "placeholders": { - "date": {} - } - }, - "previousWeek": "Semenn pase kòmanse {date}", - "@previousWeek": { - "description": "Label for the button that switches the calendar to the previous week", - "type": "text", - "placeholders_order": [ - "date" - ], - "placeholders": { - "date": {} - } - }, - "selectedMonthLabel": "Mwa {month}", - "@selectedMonthLabel": { - "description": "Accessibility label for the button that expands/collapses the month view", - "type": "text", - "placeholders_order": [ - "month" - ], - "placeholders": { - "month": {} - } - }, - "expand": "elaji", - "@expand": { - "description": "Accessibility label for the on-tap hint for the button that expands/collapses the month view", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "collapse": "ratresi", - "@collapse": { - "description": "Accessibility label for the on-tap hint for the button that expands/collapses the month view", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "pointsPossible": "{points} pwen posib", - "@pointsPossible": { - "description": "Screen reader label used for the points possible for an assignment, quiz, etc.", - "type": "text", - "placeholders_order": [ - "points" - ], - "placeholders": { - "points": {} - } - }, - "calendarDaySemanticsLabel": "{eventCount,plural, =1{{date}, {eventCount} evènman}other{{date}, {eventCount} evènman}}", - "@calendarDaySemanticsLabel": { - "description": "Screen reader label used for calendar day, reads the date and count of events", - "type": "text", - "placeholders_order": [ - "date", - "eventCount" - ], - "placeholders": { - "date": {}, - "eventCount": {} - } - }, - "No Events Today!": "Pa gen Aktivite Jodi a!", - "@No Events Today!": { - "description": "Title displayed when there are no calendar events for the current day", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "It looks like a great day to rest, relax, and recharge.": "Sanble yon bon jou pou repoze w, amize w epi mete enèji.", - "@It looks like a great day to rest, relax, and recharge.": { - "description": "Message displayed when there are no calendar events for the current day", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading your student's calendar": "Te gen yon erè nan chajman kalandriye elèv ou a", - "@There was an error loading your student's calendar": { - "description": "Message displayed when calendar events could not be loaded for the current student", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Tap to favorite the courses you want to see on the Calendar. Select up to 10.": "Tape pou pou ajoute kou ou vle wè nan Kalandriye yo nan favori. Seleksyone jiska 10.", - "@Tap to favorite the courses you want to see on the Calendar. Select up to 10.": { - "description": "Description text on calendar filter screen.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You may only choose 10 calendars to display": "Ou ka chwazi sèlman 10 kalandriye pou afiche", - "@You may only choose 10 calendars to display": { - "description": "Error text when trying to select more than 10 calendars", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You must select at least one calendar to display": "Ou dwe seleksyone omwen yon kalandriye pou afiche", - "@You must select at least one calendar to display": { - "description": "Error text when trying to de-select all calendars", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Planner Note": "Nòt Planifikatè", - "@Planner Note": { - "description": "Label used for notes in the planner", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Go to today": "Ale nan jodi a", - "@Go to today": { - "description": "Accessibility label used for the today button in the planner", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Previous Logins": "Ansyen Koneksyon", - "@Previous Logins": { - "description": "Label for the list of previous user logins", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "canvasLogoLabel": "Logo Canvas", - "@canvasLogoLabel": { - "description": "The semantics label for the Canvas logo", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "findSchool": "Jwenn Lekòl", - "@findSchool": { - "description": "Text for the find-my-school button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "findAnotherSchool": "Jwenn yon lòt lekòl", - "@findAnotherSchool": { - "description": "Text for the find-another-school button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "domainSearchInputHint": "Antre non lekòl la oswa distri a...", - "@domainSearchInputHint": { - "description": "Input hint for the text box on the domain search screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "noDomainResults": "Nou paka jwenn lekòl ki koresponn a \"{query}\"", - "@noDomainResults": { - "description": "Message shown to users when the domain search query did not return any results", - "type": "text", - "placeholders_order": [ - "query" - ], - "placeholders": { - "query": {} - } - }, - "domainSearchHelpLabel": "Kijan mwen kapab jwenn lekòl oswa distri mwen an?", - "@domainSearchHelpLabel": { - "description": "Label for the help button on the domain search screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "canvasGuides": "Gid Canvas", - "@canvasGuides": { - "description": "Proper name for the Canvas Guides. This will be used in the domainSearchHelpBody text and will be highlighted and clickable", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "canvasSupport": "Sipò Canvas", - "@canvasSupport": { - "description": "Proper name for Canvas Support. This will be used in the domainSearchHelpBody text and will be highlighted and clickable", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "domainSearchHelpBody": "Eseye chèche non lekòl oswa distri ou vle ale sou li a, pa egzanp “Smith Private School” or “Smith County Schools.” Ou kapab antre yon domèn Canvas dirèkteman, tankou pa egzanp “smith.instructure.com.”\n\nPou plis enfòmasyon pou jwenn kont Canvas enstitisyon ou an, ou ka vizite {canvasGuides}, ale sou {canvasSupport}, oswa pran kontak ak lekòl ou a pou plis asistans.", - "@domainSearchHelpBody": { - "description": "The body text shown in the help dialog on the domain search screen", - "type": "text", - "placeholders_order": [ - "canvasGuides", - "canvasSupport" - ], - "placeholders": { - "canvasGuides": {}, - "canvasSupport": {} - } - }, - "Uh oh!": "Uh oh!", - "@Uh oh!": { - "description": "Title of the screen that shows when a crash has occurred", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "We’re not sure what happened, but it wasn’t good. Contact us if this keeps happening.": "Nou pa twò konnen kisa k pase a, men li pa enteresan. Pran kontak ak nou si sa repwodui.", - "@We’re not sure what happened, but it wasn’t good. Contact us if this keeps happening.": { - "description": "Message shown when a crash has occurred", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Contact Support": "Kontakte Sipò", - "@Contact Support": { - "description": "Label for the button that allows users to contact support after a crash has occurred", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "View error details": "Afiche detay erè", - "@View error details": { - "description": "Label for the button that allowed users to view crash details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Restart app": "Reinisyalize app", - "@Restart app": { - "description": "Label for the button that will restart the entire application", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Application version": "Vèsyon aplikasyon", - "@Application version": { - "description": "Label for the application version displayed in the crash details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Device model": "Modèl aparèy", - "@Device model": { - "description": "Label for the device model displayed in the crash details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Android OS version": "Vèsyon OS Android", - "@Android OS version": { - "description": "Label for the Android operating system version displayed in the crash details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Full error message": "Erè mesaj konplè", - "@Full error message": { - "description": "Label for the full error message displayed in the crash details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Inbox": "Bwat resepsyon", - "@Inbox": { - "description": "Title for the Inbox screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading your inbox messages.": "Te gen yo erè pandan chajman mesaj ki nan bwat resepsyon w yo.", - "@There was an error loading your inbox messages.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Subject": "Pa gen Sijè", - "@No Subject": { - "description": "Title used for inbox messages that have no subject", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unable to fetch courses. Please check your connection and try again.": "Enposib pou ale chèche kou. Tanpri verifye koneksyon ou a epi eseye ankò.", - "@Unable to fetch courses. Please check your connection and try again.": { - "description": "Message shown when an error occured while loading courses", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Choose a course to message": "Chwazi yon kou pou voye mesaj", - "@Choose a course to message": { - "description": "Header in the course list shown when the user is choosing which course to associate with a new message", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Inbox Zero": "Bwat Resepsyon Zewo", - "@Inbox Zero": { - "description": "Title of the message shown when there are no inbox messages", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You’re all caught up!": "Yo pran w!", - "@You’re all caught up!": { - "description": "Subtitle of the message shown when there are no inbox messages", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading recipients for this course": "Te gen yon erè nan chajman destinatè pou kou sa a", - "@There was an error loading recipients for this course": { - "description": "Message shown when attempting to create a new message but the recipients list failed to load", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unable to send message. Check your connection and try again.": "Enposib pou voye mesaj. Verifye koneksyon ou a epi eseye ankò.", - "@Unable to send message. Check your connection and try again.": { - "description": "Message show when there was an error creating or sending a new message", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unsaved changes": "Chanjman ki pa anrejistre", - "@Unsaved changes": { - "description": "Title of the dialog shown when the user tries to leave with unsaved changes", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Are you sure you wish to close this page? Your unsent message will be lost.": "Ou kwè vrèman ou vle fèmen paj sa a? Mesaj ou genyen ki pa delivre yo ap elimine.", - "@Are you sure you wish to close this page? Your unsent message will be lost.": { - "description": "Body text of the dialog shown when the user tries leave with unsaved changes", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "New message": "Nouvo mesaj", - "@New message": { - "description": "Title of the new-message screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Add attachment": "Ajoute atachman", - "@Add attachment": { - "description": "Tooltip for the add-attachment button in the new-message screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Send message": "Voye mesaj", - "@Send message": { - "description": "Tooltip for the send-message button in the new-message screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Select recipients": "Seleksyone destinatè", - "@Select recipients": { - "description": "Tooltip for the button that allows users to select message recipients", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No recipients selected": "Okenn destinatè seleksyone", - "@No recipients selected": { - "description": "Hint displayed when the user has not selected any message recipients", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Message subject": "Sijè mesaj", - "@Message subject": { - "description": "Hint text displayed in the input field for the message subject", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Message": "Mesaj", - "@Message": { - "description": "Hint text displayed in the input field for the message body", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Recipients": "Destinatè", - "@Recipients": { - "description": "Label for message recipients", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "plusRecipientCount": "+{count}", - "@plusRecipientCount": { - "description": "Shows the number of recipients that are selected but not displayed on screen.", - "type": "text", - "placeholders_order": [ - "count" - ], - "placeholders": { - "count": { - "example": 5 - } - } - }, - "Failed. Tap for options.": "Echwe. Tape pou opsyon.", - "@Failed. Tap for options.": { - "description": "Short message shown on a message attachment when uploading has failed", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "courseForWhom": "pou {studentShortName}", - "@courseForWhom": { - "description": "Describes for whom a course is for (i.e. for Bill)", - "type": "text", - "placeholders_order": [ - "studentShortName" - ], - "placeholders": { - "studentShortName": {} - } - }, - "messageLinkPostscript": "Konsènan: {studentName}, {linkUrl}", - "@messageLinkPostscript": { - "description": "A postscript appended to new messages that clarifies which student is the subject of the message and also includes a URL for the related Canvas component (course, assignment, event, etc).", - "type": "text", - "placeholders_order": [ - "studentName", - "linkUrl" - ], - "placeholders": { - "studentName": {}, - "linkUrl": {} - } - }, - "There was an error loading this conversation": "Te gen yon erè nan chajman konvèsasyon sa a", - "@There was an error loading this conversation": { - "description": "Message shown when a conversation fails to load", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Reply": "Reponn", - "@Reply": { - "description": "Button label for replying to a conversation", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Reply All": "Reponn Tout", - "@Reply All": { - "description": "Button label for replying to all conversation participants", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unknown User": "Itilizatè Enkoni", - "@Unknown User": { - "description": "Label used where the user name is not known", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "me": "mwen menm", - "@me": { - "description": "First-person pronoun (i.e. 'me') that will be used in message author info, e.g. 'Me to 4 others' or 'Jon Snow to me'", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "authorToRecipient": "{authorName} a {recipientName}", - "@authorToRecipient": { - "description": "Author info for a single-recipient message; includes both the author name and the recipient name.", - "type": "text", - "placeholders_order": [ - "authorName", - "recipientName" - ], - "placeholders": { - "authorName": {}, - "recipientName": {} - } - }, - "authorToNOthers": "{howMany,plural, =1{{authorName} a 1 lòt}other{{authorName} a {howMany} lòt}}", - "@authorToNOthers": { - "description": "Author info for a mutli-recipient message; includes the author name and the number of recipients", - "type": "text", - "placeholders_order": [ - "authorName", - "howMany" - ], - "placeholders": { - "authorName": {}, - "howMany": {} - } - }, - "authorToRecipientAndNOthers": "{howMany,plural, =1{{authorName} a {recipientName} & 1 lòt}other{{authorName} a {recipientName} & {howMany} lòt}}", - "@authorToRecipientAndNOthers": { - "description": "Author info for a multi-recipient message; includes the author name, one recipient name, and the number of other recipients", - "type": "text", - "placeholders_order": [ - "authorName", - "recipientName", - "howMany" - ], - "placeholders": { - "authorName": {}, - "recipientName": {}, - "howMany": {} - } - }, - "Download": "Telechaje", - "@Download": { - "description": "Label for the button that will begin downloading a file", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Open with another app": "Ouvri ak yon lòt app", - "@Open with another app": { - "description": "Label for the button that will allow users to open a file with another app", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There are no installed applications that can open this file": "Pa gen aplikasyon nan sa ki enstale yo ki kapab ouvri fichye sa a", - "@There are no installed applications that can open this file": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unsupported File": "Fichye pa pran an chaj", - "@Unsupported File": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "This file is unsupported and can’t be viewed through the app": "Nou pa pran fichye sa a an chaj e li pa kapab afiche nan app la", - "@This file is unsupported and can’t be viewed through the app": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unable to play this media file": "Enposib pou jwe fichye miltimedya sa a", - "@Unable to play this media file": { - "description": "Message shown when audio or video media could not be played", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unable to load this image": "Enposib pou chaje imaj sa a", - "@Unable to load this image": { - "description": "Message shown when an image file could not be loaded or displayed", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading this file": "Te gen yon erè nan chajman fichye sa a", - "@There was an error loading this file": { - "description": "Message shown when a file could not be loaded or displayed", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Courses": "Pa gen Kou", - "@No Courses": { - "description": "Title for having no courses", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Your student’s courses might not be published yet.": "Kou elèv ou a ta dwe gentan pibliye.", - "@Your student’s courses might not be published yet.": { - "description": "Message for having no courses", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading your student’s courses.": "Te gen yon erè nan chajman kou elèv ou a", - "@There was an error loading your student’s courses.": { - "description": "Message displayed when the list of student courses could not be loaded", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Grade": "Pa gen Klas", - "@No Grade": { - "description": "Message shown when there is currently no grade available for a course", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Filter by": "Klase pa", - "@Filter by": { - "description": "Title for list of terms to filter grades by", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Grades": "Nòt", - "@Grades": { - "description": "Label for the \"Grades\" tab in course details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Syllabus": "Pwogram", - "@Syllabus": { - "description": "Label for the \"Syllabus\" tab in course details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Front Page": "Premye Paj", - "@Front Page": { - "description": "Label for the \"Front Page\" tab in course details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Summary": "Rezime", - "@Summary": { - "description": "Label for the \"Summary\" tab in course details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Send a message about this course": "Voye yon mesaj osijè e kou sa a", - "@Send a message about this course": { - "description": "Accessibility hint for the course messaage floating action button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Total Grade": "Klas Total", - "@Total Grade": { - "description": "Label for the total grade in the course", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Graded": "Klase", - "@Graded": { - "description": "Label for assignments that have been graded", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Submitted": "Soumèt", - "@Submitted": { - "description": "Label for assignments that have been submitted", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Not Submitted": "Pa Soumèt", - "@Not Submitted": { - "description": "Label for assignments that have not been submitted", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Late": "An reta", - "@Late": { - "description": "Label for assignments that have been marked late or submitted late", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Missing": "Manke", - "@Missing": { - "description": "Label for assignments that have been marked missing or are not submitted and past the due date", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "-": "-", - "@-": { - "description": "Value representing no score for student submission", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "All Grading Periods": "Tout Peryòd Klasman", - "@All Grading Periods": { - "description": "Label for selecting all grading periods", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Assignments": "Okenn Sesyon", - "@No Assignments": { - "description": "Title for the no assignments message", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "It looks like assignments haven't been created in this space yet.": "Ta sanble poko gen devwa ki kreye nan espas sa a.", - "@It looks like assignments haven't been created in this space yet.": { - "description": "Message for no assignments", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading the summary details for this course.": "Te gen yon erè nan chajman rezime detay kou sa a.", - "@There was an error loading the summary details for this course.": { - "description": "Message shown when the course summary could not be loaded", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Summary": "Okenn Rezime", - "@No Summary": { - "description": "Title displayed when there are no items in the course summary", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "This course does not have any assignments or calendar events yet.": "Kou sa a poko gen devwa oswa kalandriye aktivite.", - "@This course does not have any assignments or calendar events yet.": { - "description": "Message displayed when there are no items in the course summary", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "gradeFormatScoreOutOfPointsPossible": "{score} / {pointsPossible}", - "@gradeFormatScoreOutOfPointsPossible": { - "description": "Formatted string for a student score out of the points possible", - "type": "text", - "placeholders_order": [ - "score", - "pointsPossible" - ], - "placeholders": { - "score": {}, - "pointsPossible": {} - } - }, - "contentDescriptionScoreOutOfPointsPossible": "{score} sou {pointsPossible} pwen", - "@contentDescriptionScoreOutOfPointsPossible": { - "description": "Formatted string for a student score out of the points possible", - "type": "text", - "placeholders_order": [ - "score", - "pointsPossible" - ], - "placeholders": { - "score": {}, - "pointsPossible": {} - } - }, - "gradesSubjectMessage": "Konsènan: {studentName}, Nòt", - "@gradesSubjectMessage": { - "description": "The subject line for a message to a teacher regarding a student's grades", - "type": "text", - "placeholders_order": [ - "studentName" - ], - "placeholders": { - "studentName": {} - } - }, - "syllabusSubjectMessage": "Konsènan: {studentName}, Pwogram", - "@syllabusSubjectMessage": { - "description": "The subject line for a message to a teacher regarding a course syllabus", - "type": "text", - "placeholders_order": [ - "studentName" - ], - "placeholders": { - "studentName": {} - } - }, - "frontPageSubjectMessage": "Konsènan: {studentName}, Premye Paj", - "@frontPageSubjectMessage": { - "description": "The subject line for a message to a teacher regarding a course front page", - "type": "text", - "placeholders_order": [ - "studentName" - ], - "placeholders": { - "studentName": {} - } - }, - "assignmentSubjectMessage": "Konsènan: {studentName}, Devwa - {assignmentName}", - "@assignmentSubjectMessage": { - "description": "The subject line for a message to a teacher regarding a student's assignment", - "type": "text", - "placeholders_order": [ - "studentName", - "assignmentName" - ], - "placeholders": { - "studentName": {}, - "assignmentName": {} - } - }, - "eventSubjectMessage": "Konsènan: {studentName}, Aktivite - {eventTitle}", - "@eventSubjectMessage": { - "description": "The subject line for a message to a teacher regarding a calendar event", - "type": "text", - "placeholders_order": [ - "studentName", - "eventTitle" - ], - "placeholders": { - "studentName": {}, - "eventTitle": {} - } - }, - "There is no page information available.": "Pa gen oken enfòmasyon paj disponib.", - "@There is no page information available.": { - "description": "Description for when no page information is available", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Assignment Details": "Detay Sesyon", - "@Assignment Details": { - "description": "Title for the page that shows details for an assignment", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "assignmentTotalPoints": "{points} pwen", - "@assignmentTotalPoints": { - "description": "Label used for the total points the assignment is worth", - "type": "text", - "placeholders_order": [ - "points" - ], - "placeholders": { - "points": {} - } - }, - "assignmentTotalPointsAccessible": "{points} pwen", - "@assignmentTotalPointsAccessible": { - "description": "Screen reader label used for the total points the assignment is worth", - "type": "text", - "placeholders_order": [ - "points" - ], - "placeholders": { - "points": {} - } - }, - "Due": "Delè", - "@Due": { - "description": "Label for an assignment due date", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Grade": "Klas", - "@Grade": { - "description": "Label for the section that displays an assignment's grade", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Locked": "Bloke", - "@Locked": { - "description": "Label for when an assignment is locked", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "assignmentLockedModule": "Modil \"{moduleName}\" bloke devwa sa a.", - "@assignmentLockedModule": { - "description": "The locked description when an assignment is locked by a module", - "type": "text", - "placeholders_order": [ - "moduleName" - ], - "placeholders": { - "moduleName": {} - } - }, - "Remind Me": "Raple m", - "@Remind Me": { - "description": "Label for the row to set reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Set a date and time to be notified of this specific assignment.": "Antre yon dat ak yon lè pou yo raple w devwa espesyal sa a.", - "@Set a date and time to be notified of this specific assignment.": { - "description": "Description for row to set reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You will be notified about this assignment on…": "Y ap raple w devwa sa a le...", - "@You will be notified about this assignment on…": { - "description": "Description for when a reminder is set", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Instructions": "Enstriksyon", - "@Instructions": { - "description": "Label for the description of the assignment when it has quiz instructions", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Send a message about this assignment": "Voye yon mesaj osijè de devwa sa a", - "@Send a message about this assignment": { - "description": "Accessibility hint for the assignment messaage floating action button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "This app is not authorized for use.": "Pa gen otorizasyon pou itilize app sa a.", - "@This app is not authorized for use.": { - "description": "The error shown when the app being used is not verified by Canvas", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The server you entered is not authorized for this app.": "Sèvè w antre a pa otorize pou app sa a.", - "@The server you entered is not authorized for this app.": { - "description": "The error shown when the desired login domain is not verified by Canvas", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The user agent for this app is not authorized.": "Ajan itilizatè app sa a pa otorize.", - "@The user agent for this app is not authorized.": { - "description": "The error shown when the user agent during verification is not verified by Canvas", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "We were unable to verify the server for use with this app.": "Nou pa kapab verifye sèvè a pou li ka itilize ak app sa a.", - "@We were unable to verify the server for use with this app.": { - "description": "The generic error shown when we are unable to verify with Canvas", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Reminders": "Rapèl", - "@Reminders": { - "description": "Name of the system notification channel for assignment and event reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Notifications for reminders about assignments and calendar events": "Notifikasyon pou rapèl osijè de devwa ak kalandriye aktivite yo", - "@Notifications for reminders about assignments and calendar events": { - "description": "Description of the system notification channel for assignment and event reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Reminders have changed!": "Rapèl la chanje!", - "@Reminders have changed!": { - "description": "Title of the dialog shown when the user needs to update their reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "In order to provide you with a better experience, we have updated how reminders work. You can add new reminders by viewing an assignment or calendar event and tapping the switch under the \"Remind Me\" section.\n\nBe aware that any reminders created with older versions of this app will not be compatible with the new changes and you will need to create them again.": "Pou nouka ofri w pi bon eksperyans, nou aktyalize mòd fonksyonman rapèl yo. Ou ka ajoute nouvo rapèl, pou fè sa w ap afiche yon devwa oswa yon aktivite ki nan kalandriye a epi peze bouton ki nan seksyon \"Raple m\" nan.\n\nSonje tout rapèl ki kreye ak ansyen vèsyon aplikasyon sa a pa p konpatib a nouvo chanjman yo, kidonk w ap gen pou kreye yo ankò.", - "@In order to provide you with a better experience, we have updated how reminders work. You can add new reminders by viewing an assignment or calendar event and tapping the switch under the \"Remind Me\" section.\n\nBe aware that any reminders created with older versions of this app will not be compatible with the new changes and you will need to create them again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Not a parent?": "Ou pa yon paran?", - "@Not a parent?": { - "description": "Title for the screen that shows when the user is not observing any students", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "We couldn't find any students associated with this account": "Nou paka jwenn okenn elèv ki asosye a kont sa a", - "@We couldn't find any students associated with this account": { - "description": "Subtitle for the screen that shows when the user is not observing any students", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Are you a student or teacher?": "Ou se pwofesè oswa elèv?", - "@Are you a student or teacher?": { - "description": "Label for button that will show users the option to view other Canvas apps in the Play Store", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "One of our other apps might be a better fit. Tap one to visit the Play Store.": "Yonn nan lòt aplikasyon nou yo kapab pi bon. Tape sou li pou vizite Play Store la.", - "@One of our other apps might be a better fit. Tap one to visit the Play Store.": { - "description": "Description of options to view other Canvas apps in the Play Store", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Return to Login": "Retounen nan Koneksyon", - "@Return to Login": { - "description": "Label for the button that returns the user to the login screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "STUDENT": "ELÈV", - "@STUDENT": { - "description": "The \"student\" portion of the \"Canvas Student\" app name, in all caps. \"Canvas\" is excluded in this context as it will be displayed to the user as a wordmark image", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "TEACHER": "PWOFESÈ", - "@TEACHER": { - "description": "The \"teacher\" portion of the \"Canvas Teacher\" app name, in all caps. \"Canvas\" is excluded in this context as it will be displayed to the user as a wordmark image", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Canvas Student": "Canvas Student", - "@Canvas Student": { - "description": "The name of the Canvas Student app. Only \"Student\" should be translated as \"Canvas\" is a brand name in this context and should not be translated.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Canvas Teacher": "Pwofesè Canvas", - "@Canvas Teacher": { - "description": "The name of the Canvas Teacher app. Only \"Teacher\" should be translated as \"Canvas\" is a brand name in this context and should not be translated.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Alerts": "Pa gen Alèt", - "@No Alerts": { - "description": "The title for the empty message to show to users when there are no alerts for the student.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There’s nothing to be notified of yet.": "Poko gen anyen ki merite pou yo avèti w.", - "@There’s nothing to be notified of yet.": { - "description": "The empty message to show to users when there are no alerts for the student.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "dismissAlertLabel": "Rejte {alertTitle}", - "@dismissAlertLabel": { - "description": "Accessibility label to dismiss an alert", - "type": "text", - "placeholders_order": [ - "alertTitle" - ], - "placeholders": { - "alertTitle": {} - } - }, - "Course Announcement": "Anons Kou", - "@Course Announcement": { - "description": "Title for alerts when there is a course announcement", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Institution Announcement": "Anons Enstitisyon", - "@Institution Announcement": { - "description": "Title for alerts when there is an institution announcement", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "assignmentGradeAboveThreshold": "Nòt Devwa Plis Pase {threshold}", - "@assignmentGradeAboveThreshold": { - "description": "Title for alerts when an assignment grade is above the threshold value", - "type": "text", - "placeholders_order": [ - "threshold" - ], - "placeholders": { - "threshold": {} - } - }, - "assignmentGradeBelowThreshold": "Nòt Devwa Mwens Pase {threshold}", - "@assignmentGradeBelowThreshold": { - "description": "Title for alerts when an assignment grade is below the threshold value", - "type": "text", - "placeholders_order": [ - "threshold" - ], - "placeholders": { - "threshold": {} - } - }, - "courseGradeAboveThreshold": "Nòt Kou Plis Pase {threshold}", - "@courseGradeAboveThreshold": { - "description": "Title for alerts when a course grade is above the threshold value", - "type": "text", - "placeholders_order": [ - "threshold" - ], - "placeholders": { - "threshold": {} - } - }, - "courseGradeBelowThreshold": "Nòt Kou Mwens Pase {threshold}", - "@courseGradeBelowThreshold": { - "description": "Title for alerts when a course grade is below the threshold value", - "type": "text", - "placeholders_order": [ - "threshold" - ], - "placeholders": { - "threshold": {} - } - }, - "Settings": "Paramèt", - "@Settings": { - "description": "Title for the settings screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Theme": "Tèm", - "@Theme": { - "description": "Label for the light/dark theme section in the settings page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Dark Mode": "Mòd Fonse", - "@Dark Mode": { - "description": "Label for the button that enables dark mode", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Light Mode": "Mòd Klè", - "@Light Mode": { - "description": "Label for the button that enables light mode", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "High Contrast Mode": "Mòd Kontras Elve", - "@High Contrast Mode": { - "description": "Label for the switch that toggles high contrast mode", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Use Dark Theme in Web Content": "Itilize Motif Fonse nan Kontni Web", - "@Use Dark Theme in Web Content": { - "description": "Label for the switch that toggles dark mode for webviews", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Appearance": "Aparans", - "@Appearance": { - "description": "Label for the appearance section in the settings page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Successfully submitted!": "Ale avèk siksè!", - "@Successfully submitted!": { - "description": "Title displayed in the grade cell for an assignment that has been submitted", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "submissionStatusSuccessSubtitle": "Devwa sa a te soumèt nan dat {date} a {time} li an atant pou yo evalye li", - "@submissionStatusSuccessSubtitle": { - "description": "Subtitle displayed in the grade cell for an assignment that has been submitted and is awaiting a grade", - "type": "text", - "placeholders_order": [ - "date", - "time" - ], - "placeholders": { - "date": {}, - "time": {} - } - }, - "outOfPoints": "{howMany,plural, =1{Sou 1 pwen}other{Sou {points} pwen}}", - "@outOfPoints": { - "description": "Description for an assignment grade that has points without a current scoroe", - "type": "text", - "placeholders_order": [ - "points", - "howMany" - ], - "placeholders": { - "points": {}, - "howMany": {} - } - }, - "Excused": "Egzante", - "@Excused": { - "description": "Grading status for an assignment marked as excused", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Complete": "Fini", - "@Complete": { - "description": "Grading status for an assignment marked as complete", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Incomplete": "Enkonplè", - "@Incomplete": { - "description": "Grading status for an assignment marked as incomplete", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "minus": "mwens", - "@minus": { - "description": "Screen reader-friendly replacement for the \"-\" character in letter grades like \"A-\"", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "latePenalty": "Penalite pou reta (-{pointsLost})", - "@latePenalty": { - "description": "Text displayed when a late penalty has been applied to the assignment", - "type": "text", - "placeholders_order": [ - "pointsLost" - ], - "placeholders": { - "pointsLost": {} - } - }, - "finalGrade": "Nòt Final: {grade}", - "@finalGrade": { - "description": "Text that displays the final grade of an assignment", - "type": "text", - "placeholders_order": [ - "grade" - ], - "placeholders": { - "grade": {} - } - }, - "Alert Settings": "Paramèt Alèt", - "@Alert Settings": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Alert me when…": "Alète m lè...", - "@Alert me when…": { - "description": "Header for the screen where the observer chooses the thresholds that will determine when they receive alerts (e.g. when an assignment is graded below 70%)", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Course grade below": "Nòt kou pi ba a", - "@Course grade below": { - "description": "Label describing the threshold for when the course grade is below a certain percentage", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Course grade above": "Nòt kou pi wo a", - "@Course grade above": { - "description": "Label describing the threshold for when the course grade is above a certain percentage", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Assignment missing": "Sesyon ki manke", - "@Assignment missing": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Assignment grade below": "Npot sesyon pi ba a", - "@Assignment grade below": { - "description": "Label describing the threshold for when an assignment is graded below a certain percentage", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Assignment grade above": "Npot sesyon pi wo a", - "@Assignment grade above": { - "description": "Label describing the threshold for when an assignment is graded above a certain percentage", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Course Announcements": "Anons Kou", - "@Course Announcements": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Institution Announcements": "Anons Enstitisyon", - "@Institution Announcements": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Never": "Jamè", - "@Never": { - "description": "Indication that tells the user they will not receive alert notifications of a specific kind", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Grade percentage": "Pousantaj nòt", - "@Grade percentage": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading your student's alerts.": "Te gen yon erè nan chajman alèt elèv ou a.", - "@There was an error loading your student's alerts.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Must be below 100": "Dwe enferyè a 100", - "@Must be below 100": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "mustBeBelowN": "Dwe enferyè a {percentage}", - "@mustBeBelowN": { - "description": "Validation error to the user that they must choose a percentage below 'n'", - "type": "text", - "placeholders_order": [ - "percentage" - ], - "placeholders": { - "percentage": { - "example": 5 - } - } - }, - "mustBeAboveN": "Dwe siperyè a {percentage}", - "@mustBeAboveN": { - "description": "Validation error to the user that they must choose a percentage above 'n'", - "type": "text", - "placeholders_order": [ - "percentage" - ], - "placeholders": { - "percentage": { - "example": 5 - } - } - }, - "Select Student Color": "Seleksyone Koulè Elèv", - "@Select Student Color": { - "description": "Title for screen that allows users to assign a color to a specific student", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Electric, blue": "Elektrik, ble", - "@Electric, blue": { - "description": "Name of the Electric (blue) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Plum, Purple": "Prin, vyolèt", - "@Plum, Purple": { - "description": "Name of the Plum (purple) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Barney, Fuschia": "Barney, Fuschia", - "@Barney, Fuschia": { - "description": "Name of the Barney (fuschia) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Raspberry, Red": "Franbwaz, Wouj", - "@Raspberry, Red": { - "description": "Name of the Raspberry (red) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Fire, Orange": "Dife, Zoranj", - "@Fire, Orange": { - "description": "Name of the Fire (orange) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Shamrock, Green": "Trèf, Vèt", - "@Shamrock, Green": { - "description": "Name of the Shamrock (green) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "An error occurred while saving your selection. Please try again.": "Te gen yon erè ki fpet pandan anrejistreman seleksyone ou an, Tanpri eseye ankò.", - "@An error occurred while saving your selection. Please try again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "changeStudentColorLabel": "Chanje koulè pou {studentName}", - "@changeStudentColorLabel": { - "description": "Accessibility label for the button that lets users change the color associated with a specific student", - "type": "text", - "placeholders_order": [ - "studentName" - ], - "placeholders": { - "studentName": {} - } - }, - "Teacher": "Pwofesè", - "@Teacher": { - "description": "Label for the Teacher enrollment type", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Student": "Elèv", - "@Student": { - "description": "Label for the Student enrollment type", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "TA": "TA", - "@TA": { - "description": "Label for the Teaching Assistant enrollment type (also known as Teacher Aid or Education Assistant), reduced to a short acronym/initialism if appropriate.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Observer": "Obsèvatè", - "@Observer": { - "description": "Label for the Observer enrollment type", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Use Camera": "Itilize Kamera", - "@Use Camera": { - "description": "Label for the action item that lets the user capture a photo using the device camera", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Upload File": "Transfere Fichye", - "@Upload File": { - "description": "Label for the action item that lets the user upload a file from their device", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Choose from Gallery": "Chwazi nan Galri", - "@Choose from Gallery": { - "description": "Label for the action item that lets the user select a photo from their device gallery", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Preparing…": "Preparasyon...", - "@Preparing…": { - "description": "Message shown while a file is being prepared to attach to a message", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Add student with…": "Ajoute elèv ak...", - "@Add student with…": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Add Student": "Ajoute Elèv", - "@Add Student": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You are not observing any students.": "Ou pa p obsève okenn elèv.", - "@You are not observing any students.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading your students.": "Te gen yon erè nan chajman elèv ou yo.", - "@There was an error loading your students.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Pairing Code": "Kòd Kouplaj", - "@Pairing Code": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Students can obtain a pairing code through the Canvas website": "Elèv yo ka jwenn yon kòd kouplaj sou sit entènèt Canvas la", - "@Students can obtain a pairing code through the Canvas website": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Enter the student pairing code provided to you. If the pairing code doesn't work, it may have expired": "Antre kòd kouplaj yo ba ou pou elèv la. Si kòd kouplaj la pa fonksyone, li kapab ekspire", - "@Enter the student pairing code provided to you. If the pairing code doesn't work, it may have expired": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Your code is incorrect or expired.": "Kòd ou a enkòrèk oswa li ekspire.", - "@Your code is incorrect or expired.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Something went wrong trying to create your account, please reach out to your school for assistance.": "Gen yon bagay ki pase mal pandan w ap eseye kreye kont ou a, tanpri kontakte lekòl ou a pou yo ka ede w.", - "@Something went wrong trying to create your account, please reach out to your school for assistance.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "QR Code": "Kòd QR", - "@QR Code": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Students can create a QR code using the Canvas Student app on their mobile device": "Elèv yo kapab kreye yon kòd QR, pou fè sa y ap itilize aplikasyon Canvas Student lan sou pòtab yo.", - "@Students can create a QR code using the Canvas Student app on their mobile device": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Add new student": "Ajoute nouvo elèv", - "@Add new student": { - "description": "Semantics label for the FAB on the Manage Students Screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Select": "Seleksyone", - "@Select": { - "description": "Hint text to tell the user to choose one of two options", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I have a Canvas account": "Mwen gen yon kont Canvas", - "@I have a Canvas account": { - "description": "Option to select for users that have a canvas account", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I don't have a Canvas account": "Mwen pa gen yon kont Canvas", - "@I don't have a Canvas account": { - "description": "Option to select for users that don't have a canvas account", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Create Account": "Kreye Kont", - "@Create Account": { - "description": "Button text for account creation confirmation", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Full Name": "Non Konplè", - "@Full Name": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Email Address": "Adrès Imèl", - "@Email Address": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Password": "Modpas", - "@Password": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Full Name…": "Non Konplè...", - "@Full Name…": { - "description": "hint label for inside form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Email…": "Imèl...", - "@Email…": { - "description": "hint label for inside form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Password…": "Modpas...", - "@Password…": { - "description": "hint label for inside form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Please enter full name": "Tanpri antre non konplè a", - "@Please enter full name": { - "description": "Error message for form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Please enter an email address": "Tanpri ekri yon adrès imèl", - "@Please enter an email address": { - "description": "Error message for form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Please enter a valid email address": "Tanpri antre yon adrès imèl valid", - "@Please enter a valid email address": { - "description": "Error message for form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Password is required": "Modpas obligatwa", - "@Password is required": { - "description": "Error message for form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Password must contain at least 8 characters": "Modpas la dwe genyen omwen 8 karaktè", - "@Password must contain at least 8 characters": { - "description": "Error message for form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "qrCreateAccountTos": "Lè w tape 'Kreye Kont', ou dakò Tèm ak Kondisyon yo {termsOfService} epi ou rekonèt {privacyPolicy}", - "@qrCreateAccountTos": { - "description": "The text show on the account creation screen", - "type": "text", - "placeholders_order": [ - "termsOfService", - "privacyPolicy" - ], - "placeholders": { - "termsOfService": {}, - "privacyPolicy": {} - } - }, - "Terms of Service": "Kondisyon Itilizasyon", - "@Terms of Service": { - "description": "Label for the Canvas Terms of Service agreement. This will be used in the qrCreateAccountTos text and will be highlighted and clickable", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Privacy Policy": "Politik Konfidansyalite", - "@Privacy Policy": { - "description": "Label for the Canvas Privacy Policy agreement. This will be used in the qrCreateAccountTos text and will be highlighted and clickable", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "View the Privacy Policy": "Afiche Politik Konfidansyalite a", - "@View the Privacy Policy": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Already have an account? ": "Ou gen yon kont deja? ", - "@Already have an account? ": { - "description": "Part of multiline text span, includes AccountSignIn1-2, in that order", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Sign In": "Konekte", - "@Sign In": { - "description": "Part of multiline text span, includes AccountSignIn1-2, in that order", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Hide Password": "Kache Modpas", - "@Hide Password": { - "description": "content description for password hide button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Show Password": "Afiche Modpas", - "@Show Password": { - "description": "content description for password show button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Terms of Service Link": "Lyen Kondisyon Itilizasyon", - "@Terms of Service Link": { - "description": "content description for terms of service link", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Privacy Policy Link": "Lyen Politik Konfidansyalite", - "@Privacy Policy Link": { - "description": "content description for privacy policy link", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Event": "Aktivite", - "@Event": { - "description": "Title for the event details screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Date": "Dat", - "@Date": { - "description": "Label for the event date", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Location": "Anplasman", - "@Location": { - "description": "Label for the location information", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Location Specified": "Okenn Anplasman Espesyal", - "@No Location Specified": { - "description": "Description for events that do not have a location", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "eventTime": "{startAt} - {endAt}", - "@eventTime": { - "description": "The time the event is happening, example: \"2:00 pm - 4:00 pm\"", - "type": "text", - "placeholders_order": [ - "startAt", - "endAt" - ], - "placeholders": { - "startAt": {}, - "endAt": {} - } - }, - "Set a date and time to be notified of this event.": "Antre yon dat ak yon lè pou yo raple w aktivite sa a.", - "@Set a date and time to be notified of this event.": { - "description": "Description for row to set event reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You will be notified about this event on…": "Y ap raple w de aktivite sa a le...", - "@You will be notified about this event on…": { - "description": "Description for when an event reminder is set", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Share Your Love for the App": "Pataje lanmou ou genyen pou App la", - "@Share Your Love for the App": { - "description": "Label for option to open the app store", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Tell us about your favorite parts of the app": "Di nou kisa w pi renmen nan app la", - "@Tell us about your favorite parts of the app": { - "description": "Description for option to open the app store", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Legal": "Legal", - "@Legal": { - "description": "Label for legal information option", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Privacy policy, terms of use, open source": "Politik konfidansyalite, kondisyon itilizasyon, open source", - "@Privacy policy, terms of use, open source": { - "description": "Description for legal information option", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Idea for Canvas Parent App [Android]": "Ide pou app Canvas Parent [Android]", - "@Idea for Canvas Parent App [Android]": { - "description": "The subject for the email to request a feature", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The following information will help us better understand your idea:": "Enfòmasyon annapre yo ap ede nou konprann ide ou a pi byen:", - "@The following information will help us better understand your idea:": { - "description": "The header for the users information that is attached to a feature request", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Domain:": "Domèn:", - "@Domain:": { - "description": "The label for the Canvas domain of the logged in user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "User ID:": "Non Itilizatè:", - "@User ID:": { - "description": "The label for the Canvas user ID of the logged in user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Email:": "Imèl:", - "@Email:": { - "description": "The label for the eamil of the logged in user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Locale:": "Lokal:", - "@Locale:": { - "description": "The label for the locale of the logged in user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Terms of Use": "Kondisyon Itilizasyon", - "@Terms of Use": { - "description": "Label for the terms of use", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Canvas on GitHub": "Canvas sou GitHub", - "@Canvas on GitHub": { - "description": "Label for the button that opens the Canvas project on GitHub's website", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was a problem loading the Terms of Use": "Te gen yon pwoblèm nan chajman Kondisyon Itilizasyon yo", - "@There was a problem loading the Terms of Use": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Device": "Aparèy", - "@Device": { - "description": "Label used for device manufacturer/model in the error report", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "OS Version": "Vèsyon OS", - "@OS Version": { - "description": "Label used for device operating system version in the error report", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Version Number": "Nimewo Vèsyon", - "@Version Number": { - "description": "Label used for the app version number in the error report", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Report A Problem": "Rapòte yon Pwoblèm", - "@Report A Problem": { - "description": "Title used for generic dialog to report problems", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Subject": "Sijè", - "@Subject": { - "description": "Label used for Subject text field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "A subject is required.": "Yon sijè obligatwa.", - "@A subject is required.": { - "description": "Error shown when the subject field is empty", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "An email address is required.": "Yon adrès imèl obligatwa.", - "@An email address is required.": { - "description": "Error shown when the email field is empty", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Description": "Deskripsyon", - "@Description": { - "description": "Label used for Description text field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "A description is required.": "Yon deskripsyon obligatwa.", - "@A description is required.": { - "description": "Error shown when the description field is empty", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "How is this affecting you?": "Nan ki sans sa afekte w?", - "@How is this affecting you?": { - "description": "Label used for the dropdown to select how severe the issue is", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "send": "voye", - "@send": { - "description": "Label used for send button when reporting a problem", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Just a casual question, comment, idea, suggestion…": "Sèlman yon kesyon, yon kòmantè, yon ide... enfòmèl", - "@Just a casual question, comment, idea, suggestion…": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I need some help but it's not urgent.": "Mwen bezwen èd men se pa ijan.", - "@I need some help but it's not urgent.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Something's broken but I can work around it to get what I need done.": "Gen yon entèripsyon men mwen ka kontounen li pou mwen jwenn sa mwen bezwen an.", - "@Something's broken but I can work around it to get what I need done.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I can't get things done until I hear back from you.": "Mwen paka fè bagay yo jiskaske mwen tounen tande w.", - "@I can't get things done until I hear back from you.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "EXTREME CRITICAL EMERGENCY!!": "IJANS KRITIK EKSTRÈM!!", - "@EXTREME CRITICAL EMERGENCY!!": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Not Graded": "Pa Klase", - "@Not Graded": { - "description": "Description for an assignment has not been graded.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Login flow: Normal": "Flux koneksyon: Nòmal", - "@Login flow: Normal": { - "description": "Description for the normal login flow", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Login flow: Canvas": "Flux koneksyon: Canvas", - "@Login flow: Canvas": { - "description": "Description for the Canvas login flow", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Login flow: Site Admin": "Flux koneksyon: Administratè Sit", - "@Login flow: Site Admin": { - "description": "Description for the Site Admin login flow", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Login flow: Skip mobile verify": "Flux koneksyon: Sote verifikasyon mobil", - "@Login flow: Skip mobile verify": { - "description": "Description for the login flow that skips domain verification for mobile", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Act As User": "Pase pou Itilizatè", - "@Act As User": { - "description": "Label for the button that allows the user to act (masquerade) as another user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Stop Acting as User": "Sispann Pase pou Itilizatè", - "@Stop Acting as User": { - "description": "Label for the button that allows the user to stop acting (masquerading) as another user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "actingAsUser": "W ap aji tankou {userName}", - "@actingAsUser": { - "description": "Message shown while acting (masquerading) as another user", - "type": "text", - "placeholders_order": [ - "userName" - ], - "placeholders": { - "userName": {} - } - }, - "\"Act as\" is essentially logging in as this user without a password. You will be able to take any action as if you were this user, and from other users' points of views, it will be as if this user performed them. However, audit logs record that you were the one who performed the actions on behalf of this user.": "\"Aji tankou\" se koneksyon an tan ke moun sa a san modpas. W ap kapab fè nenpòt bagay kòmsi ou te itilizatè sa a, e pou lòt moun yo, se kòmsi se itilizatè sa a ki t ap fè yo. Men, jounal odit yo endike ke se te ou menm ki te fè aksyon yo nan non itilizatè sa a.", - "@\"Act as\" is essentially logging in as this user without a password. You will be able to take any action as if you were this user, and from other users' points of views, it will be as if this user performed them. However, audit logs record that you were the one who performed the actions on behalf of this user.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Domain": "Domèn", - "@Domain": { - "description": "Text field hint for domain url input", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You must enter a valid domain": "Ou dwe antre yon domèn valid", - "@You must enter a valid domain": { - "description": "Message displayed for domain input error", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "User ID": "ID Itilizatè", - "@User ID": { - "description": "Text field hint for user ID input", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You must enter a user id": "Ou dwe antre yon ID itilizatè", - "@You must enter a user id": { - "description": "Message displayed for user Id input error", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error trying to act as this user. Please check the Domain and User ID and try again.": "Te gen yon erè pandan w ap eseye pase pou itilizatè sa a. Tanpri verifye Domèn nan ak ID Itilizatè a epi eseye ankò.", - "@There was an error trying to act as this user. Please check the Domain and User ID and try again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "endMasqueradeMessage": "W ap sispann pase pou {userName} epi retounen sou kont orijinal ou.", - "@endMasqueradeMessage": { - "description": "Confirmation message displayed when the user wants to stop acting (masquerading) as another user", - "type": "text", - "placeholders_order": [ - "userName" - ], - "placeholders": { - "userName": {} - } - }, - "endMasqueradeLogoutMessage": "W ap sispann pase pou {userName} epi w ap dekonekte.", - "@endMasqueradeLogoutMessage": { - "description": "Confirmation message displayed when the user wants to stop acting (masquerading) as another user and will be logged out.", - "type": "text", - "placeholders_order": [ - "userName" - ], - "placeholders": { - "userName": {} - } - }, - "How are we doing?": "Kisa w ap fè la a?", - "@How are we doing?": { - "description": "Title for dialog asking user to rate the app out of 5 stars.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Don't show again": "Pa afiche ankò", - "@Don't show again": { - "description": "Button to prevent the rating dialog from showing again.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "What can we do better?": "Kisa nou ka amelyore?", - "@What can we do better?": { - "description": "Hint text for providing a comment with the rating.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Send Feedback": "Voye Kòmantè", - "@Send Feedback": { - "description": "Button to send rating with feedback", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "ratingDialogEmailSubject": "Sijesyon pou Android - Canvas Parent {version}", - "@ratingDialogEmailSubject": { - "description": "The subject for an email to provide feedback for CanvasParent.", - "type": "text", - "placeholders_order": [ - "version" - ], - "placeholders": { - "version": {} - } - }, - "starRating": "{position,plural, =1{{position} etwal}other{{position} etwal}}", - "@starRating": { - "description": "Accessibility label for the 1 stars to 5 stars rating", - "type": "text", - "placeholders_order": [ - "position" - ], - "placeholders": { - "position": { - "example": 1 - } - } - }, - "Student Pairing": "Kouplaj Elèv", - "@Student Pairing": { - "description": "Title for the screen where users can pair to students using a QR code", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Open Canvas Student": "Ouvri Canvas Student", - "@Open Canvas Student": { - "description": "Title for QR pairing tutorial screen instructing users to open the Canvas Student app", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You'll need to open your student's Canvas Student app to continue. Go into Main Menu > Settings > Pair with Observer and scan the QR code you see there.": "Ou dwe ouvri aplikasyon Canvas Student lan elèv ou a pou w ka kontinye. Ale nan Meni Prensipal > Paramèt > Asosye ak Obsèvatè a epi eskane kòd QR ou wè a.", - "@You'll need to open your student's Canvas Student app to continue. Go into Main Menu > Settings > Pair with Observer and scan the QR code you see there.": { - "description": "Message explaining how QR code pairing works", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Screenshot showing location of pairing QR code generation in the Canvas Student app": "Kapti ekran ki montre anplasman jenerasyon kòd kouplaj QR la nan aplikasyon Canvas Student lan.", - "@Screenshot showing location of pairing QR code generation in the Canvas Student app": { - "description": "Content Description for qr pairing tutorial screenshot", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Expired QR Code": "Kòd QR ekspire", - "@Expired QR Code": { - "description": "Error title shown when the users scans a QR code that has expired", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The QR code you scanned may have expired. Refresh the code on the student's device and try again.": "Ta sanble kòd QR ou eskane a ekspire. Aktyalize kòd QR sou telefòn elèv la epi eseye ankò.", - "@The QR code you scanned may have expired. Refresh the code on the student's device and try again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "A network error occurred when adding this student. Check your connection and try again.": "Gen yon erè rezo ki fèt pandan w ap ajoute elèv la. Verifye koneksyon ou a epi eseye ankò.", - "@A network error occurred when adding this student. Check your connection and try again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Invalid QR Code": "Kòd QR envalid", - "@Invalid QR Code": { - "description": "Error title shown when the user scans an invalid QR code", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Incorrect Domain": "Domèn Enkòrèk", - "@Incorrect Domain": { - "description": "Error title shown when the users scane a QR code for a student that belongs to a different domain", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The student you are trying to add belongs to a different school. Log in or create an account with that school to scan this code.": "Elèv w ap eseye ajoute a nan yon lòt lekòl. Konekte oswa kreye yon kont nan lekòl sa a pou w kapab eskane kòd sa a.", - "@The student you are trying to add belongs to a different school. Log in or create an account with that school to scan this code.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Camera Permission": "Pèmisyon Kamera", - "@Camera Permission": { - "description": "Error title shown when the user wans to scan a QR code but has denied the camera permission", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "This will unpair and remove all enrollments for this student from your account.": "Aksyon sa a ap dekonekte epi elimine tout enskripsyon elèv sa a te fè sou kont ou.", - "@This will unpair and remove all enrollments for this student from your account.": { - "description": "Confirmation message shown when the user tries to delete a student from their account", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was a problem removing this student from your account. Please check your connection and try again.": "TE gen yon pwoblèm pou retire elèv sa a sou kont ou. Tanpri verifye koneksyon ou a epi eseye ankò.", - "@There was a problem removing this student from your account. Please check your connection and try again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Cancel": "Anile", - "@Cancel": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "next": "Pwochen", - "@next": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "ok": "DAKO", - "@ok": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Yes": "Wi", - "@Yes": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No": "Non", - "@No": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Retry": "Re eseye", - "@Retry": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Delete": "Efase", - "@Delete": { - "description": "Label used for general delete/remove actions", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Done": "Fini", - "@Done": { - "description": "Label for general done/finished actions", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Refresh": "Aktyalize", - "@Refresh": { - "description": "Label for button to refresh data from the web", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "View Description": "Afiche Deskripsyon", - "@View Description": { - "description": "Button to view the description for an event or assignment", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "expanded": "elaji", - "@expanded": { - "description": "Description for the accessibility reader for list groups that are expanded", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "collapsed": "retresi", - "@collapsed": { - "description": "Description for the accessibility reader for list groups that are expanded", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "An unexpected error occurred": "Yon erè fèt sanzatann", - "@An unexpected error occurred": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No description": "Pa gen deskripsyon", - "@No description": { - "description": "Message used when the assignment has no description", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Launch External Tool": "Lanse Zouti Eksteryè", - "@Launch External Tool": { - "description": "Button text added to webviews to let users open external tools in their browser", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Interactions on this page are limited by your institution.": "Enstitisyon ou an limite entèaksyon sou paj sa a.", - "@Interactions on this page are limited by your institution.": { - "description": "Message describing how the webview has limited access due to an instution setting", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "dateAtTime": "{date} a {time}", - "@dateAtTime": { - "description": "The string to format dates", - "type": "text", - "placeholders_order": [ - "date", - "time" - ], - "placeholders": { - "date": {}, - "time": {} - } - }, - "dueDateAtTime": "Delè {date} a {time}", - "@dueDateAtTime": { - "description": "The string to format due dates", - "type": "text", - "placeholders_order": [ - "date", - "time" - ], - "placeholders": { - "date": {}, - "time": {} - } - }, - "No Due Date": "San Delè", - "@No Due Date": { - "description": "Label for assignments that do not have a due date", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Filter": "Filtè", - "@Filter": { - "description": "Label for buttons to filter what items are visible", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "unread": "poko li", - "@unread": { - "description": "Label for things that are marked as unread", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "unreadCount": "{count} poko li", - "@unreadCount": { - "description": "Formatted string for when there are a number of unread items", - "type": "text", - "placeholders_order": [ - "count" - ], - "placeholders": { - "count": {} - } - }, - "badgeNumberPlus": "{count}+", - "@badgeNumberPlus": { - "description": "Formatted string for when too many items are being notified in a badge, generally something like: 99+", - "type": "text", - "placeholders_order": [ - "count" - ], - "placeholders": { - "count": {} - } - }, - "There was an error loading this announcement": "Te gen yon erè nan chajman anons sa a", - "@There was an error loading this announcement": { - "description": "Message shown when an announcement detail screen fails to load", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Network error": "Erè Rezo", - "@Network error": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Under Construction": "An Konstriksyon", - "@Under Construction": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "We are currently building this feature for your viewing pleasure.": "Pou kounye a n ap devlope fonksyon sa a pou nou ka fè w plezi.", - "@We are currently building this feature for your viewing pleasure.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Request Login Help Button": "Bouton pou Mande Èd pou Koneksyon", - "@Request Login Help Button": { - "description": "Accessibility hint for button that opens help dialog for a login help request", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Request Login Help": "Mande Èd pou Koneksyon", - "@Request Login Help": { - "description": "Title of help dialog for a login help request", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I'm having trouble logging in": "Mwen gen difikilte pou konekte", - "@I'm having trouble logging in": { - "description": "Subject of help dialog for a login help request", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "An error occurred when trying to display this link": "Gen yon erè ki fèt pandan w ap eseye afiche lyen sa a", - "@An error occurred when trying to display this link": { - "description": "Error message shown when a link can't be opened", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "We are unable to display this link, it may belong to an institution you currently aren't logged in to.": "Nou pa kapab afiche lyen sa a, petèt ke li se pou yon enstitisyon ke ou pa konekte sou li nan moman an.", - "@We are unable to display this link, it may belong to an institution you currently aren't logged in to.": { - "description": "Description for error page shown when clicking a link", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Link Error": "Lyen Erè", - "@Link Error": { - "description": "Title for error page shown when clicking a link", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Open In Browser": "Ouvri nan Navigatè", - "@Open In Browser": { - "description": "Text for button to open a link in the browswer", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You'll find the QR code on the web in your account profile. Click 'QR for Mobile Login' in the list.": "W ap jwenn kòd QR la sou entènèt nan pwofil ou. Klike sou 'QR pou Koneksyon Mobil' nan lis la.", - "@You'll find the QR code on the web in your account profile. Click 'QR for Mobile Login' in the list.": { - "description": "Text for qr login tutorial screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Locate QR Code": "Jwenn Kòd QR", - "@Locate QR Code": { - "description": "Text for qr login button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Please scan a QR code generated by Canvas": "Tanpri eskane yon kòd QR Canvas jenere", - "@Please scan a QR code generated by Canvas": { - "description": "Text for qr login error with incorrect qr code", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error logging in. Please generate another QR Code and try again.": "Te gen yon erè pandan koneksyon an. Tanpri jenere yon lòt Kòd QR epi eseye ankò.", - "@There was an error logging in. Please generate another QR Code and try again.": { - "description": "Text for qr login error", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Screenshot showing location of QR code generation in browser": "Kapti ekran ki montre anplasman jenerasyon kòd QR nan navigatè", - "@Screenshot showing location of QR code generation in browser": { - "description": "Content Description for qr login tutorial screenshot", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "QR scanning requires camera access": "Eske kòd QR la mande pou l gen aksè a kamera a", - "@QR scanning requires camera access": { - "description": "placeholder for camera error for QR code scan", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The linked item is no longer available": "Atik ki lye a pa disponib ankò", - "@The linked item is no longer available": { - "description": "error message when the alert could no be opened", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Message sent": "Mesaj ale", - "@Message sent": { - "description": "confirmation message on the screen when the user succesfully sends a message", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Acceptable Use Policy": "Politik Itilizasyon Akseptab", - "@Acceptable Use Policy": { - "description": "title for the acceptable use policy screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Submit": "Soumèt", - "@Submit": { - "description": "submit button title for acceptable use policy screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Either you're a new user or the Acceptable Use Policy has changed since you last agreed to it. Please agree to the Acceptable Use Policy before you continue.": "Swa ou se yon nouvo itilizatè, swa Politik Itilizasyon Akseptab la chanje depi dènye fwa ou te aksepte li a. Aksepte politik Itilizasyon Akseptab la anvan w kontinye.", - "@Either you're a new user or the Acceptable Use Policy has changed since you last agreed to it. Please agree to the Acceptable Use Policy before you continue.": { - "description": "acceptable use policy screen description", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I agree to the Acceptable Use Policy.": "Mwen dakò ak Politik Itilizasyon Akseptab la.", - "@I agree to the Acceptable Use Policy.": { - "description": "acceptable use policy switch title", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "About": "Apwopo", - "@About": { - "description": "Title for about menu item in settings", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "App": "App", - "@App": { - "description": "Title for App field on about page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Login ID": "ID Koneksyon", - "@Login ID": { - "description": "Title for Login ID field on about page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Email": "Imèl", - "@Email": { - "description": "Title for Email field on about page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Version": "Vèsyon", - "@Version": { - "description": "Title for Version field on about page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Instructure logo": "Logo Instructure", - "@Instructure logo": { - "description": "Semantics label for the Instructure logo on the about page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - } -} \ No newline at end of file diff --git a/apps/flutter_parent/lib/l10n/res/intl_id.arb b/apps/flutter_parent/lib/l10n/res/intl_id.arb deleted file mode 100644 index 5975fdcc49..0000000000 --- a/apps/flutter_parent/lib/l10n/res/intl_id.arb +++ /dev/null @@ -1,2753 +0,0 @@ -{ - "@@last_modified": "2023-08-25T11:04:20.901151", - "alertsLabel": "Peringatan", - "@alertsLabel": { - "description": "The label for the Alerts tab", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "calendarLabel": "Kalender", - "@calendarLabel": { - "description": "The label for the Calendar tab", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "coursesLabel": "Kursus", - "@coursesLabel": { - "description": "The label for the Courses tab", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Students": "Tidak Ada Siswa", - "@No Students": { - "description": "Text for when an observer has no students they are observing", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Tap to show student selector": "Ketuk untuk menampilkan pemilih siswa", - "@Tap to show student selector": { - "description": "Semantics label for the area that will show the student selector when tapped", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Tap to pair with a new student": "Ketuk untuk mem-pairing dengan siswa baru", - "@Tap to pair with a new student": { - "description": "Semantics label for the add student button in the student selector", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Tap to select this student": "Ketuk untuk memilih siswa ini", - "@Tap to select this student": { - "description": "Semantics label on individual students in the student switcher", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Manage Students": "Kelola Siswa", - "@Manage Students": { - "description": "Label text for the Manage Students nav drawer button as well as the title for the Manage Students screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Help": "Bantu", - "@Help": { - "description": "Label text for the help nav drawer button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Log Out": "Logout", - "@Log Out": { - "description": "Label text for the Log Out nav drawer button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Switch Users": "Ganti Pengguna", - "@Switch Users": { - "description": "Label text for the Switch Users nav drawer button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "appVersion": "v. {version}", - "@appVersion": { - "description": "App version shown in the navigation drawer", - "type": "text", - "placeholders_order": [ - "version" - ], - "placeholders": { - "version": {} - } - }, - "Are you sure you want to log out?": "Anda yakin mau logout?", - "@Are you sure you want to log out?": { - "description": "Confirmation message displayed when the user tries to log out", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Calendars": "Kalender", - "@Calendars": { - "description": "Label for button that lets users select which calendars to display", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "nextMonth": "Bulan selanjutnya: {month}", - "@nextMonth": { - "description": "Label for the button that switches the calendar to the next month", - "type": "text", - "placeholders_order": [ - "month" - ], - "placeholders": { - "month": {} - } - }, - "previousMonth": "Bulan sebelumnya: {month}", - "@previousMonth": { - "description": "Label for the button that switches the calendar to the previous month", - "type": "text", - "placeholders_order": [ - "month" - ], - "placeholders": { - "month": {} - } - }, - "nextWeek": "Minggu selanjutnya mulai {date}", - "@nextWeek": { - "description": "Label for the button that switches the calendar to the next week", - "type": "text", - "placeholders_order": [ - "date" - ], - "placeholders": { - "date": {} - } - }, - "previousWeek": "Minggu sebelumnya mulai {date}", - "@previousWeek": { - "description": "Label for the button that switches the calendar to the previous week", - "type": "text", - "placeholders_order": [ - "date" - ], - "placeholders": { - "date": {} - } - }, - "selectedMonthLabel": "Bulan dari {month}", - "@selectedMonthLabel": { - "description": "Accessibility label for the button that expands/collapses the month view", - "type": "text", - "placeholders_order": [ - "month" - ], - "placeholders": { - "month": {} - } - }, - "expand": "perbesar", - "@expand": { - "description": "Accessibility label for the on-tap hint for the button that expands/collapses the month view", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "collapse": "perkecil", - "@collapse": { - "description": "Accessibility label for the on-tap hint for the button that expands/collapses the month view", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "pointsPossible": "{points} poin memungkinkan", - "@pointsPossible": { - "description": "Screen reader label used for the points possible for an assignment, quiz, etc.", - "type": "text", - "placeholders_order": [ - "points" - ], - "placeholders": { - "points": {} - } - }, - "calendarDaySemanticsLabel": "{eventCount,plural, =1{{date}, {eventCount} acara}other{{date}, {eventCount} acara}}", - "@calendarDaySemanticsLabel": { - "description": "Screen reader label used for calendar day, reads the date and count of events", - "type": "text", - "placeholders_order": [ - "date", - "eventCount" - ], - "placeholders": { - "date": {}, - "eventCount": {} - } - }, - "No Events Today!": "Tidak Ada Acara Hari Ini!", - "@No Events Today!": { - "description": "Title displayed when there are no calendar events for the current day", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "It looks like a great day to rest, relax, and recharge.": "Sepertinya hari ini sangat cocok untuk beristirahat, santai, dan menyegarkan diri.", - "@It looks like a great day to rest, relax, and recharge.": { - "description": "Message displayed when there are no calendar events for the current day", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading your student's calendar": "Terjadi kesalahan saat memuat kalender siswa Anda", - "@There was an error loading your student's calendar": { - "description": "Message displayed when calendar events could not be loaded for the current student", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Tap to favorite the courses you want to see on the Calendar. Select up to 10.": "Ketuk untuk memfavoritkan kursus yang Anda ingin lihat di Kalender. Pilih hingga 10.", - "@Tap to favorite the courses you want to see on the Calendar. Select up to 10.": { - "description": "Description text on calendar filter screen.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You may only choose 10 calendars to display": "Anda hanya dapat memilih 10 kalender untuk ditampilkan", - "@You may only choose 10 calendars to display": { - "description": "Error text when trying to select more than 10 calendars", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You must select at least one calendar to display": "Anda harus memilih setidaknya satu kalender untuk ditampilkan", - "@You must select at least one calendar to display": { - "description": "Error text when trying to de-select all calendars", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Planner Note": "Catatan Planner", - "@Planner Note": { - "description": "Label used for notes in the planner", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Go to today": "Pergi ke hari ini", - "@Go to today": { - "description": "Accessibility label used for the today button in the planner", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Previous Logins": "Login Sebelumnya", - "@Previous Logins": { - "description": "Label for the list of previous user logins", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "canvasLogoLabel": "Logo Canvas", - "@canvasLogoLabel": { - "description": "The semantics label for the Canvas logo", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "findSchool": "Temukan Sekolah", - "@findSchool": { - "description": "Text for the find-my-school button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "findAnotherSchool": "Temukan sekolah lain", - "@findAnotherSchool": { - "description": "Text for the find-another-school button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "domainSearchInputHint": "Masukkan nama sekolah atau distrik…", - "@domainSearchInputHint": { - "description": "Input hint for the text box on the domain search screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "noDomainResults": "Tidak dapat menemukan sekolah yang cocok dengan \"{query}\"", - "@noDomainResults": { - "description": "Message shown to users when the domain search query did not return any results", - "type": "text", - "placeholders_order": [ - "query" - ], - "placeholders": { - "query": {} - } - }, - "domainSearchHelpLabel": "Bagaimana cara menemukan sekolah atau distrik saya?", - "@domainSearchHelpLabel": { - "description": "Label for the help button on the domain search screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "canvasGuides": "Panduan Canvas", - "@canvasGuides": { - "description": "Proper name for the Canvas Guides. This will be used in the domainSearchHelpBody text and will be highlighted and clickable", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "canvasSupport": "Dukungan Canvas", - "@canvasSupport": { - "description": "Proper name for Canvas Support. This will be used in the domainSearchHelpBody text and will be highlighted and clickable", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "domainSearchHelpBody": "Cobalah mencari nama sekolah atau distrik yang Anda coba akses, seperti “Smith Private School” atau “Smith County Schools.” Anda juga dapat memasukkan domain Canvas secara langsung, seperti “smith.instructure.com.”\n\nUntuk informasi lain tentang menemukan akun Canvas institusi Anda, Anda dapat mengunjungi {canvasGuides}, menghubungi {canvasSupport}, atau menghubungi sekolah Anda untuk mendapat bantuan.", - "@domainSearchHelpBody": { - "description": "The body text shown in the help dialog on the domain search screen", - "type": "text", - "placeholders_order": [ - "canvasGuides", - "canvasSupport" - ], - "placeholders": { - "canvasGuides": {}, - "canvasSupport": {} - } - }, - "Uh oh!": "Uh oh!", - "@Uh oh!": { - "description": "Title of the screen that shows when a crash has occurred", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "We’re not sure what happened, but it wasn’t good. Contact us if this keeps happening.": "Kami tidak yakin apa yang terjadi, tetapi hal itu tidak baik. Hubungi kami jika ini terus terjadi.", - "@We’re not sure what happened, but it wasn’t good. Contact us if this keeps happening.": { - "description": "Message shown when a crash has occurred", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Contact Support": "Hubungi Bagian Dukungan", - "@Contact Support": { - "description": "Label for the button that allows users to contact support after a crash has occurred", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "View error details": "Lihat detail kesalahan", - "@View error details": { - "description": "Label for the button that allowed users to view crash details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Restart app": "Mulai ulang aplikasi", - "@Restart app": { - "description": "Label for the button that will restart the entire application", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Application version": "Versi aplikasi", - "@Application version": { - "description": "Label for the application version displayed in the crash details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Device model": "Model perangkat", - "@Device model": { - "description": "Label for the device model displayed in the crash details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Android OS version": "Versi Android OS", - "@Android OS version": { - "description": "Label for the Android operating system version displayed in the crash details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Full error message": "Pesan kesalahan lengkap", - "@Full error message": { - "description": "Label for the full error message displayed in the crash details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Inbox": "Kotak Masuk", - "@Inbox": { - "description": "Title for the Inbox screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading your inbox messages.": "Terjadi kesalahan saat memuat pesan kotak masuk Anda.", - "@There was an error loading your inbox messages.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Subject": "Tanpa Subjek", - "@No Subject": { - "description": "Title used for inbox messages that have no subject", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unable to fetch courses. Please check your connection and try again.": "Tidak dapat mengambil kursus. Silakan periksa sambungan internet Anda dan coba lagi.", - "@Unable to fetch courses. Please check your connection and try again.": { - "description": "Message shown when an error occured while loading courses", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Choose a course to message": "Pilih kursus ke pesan", - "@Choose a course to message": { - "description": "Header in the course list shown when the user is choosing which course to associate with a new message", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Inbox Zero": "Nol Kotak Masuk", - "@Inbox Zero": { - "description": "Title of the message shown when there are no inbox messages", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You’re all caught up!": "Anda berhasil menyusul!", - "@You’re all caught up!": { - "description": "Subtitle of the message shown when there are no inbox messages", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading recipients for this course": "Terjadi kesalahan saat memuat penerima untuk kursus ini.", - "@There was an error loading recipients for this course": { - "description": "Message shown when attempting to create a new message but the recipients list failed to load", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unable to send message. Check your connection and try again.": "Tidak dapat mengirim pesan. Periksa koneksi Anda dan coba lagi.", - "@Unable to send message. Check your connection and try again.": { - "description": "Message show when there was an error creating or sending a new message", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unsaved changes": "Perubahan belum disimpan", - "@Unsaved changes": { - "description": "Title of the dialog shown when the user tries to leave with unsaved changes", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Are you sure you wish to close this page? Your unsent message will be lost.": "Anda yakin mau menutup halaman ini? Pesan Anda yang belum dikirim akan hilang.", - "@Are you sure you wish to close this page? Your unsent message will be lost.": { - "description": "Body text of the dialog shown when the user tries leave with unsaved changes", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "New message": "Pesan baru", - "@New message": { - "description": "Title of the new-message screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Add attachment": "Tambah lampiran", - "@Add attachment": { - "description": "Tooltip for the add-attachment button in the new-message screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Send message": "Kirim pesan", - "@Send message": { - "description": "Tooltip for the send-message button in the new-message screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Select recipients": "Pilih penerima", - "@Select recipients": { - "description": "Tooltip for the button that allows users to select message recipients", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No recipients selected": "Penerima tidak dipilih", - "@No recipients selected": { - "description": "Hint displayed when the user has not selected any message recipients", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Message subject": "Subjek pesan", - "@Message subject": { - "description": "Hint text displayed in the input field for the message subject", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Message": "Pesan", - "@Message": { - "description": "Hint text displayed in the input field for the message body", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Recipients": "Penerima", - "@Recipients": { - "description": "Label for message recipients", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "plusRecipientCount": "+{count}", - "@plusRecipientCount": { - "description": "Shows the number of recipients that are selected but not displayed on screen.", - "type": "text", - "placeholders_order": [ - "count" - ], - "placeholders": { - "count": { - "example": 5 - } - } - }, - "Failed. Tap for options.": "Gagal. Ketuk untuk opsi.", - "@Failed. Tap for options.": { - "description": "Short message shown on a message attachment when uploading has failed", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "courseForWhom": "untuk {studentShortName}", - "@courseForWhom": { - "description": "Describes for whom a course is for (i.e. for Bill)", - "type": "text", - "placeholders_order": [ - "studentShortName" - ], - "placeholders": { - "studentShortName": {} - } - }, - "messageLinkPostscript": "Tentang: {studentName}, {linkUrl}", - "@messageLinkPostscript": { - "description": "A postscript appended to new messages that clarifies which student is the subject of the message and also includes a URL for the related Canvas component (course, assignment, event, etc).", - "type": "text", - "placeholders_order": [ - "studentName", - "linkUrl" - ], - "placeholders": { - "studentName": {}, - "linkUrl": {} - } - }, - "There was an error loading this conversation": "Terjadi kesalahan saat memuat percakapan ini", - "@There was an error loading this conversation": { - "description": "Message shown when a conversation fails to load", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Reply": "Balas", - "@Reply": { - "description": "Button label for replying to a conversation", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Reply All": "Balas Semua", - "@Reply All": { - "description": "Button label for replying to all conversation participants", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unknown User": "Pengguna Tidak Dikenal", - "@Unknown User": { - "description": "Label used where the user name is not known", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "me": "saya", - "@me": { - "description": "First-person pronoun (i.e. 'me') that will be used in message author info, e.g. 'Me to 4 others' or 'Jon Snow to me'", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "authorToRecipient": "{authorName} hingga {recipientName}", - "@authorToRecipient": { - "description": "Author info for a single-recipient message; includes both the author name and the recipient name.", - "type": "text", - "placeholders_order": [ - "authorName", - "recipientName" - ], - "placeholders": { - "authorName": {}, - "recipientName": {} - } - }, - "authorToNOthers": "{howMany,plural, =1{{authorName} ke 1 lainnya}other{{authorName} ke {howMany} lainnya}}", - "@authorToNOthers": { - "description": "Author info for a mutli-recipient message; includes the author name and the number of recipients", - "type": "text", - "placeholders_order": [ - "authorName", - "howMany" - ], - "placeholders": { - "authorName": {}, - "howMany": {} - } - }, - "authorToRecipientAndNOthers": "{howMany,plural, =1{{authorName} ke {recipientName} & 1 lainnya}other{{authorName} ke {recipientName} & {howMany} lainnya}}", - "@authorToRecipientAndNOthers": { - "description": "Author info for a multi-recipient message; includes the author name, one recipient name, and the number of other recipients", - "type": "text", - "placeholders_order": [ - "authorName", - "recipientName", - "howMany" - ], - "placeholders": { - "authorName": {}, - "recipientName": {}, - "howMany": {} - } - }, - "Download": "Unduh", - "@Download": { - "description": "Label for the button that will begin downloading a file", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Open with another app": "Buka dengan aplikasi lain", - "@Open with another app": { - "description": "Label for the button that will allow users to open a file with another app", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There are no installed applications that can open this file": "Tidak ada aplikasi terinstal yang dapat membuka file ini", - "@There are no installed applications that can open this file": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unsupported File": "File Tidak Didukung", - "@Unsupported File": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "This file is unsupported and can’t be viewed through the app": "File ini tidak didukung dan tidak dapat dilihat melalui aplikasi", - "@This file is unsupported and can’t be viewed through the app": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unable to play this media file": "Tidak dapat memutar file media ini", - "@Unable to play this media file": { - "description": "Message shown when audio or video media could not be played", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unable to load this image": "Tidak dapat memuat gambar ini", - "@Unable to load this image": { - "description": "Message shown when an image file could not be loaded or displayed", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading this file": "Terjadi kesalahan saat memuat file ini", - "@There was an error loading this file": { - "description": "Message shown when a file could not be loaded or displayed", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Courses": "Tidak Ada Kursus", - "@No Courses": { - "description": "Title for having no courses", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Your student’s courses might not be published yet.": "Kursus siswa Anda mungkin belum diterbitkan.", - "@Your student’s courses might not be published yet.": { - "description": "Message for having no courses", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading your student’s courses.": "Terjadi kesalahan ketika memuat kursus siswa Anda.", - "@There was an error loading your student’s courses.": { - "description": "Message displayed when the list of student courses could not be loaded", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Grade": "Tanpa Nilai", - "@No Grade": { - "description": "Message shown when there is currently no grade available for a course", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Filter by": "Filter menurut", - "@Filter by": { - "description": "Title for list of terms to filter grades by", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Grades": "Nilai", - "@Grades": { - "description": "Label for the \"Grades\" tab in course details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Syllabus": "Silabus", - "@Syllabus": { - "description": "Label for the \"Syllabus\" tab in course details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Front Page": "Halaman Depan", - "@Front Page": { - "description": "Label for the \"Front Page\" tab in course details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Summary": "Rangkuman", - "@Summary": { - "description": "Label for the \"Summary\" tab in course details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Send a message about this course": "Kirim pesan tentang kursus ini", - "@Send a message about this course": { - "description": "Accessibility hint for the course messaage floating action button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Total Grade": "Nilai Total", - "@Total Grade": { - "description": "Label for the total grade in the course", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Graded": "Dinilai", - "@Graded": { - "description": "Label for assignments that have been graded", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Submitted": "Diserahkan", - "@Submitted": { - "description": "Label for assignments that have been submitted", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Not Submitted": "Belum Diserahkan", - "@Not Submitted": { - "description": "Label for assignments that have not been submitted", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Late": "Terlambat", - "@Late": { - "description": "Label for assignments that have been marked late or submitted late", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Missing": "Tidak Ada", - "@Missing": { - "description": "Label for assignments that have been marked missing or are not submitted and past the due date", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "-": "-", - "@-": { - "description": "Value representing no score for student submission", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "All Grading Periods": "Semua Periode Penilaian", - "@All Grading Periods": { - "description": "Label for selecting all grading periods", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Assignments": "Tidak Ada Tugas", - "@No Assignments": { - "description": "Title for the no assignments message", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "It looks like assignments haven't been created in this space yet.": "Sepertinya tugas belum dibuat di ruang ini.", - "@It looks like assignments haven't been created in this space yet.": { - "description": "Message for no assignments", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading the summary details for this course.": "Terjadi kesalahan saat memuat detail rangkuman untuk kursus ini.", - "@There was an error loading the summary details for this course.": { - "description": "Message shown when the course summary could not be loaded", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Summary": "Tidak Ada Rangkuman", - "@No Summary": { - "description": "Title displayed when there are no items in the course summary", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "This course does not have any assignments or calendar events yet.": "Kursus in belum memiliki tugas atau acara kalender.", - "@This course does not have any assignments or calendar events yet.": { - "description": "Message displayed when there are no items in the course summary", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "gradeFormatScoreOutOfPointsPossible": "{score} / {pointsPossible}", - "@gradeFormatScoreOutOfPointsPossible": { - "description": "Formatted string for a student score out of the points possible", - "type": "text", - "placeholders_order": [ - "score", - "pointsPossible" - ], - "placeholders": { - "score": {}, - "pointsPossible": {} - } - }, - "contentDescriptionScoreOutOfPointsPossible": "{score} dari {pointsPossible} poin", - "@contentDescriptionScoreOutOfPointsPossible": { - "description": "Formatted string for a student score out of the points possible", - "type": "text", - "placeholders_order": [ - "score", - "pointsPossible" - ], - "placeholders": { - "score": {}, - "pointsPossible": {} - } - }, - "gradesSubjectMessage": "Tentang: {studentName}, Nilai", - "@gradesSubjectMessage": { - "description": "The subject line for a message to a teacher regarding a student's grades", - "type": "text", - "placeholders_order": [ - "studentName" - ], - "placeholders": { - "studentName": {} - } - }, - "syllabusSubjectMessage": "Tentang: {studentName}, Silabus", - "@syllabusSubjectMessage": { - "description": "The subject line for a message to a teacher regarding a course syllabus", - "type": "text", - "placeholders_order": [ - "studentName" - ], - "placeholders": { - "studentName": {} - } - }, - "frontPageSubjectMessage": "Tentang: {studentName}, Halaman Depan", - "@frontPageSubjectMessage": { - "description": "The subject line for a message to a teacher regarding a course front page", - "type": "text", - "placeholders_order": [ - "studentName" - ], - "placeholders": { - "studentName": {} - } - }, - "assignmentSubjectMessage": "Tentang: {studentName}, Tugas - {assignmentName}", - "@assignmentSubjectMessage": { - "description": "The subject line for a message to a teacher regarding a student's assignment", - "type": "text", - "placeholders_order": [ - "studentName", - "assignmentName" - ], - "placeholders": { - "studentName": {}, - "assignmentName": {} - } - }, - "eventSubjectMessage": "Tentang: {studentName}, Acara - {eventTitle}", - "@eventSubjectMessage": { - "description": "The subject line for a message to a teacher regarding a calendar event", - "type": "text", - "placeholders_order": [ - "studentName", - "eventTitle" - ], - "placeholders": { - "studentName": {}, - "eventTitle": {} - } - }, - "There is no page information available.": "Informasi halaman tidak tersedia.", - "@There is no page information available.": { - "description": "Description for when no page information is available", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Assignment Details": "Detail Tugas", - "@Assignment Details": { - "description": "Title for the page that shows details for an assignment", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "assignmentTotalPoints": "{points} poin", - "@assignmentTotalPoints": { - "description": "Label used for the total points the assignment is worth", - "type": "text", - "placeholders_order": [ - "points" - ], - "placeholders": { - "points": {} - } - }, - "assignmentTotalPointsAccessible": "{points} poin", - "@assignmentTotalPointsAccessible": { - "description": "Screen reader label used for the total points the assignment is worth", - "type": "text", - "placeholders_order": [ - "points" - ], - "placeholders": { - "points": {} - } - }, - "Due": "Batas", - "@Due": { - "description": "Label for an assignment due date", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Grade": "Kelas", - "@Grade": { - "description": "Label for the section that displays an assignment's grade", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Locked": "Terkunci", - "@Locked": { - "description": "Label for when an assignment is locked", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "assignmentLockedModule": "Tugas ini dikunci oleh modul \"{moduleName}\".", - "@assignmentLockedModule": { - "description": "The locked description when an assignment is locked by a module", - "type": "text", - "placeholders_order": [ - "moduleName" - ], - "placeholders": { - "moduleName": {} - } - }, - "Remind Me": "Ingatkan Saya", - "@Remind Me": { - "description": "Label for the row to set reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Set a date and time to be notified of this specific assignment.": "Atur tanggal dan waktu untuk diberi tahu tugas spesifik ini.", - "@Set a date and time to be notified of this specific assignment.": { - "description": "Description for row to set reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You will be notified about this assignment on…": "Anda akan diberi tahu tentang tugas ini pada…", - "@You will be notified about this assignment on…": { - "description": "Description for when a reminder is set", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Instructions": "Petunjuk", - "@Instructions": { - "description": "Label for the description of the assignment when it has quiz instructions", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Send a message about this assignment": "Kirim pesan tentang tugas ini", - "@Send a message about this assignment": { - "description": "Accessibility hint for the assignment messaage floating action button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "This app is not authorized for use.": "Aplikasi ini tidak diizinkan untuk digunakan.", - "@This app is not authorized for use.": { - "description": "The error shown when the app being used is not verified by Canvas", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The server you entered is not authorized for this app.": "Server yang Anda masukkan tidak diizinkan untuk aplikasi ini.", - "@The server you entered is not authorized for this app.": { - "description": "The error shown when the desired login domain is not verified by Canvas", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The user agent for this app is not authorized.": "Agen pengguna untuk aplikasi ini tidak diizinkan.", - "@The user agent for this app is not authorized.": { - "description": "The error shown when the user agent during verification is not verified by Canvas", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "We were unable to verify the server for use with this app.": "Kami tidak dapat memverifikasi server untuk digunakan bersama aplikasi ini.", - "@We were unable to verify the server for use with this app.": { - "description": "The generic error shown when we are unable to verify with Canvas", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Reminders": "Pengingat", - "@Reminders": { - "description": "Name of the system notification channel for assignment and event reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Notifications for reminders about assignments and calendar events": "Notifikasi untuk pengingat tentang tugas dan acara kalender", - "@Notifications for reminders about assignments and calendar events": { - "description": "Description of the system notification channel for assignment and event reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Reminders have changed!": "Pengingat sudah berubah!", - "@Reminders have changed!": { - "description": "Title of the dialog shown when the user needs to update their reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "In order to provide you with a better experience, we have updated how reminders work. You can add new reminders by viewing an assignment or calendar event and tapping the switch under the \"Remind Me\" section.\n\nBe aware that any reminders created with older versions of this app will not be compatible with the new changes and you will need to create them again.": "Untuk memberi Anda pengalaman yang lebih baik, kami telah memperbarui cara kerja pengingat. Anda dapat menambah pengingat dengan melihat tugas atau acara kalender dan mengetuk sakelar di bawah bagian \"Ingatkan Saya\".\n\nMohon pahami bahwa segala pengingat yang dibuat dengan versi aplikasi yang lebih tua tidak akan kompatibel dengan perubahan baru dan Anda perlu membuatnya lagi.", - "@In order to provide you with a better experience, we have updated how reminders work. You can add new reminders by viewing an assignment or calendar event and tapping the switch under the \"Remind Me\" section.\n\nBe aware that any reminders created with older versions of this app will not be compatible with the new changes and you will need to create them again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Not a parent?": "Bukan orang tua?", - "@Not a parent?": { - "description": "Title for the screen that shows when the user is not observing any students", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "We couldn't find any students associated with this account": "Kami tidak dapat menemukan siswa apa pun yang terkait dengan akun ini", - "@We couldn't find any students associated with this account": { - "description": "Subtitle for the screen that shows when the user is not observing any students", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Are you a student or teacher?": "Anda siswa atau guru?", - "@Are you a student or teacher?": { - "description": "Label for button that will show users the option to view other Canvas apps in the Play Store", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "One of our other apps might be a better fit. Tap one to visit the Play Store.": "Salah satu app lain mungkin lebih cocok. Ketuk untuk membuka App Store.", - "@One of our other apps might be a better fit. Tap one to visit the Play Store.": { - "description": "Description of options to view other Canvas apps in the Play Store", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Return to Login": "Kembali ke Login", - "@Return to Login": { - "description": "Label for the button that returns the user to the login screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "STUDENT": "SISWA", - "@STUDENT": { - "description": "The \"student\" portion of the \"Canvas Student\" app name, in all caps. \"Canvas\" is excluded in this context as it will be displayed to the user as a wordmark image", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "TEACHER": "GURU", - "@TEACHER": { - "description": "The \"teacher\" portion of the \"Canvas Teacher\" app name, in all caps. \"Canvas\" is excluded in this context as it will be displayed to the user as a wordmark image", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Canvas Student": "Canvas Student", - "@Canvas Student": { - "description": "The name of the Canvas Student app. Only \"Student\" should be translated as \"Canvas\" is a brand name in this context and should not be translated.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Canvas Teacher": "Canvas Teacher", - "@Canvas Teacher": { - "description": "The name of the Canvas Teacher app. Only \"Teacher\" should be translated as \"Canvas\" is a brand name in this context and should not be translated.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Alerts": "Tanpa Peringatan", - "@No Alerts": { - "description": "The title for the empty message to show to users when there are no alerts for the student.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There’s nothing to be notified of yet.": "Belum ada notifikasi untuk apa pun.", - "@There’s nothing to be notified of yet.": { - "description": "The empty message to show to users when there are no alerts for the student.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "dismissAlertLabel": "Singkirkan {alertTitle}", - "@dismissAlertLabel": { - "description": "Accessibility label to dismiss an alert", - "type": "text", - "placeholders_order": [ - "alertTitle" - ], - "placeholders": { - "alertTitle": {} - } - }, - "Course Announcement": "Pengumuman Kursus", - "@Course Announcement": { - "description": "Title for alerts when there is a course announcement", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Institution Announcement": "Pengumuman Lembaga", - "@Institution Announcement": { - "description": "Title for alerts when there is an institution announcement", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "assignmentGradeAboveThreshold": "Nilai Tugas Di Atas {threshold}", - "@assignmentGradeAboveThreshold": { - "description": "Title for alerts when an assignment grade is above the threshold value", - "type": "text", - "placeholders_order": [ - "threshold" - ], - "placeholders": { - "threshold": {} - } - }, - "assignmentGradeBelowThreshold": "Nilai Tugas Di Bawah {threshold}", - "@assignmentGradeBelowThreshold": { - "description": "Title for alerts when an assignment grade is below the threshold value", - "type": "text", - "placeholders_order": [ - "threshold" - ], - "placeholders": { - "threshold": {} - } - }, - "courseGradeAboveThreshold": "Nilai Kursus Di Atas {threshold}", - "@courseGradeAboveThreshold": { - "description": "Title for alerts when a course grade is above the threshold value", - "type": "text", - "placeholders_order": [ - "threshold" - ], - "placeholders": { - "threshold": {} - } - }, - "courseGradeBelowThreshold": "Nilai Kursus Di Bawah {threshold}", - "@courseGradeBelowThreshold": { - "description": "Title for alerts when a course grade is below the threshold value", - "type": "text", - "placeholders_order": [ - "threshold" - ], - "placeholders": { - "threshold": {} - } - }, - "Settings": "Pengaturan", - "@Settings": { - "description": "Title for the settings screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Theme": "Tema", - "@Theme": { - "description": "Label for the light/dark theme section in the settings page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Dark Mode": "Mode Gelap", - "@Dark Mode": { - "description": "Label for the button that enables dark mode", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Light Mode": "Mode Terang", - "@Light Mode": { - "description": "Label for the button that enables light mode", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "High Contrast Mode": "Mode Kontras Tinggi", - "@High Contrast Mode": { - "description": "Label for the switch that toggles high contrast mode", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Use Dark Theme in Web Content": "Gunakan Tema Gelap di Konten Web", - "@Use Dark Theme in Web Content": { - "description": "Label for the switch that toggles dark mode for webviews", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Appearance": "Tampilan", - "@Appearance": { - "description": "Label for the appearance section in the settings page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Successfully submitted!": "Berhasil diserahkan!", - "@Successfully submitted!": { - "description": "Title displayed in the grade cell for an assignment that has been submitted", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "submissionStatusSuccessSubtitle": "Tugas ini diserahkan pada {date} pukul {time} dan menunggu untuk dinilai", - "@submissionStatusSuccessSubtitle": { - "description": "Subtitle displayed in the grade cell for an assignment that has been submitted and is awaiting a grade", - "type": "text", - "placeholders_order": [ - "date", - "time" - ], - "placeholders": { - "date": {}, - "time": {} - } - }, - "outOfPoints": "{howMany,plural, =1{Dari 1 poin}other{Dari {points} poin}}", - "@outOfPoints": { - "description": "Description for an assignment grade that has points without a current scoroe", - "type": "text", - "placeholders_order": [ - "points", - "howMany" - ], - "placeholders": { - "points": {}, - "howMany": {} - } - }, - "Excused": "Dibolehkan", - "@Excused": { - "description": "Grading status for an assignment marked as excused", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Complete": "Lengkap", - "@Complete": { - "description": "Grading status for an assignment marked as complete", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Incomplete": "Tidak lengkap", - "@Incomplete": { - "description": "Grading status for an assignment marked as incomplete", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "minus": "minus", - "@minus": { - "description": "Screen reader-friendly replacement for the \"-\" character in letter grades like \"A-\"", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "latePenalty": "Penalti terlambat ({pointsLost})", - "@latePenalty": { - "description": "Text displayed when a late penalty has been applied to the assignment", - "type": "text", - "placeholders_order": [ - "pointsLost" - ], - "placeholders": { - "pointsLost": {} - } - }, - "finalGrade": "Nilai Final: {grade}", - "@finalGrade": { - "description": "Text that displays the final grade of an assignment", - "type": "text", - "placeholders_order": [ - "grade" - ], - "placeholders": { - "grade": {} - } - }, - "Alert Settings": "Pengaturan Peringatan", - "@Alert Settings": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Alert me when…": "Ingatkan saya ketika...", - "@Alert me when…": { - "description": "Header for the screen where the observer chooses the thresholds that will determine when they receive alerts (e.g. when an assignment is graded below 70%)", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Course grade below": "Nilai kursus di bawah", - "@Course grade below": { - "description": "Label describing the threshold for when the course grade is below a certain percentage", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Course grade above": "Nilai kursus di atas", - "@Course grade above": { - "description": "Label describing the threshold for when the course grade is above a certain percentage", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Assignment missing": "Tugas tidak ada", - "@Assignment missing": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Assignment grade below": "Nilai tugas di bawah", - "@Assignment grade below": { - "description": "Label describing the threshold for when an assignment is graded below a certain percentage", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Assignment grade above": "Nilai tugas di atas", - "@Assignment grade above": { - "description": "Label describing the threshold for when an assignment is graded above a certain percentage", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Course Announcements": "Pengumuman Kursus", - "@Course Announcements": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Institution Announcements": "Pengumuman Institusi", - "@Institution Announcements": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Never": "Tidak Pernah", - "@Never": { - "description": "Indication that tells the user they will not receive alert notifications of a specific kind", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Grade percentage": "Persentase nilai", - "@Grade percentage": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading your student's alerts.": "Terjadi kesalahan ketika memuat peringatan siswa Anda.", - "@There was an error loading your student's alerts.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Must be below 100": "Harus di bawah 100", - "@Must be below 100": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "mustBeBelowN": "Harus di bawah {percentage}", - "@mustBeBelowN": { - "description": "Validation error to the user that they must choose a percentage below 'n'", - "type": "text", - "placeholders_order": [ - "percentage" - ], - "placeholders": { - "percentage": { - "example": 5 - } - } - }, - "mustBeAboveN": "Harus di atas {percentage}", - "@mustBeAboveN": { - "description": "Validation error to the user that they must choose a percentage above 'n'", - "type": "text", - "placeholders_order": [ - "percentage" - ], - "placeholders": { - "percentage": { - "example": 5 - } - } - }, - "Select Student Color": "Pilih Warna Siswa", - "@Select Student Color": { - "description": "Title for screen that allows users to assign a color to a specific student", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Electric, blue": "Electric, blue", - "@Electric, blue": { - "description": "Name of the Electric (blue) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Plum, Purple": "Plum, Purple", - "@Plum, Purple": { - "description": "Name of the Plum (purple) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Barney, Fuschia": "Barney, Fuschia", - "@Barney, Fuschia": { - "description": "Name of the Barney (fuschia) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Raspberry, Red": "Raspberry, Red", - "@Raspberry, Red": { - "description": "Name of the Raspberry (red) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Fire, Orange": "Fire, Orange", - "@Fire, Orange": { - "description": "Name of the Fire (orange) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Shamrock, Green": "Shamrock, Green", - "@Shamrock, Green": { - "description": "Name of the Shamrock (green) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "An error occurred while saving your selection. Please try again.": "Kesalahan terjadi saat menyimpan pilihan Anda. Silakan coba lagi.", - "@An error occurred while saving your selection. Please try again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "changeStudentColorLabel": "Ubah warna untuk {studentName}", - "@changeStudentColorLabel": { - "description": "Accessibility label for the button that lets users change the color associated with a specific student", - "type": "text", - "placeholders_order": [ - "studentName" - ], - "placeholders": { - "studentName": {} - } - }, - "Teacher": "Guru", - "@Teacher": { - "description": "Label for the Teacher enrollment type", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Student": "Siswa", - "@Student": { - "description": "Label for the Student enrollment type", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "TA": "TA", - "@TA": { - "description": "Label for the Teaching Assistant enrollment type (also known as Teacher Aid or Education Assistant), reduced to a short acronym/initialism if appropriate.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Observer": "Pengamat", - "@Observer": { - "description": "Label for the Observer enrollment type", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Use Camera": "Gunakan Kamera", - "@Use Camera": { - "description": "Label for the action item that lets the user capture a photo using the device camera", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Upload File": "Unggah File", - "@Upload File": { - "description": "Label for the action item that lets the user upload a file from their device", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Choose from Gallery": "Pilih dari Galeri", - "@Choose from Gallery": { - "description": "Label for the action item that lets the user select a photo from their device gallery", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Preparing…": "Menyiapkan...", - "@Preparing…": { - "description": "Message shown while a file is being prepared to attach to a message", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Add student with…": "Tambah siswa dengan...", - "@Add student with…": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Add Student": "Tambah Siswa", - "@Add Student": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You are not observing any students.": "Anda tidak mengamati siswa manapun.", - "@You are not observing any students.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading your students.": "Terjadi kesalahan ketika memuat siswa Anda.", - "@There was an error loading your students.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Pairing Code": "Kode Pairing", - "@Pairing Code": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Students can obtain a pairing code through the Canvas website": "Siswa bisa mendapat kode pairing melalui situs web Canvas", - "@Students can obtain a pairing code through the Canvas website": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Enter the student pairing code provided to you. If the pairing code doesn't work, it may have expired": "Masukkan kode pairing siswa yang diberikan kepada Anda. Jika kode pairing gagal, mungkin sudah kedaluwarsa", - "@Enter the student pairing code provided to you. If the pairing code doesn't work, it may have expired": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Your code is incorrect or expired.": "Kode Anda salah atau sudah kedaluwarsa.", - "@Your code is incorrect or expired.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Something went wrong trying to create your account, please reach out to your school for assistance.": "Terjadi kesalahan saat mencoba membuat akun Anda, silakan hubungi sekolah Anda untuk mendapat bantuan.", - "@Something went wrong trying to create your account, please reach out to your school for assistance.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "QR Code": "Kode QR", - "@QR Code": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Students can create a QR code using the Canvas Student app on their mobile device": "Siswa dapat membuat kode QR menggunakan aplikasi Canvas Student di perangkat selulernya", - "@Students can create a QR code using the Canvas Student app on their mobile device": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Add new student": "Tambah siswa baru", - "@Add new student": { - "description": "Semantics label for the FAB on the Manage Students Screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Select": "Pilih", - "@Select": { - "description": "Hint text to tell the user to choose one of two options", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I have a Canvas account": "Saya punya akun Canvas", - "@I have a Canvas account": { - "description": "Option to select for users that have a canvas account", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I don't have a Canvas account": "Saya tidak punya akun Canvas", - "@I don't have a Canvas account": { - "description": "Option to select for users that don't have a canvas account", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Create Account": "Buat Akun", - "@Create Account": { - "description": "Button text for account creation confirmation", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Full Name": "Nama Lengkap", - "@Full Name": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Email Address": "Alamat Email", - "@Email Address": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Password": "Kata sandi", - "@Password": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Full Name…": "Nama Lengkap...", - "@Full Name…": { - "description": "hint label for inside form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Email…": "Email...", - "@Email…": { - "description": "hint label for inside form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Password…": "Kata sandi...", - "@Password…": { - "description": "hint label for inside form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Please enter full name": "Silakan masukkan nama lengkap", - "@Please enter full name": { - "description": "Error message for form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Please enter an email address": "Silakan masukkan alamat email", - "@Please enter an email address": { - "description": "Error message for form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Please enter a valid email address": "Silakan alamat email yang valid", - "@Please enter a valid email address": { - "description": "Error message for form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Password is required": "Kata sandi harus ada", - "@Password is required": { - "description": "Error message for form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Password must contain at least 8 characters": "Kata sandi harus memuat setidaknya 8 karakter.", - "@Password must contain at least 8 characters": { - "description": "Error message for form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "qrCreateAccountTos": "Dengan mengetuk ‘Buat Akun’, Anda menyetujui {termsOfService} dan mengakui {privacyPolicy}", - "@qrCreateAccountTos": { - "description": "The text show on the account creation screen", - "type": "text", - "placeholders_order": [ - "termsOfService", - "privacyPolicy" - ], - "placeholders": { - "termsOfService": {}, - "privacyPolicy": {} - } - }, - "Terms of Service": "Ketentuan Layanan", - "@Terms of Service": { - "description": "Label for the Canvas Terms of Service agreement. This will be used in the qrCreateAccountTos text and will be highlighted and clickable", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Privacy Policy": "Kebijakan Privasi", - "@Privacy Policy": { - "description": "Label for the Canvas Privacy Policy agreement. This will be used in the qrCreateAccountTos text and will be highlighted and clickable", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "View the Privacy Policy": "Lihat Kebijakan Privasi", - "@View the Privacy Policy": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Already have an account? ": "Sudah memiliki akun? ", - "@Already have an account? ": { - "description": "Part of multiline text span, includes AccountSignIn1-2, in that order", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Sign In": "Masuk", - "@Sign In": { - "description": "Part of multiline text span, includes AccountSignIn1-2, in that order", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Hide Password": "Sembunyikan Kata Sandi", - "@Hide Password": { - "description": "content description for password hide button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Show Password": "Tampilkan Kata Sandi", - "@Show Password": { - "description": "content description for password show button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Terms of Service Link": "Tautan Ketentuan Layanan", - "@Terms of Service Link": { - "description": "content description for terms of service link", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Privacy Policy Link": "Tautan Kebijakan Privasi", - "@Privacy Policy Link": { - "description": "content description for privacy policy link", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Event": "Acara", - "@Event": { - "description": "Title for the event details screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Date": "Tanggal", - "@Date": { - "description": "Label for the event date", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Location": "Lokasi", - "@Location": { - "description": "Label for the location information", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Location Specified": "Lokasi Tidak Ditetapkan", - "@No Location Specified": { - "description": "Description for events that do not have a location", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "eventTime": "{startAt} - {endAt}", - "@eventTime": { - "description": "The time the event is happening, example: \"2:00 pm - 4:00 pm\"", - "type": "text", - "placeholders_order": [ - "startAt", - "endAt" - ], - "placeholders": { - "startAt": {}, - "endAt": {} - } - }, - "Set a date and time to be notified of this event.": "Atur tanggal dan waktu untuk diberi tahu tentang acara ini.", - "@Set a date and time to be notified of this event.": { - "description": "Description for row to set event reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You will be notified about this event on…": "Anda akan diberi tahu tentang acara ini pada…", - "@You will be notified about this event on…": { - "description": "Description for when an event reminder is set", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Share Your Love for the App": "Bagikan Cinta Anda untuk Aplikasi", - "@Share Your Love for the App": { - "description": "Label for option to open the app store", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Tell us about your favorite parts of the app": "Beri tahu kami bagian favorit Anda dari aplikasi", - "@Tell us about your favorite parts of the app": { - "description": "Description for option to open the app store", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Legal": "Hukum", - "@Legal": { - "description": "Label for legal information option", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Privacy policy, terms of use, open source": "Kebijakan privasi, ketentuan penggunaan, open source", - "@Privacy policy, terms of use, open source": { - "description": "Description for legal information option", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Idea for Canvas Parent App [Android]": "Ide untuk aplikasi Canvas Parent [Android]", - "@Idea for Canvas Parent App [Android]": { - "description": "The subject for the email to request a feature", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The following information will help us better understand your idea:": "Informasi berikut akan membantu kami memahami ide Anda lebih baik:", - "@The following information will help us better understand your idea:": { - "description": "The header for the users information that is attached to a feature request", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Domain:": "Domain:", - "@Domain:": { - "description": "The label for the Canvas domain of the logged in user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "User ID:": "ID Pengguna:", - "@User ID:": { - "description": "The label for the Canvas user ID of the logged in user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Email:": "Email:", - "@Email:": { - "description": "The label for the eamil of the logged in user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Locale:": "Lokasi:", - "@Locale:": { - "description": "The label for the locale of the logged in user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Terms of Use": "Ketentuan Penggunaan", - "@Terms of Use": { - "description": "Label for the terms of use", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Canvas on GitHub": "Canvas di GitHub", - "@Canvas on GitHub": { - "description": "Label for the button that opens the Canvas project on GitHub's website", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was a problem loading the Terms of Use": "Ada masalah saat memuat Ketentuan Penggunaan", - "@There was a problem loading the Terms of Use": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Device": "Perangkat", - "@Device": { - "description": "Label used for device manufacturer/model in the error report", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "OS Version": "Versi OS", - "@OS Version": { - "description": "Label used for device operating system version in the error report", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Version Number": "Nomor Versi", - "@Version Number": { - "description": "Label used for the app version number in the error report", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Report A Problem": "Laporkan Masalah", - "@Report A Problem": { - "description": "Title used for generic dialog to report problems", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Subject": "Subjek", - "@Subject": { - "description": "Label used for Subject text field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "A subject is required.": "Deskripsi harus ada.", - "@A subject is required.": { - "description": "Error shown when the subject field is empty", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "An email address is required.": "Alamat email harus ada.", - "@An email address is required.": { - "description": "Error shown when the email field is empty", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Description": "Deskripsi", - "@Description": { - "description": "Label used for Description text field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "A description is required.": "Deskripsi harus ada.", - "@A description is required.": { - "description": "Error shown when the description field is empty", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "How is this affecting you?": "Bagaimana ini berpengaruh pada Anda?", - "@How is this affecting you?": { - "description": "Label used for the dropdown to select how severe the issue is", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "send": "kirim", - "@send": { - "description": "Label used for send button when reporting a problem", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Just a casual question, comment, idea, suggestion…": "Hanya pertanyaan biasa, komentar, ide, saran...", - "@Just a casual question, comment, idea, suggestion…": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I need some help but it's not urgent.": "Saya butuh bantuan tetapi tidak mendesak.", - "@I need some help but it's not urgent.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Something's broken but I can work around it to get what I need done.": "Ada yang terputus tetapi bisa saya cari cara untuk mendapat apa yang saya butuhkan.", - "@Something's broken but I can work around it to get what I need done.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I can't get things done until I hear back from you.": "Saya tidak bisa melakukan apa pun sampai saya mendapat info dari Anda.", - "@I can't get things done until I hear back from you.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "EXTREME CRITICAL EMERGENCY!!": "DARURAT KRITIKAL EKSTREM!!", - "@EXTREME CRITICAL EMERGENCY!!": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Not Graded": "Tidak Dinilai", - "@Not Graded": { - "description": "Description for an assignment has not been graded.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Login flow: Normal": "Alur login: Normal", - "@Login flow: Normal": { - "description": "Description for the normal login flow", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Login flow: Canvas": "Alur login: Canvas", - "@Login flow: Canvas": { - "description": "Description for the Canvas login flow", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Login flow: Site Admin": "Alur login: Admin Situs", - "@Login flow: Site Admin": { - "description": "Description for the Site Admin login flow", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Login flow: Skip mobile verify": "Alur login: Lewatkan verifikasi seluler", - "@Login flow: Skip mobile verify": { - "description": "Description for the login flow that skips domain verification for mobile", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Act As User": "Bertindak sebagai Pengguna", - "@Act As User": { - "description": "Label for the button that allows the user to act (masquerade) as another user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Stop Acting as User": "Stop Bertindak sebagai Pengguna", - "@Stop Acting as User": { - "description": "Label for the button that allows the user to stop acting (masquerading) as another user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "actingAsUser": "Anda bertindak sebagai {userName}", - "@actingAsUser": { - "description": "Message shown while acting (masquerading) as another user", - "type": "text", - "placeholders_order": [ - "userName" - ], - "placeholders": { - "userName": {} - } - }, - "\"Act as\" is essentially logging in as this user without a password. You will be able to take any action as if you were this user, and from other users' points of views, it will be as if this user performed them. However, audit logs record that you were the one who performed the actions on behalf of this user.": "“Act as” (Bertindak Sebagai) pada dasarnya adalah melakukan login sebagai pengguna ini tanpa kata sandi. Anda akan dapat melakukan tindakan apa pun jika Anda adalah pengguna ini, dan dari sudut pandang pengguna lain, ini seakan-akan pengguna ini melakukannya. Namun, log audit mencatat bahwa Anda lah orang yang melakukan tindakan atas nama pengguna ini.", - "@\"Act as\" is essentially logging in as this user without a password. You will be able to take any action as if you were this user, and from other users' points of views, it will be as if this user performed them. However, audit logs record that you were the one who performed the actions on behalf of this user.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Domain": "Domain", - "@Domain": { - "description": "Text field hint for domain url input", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You must enter a valid domain": "Anda harus memasukkan domain yang valid", - "@You must enter a valid domain": { - "description": "Message displayed for domain input error", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "User ID": "ID Pengguna", - "@User ID": { - "description": "Text field hint for user ID input", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You must enter a user id": "Anda harus memasukkan id pengguna", - "@You must enter a user id": { - "description": "Message displayed for user Id input error", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error trying to act as this user. Please check the Domain and User ID and try again.": "Terjadi kesalahan saat mencoba bertindak sebagai pengguna ini. Silakan cek Domain dan ID Pengguna dan coba lagi.", - "@There was an error trying to act as this user. Please check the Domain and User ID and try again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "endMasqueradeMessage": "Anda akan berhenti bertindak sebagai {userName} dan kembali ke akun asli Anda.", - "@endMasqueradeMessage": { - "description": "Confirmation message displayed when the user wants to stop acting (masquerading) as another user", - "type": "text", - "placeholders_order": [ - "userName" - ], - "placeholders": { - "userName": {} - } - }, - "endMasqueradeLogoutMessage": "Anda akan berhenti bertindak sebagai {userName} dan logout.", - "@endMasqueradeLogoutMessage": { - "description": "Confirmation message displayed when the user wants to stop acting (masquerading) as another user and will be logged out.", - "type": "text", - "placeholders_order": [ - "userName" - ], - "placeholders": { - "userName": {} - } - }, - "How are we doing?": "Bagaimana kabarnya?", - "@How are we doing?": { - "description": "Title for dialog asking user to rate the app out of 5 stars.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Don't show again": "Jangan tampilkan lagi", - "@Don't show again": { - "description": "Button to prevent the rating dialog from showing again.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "What can we do better?": "Apa yang dapat kami tingkatkan?", - "@What can we do better?": { - "description": "Hint text for providing a comment with the rating.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Send Feedback": "Kirim Umpan Balik", - "@Send Feedback": { - "description": "Button to send rating with feedback", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "ratingDialogEmailSubject": "Saran untuk Android - Canvas Parent {version}", - "@ratingDialogEmailSubject": { - "description": "The subject for an email to provide feedback for CanvasParent.", - "type": "text", - "placeholders_order": [ - "version" - ], - "placeholders": { - "version": {} - } - }, - "starRating": "{position,plural, =1{{position} bintang}other{{position} bintang}}", - "@starRating": { - "description": "Accessibility label for the 1 stars to 5 stars rating", - "type": "text", - "placeholders_order": [ - "position" - ], - "placeholders": { - "position": { - "example": 1 - } - } - }, - "Student Pairing": "Pairing Siswa", - "@Student Pairing": { - "description": "Title for the screen where users can pair to students using a QR code", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Open Canvas Student": "Buka Canvas Student", - "@Open Canvas Student": { - "description": "Title for QR pairing tutorial screen instructing users to open the Canvas Student app", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You'll need to open your student's Canvas Student app to continue. Go into Main Menu > Settings > Pair with Observer and scan the QR code you see there.": "Anda harus membuka aplikasi Canvas Student Anda untuk melanjutkan. Pergilah ke Menu Utama > Pengaturan > Pairing dengan Pengamat dan pindai kode QR yang Anda lihat di sana.", - "@You'll need to open your student's Canvas Student app to continue. Go into Main Menu > Settings > Pair with Observer and scan the QR code you see there.": { - "description": "Message explaining how QR code pairing works", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Screenshot showing location of pairing QR code generation in the Canvas Student app": "Tangkapan layar yang menampilkan lokasi pembuatan pairing kode QR di aplikasi Canvas Student", - "@Screenshot showing location of pairing QR code generation in the Canvas Student app": { - "description": "Content Description for qr pairing tutorial screenshot", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Expired QR Code": "Kode QR Kedaluwarsa", - "@Expired QR Code": { - "description": "Error title shown when the users scans a QR code that has expired", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The QR code you scanned may have expired. Refresh the code on the student's device and try again.": "Kode QR yang Anda pindai mungkin telah kedaluwarsa. Muat ulang kode di perangkat siswa dan coba lagi.", - "@The QR code you scanned may have expired. Refresh the code on the student's device and try again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "A network error occurred when adding this student. Check your connection and try again.": "Terjadi kesalahan jaringan saat menambah siswa ini. Periksa koneksi Anda dan coba lagi.", - "@A network error occurred when adding this student. Check your connection and try again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Invalid QR Code": "Kode QR Tidak Valid", - "@Invalid QR Code": { - "description": "Error title shown when the user scans an invalid QR code", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Incorrect Domain": "Domain Salah", - "@Incorrect Domain": { - "description": "Error title shown when the users scane a QR code for a student that belongs to a different domain", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The student you are trying to add belongs to a different school. Log in or create an account with that school to scan this code.": "Siswa yang Anda coba tambah ada di sekolah lain. Masuk atau buat akun dengan sekolah itu untuk memindai kode ini.", - "@The student you are trying to add belongs to a different school. Log in or create an account with that school to scan this code.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Camera Permission": "Izin Kamera", - "@Camera Permission": { - "description": "Error title shown when the user wans to scan a QR code but has denied the camera permission", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "This will unpair and remove all enrollments for this student from your account.": "Ini akan menghapus pairing dan menghapus semua pendaftaran untuk siswa ini dari akun Anda.", - "@This will unpair and remove all enrollments for this student from your account.": { - "description": "Confirmation message shown when the user tries to delete a student from their account", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was a problem removing this student from your account. Please check your connection and try again.": "Ada masalah saat menghapus siswa ini dari akun Anda. Silakan periksa sambungan internet Anda dan coba lagi.", - "@There was a problem removing this student from your account. Please check your connection and try again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Cancel": "Batal", - "@Cancel": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "next": "Berikutnya", - "@next": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "ok": "OK", - "@ok": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Yes": "Ya", - "@Yes": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No": "Tidak", - "@No": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Retry": "Coba lagi", - "@Retry": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Delete": "Hapus", - "@Delete": { - "description": "Label used for general delete/remove actions", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Done": "Selesai", - "@Done": { - "description": "Label for general done/finished actions", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Refresh": "Segarkan Ulang", - "@Refresh": { - "description": "Label for button to refresh data from the web", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "View Description": "Lihat Deskripsi", - "@View Description": { - "description": "Button to view the description for an event or assignment", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "expanded": "diperbesar", - "@expanded": { - "description": "Description for the accessibility reader for list groups that are expanded", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "collapsed": "diperkecil", - "@collapsed": { - "description": "Description for the accessibility reader for list groups that are expanded", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "An unexpected error occurred": "Terjadi kesalahan yang tidak terduga", - "@An unexpected error occurred": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No description": "Tanpa deskripsi", - "@No description": { - "description": "Message used when the assignment has no description", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Launch External Tool": "Luncurkan Alat Eksternal", - "@Launch External Tool": { - "description": "Button text added to webviews to let users open external tools in their browser", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Interactions on this page are limited by your institution.": "Interaksi di halaman ini dibatasi oleh institusi Anda.", - "@Interactions on this page are limited by your institution.": { - "description": "Message describing how the webview has limited access due to an instution setting", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "dateAtTime": "{date} di {time}", - "@dateAtTime": { - "description": "The string to format dates", - "type": "text", - "placeholders_order": [ - "date", - "time" - ], - "placeholders": { - "date": {}, - "time": {} - } - }, - "dueDateAtTime": "Batas waktu {date} pada {time}", - "@dueDateAtTime": { - "description": "The string to format due dates", - "type": "text", - "placeholders_order": [ - "date", - "time" - ], - "placeholders": { - "date": {}, - "time": {} - } - }, - "No Due Date": "Tidak Ada Batas Waktu", - "@No Due Date": { - "description": "Label for assignments that do not have a due date", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Filter": "Filter", - "@Filter": { - "description": "Label for buttons to filter what items are visible", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "unread": "belum dibaca", - "@unread": { - "description": "Label for things that are marked as unread", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "unreadCount": "{count} belum dibaca", - "@unreadCount": { - "description": "Formatted string for when there are a number of unread items", - "type": "text", - "placeholders_order": [ - "count" - ], - "placeholders": { - "count": {} - } - }, - "badgeNumberPlus": "{count}+", - "@badgeNumberPlus": { - "description": "Formatted string for when too many items are being notified in a badge, generally something like: 99+", - "type": "text", - "placeholders_order": [ - "count" - ], - "placeholders": { - "count": {} - } - }, - "There was an error loading this announcement": "Terjadi kesalahan saat memuat pengumuman ini", - "@There was an error loading this announcement": { - "description": "Message shown when an announcement detail screen fails to load", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Network error": "Kesalahan jaringan", - "@Network error": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Under Construction": "Sedang Dibuat", - "@Under Construction": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "We are currently building this feature for your viewing pleasure.": "Kami saat ini sedang membangun fitur ini untuk memudahkan Anda.", - "@We are currently building this feature for your viewing pleasure.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Request Login Help Button": "Tombol Minta Bantuan Login", - "@Request Login Help Button": { - "description": "Accessibility hint for button that opens help dialog for a login help request", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Request Login Help": "Minta Bantuan Login", - "@Request Login Help": { - "description": "Title of help dialog for a login help request", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I'm having trouble logging in": "Saya kesulitan login", - "@I'm having trouble logging in": { - "description": "Subject of help dialog for a login help request", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "An error occurred when trying to display this link": "Kesalahan terjadi saat mencoba menampilkan tautan ini.", - "@An error occurred when trying to display this link": { - "description": "Error message shown when a link can't be opened", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "We are unable to display this link, it may belong to an institution you currently aren't logged in to.": "Kami tidak dapat menampilkan tautan ini, mungkin milik institusi tempat Anda saat ini tidak login kepadanya.", - "@We are unable to display this link, it may belong to an institution you currently aren't logged in to.": { - "description": "Description for error page shown when clicking a link", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Link Error": "Kesalahan Tautan", - "@Link Error": { - "description": "Title for error page shown when clicking a link", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Open In Browser": "Buka di Browser", - "@Open In Browser": { - "description": "Text for button to open a link in the browswer", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You'll find the QR code on the web in your account profile. Click 'QR for Mobile Login' in the list.": "Anda akan menemukan kode QR di web di profil akun Anda. Klik 'QR untuk Login Seluler' di dalam daftar.", - "@You'll find the QR code on the web in your account profile. Click 'QR for Mobile Login' in the list.": { - "description": "Text for qr login tutorial screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Locate QR Code": "Temukan Kode QR", - "@Locate QR Code": { - "description": "Text for qr login button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Please scan a QR code generated by Canvas": "Silakan pindai kode QR yang dibuat oleh Canvas", - "@Please scan a QR code generated by Canvas": { - "description": "Text for qr login error with incorrect qr code", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error logging in. Please generate another QR Code and try again.": "Terjadi kesalahan saat login. Silakan buat Kode QR lain dan coba lagi.", - "@There was an error logging in. Please generate another QR Code and try again.": { - "description": "Text for qr login error", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Screenshot showing location of QR code generation in browser": "Tangkapan layar yang menampilkan lokasi pembuatan kode QR di browser", - "@Screenshot showing location of QR code generation in browser": { - "description": "Content Description for qr login tutorial screenshot", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "QR scanning requires camera access": "Pemindaian QR membutuhkan akses kamera", - "@QR scanning requires camera access": { - "description": "placeholder for camera error for QR code scan", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The linked item is no longer available": "Item yang dikaitkan tidak lagi tersedia", - "@The linked item is no longer available": { - "description": "error message when the alert could no be opened", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Message sent": "Pesan terkirim", - "@Message sent": { - "description": "confirmation message on the screen when the user succesfully sends a message", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Acceptable Use Policy": "Kebijakan Penggunaan yang Dapat Diterima", - "@Acceptable Use Policy": { - "description": "title for the acceptable use policy screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Submit": "Serahkan", - "@Submit": { - "description": "submit button title for acceptable use policy screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Either you're a new user or the Acceptable Use Policy has changed since you last agreed to it. Please agree to the Acceptable Use Policy before you continue.": "Anda pengguna baru atau Kebijakan Penggunaan yang Dapat Diterima telah berubah sejak Anda terakhir kali menyetujuinya. Silakan setujui Kebijakan Penggunaan yang Dapat Diterima sebelum Anda melanjutkan.", - "@Either you're a new user or the Acceptable Use Policy has changed since you last agreed to it. Please agree to the Acceptable Use Policy before you continue.": { - "description": "acceptable use policy screen description", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I agree to the Acceptable Use Policy.": "Saya menyetujui Kebijakan Penggunaan yang Dapat Diterima.", - "@I agree to the Acceptable Use Policy.": { - "description": "acceptable use policy switch title", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "About": "Tentang", - "@About": { - "description": "Title for about menu item in settings", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "App": "App", - "@App": { - "description": "Title for App field on about page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Login ID": "ID Login", - "@Login ID": { - "description": "Title for Login ID field on about page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Email": "Email", - "@Email": { - "description": "Title for Email field on about page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Version": "Versi", - "@Version": { - "description": "Title for Version field on about page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Instructure logo": "Logo Instructure", - "@Instructure logo": { - "description": "Semantics label for the Instructure logo on the about page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - } -} \ No newline at end of file diff --git a/apps/flutter_parent/lib/l10n/res/intl_is.arb b/apps/flutter_parent/lib/l10n/res/intl_is.arb deleted file mode 100644 index 611e1defc6..0000000000 --- a/apps/flutter_parent/lib/l10n/res/intl_is.arb +++ /dev/null @@ -1,2753 +0,0 @@ -{ - "@@last_modified": "2023-08-25T11:04:20.901151", - "alertsLabel": "Viðvaranir", - "@alertsLabel": { - "description": "The label for the Alerts tab", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "calendarLabel": "Dagatal", - "@calendarLabel": { - "description": "The label for the Calendar tab", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "coursesLabel": "Námskeið", - "@coursesLabel": { - "description": "The label for the Courses tab", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Students": "Engir nemendur", - "@No Students": { - "description": "Text for when an observer has no students they are observing", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Tap to show student selector": "Smelltu til að sýna nemendaval", - "@Tap to show student selector": { - "description": "Semantics label for the area that will show the student selector when tapped", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Tap to pair with a new student": "Smelltu til að para við nýjan nemanda", - "@Tap to pair with a new student": { - "description": "Semantics label for the add student button in the student selector", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Tap to select this student": "Smelltu til að velja þennan nemanda", - "@Tap to select this student": { - "description": "Semantics label on individual students in the student switcher", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Manage Students": "Stjórna nemendum", - "@Manage Students": { - "description": "Label text for the Manage Students nav drawer button as well as the title for the Manage Students screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Help": "Hjálp", - "@Help": { - "description": "Label text for the help nav drawer button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Log Out": "Útskráning", - "@Log Out": { - "description": "Label text for the Log Out nav drawer button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Switch Users": "Skipta um notendur", - "@Switch Users": { - "description": "Label text for the Switch Users nav drawer button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "appVersion": "útg. {version}", - "@appVersion": { - "description": "App version shown in the navigation drawer", - "type": "text", - "placeholders_order": [ - "version" - ], - "placeholders": { - "version": {} - } - }, - "Are you sure you want to log out?": "Viltu örugglega skrá þig út?", - "@Are you sure you want to log out?": { - "description": "Confirmation message displayed when the user tries to log out", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Calendars": "Dagatöl", - "@Calendars": { - "description": "Label for button that lets users select which calendars to display", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "nextMonth": "Næsti mánuður: {month}", - "@nextMonth": { - "description": "Label for the button that switches the calendar to the next month", - "type": "text", - "placeholders_order": [ - "month" - ], - "placeholders": { - "month": {} - } - }, - "previousMonth": "Fyrri mánuður: {month}", - "@previousMonth": { - "description": "Label for the button that switches the calendar to the previous month", - "type": "text", - "placeholders_order": [ - "month" - ], - "placeholders": { - "month": {} - } - }, - "nextWeek": "Næsta vika hefst {date}", - "@nextWeek": { - "description": "Label for the button that switches the calendar to the next week", - "type": "text", - "placeholders_order": [ - "date" - ], - "placeholders": { - "date": {} - } - }, - "previousWeek": "Fyrri vika hefst {date}", - "@previousWeek": { - "description": "Label for the button that switches the calendar to the previous week", - "type": "text", - "placeholders_order": [ - "date" - ], - "placeholders": { - "date": {} - } - }, - "selectedMonthLabel": "{month} mánuði", - "@selectedMonthLabel": { - "description": "Accessibility label for the button that expands/collapses the month view", - "type": "text", - "placeholders_order": [ - "month" - ], - "placeholders": { - "month": {} - } - }, - "expand": "víkka", - "@expand": { - "description": "Accessibility label for the on-tap hint for the button that expands/collapses the month view", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "collapse": "fella saman", - "@collapse": { - "description": "Accessibility label for the on-tap hint for the button that expands/collapses the month view", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "pointsPossible": "{points} punktar mögulegir", - "@pointsPossible": { - "description": "Screen reader label used for the points possible for an assignment, quiz, etc.", - "type": "text", - "placeholders_order": [ - "points" - ], - "placeholders": { - "points": {} - } - }, - "calendarDaySemanticsLabel": "{eventCount,plural, =1{{date}, {eventCount} viðburður}other{{date}, {eventCount} viðburðir}}", - "@calendarDaySemanticsLabel": { - "description": "Screen reader label used for calendar day, reads the date and count of events", - "type": "text", - "placeholders_order": [ - "date", - "eventCount" - ], - "placeholders": { - "date": {}, - "eventCount": {} - } - }, - "No Events Today!": "Engir viðburðir í dag!", - "@No Events Today!": { - "description": "Title displayed when there are no calendar events for the current day", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "It looks like a great day to rest, relax, and recharge.": "Þetta virðist vera góður dagur til að hvílast, slaka á og hlaða batteríin.", - "@It looks like a great day to rest, relax, and recharge.": { - "description": "Message displayed when there are no calendar events for the current day", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading your student's calendar": "Villa kom upp við að sækja dagatal nemanda", - "@There was an error loading your student's calendar": { - "description": "Message displayed when calendar events could not be loaded for the current student", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Tap to favorite the courses you want to see on the Calendar. Select up to 10.": "Smelltu til að setja námskeiðin sem þú vilt sjá á dagatalinu sem eftirlæti. Veldu allt að tíu.", - "@Tap to favorite the courses you want to see on the Calendar. Select up to 10.": { - "description": "Description text on calendar filter screen.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You may only choose 10 calendars to display": "Aðeins er hægt að velja tíu dagatöl til að sýna", - "@You may only choose 10 calendars to display": { - "description": "Error text when trying to select more than 10 calendars", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You must select at least one calendar to display": "Velja þarf að minnsta kosti eitt dagatal til að sýna", - "@You must select at least one calendar to display": { - "description": "Error text when trying to de-select all calendars", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Planner Note": "Minnismiði skipuleggjara", - "@Planner Note": { - "description": "Label used for notes in the planner", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Go to today": "Fara í daginn í dag", - "@Go to today": { - "description": "Accessibility label used for the today button in the planner", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Previous Logins": "Fyrri innskráningar", - "@Previous Logins": { - "description": "Label for the list of previous user logins", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "canvasLogoLabel": "Canvas myndmerki", - "@canvasLogoLabel": { - "description": "The semantics label for the Canvas logo", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "findSchool": "Finna skóla", - "@findSchool": { - "description": "Text for the find-my-school button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "findAnotherSchool": "Finna annan skóla", - "@findAnotherSchool": { - "description": "Text for the find-another-school button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "domainSearchInputHint": "Settu inn nafn skóla eða umdæmis…", - "@domainSearchInputHint": { - "description": "Input hint for the text box on the domain search screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "noDomainResults": "Ekki tókst að finna skóla sem pössuðu við \"{query}\"", - "@noDomainResults": { - "description": "Message shown to users when the domain search query did not return any results", - "type": "text", - "placeholders_order": [ - "query" - ], - "placeholders": { - "query": {} - } - }, - "domainSearchHelpLabel": "Hvernig finn ég skólann minn eða umdæmið?", - "@domainSearchHelpLabel": { - "description": "Label for the help button on the domain search screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "canvasGuides": "Canvas leiðarvísar", - "@canvasGuides": { - "description": "Proper name for the Canvas Guides. This will be used in the domainSearchHelpBody text and will be highlighted and clickable", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "canvasSupport": "Canvas stuðningur", - "@canvasSupport": { - "description": "Proper name for Canvas Support. This will be used in the domainSearchHelpBody text and will be highlighted and clickable", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "domainSearchHelpBody": "Prufaðu að leita að nafni skólans eða umdæmisins sem þú reyndir að opna, eins og „Smith Private School“ eða „Smith County Schools.” Þú getur einnig sett inn Canvas-lén beint, eins og “smith.instructure.com.”\n\nFyrir frekari upplýsingar um hvernig þú finnur Canvas reikning stofnunar þinnar, geturðu farið á {canvasGuides}, haft samband við {canvasSupport}, eða hafðu samband við skólann þinn til að fá aðstoð.", - "@domainSearchHelpBody": { - "description": "The body text shown in the help dialog on the domain search screen", - "type": "text", - "placeholders_order": [ - "canvasGuides", - "canvasSupport" - ], - "placeholders": { - "canvasGuides": {}, - "canvasSupport": {} - } - }, - "Uh oh!": "Æi!", - "@Uh oh!": { - "description": "Title of the screen that shows when a crash has occurred", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "We’re not sure what happened, but it wasn’t good. Contact us if this keeps happening.": "Við erum ekki viss um hvað gerðist, en það var ekki gott. Hafðu samband við okkur ef þetta heldur áfram að gerast.", - "@We’re not sure what happened, but it wasn’t good. Contact us if this keeps happening.": { - "description": "Message shown when a crash has occurred", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Contact Support": "Hafa samband við aðstoð", - "@Contact Support": { - "description": "Label for the button that allows users to contact support after a crash has occurred", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "View error details": "Skoða upplýsingar um villu", - "@View error details": { - "description": "Label for the button that allowed users to view crash details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Restart app": "Endurræstu forritið", - "@Restart app": { - "description": "Label for the button that will restart the entire application", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Application version": "Útgáfa forrits", - "@Application version": { - "description": "Label for the application version displayed in the crash details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Device model": "Gerð tækis", - "@Device model": { - "description": "Label for the device model displayed in the crash details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Android OS version": "Útgáfa Android stýrikerfis", - "@Android OS version": { - "description": "Label for the Android operating system version displayed in the crash details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Full error message": "Heildar villuskilaboð", - "@Full error message": { - "description": "Label for the full error message displayed in the crash details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Inbox": "Innhólf", - "@Inbox": { - "description": "Title for the Inbox screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading your inbox messages.": "Villa kom upp við að sækja skilaboðin þín.", - "@There was an error loading your inbox messages.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Subject": "Ekkert efnisheiti", - "@No Subject": { - "description": "Title used for inbox messages that have no subject", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unable to fetch courses. Please check your connection and try again.": "Ekki tókst að ná í námskeið. Athugaðu tengingu þína og reyndu aftur.", - "@Unable to fetch courses. Please check your connection and try again.": { - "description": "Message shown when an error occured while loading courses", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Choose a course to message": "Veldu námskeið til að senda skilaboð til", - "@Choose a course to message": { - "description": "Header in the course list shown when the user is choosing which course to associate with a new message", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Inbox Zero": "Innhólf Núll", - "@Inbox Zero": { - "description": "Title of the message shown when there are no inbox messages", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You’re all caught up!": "Þú ert búin(n) með allt!", - "@You’re all caught up!": { - "description": "Subtitle of the message shown when there are no inbox messages", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading recipients for this course": "Villa varð við að sækja móttakendur fyrir þetta námskeið", - "@There was an error loading recipients for this course": { - "description": "Message shown when attempting to create a new message but the recipients list failed to load", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unable to send message. Check your connection and try again.": "ekki var hægt að senda skilaboð. Athugaðu tengingu þína og reyndu aftur.", - "@Unable to send message. Check your connection and try again.": { - "description": "Message show when there was an error creating or sending a new message", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unsaved changes": "Óvistaðar breytingar", - "@Unsaved changes": { - "description": "Title of the dialog shown when the user tries to leave with unsaved changes", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Are you sure you wish to close this page? Your unsent message will be lost.": "Viltu örugglega loka þessari síðu? Ósend skilaboð tapast.", - "@Are you sure you wish to close this page? Your unsent message will be lost.": { - "description": "Body text of the dialog shown when the user tries leave with unsaved changes", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "New message": "Ný skilaboð", - "@New message": { - "description": "Title of the new-message screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Add attachment": "Bæta við viðhengi", - "@Add attachment": { - "description": "Tooltip for the add-attachment button in the new-message screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Send message": "Senda skilaboð", - "@Send message": { - "description": "Tooltip for the send-message button in the new-message screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Select recipients": "Velja móttakendur", - "@Select recipients": { - "description": "Tooltip for the button that allows users to select message recipients", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No recipients selected": "Engir móttakendur valdir", - "@No recipients selected": { - "description": "Hint displayed when the user has not selected any message recipients", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Message subject": "Efni skilaboða", - "@Message subject": { - "description": "Hint text displayed in the input field for the message subject", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Message": "Skilaboð", - "@Message": { - "description": "Hint text displayed in the input field for the message body", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Recipients": "Viðtakendur", - "@Recipients": { - "description": "Label for message recipients", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "plusRecipientCount": "+{count}", - "@plusRecipientCount": { - "description": "Shows the number of recipients that are selected but not displayed on screen.", - "type": "text", - "placeholders_order": [ - "count" - ], - "placeholders": { - "count": { - "example": 5 - } - } - }, - "Failed. Tap for options.": "Tókst ekki. Smelltu fyrir valkosti.", - "@Failed. Tap for options.": { - "description": "Short message shown on a message attachment when uploading has failed", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "courseForWhom": "fyrir {studentShortName}", - "@courseForWhom": { - "description": "Describes for whom a course is for (i.e. for Bill)", - "type": "text", - "placeholders_order": [ - "studentShortName" - ], - "placeholders": { - "studentShortName": {} - } - }, - "messageLinkPostscript": "Varðandi: {studentName}, {linkUrl}", - "@messageLinkPostscript": { - "description": "A postscript appended to new messages that clarifies which student is the subject of the message and also includes a URL for the related Canvas component (course, assignment, event, etc).", - "type": "text", - "placeholders_order": [ - "studentName", - "linkUrl" - ], - "placeholders": { - "studentName": {}, - "linkUrl": {} - } - }, - "There was an error loading this conversation": "Villa varð við að sækja þessar samræður", - "@There was an error loading this conversation": { - "description": "Message shown when a conversation fails to load", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Reply": "Svara", - "@Reply": { - "description": "Button label for replying to a conversation", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Reply All": "Svara öllum", - "@Reply All": { - "description": "Button label for replying to all conversation participants", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unknown User": "Óþekktur notandi", - "@Unknown User": { - "description": "Label used where the user name is not known", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "me": "ég", - "@me": { - "description": "First-person pronoun (i.e. 'me') that will be used in message author info, e.g. 'Me to 4 others' or 'Jon Snow to me'", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "authorToRecipient": "{authorName} til {recipientName}", - "@authorToRecipient": { - "description": "Author info for a single-recipient message; includes both the author name and the recipient name.", - "type": "text", - "placeholders_order": [ - "authorName", - "recipientName" - ], - "placeholders": { - "authorName": {}, - "recipientName": {} - } - }, - "authorToNOthers": "{howMany,plural, =1{{authorName} til 1 annars}other{{authorName} til {howMany} annarra}}", - "@authorToNOthers": { - "description": "Author info for a mutli-recipient message; includes the author name and the number of recipients", - "type": "text", - "placeholders_order": [ - "authorName", - "howMany" - ], - "placeholders": { - "authorName": {}, - "howMany": {} - } - }, - "authorToRecipientAndNOthers": "{howMany,plural, =1{{authorName} til {recipientName} og 1 annars}other{{authorName} til {recipientName} og {howMany} annarra}}", - "@authorToRecipientAndNOthers": { - "description": "Author info for a multi-recipient message; includes the author name, one recipient name, and the number of other recipients", - "type": "text", - "placeholders_order": [ - "authorName", - "recipientName", - "howMany" - ], - "placeholders": { - "authorName": {}, - "recipientName": {}, - "howMany": {} - } - }, - "Download": "Hlaða niður", - "@Download": { - "description": "Label for the button that will begin downloading a file", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Open with another app": "Opna með öðru appi", - "@Open with another app": { - "description": "Label for the button that will allow users to open a file with another app", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There are no installed applications that can open this file": "Það eru engin uppsett öpp sem geta opnað þessar skrár", - "@There are no installed applications that can open this file": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unsupported File": "Óstudd skrá", - "@Unsupported File": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "This file is unsupported and can’t be viewed through the app": "Þessi skrá er óstudd og er ekki hægt að skoða í þessu appi", - "@This file is unsupported and can’t be viewed through the app": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unable to play this media file": "Ekki er hægt að spila þessa miðlaskrá", - "@Unable to play this media file": { - "description": "Message shown when audio or video media could not be played", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unable to load this image": "Ekki hægt að sækja þessa mynd", - "@Unable to load this image": { - "description": "Message shown when an image file could not be loaded or displayed", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading this file": "Villa varð við að sækja þessa skrá", - "@There was an error loading this file": { - "description": "Message shown when a file could not be loaded or displayed", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Courses": "Engin námskeið", - "@No Courses": { - "description": "Title for having no courses", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Your student’s courses might not be published yet.": "Námskeið nemanda þíns eru ef til vill ekki birt enn.", - "@Your student’s courses might not be published yet.": { - "description": "Message for having no courses", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading your student’s courses.": "Villa kom upp við að sækja námskeið nemanda.", - "@There was an error loading your student’s courses.": { - "description": "Message displayed when the list of student courses could not be loaded", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Grade": "Engin einkunn", - "@No Grade": { - "description": "Message shown when there is currently no grade available for a course", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Filter by": "Sía eftir", - "@Filter by": { - "description": "Title for list of terms to filter grades by", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Grades": "Einkunnir", - "@Grades": { - "description": "Label for the \"Grades\" tab in course details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Syllabus": "Kennsluáætlun", - "@Syllabus": { - "description": "Label for the \"Syllabus\" tab in course details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Front Page": "Forsíða", - "@Front Page": { - "description": "Label for the \"Front Page\" tab in course details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Summary": "Samantekt", - "@Summary": { - "description": "Label for the \"Summary\" tab in course details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Send a message about this course": "Sendu skilaboð um þetta námskeið", - "@Send a message about this course": { - "description": "Accessibility hint for the course messaage floating action button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Total Grade": "Heildareinkunn", - "@Total Grade": { - "description": "Label for the total grade in the course", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Graded": "Metið", - "@Graded": { - "description": "Label for assignments that have been graded", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Submitted": "Skilað", - "@Submitted": { - "description": "Label for assignments that have been submitted", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Not Submitted": "Ekki lagt fram", - "@Not Submitted": { - "description": "Label for assignments that have not been submitted", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Late": "Seint", - "@Late": { - "description": "Label for assignments that have been marked late or submitted late", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Missing": "Vantar", - "@Missing": { - "description": "Label for assignments that have been marked missing or are not submitted and past the due date", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "-": "-", - "@-": { - "description": "Value representing no score for student submission", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "All Grading Periods": "Öll einkunnatímabil", - "@All Grading Periods": { - "description": "Label for selecting all grading periods", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Assignments": "Engin verkefni", - "@No Assignments": { - "description": "Title for the no assignments message", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "It looks like assignments haven't been created in this space yet.": "Það virðast ekki vera nein verkefni búin til í þessu rými enn.", - "@It looks like assignments haven't been created in this space yet.": { - "description": "Message for no assignments", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading the summary details for this course.": "Villa varð við að sækja yfirlitsnámskeið fyrir þetta námskeið.", - "@There was an error loading the summary details for this course.": { - "description": "Message shown when the course summary could not be loaded", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Summary": "Engin samantekt", - "@No Summary": { - "description": "Title displayed when there are no items in the course summary", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "This course does not have any assignments or calendar events yet.": "Þetta námskeið er ekki með nein verkefni eða dagatalsviðburði enn.", - "@This course does not have any assignments or calendar events yet.": { - "description": "Message displayed when there are no items in the course summary", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "gradeFormatScoreOutOfPointsPossible": "{score} / {pointsPossible}", - "@gradeFormatScoreOutOfPointsPossible": { - "description": "Formatted string for a student score out of the points possible", - "type": "text", - "placeholders_order": [ - "score", - "pointsPossible" - ], - "placeholders": { - "score": {}, - "pointsPossible": {} - } - }, - "contentDescriptionScoreOutOfPointsPossible": "{score} af {pointsPossible} stigum", - "@contentDescriptionScoreOutOfPointsPossible": { - "description": "Formatted string for a student score out of the points possible", - "type": "text", - "placeholders_order": [ - "score", - "pointsPossible" - ], - "placeholders": { - "score": {}, - "pointsPossible": {} - } - }, - "gradesSubjectMessage": "Varðandi: {studentName}, Einkunnir", - "@gradesSubjectMessage": { - "description": "The subject line for a message to a teacher regarding a student's grades", - "type": "text", - "placeholders_order": [ - "studentName" - ], - "placeholders": { - "studentName": {} - } - }, - "syllabusSubjectMessage": "Varðandi: {studentName}, Kennsluáætlun", - "@syllabusSubjectMessage": { - "description": "The subject line for a message to a teacher regarding a course syllabus", - "type": "text", - "placeholders_order": [ - "studentName" - ], - "placeholders": { - "studentName": {} - } - }, - "frontPageSubjectMessage": "Varðandi: {studentName}, Forsíða", - "@frontPageSubjectMessage": { - "description": "The subject line for a message to a teacher regarding a course front page", - "type": "text", - "placeholders_order": [ - "studentName" - ], - "placeholders": { - "studentName": {} - } - }, - "assignmentSubjectMessage": "Varðandi: {studentName}, Verkefni - {assignmentName}", - "@assignmentSubjectMessage": { - "description": "The subject line for a message to a teacher regarding a student's assignment", - "type": "text", - "placeholders_order": [ - "studentName", - "assignmentName" - ], - "placeholders": { - "studentName": {}, - "assignmentName": {} - } - }, - "eventSubjectMessage": "Varðandi: {studentName}, Viðburður - {eventTitle}", - "@eventSubjectMessage": { - "description": "The subject line for a message to a teacher regarding a calendar event", - "type": "text", - "placeholders_order": [ - "studentName", - "eventTitle" - ], - "placeholders": { - "studentName": {}, - "eventTitle": {} - } - }, - "There is no page information available.": "Það eru engar síðuupplýsingar tiltækar.", - "@There is no page information available.": { - "description": "Description for when no page information is available", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Assignment Details": "Upplýsingar um verkefni", - "@Assignment Details": { - "description": "Title for the page that shows details for an assignment", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "assignmentTotalPoints": "{points} punktar", - "@assignmentTotalPoints": { - "description": "Label used for the total points the assignment is worth", - "type": "text", - "placeholders_order": [ - "points" - ], - "placeholders": { - "points": {} - } - }, - "assignmentTotalPointsAccessible": "{points} punktar", - "@assignmentTotalPointsAccessible": { - "description": "Screen reader label used for the total points the assignment is worth", - "type": "text", - "placeholders_order": [ - "points" - ], - "placeholders": { - "points": {} - } - }, - "Due": "Skilafrestur", - "@Due": { - "description": "Label for an assignment due date", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Grade": "Einkunn", - "@Grade": { - "description": "Label for the section that displays an assignment's grade", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Locked": "Læst", - "@Locked": { - "description": "Label for when an assignment is locked", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "assignmentLockedModule": "Verkefninu er læst af einingu \"{moduleName}\".", - "@assignmentLockedModule": { - "description": "The locked description when an assignment is locked by a module", - "type": "text", - "placeholders_order": [ - "moduleName" - ], - "placeholders": { - "moduleName": {} - } - }, - "Remind Me": "Minntu mig á", - "@Remind Me": { - "description": "Label for the row to set reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Set a date and time to be notified of this specific assignment.": "Stilltu inn dagsetningu og tíma til að fá áminningu um þetta tiltekna verkefni.", - "@Set a date and time to be notified of this specific assignment.": { - "description": "Description for row to set reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You will be notified about this assignment on…": "Þú færð áminningu um þetta verkefni þann…", - "@You will be notified about this assignment on…": { - "description": "Description for when a reminder is set", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Instructions": "Fyrirmæli", - "@Instructions": { - "description": "Label for the description of the assignment when it has quiz instructions", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Send a message about this assignment": "Sendu skilaboð um þetta verkefni", - "@Send a message about this assignment": { - "description": "Accessibility hint for the assignment messaage floating action button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "This app is not authorized for use.": "Þetta app er ekki heimilt til notkunar.", - "@This app is not authorized for use.": { - "description": "The error shown when the app being used is not verified by Canvas", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The server you entered is not authorized for this app.": "Miðillinn sem þú settir inn er ekki heimill fyrir þetta app.", - "@The server you entered is not authorized for this app.": { - "description": "The error shown when the desired login domain is not verified by Canvas", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The user agent for this app is not authorized.": "Fulltrúi notanda fyrir þetta app er óheimill.", - "@The user agent for this app is not authorized.": { - "description": "The error shown when the user agent during verification is not verified by Canvas", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "We were unable to verify the server for use with this app.": "Við gátum ekki sannreynt miðilinn fyrir notkun með þessu appi.", - "@We were unable to verify the server for use with this app.": { - "description": "The generic error shown when we are unable to verify with Canvas", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Reminders": "Áminningar", - "@Reminders": { - "description": "Name of the system notification channel for assignment and event reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Notifications for reminders about assignments and calendar events": "Tilkynningar fyrir áminningar um verkefni og dagatalsviðburði", - "@Notifications for reminders about assignments and calendar events": { - "description": "Description of the system notification channel for assignment and event reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Reminders have changed!": "Áminningar hafa breyst!", - "@Reminders have changed!": { - "description": "Title of the dialog shown when the user needs to update their reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "In order to provide you with a better experience, we have updated how reminders work. You can add new reminders by viewing an assignment or calendar event and tapping the switch under the \"Remind Me\" section.\n\nBe aware that any reminders created with older versions of this app will not be compatible with the new changes and you will need to create them again.": "Til þess að veita þér betri upplifun höfum við breytt því hvernig áminningar virka. Þú getur bætt nýjum áminningum við með því að skoða verkefni eða dagatalsviðburð og smella á rofann undir \"minna mig á\" hlutanum.\n\nHafðu í huga að hverskonar áminning sem var stofnuð með gömlum útgáfum þessa forrits verða ekki samhæfðar við nýju breytingarnar og þú þarft að stofna þær aftur.", - "@In order to provide you with a better experience, we have updated how reminders work. You can add new reminders by viewing an assignment or calendar event and tapping the switch under the \"Remind Me\" section.\n\nBe aware that any reminders created with older versions of this app will not be compatible with the new changes and you will need to create them again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Not a parent?": "Ekki foreldri?", - "@Not a parent?": { - "description": "Title for the screen that shows when the user is not observing any students", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "We couldn't find any students associated with this account": "Við fundum enga nemendur sem tengjast þessum reikningi", - "@We couldn't find any students associated with this account": { - "description": "Subtitle for the screen that shows when the user is not observing any students", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Are you a student or teacher?": "Ertu nemandi eða kennari?", - "@Are you a student or teacher?": { - "description": "Label for button that will show users the option to view other Canvas apps in the Play Store", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "One of our other apps might be a better fit. Tap one to visit the Play Store.": "Eitthvað af hinum öppunum okkar gæti hentað betur. Smelltu á eitt þeirra til að fara í Play Store.", - "@One of our other apps might be a better fit. Tap one to visit the Play Store.": { - "description": "Description of options to view other Canvas apps in the Play Store", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Return to Login": "Fara aftur í innskráningu", - "@Return to Login": { - "description": "Label for the button that returns the user to the login screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "STUDENT": "NEMANDI", - "@STUDENT": { - "description": "The \"student\" portion of the \"Canvas Student\" app name, in all caps. \"Canvas\" is excluded in this context as it will be displayed to the user as a wordmark image", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "TEACHER": "KENNARI", - "@TEACHER": { - "description": "The \"teacher\" portion of the \"Canvas Teacher\" app name, in all caps. \"Canvas\" is excluded in this context as it will be displayed to the user as a wordmark image", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Canvas Student": "Canvas nemandi", - "@Canvas Student": { - "description": "The name of the Canvas Student app. Only \"Student\" should be translated as \"Canvas\" is a brand name in this context and should not be translated.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Canvas Teacher": "Canvas kennari", - "@Canvas Teacher": { - "description": "The name of the Canvas Teacher app. Only \"Teacher\" should be translated as \"Canvas\" is a brand name in this context and should not be translated.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Alerts": "Engar viðvaranir", - "@No Alerts": { - "description": "The title for the empty message to show to users when there are no alerts for the student.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There’s nothing to be notified of yet.": "Það er ekkert tilkynningavert enn.", - "@There’s nothing to be notified of yet.": { - "description": "The empty message to show to users when there are no alerts for the student.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "dismissAlertLabel": "Hafna {alertTitle}", - "@dismissAlertLabel": { - "description": "Accessibility label to dismiss an alert", - "type": "text", - "placeholders_order": [ - "alertTitle" - ], - "placeholders": { - "alertTitle": {} - } - }, - "Course Announcement": "Tilkynning námskeiðs", - "@Course Announcement": { - "description": "Title for alerts when there is a course announcement", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Institution Announcement": "Stofnana tilkynning", - "@Institution Announcement": { - "description": "Title for alerts when there is an institution announcement", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "assignmentGradeAboveThreshold": "Verkefnaeinkunn fyrir ofan {threshold}", - "@assignmentGradeAboveThreshold": { - "description": "Title for alerts when an assignment grade is above the threshold value", - "type": "text", - "placeholders_order": [ - "threshold" - ], - "placeholders": { - "threshold": {} - } - }, - "assignmentGradeBelowThreshold": "Verkefnaeinkunn fyrir neðan {threshold}", - "@assignmentGradeBelowThreshold": { - "description": "Title for alerts when an assignment grade is below the threshold value", - "type": "text", - "placeholders_order": [ - "threshold" - ], - "placeholders": { - "threshold": {} - } - }, - "courseGradeAboveThreshold": "Námskeiðseinkunn fyrir ofan {threshold}", - "@courseGradeAboveThreshold": { - "description": "Title for alerts when a course grade is above the threshold value", - "type": "text", - "placeholders_order": [ - "threshold" - ], - "placeholders": { - "threshold": {} - } - }, - "courseGradeBelowThreshold": "Námskeiðseinkunn fyrir neðan {threshold}", - "@courseGradeBelowThreshold": { - "description": "Title for alerts when a course grade is below the threshold value", - "type": "text", - "placeholders_order": [ - "threshold" - ], - "placeholders": { - "threshold": {} - } - }, - "Settings": "Stillingar", - "@Settings": { - "description": "Title for the settings screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Theme": "Þema", - "@Theme": { - "description": "Label for the light/dark theme section in the settings page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Dark Mode": "Dökk stilling", - "@Dark Mode": { - "description": "Label for the button that enables dark mode", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Light Mode": "Ljós stilling", - "@Light Mode": { - "description": "Label for the button that enables light mode", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "High Contrast Mode": "Háskerpustilling", - "@High Contrast Mode": { - "description": "Label for the switch that toggles high contrast mode", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Use Dark Theme in Web Content": "Nota dökkt þema í vefefni", - "@Use Dark Theme in Web Content": { - "description": "Label for the switch that toggles dark mode for webviews", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Appearance": "Útlit", - "@Appearance": { - "description": "Label for the appearance section in the settings page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Successfully submitted!": "Skil tókust!", - "@Successfully submitted!": { - "description": "Title displayed in the grade cell for an assignment that has been submitted", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "submissionStatusSuccessSubtitle": "Þetta verkefni var sent inn þann {date} klukkan {time} og bíður einkunnar", - "@submissionStatusSuccessSubtitle": { - "description": "Subtitle displayed in the grade cell for an assignment that has been submitted and is awaiting a grade", - "type": "text", - "placeholders_order": [ - "date", - "time" - ], - "placeholders": { - "date": {}, - "time": {} - } - }, - "outOfPoints": "{howMany,plural, =1{Af 1 stigi}other{Af {points} stigum}}", - "@outOfPoints": { - "description": "Description for an assignment grade that has points without a current scoroe", - "type": "text", - "placeholders_order": [ - "points", - "howMany" - ], - "placeholders": { - "points": {}, - "howMany": {} - } - }, - "Excused": "Undanþegið", - "@Excused": { - "description": "Grading status for an assignment marked as excused", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Complete": "Lokið", - "@Complete": { - "description": "Grading status for an assignment marked as complete", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Incomplete": "Ólokið", - "@Incomplete": { - "description": "Grading status for an assignment marked as incomplete", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "minus": "mínus", - "@minus": { - "description": "Screen reader-friendly replacement for the \"-\" character in letter grades like \"A-\"", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "latePenalty": "Viðurlög vegna of seinna skila (-{pointsLost})", - "@latePenalty": { - "description": "Text displayed when a late penalty has been applied to the assignment", - "type": "text", - "placeholders_order": [ - "pointsLost" - ], - "placeholders": { - "pointsLost": {} - } - }, - "finalGrade": "Lokaeinkunn: {grade}", - "@finalGrade": { - "description": "Text that displays the final grade of an assignment", - "type": "text", - "placeholders_order": [ - "grade" - ], - "placeholders": { - "grade": {} - } - }, - "Alert Settings": "Viðvörunarstillingar", - "@Alert Settings": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Alert me when…": "Vara mig við þegar…", - "@Alert me when…": { - "description": "Header for the screen where the observer chooses the thresholds that will determine when they receive alerts (e.g. when an assignment is graded below 70%)", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Course grade below": "Námskeiðseinkunn fyrir neðan", - "@Course grade below": { - "description": "Label describing the threshold for when the course grade is below a certain percentage", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Course grade above": "Námskeiðseinkunn fyrir ofan", - "@Course grade above": { - "description": "Label describing the threshold for when the course grade is above a certain percentage", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Assignment missing": "Verkefni vantar", - "@Assignment missing": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Assignment grade below": "Verkefnaeinkunn fyrir neðan", - "@Assignment grade below": { - "description": "Label describing the threshold for when an assignment is graded below a certain percentage", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Assignment grade above": "Verkefnaeinkunn fyrir ofan", - "@Assignment grade above": { - "description": "Label describing the threshold for when an assignment is graded above a certain percentage", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Course Announcements": "Tilkynningar námskeiðs", - "@Course Announcements": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Institution Announcements": "Stofnana tilkynningar", - "@Institution Announcements": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Never": "Aldrei", - "@Never": { - "description": "Indication that tells the user they will not receive alert notifications of a specific kind", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Grade percentage": "Einkunnahlutfall", - "@Grade percentage": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading your student's alerts.": "Villa kom upp við að sækja viðvaranir nemanda þíns.", - "@There was an error loading your student's alerts.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Must be below 100": "Verður að vera undir 100", - "@Must be below 100": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "mustBeBelowN": "Verður að vera undir {percentage}", - "@mustBeBelowN": { - "description": "Validation error to the user that they must choose a percentage below 'n'", - "type": "text", - "placeholders_order": [ - "percentage" - ], - "placeholders": { - "percentage": { - "example": 5 - } - } - }, - "mustBeAboveN": "Verður að vera yfir {percentage}", - "@mustBeAboveN": { - "description": "Validation error to the user that they must choose a percentage above 'n'", - "type": "text", - "placeholders_order": [ - "percentage" - ], - "placeholders": { - "percentage": { - "example": 5 - } - } - }, - "Select Student Color": "Veldu lit nemanda", - "@Select Student Color": { - "description": "Title for screen that allows users to assign a color to a specific student", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Electric, blue": "Rafmagn, blár", - "@Electric, blue": { - "description": "Name of the Electric (blue) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Plum, Purple": "Plóma, fjólublár", - "@Plum, Purple": { - "description": "Name of the Plum (purple) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Barney, Fuschia": "Barney, purpuralitur", - "@Barney, Fuschia": { - "description": "Name of the Barney (fuschia) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Raspberry, Red": "Hindber, rauður", - "@Raspberry, Red": { - "description": "Name of the Raspberry (red) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Fire, Orange": "Eldur, appelsínugulur", - "@Fire, Orange": { - "description": "Name of the Fire (orange) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Shamrock, Green": "Músasmári, grænn", - "@Shamrock, Green": { - "description": "Name of the Shamrock (green) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "An error occurred while saving your selection. Please try again.": "Villa kom upp við að vista valið þitt. Reyndu aftur.", - "@An error occurred while saving your selection. Please try again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "changeStudentColorLabel": "Breyta lit fyrir {studentName}", - "@changeStudentColorLabel": { - "description": "Accessibility label for the button that lets users change the color associated with a specific student", - "type": "text", - "placeholders_order": [ - "studentName" - ], - "placeholders": { - "studentName": {} - } - }, - "Teacher": "Kennari", - "@Teacher": { - "description": "Label for the Teacher enrollment type", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Student": "Nemandi", - "@Student": { - "description": "Label for the Student enrollment type", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "TA": "Aðstoðarkennari", - "@TA": { - "description": "Label for the Teaching Assistant enrollment type (also known as Teacher Aid or Education Assistant), reduced to a short acronym/initialism if appropriate.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Observer": "Skoðandi", - "@Observer": { - "description": "Label for the Observer enrollment type", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Use Camera": "Nota myndavél", - "@Use Camera": { - "description": "Label for the action item that lets the user capture a photo using the device camera", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Upload File": "Hlaða upp skrá", - "@Upload File": { - "description": "Label for the action item that lets the user upload a file from their device", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Choose from Gallery": "Velja úr galleríi", - "@Choose from Gallery": { - "description": "Label for the action item that lets the user select a photo from their device gallery", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Preparing…": "Undirbý…", - "@Preparing…": { - "description": "Message shown while a file is being prepared to attach to a message", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Add student with…": "Bæta nemanda við…", - "@Add student with…": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Add Student": "Bæta við nemanda", - "@Add Student": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You are not observing any students.": "Þú fylgist ekki með neinum nemendum.", - "@You are not observing any students.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading your students.": "Villa kom upp við að sækja nemendur þína.", - "@There was an error loading your students.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Pairing Code": "Pörunarkóði", - "@Pairing Code": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Students can obtain a pairing code through the Canvas website": "Nemendur geta fengið pörunarkóða í gegnum vefsíðu Canvas", - "@Students can obtain a pairing code through the Canvas website": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Enter the student pairing code provided to you. If the pairing code doesn't work, it may have expired": "Settu inn pörunarkóða nemanda sem þú fékkst. Ef pörunarkóðinn virkar ekki gæti hann verið útrunninn", - "@Enter the student pairing code provided to you. If the pairing code doesn't work, it may have expired": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Your code is incorrect or expired.": "Kóðinn þinn er rangur eða útrunninn.", - "@Your code is incorrect or expired.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Something went wrong trying to create your account, please reach out to your school for assistance.": "Eitthvað fór úrskeiðis þegar verið var að búa til reikninginn þinn, hafðu samband við skólann þinn til að fá aðstoð.", - "@Something went wrong trying to create your account, please reach out to your school for assistance.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "QR Code": "QR kóði", - "@QR Code": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Students can create a QR code using the Canvas Student app on their mobile device": "Nemendur geta búið til QR-kóða með því að nota Canvas Student forritið á fartæki sínu", - "@Students can create a QR code using the Canvas Student app on their mobile device": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Add new student": "Bæta við nýjum nemanda", - "@Add new student": { - "description": "Semantics label for the FAB on the Manage Students Screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Select": "Velja", - "@Select": { - "description": "Hint text to tell the user to choose one of two options", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I have a Canvas account": "Ég er með Canvas-reikning", - "@I have a Canvas account": { - "description": "Option to select for users that have a canvas account", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I don't have a Canvas account": "Ég er ekki með Canvas-reikning", - "@I don't have a Canvas account": { - "description": "Option to select for users that don't have a canvas account", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Create Account": "Stofna reikning", - "@Create Account": { - "description": "Button text for account creation confirmation", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Full Name": "Fullt nafn", - "@Full Name": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Email Address": "Netfang", - "@Email Address": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Password": "Aðgangsorð", - "@Password": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Full Name…": "Fullt nafn…", - "@Full Name…": { - "description": "hint label for inside form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Email…": "Netfang…", - "@Email…": { - "description": "hint label for inside form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Password…": "Lykilorð…", - "@Password…": { - "description": "hint label for inside form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Please enter full name": "Settu inn fullt nafn", - "@Please enter full name": { - "description": "Error message for form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Please enter an email address": "Settu inn netfang", - "@Please enter an email address": { - "description": "Error message for form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Please enter a valid email address": "Settu inn gilt netfang", - "@Please enter a valid email address": { - "description": "Error message for form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Password is required": "Lykilorðs er krafist", - "@Password is required": { - "description": "Error message for form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Password must contain at least 8 characters": "Lykilorðið þarf að hafa a.m.k. 8 stafi", - "@Password must contain at least 8 characters": { - "description": "Error message for form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "qrCreateAccountTos": "Með því að pikka á „Búa til reikning“ samþykkir þú {termsOfService} og staðfestir {privacyPolicy}", - "@qrCreateAccountTos": { - "description": "The text show on the account creation screen", - "type": "text", - "placeholders_order": [ - "termsOfService", - "privacyPolicy" - ], - "placeholders": { - "termsOfService": {}, - "privacyPolicy": {} - } - }, - "Terms of Service": "Þjónustuskilmálar", - "@Terms of Service": { - "description": "Label for the Canvas Terms of Service agreement. This will be used in the qrCreateAccountTos text and will be highlighted and clickable", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Privacy Policy": "Persónuverndarstefna", - "@Privacy Policy": { - "description": "Label for the Canvas Privacy Policy agreement. This will be used in the qrCreateAccountTos text and will be highlighted and clickable", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "View the Privacy Policy": "Skoða persónuverndarstefnuna", - "@View the Privacy Policy": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Already have an account? ": "Áttu nú þegar reikning? ", - "@Already have an account? ": { - "description": "Part of multiline text span, includes AccountSignIn1-2, in that order", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Sign In": "Innskráning", - "@Sign In": { - "description": "Part of multiline text span, includes AccountSignIn1-2, in that order", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Hide Password": "Fela lykilorð", - "@Hide Password": { - "description": "content description for password hide button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Show Password": "Sýna lykilorð", - "@Show Password": { - "description": "content description for password show button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Terms of Service Link": "Tengill á þjónustuskilmála", - "@Terms of Service Link": { - "description": "content description for terms of service link", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Privacy Policy Link": "Tengill á persónuverndarstefnu", - "@Privacy Policy Link": { - "description": "content description for privacy policy link", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Event": "Viðburður", - "@Event": { - "description": "Title for the event details screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Date": "Dagsetning", - "@Date": { - "description": "Label for the event date", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Location": "Staðsetning", - "@Location": { - "description": "Label for the location information", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Location Specified": "Engin staðsetning tiltekin", - "@No Location Specified": { - "description": "Description for events that do not have a location", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "eventTime": "{startAt} - {endAt}", - "@eventTime": { - "description": "The time the event is happening, example: \"2:00 pm - 4:00 pm\"", - "type": "text", - "placeholders_order": [ - "startAt", - "endAt" - ], - "placeholders": { - "startAt": {}, - "endAt": {} - } - }, - "Set a date and time to be notified of this event.": "Stilltu inn dagsetningu og tíma til að fá áminningu um þennan viðburð.", - "@Set a date and time to be notified of this event.": { - "description": "Description for row to set event reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You will be notified about this event on…": "Þú færð áminningu um þennan viðburð þann…", - "@You will be notified about this event on…": { - "description": "Description for when an event reminder is set", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Share Your Love for the App": "Deildu ást þinni á appinu", - "@Share Your Love for the App": { - "description": "Label for option to open the app store", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Tell us about your favorite parts of the app": "Segðu okkur um uppáhalds hluta þína í appinu", - "@Tell us about your favorite parts of the app": { - "description": "Description for option to open the app store", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Legal": "Lögfræði", - "@Legal": { - "description": "Label for legal information option", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Privacy policy, terms of use, open source": "Persónuverndarstefna, notkunarskilmálar, opinn hugbúnaður", - "@Privacy policy, terms of use, open source": { - "description": "Description for legal information option", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Idea for Canvas Parent App [Android]": "Hugmynd að Canvas foreldraappi [Android]", - "@Idea for Canvas Parent App [Android]": { - "description": "The subject for the email to request a feature", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The following information will help us better understand your idea:": "Eftirfarandi upplýsingar munu hjálpa okkur að skilja hugmynd þína betur:", - "@The following information will help us better understand your idea:": { - "description": "The header for the users information that is attached to a feature request", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Domain:": "Lén:", - "@Domain:": { - "description": "The label for the Canvas domain of the logged in user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "User ID:": "Auðkenni notanda:", - "@User ID:": { - "description": "The label for the Canvas user ID of the logged in user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Email:": "Netfang:", - "@Email:": { - "description": "The label for the eamil of the logged in user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Locale:": "Staður:", - "@Locale:": { - "description": "The label for the locale of the logged in user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Terms of Use": "Notandaskilmálar", - "@Terms of Use": { - "description": "Label for the terms of use", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Canvas on GitHub": "Canvas á GitHub", - "@Canvas on GitHub": { - "description": "Label for the button that opens the Canvas project on GitHub's website", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was a problem loading the Terms of Use": "Villa kom upp við að sækja notkunarskilmála", - "@There was a problem loading the Terms of Use": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Device": "Tæki", - "@Device": { - "description": "Label used for device manufacturer/model in the error report", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "OS Version": "Útgáfa stýrikerfis", - "@OS Version": { - "description": "Label used for device operating system version in the error report", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Version Number": "Útgáfa númer", - "@Version Number": { - "description": "Label used for the app version number in the error report", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Report A Problem": "Tilkynna vandamál", - "@Report A Problem": { - "description": "Title used for generic dialog to report problems", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Subject": "Efni", - "@Subject": { - "description": "Label used for Subject text field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "A subject is required.": "Efni er áskilið.", - "@A subject is required.": { - "description": "Error shown when the subject field is empty", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "An email address is required.": "Netfang er áskilið.", - "@An email address is required.": { - "description": "Error shown when the email field is empty", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Description": "Lýsing", - "@Description": { - "description": "Label used for Description text field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "A description is required.": "Lýsingar er krafist.", - "@A description is required.": { - "description": "Error shown when the description field is empty", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "How is this affecting you?": "Hvaða áhrif hefur þetta á þig?", - "@How is this affecting you?": { - "description": "Label used for the dropdown to select how severe the issue is", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "send": "sendi", - "@send": { - "description": "Label used for send button when reporting a problem", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Just a casual question, comment, idea, suggestion…": "Bara almenn spurning, athugasemd, hugmynd, tillaga…", - "@Just a casual question, comment, idea, suggestion…": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I need some help but it's not urgent.": "Ég þarf smá aðstoð en það liggur ekki á.", - "@I need some help but it's not urgent.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Something's broken but I can work around it to get what I need done.": "Eitthvað er í ólagi en ég get samt unnið í kringum það til að ljúka því sem ég þarf að ljúka.", - "@Something's broken but I can work around it to get what I need done.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I can't get things done until I hear back from you.": "Ég get ekkert gert fyrr en þú svarar mér.", - "@I can't get things done until I hear back from you.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "EXTREME CRITICAL EMERGENCY!!": "GÍFURLEGT NEYÐARÁSTAND!!", - "@EXTREME CRITICAL EMERGENCY!!": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Not Graded": "Ekki metið", - "@Not Graded": { - "description": "Description for an assignment has not been graded.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Login flow: Normal": "Innskráningarflæði: Venjulegt", - "@Login flow: Normal": { - "description": "Description for the normal login flow", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Login flow: Canvas": "Innskráningarflæði: Canvas", - "@Login flow: Canvas": { - "description": "Description for the Canvas login flow", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Login flow: Site Admin": "Innskráningarflæði: Svæðisstjórnandi", - "@Login flow: Site Admin": { - "description": "Description for the Site Admin login flow", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Login flow: Skip mobile verify": "Innskráningarflæði: Sleppa sannreyningu farsíma", - "@Login flow: Skip mobile verify": { - "description": "Description for the login flow that skips domain verification for mobile", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Act As User": "Bregðast við sem notandi", - "@Act As User": { - "description": "Label for the button that allows the user to act (masquerade) as another user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Stop Acting as User": "Hætta að bregðast við sem notandi", - "@Stop Acting as User": { - "description": "Label for the button that allows the user to stop acting (masquerading) as another user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "actingAsUser": "Þú virkar sem {userName}", - "@actingAsUser": { - "description": "Message shown while acting (masquerading) as another user", - "type": "text", - "placeholders_order": [ - "userName" - ], - "placeholders": { - "userName": {} - } - }, - "\"Act as\" is essentially logging in as this user without a password. You will be able to take any action as if you were this user, and from other users' points of views, it will be as if this user performed them. However, audit logs record that you were the one who performed the actions on behalf of this user.": "\"Bregðast við sem\" er í raun og veru að skrá sig inn sem þessi notandi án lykilorðs. Þú munt getað gripið til allra aðgerða eins og að þú værir viðkomandi notandi, frá sjónarhóli annarra notenda, þá mun það vera eins og þessi notandi hafi framkvæmt viðkomandi aðgerðir. Samt sem áður sýna endurskoðaðar skrár að það varst þú sem framkvæmdir aðgerðirnar fyrir hönd þessa notanda.", - "@\"Act as\" is essentially logging in as this user without a password. You will be able to take any action as if you were this user, and from other users' points of views, it will be as if this user performed them. However, audit logs record that you were the one who performed the actions on behalf of this user.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Domain": "Lén", - "@Domain": { - "description": "Text field hint for domain url input", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You must enter a valid domain": "Þú verður að setja inn rétt lén", - "@You must enter a valid domain": { - "description": "Message displayed for domain input error", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "User ID": "Auðkenni notanda", - "@User ID": { - "description": "Text field hint for user ID input", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You must enter a user id": "Þú verður að setja inn auðkenni notanda", - "@You must enter a user id": { - "description": "Message displayed for user Id input error", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error trying to act as this user. Please check the Domain and User ID and try again.": "Villa kom upp við að bregðast við sem þessi notandi. Athugaðu lén og auðkenni notanda og reyndu aftur.", - "@There was an error trying to act as this user. Please check the Domain and User ID and try again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "endMasqueradeMessage": "Þú hættir að bregðast við sem {userName} og ferð aftur í upprunalegan reikning þinn.", - "@endMasqueradeMessage": { - "description": "Confirmation message displayed when the user wants to stop acting (masquerading) as another user", - "type": "text", - "placeholders_order": [ - "userName" - ], - "placeholders": { - "userName": {} - } - }, - "endMasqueradeLogoutMessage": "Þú hættir að bregðast við sem {userName} og verður skráð(ur) út.", - "@endMasqueradeLogoutMessage": { - "description": "Confirmation message displayed when the user wants to stop acting (masquerading) as another user and will be logged out.", - "type": "text", - "placeholders_order": [ - "userName" - ], - "placeholders": { - "userName": {} - } - }, - "How are we doing?": "Hvernig gengur okkur?", - "@How are we doing?": { - "description": "Title for dialog asking user to rate the app out of 5 stars.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Don't show again": "Ekki sýna aftur", - "@Don't show again": { - "description": "Button to prevent the rating dialog from showing again.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "What can we do better?": "Hvernig getum við bætt okkur?", - "@What can we do better?": { - "description": "Hint text for providing a comment with the rating.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Send Feedback": "Senda endurgjöf", - "@Send Feedback": { - "description": "Button to send rating with feedback", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "ratingDialogEmailSubject": "Uppástungur fyrir Android - Canvas Parent {version}", - "@ratingDialogEmailSubject": { - "description": "The subject for an email to provide feedback for CanvasParent.", - "type": "text", - "placeholders_order": [ - "version" - ], - "placeholders": { - "version": {} - } - }, - "starRating": "{position,plural, =1{{position} stjarna}other{{position} stjörnur}}", - "@starRating": { - "description": "Accessibility label for the 1 stars to 5 stars rating", - "type": "text", - "placeholders_order": [ - "position" - ], - "placeholders": { - "position": { - "example": 1 - } - } - }, - "Student Pairing": "Pörun nemenda", - "@Student Pairing": { - "description": "Title for the screen where users can pair to students using a QR code", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Open Canvas Student": "Opnaðu Canvas Student", - "@Open Canvas Student": { - "description": "Title for QR pairing tutorial screen instructing users to open the Canvas Student app", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You'll need to open your student's Canvas Student app to continue. Go into Main Menu > Settings > Pair with Observer and scan the QR code you see there.": "Þú þarft að opna Canvas Student forrit nemanda þíns til að halda áfram. Farðu í aðalvalmyndina > Stillingar > Para við eftirlitsaðila og skannaðu QR-kóðann sem þú sérð þar.", - "@You'll need to open your student's Canvas Student app to continue. Go into Main Menu > Settings > Pair with Observer and scan the QR code you see there.": { - "description": "Message explaining how QR code pairing works", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Screenshot showing location of pairing QR code generation in the Canvas Student app": "Skjáskot sem sýnir hvar hægt er að framkalla pörunar QR-kóða í Canvas Student forritinu", - "@Screenshot showing location of pairing QR code generation in the Canvas Student app": { - "description": "Content Description for qr pairing tutorial screenshot", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Expired QR Code": "Útrunninn QR-kóði", - "@Expired QR Code": { - "description": "Error title shown when the users scans a QR code that has expired", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The QR code you scanned may have expired. Refresh the code on the student's device and try again.": "QR-kóðinn sem þú skannaðir gæti verið útrunninn. Endurnýjaðu kóðann á tæki nemandans og reyndu aftur.", - "@The QR code you scanned may have expired. Refresh the code on the student's device and try again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "A network error occurred when adding this student. Check your connection and try again.": "Netvilla kom upp þegar verið var að bæta þessum nemanda við. Athugaðu tengingu þína og reyndu aftur.", - "@A network error occurred when adding this student. Check your connection and try again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Invalid QR Code": "Ógildur QR-kóði", - "@Invalid QR Code": { - "description": "Error title shown when the user scans an invalid QR code", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Incorrect Domain": "Rangt lén", - "@Incorrect Domain": { - "description": "Error title shown when the users scane a QR code for a student that belongs to a different domain", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The student you are trying to add belongs to a different school. Log in or create an account with that school to scan this code.": "Nemandinn sem þú ert að reyna að bæta við tilheyrir öðrum skóla. Skráðu þig inn eða búðu til reikning með þeim skóla til að skanna þennan kóða.", - "@The student you are trying to add belongs to a different school. Log in or create an account with that school to scan this code.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Camera Permission": "Heimild fyrir myndavél", - "@Camera Permission": { - "description": "Error title shown when the user wans to scan a QR code but has denied the camera permission", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "This will unpair and remove all enrollments for this student from your account.": "Þetta mun aftengja og fjarlægja allar skráningar fyrir þennan nemanda af reikningnum þínum.", - "@This will unpair and remove all enrollments for this student from your account.": { - "description": "Confirmation message shown when the user tries to delete a student from their account", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was a problem removing this student from your account. Please check your connection and try again.": "Upp kom vandamál við að fjarlægja þennan nemanda af reikningnum þínum. Athugaðu tengingu þína og reyndu aftur.", - "@There was a problem removing this student from your account. Please check your connection and try again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Cancel": "Hætta við", - "@Cancel": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "next": "Næsti", - "@next": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "ok": "Í lagi", - "@ok": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Yes": "Já", - "@Yes": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No": "Nei", - "@No": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Retry": "Reyna aftur", - "@Retry": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Delete": "Eyða", - "@Delete": { - "description": "Label used for general delete/remove actions", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Done": "Lokið", - "@Done": { - "description": "Label for general done/finished actions", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Refresh": "Glæða", - "@Refresh": { - "description": "Label for button to refresh data from the web", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "View Description": "Skoða lýsingu", - "@View Description": { - "description": "Button to view the description for an event or assignment", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "expanded": "víkkað", - "@expanded": { - "description": "Description for the accessibility reader for list groups that are expanded", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "collapsed": "fellt saman", - "@collapsed": { - "description": "Description for the accessibility reader for list groups that are expanded", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "An unexpected error occurred": "Óvænt villa kom upp", - "@An unexpected error occurred": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No description": "Engin lýsing", - "@No description": { - "description": "Message used when the assignment has no description", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Launch External Tool": "Nota ytra verkfæri", - "@Launch External Tool": { - "description": "Button text added to webviews to let users open external tools in their browser", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Interactions on this page are limited by your institution.": "Samskipti á þessari síðu eru takmörkuð af stofnun þinni.", - "@Interactions on this page are limited by your institution.": { - "description": "Message describing how the webview has limited access due to an instution setting", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "dateAtTime": "{date} klukkan {time}", - "@dateAtTime": { - "description": "The string to format dates", - "type": "text", - "placeholders_order": [ - "date", - "time" - ], - "placeholders": { - "date": {}, - "time": {} - } - }, - "dueDateAtTime": "Skiladagur {date} þann {time}", - "@dueDateAtTime": { - "description": "The string to format due dates", - "type": "text", - "placeholders_order": [ - "date", - "time" - ], - "placeholders": { - "date": {}, - "time": {} - } - }, - "No Due Date": "Enginn skiladagur", - "@No Due Date": { - "description": "Label for assignments that do not have a due date", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Filter": "Sía", - "@Filter": { - "description": "Label for buttons to filter what items are visible", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "unread": "ólesið", - "@unread": { - "description": "Label for things that are marked as unread", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "unreadCount": "{count} ólesið", - "@unreadCount": { - "description": "Formatted string for when there are a number of unread items", - "type": "text", - "placeholders_order": [ - "count" - ], - "placeholders": { - "count": {} - } - }, - "badgeNumberPlus": "{count}+", - "@badgeNumberPlus": { - "description": "Formatted string for when too many items are being notified in a badge, generally something like: 99+", - "type": "text", - "placeholders_order": [ - "count" - ], - "placeholders": { - "count": {} - } - }, - "There was an error loading this announcement": "Villa varð við að sækja þessa tilkynningu", - "@There was an error loading this announcement": { - "description": "Message shown when an announcement detail screen fails to load", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Network error": "Netkerfisvilla", - "@Network error": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Under Construction": "Í byggingu", - "@Under Construction": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "We are currently building this feature for your viewing pleasure.": "Núna byggjum við þennan eiginleika þér til hægðarauka.", - "@We are currently building this feature for your viewing pleasure.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Request Login Help Button": "Biðja um aðstoð við innskráningu hnappur", - "@Request Login Help Button": { - "description": "Accessibility hint for button that opens help dialog for a login help request", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Request Login Help": "Biðja um aðstoð við innskráningu", - "@Request Login Help": { - "description": "Title of help dialog for a login help request", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I'm having trouble logging in": "Ég á í vandræðum við að skrá mig inn", - "@I'm having trouble logging in": { - "description": "Subject of help dialog for a login help request", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "An error occurred when trying to display this link": "Villa kom upp við að sýna þennan tengil", - "@An error occurred when trying to display this link": { - "description": "Error message shown when a link can't be opened", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "We are unable to display this link, it may belong to an institution you currently aren't logged in to.": "Við getum ekki sýnt þennan tengil, hann gæti tilheyrt stofnun sem þú ert ekki innskráð(ur) hjá.", - "@We are unable to display this link, it may belong to an institution you currently aren't logged in to.": { - "description": "Description for error page shown when clicking a link", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Link Error": "Tengils villa", - "@Link Error": { - "description": "Title for error page shown when clicking a link", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Open In Browser": "Opna í vafra", - "@Open In Browser": { - "description": "Text for button to open a link in the browswer", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You'll find the QR code on the web in your account profile. Click 'QR for Mobile Login' in the list.": "Þú finnur QR kóðann á vefnum á reikningssíðu þinni. Smelltu á ‘QR fyrir innskráningu með snjalltæki‘ í listanum.", - "@You'll find the QR code on the web in your account profile. Click 'QR for Mobile Login' in the list.": { - "description": "Text for qr login tutorial screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Locate QR Code": "Finna QR kóða", - "@Locate QR Code": { - "description": "Text for qr login button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Please scan a QR code generated by Canvas": "Skannaðu QR kóða sem Canvas bjó til", - "@Please scan a QR code generated by Canvas": { - "description": "Text for qr login error with incorrect qr code", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error logging in. Please generate another QR Code and try again.": "Villa kom upp við innskráningu. Búðu til annan QR kóða og reyndu aftur.", - "@There was an error logging in. Please generate another QR Code and try again.": { - "description": "Text for qr login error", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Screenshot showing location of QR code generation in browser": "Skjáskot sem sýnir hvar QR kóði er myndaður í vafra", - "@Screenshot showing location of QR code generation in browser": { - "description": "Content Description for qr login tutorial screenshot", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "QR scanning requires camera access": "Til að skanna QR-kóða þarf aðgang að myndavél", - "@QR scanning requires camera access": { - "description": "placeholder for camera error for QR code scan", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The linked item is no longer available": "Tengd atriði eru ekki lengur í boði", - "@The linked item is no longer available": { - "description": "error message when the alert could no be opened", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Message sent": "Skilaboð send", - "@Message sent": { - "description": "confirmation message on the screen when the user succesfully sends a message", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Acceptable Use Policy": "Stefna um ásættanlega notkun", - "@Acceptable Use Policy": { - "description": "title for the acceptable use policy screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Submit": "Skila", - "@Submit": { - "description": "submit button title for acceptable use policy screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Either you're a new user or the Acceptable Use Policy has changed since you last agreed to it. Please agree to the Acceptable Use Policy before you continue.": "Þú ert annað hvort nýr notandi eða Stefna um ásættanlega notkun hefur breyst síðan þú samþykktir hana síðast. Vinsamlegast samþykktu Stefnu um ásættanlega notkun áður en þú heldur áfram.", - "@Either you're a new user or the Acceptable Use Policy has changed since you last agreed to it. Please agree to the Acceptable Use Policy before you continue.": { - "description": "acceptable use policy screen description", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I agree to the Acceptable Use Policy.": "Ég samþykki Stefnu um ásættanlega notkun.", - "@I agree to the Acceptable Use Policy.": { - "description": "acceptable use policy switch title", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "About": "Um", - "@About": { - "description": "Title for about menu item in settings", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "App": "Smáforrit", - "@App": { - "description": "Title for App field on about page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Login ID": "Innskráningarauðkenni", - "@Login ID": { - "description": "Title for Login ID field on about page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Email": "Tölvupóstur", - "@Email": { - "description": "Title for Email field on about page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Version": "Útgáfa", - "@Version": { - "description": "Title for Version field on about page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Instructure logo": "Merki Instructure", - "@Instructure logo": { - "description": "Semantics label for the Instructure logo on the about page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - } -} \ No newline at end of file diff --git a/apps/flutter_parent/lib/l10n/res/intl_it.arb b/apps/flutter_parent/lib/l10n/res/intl_it.arb deleted file mode 100644 index a3dcc59070..0000000000 --- a/apps/flutter_parent/lib/l10n/res/intl_it.arb +++ /dev/null @@ -1,2753 +0,0 @@ -{ - "@@last_modified": "2023-08-25T11:04:20.901151", - "alertsLabel": "Avvisi", - "@alertsLabel": { - "description": "The label for the Alerts tab", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "calendarLabel": "Calendario", - "@calendarLabel": { - "description": "The label for the Calendar tab", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "coursesLabel": "Corsi", - "@coursesLabel": { - "description": "The label for the Courses tab", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Students": "Nessuno studente", - "@No Students": { - "description": "Text for when an observer has no students they are observing", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Tap to show student selector": "Tocca per mostrare il selettore studente", - "@Tap to show student selector": { - "description": "Semantics label for the area that will show the student selector when tapped", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Tap to pair with a new student": "Tocca per accoppiare con un nuovo studente", - "@Tap to pair with a new student": { - "description": "Semantics label for the add student button in the student selector", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Tap to select this student": "Tocca per selezionare questo studente", - "@Tap to select this student": { - "description": "Semantics label on individual students in the student switcher", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Manage Students": "Gestisci studenti", - "@Manage Students": { - "description": "Label text for the Manage Students nav drawer button as well as the title for the Manage Students screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Help": "Guida", - "@Help": { - "description": "Label text for the help nav drawer button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Log Out": "Disconnetti", - "@Log Out": { - "description": "Label text for the Log Out nav drawer button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Switch Users": "Cambia studenti", - "@Switch Users": { - "description": "Label text for the Switch Users nav drawer button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "appVersion": "v. {version}", - "@appVersion": { - "description": "App version shown in the navigation drawer", - "type": "text", - "placeholders_order": [ - "version" - ], - "placeholders": { - "version": {} - } - }, - "Are you sure you want to log out?": "Disconnettersi?", - "@Are you sure you want to log out?": { - "description": "Confirmation message displayed when the user tries to log out", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Calendars": "Calendari", - "@Calendars": { - "description": "Label for button that lets users select which calendars to display", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "nextMonth": "Prossimo mese: {month}", - "@nextMonth": { - "description": "Label for the button that switches the calendar to the next month", - "type": "text", - "placeholders_order": [ - "month" - ], - "placeholders": { - "month": {} - } - }, - "previousMonth": "Mese precedente: {month}", - "@previousMonth": { - "description": "Label for the button that switches the calendar to the previous month", - "type": "text", - "placeholders_order": [ - "month" - ], - "placeholders": { - "month": {} - } - }, - "nextWeek": "Prossima settimana a partire da {date}", - "@nextWeek": { - "description": "Label for the button that switches the calendar to the next week", - "type": "text", - "placeholders_order": [ - "date" - ], - "placeholders": { - "date": {} - } - }, - "previousWeek": "Settimana precedente a partire da {date}", - "@previousWeek": { - "description": "Label for the button that switches the calendar to the previous week", - "type": "text", - "placeholders_order": [ - "date" - ], - "placeholders": { - "date": {} - } - }, - "selectedMonthLabel": "Mese di {month}", - "@selectedMonthLabel": { - "description": "Accessibility label for the button that expands/collapses the month view", - "type": "text", - "placeholders_order": [ - "month" - ], - "placeholders": { - "month": {} - } - }, - "expand": "estendi", - "@expand": { - "description": "Accessibility label for the on-tap hint for the button that expands/collapses the month view", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "collapse": "comprimi", - "@collapse": { - "description": "Accessibility label for the on-tap hint for the button that expands/collapses the month view", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "pointsPossible": "{points} punti possibili", - "@pointsPossible": { - "description": "Screen reader label used for the points possible for an assignment, quiz, etc.", - "type": "text", - "placeholders_order": [ - "points" - ], - "placeholders": { - "points": {} - } - }, - "calendarDaySemanticsLabel": "{eventCount,plural, =1{{date}, {eventCount} evento}other{{date}, {eventCount} eventi}}", - "@calendarDaySemanticsLabel": { - "description": "Screen reader label used for calendar day, reads the date and count of events", - "type": "text", - "placeholders_order": [ - "date", - "eventCount" - ], - "placeholders": { - "date": {}, - "eventCount": {} - } - }, - "No Events Today!": "Nessun evento oggi!", - "@No Events Today!": { - "description": "Title displayed when there are no calendar events for the current day", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "It looks like a great day to rest, relax, and recharge.": "Ottima occasione per riposarsi, rilassarsi e ricaricare le batterie.", - "@It looks like a great day to rest, relax, and recharge.": { - "description": "Message displayed when there are no calendar events for the current day", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading your student's calendar": "Si è verificato un errore di caricamento del calendario del tuo studente", - "@There was an error loading your student's calendar": { - "description": "Message displayed when calendar events could not be loaded for the current student", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Tap to favorite the courses you want to see on the Calendar. Select up to 10.": "Tocca per mettere nei preferiti i corsi che vuoi vedere sul calendario. Seleziona fino a 10.", - "@Tap to favorite the courses you want to see on the Calendar. Select up to 10.": { - "description": "Description text on calendar filter screen.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You may only choose 10 calendars to display": "Puoi scegliere solo 10 calendari da visualizzare", - "@You may only choose 10 calendars to display": { - "description": "Error text when trying to select more than 10 calendars", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You must select at least one calendar to display": "Devi selezionare almeno un calendario da visualizzare", - "@You must select at least one calendar to display": { - "description": "Error text when trying to de-select all calendars", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Planner Note": "Nota agenda", - "@Planner Note": { - "description": "Label used for notes in the planner", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Go to today": "Vai a oggi", - "@Go to today": { - "description": "Accessibility label used for the today button in the planner", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Previous Logins": "Login precedenti", - "@Previous Logins": { - "description": "Label for the list of previous user logins", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "canvasLogoLabel": "Logo Canvas", - "@canvasLogoLabel": { - "description": "The semantics label for the Canvas logo", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "findSchool": "Trova scuola", - "@findSchool": { - "description": "Text for the find-my-school button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "findAnotherSchool": "Trova un’altra scuola", - "@findAnotherSchool": { - "description": "Text for the find-another-school button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "domainSearchInputHint": "Inserisci nome scuola o distretto…", - "@domainSearchInputHint": { - "description": "Input hint for the text box on the domain search screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "noDomainResults": "Impossibile trovare delle scuole corrispondenti a \"{query}\"", - "@noDomainResults": { - "description": "Message shown to users when the domain search query did not return any results", - "type": "text", - "placeholders_order": [ - "query" - ], - "placeholders": { - "query": {} - } - }, - "domainSearchHelpLabel": "Come posso trovare la mia scuola o il mio distretto?", - "@domainSearchHelpLabel": { - "description": "Label for the help button on the domain search screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "canvasGuides": "Guide Canvas", - "@canvasGuides": { - "description": "Proper name for the Canvas Guides. This will be used in the domainSearchHelpBody text and will be highlighted and clickable", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "canvasSupport": "Assistenza Canvas", - "@canvasSupport": { - "description": "Proper name for Canvas Support. This will be used in the domainSearchHelpBody text and will be highlighted and clickable", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "domainSearchHelpBody": "Prova a cercare il nome della scuola o del distretto a cui stai tentando di accedere, ad esempio “Scuola privata Rossi” o “Scuole statali Rossi”. Puoi anche entrare direttamente in un dominio Canvas, ad esempio “rossi.instructure.com.”\n\nPer ulteriori informazioni su come trovare l’account Canvas del tuo istituto, puoi visitare le {canvasGuides}, contattare l’{canvasSupport} o la scuola per assistenza.", - "@domainSearchHelpBody": { - "description": "The body text shown in the help dialog on the domain search screen", - "type": "text", - "placeholders_order": [ - "canvasGuides", - "canvasSupport" - ], - "placeholders": { - "canvasGuides": {}, - "canvasSupport": {} - } - }, - "Uh oh!": "Spiacenti.", - "@Uh oh!": { - "description": "Title of the screen that shows when a crash has occurred", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "We’re not sure what happened, but it wasn’t good. Contact us if this keeps happening.": "Non siamo sicuri di cos’è successo, ma non è stata una cosa positiva. Contattaci se continua a succedere.", - "@We’re not sure what happened, but it wasn’t good. Contact us if this keeps happening.": { - "description": "Message shown when a crash has occurred", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Contact Support": "Contatta l’assistenza", - "@Contact Support": { - "description": "Label for the button that allows users to contact support after a crash has occurred", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "View error details": "Visualizza dettagli errori", - "@View error details": { - "description": "Label for the button that allowed users to view crash details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Restart app": "Riavvia app", - "@Restart app": { - "description": "Label for the button that will restart the entire application", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Application version": "Versione applicazione", - "@Application version": { - "description": "Label for the application version displayed in the crash details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Device model": "Modello dispositivo", - "@Device model": { - "description": "Label for the device model displayed in the crash details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Android OS version": "Versione SO Android", - "@Android OS version": { - "description": "Label for the Android operating system version displayed in the crash details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Full error message": "Messaggio di errore pieno", - "@Full error message": { - "description": "Label for the full error message displayed in the crash details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Inbox": "Posta in arrivo", - "@Inbox": { - "description": "Title for the Inbox screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading your inbox messages.": "Si è verificato un errore durante il caricamento dei messaggi di posta in arrivo.", - "@There was an error loading your inbox messages.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Subject": "Nessun oggetto", - "@No Subject": { - "description": "Title used for inbox messages that have no subject", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unable to fetch courses. Please check your connection and try again.": "Impossibile recuperare i corsi. Verifica la connessione e riprova.", - "@Unable to fetch courses. Please check your connection and try again.": { - "description": "Message shown when an error occured while loading courses", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Choose a course to message": "Scegli un corso da messaggiare", - "@Choose a course to message": { - "description": "Header in the course list shown when the user is choosing which course to associate with a new message", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Inbox Zero": "Zero in posta in arrivo", - "@Inbox Zero": { - "description": "Title of the message shown when there are no inbox messages", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You’re all caught up!": "Sei in pari!", - "@You’re all caught up!": { - "description": "Subtitle of the message shown when there are no inbox messages", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading recipients for this course": "Si è verificato un errore durante il caricamento dei destinatari per questo corso", - "@There was an error loading recipients for this course": { - "description": "Message shown when attempting to create a new message but the recipients list failed to load", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unable to send message. Check your connection and try again.": "Impossibile inviare il messaggio. Verifica la tua connessione e riprova.", - "@Unable to send message. Check your connection and try again.": { - "description": "Message show when there was an error creating or sending a new message", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unsaved changes": "Modifiche non salvate", - "@Unsaved changes": { - "description": "Title of the dialog shown when the user tries to leave with unsaved changes", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Are you sure you wish to close this page? Your unsent message will be lost.": "Vuoi chiudere questa pagina? Il messaggio non inviato andrà perso.", - "@Are you sure you wish to close this page? Your unsent message will be lost.": { - "description": "Body text of the dialog shown when the user tries leave with unsaved changes", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "New message": "Nuovo messaggio", - "@New message": { - "description": "Title of the new-message screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Add attachment": "Aggiungi allegato", - "@Add attachment": { - "description": "Tooltip for the add-attachment button in the new-message screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Send message": "Invia messaggio", - "@Send message": { - "description": "Tooltip for the send-message button in the new-message screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Select recipients": "Seleziona destinatari", - "@Select recipients": { - "description": "Tooltip for the button that allows users to select message recipients", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No recipients selected": "Nessun destinatario selezionato", - "@No recipients selected": { - "description": "Hint displayed when the user has not selected any message recipients", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Message subject": "Oggetto del messaggio", - "@Message subject": { - "description": "Hint text displayed in the input field for the message subject", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Message": "Messaggio", - "@Message": { - "description": "Hint text displayed in the input field for the message body", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Recipients": "Destinatari", - "@Recipients": { - "description": "Label for message recipients", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "plusRecipientCount": "+{count}", - "@plusRecipientCount": { - "description": "Shows the number of recipients that are selected but not displayed on screen.", - "type": "text", - "placeholders_order": [ - "count" - ], - "placeholders": { - "count": { - "example": 5 - } - } - }, - "Failed. Tap for options.": "Non riuscito. Tocca per le opzioni.", - "@Failed. Tap for options.": { - "description": "Short message shown on a message attachment when uploading has failed", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "courseForWhom": "per {studentShortName}", - "@courseForWhom": { - "description": "Describes for whom a course is for (i.e. for Bill)", - "type": "text", - "placeholders_order": [ - "studentShortName" - ], - "placeholders": { - "studentShortName": {} - } - }, - "messageLinkPostscript": "Su: {studentName}, {linkUrl}", - "@messageLinkPostscript": { - "description": "A postscript appended to new messages that clarifies which student is the subject of the message and also includes a URL for the related Canvas component (course, assignment, event, etc).", - "type": "text", - "placeholders_order": [ - "studentName", - "linkUrl" - ], - "placeholders": { - "studentName": {}, - "linkUrl": {} - } - }, - "There was an error loading this conversation": "Si è verificato un errore durante il caricamento di questa conversazione", - "@There was an error loading this conversation": { - "description": "Message shown when a conversation fails to load", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Reply": "Rispondi", - "@Reply": { - "description": "Button label for replying to a conversation", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Reply All": "Rispondi a tutti", - "@Reply All": { - "description": "Button label for replying to all conversation participants", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unknown User": "Utente sconosciuto", - "@Unknown User": { - "description": "Label used where the user name is not known", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "me": "me", - "@me": { - "description": "First-person pronoun (i.e. 'me') that will be used in message author info, e.g. 'Me to 4 others' or 'Jon Snow to me'", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "authorToRecipient": "{authorName} a {recipientName}", - "@authorToRecipient": { - "description": "Author info for a single-recipient message; includes both the author name and the recipient name.", - "type": "text", - "placeholders_order": [ - "authorName", - "recipientName" - ], - "placeholders": { - "authorName": {}, - "recipientName": {} - } - }, - "authorToNOthers": "{howMany,plural, =1{{authorName} a 1 altro}other{{authorName} ad altri {howMany}}}", - "@authorToNOthers": { - "description": "Author info for a mutli-recipient message; includes the author name and the number of recipients", - "type": "text", - "placeholders_order": [ - "authorName", - "howMany" - ], - "placeholders": { - "authorName": {}, - "howMany": {} - } - }, - "authorToRecipientAndNOthers": "{howMany,plural, =1{{authorName} a {recipientName} e 1 altro}other{{authorName} a {recipientName} e altri {howMany}}}", - "@authorToRecipientAndNOthers": { - "description": "Author info for a multi-recipient message; includes the author name, one recipient name, and the number of other recipients", - "type": "text", - "placeholders_order": [ - "authorName", - "recipientName", - "howMany" - ], - "placeholders": { - "authorName": {}, - "recipientName": {}, - "howMany": {} - } - }, - "Download": "Download", - "@Download": { - "description": "Label for the button that will begin downloading a file", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Open with another app": "Apri con un’altra app", - "@Open with another app": { - "description": "Label for the button that will allow users to open a file with another app", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There are no installed applications that can open this file": "Non ci sono applicazioni installate per aprire questo file", - "@There are no installed applications that can open this file": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unsupported File": "File non supportato", - "@Unsupported File": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "This file is unsupported and can’t be viewed through the app": "Questo file non è supportato e non può essere visualizzato attraverso l’app", - "@This file is unsupported and can’t be viewed through the app": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unable to play this media file": "Impossibile riprodurre questo file multimediale", - "@Unable to play this media file": { - "description": "Message shown when audio or video media could not be played", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unable to load this image": "Impossibile caricare questa immagine", - "@Unable to load this image": { - "description": "Message shown when an image file could not be loaded or displayed", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading this file": "Si è verificato un errore durante il caricamento di questo file", - "@There was an error loading this file": { - "description": "Message shown when a file could not be loaded or displayed", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Courses": "Nessun corso", - "@No Courses": { - "description": "Title for having no courses", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Your student’s courses might not be published yet.": "I corsi dello studente potrebbero non essere stati ancora pubblicati.", - "@Your student’s courses might not be published yet.": { - "description": "Message for having no courses", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading your student’s courses.": "Si è verificato un errore durante il caricamento dei corsi dello studente.", - "@There was an error loading your student’s courses.": { - "description": "Message displayed when the list of student courses could not be loaded", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Grade": "Nessun voto", - "@No Grade": { - "description": "Message shown when there is currently no grade available for a course", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Filter by": "Filtra per", - "@Filter by": { - "description": "Title for list of terms to filter grades by", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Grades": "Voti", - "@Grades": { - "description": "Label for the \"Grades\" tab in course details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Syllabus": "Syllabus", - "@Syllabus": { - "description": "Label for the \"Syllabus\" tab in course details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Front Page": "Pagina iniziale", - "@Front Page": { - "description": "Label for the \"Front Page\" tab in course details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Summary": "Riepilogo", - "@Summary": { - "description": "Label for the \"Summary\" tab in course details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Send a message about this course": "Invia un messaggio su questo corso", - "@Send a message about this course": { - "description": "Accessibility hint for the course messaage floating action button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Total Grade": "Voto totale", - "@Total Grade": { - "description": "Label for the total grade in the course", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Graded": "Valutato", - "@Graded": { - "description": "Label for assignments that have been graded", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Submitted": "Inviato", - "@Submitted": { - "description": "Label for assignments that have been submitted", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Not Submitted": "Non inviato", - "@Not Submitted": { - "description": "Label for assignments that have not been submitted", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Late": "In ritardo", - "@Late": { - "description": "Label for assignments that have been marked late or submitted late", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Missing": "Mancante", - "@Missing": { - "description": "Label for assignments that have been marked missing or are not submitted and past the due date", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "-": "-", - "@-": { - "description": "Value representing no score for student submission", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "All Grading Periods": "Tutti i periodi di valutazione", - "@All Grading Periods": { - "description": "Label for selecting all grading periods", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Assignments": "Nessun compito", - "@No Assignments": { - "description": "Title for the no assignments message", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "It looks like assignments haven't been created in this space yet.": "Sembra che i compiti non siano ancora stati creati in questo spazio.", - "@It looks like assignments haven't been created in this space yet.": { - "description": "Message for no assignments", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading the summary details for this course.": "Si è verificato un errore durante il caricamento dei dettagli di riepilogo per questo corso.", - "@There was an error loading the summary details for this course.": { - "description": "Message shown when the course summary could not be loaded", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Summary": "Nessun riepilogo", - "@No Summary": { - "description": "Title displayed when there are no items in the course summary", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "This course does not have any assignments or calendar events yet.": "Questo corso non ha ancora alcun compito o eventi di calendario.", - "@This course does not have any assignments or calendar events yet.": { - "description": "Message displayed when there are no items in the course summary", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "gradeFormatScoreOutOfPointsPossible": "{score} / {pointsPossible}", - "@gradeFormatScoreOutOfPointsPossible": { - "description": "Formatted string for a student score out of the points possible", - "type": "text", - "placeholders_order": [ - "score", - "pointsPossible" - ], - "placeholders": { - "score": {}, - "pointsPossible": {} - } - }, - "contentDescriptionScoreOutOfPointsPossible": "{score} su {pointsPossible} punti", - "@contentDescriptionScoreOutOfPointsPossible": { - "description": "Formatted string for a student score out of the points possible", - "type": "text", - "placeholders_order": [ - "score", - "pointsPossible" - ], - "placeholders": { - "score": {}, - "pointsPossible": {} - } - }, - "gradesSubjectMessage": "Su: {studentName}, Voti", - "@gradesSubjectMessage": { - "description": "The subject line for a message to a teacher regarding a student's grades", - "type": "text", - "placeholders_order": [ - "studentName" - ], - "placeholders": { - "studentName": {} - } - }, - "syllabusSubjectMessage": "Su: {studentName}, Syllabus", - "@syllabusSubjectMessage": { - "description": "The subject line for a message to a teacher regarding a course syllabus", - "type": "text", - "placeholders_order": [ - "studentName" - ], - "placeholders": { - "studentName": {} - } - }, - "frontPageSubjectMessage": "Su: {studentName}, Pagina iniziale", - "@frontPageSubjectMessage": { - "description": "The subject line for a message to a teacher regarding a course front page", - "type": "text", - "placeholders_order": [ - "studentName" - ], - "placeholders": { - "studentName": {} - } - }, - "assignmentSubjectMessage": "Su: {studentName}, Compito - {assignmentName}", - "@assignmentSubjectMessage": { - "description": "The subject line for a message to a teacher regarding a student's assignment", - "type": "text", - "placeholders_order": [ - "studentName", - "assignmentName" - ], - "placeholders": { - "studentName": {}, - "assignmentName": {} - } - }, - "eventSubjectMessage": "Su: {studentName}, Evento - {eventTitle}", - "@eventSubjectMessage": { - "description": "The subject line for a message to a teacher regarding a calendar event", - "type": "text", - "placeholders_order": [ - "studentName", - "eventTitle" - ], - "placeholders": { - "studentName": {}, - "eventTitle": {} - } - }, - "There is no page information available.": "Non ci sono informazioni pagina disponibili.", - "@There is no page information available.": { - "description": "Description for when no page information is available", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Assignment Details": "Dettagli compiti", - "@Assignment Details": { - "description": "Title for the page that shows details for an assignment", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "assignmentTotalPoints": "{points} pt.", - "@assignmentTotalPoints": { - "description": "Label used for the total points the assignment is worth", - "type": "text", - "placeholders_order": [ - "points" - ], - "placeholders": { - "points": {} - } - }, - "assignmentTotalPointsAccessible": "{points} punti", - "@assignmentTotalPointsAccessible": { - "description": "Screen reader label used for the total points the assignment is worth", - "type": "text", - "placeholders_order": [ - "points" - ], - "placeholders": { - "points": {} - } - }, - "Due": "Scadenza", - "@Due": { - "description": "Label for an assignment due date", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Grade": "Voto", - "@Grade": { - "description": "Label for the section that displays an assignment's grade", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Locked": "Bloccato", - "@Locked": { - "description": "Label for when an assignment is locked", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "assignmentLockedModule": "Questo compito è bloccato dal modulo \"{moduleName}\".", - "@assignmentLockedModule": { - "description": "The locked description when an assignment is locked by a module", - "type": "text", - "placeholders_order": [ - "moduleName" - ], - "placeholders": { - "moduleName": {} - } - }, - "Remind Me": "Promemoria", - "@Remind Me": { - "description": "Label for the row to set reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Set a date and time to be notified of this specific assignment.": "Imposta una data e un’ora per ricevere la notifica su questo compito specifico.", - "@Set a date and time to be notified of this specific assignment.": { - "description": "Description for row to set reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You will be notified about this assignment on…": "Riceverai una notifica su questo compito il…", - "@You will be notified about this assignment on…": { - "description": "Description for when a reminder is set", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Instructions": "Istruzioni", - "@Instructions": { - "description": "Label for the description of the assignment when it has quiz instructions", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Send a message about this assignment": "Invia un messaggio su questo compito", - "@Send a message about this assignment": { - "description": "Accessibility hint for the assignment messaage floating action button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "This app is not authorized for use.": "Questa app non è autorizzata per l’uso.", - "@This app is not authorized for use.": { - "description": "The error shown when the app being used is not verified by Canvas", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The server you entered is not authorized for this app.": "Il server in cui sei entrato non è autorizzato per questa app.", - "@The server you entered is not authorized for this app.": { - "description": "The error shown when the desired login domain is not verified by Canvas", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The user agent for this app is not authorized.": "L’agente utente per questa app non è autorizzata.", - "@The user agent for this app is not authorized.": { - "description": "The error shown when the user agent during verification is not verified by Canvas", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "We were unable to verify the server for use with this app.": "Non siamo riusciti a verificare il server per l’uso con questa app.", - "@We were unable to verify the server for use with this app.": { - "description": "The generic error shown when we are unable to verify with Canvas", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Reminders": "Promemoria", - "@Reminders": { - "description": "Name of the system notification channel for assignment and event reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Notifications for reminders about assignments and calendar events": "Notifiche per i promemoria sui compiti e gli eventi di calendario", - "@Notifications for reminders about assignments and calendar events": { - "description": "Description of the system notification channel for assignment and event reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Reminders have changed!": "I promemoria sono cambiati!", - "@Reminders have changed!": { - "description": "Title of the dialog shown when the user needs to update their reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "In order to provide you with a better experience, we have updated how reminders work. You can add new reminders by viewing an assignment or calendar event and tapping the switch under the \"Remind Me\" section.\n\nBe aware that any reminders created with older versions of this app will not be compatible with the new changes and you will need to create them again.": "Per fornirti un’esperienza migliore, abbiamo aggiornato il modo in cui funzionano i promemoria. Puoi aggiungere nuovi promemoria visualizzando un compito o un evento del calendario e toccando l’interruttore sotto la sezione \"Promemoria\".\n\nNon dimenticare che tutti i promemoria creati con le versioni precedenti di questa app non saranno compatibili con le nuove modifiche e sarà necessario ricrearli.", - "@In order to provide you with a better experience, we have updated how reminders work. You can add new reminders by viewing an assignment or calendar event and tapping the switch under the \"Remind Me\" section.\n\nBe aware that any reminders created with older versions of this app will not be compatible with the new changes and you will need to create them again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Not a parent?": "Non è principale?", - "@Not a parent?": { - "description": "Title for the screen that shows when the user is not observing any students", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "We couldn't find any students associated with this account": "Impossibile trovare alcuno studente associato con questo account", - "@We couldn't find any students associated with this account": { - "description": "Subtitle for the screen that shows when the user is not observing any students", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Are you a student or teacher?": "Sei uno studente o un insegnante?", - "@Are you a student or teacher?": { - "description": "Label for button that will show users the option to view other Canvas apps in the Play Store", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "One of our other apps might be a better fit. Tap one to visit the Play Store.": "Una delle altre nostre app potrebbe essere la scelta migliore. Toccane una per visitare Play Store.", - "@One of our other apps might be a better fit. Tap one to visit the Play Store.": { - "description": "Description of options to view other Canvas apps in the Play Store", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Return to Login": "Torna alla pagina di login", - "@Return to Login": { - "description": "Label for the button that returns the user to the login screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "STUDENT": "STUDENTE", - "@STUDENT": { - "description": "The \"student\" portion of the \"Canvas Student\" app name, in all caps. \"Canvas\" is excluded in this context as it will be displayed to the user as a wordmark image", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "TEACHER": "INSEGNANTE", - "@TEACHER": { - "description": "The \"teacher\" portion of the \"Canvas Teacher\" app name, in all caps. \"Canvas\" is excluded in this context as it will be displayed to the user as a wordmark image", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Canvas Student": "Studente Canvas", - "@Canvas Student": { - "description": "The name of the Canvas Student app. Only \"Student\" should be translated as \"Canvas\" is a brand name in this context and should not be translated.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Canvas Teacher": "Insegnante Canvas", - "@Canvas Teacher": { - "description": "The name of the Canvas Teacher app. Only \"Teacher\" should be translated as \"Canvas\" is a brand name in this context and should not be translated.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Alerts": "Nessun avviso", - "@No Alerts": { - "description": "The title for the empty message to show to users when there are no alerts for the student.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There’s nothing to be notified of yet.": "Non c’è ancora nulla su cui ricevere delle notifiche.", - "@There’s nothing to be notified of yet.": { - "description": "The empty message to show to users when there are no alerts for the student.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "dismissAlertLabel": "Ignora {alertTitle}", - "@dismissAlertLabel": { - "description": "Accessibility label to dismiss an alert", - "type": "text", - "placeholders_order": [ - "alertTitle" - ], - "placeholders": { - "alertTitle": {} - } - }, - "Course Announcement": "Annuncio corso", - "@Course Announcement": { - "description": "Title for alerts when there is a course announcement", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Institution Announcement": "Annuncio istituto", - "@Institution Announcement": { - "description": "Title for alerts when there is an institution announcement", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "assignmentGradeAboveThreshold": "Voto compito sopra {threshold}", - "@assignmentGradeAboveThreshold": { - "description": "Title for alerts when an assignment grade is above the threshold value", - "type": "text", - "placeholders_order": [ - "threshold" - ], - "placeholders": { - "threshold": {} - } - }, - "assignmentGradeBelowThreshold": "Voto compito sotto {threshold}", - "@assignmentGradeBelowThreshold": { - "description": "Title for alerts when an assignment grade is below the threshold value", - "type": "text", - "placeholders_order": [ - "threshold" - ], - "placeholders": { - "threshold": {} - } - }, - "courseGradeAboveThreshold": "Voto corso sopra {threshold}", - "@courseGradeAboveThreshold": { - "description": "Title for alerts when a course grade is above the threshold value", - "type": "text", - "placeholders_order": [ - "threshold" - ], - "placeholders": { - "threshold": {} - } - }, - "courseGradeBelowThreshold": "Voto corso sotto {threshold}", - "@courseGradeBelowThreshold": { - "description": "Title for alerts when a course grade is below the threshold value", - "type": "text", - "placeholders_order": [ - "threshold" - ], - "placeholders": { - "threshold": {} - } - }, - "Settings": "Impostazioni", - "@Settings": { - "description": "Title for the settings screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Theme": "Tema", - "@Theme": { - "description": "Label for the light/dark theme section in the settings page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Dark Mode": "Modalità Scura", - "@Dark Mode": { - "description": "Label for the button that enables dark mode", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Light Mode": "Modalità chiara", - "@Light Mode": { - "description": "Label for the button that enables light mode", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "High Contrast Mode": "Modalità alto contrasto", - "@High Contrast Mode": { - "description": "Label for the switch that toggles high contrast mode", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Use Dark Theme in Web Content": "Usa tema scuro nel contenuto web", - "@Use Dark Theme in Web Content": { - "description": "Label for the switch that toggles dark mode for webviews", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Appearance": "Aspetto", - "@Appearance": { - "description": "Label for the appearance section in the settings page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Successfully submitted!": "Inviato correttamente!", - "@Successfully submitted!": { - "description": "Title displayed in the grade cell for an assignment that has been submitted", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "submissionStatusSuccessSubtitle": "Questo compito è stato inviato il {date} alle {time} ed è in attesa della valutazione", - "@submissionStatusSuccessSubtitle": { - "description": "Subtitle displayed in the grade cell for an assignment that has been submitted and is awaiting a grade", - "type": "text", - "placeholders_order": [ - "date", - "time" - ], - "placeholders": { - "date": {}, - "time": {} - } - }, - "outOfPoints": "{howMany,plural, =1{Di 1 punto}other{Di {points} punti}}", - "@outOfPoints": { - "description": "Description for an assignment grade that has points without a current scoroe", - "type": "text", - "placeholders_order": [ - "points", - "howMany" - ], - "placeholders": { - "points": {}, - "howMany": {} - } - }, - "Excused": "Giustificato", - "@Excused": { - "description": "Grading status for an assignment marked as excused", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Complete": "Completa", - "@Complete": { - "description": "Grading status for an assignment marked as complete", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Incomplete": "Non completato", - "@Incomplete": { - "description": "Grading status for an assignment marked as incomplete", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "minus": "meno", - "@minus": { - "description": "Screen reader-friendly replacement for the \"-\" character in letter grades like \"A-\"", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "latePenalty": "Penale ritardo (-{pointsLost})", - "@latePenalty": { - "description": "Text displayed when a late penalty has been applied to the assignment", - "type": "text", - "placeholders_order": [ - "pointsLost" - ], - "placeholders": { - "pointsLost": {} - } - }, - "finalGrade": "Voto finale: {grade}", - "@finalGrade": { - "description": "Text that displays the final grade of an assignment", - "type": "text", - "placeholders_order": [ - "grade" - ], - "placeholders": { - "grade": {} - } - }, - "Alert Settings": "Impostazioni avviso", - "@Alert Settings": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Alert me when…": "Avvisami quando…", - "@Alert me when…": { - "description": "Header for the screen where the observer chooses the thresholds that will determine when they receive alerts (e.g. when an assignment is graded below 70%)", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Course grade below": "Voto corso sotto", - "@Course grade below": { - "description": "Label describing the threshold for when the course grade is below a certain percentage", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Course grade above": "Voto corso sopra", - "@Course grade above": { - "description": "Label describing the threshold for when the course grade is above a certain percentage", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Assignment missing": "Compito mancante", - "@Assignment missing": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Assignment grade below": "Voto compito sotto", - "@Assignment grade below": { - "description": "Label describing the threshold for when an assignment is graded below a certain percentage", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Assignment grade above": "Voto compito sopra", - "@Assignment grade above": { - "description": "Label describing the threshold for when an assignment is graded above a certain percentage", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Course Announcements": "Annunci corso", - "@Course Announcements": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Institution Announcements": "Annunci istituto", - "@Institution Announcements": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Never": "Mai", - "@Never": { - "description": "Indication that tells the user they will not receive alert notifications of a specific kind", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Grade percentage": "Percentuale voto", - "@Grade percentage": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading your student's alerts.": "Si è verificato un errore durante il caricamento degli avvisi dello studente.", - "@There was an error loading your student's alerts.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Must be below 100": "Deve essere sotto 100", - "@Must be below 100": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "mustBeBelowN": "Deve essere sotto {percentage}", - "@mustBeBelowN": { - "description": "Validation error to the user that they must choose a percentage below 'n'", - "type": "text", - "placeholders_order": [ - "percentage" - ], - "placeholders": { - "percentage": { - "example": 5 - } - } - }, - "mustBeAboveN": "Deve essere sopra {percentage}", - "@mustBeAboveN": { - "description": "Validation error to the user that they must choose a percentage above 'n'", - "type": "text", - "placeholders_order": [ - "percentage" - ], - "placeholders": { - "percentage": { - "example": 5 - } - } - }, - "Select Student Color": "Seleziona colore studente", - "@Select Student Color": { - "description": "Title for screen that allows users to assign a color to a specific student", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Electric, blue": "Elettrico, blu", - "@Electric, blue": { - "description": "Name of the Electric (blue) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Plum, Purple": "Prugna, viola", - "@Plum, Purple": { - "description": "Name of the Plum (purple) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Barney, Fuschia": "Barney, fucsia", - "@Barney, Fuschia": { - "description": "Name of the Barney (fuschia) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Raspberry, Red": "Lampone, rosso", - "@Raspberry, Red": { - "description": "Name of the Raspberry (red) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Fire, Orange": "Fuoco, arancione", - "@Fire, Orange": { - "description": "Name of the Fire (orange) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Shamrock, Green": "Trifoglio, verde", - "@Shamrock, Green": { - "description": "Name of the Shamrock (green) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "An error occurred while saving your selection. Please try again.": "Si è verificato un errore durante il salvataggio della selezione. Riprova.", - "@An error occurred while saving your selection. Please try again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "changeStudentColorLabel": "Cambia colore per {studentName}", - "@changeStudentColorLabel": { - "description": "Accessibility label for the button that lets users change the color associated with a specific student", - "type": "text", - "placeholders_order": [ - "studentName" - ], - "placeholders": { - "studentName": {} - } - }, - "Teacher": "Insegnante", - "@Teacher": { - "description": "Label for the Teacher enrollment type", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Student": "Studente", - "@Student": { - "description": "Label for the Student enrollment type", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "TA": "Assistente", - "@TA": { - "description": "Label for the Teaching Assistant enrollment type (also known as Teacher Aid or Education Assistant), reduced to a short acronym/initialism if appropriate.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Observer": "Osservatore", - "@Observer": { - "description": "Label for the Observer enrollment type", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Use Camera": "Usa videocamera", - "@Use Camera": { - "description": "Label for the action item that lets the user capture a photo using the device camera", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Upload File": "Carica File", - "@Upload File": { - "description": "Label for the action item that lets the user upload a file from their device", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Choose from Gallery": "Scegli da galleria", - "@Choose from Gallery": { - "description": "Label for the action item that lets the user select a photo from their device gallery", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Preparing…": "Preparazione in corso...", - "@Preparing…": { - "description": "Message shown while a file is being prepared to attach to a message", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Add student with…": "Aggiungi studente con…", - "@Add student with…": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Add Student": "Aggiungi studente", - "@Add Student": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You are not observing any students.": "Non stati monitorando alcuno studente.", - "@You are not observing any students.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading your students.": "Si è verificato un errore durante il caricamento dei tuoi studenti.", - "@There was an error loading your students.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Pairing Code": "Codice accoppiamento", - "@Pairing Code": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Students can obtain a pairing code through the Canvas website": "Gli studenti possono ricevere un codice di abbinamento sul sito web Canvas", - "@Students can obtain a pairing code through the Canvas website": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Enter the student pairing code provided to you. If the pairing code doesn't work, it may have expired": "Inserisci il codice accoppiamento studente fornito. Se il codice accoppiamento non funziona, potrebbe essere scaduto", - "@Enter the student pairing code provided to you. If the pairing code doesn't work, it may have expired": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Your code is incorrect or expired.": "Il tuo codice non è corretto o è scaduto.", - "@Your code is incorrect or expired.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Something went wrong trying to create your account, please reach out to your school for assistance.": "Si è verificato un errore durante il tentativo di creare il tuo account, contatta la scuola per assistenza.", - "@Something went wrong trying to create your account, please reach out to your school for assistance.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "QR Code": "Codice QR", - "@QR Code": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Students can create a QR code using the Canvas Student app on their mobile device": "Gli studenti possono creare un codice QR tramite l'applicazione Canvas Student sul loro dispositivo mobile", - "@Students can create a QR code using the Canvas Student app on their mobile device": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Add new student": "Aggiungi nuovo studente", - "@Add new student": { - "description": "Semantics label for the FAB on the Manage Students Screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Select": "Seleziona", - "@Select": { - "description": "Hint text to tell the user to choose one of two options", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I have a Canvas account": "Ho un account Canvas", - "@I have a Canvas account": { - "description": "Option to select for users that have a canvas account", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I don't have a Canvas account": "Non ho un account Canvas", - "@I don't have a Canvas account": { - "description": "Option to select for users that don't have a canvas account", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Create Account": "Crea account", - "@Create Account": { - "description": "Button text for account creation confirmation", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Full Name": "Nome completo", - "@Full Name": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Email Address": "Indirizzo e-mail", - "@Email Address": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Password": "Password", - "@Password": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Full Name…": "Nome completo...", - "@Full Name…": { - "description": "hint label for inside form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Email…": "E-mail...", - "@Email…": { - "description": "hint label for inside form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Password…": "Password...", - "@Password…": { - "description": "hint label for inside form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Please enter full name": "Inserisci il nome completo", - "@Please enter full name": { - "description": "Error message for form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Please enter an email address": "Inserisci un indirizzo e-mail", - "@Please enter an email address": { - "description": "Error message for form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Please enter a valid email address": "Inserisci un indirizzo e-mail valido", - "@Please enter a valid email address": { - "description": "Error message for form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Password is required": "Password obbligatoria", - "@Password is required": { - "description": "Error message for form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Password must contain at least 8 characters": "La password deve contenere almeno 8 caratteri", - "@Password must contain at least 8 characters": { - "description": "Error message for form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "qrCreateAccountTos": "Toccando “Crea account”, accetti i {termsOfService} e confermi l’{privacyPolicy}", - "@qrCreateAccountTos": { - "description": "The text show on the account creation screen", - "type": "text", - "placeholders_order": [ - "termsOfService", - "privacyPolicy" - ], - "placeholders": { - "termsOfService": {}, - "privacyPolicy": {} - } - }, - "Terms of Service": "Termini di servizio", - "@Terms of Service": { - "description": "Label for the Canvas Terms of Service agreement. This will be used in the qrCreateAccountTos text and will be highlighted and clickable", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Privacy Policy": "Informativa sulla privacy", - "@Privacy Policy": { - "description": "Label for the Canvas Privacy Policy agreement. This will be used in the qrCreateAccountTos text and will be highlighted and clickable", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "View the Privacy Policy": "Visualizza informativa sulla privacy", - "@View the Privacy Policy": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Already have an account? ": "Hai già un account? ", - "@Already have an account? ": { - "description": "Part of multiline text span, includes AccountSignIn1-2, in that order", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Sign In": "Accedi", - "@Sign In": { - "description": "Part of multiline text span, includes AccountSignIn1-2, in that order", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Hide Password": "Nascondi password", - "@Hide Password": { - "description": "content description for password hide button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Show Password": "Mostra password", - "@Show Password": { - "description": "content description for password show button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Terms of Service Link": "Link dei termini di servizio", - "@Terms of Service Link": { - "description": "content description for terms of service link", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Privacy Policy Link": "Link dell’informativa sulla privacy", - "@Privacy Policy Link": { - "description": "content description for privacy policy link", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Event": "Evento", - "@Event": { - "description": "Title for the event details screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Date": "Data", - "@Date": { - "description": "Label for the event date", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Location": "Posizione", - "@Location": { - "description": "Label for the location information", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Location Specified": "Nessuna posizione specificata", - "@No Location Specified": { - "description": "Description for events that do not have a location", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "eventTime": "{startAt} - {endAt}", - "@eventTime": { - "description": "The time the event is happening, example: \"2:00 pm - 4:00 pm\"", - "type": "text", - "placeholders_order": [ - "startAt", - "endAt" - ], - "placeholders": { - "startAt": {}, - "endAt": {} - } - }, - "Set a date and time to be notified of this event.": "Imposta una data e un’ora per ricevere la notifica su questo evento.", - "@Set a date and time to be notified of this event.": { - "description": "Description for row to set event reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You will be notified about this event on…": "Riceverai una notifica su questo evento il…", - "@You will be notified about this event on…": { - "description": "Description for when an event reminder is set", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Share Your Love for the App": "Condividi cosa ti piace dell’app", - "@Share Your Love for the App": { - "description": "Label for option to open the app store", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Tell us about your favorite parts of the app": "Raccontaci quali sono le tue parti preferite dell’app", - "@Tell us about your favorite parts of the app": { - "description": "Description for option to open the app store", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Legal": "Legale", - "@Legal": { - "description": "Label for legal information option", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Privacy policy, terms of use, open source": "Informativa sulla privacy, termini di utilizzo, open source", - "@Privacy policy, terms of use, open source": { - "description": "Description for legal information option", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Idea for Canvas Parent App [Android]": "Idea per l’app Canvas Parent [Android]", - "@Idea for Canvas Parent App [Android]": { - "description": "The subject for the email to request a feature", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The following information will help us better understand your idea:": "Le seguenti informazioni ci aiutano a comprendere meglio la tua idea:", - "@The following information will help us better understand your idea:": { - "description": "The header for the users information that is attached to a feature request", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Domain:": "Dominio:", - "@Domain:": { - "description": "The label for the Canvas domain of the logged in user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "User ID:": "ID utente:", - "@User ID:": { - "description": "The label for the Canvas user ID of the logged in user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Email:": "E-mail:", - "@Email:": { - "description": "The label for the eamil of the logged in user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Locale:": "Impostazioni internazionali:", - "@Locale:": { - "description": "The label for the locale of the logged in user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Terms of Use": "Termini di utilizzo", - "@Terms of Use": { - "description": "Label for the terms of use", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Canvas on GitHub": "Canvas su GitHub", - "@Canvas on GitHub": { - "description": "Label for the button that opens the Canvas project on GitHub's website", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was a problem loading the Terms of Use": "Si è verificato un problema durante il caricamento delle Condizioni d’uso", - "@There was a problem loading the Terms of Use": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Device": "Dispositivo", - "@Device": { - "description": "Label used for device manufacturer/model in the error report", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "OS Version": "Versione SO", - "@OS Version": { - "description": "Label used for device operating system version in the error report", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Version Number": "Numero versione", - "@Version Number": { - "description": "Label used for the app version number in the error report", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Report A Problem": "Segnala un problema", - "@Report A Problem": { - "description": "Title used for generic dialog to report problems", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Subject": "Oggetto", - "@Subject": { - "description": "Label used for Subject text field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "A subject is required.": "L’argomento è obbligatorio.", - "@A subject is required.": { - "description": "Error shown when the subject field is empty", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "An email address is required.": "L’indirizzo e-mail è obbligatorio.", - "@An email address is required.": { - "description": "Error shown when the email field is empty", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Description": "Descrizione", - "@Description": { - "description": "Label used for Description text field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "A description is required.": "La descrizione è obbligatoria.", - "@A description is required.": { - "description": "Error shown when the description field is empty", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "How is this affecting you?": "Quali sono le ripercussioni per te?", - "@How is this affecting you?": { - "description": "Label used for the dropdown to select how severe the issue is", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "send": "invia", - "@send": { - "description": "Label used for send button when reporting a problem", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Just a casual question, comment, idea, suggestion…": "Solo una domanda casuale, un commento, un'idea, un suggerimento…", - "@Just a casual question, comment, idea, suggestion…": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I need some help but it's not urgent.": "Ho bisogno di aiuto ma non è urgente.", - "@I need some help but it's not urgent.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Something's broken but I can work around it to get what I need done.": "Si è verificato un problema ma posso aggirarlo e fare ciò che devo.", - "@Something's broken but I can work around it to get what I need done.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I can't get things done until I hear back from you.": "Non riesco a terminare il lavoro finché non ricevo una tua risposta.", - "@I can't get things done until I hear back from you.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "EXTREME CRITICAL EMERGENCY!!": "EMERGENZA CRITICA.", - "@EXTREME CRITICAL EMERGENCY!!": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Not Graded": "Non valutato", - "@Not Graded": { - "description": "Description for an assignment has not been graded.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Login flow: Normal": "Flusso di login: Normale", - "@Login flow: Normal": { - "description": "Description for the normal login flow", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Login flow: Canvas": "Flusso di login: Canvas", - "@Login flow: Canvas": { - "description": "Description for the Canvas login flow", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Login flow: Site Admin": "Flusso di login: Amministratore del sito", - "@Login flow: Site Admin": { - "description": "Description for the Site Admin login flow", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Login flow: Skip mobile verify": "Flusso di login: Salta verifica dispositivo mobile", - "@Login flow: Skip mobile verify": { - "description": "Description for the login flow that skips domain verification for mobile", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Act As User": "Agisci come utente", - "@Act As User": { - "description": "Label for the button that allows the user to act (masquerade) as another user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Stop Acting as User": "Non agire più come utente", - "@Stop Acting as User": { - "description": "Label for the button that allows the user to stop acting (masquerading) as another user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "actingAsUser": "Stai agendo come {userName}", - "@actingAsUser": { - "description": "Message shown while acting (masquerading) as another user", - "type": "text", - "placeholders_order": [ - "userName" - ], - "placeholders": { - "userName": {} - } - }, - "\"Act as\" is essentially logging in as this user without a password. You will be able to take any action as if you were this user, and from other users' points of views, it will be as if this user performed them. However, audit logs record that you were the one who performed the actions on behalf of this user.": "\"Agisci come\" consiste sostanzialmente nell'effettuare l'accesso assumendo l'identità di questo utente senza inserire alcuna password. Potrai eseguire qualsiasi azione come se fossi questo utente e, dal punto di vista degli altri utenti, sarà come se queste azioni fossero state eseguite da questo utente. Tuttavia, i log di controllo registrano che sei stato tu a eseguire le azioni per conto di questo utente.", - "@\"Act as\" is essentially logging in as this user without a password. You will be able to take any action as if you were this user, and from other users' points of views, it will be as if this user performed them. However, audit logs record that you were the one who performed the actions on behalf of this user.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Domain": "Dominio", - "@Domain": { - "description": "Text field hint for domain url input", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You must enter a valid domain": "Devi inserire un dominio valido", - "@You must enter a valid domain": { - "description": "Message displayed for domain input error", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "User ID": "ID utente", - "@User ID": { - "description": "Text field hint for user ID input", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You must enter a user id": "Devi inserire un ID utente", - "@You must enter a user id": { - "description": "Message displayed for user Id input error", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error trying to act as this user. Please check the Domain and User ID and try again.": "Si è verificato un errore durante il tentativo di agire come questo utente. Controlla il dominio e l’ID utente e riprova.", - "@There was an error trying to act as this user. Please check the Domain and User ID and try again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "endMasqueradeMessage": "Non agirai più come {userName} e tornerai al tuo account originale.", - "@endMasqueradeMessage": { - "description": "Confirmation message displayed when the user wants to stop acting (masquerading) as another user", - "type": "text", - "placeholders_order": [ - "userName" - ], - "placeholders": { - "userName": {} - } - }, - "endMasqueradeLogoutMessage": "Non agirai più come {userName} e sarai disconnesso.", - "@endMasqueradeLogoutMessage": { - "description": "Confirmation message displayed when the user wants to stop acting (masquerading) as another user and will be logged out.", - "type": "text", - "placeholders_order": [ - "userName" - ], - "placeholders": { - "userName": {} - } - }, - "How are we doing?": "Come stiamo andando?", - "@How are we doing?": { - "description": "Title for dialog asking user to rate the app out of 5 stars.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Don't show again": "Non mostrarlo di nuovo", - "@Don't show again": { - "description": "Button to prevent the rating dialog from showing again.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "What can we do better?": "Cosa possiamo migliorare?", - "@What can we do better?": { - "description": "Hint text for providing a comment with the rating.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Send Feedback": "Invia feedback", - "@Send Feedback": { - "description": "Button to send rating with feedback", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "ratingDialogEmailSubject": "Suggerimenti per Android - Canvas Parent {version}", - "@ratingDialogEmailSubject": { - "description": "The subject for an email to provide feedback for CanvasParent.", - "type": "text", - "placeholders_order": [ - "version" - ], - "placeholders": { - "version": {} - } - }, - "starRating": "{position,plural, =1{{position} stella}other{{position} stelle}}", - "@starRating": { - "description": "Accessibility label for the 1 stars to 5 stars rating", - "type": "text", - "placeholders_order": [ - "position" - ], - "placeholders": { - "position": { - "example": 1 - } - } - }, - "Student Pairing": "Abbinamento studente", - "@Student Pairing": { - "description": "Title for the screen where users can pair to students using a QR code", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Open Canvas Student": "Apri Canvas Student", - "@Open Canvas Student": { - "description": "Title for QR pairing tutorial screen instructing users to open the Canvas Student app", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You'll need to open your student's Canvas Student app to continue. Go into Main Menu > Settings > Pair with Observer and scan the QR code you see there.": "Per continuare, devi aprire l'applicazione Canvas Student del tuo studente. Vai in Menu principale > Impostazioni > Abbina con l'Osservatore e scansiona il codice QR che vedi.", - "@You'll need to open your student's Canvas Student app to continue. Go into Main Menu > Settings > Pair with Observer and scan the QR code you see there.": { - "description": "Message explaining how QR code pairing works", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Screenshot showing location of pairing QR code generation in the Canvas Student app": "Schermata che mostra la posizione per la generazione del codice QR di abbinamento nell'applicazione Canvas Student", - "@Screenshot showing location of pairing QR code generation in the Canvas Student app": { - "description": "Content Description for qr pairing tutorial screenshot", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Expired QR Code": "Codice QR scaduto", - "@Expired QR Code": { - "description": "Error title shown when the users scans a QR code that has expired", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The QR code you scanned may have expired. Refresh the code on the student's device and try again.": "Il codice QR scansionato potrebbe essere scaduto. Aggiorna il codice sul dispositivo dello studente e riprova.", - "@The QR code you scanned may have expired. Refresh the code on the student's device and try again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "A network error occurred when adding this student. Check your connection and try again.": "Durante l’aggiunta di questo studente, si è verificato un errore di rete. Verifica la tua connessione e riprova.", - "@A network error occurred when adding this student. Check your connection and try again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Invalid QR Code": "Codice QR non valido", - "@Invalid QR Code": { - "description": "Error title shown when the user scans an invalid QR code", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Incorrect Domain": "Dominio errato", - "@Incorrect Domain": { - "description": "Error title shown when the users scane a QR code for a student that belongs to a different domain", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The student you are trying to add belongs to a different school. Log in or create an account with that school to scan this code.": "Lo studente che stai cercando di aggiungere fa parte di un'altra scuola. Per scansionare il codice, accedi o crea un account per quella scuola.", - "@The student you are trying to add belongs to a different school. Log in or create an account with that school to scan this code.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Camera Permission": "Autorizzazione della fotocamera", - "@Camera Permission": { - "description": "Error title shown when the user wans to scan a QR code but has denied the camera permission", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "This will unpair and remove all enrollments for this student from your account.": "Quest’azione disassocierà e rimuoverà tutte le iscrizioni per questo studente dal tuo account.", - "@This will unpair and remove all enrollments for this student from your account.": { - "description": "Confirmation message shown when the user tries to delete a student from their account", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was a problem removing this student from your account. Please check your connection and try again.": "Si è verificato un problema durante la rimozione di questo studente dall’account. Verifica la connessione e riprova.", - "@There was a problem removing this student from your account. Please check your connection and try again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Cancel": "Annulla", - "@Cancel": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "next": "Successivo", - "@next": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "ok": "OK", - "@ok": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Yes": "Sì", - "@Yes": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No": "No", - "@No": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Retry": "Riprova", - "@Retry": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Delete": "Elimina", - "@Delete": { - "description": "Label used for general delete/remove actions", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Done": "Fatto", - "@Done": { - "description": "Label for general done/finished actions", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Refresh": "Aggiorna", - "@Refresh": { - "description": "Label for button to refresh data from the web", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "View Description": "Visualizza descrizione", - "@View Description": { - "description": "Button to view the description for an event or assignment", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "expanded": "esteso", - "@expanded": { - "description": "Description for the accessibility reader for list groups that are expanded", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "collapsed": "compresso", - "@collapsed": { - "description": "Description for the accessibility reader for list groups that are expanded", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "An unexpected error occurred": "Si verificato un errore imprevisto", - "@An unexpected error occurred": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No description": "Nessuna descrizione", - "@No description": { - "description": "Message used when the assignment has no description", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Launch External Tool": "Avvia strumento esterno", - "@Launch External Tool": { - "description": "Button text added to webviews to let users open external tools in their browser", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Interactions on this page are limited by your institution.": "Le interazioni su questa pagina sono limitate dal tuo istituto.", - "@Interactions on this page are limited by your institution.": { - "description": "Message describing how the webview has limited access due to an instution setting", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "dateAtTime": "Il {date} alle {time}", - "@dateAtTime": { - "description": "The string to format dates", - "type": "text", - "placeholders_order": [ - "date", - "time" - ], - "placeholders": { - "date": {}, - "time": {} - } - }, - "dueDateAtTime": "Scade il {date} alle {time}", - "@dueDateAtTime": { - "description": "The string to format due dates", - "type": "text", - "placeholders_order": [ - "date", - "time" - ], - "placeholders": { - "date": {}, - "time": {} - } - }, - "No Due Date": "Nessuna data di scadenza", - "@No Due Date": { - "description": "Label for assignments that do not have a due date", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Filter": "Filtra", - "@Filter": { - "description": "Label for buttons to filter what items are visible", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "unread": "non letto", - "@unread": { - "description": "Label for things that are marked as unread", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "unreadCount": "{count} non letto", - "@unreadCount": { - "description": "Formatted string for when there are a number of unread items", - "type": "text", - "placeholders_order": [ - "count" - ], - "placeholders": { - "count": {} - } - }, - "badgeNumberPlus": "{count}+", - "@badgeNumberPlus": { - "description": "Formatted string for when too many items are being notified in a badge, generally something like: 99+", - "type": "text", - "placeholders_order": [ - "count" - ], - "placeholders": { - "count": {} - } - }, - "There was an error loading this announcement": "Si è verificato un errore durante il caricamento di questo annuncio", - "@There was an error loading this announcement": { - "description": "Message shown when an announcement detail screen fails to load", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Network error": "Errore di rete", - "@Network error": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Under Construction": "In costruzione", - "@Under Construction": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "We are currently building this feature for your viewing pleasure.": "Stiamo attualmente realizzando questa funzione che puoi visualizzare.", - "@We are currently building this feature for your viewing pleasure.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Request Login Help Button": "Pulsante Richiedi aiuto per login", - "@Request Login Help Button": { - "description": "Accessibility hint for button that opens help dialog for a login help request", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Request Login Help": "Richiedi aiuto per login", - "@Request Login Help": { - "description": "Title of help dialog for a login help request", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I'm having trouble logging in": "Ho dei problemi di login", - "@I'm having trouble logging in": { - "description": "Subject of help dialog for a login help request", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "An error occurred when trying to display this link": "Si è verificato un errore durante il tentativo di visualizzare questo link", - "@An error occurred when trying to display this link": { - "description": "Error message shown when a link can't be opened", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "We are unable to display this link, it may belong to an institution you currently aren't logged in to.": "Impossibile visualizzare questo link, può appartenere ad un istituto a cui non sei attualmente connesso.", - "@We are unable to display this link, it may belong to an institution you currently aren't logged in to.": { - "description": "Description for error page shown when clicking a link", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Link Error": "Errore link", - "@Link Error": { - "description": "Title for error page shown when clicking a link", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Open In Browser": "Apri nel browser", - "@Open In Browser": { - "description": "Text for button to open a link in the browswer", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You'll find the QR code on the web in your account profile. Click 'QR for Mobile Login' in the list.": "Troverai il codice QR sul web nel tuo profilo account. Fai clic su “QR per login da dispositivo mobile” nell’elenco.", - "@You'll find the QR code on the web in your account profile. Click 'QR for Mobile Login' in the list.": { - "description": "Text for qr login tutorial screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Locate QR Code": "Individua codice QR", - "@Locate QR Code": { - "description": "Text for qr login button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Please scan a QR code generated by Canvas": "Acquisisci un codice QR generato da Canvas", - "@Please scan a QR code generated by Canvas": { - "description": "Text for qr login error with incorrect qr code", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error logging in. Please generate another QR Code and try again.": "Si è verificato un errore di login. Genera un altro codice QR e riprova.", - "@There was an error logging in. Please generate another QR Code and try again.": { - "description": "Text for qr login error", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Screenshot showing location of QR code generation in browser": "Screenshot che mostra la posizione della generazione del codice QR nel browser", - "@Screenshot showing location of QR code generation in browser": { - "description": "Content Description for qr login tutorial screenshot", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "QR scanning requires camera access": "Per la scansione QR è necessario l’accesso alla fotocamera", - "@QR scanning requires camera access": { - "description": "placeholder for camera error for QR code scan", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The linked item is no longer available": "L'elemento collegato non è più disponibile", - "@The linked item is no longer available": { - "description": "error message when the alert could no be opened", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Message sent": "Messaggio inviato", - "@Message sent": { - "description": "confirmation message on the screen when the user succesfully sends a message", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Acceptable Use Policy": "Norme di utilizzo accettabile", - "@Acceptable Use Policy": { - "description": "title for the acceptable use policy screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Submit": "Invia", - "@Submit": { - "description": "submit button title for acceptable use policy screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Either you're a new user or the Acceptable Use Policy has changed since you last agreed to it. Please agree to the Acceptable Use Policy before you continue.": "Sei un nuovo utente oppure le Norme di utilizzo accettabile sono cambiate dall'ultima volta in cui le hai accettate. Accetta le Norme di utilizzo accettabile prima di continuare.", - "@Either you're a new user or the Acceptable Use Policy has changed since you last agreed to it. Please agree to the Acceptable Use Policy before you continue.": { - "description": "acceptable use policy screen description", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I agree to the Acceptable Use Policy.": "Accetto le Norme di utilizzo accettabile.", - "@I agree to the Acceptable Use Policy.": { - "description": "acceptable use policy switch title", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "About": "Informazioni", - "@About": { - "description": "Title for about menu item in settings", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "App": "App", - "@App": { - "description": "Title for App field on about page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Login ID": "ID di accesso", - "@Login ID": { - "description": "Title for Login ID field on about page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Email": "E-mail", - "@Email": { - "description": "Title for Email field on about page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Version": "Versione", - "@Version": { - "description": "Title for Version field on about page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Instructure logo": "Logo Instructure", - "@Instructure logo": { - "description": "Semantics label for the Instructure logo on the about page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - } -} \ No newline at end of file diff --git a/apps/flutter_parent/lib/l10n/res/intl_ja.arb b/apps/flutter_parent/lib/l10n/res/intl_ja.arb deleted file mode 100644 index cf1ca754a3..0000000000 --- a/apps/flutter_parent/lib/l10n/res/intl_ja.arb +++ /dev/null @@ -1,2753 +0,0 @@ -{ - "@@last_modified": "2023-08-25T11:04:20.901151", - "alertsLabel": "アラート", - "@alertsLabel": { - "description": "The label for the Alerts tab", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "calendarLabel": "カレンダー", - "@calendarLabel": { - "description": "The label for the Calendar tab", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "coursesLabel": "コース", - "@coursesLabel": { - "description": "The label for the Courses tab", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Students": "受講者はいません", - "@No Students": { - "description": "Text for when an observer has no students they are observing", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Tap to show student selector": "タップして受講者セレクタを表示します", - "@Tap to show student selector": { - "description": "Semantics label for the area that will show the student selector when tapped", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Tap to pair with a new student": "タップして新しい受講者とペアにします", - "@Tap to pair with a new student": { - "description": "Semantics label for the add student button in the student selector", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Tap to select this student": "タップしてこの受講者を選択します", - "@Tap to select this student": { - "description": "Semantics label on individual students in the student switcher", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Manage Students": "受講者を管理する", - "@Manage Students": { - "description": "Label text for the Manage Students nav drawer button as well as the title for the Manage Students screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Help": "ヘルプ", - "@Help": { - "description": "Label text for the help nav drawer button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Log Out": "ログアウト", - "@Log Out": { - "description": "Label text for the Log Out nav drawer button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Switch Users": "ユーザーを切り替える", - "@Switch Users": { - "description": "Label text for the Switch Users nav drawer button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "appVersion": "バージョン {version}", - "@appVersion": { - "description": "App version shown in the navigation drawer", - "type": "text", - "placeholders_order": [ - "version" - ], - "placeholders": { - "version": {} - } - }, - "Are you sure you want to log out?": "ログアウトしてもよろしいですか?", - "@Are you sure you want to log out?": { - "description": "Confirmation message displayed when the user tries to log out", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Calendars": "カレンダー", - "@Calendars": { - "description": "Label for button that lets users select which calendars to display", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "nextMonth": "来月:{month}", - "@nextMonth": { - "description": "Label for the button that switches the calendar to the next month", - "type": "text", - "placeholders_order": [ - "month" - ], - "placeholders": { - "month": {} - } - }, - "previousMonth": "前月:{month}", - "@previousMonth": { - "description": "Label for the button that switches the calendar to the previous month", - "type": "text", - "placeholders_order": [ - "month" - ], - "placeholders": { - "month": {} - } - }, - "nextWeek": "{date} から始まる翌週", - "@nextWeek": { - "description": "Label for the button that switches the calendar to the next week", - "type": "text", - "placeholders_order": [ - "date" - ], - "placeholders": { - "date": {} - } - }, - "previousWeek": "{date} から始まる前週", - "@previousWeek": { - "description": "Label for the button that switches the calendar to the previous week", - "type": "text", - "placeholders_order": [ - "date" - ], - "placeholders": { - "date": {} - } - }, - "selectedMonthLabel": "{month} 月", - "@selectedMonthLabel": { - "description": "Accessibility label for the button that expands/collapses the month view", - "type": "text", - "placeholders_order": [ - "month" - ], - "placeholders": { - "month": {} - } - }, - "expand": "さらに表示する", - "@expand": { - "description": "Accessibility label for the on-tap hint for the button that expands/collapses the month view", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "collapse": "折りたたむ", - "@collapse": { - "description": "Accessibility label for the on-tap hint for the button that expands/collapses the month view", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "pointsPossible": "配点 {points}", - "@pointsPossible": { - "description": "Screen reader label used for the points possible for an assignment, quiz, etc.", - "type": "text", - "placeholders_order": [ - "points" - ], - "placeholders": { - "points": {} - } - }, - "calendarDaySemanticsLabel": "{eventCount,plural, =1{{date}、{eventCount}イベント}other{{date}、{eventCount}イベント}}", - "@calendarDaySemanticsLabel": { - "description": "Screen reader label used for calendar day, reads the date and count of events", - "type": "text", - "placeholders_order": [ - "date", - "eventCount" - ], - "placeholders": { - "date": {}, - "eventCount": {} - } - }, - "No Events Today!": "今日イベントはありません!", - "@No Events Today!": { - "description": "Title displayed when there are no calendar events for the current day", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "It looks like a great day to rest, relax, and recharge.": "休息をとってリラックスし、充電するためにぴったりな日のようです。", - "@It looks like a great day to rest, relax, and recharge.": { - "description": "Message displayed when there are no calendar events for the current day", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading your student's calendar": "受講者のカレンダーのロード中にエラーが発生しました", - "@There was an error loading your student's calendar": { - "description": "Message displayed when calendar events could not be loaded for the current student", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Tap to favorite the courses you want to see on the Calendar. Select up to 10.": "タップしてカレンダーに表示したいコースをお気に入りにします。10まで選んでください。", - "@Tap to favorite the courses you want to see on the Calendar. Select up to 10.": { - "description": "Description text on calendar filter screen.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You may only choose 10 calendars to display": "表示するカレンダーは10個だけ選択できます", - "@You may only choose 10 calendars to display": { - "description": "Error text when trying to select more than 10 calendars", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You must select at least one calendar to display": "少なくともひとつのカレンダーを選択しなければなりません。", - "@You must select at least one calendar to display": { - "description": "Error text when trying to de-select all calendars", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Planner Note": "計画者メモ", - "@Planner Note": { - "description": "Label used for notes in the planner", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Go to today": "今日に進む", - "@Go to today": { - "description": "Accessibility label used for the today button in the planner", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Previous Logins": "以前のログイン", - "@Previous Logins": { - "description": "Label for the list of previous user logins", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "canvasLogoLabel": "Canvas ロゴ", - "@canvasLogoLabel": { - "description": "The semantics label for the Canvas logo", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "findSchool": "学校を探す", - "@findSchool": { - "description": "Text for the find-my-school button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "findAnotherSchool": "別の学校を探す", - "@findAnotherSchool": { - "description": "Text for the find-another-school button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "domainSearchInputHint": "学校名または学区を入力してください…", - "@domainSearchInputHint": { - "description": "Input hint for the text box on the domain search screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "noDomainResults": "\"{query}\"に一致する学校が見つかりません", - "@noDomainResults": { - "description": "Message shown to users when the domain search query did not return any results", - "type": "text", - "placeholders_order": [ - "query" - ], - "placeholders": { - "query": {} - } - }, - "domainSearchHelpLabel": "私の学校または学区はどのように見つければよいですか?", - "@domainSearchHelpLabel": { - "description": "Label for the help button on the domain search screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "canvasGuides": "Canvas ガイド", - "@canvasGuides": { - "description": "Proper name for the Canvas Guides. This will be used in the domainSearchHelpBody text and will be highlighted and clickable", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "canvasSupport": "Canvas サポート", - "@canvasSupport": { - "description": "Proper name for Canvas Support. This will be used in the domainSearchHelpBody text and will be highlighted and clickable", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "domainSearchHelpBody": "アクセスしようとしている学校または学区の名前を検索してみてください (「Smith Private School」または「Smith County Schools」など)。「Smith.instructure.com」などの Canvas ドメインを直接入力することもできます。\n\n教育機関の Canvas アカウントの検索に関する詳細については、{canvasGuides}にアクセスする、{canvasSupport}に問い合わせる、または学校に問い合わせてサポートを受けることができます。", - "@domainSearchHelpBody": { - "description": "The body text shown in the help dialog on the domain search screen", - "type": "text", - "placeholders_order": [ - "canvasGuides", - "canvasSupport" - ], - "placeholders": { - "canvasGuides": {}, - "canvasSupport": {} - } - }, - "Uh oh!": "エラーです!", - "@Uh oh!": { - "description": "Title of the screen that shows when a crash has occurred", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "We’re not sure what happened, but it wasn’t good. Contact us if this keeps happening.": "何が起こったかはわかりませんが、問題が発生したようです。問題が解決されない場合は、Canvas までお問い合わせください。", - "@We’re not sure what happened, but it wasn’t good. Contact us if this keeps happening.": { - "description": "Message shown when a crash has occurred", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Contact Support": "サポートに問い合わせる", - "@Contact Support": { - "description": "Label for the button that allows users to contact support after a crash has occurred", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "View error details": "エラーの詳細を表示", - "@View error details": { - "description": "Label for the button that allowed users to view crash details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Restart app": "アプリを再起動", - "@Restart app": { - "description": "Label for the button that will restart the entire application", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Application version": "アプリケーションのバージョン", - "@Application version": { - "description": "Label for the application version displayed in the crash details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Device model": "デバイスモデル", - "@Device model": { - "description": "Label for the device model displayed in the crash details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Android OS version": "Android OS バージョン", - "@Android OS version": { - "description": "Label for the Android operating system version displayed in the crash details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Full error message": "完全なエラーメッセージ", - "@Full error message": { - "description": "Label for the full error message displayed in the crash details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Inbox": "受信トレイ", - "@Inbox": { - "description": "Title for the Inbox screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading your inbox messages.": "受信トレイメッセージのロード中にエラーが発生しました。", - "@There was an error loading your inbox messages.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Subject": "件名なし", - "@No Subject": { - "description": "Title used for inbox messages that have no subject", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unable to fetch courses. Please check your connection and try again.": "コースを取得できません。接続を確認して、もう一度お試しください。", - "@Unable to fetch courses. Please check your connection and try again.": { - "description": "Message shown when an error occured while loading courses", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Choose a course to message": "メッセージを送るコースを選択する", - "@Choose a course to message": { - "description": "Header in the course list shown when the user is choosing which course to associate with a new message", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Inbox Zero": "受信トレイゼロ", - "@Inbox Zero": { - "description": "Title of the message shown when there are no inbox messages", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You’re all caught up!": "コンテンツは以上です!", - "@You’re all caught up!": { - "description": "Subtitle of the message shown when there are no inbox messages", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading recipients for this course": "このコースの受信者のロード中にエラーが発生しました。", - "@There was an error loading recipients for this course": { - "description": "Message shown when attempting to create a new message but the recipients list failed to load", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unable to send message. Check your connection and try again.": "メッセージを送信できません。接続をチェックして、もう一度やり直してください。", - "@Unable to send message. Check your connection and try again.": { - "description": "Message show when there was an error creating or sending a new message", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unsaved changes": "変更が保存されていません", - "@Unsaved changes": { - "description": "Title of the dialog shown when the user tries to leave with unsaved changes", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Are you sure you wish to close this page? Your unsent message will be lost.": "このページを閉じてもよろしいですか?送信されていないメッセージは失われます。", - "@Are you sure you wish to close this page? Your unsent message will be lost.": { - "description": "Body text of the dialog shown when the user tries leave with unsaved changes", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "New message": "新規メッセージ", - "@New message": { - "description": "Title of the new-message screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Add attachment": "添付ファイルを追加する", - "@Add attachment": { - "description": "Tooltip for the add-attachment button in the new-message screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Send message": "メッセージを送信する", - "@Send message": { - "description": "Tooltip for the send-message button in the new-message screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Select recipients": "受信者を選択する", - "@Select recipients": { - "description": "Tooltip for the button that allows users to select message recipients", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No recipients selected": "受信者が選択されていません", - "@No recipients selected": { - "description": "Hint displayed when the user has not selected any message recipients", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Message subject": "メッセージの件名", - "@Message subject": { - "description": "Hint text displayed in the input field for the message subject", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Message": "メッセージ", - "@Message": { - "description": "Hint text displayed in the input field for the message body", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Recipients": "受信者", - "@Recipients": { - "description": "Label for message recipients", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "plusRecipientCount": "+{count}", - "@plusRecipientCount": { - "description": "Shows the number of recipients that are selected but not displayed on screen.", - "type": "text", - "placeholders_order": [ - "count" - ], - "placeholders": { - "count": { - "example": 5 - } - } - }, - "Failed. Tap for options.": "失敗しました。タップしてオプションを表示してください。", - "@Failed. Tap for options.": { - "description": "Short message shown on a message attachment when uploading has failed", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "courseForWhom": "{studentShortName}用", - "@courseForWhom": { - "description": "Describes for whom a course is for (i.e. for Bill)", - "type": "text", - "placeholders_order": [ - "studentShortName" - ], - "placeholders": { - "studentShortName": {} - } - }, - "messageLinkPostscript": "Re:{studentName}、{linkUrl}", - "@messageLinkPostscript": { - "description": "A postscript appended to new messages that clarifies which student is the subject of the message and also includes a URL for the related Canvas component (course, assignment, event, etc).", - "type": "text", - "placeholders_order": [ - "studentName", - "linkUrl" - ], - "placeholders": { - "studentName": {}, - "linkUrl": {} - } - }, - "There was an error loading this conversation": "この会話のロード中にエラーが発生しました", - "@There was an error loading this conversation": { - "description": "Message shown when a conversation fails to load", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Reply": "返信", - "@Reply": { - "description": "Button label for replying to a conversation", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Reply All": "全員に返信", - "@Reply All": { - "description": "Button label for replying to all conversation participants", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unknown User": "不明のユーザー", - "@Unknown User": { - "description": "Label used where the user name is not known", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "me": "私", - "@me": { - "description": "First-person pronoun (i.e. 'me') that will be used in message author info, e.g. 'Me to 4 others' or 'Jon Snow to me'", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "authorToRecipient": "{authorName}から{recipientName}", - "@authorToRecipient": { - "description": "Author info for a single-recipient message; includes both the author name and the recipient name.", - "type": "text", - "placeholders_order": [ - "authorName", - "recipientName" - ], - "placeholders": { - "authorName": {}, - "recipientName": {} - } - }, - "authorToNOthers": "{howMany,plural, =1{{authorName}から他 1 人}other{{authorName}から他 {howMany} 人}}", - "@authorToNOthers": { - "description": "Author info for a mutli-recipient message; includes the author name and the number of recipients", - "type": "text", - "placeholders_order": [ - "authorName", - "howMany" - ], - "placeholders": { - "authorName": {}, - "howMany": {} - } - }, - "authorToRecipientAndNOthers": "{howMany,plural, =1{{authorName}から{recipientName}と他 1 人}other{{authorName} から{recipientName}と他 {howMany} 人}}", - "@authorToRecipientAndNOthers": { - "description": "Author info for a multi-recipient message; includes the author name, one recipient name, and the number of other recipients", - "type": "text", - "placeholders_order": [ - "authorName", - "recipientName", - "howMany" - ], - "placeholders": { - "authorName": {}, - "recipientName": {}, - "howMany": {} - } - }, - "Download": "ダウンロード", - "@Download": { - "description": "Label for the button that will begin downloading a file", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Open with another app": "別のアプリで開く", - "@Open with another app": { - "description": "Label for the button that will allow users to open a file with another app", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There are no installed applications that can open this file": "このファイルを開くことができるアプリケーションがインストールされていません", - "@There are no installed applications that can open this file": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unsupported File": "サポートされないファイル", - "@Unsupported File": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "This file is unsupported and can’t be viewed through the app": "このファイルはサポートされておらず、アプリで表示できません", - "@This file is unsupported and can’t be viewed through the app": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unable to play this media file": "このメディアファイルを再生できません", - "@Unable to play this media file": { - "description": "Message shown when audio or video media could not be played", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unable to load this image": "このイメージをロードできません", - "@Unable to load this image": { - "description": "Message shown when an image file could not be loaded or displayed", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading this file": "このファイルのロード中にエラーが発生しました", - "@There was an error loading this file": { - "description": "Message shown when a file could not be loaded or displayed", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Courses": "コースはありません", - "@No Courses": { - "description": "Title for having no courses", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Your student’s courses might not be published yet.": "受講者のコースはまだ公開されていない可能性があります", - "@Your student’s courses might not be published yet.": { - "description": "Message for having no courses", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading your student’s courses.": "受講者のコースを読み込み中にエラーが発生しました。", - "@There was an error loading your student’s courses.": { - "description": "Message displayed when the list of student courses could not be loaded", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Grade": "評定はありません", - "@No Grade": { - "description": "Message shown when there is currently no grade available for a course", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Filter by": "フィルタ条件", - "@Filter by": { - "description": "Title for list of terms to filter grades by", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Grades": "評定", - "@Grades": { - "description": "Label for the \"Grades\" tab in course details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Syllabus": "シラバス", - "@Syllabus": { - "description": "Label for the \"Syllabus\" tab in course details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Front Page": "フロントページ", - "@Front Page": { - "description": "Label for the \"Front Page\" tab in course details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Summary": "概要", - "@Summary": { - "description": "Label for the \"Summary\" tab in course details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Send a message about this course": "このコースに関するメッセージを送信する", - "@Send a message about this course": { - "description": "Accessibility hint for the course messaage floating action button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Total Grade": "合計評定", - "@Total Grade": { - "description": "Label for the total grade in the course", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Graded": "採点済み", - "@Graded": { - "description": "Label for assignments that have been graded", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Submitted": "提出済み", - "@Submitted": { - "description": "Label for assignments that have been submitted", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Not Submitted": "未提出", - "@Not Submitted": { - "description": "Label for assignments that have not been submitted", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Late": "提出遅れ", - "@Late": { - "description": "Label for assignments that have been marked late or submitted late", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Missing": "提出なし", - "@Missing": { - "description": "Label for assignments that have been marked missing or are not submitted and past the due date", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "-": "-", - "@-": { - "description": "Value representing no score for student submission", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "All Grading Periods": "すべての採点期間", - "@All Grading Periods": { - "description": "Label for selecting all grading periods", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Assignments": "課題はありません", - "@No Assignments": { - "description": "Title for the no assignments message", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "It looks like assignments haven't been created in this space yet.": "このスペースでは、まだ課題が作成されていないようです。", - "@It looks like assignments haven't been created in this space yet.": { - "description": "Message for no assignments", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading the summary details for this course.": "このコースのサマリー詳細のロード中にエラーが発生しました。", - "@There was an error loading the summary details for this course.": { - "description": "Message shown when the course summary could not be loaded", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Summary": "サマリーはありません", - "@No Summary": { - "description": "Title displayed when there are no items in the course summary", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "This course does not have any assignments or calendar events yet.": "このコースには、まだ課題またはカレンダーイベントがありません。", - "@This course does not have any assignments or calendar events yet.": { - "description": "Message displayed when there are no items in the course summary", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "gradeFormatScoreOutOfPointsPossible": "{score} / {pointsPossible}", - "@gradeFormatScoreOutOfPointsPossible": { - "description": "Formatted string for a student score out of the points possible", - "type": "text", - "placeholders_order": [ - "score", - "pointsPossible" - ], - "placeholders": { - "score": {}, - "pointsPossible": {} - } - }, - "contentDescriptionScoreOutOfPointsPossible": "{pointsPossible} 点中 {score} 点", - "@contentDescriptionScoreOutOfPointsPossible": { - "description": "Formatted string for a student score out of the points possible", - "type": "text", - "placeholders_order": [ - "score", - "pointsPossible" - ], - "placeholders": { - "score": {}, - "pointsPossible": {} - } - }, - "gradesSubjectMessage": "Re:{studentName}、評定", - "@gradesSubjectMessage": { - "description": "The subject line for a message to a teacher regarding a student's grades", - "type": "text", - "placeholders_order": [ - "studentName" - ], - "placeholders": { - "studentName": {} - } - }, - "syllabusSubjectMessage": "Re:{studentName}、シラバス", - "@syllabusSubjectMessage": { - "description": "The subject line for a message to a teacher regarding a course syllabus", - "type": "text", - "placeholders_order": [ - "studentName" - ], - "placeholders": { - "studentName": {} - } - }, - "frontPageSubjectMessage": "Re:{studentName}、フロントページ", - "@frontPageSubjectMessage": { - "description": "The subject line for a message to a teacher regarding a course front page", - "type": "text", - "placeholders_order": [ - "studentName" - ], - "placeholders": { - "studentName": {} - } - }, - "assignmentSubjectMessage": "Re:{studentName}、課題 - {assignmentName}", - "@assignmentSubjectMessage": { - "description": "The subject line for a message to a teacher regarding a student's assignment", - "type": "text", - "placeholders_order": [ - "studentName", - "assignmentName" - ], - "placeholders": { - "studentName": {}, - "assignmentName": {} - } - }, - "eventSubjectMessage": "Re:{studentName}、イベント - {eventTitle}", - "@eventSubjectMessage": { - "description": "The subject line for a message to a teacher regarding a calendar event", - "type": "text", - "placeholders_order": [ - "studentName", - "eventTitle" - ], - "placeholders": { - "studentName": {}, - "eventTitle": {} - } - }, - "There is no page information available.": "利用できるページ情報はありません。", - "@There is no page information available.": { - "description": "Description for when no page information is available", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Assignment Details": "課題の詳細", - "@Assignment Details": { - "description": "Title for the page that shows details for an assignment", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "assignmentTotalPoints": "{points} 点", - "@assignmentTotalPoints": { - "description": "Label used for the total points the assignment is worth", - "type": "text", - "placeholders_order": [ - "points" - ], - "placeholders": { - "points": {} - } - }, - "assignmentTotalPointsAccessible": "{points} 点", - "@assignmentTotalPointsAccessible": { - "description": "Screen reader label used for the total points the assignment is worth", - "type": "text", - "placeholders_order": [ - "points" - ], - "placeholders": { - "points": {} - } - }, - "Due": "期限", - "@Due": { - "description": "Label for an assignment due date", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Grade": "評定", - "@Grade": { - "description": "Label for the section that displays an assignment's grade", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Locked": "ロックされています", - "@Locked": { - "description": "Label for when an assignment is locked", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "assignmentLockedModule": "この課題はモジュール \"{moduleName}\" によってロックされています。", - "@assignmentLockedModule": { - "description": "The locked description when an assignment is locked by a module", - "type": "text", - "placeholders_order": [ - "moduleName" - ], - "placeholders": { - "moduleName": {} - } - }, - "Remind Me": "リマインドする", - "@Remind Me": { - "description": "Label for the row to set reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Set a date and time to be notified of this specific assignment.": "この特定の課題について通知を受ける日付と時間を設定します。", - "@Set a date and time to be notified of this specific assignment.": { - "description": "Description for row to set reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You will be notified about this assignment on…": "…にこの課題に関する通知を受けます。", - "@You will be notified about this assignment on…": { - "description": "Description for when a reminder is set", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Instructions": "指示", - "@Instructions": { - "description": "Label for the description of the assignment when it has quiz instructions", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Send a message about this assignment": "この課題についてメッセージを送信する", - "@Send a message about this assignment": { - "description": "Accessibility hint for the assignment messaage floating action button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "This app is not authorized for use.": "このアプリは使用を許可されていません。", - "@This app is not authorized for use.": { - "description": "The error shown when the app being used is not verified by Canvas", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The server you entered is not authorized for this app.": "入力されたサーバーは、このアプリ用に許可されていません。", - "@The server you entered is not authorized for this app.": { - "description": "The error shown when the desired login domain is not verified by Canvas", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The user agent for this app is not authorized.": "このアプリのユーザーエージェントは許可されていません。", - "@The user agent for this app is not authorized.": { - "description": "The error shown when the user agent during verification is not verified by Canvas", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "We were unable to verify the server for use with this app.": "このアプリで使用するサーバーを検証できませんでした。", - "@We were unable to verify the server for use with this app.": { - "description": "The generic error shown when we are unable to verify with Canvas", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Reminders": "リマインダ", - "@Reminders": { - "description": "Name of the system notification channel for assignment and event reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Notifications for reminders about assignments and calendar events": "課題とカレンダーイベントに関するリマインダの通知", - "@Notifications for reminders about assignments and calendar events": { - "description": "Description of the system notification channel for assignment and event reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Reminders have changed!": "リマインダが変更されました!", - "@Reminders have changed!": { - "description": "Title of the dialog shown when the user needs to update their reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "In order to provide you with a better experience, we have updated how reminders work. You can add new reminders by viewing an assignment or calendar event and tapping the switch under the \"Remind Me\" section.\n\nBe aware that any reminders created with older versions of this app will not be compatible with the new changes and you will need to create them again.": "より良いエクスペリエンスを提供できるように、リマインダの機能を更新しました。新しいリマインダを追加するには、課題またはカレンダーの予定を表示し、[リマインダ]セクションのスイッチをタップします。\n\nこのアプリの古いバージョンで作成されたリマインダは、新しい変更と互換性がなく、再度作成する必要があるので注意してください。", - "@In order to provide you with a better experience, we have updated how reminders work. You can add new reminders by viewing an assignment or calendar event and tapping the switch under the \"Remind Me\" section.\n\nBe aware that any reminders created with older versions of this app will not be compatible with the new changes and you will need to create them again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Not a parent?": "親ではありませんか?", - "@Not a parent?": { - "description": "Title for the screen that shows when the user is not observing any students", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "We couldn't find any students associated with this account": "このアカウントに関連付けられている受講者を見つけることができませんでした", - "@We couldn't find any students associated with this account": { - "description": "Subtitle for the screen that shows when the user is not observing any students", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Are you a student or teacher?": "受講者と教員のどちらですか?", - "@Are you a student or teacher?": { - "description": "Label for button that will show users the option to view other Canvas apps in the Play Store", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "One of our other apps might be a better fit. Tap one to visit the Play Store.": "他のアプリのいずれかが、より適切かもしれません。ひとつをタップして Play Store にアクセスしてください。", - "@One of our other apps might be a better fit. Tap one to visit the Play Store.": { - "description": "Description of options to view other Canvas apps in the Play Store", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Return to Login": "ログインに戻る", - "@Return to Login": { - "description": "Label for the button that returns the user to the login screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "STUDENT": "受講者", - "@STUDENT": { - "description": "The \"student\" portion of the \"Canvas Student\" app name, in all caps. \"Canvas\" is excluded in this context as it will be displayed to the user as a wordmark image", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "TEACHER": "教員", - "@TEACHER": { - "description": "The \"teacher\" portion of the \"Canvas Teacher\" app name, in all caps. \"Canvas\" is excluded in this context as it will be displayed to the user as a wordmark image", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Canvas Student": "Canvas 受講者", - "@Canvas Student": { - "description": "The name of the Canvas Student app. Only \"Student\" should be translated as \"Canvas\" is a brand name in this context and should not be translated.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Canvas Teacher": "Canvas 教員", - "@Canvas Teacher": { - "description": "The name of the Canvas Teacher app. Only \"Teacher\" should be translated as \"Canvas\" is a brand name in this context and should not be translated.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Alerts": "アラートはありません", - "@No Alerts": { - "description": "The title for the empty message to show to users when there are no alerts for the student.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There’s nothing to be notified of yet.": "通知する事柄はまだ何もありません。", - "@There’s nothing to be notified of yet.": { - "description": "The empty message to show to users when there are no alerts for the student.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "dismissAlertLabel": "{alertTitle}を却下する", - "@dismissAlertLabel": { - "description": "Accessibility label to dismiss an alert", - "type": "text", - "placeholders_order": [ - "alertTitle" - ], - "placeholders": { - "alertTitle": {} - } - }, - "Course Announcement": "コースのお知らせ", - "@Course Announcement": { - "description": "Title for alerts when there is a course announcement", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Institution Announcement": "学校のお知らせ", - "@Institution Announcement": { - "description": "Title for alerts when there is an institution announcement", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "assignmentGradeAboveThreshold": "{threshold} 点を超える課題評定", - "@assignmentGradeAboveThreshold": { - "description": "Title for alerts when an assignment grade is above the threshold value", - "type": "text", - "placeholders_order": [ - "threshold" - ], - "placeholders": { - "threshold": {} - } - }, - "assignmentGradeBelowThreshold": "{threshold} 点未満の課題評定", - "@assignmentGradeBelowThreshold": { - "description": "Title for alerts when an assignment grade is below the threshold value", - "type": "text", - "placeholders_order": [ - "threshold" - ], - "placeholders": { - "threshold": {} - } - }, - "courseGradeAboveThreshold": "{threshold} 点を超えるコース評定", - "@courseGradeAboveThreshold": { - "description": "Title for alerts when a course grade is above the threshold value", - "type": "text", - "placeholders_order": [ - "threshold" - ], - "placeholders": { - "threshold": {} - } - }, - "courseGradeBelowThreshold": "{threshold} 点未満のコース評定", - "@courseGradeBelowThreshold": { - "description": "Title for alerts when a course grade is below the threshold value", - "type": "text", - "placeholders_order": [ - "threshold" - ], - "placeholders": { - "threshold": {} - } - }, - "Settings": "設定", - "@Settings": { - "description": "Title for the settings screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Theme": "テーマ", - "@Theme": { - "description": "Label for the light/dark theme section in the settings page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Dark Mode": "ダークモード", - "@Dark Mode": { - "description": "Label for the button that enables dark mode", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Light Mode": "ライトモード", - "@Light Mode": { - "description": "Label for the button that enables light mode", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "High Contrast Mode": "高コントラストモード", - "@High Contrast Mode": { - "description": "Label for the switch that toggles high contrast mode", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Use Dark Theme in Web Content": "ウェブコンテンツでダークテーマを使用する", - "@Use Dark Theme in Web Content": { - "description": "Label for the switch that toggles dark mode for webviews", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Appearance": "外観", - "@Appearance": { - "description": "Label for the appearance section in the settings page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Successfully submitted!": "正常に提出されました!", - "@Successfully submitted!": { - "description": "Title displayed in the grade cell for an assignment that has been submitted", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "submissionStatusSuccessSubtitle": "この課題は {date} の {time} に提出され、採点中です", - "@submissionStatusSuccessSubtitle": { - "description": "Subtitle displayed in the grade cell for an assignment that has been submitted and is awaiting a grade", - "type": "text", - "placeholders_order": [ - "date", - "time" - ], - "placeholders": { - "date": {}, - "time": {} - } - }, - "outOfPoints": "{howMany,plural, =1{1 ポイントから}other{{points} ポイントから}}", - "@outOfPoints": { - "description": "Description for an assignment grade that has points without a current scoroe", - "type": "text", - "placeholders_order": [ - "points", - "howMany" - ], - "placeholders": { - "points": {}, - "howMany": {} - } - }, - "Excused": "免除", - "@Excused": { - "description": "Grading status for an assignment marked as excused", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Complete": "完了", - "@Complete": { - "description": "Grading status for an assignment marked as complete", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Incomplete": "未完了", - "@Incomplete": { - "description": "Grading status for an assignment marked as incomplete", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "minus": "マイナス", - "@minus": { - "description": "Screen reader-friendly replacement for the \"-\" character in letter grades like \"A-\"", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "latePenalty": "提出遅れペナルティ (-{pointsLost})", - "@latePenalty": { - "description": "Text displayed when a late penalty has been applied to the assignment", - "type": "text", - "placeholders_order": [ - "pointsLost" - ], - "placeholders": { - "pointsLost": {} - } - }, - "finalGrade": "最終評定:{grade}", - "@finalGrade": { - "description": "Text that displays the final grade of an assignment", - "type": "text", - "placeholders_order": [ - "grade" - ], - "placeholders": { - "grade": {} - } - }, - "Alert Settings": "アラート設定", - "@Alert Settings": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Alert me when…": "次の場合にアラートを送信…", - "@Alert me when…": { - "description": "Header for the screen where the observer chooses the thresholds that will determine when they receive alerts (e.g. when an assignment is graded below 70%)", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Course grade below": "を超えるコース評定", - "@Course grade below": { - "description": "Label describing the threshold for when the course grade is below a certain percentage", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Course grade above": "未満のコース評定", - "@Course grade above": { - "description": "Label describing the threshold for when the course grade is above a certain percentage", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Assignment missing": "課題がありません", - "@Assignment missing": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Assignment grade below": "を超える課題評定", - "@Assignment grade below": { - "description": "Label describing the threshold for when an assignment is graded below a certain percentage", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Assignment grade above": "未満の課題評定", - "@Assignment grade above": { - "description": "Label describing the threshold for when an assignment is graded above a certain percentage", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Course Announcements": "コースのお知らせ", - "@Course Announcements": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Institution Announcements": "学校のお知らせ", - "@Institution Announcements": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Never": "今後実行しない", - "@Never": { - "description": "Indication that tells the user they will not receive alert notifications of a specific kind", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Grade percentage": "評定パーセンテージ", - "@Grade percentage": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading your student's alerts.": "受講者のアラートのロード中にエラーが発生しました", - "@There was an error loading your student's alerts.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Must be below 100": "100 未満にする必要があります", - "@Must be below 100": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "mustBeBelowN": "{percentage} 未満にする必要があります", - "@mustBeBelowN": { - "description": "Validation error to the user that they must choose a percentage below 'n'", - "type": "text", - "placeholders_order": [ - "percentage" - ], - "placeholders": { - "percentage": { - "example": 5 - } - } - }, - "mustBeAboveN": "{percentage} を超える必要があります", - "@mustBeAboveN": { - "description": "Validation error to the user that they must choose a percentage above 'n'", - "type": "text", - "placeholders_order": [ - "percentage" - ], - "placeholders": { - "percentage": { - "example": 5 - } - } - }, - "Select Student Color": "受講者の色を選択する", - "@Select Student Color": { - "description": "Title for screen that allows users to assign a color to a specific student", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Electric, blue": "エレクトリック、ブルー", - "@Electric, blue": { - "description": "Name of the Electric (blue) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Plum, Purple": "プラム、パープル", - "@Plum, Purple": { - "description": "Name of the Plum (purple) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Barney, Fuschia": "バーニー、フューシャ", - "@Barney, Fuschia": { - "description": "Name of the Barney (fuschia) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Raspberry, Red": "ラズベリー、レッド", - "@Raspberry, Red": { - "description": "Name of the Raspberry (red) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Fire, Orange": "ファイアー、オレンジ", - "@Fire, Orange": { - "description": "Name of the Fire (orange) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Shamrock, Green": "シャムロック、グリーン", - "@Shamrock, Green": { - "description": "Name of the Shamrock (green) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "An error occurred while saving your selection. Please try again.": "選択の保存中にエラーが発生しました。再度試してください。", - "@An error occurred while saving your selection. Please try again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "changeStudentColorLabel": "{studentName}の色を変更する", - "@changeStudentColorLabel": { - "description": "Accessibility label for the button that lets users change the color associated with a specific student", - "type": "text", - "placeholders_order": [ - "studentName" - ], - "placeholders": { - "studentName": {} - } - }, - "Teacher": "教員", - "@Teacher": { - "description": "Label for the Teacher enrollment type", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Student": "受講者", - "@Student": { - "description": "Label for the Student enrollment type", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "TA": "TA", - "@TA": { - "description": "Label for the Teaching Assistant enrollment type (also known as Teacher Aid or Education Assistant), reduced to a short acronym/initialism if appropriate.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Observer": "オブザーバー", - "@Observer": { - "description": "Label for the Observer enrollment type", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Use Camera": "カメラを使用する", - "@Use Camera": { - "description": "Label for the action item that lets the user capture a photo using the device camera", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Upload File": "ファイルをアップロードする", - "@Upload File": { - "description": "Label for the action item that lets the user upload a file from their device", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Choose from Gallery": "ギャラリーから選択する", - "@Choose from Gallery": { - "description": "Label for the action item that lets the user select a photo from their device gallery", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Preparing…": "準備しています…", - "@Preparing…": { - "description": "Message shown while a file is being prepared to attach to a message", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Add student with…": "次を使って受講者を追加します…", - "@Add student with…": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Add Student": "受講者を追加", - "@Add Student": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You are not observing any students.": "どの受講者もオブザーブしていません。", - "@You are not observing any students.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading your students.": "受講者のロード中にエラーが発生しました。", - "@There was an error loading your students.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Pairing Code": "ペアリングコード", - "@Pairing Code": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Students can obtain a pairing code through the Canvas website": "受講者はCanvas Webサイトからペアリングコードを取得できます", - "@Students can obtain a pairing code through the Canvas website": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Enter the student pairing code provided to you. If the pairing code doesn't work, it may have expired": "提供されている受講者ペアリングコードを入力してください。ペアリングコードが機能しない場合は、有効期限が切れているかもしれません", - "@Enter the student pairing code provided to you. If the pairing code doesn't work, it may have expired": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Your code is incorrect or expired.": "コードが間違っているか、期限が切れています。", - "@Your code is incorrect or expired.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Something went wrong trying to create your account, please reach out to your school for assistance.": "アカウントを作成しようとしたときに問題が発生しました。学校に連絡して支援を求めてください。", - "@Something went wrong trying to create your account, please reach out to your school for assistance.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "QR Code": "QR コード", - "@QR Code": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Students can create a QR code using the Canvas Student app on their mobile device": "受講者はモバイルデバイスのCanvas Studentアプリを使用してQRコードを作成できます", - "@Students can create a QR code using the Canvas Student app on their mobile device": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Add new student": "新しい受講者を追加する", - "@Add new student": { - "description": "Semantics label for the FAB on the Manage Students Screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Select": "選択", - "@Select": { - "description": "Hint text to tell the user to choose one of two options", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I have a Canvas account": "Canvasアカウントを持っています", - "@I have a Canvas account": { - "description": "Option to select for users that have a canvas account", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I don't have a Canvas account": "Canvasアカウントを持っていません", - "@I don't have a Canvas account": { - "description": "Option to select for users that don't have a canvas account", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Create Account": "アカウントを作成する", - "@Create Account": { - "description": "Button text for account creation confirmation", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Full Name": "フルネーム", - "@Full Name": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Email Address": "E メールアドレス", - "@Email Address": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Password": "パスワード", - "@Password": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Full Name…": "フルネーム...", - "@Full Name…": { - "description": "hint label for inside form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Email…": "メールアドレス...", - "@Email…": { - "description": "hint label for inside form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Password…": "パスワード...", - "@Password…": { - "description": "hint label for inside form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Please enter full name": "姓名を入力してください", - "@Please enter full name": { - "description": "Error message for form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Please enter an email address": "メールアドレスを入力してください", - "@Please enter an email address": { - "description": "Error message for form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Please enter a valid email address": "有効なメールアドレスを記入してください", - "@Please enter a valid email address": { - "description": "Error message for form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Password is required": "パスワードは必須です", - "@Password is required": { - "description": "Error message for form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Password must contain at least 8 characters": "パスワードは最低8文字なければなりません", - "@Password must contain at least 8 characters": { - "description": "Error message for form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "qrCreateAccountTos": "[アカウントを作成]をタップすると、{termsOfService}に同意し、{privacyPolicy}を受け入れたことになります", - "@qrCreateAccountTos": { - "description": "The text show on the account creation screen", - "type": "text", - "placeholders_order": [ - "termsOfService", - "privacyPolicy" - ], - "placeholders": { - "termsOfService": {}, - "privacyPolicy": {} - } - }, - "Terms of Service": "サービス利用規約", - "@Terms of Service": { - "description": "Label for the Canvas Terms of Service agreement. This will be used in the qrCreateAccountTos text and will be highlighted and clickable", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Privacy Policy": "個人情報保護方針", - "@Privacy Policy": { - "description": "Label for the Canvas Privacy Policy agreement. This will be used in the qrCreateAccountTos text and will be highlighted and clickable", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "View the Privacy Policy": "プライバシーポリシーを表示する", - "@View the Privacy Policy": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Already have an account? ": "アカウントをすでにお持ちですか? ", - "@Already have an account? ": { - "description": "Part of multiline text span, includes AccountSignIn1-2, in that order", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Sign In": "サインイン", - "@Sign In": { - "description": "Part of multiline text span, includes AccountSignIn1-2, in that order", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Hide Password": "パスワードを非表示にする", - "@Hide Password": { - "description": "content description for password hide button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Show Password": "パスワードを表示する", - "@Show Password": { - "description": "content description for password show button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Terms of Service Link": "サービス利用規約リンク", - "@Terms of Service Link": { - "description": "content description for terms of service link", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Privacy Policy Link": "個人情報保護方針リンク", - "@Privacy Policy Link": { - "description": "content description for privacy policy link", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Event": "イベント", - "@Event": { - "description": "Title for the event details screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Date": "日付", - "@Date": { - "description": "Label for the event date", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Location": "場所", - "@Location": { - "description": "Label for the location information", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Location Specified": "場所が指定されていません", - "@No Location Specified": { - "description": "Description for events that do not have a location", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "eventTime": "{startAt} ~ {endAt}", - "@eventTime": { - "description": "The time the event is happening, example: \"2:00 pm - 4:00 pm\"", - "type": "text", - "placeholders_order": [ - "startAt", - "endAt" - ], - "placeholders": { - "startAt": {}, - "endAt": {} - } - }, - "Set a date and time to be notified of this event.": "このイベントの通知を受ける日付と時間を設定します。", - "@Set a date and time to be notified of this event.": { - "description": "Description for row to set event reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You will be notified about this event on…": "次の予定でこのイベントに関する通知を受けます…", - "@You will be notified about this event on…": { - "description": "Description for when an event reminder is set", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Share Your Love for the App": "アプリへの愛を共有しましょう", - "@Share Your Love for the App": { - "description": "Label for option to open the app store", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Tell us about your favorite parts of the app": "このアプリの好きな部分を教えてください", - "@Tell us about your favorite parts of the app": { - "description": "Description for option to open the app store", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Legal": "法令", - "@Legal": { - "description": "Label for legal information option", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Privacy policy, terms of use, open source": "プライバシーポリシー、利用規約、オープンソース", - "@Privacy policy, terms of use, open source": { - "description": "Description for legal information option", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Idea for Canvas Parent App [Android]": "Canvas Parent アプリ [Android] へのアイデア", - "@Idea for Canvas Parent App [Android]": { - "description": "The subject for the email to request a feature", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The following information will help us better understand your idea:": "次の情報は、Canvas があなたのアイデアをより良く理解するために役立ちます:", - "@The following information will help us better understand your idea:": { - "description": "The header for the users information that is attached to a feature request", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Domain:": "ドメイン:", - "@Domain:": { - "description": "The label for the Canvas domain of the logged in user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "User ID:": "ユーザ ID:", - "@User ID:": { - "description": "The label for the Canvas user ID of the logged in user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Email:": "E メール:", - "@Email:": { - "description": "The label for the eamil of the logged in user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Locale:": "ロケール:", - "@Locale:": { - "description": "The label for the locale of the logged in user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Terms of Use": "利用規約", - "@Terms of Use": { - "description": "Label for the terms of use", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Canvas on GitHub": "GitHub 上のキャンバス", - "@Canvas on GitHub": { - "description": "Label for the button that opens the Canvas project on GitHub's website", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was a problem loading the Terms of Use": "利用規約のロード中に問題が発生しました", - "@There was a problem loading the Terms of Use": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Device": "デバイス", - "@Device": { - "description": "Label used for device manufacturer/model in the error report", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "OS Version": "OS バージョン", - "@OS Version": { - "description": "Label used for device operating system version in the error report", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Version Number": "バージョン番号", - "@Version Number": { - "description": "Label used for the app version number in the error report", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Report A Problem": "問題を報告する", - "@Report A Problem": { - "description": "Title used for generic dialog to report problems", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Subject": "件名", - "@Subject": { - "description": "Label used for Subject text field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "A subject is required.": "件名は必須です。", - "@A subject is required.": { - "description": "Error shown when the subject field is empty", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "An email address is required.": "E メールアドレスは必須です。", - "@An email address is required.": { - "description": "Error shown when the email field is empty", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Description": "説明", - "@Description": { - "description": "Label used for Description text field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "A description is required.": "説明は必須です。", - "@A description is required.": { - "description": "Error shown when the description field is empty", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "How is this affecting you?": "これはあなたにどのような影響を与えていますか?", - "@How is this affecting you?": { - "description": "Label used for the dropdown to select how severe the issue is", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "send": "送信", - "@send": { - "description": "Label used for send button when reporting a problem", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Just a casual question, comment, idea, suggestion…": "ちょっとした疑問、コメント、アイデア、提案です…", - "@Just a casual question, comment, idea, suggestion…": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I need some help but it's not urgent.": "急ぎではありませんが、サポートが必要です。", - "@I need some help but it's not urgent.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Something's broken but I can work around it to get what I need done.": "何かが機能していないのですが、必要なことはそれを使わずに実行できます。", - "@Something's broken but I can work around it to get what I need done.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I can't get things done until I hear back from you.": "返事がくるまで何もできません。", - "@I can't get things done until I hear back from you.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "EXTREME CRITICAL EMERGENCY!!": "緊急事態です!", - "@EXTREME CRITICAL EMERGENCY!!": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Not Graded": "未採点", - "@Not Graded": { - "description": "Description for an assignment has not been graded.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Login flow: Normal": "ログインフロー:標準", - "@Login flow: Normal": { - "description": "Description for the normal login flow", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Login flow: Canvas": "ログインフロー:Canvas", - "@Login flow: Canvas": { - "description": "Description for the Canvas login flow", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Login flow: Site Admin": "ログインフロー:サイト管理者", - "@Login flow: Site Admin": { - "description": "Description for the Site Admin login flow", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Login flow: Skip mobile verify": "ログインフロー:モバイル検証を省略する", - "@Login flow: Skip mobile verify": { - "description": "Description for the login flow that skips domain verification for mobile", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Act As User": "ユーザーとして機能する", - "@Act As User": { - "description": "Label for the button that allows the user to act (masquerade) as another user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Stop Acting as User": "ユーザーとしての機能を停止する", - "@Stop Acting as User": { - "description": "Label for the button that allows the user to stop acting (masquerading) as another user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "actingAsUser": "あなたは{userName}として機能しています", - "@actingAsUser": { - "description": "Message shown while acting (masquerading) as another user", - "type": "text", - "placeholders_order": [ - "userName" - ], - "placeholders": { - "userName": {} - } - }, - "\"Act as\" is essentially logging in as this user without a password. You will be able to take any action as if you were this user, and from other users' points of views, it will be as if this user performed them. However, audit logs record that you were the one who performed the actions on behalf of this user.": "\"機能する\"とは、基本的にパスワードなしでこのユーザーとしてログインすることです。このユーザーであるかのようにアクションを実行することができ、他のユーザーからは、このユーザーがそれらを実行したように見えますが、監査ログには、あなたがこのユーザーの代わりにアクションを実行したことが記録されます。", - "@\"Act as\" is essentially logging in as this user without a password. You will be able to take any action as if you were this user, and from other users' points of views, it will be as if this user performed them. However, audit logs record that you were the one who performed the actions on behalf of this user.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Domain": "ドメイン", - "@Domain": { - "description": "Text field hint for domain url input", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You must enter a valid domain": "有効なドメインを入力する必要があります", - "@You must enter a valid domain": { - "description": "Message displayed for domain input error", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "User ID": "ユーザ ID", - "@User ID": { - "description": "Text field hint for user ID input", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You must enter a user id": "ユーザー ID を入力する必要があります", - "@You must enter a user id": { - "description": "Message displayed for user Id input error", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error trying to act as this user. Please check the Domain and User ID and try again.": "このユーザーとして機能しようとしてエラーが発生しました。ドメインとユーザー ID をチェックしてから、再試行してください。", - "@There was an error trying to act as this user. Please check the Domain and User ID and try again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "endMasqueradeMessage": "{userName}として機能することを停止して、元のアカウントに戻ります。", - "@endMasqueradeMessage": { - "description": "Confirmation message displayed when the user wants to stop acting (masquerading) as another user", - "type": "text", - "placeholders_order": [ - "userName" - ], - "placeholders": { - "userName": {} - } - }, - "endMasqueradeLogoutMessage": "{userName}として機能することを停止して、ログアウトされます。", - "@endMasqueradeLogoutMessage": { - "description": "Confirmation message displayed when the user wants to stop acting (masquerading) as another user and will be logged out.", - "type": "text", - "placeholders_order": [ - "userName" - ], - "placeholders": { - "userName": {} - } - }, - "How are we doing?": "私たちはどうですか?", - "@How are we doing?": { - "description": "Title for dialog asking user to rate the app out of 5 stars.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Don't show again": "これ以上表示しないでください", - "@Don't show again": { - "description": "Button to prevent the rating dialog from showing again.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "What can we do better?": "改善する余地はどこにあるでしょう?", - "@What can we do better?": { - "description": "Hint text for providing a comment with the rating.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Send Feedback": "フィードバックを送信する", - "@Send Feedback": { - "description": "Button to send rating with feedback", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "ratingDialogEmailSubject": "Android への提案 - Canvas Parent {version}", - "@ratingDialogEmailSubject": { - "description": "The subject for an email to provide feedback for CanvasParent.", - "type": "text", - "placeholders_order": [ - "version" - ], - "placeholders": { - "version": {} - } - }, - "starRating": "{position,plural, =1{{position} 星}other{{position}星}}", - "@starRating": { - "description": "Accessibility label for the 1 stars to 5 stars rating", - "type": "text", - "placeholders_order": [ - "position" - ], - "placeholders": { - "position": { - "example": 1 - } - } - }, - "Student Pairing": "受講者のペアリング", - "@Student Pairing": { - "description": "Title for the screen where users can pair to students using a QR code", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Open Canvas Student": "Open Canvas受講者", - "@Open Canvas Student": { - "description": "Title for QR pairing tutorial screen instructing users to open the Canvas Student app", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You'll need to open your student's Canvas Student app to continue. Go into Main Menu > Settings > Pair with Observer and scan the QR code you see there.": "続行するには、受講者のCanvas Studentアプリを開く必要があります。メインメニュー > [設定] > [オブザーバーとのペアリング]に移動し、そこに表示されるQRコードをスキャンしてください。", - "@You'll need to open your student's Canvas Student app to continue. Go into Main Menu > Settings > Pair with Observer and scan the QR code you see there.": { - "description": "Message explaining how QR code pairing works", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Screenshot showing location of pairing QR code generation in the Canvas Student app": "Canvas StudentアプリでのQRコード生成のペアリングの場所を示すスクリーンショット", - "@Screenshot showing location of pairing QR code generation in the Canvas Student app": { - "description": "Content Description for qr pairing tutorial screenshot", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Expired QR Code": "期限切れのQRコード", - "@Expired QR Code": { - "description": "Error title shown when the users scans a QR code that has expired", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The QR code you scanned may have expired. Refresh the code on the student's device and try again.": "スキャンしたQRコードの有効期限が切れている可能性があります。受講者のデバイスでコードを更新して、もう一度やり直してください。", - "@The QR code you scanned may have expired. Refresh the code on the student's device and try again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "A network error occurred when adding this student. Check your connection and try again.": "この受講者を追加中にネットワークエラーが発生しました。接続をチェックして、もう一度やり直してください。", - "@A network error occurred when adding this student. Check your connection and try again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Invalid QR Code": "無効なQRコード", - "@Invalid QR Code": { - "description": "Error title shown when the user scans an invalid QR code", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Incorrect Domain": "不正なドメイン", - "@Incorrect Domain": { - "description": "Error title shown when the users scane a QR code for a student that belongs to a different domain", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The student you are trying to add belongs to a different school. Log in or create an account with that school to scan this code.": "追加しようとしている受講者は、別の学校に所属しています。このコードをスキャンするには、その学校にログインするかアカウントを作成してください。", - "@The student you are trying to add belongs to a different school. Log in or create an account with that school to scan this code.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Camera Permission": "カメラ許可", - "@Camera Permission": { - "description": "Error title shown when the user wans to scan a QR code but has denied the camera permission", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "This will unpair and remove all enrollments for this student from your account.": "これにより、この受講者の登録がすべて解除され、アカウントから削除されます。", - "@This will unpair and remove all enrollments for this student from your account.": { - "description": "Confirmation message shown when the user tries to delete a student from their account", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was a problem removing this student from your account. Please check your connection and try again.": "この受講者をアカウントから削除する際に問題が発生しました。接続を確認して、もう一度お試しください。", - "@There was a problem removing this student from your account. Please check your connection and try again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Cancel": "キャンセル", - "@Cancel": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "next": "次へ", - "@next": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "ok": "OK", - "@ok": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Yes": "はい", - "@Yes": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No": "いいえ", - "@No": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Retry": "再試行", - "@Retry": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Delete": "削除", - "@Delete": { - "description": "Label used for general delete/remove actions", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Done": "終了", - "@Done": { - "description": "Label for general done/finished actions", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Refresh": "更新", - "@Refresh": { - "description": "Label for button to refresh data from the web", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "View Description": "説明を表示", - "@View Description": { - "description": "Button to view the description for an event or assignment", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "expanded": "拡大", - "@expanded": { - "description": "Description for the accessibility reader for list groups that are expanded", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "collapsed": "折りたたみ", - "@collapsed": { - "description": "Description for the accessibility reader for list groups that are expanded", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "An unexpected error occurred": "予期しないエラーが発生しました", - "@An unexpected error occurred": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No description": "説明なし", - "@No description": { - "description": "Message used when the assignment has no description", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Launch External Tool": "外部ツールを起動する", - "@Launch External Tool": { - "description": "Button text added to webviews to let users open external tools in their browser", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Interactions on this page are limited by your institution.": "このページでのやり取りは、学校によって制限されています。", - "@Interactions on this page are limited by your institution.": { - "description": "Message describing how the webview has limited access due to an instution setting", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "dateAtTime": "{date}、{time}", - "@dateAtTime": { - "description": "The string to format dates", - "type": "text", - "placeholders_order": [ - "date", - "time" - ], - "placeholders": { - "date": {}, - "time": {} - } - }, - "dueDateAtTime": "{date}、{time} 期限", - "@dueDateAtTime": { - "description": "The string to format due dates", - "type": "text", - "placeholders_order": [ - "date", - "time" - ], - "placeholders": { - "date": {}, - "time": {} - } - }, - "No Due Date": "締切日なし", - "@No Due Date": { - "description": "Label for assignments that do not have a due date", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Filter": "フィルタ", - "@Filter": { - "description": "Label for buttons to filter what items are visible", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "unread": "未読", - "@unread": { - "description": "Label for things that are marked as unread", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "unreadCount": "未読 {count} 件", - "@unreadCount": { - "description": "Formatted string for when there are a number of unread items", - "type": "text", - "placeholders_order": [ - "count" - ], - "placeholders": { - "count": {} - } - }, - "badgeNumberPlus": "{count}+", - "@badgeNumberPlus": { - "description": "Formatted string for when too many items are being notified in a badge, generally something like: 99+", - "type": "text", - "placeholders_order": [ - "count" - ], - "placeholders": { - "count": {} - } - }, - "There was an error loading this announcement": "このお知らせのロード中にエラーが発生しました", - "@There was an error loading this announcement": { - "description": "Message shown when an announcement detail screen fails to load", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Network error": "ネットワークエラー", - "@Network error": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Under Construction": "工事中", - "@Under Construction": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "We are currently building this feature for your viewing pleasure.": "現在、皆さんにお楽しみいただく機能を構築中です。", - "@We are currently building this feature for your viewing pleasure.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Request Login Help Button": "ログインサポートのリクエストボタン", - "@Request Login Help Button": { - "description": "Accessibility hint for button that opens help dialog for a login help request", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Request Login Help": "ログインサポートをリクエストする", - "@Request Login Help": { - "description": "Title of help dialog for a login help request", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I'm having trouble logging in": "ログインできません", - "@I'm having trouble logging in": { - "description": "Subject of help dialog for a login help request", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "An error occurred when trying to display this link": "このリンクを表示しようとしてエラーが発生しました", - "@An error occurred when trying to display this link": { - "description": "Error message shown when a link can't be opened", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "We are unable to display this link, it may belong to an institution you currently aren't logged in to.": "このリンクを表示することができません。このリンクは、現在ログインしていない学校のものである可能性があります。", - "@We are unable to display this link, it may belong to an institution you currently aren't logged in to.": { - "description": "Description for error page shown when clicking a link", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Link Error": "リンクエラー", - "@Link Error": { - "description": "Title for error page shown when clicking a link", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Open In Browser": "ブラウザで開く", - "@Open In Browser": { - "description": "Text for button to open a link in the browswer", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You'll find the QR code on the web in your account profile. Click 'QR for Mobile Login' in the list.": "QRコードは、アカウントプロファイルのウェブ上にあります。リストの[モバイルログインのQR]をクリックしてください。", - "@You'll find the QR code on the web in your account profile. Click 'QR for Mobile Login' in the list.": { - "description": "Text for qr login tutorial screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Locate QR Code": "QR コードを探す", - "@Locate QR Code": { - "description": "Text for qr login button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Please scan a QR code generated by Canvas": "Canvas によって生成された QR コードをスキャンしてください", - "@Please scan a QR code generated by Canvas": { - "description": "Text for qr login error with incorrect qr code", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error logging in. Please generate another QR Code and try again.": "ログイン中にエラーが発生しました。別の QR コードを生成して再試行してください。", - "@There was an error logging in. Please generate another QR Code and try again.": { - "description": "Text for qr login error", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Screenshot showing location of QR code generation in browser": "ブラウザ内の QR コード生成の場所を示すスクリーンショット", - "@Screenshot showing location of QR code generation in browser": { - "description": "Content Description for qr login tutorial screenshot", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "QR scanning requires camera access": "QRスキャンにはカメラへのアクセスが必要です", - "@QR scanning requires camera access": { - "description": "placeholder for camera error for QR code scan", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The linked item is no longer available": "リンクされている項目は利用できなくなりました", - "@The linked item is no longer available": { - "description": "error message when the alert could no be opened", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Message sent": "メッセージを送信しました", - "@Message sent": { - "description": "confirmation message on the screen when the user succesfully sends a message", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Acceptable Use Policy": "AUP (Acceptable Use Policy)", - "@Acceptable Use Policy": { - "description": "title for the acceptable use policy screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Submit": "提出", - "@Submit": { - "description": "submit button title for acceptable use policy screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Either you're a new user or the Acceptable Use Policy has changed since you last agreed to it. Please agree to the Acceptable Use Policy before you continue.": "あなたが新しいユーザーであるか、最後に同意して以降、許容される使用ポリシーが変更されています。続行する前に許可される使用ポリシーに同意してください。", - "@Either you're a new user or the Acceptable Use Policy has changed since you last agreed to it. Please agree to the Acceptable Use Policy before you continue.": { - "description": "acceptable use policy screen description", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I agree to the Acceptable Use Policy.": "許可される使用ポリシーに合意します", - "@I agree to the Acceptable Use Policy.": { - "description": "acceptable use policy switch title", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "About": "情報", - "@About": { - "description": "Title for about menu item in settings", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "App": "アプリ", - "@App": { - "description": "Title for App field on about page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Login ID": "ログイン ID", - "@Login ID": { - "description": "Title for Login ID field on about page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Email": "E メール", - "@Email": { - "description": "Title for Email field on about page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Version": "バージョン", - "@Version": { - "description": "Title for Version field on about page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Instructure logo": "Instructure ロゴ", - "@Instructure logo": { - "description": "Semantics label for the Instructure logo on the about page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - } -} \ No newline at end of file diff --git a/apps/flutter_parent/lib/l10n/res/intl_messages.arb b/apps/flutter_parent/lib/l10n/res/intl_messages.arb deleted file mode 100644 index d5edbf3ece..0000000000 --- a/apps/flutter_parent/lib/l10n/res/intl_messages.arb +++ /dev/null @@ -1,2753 +0,0 @@ -{ - "@@last_modified": "2023-08-25T11:04:20.901151", - "alertsLabel": "Alerts", - "@alertsLabel": { - "description": "The label for the Alerts tab", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "calendarLabel": "Calendar", - "@calendarLabel": { - "description": "The label for the Calendar tab", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "coursesLabel": "Courses", - "@coursesLabel": { - "description": "The label for the Courses tab", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Students": "No Students", - "@No Students": { - "description": "Text for when an observer has no students they are observing", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Tap to show student selector": "Tap to show student selector", - "@Tap to show student selector": { - "description": "Semantics label for the area that will show the student selector when tapped", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Tap to pair with a new student": "Tap to pair with a new student", - "@Tap to pair with a new student": { - "description": "Semantics label for the add student button in the student selector", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Tap to select this student": "Tap to select this student", - "@Tap to select this student": { - "description": "Semantics label on individual students in the student switcher", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Manage Students": "Manage Students", - "@Manage Students": { - "description": "Label text for the Manage Students nav drawer button as well as the title for the Manage Students screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Help": "Help", - "@Help": { - "description": "Label text for the help nav drawer button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Log Out": "Log Out", - "@Log Out": { - "description": "Label text for the Log Out nav drawer button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Switch Users": "Switch Users", - "@Switch Users": { - "description": "Label text for the Switch Users nav drawer button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "appVersion": "v. {version}", - "@appVersion": { - "description": "App version shown in the navigation drawer", - "type": "text", - "placeholders_order": [ - "version" - ], - "placeholders": { - "version": {} - } - }, - "Are you sure you want to log out?": "Are you sure you want to log out?", - "@Are you sure you want to log out?": { - "description": "Confirmation message displayed when the user tries to log out", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Calendars": "Calendars", - "@Calendars": { - "description": "Label for button that lets users select which calendars to display", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "nextMonth": "Next month: {month}", - "@nextMonth": { - "description": "Label for the button that switches the calendar to the next month", - "type": "text", - "placeholders_order": [ - "month" - ], - "placeholders": { - "month": {} - } - }, - "previousMonth": "Previous month: {month}", - "@previousMonth": { - "description": "Label for the button that switches the calendar to the previous month", - "type": "text", - "placeholders_order": [ - "month" - ], - "placeholders": { - "month": {} - } - }, - "nextWeek": "Next week starting {date}", - "@nextWeek": { - "description": "Label for the button that switches the calendar to the next week", - "type": "text", - "placeholders_order": [ - "date" - ], - "placeholders": { - "date": {} - } - }, - "previousWeek": "Previous week starting {date}", - "@previousWeek": { - "description": "Label for the button that switches the calendar to the previous week", - "type": "text", - "placeholders_order": [ - "date" - ], - "placeholders": { - "date": {} - } - }, - "selectedMonthLabel": "Month of {month}", - "@selectedMonthLabel": { - "description": "Accessibility label for the button that expands/collapses the month view", - "type": "text", - "placeholders_order": [ - "month" - ], - "placeholders": { - "month": {} - } - }, - "expand": "expand", - "@expand": { - "description": "Accessibility label for the on-tap hint for the button that expands/collapses the month view", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "collapse": "collapse", - "@collapse": { - "description": "Accessibility label for the on-tap hint for the button that expands/collapses the month view", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "pointsPossible": "{points} points possible", - "@pointsPossible": { - "description": "Screen reader label used for the points possible for an assignment, quiz, etc.", - "type": "text", - "placeholders_order": [ - "points" - ], - "placeholders": { - "points": {} - } - }, - "calendarDaySemanticsLabel": "{eventCount,plural, =1{{date}, {eventCount} event}other{{date}, {eventCount} events}}", - "@calendarDaySemanticsLabel": { - "description": "Screen reader label used for calendar day, reads the date and count of events", - "type": "text", - "placeholders_order": [ - "date", - "eventCount" - ], - "placeholders": { - "date": {}, - "eventCount": {} - } - }, - "No Events Today!": "No Events Today!", - "@No Events Today!": { - "description": "Title displayed when there are no calendar events for the current day", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "It looks like a great day to rest, relax, and recharge.": "It looks like a great day to rest, relax, and recharge.", - "@It looks like a great day to rest, relax, and recharge.": { - "description": "Message displayed when there are no calendar events for the current day", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading your student's calendar": "There was an error loading your student's calendar", - "@There was an error loading your student's calendar": { - "description": "Message displayed when calendar events could not be loaded for the current student", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Tap to favorite the courses you want to see on the Calendar. Select up to 10.": "Tap to favorite the courses you want to see on the Calendar. Select up to 10.", - "@Tap to favorite the courses you want to see on the Calendar. Select up to 10.": { - "description": "Description text on calendar filter screen.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You may only choose 10 calendars to display": "You may only choose 10 calendars to display", - "@You may only choose 10 calendars to display": { - "description": "Error text when trying to select more than 10 calendars", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You must select at least one calendar to display": "You must select at least one calendar to display", - "@You must select at least one calendar to display": { - "description": "Error text when trying to de-select all calendars", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Planner Note": "Planner Note", - "@Planner Note": { - "description": "Label used for notes in the planner", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Go to today": "Go to today", - "@Go to today": { - "description": "Accessibility label used for the today button in the planner", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Previous Logins": "Previous Logins", - "@Previous Logins": { - "description": "Label for the list of previous user logins", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "canvasLogoLabel": "Canvas logo", - "@canvasLogoLabel": { - "description": "The semantics label for the Canvas logo", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "findSchool": "Find School", - "@findSchool": { - "description": "Text for the find-my-school button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "findAnotherSchool": "Find another school", - "@findAnotherSchool": { - "description": "Text for the find-another-school button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "domainSearchInputHint": "Enter school name or district…", - "@domainSearchInputHint": { - "description": "Input hint for the text box on the domain search screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "noDomainResults": "Unable to find schools matching \"{query}\"", - "@noDomainResults": { - "description": "Message shown to users when the domain search query did not return any results", - "type": "text", - "placeholders_order": [ - "query" - ], - "placeholders": { - "query": {} - } - }, - "domainSearchHelpLabel": "How do I find my school or district?", - "@domainSearchHelpLabel": { - "description": "Label for the help button on the domain search screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "canvasGuides": "Canvas Guides", - "@canvasGuides": { - "description": "Proper name for the Canvas Guides. This will be used in the domainSearchHelpBody text and will be highlighted and clickable", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "canvasSupport": "Canvas Support", - "@canvasSupport": { - "description": "Proper name for Canvas Support. This will be used in the domainSearchHelpBody text and will be highlighted and clickable", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "domainSearchHelpBody": "Try searching for the name of the school or district you’re attempting to access, like “Smith Private School” or “Smith County Schools.” You can also enter a Canvas domain directly, like “smith.instructure.com.”\n\nFor more information on finding your institution’s Canvas account, you can visit the {canvasGuides}, reach out to {canvasSupport}, or contact your school for assistance.", - "@domainSearchHelpBody": { - "description": "The body text shown in the help dialog on the domain search screen", - "type": "text", - "placeholders_order": [ - "canvasGuides", - "canvasSupport" - ], - "placeholders": { - "canvasGuides": {}, - "canvasSupport": {} - } - }, - "Uh oh!": "Uh oh!", - "@Uh oh!": { - "description": "Title of the screen that shows when a crash has occurred", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "We’re not sure what happened, but it wasn’t good. Contact us if this keeps happening.": "We’re not sure what happened, but it wasn’t good. Contact us if this keeps happening.", - "@We’re not sure what happened, but it wasn’t good. Contact us if this keeps happening.": { - "description": "Message shown when a crash has occurred", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Contact Support": "Contact Support", - "@Contact Support": { - "description": "Label for the button that allows users to contact support after a crash has occurred", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "View error details": "View error details", - "@View error details": { - "description": "Label for the button that allowed users to view crash details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Restart app": "Restart app", - "@Restart app": { - "description": "Label for the button that will restart the entire application", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Application version": "Application version", - "@Application version": { - "description": "Label for the application version displayed in the crash details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Device model": "Device model", - "@Device model": { - "description": "Label for the device model displayed in the crash details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Android OS version": "Android OS version", - "@Android OS version": { - "description": "Label for the Android operating system version displayed in the crash details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Full error message": "Full error message", - "@Full error message": { - "description": "Label for the full error message displayed in the crash details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Inbox": "Inbox", - "@Inbox": { - "description": "Title for the Inbox screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading your inbox messages.": "There was an error loading your inbox messages.", - "@There was an error loading your inbox messages.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Subject": "No Subject", - "@No Subject": { - "description": "Title used for inbox messages that have no subject", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unable to fetch courses. Please check your connection and try again.": "Unable to fetch courses. Please check your connection and try again.", - "@Unable to fetch courses. Please check your connection and try again.": { - "description": "Message shown when an error occured while loading courses", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Choose a course to message": "Choose a course to message", - "@Choose a course to message": { - "description": "Header in the course list shown when the user is choosing which course to associate with a new message", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Inbox Zero": "Inbox Zero", - "@Inbox Zero": { - "description": "Title of the message shown when there are no inbox messages", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You’re all caught up!": "You’re all caught up!", - "@You’re all caught up!": { - "description": "Subtitle of the message shown when there are no inbox messages", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading recipients for this course": "There was an error loading recipients for this course", - "@There was an error loading recipients for this course": { - "description": "Message shown when attempting to create a new message but the recipients list failed to load", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unable to send message. Check your connection and try again.": "Unable to send message. Check your connection and try again.", - "@Unable to send message. Check your connection and try again.": { - "description": "Message show when there was an error creating or sending a new message", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unsaved changes": "Unsaved changes", - "@Unsaved changes": { - "description": "Title of the dialog shown when the user tries to leave with unsaved changes", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Are you sure you wish to close this page? Your unsent message will be lost.": "Are you sure you wish to close this page? Your unsent message will be lost.", - "@Are you sure you wish to close this page? Your unsent message will be lost.": { - "description": "Body text of the dialog shown when the user tries leave with unsaved changes", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "New message": "New message", - "@New message": { - "description": "Title of the new-message screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Add attachment": "Add attachment", - "@Add attachment": { - "description": "Tooltip for the add-attachment button in the new-message screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Send message": "Send message", - "@Send message": { - "description": "Tooltip for the send-message button in the new-message screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Select recipients": "Select recipients", - "@Select recipients": { - "description": "Tooltip for the button that allows users to select message recipients", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No recipients selected": "No recipients selected", - "@No recipients selected": { - "description": "Hint displayed when the user has not selected any message recipients", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Message subject": "Message subject", - "@Message subject": { - "description": "Hint text displayed in the input field for the message subject", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Message": "Message", - "@Message": { - "description": "Hint text displayed in the input field for the message body", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Recipients": "Recipients", - "@Recipients": { - "description": "Label for message recipients", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "plusRecipientCount": "+{count}", - "@plusRecipientCount": { - "description": "Shows the number of recipients that are selected but not displayed on screen.", - "type": "text", - "placeholders_order": [ - "count" - ], - "placeholders": { - "count": { - "example": 5 - } - } - }, - "Failed. Tap for options.": "Failed. Tap for options.", - "@Failed. Tap for options.": { - "description": "Short message shown on a message attachment when uploading has failed", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "courseForWhom": "for {studentShortName}", - "@courseForWhom": { - "description": "Describes for whom a course is for (i.e. for Bill)", - "type": "text", - "placeholders_order": [ - "studentShortName" - ], - "placeholders": { - "studentShortName": {} - } - }, - "messageLinkPostscript": "Regarding: {studentName}, {linkUrl}", - "@messageLinkPostscript": { - "description": "A postscript appended to new messages that clarifies which student is the subject of the message and also includes a URL for the related Canvas component (course, assignment, event, etc).", - "type": "text", - "placeholders_order": [ - "studentName", - "linkUrl" - ], - "placeholders": { - "studentName": {}, - "linkUrl": {} - } - }, - "There was an error loading this conversation": "There was an error loading this conversation", - "@There was an error loading this conversation": { - "description": "Message shown when a conversation fails to load", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Reply": "Reply", - "@Reply": { - "description": "Button label for replying to a conversation", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Reply All": "Reply All", - "@Reply All": { - "description": "Button label for replying to all conversation participants", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unknown User": "Unknown User", - "@Unknown User": { - "description": "Label used where the user name is not known", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "me": "me", - "@me": { - "description": "First-person pronoun (i.e. 'me') that will be used in message author info, e.g. 'Me to 4 others' or 'Jon Snow to me'", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "authorToRecipient": "{authorName} to {recipientName}", - "@authorToRecipient": { - "description": "Author info for a single-recipient message; includes both the author name and the recipient name.", - "type": "text", - "placeholders_order": [ - "authorName", - "recipientName" - ], - "placeholders": { - "authorName": {}, - "recipientName": {} - } - }, - "authorToNOthers": "{howMany,plural, =1{{authorName} to 1 other}other{{authorName} to {howMany} others}}", - "@authorToNOthers": { - "description": "Author info for a mutli-recipient message; includes the author name and the number of recipients", - "type": "text", - "placeholders_order": [ - "authorName", - "howMany" - ], - "placeholders": { - "authorName": {}, - "howMany": {} - } - }, - "authorToRecipientAndNOthers": "{howMany,plural, =1{{authorName} to {recipientName} & 1 other}other{{authorName} to {recipientName} & {howMany} others}}", - "@authorToRecipientAndNOthers": { - "description": "Author info for a multi-recipient message; includes the author name, one recipient name, and the number of other recipients", - "type": "text", - "placeholders_order": [ - "authorName", - "recipientName", - "howMany" - ], - "placeholders": { - "authorName": {}, - "recipientName": {}, - "howMany": {} - } - }, - "Download": "Download", - "@Download": { - "description": "Label for the button that will begin downloading a file", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Open with another app": "Open with another app", - "@Open with another app": { - "description": "Label for the button that will allow users to open a file with another app", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There are no installed applications that can open this file": "There are no installed applications that can open this file", - "@There are no installed applications that can open this file": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unsupported File": "Unsupported File", - "@Unsupported File": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "This file is unsupported and can’t be viewed through the app": "This file is unsupported and can’t be viewed through the app", - "@This file is unsupported and can’t be viewed through the app": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unable to play this media file": "Unable to play this media file", - "@Unable to play this media file": { - "description": "Message shown when audio or video media could not be played", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unable to load this image": "Unable to load this image", - "@Unable to load this image": { - "description": "Message shown when an image file could not be loaded or displayed", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading this file": "There was an error loading this file", - "@There was an error loading this file": { - "description": "Message shown when a file could not be loaded or displayed", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Courses": "No Courses", - "@No Courses": { - "description": "Title for having no courses", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Your student’s courses might not be published yet.": "Your student’s courses might not be published yet.", - "@Your student’s courses might not be published yet.": { - "description": "Message for having no courses", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading your student’s courses.": "There was an error loading your student’s courses.", - "@There was an error loading your student’s courses.": { - "description": "Message displayed when the list of student courses could not be loaded", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Grade": "No Grade", - "@No Grade": { - "description": "Message shown when there is currently no grade available for a course", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Filter by": "Filter by", - "@Filter by": { - "description": "Title for list of terms to filter grades by", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Grades": "Grades", - "@Grades": { - "description": "Label for the \"Grades\" tab in course details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Syllabus": "Syllabus", - "@Syllabus": { - "description": "Label for the \"Syllabus\" tab in course details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Front Page": "Front Page", - "@Front Page": { - "description": "Label for the \"Front Page\" tab in course details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Summary": "Summary", - "@Summary": { - "description": "Label for the \"Summary\" tab in course details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Send a message about this course": "Send a message about this course", - "@Send a message about this course": { - "description": "Accessibility hint for the course messaage floating action button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Total Grade": "Total Grade", - "@Total Grade": { - "description": "Label for the total grade in the course", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Graded": "Graded", - "@Graded": { - "description": "Label for assignments that have been graded", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Submitted": "Submitted", - "@Submitted": { - "description": "Label for assignments that have been submitted", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Not Submitted": "Not Submitted", - "@Not Submitted": { - "description": "Label for assignments that have not been submitted", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Late": "Late", - "@Late": { - "description": "Label for assignments that have been marked late or submitted late", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Missing": "Missing", - "@Missing": { - "description": "Label for assignments that have been marked missing or are not submitted and past the due date", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "-": "-", - "@-": { - "description": "Value representing no score for student submission", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "All Grading Periods": "All Grading Periods", - "@All Grading Periods": { - "description": "Label for selecting all grading periods", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Assignments": "No Assignments", - "@No Assignments": { - "description": "Title for the no assignments message", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "It looks like assignments haven't been created in this space yet.": "It looks like assignments haven't been created in this space yet.", - "@It looks like assignments haven't been created in this space yet.": { - "description": "Message for no assignments", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading the summary details for this course.": "There was an error loading the summary details for this course.", - "@There was an error loading the summary details for this course.": { - "description": "Message shown when the course summary could not be loaded", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Summary": "No Summary", - "@No Summary": { - "description": "Title displayed when there are no items in the course summary", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "This course does not have any assignments or calendar events yet.": "This course does not have any assignments or calendar events yet.", - "@This course does not have any assignments or calendar events yet.": { - "description": "Message displayed when there are no items in the course summary", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "gradeFormatScoreOutOfPointsPossible": "{score} / {pointsPossible}", - "@gradeFormatScoreOutOfPointsPossible": { - "description": "Formatted string for a student score out of the points possible", - "type": "text", - "placeholders_order": [ - "score", - "pointsPossible" - ], - "placeholders": { - "score": {}, - "pointsPossible": {} - } - }, - "contentDescriptionScoreOutOfPointsPossible": "{score} out of {pointsPossible} points", - "@contentDescriptionScoreOutOfPointsPossible": { - "description": "Formatted string for a student score out of the points possible", - "type": "text", - "placeholders_order": [ - "score", - "pointsPossible" - ], - "placeholders": { - "score": {}, - "pointsPossible": {} - } - }, - "gradesSubjectMessage": "Regarding: {studentName}, Grades", - "@gradesSubjectMessage": { - "description": "The subject line for a message to a teacher regarding a student's grades", - "type": "text", - "placeholders_order": [ - "studentName" - ], - "placeholders": { - "studentName": {} - } - }, - "syllabusSubjectMessage": "Regarding: {studentName}, Syllabus", - "@syllabusSubjectMessage": { - "description": "The subject line for a message to a teacher regarding a course syllabus", - "type": "text", - "placeholders_order": [ - "studentName" - ], - "placeholders": { - "studentName": {} - } - }, - "frontPageSubjectMessage": "Regarding: {studentName}, Front Page", - "@frontPageSubjectMessage": { - "description": "The subject line for a message to a teacher regarding a course front page", - "type": "text", - "placeholders_order": [ - "studentName" - ], - "placeholders": { - "studentName": {} - } - }, - "assignmentSubjectMessage": "Regarding: {studentName}, Assignment - {assignmentName}", - "@assignmentSubjectMessage": { - "description": "The subject line for a message to a teacher regarding a student's assignment", - "type": "text", - "placeholders_order": [ - "studentName", - "assignmentName" - ], - "placeholders": { - "studentName": {}, - "assignmentName": {} - } - }, - "eventSubjectMessage": "Regarding: {studentName}, Event - {eventTitle}", - "@eventSubjectMessage": { - "description": "The subject line for a message to a teacher regarding a calendar event", - "type": "text", - "placeholders_order": [ - "studentName", - "eventTitle" - ], - "placeholders": { - "studentName": {}, - "eventTitle": {} - } - }, - "There is no page information available.": "There is no page information available.", - "@There is no page information available.": { - "description": "Description for when no page information is available", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Assignment Details": "Assignment Details", - "@Assignment Details": { - "description": "Title for the page that shows details for an assignment", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "assignmentTotalPoints": "{points} pts", - "@assignmentTotalPoints": { - "description": "Label used for the total points the assignment is worth", - "type": "text", - "placeholders_order": [ - "points" - ], - "placeholders": { - "points": {} - } - }, - "assignmentTotalPointsAccessible": "{points} points", - "@assignmentTotalPointsAccessible": { - "description": "Screen reader label used for the total points the assignment is worth", - "type": "text", - "placeholders_order": [ - "points" - ], - "placeholders": { - "points": {} - } - }, - "Due": "Due", - "@Due": { - "description": "Label for an assignment due date", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Grade": "Grade", - "@Grade": { - "description": "Label for the section that displays an assignment's grade", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Locked": "Locked", - "@Locked": { - "description": "Label for when an assignment is locked", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "assignmentLockedModule": "This assignment is locked by the module \"{moduleName}\".", - "@assignmentLockedModule": { - "description": "The locked description when an assignment is locked by a module", - "type": "text", - "placeholders_order": [ - "moduleName" - ], - "placeholders": { - "moduleName": {} - } - }, - "Remind Me": "Remind Me", - "@Remind Me": { - "description": "Label for the row to set reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Set a date and time to be notified of this specific assignment.": "Set a date and time to be notified of this specific assignment.", - "@Set a date and time to be notified of this specific assignment.": { - "description": "Description for row to set reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You will be notified about this assignment on…": "You will be notified about this assignment on…", - "@You will be notified about this assignment on…": { - "description": "Description for when a reminder is set", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Instructions": "Instructions", - "@Instructions": { - "description": "Label for the description of the assignment when it has quiz instructions", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Send a message about this assignment": "Send a message about this assignment", - "@Send a message about this assignment": { - "description": "Accessibility hint for the assignment messaage floating action button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "This app is not authorized for use.": "This app is not authorized for use.", - "@This app is not authorized for use.": { - "description": "The error shown when the app being used is not verified by Canvas", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The server you entered is not authorized for this app.": "The server you entered is not authorized for this app.", - "@The server you entered is not authorized for this app.": { - "description": "The error shown when the desired login domain is not verified by Canvas", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The user agent for this app is not authorized.": "The user agent for this app is not authorized.", - "@The user agent for this app is not authorized.": { - "description": "The error shown when the user agent during verification is not verified by Canvas", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "We were unable to verify the server for use with this app.": "We were unable to verify the server for use with this app.", - "@We were unable to verify the server for use with this app.": { - "description": "The generic error shown when we are unable to verify with Canvas", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Reminders": "Reminders", - "@Reminders": { - "description": "Name of the system notification channel for assignment and event reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Notifications for reminders about assignments and calendar events": "Notifications for reminders about assignments and calendar events", - "@Notifications for reminders about assignments and calendar events": { - "description": "Description of the system notification channel for assignment and event reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Reminders have changed!": "Reminders have changed!", - "@Reminders have changed!": { - "description": "Title of the dialog shown when the user needs to update their reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "In order to provide you with a better experience, we have updated how reminders work. You can add new reminders by viewing an assignment or calendar event and tapping the switch under the \"Remind Me\" section.\n\nBe aware that any reminders created with older versions of this app will not be compatible with the new changes and you will need to create them again.": "In order to provide you with a better experience, we have updated how reminders work. You can add new reminders by viewing an assignment or calendar event and tapping the switch under the \"Remind Me\" section.\n\nBe aware that any reminders created with older versions of this app will not be compatible with the new changes and you will need to create them again.", - "@In order to provide you with a better experience, we have updated how reminders work. You can add new reminders by viewing an assignment or calendar event and tapping the switch under the \"Remind Me\" section.\n\nBe aware that any reminders created with older versions of this app will not be compatible with the new changes and you will need to create them again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Not a parent?": "Not a parent?", - "@Not a parent?": { - "description": "Title for the screen that shows when the user is not observing any students", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "We couldn't find any students associated with this account": "We couldn't find any students associated with this account", - "@We couldn't find any students associated with this account": { - "description": "Subtitle for the screen that shows when the user is not observing any students", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Are you a student or teacher?": "Are you a student or teacher?", - "@Are you a student or teacher?": { - "description": "Label for button that will show users the option to view other Canvas apps in the Play Store", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "One of our other apps might be a better fit. Tap one to visit the Play Store.": "One of our other apps might be a better fit. Tap one to visit the Play Store.", - "@One of our other apps might be a better fit. Tap one to visit the Play Store.": { - "description": "Description of options to view other Canvas apps in the Play Store", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Return to Login": "Return to Login", - "@Return to Login": { - "description": "Label for the button that returns the user to the login screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "STUDENT": "STUDENT", - "@STUDENT": { - "description": "The \"student\" portion of the \"Canvas Student\" app name, in all caps. \"Canvas\" is excluded in this context as it will be displayed to the user as a wordmark image", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "TEACHER": "TEACHER", - "@TEACHER": { - "description": "The \"teacher\" portion of the \"Canvas Teacher\" app name, in all caps. \"Canvas\" is excluded in this context as it will be displayed to the user as a wordmark image", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Canvas Student": "Canvas Student", - "@Canvas Student": { - "description": "The name of the Canvas Student app. Only \"Student\" should be translated as \"Canvas\" is a brand name in this context and should not be translated.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Canvas Teacher": "Canvas Teacher", - "@Canvas Teacher": { - "description": "The name of the Canvas Teacher app. Only \"Teacher\" should be translated as \"Canvas\" is a brand name in this context and should not be translated.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Alerts": "No Alerts", - "@No Alerts": { - "description": "The title for the empty message to show to users when there are no alerts for the student.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There’s nothing to be notified of yet.": "There’s nothing to be notified of yet.", - "@There’s nothing to be notified of yet.": { - "description": "The empty message to show to users when there are no alerts for the student.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "dismissAlertLabel": "Dismiss {alertTitle}", - "@dismissAlertLabel": { - "description": "Accessibility label to dismiss an alert", - "type": "text", - "placeholders_order": [ - "alertTitle" - ], - "placeholders": { - "alertTitle": {} - } - }, - "Course Announcement": "Course Announcement", - "@Course Announcement": { - "description": "Title for alerts when there is a course announcement", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Institution Announcement": "Institution Announcement", - "@Institution Announcement": { - "description": "Title for alerts when there is an institution announcement", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "assignmentGradeAboveThreshold": "Assignment Grade Above {threshold}", - "@assignmentGradeAboveThreshold": { - "description": "Title for alerts when an assignment grade is above the threshold value", - "type": "text", - "placeholders_order": [ - "threshold" - ], - "placeholders": { - "threshold": {} - } - }, - "assignmentGradeBelowThreshold": "Assignment Grade Below {threshold}", - "@assignmentGradeBelowThreshold": { - "description": "Title for alerts when an assignment grade is below the threshold value", - "type": "text", - "placeholders_order": [ - "threshold" - ], - "placeholders": { - "threshold": {} - } - }, - "courseGradeAboveThreshold": "Course Grade Above {threshold}", - "@courseGradeAboveThreshold": { - "description": "Title for alerts when a course grade is above the threshold value", - "type": "text", - "placeholders_order": [ - "threshold" - ], - "placeholders": { - "threshold": {} - } - }, - "courseGradeBelowThreshold": "Course Grade Below {threshold}", - "@courseGradeBelowThreshold": { - "description": "Title for alerts when a course grade is below the threshold value", - "type": "text", - "placeholders_order": [ - "threshold" - ], - "placeholders": { - "threshold": {} - } - }, - "Settings": "Settings", - "@Settings": { - "description": "Title for the settings screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Theme": "Theme", - "@Theme": { - "description": "Label for the light/dark theme section in the settings page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Dark Mode": "Dark Mode", - "@Dark Mode": { - "description": "Label for the button that enables dark mode", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Light Mode": "Light Mode", - "@Light Mode": { - "description": "Label for the button that enables light mode", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "High Contrast Mode": "High Contrast Mode", - "@High Contrast Mode": { - "description": "Label for the switch that toggles high contrast mode", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Use Dark Theme in Web Content": "Use Dark Theme in Web Content", - "@Use Dark Theme in Web Content": { - "description": "Label for the switch that toggles dark mode for webviews", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Appearance": "Appearance", - "@Appearance": { - "description": "Label for the appearance section in the settings page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Successfully submitted!": "Successfully submitted!", - "@Successfully submitted!": { - "description": "Title displayed in the grade cell for an assignment that has been submitted", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "submissionStatusSuccessSubtitle": "This assignment was submitted on {date} at {time} and is waiting to be graded", - "@submissionStatusSuccessSubtitle": { - "description": "Subtitle displayed in the grade cell for an assignment that has been submitted and is awaiting a grade", - "type": "text", - "placeholders_order": [ - "date", - "time" - ], - "placeholders": { - "date": {}, - "time": {} - } - }, - "outOfPoints": "{howMany,plural, =1{Out of 1 point}other{Out of {points} points}}", - "@outOfPoints": { - "description": "Description for an assignment grade that has points without a current scoroe", - "type": "text", - "placeholders_order": [ - "points", - "howMany" - ], - "placeholders": { - "points": {}, - "howMany": {} - } - }, - "Excused": "Excused", - "@Excused": { - "description": "Grading status for an assignment marked as excused", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Complete": "Complete", - "@Complete": { - "description": "Grading status for an assignment marked as complete", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Incomplete": "Incomplete", - "@Incomplete": { - "description": "Grading status for an assignment marked as incomplete", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "minus": "minus", - "@minus": { - "description": "Screen reader-friendly replacement for the \"-\" character in letter grades like \"A-\"", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "latePenalty": "Late penalty (-{pointsLost})", - "@latePenalty": { - "description": "Text displayed when a late penalty has been applied to the assignment", - "type": "text", - "placeholders_order": [ - "pointsLost" - ], - "placeholders": { - "pointsLost": {} - } - }, - "finalGrade": "Final Grade: {grade}", - "@finalGrade": { - "description": "Text that displays the final grade of an assignment", - "type": "text", - "placeholders_order": [ - "grade" - ], - "placeholders": { - "grade": {} - } - }, - "Alert Settings": "Alert Settings", - "@Alert Settings": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Alert me when…": "Alert me when…", - "@Alert me when…": { - "description": "Header for the screen where the observer chooses the thresholds that will determine when they receive alerts (e.g. when an assignment is graded below 70%)", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Course grade below": "Course grade below", - "@Course grade below": { - "description": "Label describing the threshold for when the course grade is below a certain percentage", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Course grade above": "Course grade above", - "@Course grade above": { - "description": "Label describing the threshold for when the course grade is above a certain percentage", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Assignment missing": "Assignment missing", - "@Assignment missing": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Assignment grade below": "Assignment grade below", - "@Assignment grade below": { - "description": "Label describing the threshold for when an assignment is graded below a certain percentage", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Assignment grade above": "Assignment grade above", - "@Assignment grade above": { - "description": "Label describing the threshold for when an assignment is graded above a certain percentage", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Course Announcements": "Course Announcements", - "@Course Announcements": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Institution Announcements": "Institution Announcements", - "@Institution Announcements": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Never": "Never", - "@Never": { - "description": "Indication that tells the user they will not receive alert notifications of a specific kind", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Grade percentage": "Grade percentage", - "@Grade percentage": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading your student's alerts.": "There was an error loading your student's alerts.", - "@There was an error loading your student's alerts.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Must be below 100": "Must be below 100", - "@Must be below 100": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "mustBeBelowN": "Must be below {percentage}", - "@mustBeBelowN": { - "description": "Validation error to the user that they must choose a percentage below 'n'", - "type": "text", - "placeholders_order": [ - "percentage" - ], - "placeholders": { - "percentage": { - "example": 5 - } - } - }, - "mustBeAboveN": "Must be above {percentage}", - "@mustBeAboveN": { - "description": "Validation error to the user that they must choose a percentage above 'n'", - "type": "text", - "placeholders_order": [ - "percentage" - ], - "placeholders": { - "percentage": { - "example": 5 - } - } - }, - "Select Student Color": "Select Student Color", - "@Select Student Color": { - "description": "Title for screen that allows users to assign a color to a specific student", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Electric, blue": "Electric, blue", - "@Electric, blue": { - "description": "Name of the Electric (blue) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Plum, Purple": "Plum, Purple", - "@Plum, Purple": { - "description": "Name of the Plum (purple) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Barney, Fuschia": "Barney, Fuschia", - "@Barney, Fuschia": { - "description": "Name of the Barney (fuschia) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Raspberry, Red": "Raspberry, Red", - "@Raspberry, Red": { - "description": "Name of the Raspberry (red) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Fire, Orange": "Fire, Orange", - "@Fire, Orange": { - "description": "Name of the Fire (orange) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Shamrock, Green": "Shamrock, Green", - "@Shamrock, Green": { - "description": "Name of the Shamrock (green) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "An error occurred while saving your selection. Please try again.": "An error occurred while saving your selection. Please try again.", - "@An error occurred while saving your selection. Please try again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "changeStudentColorLabel": "Change color for {studentName}", - "@changeStudentColorLabel": { - "description": "Accessibility label for the button that lets users change the color associated with a specific student", - "type": "text", - "placeholders_order": [ - "studentName" - ], - "placeholders": { - "studentName": {} - } - }, - "Teacher": "Teacher", - "@Teacher": { - "description": "Label for the Teacher enrollment type", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Student": "Student", - "@Student": { - "description": "Label for the Student enrollment type", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "TA": "TA", - "@TA": { - "description": "Label for the Teaching Assistant enrollment type (also known as Teacher Aid or Education Assistant), reduced to a short acronym/initialism if appropriate.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Observer": "Observer", - "@Observer": { - "description": "Label for the Observer enrollment type", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Use Camera": "Use Camera", - "@Use Camera": { - "description": "Label for the action item that lets the user capture a photo using the device camera", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Upload File": "Upload File", - "@Upload File": { - "description": "Label for the action item that lets the user upload a file from their device", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Choose from Gallery": "Choose from Gallery", - "@Choose from Gallery": { - "description": "Label for the action item that lets the user select a photo from their device gallery", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Preparing…": "Preparing…", - "@Preparing…": { - "description": "Message shown while a file is being prepared to attach to a message", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Add student with…": "Add student with…", - "@Add student with…": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Add Student": "Add Student", - "@Add Student": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You are not observing any students.": "You are not observing any students.", - "@You are not observing any students.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading your students.": "There was an error loading your students.", - "@There was an error loading your students.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Pairing Code": "Pairing Code", - "@Pairing Code": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Students can obtain a pairing code through the Canvas website": "Students can obtain a pairing code through the Canvas website", - "@Students can obtain a pairing code through the Canvas website": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Enter the student pairing code provided to you. If the pairing code doesn't work, it may have expired": "Enter the student pairing code provided to you. If the pairing code doesn't work, it may have expired", - "@Enter the student pairing code provided to you. If the pairing code doesn't work, it may have expired": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Your code is incorrect or expired.": "Your code is incorrect or expired.", - "@Your code is incorrect or expired.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Something went wrong trying to create your account, please reach out to your school for assistance.": "Something went wrong trying to create your account, please reach out to your school for assistance.", - "@Something went wrong trying to create your account, please reach out to your school for assistance.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "QR Code": "QR Code", - "@QR Code": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Students can create a QR code using the Canvas Student app on their mobile device": "Students can create a QR code using the Canvas Student app on their mobile device", - "@Students can create a QR code using the Canvas Student app on their mobile device": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Add new student": "Add new student", - "@Add new student": { - "description": "Semantics label for the FAB on the Manage Students Screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Select": "Select", - "@Select": { - "description": "Hint text to tell the user to choose one of two options", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I have a Canvas account": "I have a Canvas account", - "@I have a Canvas account": { - "description": "Option to select for users that have a canvas account", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I don't have a Canvas account": "I don't have a Canvas account", - "@I don't have a Canvas account": { - "description": "Option to select for users that don't have a canvas account", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Create Account": "Create Account", - "@Create Account": { - "description": "Button text for account creation confirmation", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Full Name": "Full Name", - "@Full Name": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Email Address": "Email Address", - "@Email Address": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Password": "Password", - "@Password": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Full Name…": "Full Name…", - "@Full Name…": { - "description": "hint label for inside form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Email…": "Email…", - "@Email…": { - "description": "hint label for inside form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Password…": "Password…", - "@Password…": { - "description": "hint label for inside form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Please enter full name": "Please enter full name", - "@Please enter full name": { - "description": "Error message for form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Please enter an email address": "Please enter an email address", - "@Please enter an email address": { - "description": "Error message for form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Please enter a valid email address": "Please enter a valid email address", - "@Please enter a valid email address": { - "description": "Error message for form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Password is required": "Password is required", - "@Password is required": { - "description": "Error message for form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Password must contain at least 8 characters": "Password must contain at least 8 characters", - "@Password must contain at least 8 characters": { - "description": "Error message for form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "qrCreateAccountTos": "By tapping 'Create Account', you agree to the {termsOfService} and acknowledge the {privacyPolicy}", - "@qrCreateAccountTos": { - "description": "The text show on the account creation screen", - "type": "text", - "placeholders_order": [ - "termsOfService", - "privacyPolicy" - ], - "placeholders": { - "termsOfService": {}, - "privacyPolicy": {} - } - }, - "Terms of Service": "Terms of Service", - "@Terms of Service": { - "description": "Label for the Canvas Terms of Service agreement. This will be used in the qrCreateAccountTos text and will be highlighted and clickable", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Privacy Policy": "Privacy Policy", - "@Privacy Policy": { - "description": "Label for the Canvas Privacy Policy agreement. This will be used in the qrCreateAccountTos text and will be highlighted and clickable", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "View the Privacy Policy": "View the Privacy Policy", - "@View the Privacy Policy": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Already have an account? ": "Already have an account? ", - "@Already have an account? ": { - "description": "Part of multiline text span, includes AccountSignIn1-2, in that order", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Sign In": "Sign In", - "@Sign In": { - "description": "Part of multiline text span, includes AccountSignIn1-2, in that order", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Hide Password": "Hide Password", - "@Hide Password": { - "description": "content description for password hide button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Show Password": "Show Password", - "@Show Password": { - "description": "content description for password show button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Terms of Service Link": "Terms of Service Link", - "@Terms of Service Link": { - "description": "content description for terms of service link", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Privacy Policy Link": "Privacy Policy Link", - "@Privacy Policy Link": { - "description": "content description for privacy policy link", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Event": "Event", - "@Event": { - "description": "Title for the event details screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Date": "Date", - "@Date": { - "description": "Label for the event date", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Location": "Location", - "@Location": { - "description": "Label for the location information", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Location Specified": "No Location Specified", - "@No Location Specified": { - "description": "Description for events that do not have a location", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "eventTime": "{startAt} - {endAt}", - "@eventTime": { - "description": "The time the event is happening, example: \"2:00 pm - 4:00 pm\"", - "type": "text", - "placeholders_order": [ - "startAt", - "endAt" - ], - "placeholders": { - "startAt": {}, - "endAt": {} - } - }, - "Set a date and time to be notified of this event.": "Set a date and time to be notified of this event.", - "@Set a date and time to be notified of this event.": { - "description": "Description for row to set event reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You will be notified about this event on…": "You will be notified about this event on…", - "@You will be notified about this event on…": { - "description": "Description for when an event reminder is set", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Share Your Love for the App": "Share Your Love for the App", - "@Share Your Love for the App": { - "description": "Label for option to open the app store", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Tell us about your favorite parts of the app": "Tell us about your favorite parts of the app", - "@Tell us about your favorite parts of the app": { - "description": "Description for option to open the app store", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Legal": "Legal", - "@Legal": { - "description": "Label for legal information option", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Privacy policy, terms of use, open source": "Privacy policy, terms of use, open source", - "@Privacy policy, terms of use, open source": { - "description": "Description for legal information option", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Idea for Canvas Parent App [Android]": "Idea for Canvas Parent App [Android]", - "@Idea for Canvas Parent App [Android]": { - "description": "The subject for the email to request a feature", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The following information will help us better understand your idea:": "The following information will help us better understand your idea:", - "@The following information will help us better understand your idea:": { - "description": "The header for the users information that is attached to a feature request", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Domain:": "Domain:", - "@Domain:": { - "description": "The label for the Canvas domain of the logged in user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "User ID:": "User ID:", - "@User ID:": { - "description": "The label for the Canvas user ID of the logged in user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Email:": "Email:", - "@Email:": { - "description": "The label for the eamil of the logged in user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Locale:": "Locale:", - "@Locale:": { - "description": "The label for the locale of the logged in user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Terms of Use": "Terms of Use", - "@Terms of Use": { - "description": "Label for the terms of use", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Canvas on GitHub": "Canvas on GitHub", - "@Canvas on GitHub": { - "description": "Label for the button that opens the Canvas project on GitHub's website", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was a problem loading the Terms of Use": "There was a problem loading the Terms of Use", - "@There was a problem loading the Terms of Use": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Device": "Device", - "@Device": { - "description": "Label used for device manufacturer/model in the error report", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "OS Version": "OS Version", - "@OS Version": { - "description": "Label used for device operating system version in the error report", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Version Number": "Version Number", - "@Version Number": { - "description": "Label used for the app version number in the error report", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Report A Problem": "Report A Problem", - "@Report A Problem": { - "description": "Title used for generic dialog to report problems", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Subject": "Subject", - "@Subject": { - "description": "Label used for Subject text field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "A subject is required.": "A subject is required.", - "@A subject is required.": { - "description": "Error shown when the subject field is empty", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "An email address is required.": "An email address is required.", - "@An email address is required.": { - "description": "Error shown when the email field is empty", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Description": "Description", - "@Description": { - "description": "Label used for Description text field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "A description is required.": "A description is required.", - "@A description is required.": { - "description": "Error shown when the description field is empty", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "How is this affecting you?": "How is this affecting you?", - "@How is this affecting you?": { - "description": "Label used for the dropdown to select how severe the issue is", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "send": "send", - "@send": { - "description": "Label used for send button when reporting a problem", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Just a casual question, comment, idea, suggestion…": "Just a casual question, comment, idea, suggestion…", - "@Just a casual question, comment, idea, suggestion…": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I need some help but it's not urgent.": "I need some help but it's not urgent.", - "@I need some help but it's not urgent.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Something's broken but I can work around it to get what I need done.": "Something's broken but I can work around it to get what I need done.", - "@Something's broken but I can work around it to get what I need done.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I can't get things done until I hear back from you.": "I can't get things done until I hear back from you.", - "@I can't get things done until I hear back from you.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "EXTREME CRITICAL EMERGENCY!!": "EXTREME CRITICAL EMERGENCY!!", - "@EXTREME CRITICAL EMERGENCY!!": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Not Graded": "Not Graded", - "@Not Graded": { - "description": "Description for an assignment has not been graded.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Login flow: Normal": "Login flow: Normal", - "@Login flow: Normal": { - "description": "Description for the normal login flow", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Login flow: Canvas": "Login flow: Canvas", - "@Login flow: Canvas": { - "description": "Description for the Canvas login flow", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Login flow: Site Admin": "Login flow: Site Admin", - "@Login flow: Site Admin": { - "description": "Description for the Site Admin login flow", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Login flow: Skip mobile verify": "Login flow: Skip mobile verify", - "@Login flow: Skip mobile verify": { - "description": "Description for the login flow that skips domain verification for mobile", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Act As User": "Act As User", - "@Act As User": { - "description": "Label for the button that allows the user to act (masquerade) as another user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Stop Acting as User": "Stop Acting as User", - "@Stop Acting as User": { - "description": "Label for the button that allows the user to stop acting (masquerading) as another user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "actingAsUser": "You are acting as {userName}", - "@actingAsUser": { - "description": "Message shown while acting (masquerading) as another user", - "type": "text", - "placeholders_order": [ - "userName" - ], - "placeholders": { - "userName": {} - } - }, - "\"Act as\" is essentially logging in as this user without a password. You will be able to take any action as if you were this user, and from other users' points of views, it will be as if this user performed them. However, audit logs record that you were the one who performed the actions on behalf of this user.": "\"Act as\" is essentially logging in as this user without a password. You will be able to take any action as if you were this user, and from other users' points of views, it will be as if this user performed them. However, audit logs record that you were the one who performed the actions on behalf of this user.", - "@\"Act as\" is essentially logging in as this user without a password. You will be able to take any action as if you were this user, and from other users' points of views, it will be as if this user performed them. However, audit logs record that you were the one who performed the actions on behalf of this user.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Domain": "Domain", - "@Domain": { - "description": "Text field hint for domain url input", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You must enter a valid domain": "You must enter a valid domain", - "@You must enter a valid domain": { - "description": "Message displayed for domain input error", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "User ID": "User ID", - "@User ID": { - "description": "Text field hint for user ID input", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You must enter a user id": "You must enter a user id", - "@You must enter a user id": { - "description": "Message displayed for user Id input error", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error trying to act as this user. Please check the Domain and User ID and try again.": "There was an error trying to act as this user. Please check the Domain and User ID and try again.", - "@There was an error trying to act as this user. Please check the Domain and User ID and try again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "endMasqueradeMessage": "You will stop acting as {userName} and return to your original account.", - "@endMasqueradeMessage": { - "description": "Confirmation message displayed when the user wants to stop acting (masquerading) as another user", - "type": "text", - "placeholders_order": [ - "userName" - ], - "placeholders": { - "userName": {} - } - }, - "endMasqueradeLogoutMessage": "You will stop acting as {userName} and will be logged out.", - "@endMasqueradeLogoutMessage": { - "description": "Confirmation message displayed when the user wants to stop acting (masquerading) as another user and will be logged out.", - "type": "text", - "placeholders_order": [ - "userName" - ], - "placeholders": { - "userName": {} - } - }, - "How are we doing?": "How are we doing?", - "@How are we doing?": { - "description": "Title for dialog asking user to rate the app out of 5 stars.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Don't show again": "Don't show again", - "@Don't show again": { - "description": "Button to prevent the rating dialog from showing again.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "What can we do better?": "What can we do better?", - "@What can we do better?": { - "description": "Hint text for providing a comment with the rating.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Send Feedback": "Send Feedback", - "@Send Feedback": { - "description": "Button to send rating with feedback", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "ratingDialogEmailSubject": "Suggestions for Android - Canvas Parent {version}", - "@ratingDialogEmailSubject": { - "description": "The subject for an email to provide feedback for CanvasParent.", - "type": "text", - "placeholders_order": [ - "version" - ], - "placeholders": { - "version": {} - } - }, - "starRating": "{position,plural, =1{{position} star}other{{position} stars}}", - "@starRating": { - "description": "Accessibility label for the 1 stars to 5 stars rating", - "type": "text", - "placeholders_order": [ - "position" - ], - "placeholders": { - "position": { - "example": 1 - } - } - }, - "Student Pairing": "Student Pairing", - "@Student Pairing": { - "description": "Title for the screen where users can pair to students using a QR code", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Open Canvas Student": "Open Canvas Student", - "@Open Canvas Student": { - "description": "Title for QR pairing tutorial screen instructing users to open the Canvas Student app", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You'll need to open your student's Canvas Student app to continue. Go into Main Menu > Settings > Pair with Observer and scan the QR code you see there.": "You'll need to open your student's Canvas Student app to continue. Go into Main Menu > Settings > Pair with Observer and scan the QR code you see there.", - "@You'll need to open your student's Canvas Student app to continue. Go into Main Menu > Settings > Pair with Observer and scan the QR code you see there.": { - "description": "Message explaining how QR code pairing works", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Screenshot showing location of pairing QR code generation in the Canvas Student app": "Screenshot showing location of pairing QR code generation in the Canvas Student app", - "@Screenshot showing location of pairing QR code generation in the Canvas Student app": { - "description": "Content Description for qr pairing tutorial screenshot", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Expired QR Code": "Expired QR Code", - "@Expired QR Code": { - "description": "Error title shown when the users scans a QR code that has expired", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The QR code you scanned may have expired. Refresh the code on the student's device and try again.": "The QR code you scanned may have expired. Refresh the code on the student's device and try again.", - "@The QR code you scanned may have expired. Refresh the code on the student's device and try again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "A network error occurred when adding this student. Check your connection and try again.": "A network error occurred when adding this student. Check your connection and try again.", - "@A network error occurred when adding this student. Check your connection and try again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Invalid QR Code": "Invalid QR Code", - "@Invalid QR Code": { - "description": "Error title shown when the user scans an invalid QR code", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Incorrect Domain": "Incorrect Domain", - "@Incorrect Domain": { - "description": "Error title shown when the users scane a QR code for a student that belongs to a different domain", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The student you are trying to add belongs to a different school. Log in or create an account with that school to scan this code.": "The student you are trying to add belongs to a different school. Log in or create an account with that school to scan this code.", - "@The student you are trying to add belongs to a different school. Log in or create an account with that school to scan this code.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Camera Permission": "Camera Permission", - "@Camera Permission": { - "description": "Error title shown when the user wans to scan a QR code but has denied the camera permission", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "This will unpair and remove all enrollments for this student from your account.": "This will unpair and remove all enrollments for this student from your account.", - "@This will unpair and remove all enrollments for this student from your account.": { - "description": "Confirmation message shown when the user tries to delete a student from their account", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was a problem removing this student from your account. Please check your connection and try again.": "There was a problem removing this student from your account. Please check your connection and try again.", - "@There was a problem removing this student from your account. Please check your connection and try again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Cancel": "Cancel", - "@Cancel": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "next": "Next", - "@next": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "ok": "OK", - "@ok": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Yes": "Yes", - "@Yes": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No": "No", - "@No": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Retry": "Retry", - "@Retry": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Delete": "Delete", - "@Delete": { - "description": "Label used for general delete/remove actions", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Done": "Done", - "@Done": { - "description": "Label for general done/finished actions", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Refresh": "Refresh", - "@Refresh": { - "description": "Label for button to refresh data from the web", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "View Description": "View Description", - "@View Description": { - "description": "Button to view the description for an event or assignment", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "expanded": "expanded", - "@expanded": { - "description": "Description for the accessibility reader for list groups that are expanded", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "collapsed": "collapsed", - "@collapsed": { - "description": "Description for the accessibility reader for list groups that are expanded", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "An unexpected error occurred": "An unexpected error occurred", - "@An unexpected error occurred": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No description": "No description", - "@No description": { - "description": "Message used when the assignment has no description", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Launch External Tool": "Launch External Tool", - "@Launch External Tool": { - "description": "Button text added to webviews to let users open external tools in their browser", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Interactions on this page are limited by your institution.": "Interactions on this page are limited by your institution.", - "@Interactions on this page are limited by your institution.": { - "description": "Message describing how the webview has limited access due to an instution setting", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "dateAtTime": "{date} at {time}", - "@dateAtTime": { - "description": "The string to format dates", - "type": "text", - "placeholders_order": [ - "date", - "time" - ], - "placeholders": { - "date": {}, - "time": {} - } - }, - "dueDateAtTime": "Due {date} at {time}", - "@dueDateAtTime": { - "description": "The string to format due dates", - "type": "text", - "placeholders_order": [ - "date", - "time" - ], - "placeholders": { - "date": {}, - "time": {} - } - }, - "No Due Date": "No Due Date", - "@No Due Date": { - "description": "Label for assignments that do not have a due date", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Filter": "Filter", - "@Filter": { - "description": "Label for buttons to filter what items are visible", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "unread": "unread", - "@unread": { - "description": "Label for things that are marked as unread", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "unreadCount": "{count} unread", - "@unreadCount": { - "description": "Formatted string for when there are a number of unread items", - "type": "text", - "placeholders_order": [ - "count" - ], - "placeholders": { - "count": {} - } - }, - "badgeNumberPlus": "{count}+", - "@badgeNumberPlus": { - "description": "Formatted string for when too many items are being notified in a badge, generally something like: 99+", - "type": "text", - "placeholders_order": [ - "count" - ], - "placeholders": { - "count": {} - } - }, - "There was an error loading this announcement": "There was an error loading this announcement", - "@There was an error loading this announcement": { - "description": "Message shown when an announcement detail screen fails to load", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Network error": "Network error", - "@Network error": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Under Construction": "Under Construction", - "@Under Construction": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "We are currently building this feature for your viewing pleasure.": "We are currently building this feature for your viewing pleasure.", - "@We are currently building this feature for your viewing pleasure.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Request Login Help Button": "Request Login Help Button", - "@Request Login Help Button": { - "description": "Accessibility hint for button that opens help dialog for a login help request", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Request Login Help": "Request Login Help", - "@Request Login Help": { - "description": "Title of help dialog for a login help request", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I'm having trouble logging in": "I'm having trouble logging in", - "@I'm having trouble logging in": { - "description": "Subject of help dialog for a login help request", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "An error occurred when trying to display this link": "An error occurred when trying to display this link", - "@An error occurred when trying to display this link": { - "description": "Error message shown when a link can't be opened", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "We are unable to display this link, it may belong to an institution you currently aren't logged in to.": "We are unable to display this link, it may belong to an institution you currently aren't logged in to.", - "@We are unable to display this link, it may belong to an institution you currently aren't logged in to.": { - "description": "Description for error page shown when clicking a link", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Link Error": "Link Error", - "@Link Error": { - "description": "Title for error page shown when clicking a link", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Open In Browser": "Open In Browser", - "@Open In Browser": { - "description": "Text for button to open a link in the browswer", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You'll find the QR code on the web in your account profile. Click 'QR for Mobile Login' in the list.": "You'll find the QR code on the web in your account profile. Click 'QR for Mobile Login' in the list.", - "@You'll find the QR code on the web in your account profile. Click 'QR for Mobile Login' in the list.": { - "description": "Text for qr login tutorial screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Locate QR Code": "Locate QR Code", - "@Locate QR Code": { - "description": "Text for qr login button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Please scan a QR code generated by Canvas": "Please scan a QR code generated by Canvas", - "@Please scan a QR code generated by Canvas": { - "description": "Text for qr login error with incorrect qr code", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error logging in. Please generate another QR Code and try again.": "There was an error logging in. Please generate another QR Code and try again.", - "@There was an error logging in. Please generate another QR Code and try again.": { - "description": "Text for qr login error", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Screenshot showing location of QR code generation in browser": "Screenshot showing location of QR code generation in browser", - "@Screenshot showing location of QR code generation in browser": { - "description": "Content Description for qr login tutorial screenshot", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "QR scanning requires camera access": "QR scanning requires camera access", - "@QR scanning requires camera access": { - "description": "placeholder for camera error for QR code scan", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The linked item is no longer available": "The linked item is no longer available", - "@The linked item is no longer available": { - "description": "error message when the alert could no be opened", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Message sent": "Message sent", - "@Message sent": { - "description": "confirmation message on the screen when the user succesfully sends a message", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Acceptable Use Policy": "Acceptable Use Policy", - "@Acceptable Use Policy": { - "description": "title for the acceptable use policy screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Submit": "Submit", - "@Submit": { - "description": "submit button title for acceptable use policy screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Either you're a new user or the Acceptable Use Policy has changed since you last agreed to it. Please agree to the Acceptable Use Policy before you continue.": "Either you're a new user or the Acceptable Use Policy has changed since you last agreed to it. Please agree to the Acceptable Use Policy before you continue.", - "@Either you're a new user or the Acceptable Use Policy has changed since you last agreed to it. Please agree to the Acceptable Use Policy before you continue.": { - "description": "acceptable use policy screen description", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I agree to the Acceptable Use Policy.": "I agree to the Acceptable Use Policy.", - "@I agree to the Acceptable Use Policy.": { - "description": "acceptable use policy switch title", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "About": "About", - "@About": { - "description": "Title for about menu item in settings", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "App": "App", - "@App": { - "description": "Title for App field on about page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Login ID": "Login ID", - "@Login ID": { - "description": "Title for Login ID field on about page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Email": "Email", - "@Email": { - "description": "Title for Email field on about page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Version": "Version", - "@Version": { - "description": "Title for Version field on about page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Instructure logo": "Instructure logo", - "@Instructure logo": { - "description": "Semantics label for the Instructure logo on the about page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - } -} \ No newline at end of file diff --git a/apps/flutter_parent/lib/l10n/res/intl_mi.arb b/apps/flutter_parent/lib/l10n/res/intl_mi.arb deleted file mode 100644 index 8f5f31e169..0000000000 --- a/apps/flutter_parent/lib/l10n/res/intl_mi.arb +++ /dev/null @@ -1,2753 +0,0 @@ -{ - "@@last_modified": "2023-08-25T11:04:20.901151", - "alertsLabel": "He whakamataara", - "@alertsLabel": { - "description": "The label for the Alerts tab", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "calendarLabel": "Maramataka", - "@calendarLabel": { - "description": "The label for the Calendar tab", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "coursesLabel": "Ngā Akoranga", - "@coursesLabel": { - "description": "The label for the Courses tab", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Students": "Kāore he ākonga", - "@No Students": { - "description": "Text for when an observer has no students they are observing", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Tap to show student selector": "Pātō ki te whakātu te kaitīpako o te ākonga", - "@Tap to show student selector": { - "description": "Semantics label for the area that will show the student selector when tapped", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Tap to pair with a new student": "Pātō ki te hono me tētahi ākonga hou", - "@Tap to pair with a new student": { - "description": "Semantics label for the add student button in the student selector", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Tap to select this student": "Pātō ki te tīpako i tēnei ākonga", - "@Tap to select this student": { - "description": "Semantics label on individual students in the student switcher", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Manage Students": "Whakahaere ngā ākonga", - "@Manage Students": { - "description": "Label text for the Manage Students nav drawer button as well as the title for the Manage Students screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Help": "Āwhina", - "@Help": { - "description": "Label text for the help nav drawer button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Log Out": "Takiputa", - "@Log Out": { - "description": "Label text for the Log Out nav drawer button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Switch Users": "Whakakā ngā Kaiwhakamahi", - "@Switch Users": { - "description": "Label text for the Switch Users nav drawer button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "appVersion": "v. {version}", - "@appVersion": { - "description": "App version shown in the navigation drawer", - "type": "text", - "placeholders_order": [ - "version" - ], - "placeholders": { - "version": {} - } - }, - "Are you sure you want to log out?": "Kei te tino hiahia koe ki te takiuru atu?", - "@Are you sure you want to log out?": { - "description": "Confirmation message displayed when the user tries to log out", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Calendars": "Ngā Maramataka", - "@Calendars": { - "description": "Label for button that lets users select which calendars to display", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "nextMonth": "Marama i muri mai: {month}", - "@nextMonth": { - "description": "Label for the button that switches the calendar to the next month", - "type": "text", - "placeholders_order": [ - "month" - ], - "placeholders": { - "month": {} - } - }, - "previousMonth": "Marama o muri nei: {month}", - "@previousMonth": { - "description": "Label for the button that switches the calendar to the previous month", - "type": "text", - "placeholders_order": [ - "month" - ], - "placeholders": { - "month": {} - } - }, - "nextWeek": "Tīmata te wiki e heke mai nei {date}", - "@nextWeek": { - "description": "Label for the button that switches the calendar to the next week", - "type": "text", - "placeholders_order": [ - "date" - ], - "placeholders": { - "date": {} - } - }, - "previousWeek": "Tīmata te wiki o muri {date}", - "@previousWeek": { - "description": "Label for the button that switches the calendar to the previous week", - "type": "text", - "placeholders_order": [ - "date" - ], - "placeholders": { - "date": {} - } - }, - "selectedMonthLabel": "Marama ō {month}", - "@selectedMonthLabel": { - "description": "Accessibility label for the button that expands/collapses the month view", - "type": "text", - "placeholders_order": [ - "month" - ], - "placeholders": { - "month": {} - } - }, - "expand": "whakawhānui", - "@expand": { - "description": "Accessibility label for the on-tap hint for the button that expands/collapses the month view", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "collapse": "hinga", - "@collapse": { - "description": "Accessibility label for the on-tap hint for the button that expands/collapses the month view", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "pointsPossible": "{points} ngā koinga e taea", - "@pointsPossible": { - "description": "Screen reader label used for the points possible for an assignment, quiz, etc.", - "type": "text", - "placeholders_order": [ - "points" - ], - "placeholders": { - "points": {} - } - }, - "calendarDaySemanticsLabel": "{eventCount,plural, =1{{date}, {eventCount} takahanga}other{{date}, {eventCount} takahanga}}", - "@calendarDaySemanticsLabel": { - "description": "Screen reader label used for calendar day, reads the date and count of events", - "type": "text", - "placeholders_order": [ - "date", - "eventCount" - ], - "placeholders": { - "date": {}, - "eventCount": {} - } - }, - "No Events Today!": "Kaore he tauwhāinga i tēnei rā!", - "@No Events Today!": { - "description": "Title displayed when there are no calendar events for the current day", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "It looks like a great day to rest, relax, and recharge.": "Ko te āhua nei he rā pai ki te whakatā me te whakahou anō.", - "@It looks like a great day to rest, relax, and recharge.": { - "description": "Message displayed when there are no calendar events for the current day", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading your student's calendar": "He hapa i te wā e uta ana te maramataka a tō ākonga", - "@There was an error loading your student's calendar": { - "description": "Message displayed when calendar events could not be loaded for the current student", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Tap to favorite the courses you want to see on the Calendar. Select up to 10.": "Pātō ki te hiahia o te akoranga e hiahia ana koe ki te kite i runga i te Maramataka. Tīpakohia ki 10.", - "@Tap to favorite the courses you want to see on the Calendar. Select up to 10.": { - "description": "Description text on calendar filter screen.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You may only choose 10 calendars to display": "Me kōwhiria e koe 10 maramataka anake ki te whakātu", - "@You may only choose 10 calendars to display": { - "description": "Error text when trying to select more than 10 calendars", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You must select at least one calendar to display": "Me tīpako i te iti rawa tētahi maramataka ki te whakātu", - "@You must select at least one calendar to display": { - "description": "Error text when trying to de-select all calendars", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Planner Note": "Mahere Tuhipoka", - "@Planner Note": { - "description": "Label used for notes in the planner", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Go to today": "Haere ki te rā", - "@Go to today": { - "description": "Accessibility label used for the today button in the planner", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Previous Logins": "Ngā takiurunga o mua", - "@Previous Logins": { - "description": "Label for the list of previous user logins", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "canvasLogoLabel": "Canvas moko", - "@canvasLogoLabel": { - "description": "The semantics label for the Canvas logo", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "findSchool": "Kimihia taku kura", - "@findSchool": { - "description": "Text for the find-my-school button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "findAnotherSchool": "Kimihia tetahi atu kura", - "@findAnotherSchool": { - "description": "Text for the find-another-school button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "domainSearchInputHint": "Whakauru kura ingoa rohe rānei...", - "@domainSearchInputHint": { - "description": "Input hint for the text box on the domain search screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "noDomainResults": "Kaore e taea te kitea ngā kura ōrite \"{query}\"", - "@noDomainResults": { - "description": "Message shown to users when the domain search query did not return any results", - "type": "text", - "placeholders_order": [ - "query" - ], - "placeholders": { - "query": {} - } - }, - "domainSearchHelpLabel": "Me pehea e kitea ai e ahau taku kura rohe rānei?", - "@domainSearchHelpLabel": { - "description": "Label for the help button on the domain search screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "canvasGuides": "Canvas Kaiārahi", - "@canvasGuides": { - "description": "Proper name for the Canvas Guides. This will be used in the domainSearchHelpBody text and will be highlighted and clickable", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "canvasSupport": "Canvas Tautoko", - "@canvasSupport": { - "description": "Proper name for Canvas Support. This will be used in the domainSearchHelpBody text and will be highlighted and clickable", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "domainSearchHelpBody": "Ngana ki te rapu haere te ingoa o te kura, rohe rānei e hiahia ana koe ki te whakauru, “Smith Kura Tūmataiti” “Smith Kura Rohe” rānei. Ka taea e koe te whwkauru he Canvas rohe hāngai tonu pēnei “smith.instructure.com”.\n\nMō ētahi atu pūrongo hei rapu i tō whakanōhanga pūkete Canvas, ka taea e koe te haere ki te {canvasGuides} whakapā atu kī {canvasSupport} are whakapā ki te kura hei āwhina.", - "@domainSearchHelpBody": { - "description": "The body text shown in the help dialog on the domain search screen", - "type": "text", - "placeholders_order": [ - "canvasGuides", - "canvasSupport" - ], - "placeholders": { - "canvasGuides": {}, - "canvasSupport": {} - } - }, - "Uh oh!": "Aue!", - "@Uh oh!": { - "description": "Title of the screen that shows when a crash has occurred", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "We’re not sure what happened, but it wasn’t good. Contact us if this keeps happening.": "Kaore mātou i te tino mōhio he aha te mahi, ngari kaore i te pai. Whakapā mai ki a mātou mehemea ka mahi pēnei tonu tēnei.", - "@We’re not sure what happened, but it wasn’t good. Contact us if this keeps happening.": { - "description": "Message shown when a crash has occurred", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Contact Support": "Tautoko Whakapā", - "@Contact Support": { - "description": "Label for the button that allows users to contact support after a crash has occurred", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "View error details": "Tirohia ngā hapa taipitopito", - "@View error details": { - "description": "Label for the button that allowed users to view crash details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Restart app": "Whakamahi anō te taupanga", - "@Restart app": { - "description": "Label for the button that will restart the entire application", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Application version": "Taupānga whakāturanga", - "@Application version": { - "description": "Label for the application version displayed in the crash details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Device model": "Pūrere tauira", - "@Device model": { - "description": "Label for the device model displayed in the crash details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Android OS version": "Android OS Putanga", - "@Android OS version": { - "description": "Label for the Android operating system version displayed in the crash details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Full error message": "Nui karere Hapa", - "@Full error message": { - "description": "Label for the full error message displayed in the crash details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Inbox": "Pouakauru", - "@Inbox": { - "description": "Title for the Inbox screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading your inbox messages.": "He hapa i te wā e uta ana tō karere pouaka whakauru.", - "@There was an error loading your inbox messages.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Subject": "Kāore he Kaupapa", - "@No Subject": { - "description": "Title used for inbox messages that have no subject", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unable to fetch courses. Please check your connection and try again.": "Kaore e taea te tiki i ngā akoranga. Tēnā koa tirohia tō hononga ana ka tarai anō.", - "@Unable to fetch courses. Please check your connection and try again.": { - "description": "Message shown when an error occured while loading courses", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Choose a course to message": "Kōwhiri he akoranga hei karare", - "@Choose a course to message": { - "description": "Header in the course list shown when the user is choosing which course to associate with a new message", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Inbox Zero": "Pouakaroto Kore", - "@Inbox Zero": { - "description": "Title of the message shown when there are no inbox messages", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You’re all caught up!": "Kua mau katoa koe!", - "@You’re all caught up!": { - "description": "Subtitle of the message shown when there are no inbox messages", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading recipients for this course": "He hapa i te wā e uta ana i ngā kaiwhiwhi mo tēnei akoranga", - "@There was an error loading recipients for this course": { - "description": "Message shown when attempting to create a new message but the recipients list failed to load", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unable to send message. Check your connection and try again.": "Kaore e taea tuku Karere. Tirohia tō hononga ana ka ngana anō.", - "@Unable to send message. Check your connection and try again.": { - "description": "Message show when there was an error creating or sending a new message", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unsaved changes": "Ngā whakarerekētanga kaore i tiakina", - "@Unsaved changes": { - "description": "Title of the dialog shown when the user tries to leave with unsaved changes", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Are you sure you wish to close this page? Your unsent message will be lost.": "Kei te tino hiahia koe ki te kati i tēnei whārangi? Ka ngāro tō karere kaore anō nei i tukuna.", - "@Are you sure you wish to close this page? Your unsent message will be lost.": { - "description": "Body text of the dialog shown when the user tries leave with unsaved changes", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "New message": "Karere hōu", - "@New message": { - "description": "Title of the new-message screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Add attachment": "Tāpiri āpitihanga", - "@Add attachment": { - "description": "Tooltip for the add-attachment button in the new-message screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Send message": "Tuku karere", - "@Send message": { - "description": "Tooltip for the send-message button in the new-message screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Select recipients": "Tīpako ngā kaiwhiwhi", - "@Select recipients": { - "description": "Tooltip for the button that allows users to select message recipients", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No recipients selected": "Kaore ngā kaiwhiwhi i tīpakohia", - "@No recipients selected": { - "description": "Hint displayed when the user has not selected any message recipients", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Message subject": "Kaupapa karere", - "@Message subject": { - "description": "Hint text displayed in the input field for the message subject", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Message": "Karere", - "@Message": { - "description": "Hint text displayed in the input field for the message body", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Recipients": "Ngā Kaiwhiwhi", - "@Recipients": { - "description": "Label for message recipients", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "plusRecipientCount": "+{count}", - "@plusRecipientCount": { - "description": "Shows the number of recipients that are selected but not displayed on screen.", - "type": "text", - "placeholders_order": [ - "count" - ], - "placeholders": { - "count": { - "example": 5 - } - } - }, - "Failed. Tap for options.": "I hapa. Pātō mo ngā kōwhiringa.", - "@Failed. Tap for options.": { - "description": "Short message shown on a message attachment when uploading has failed", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "courseForWhom": "mo {studentShortName}", - "@courseForWhom": { - "description": "Describes for whom a course is for (i.e. for Bill)", - "type": "text", - "placeholders_order": [ - "studentShortName" - ], - "placeholders": { - "studentShortName": {} - } - }, - "messageLinkPostscript": "E pā ana: {studentName}, {linkUrl}", - "@messageLinkPostscript": { - "description": "A postscript appended to new messages that clarifies which student is the subject of the message and also includes a URL for the related Canvas component (course, assignment, event, etc).", - "type": "text", - "placeholders_order": [ - "studentName", - "linkUrl" - ], - "placeholders": { - "studentName": {}, - "linkUrl": {} - } - }, - "There was an error loading this conversation": "He hapa i te wā e uta ana i tēnei kōrerorero", - "@There was an error loading this conversation": { - "description": "Message shown when a conversation fails to load", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Reply": "Whakautu", - "@Reply": { - "description": "Button label for replying to a conversation", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Reply All": "Whakautu ki te katoa", - "@Reply All": { - "description": "Button label for replying to all conversation participants", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unknown User": "Kaiwhakamahi kaore e mōhiotia", - "@Unknown User": { - "description": "Label used where the user name is not known", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "me": "ahau", - "@me": { - "description": "First-person pronoun (i.e. 'me') that will be used in message author info, e.g. 'Me to 4 others' or 'Jon Snow to me'", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "authorToRecipient": "{authorName} ki te {recipientName}", - "@authorToRecipient": { - "description": "Author info for a single-recipient message; includes both the author name and the recipient name.", - "type": "text", - "placeholders_order": [ - "authorName", - "recipientName" - ], - "placeholders": { - "authorName": {}, - "recipientName": {} - } - }, - "authorToNOthers": "{howMany,plural, =1{{authorName} ki 1 tētahi atu}other{{authorName} kī {howMany} ētahi atu}}", - "@authorToNOthers": { - "description": "Author info for a mutli-recipient message; includes the author name and the number of recipients", - "type": "text", - "placeholders_order": [ - "authorName", - "howMany" - ], - "placeholders": { - "authorName": {}, - "howMany": {} - } - }, - "authorToRecipientAndNOthers": "{howMany,plural, =1{{authorName} kī {recipientName} & 1 tētahi atu}other{{authorName} kī {recipientName} & {howMany} ētahi atu}}", - "@authorToRecipientAndNOthers": { - "description": "Author info for a multi-recipient message; includes the author name, one recipient name, and the number of other recipients", - "type": "text", - "placeholders_order": [ - "authorName", - "recipientName", - "howMany" - ], - "placeholders": { - "authorName": {}, - "recipientName": {}, - "howMany": {} - } - }, - "Download": "Tikiake", - "@Download": { - "description": "Label for the button that will begin downloading a file", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Open with another app": "Tuwhera me tētahi atu taupānga", - "@Open with another app": { - "description": "Label for the button that will allow users to open a file with another app", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There are no installed applications that can open this file": "Kaore he taupānga kua whakaurutia ka taea te huaki i tēnei kōnae", - "@There are no installed applications that can open this file": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unsupported File": "Kaore e tautokotia kōnae", - "@Unsupported File": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "This file is unsupported and can’t be viewed through the app": "Kaore tēnei konae i te tautokotia ana kaore e taea te kitea ma te taupānga", - "@This file is unsupported and can’t be viewed through the app": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unable to play this media file": "Kaore e taea te whakamahi i tēnei kōnae Pāpāho", - "@Unable to play this media file": { - "description": "Message shown when audio or video media could not be played", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unable to load this image": "Kaore e taea te uta tēnei āhua", - "@Unable to load this image": { - "description": "Message shown when an image file could not be loaded or displayed", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading this file": "He hapa i te wā e uta ana i tēnei kōnae", - "@There was an error loading this file": { - "description": "Message shown when a file could not be loaded or displayed", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Courses": "Kāore he Akoranga", - "@No Courses": { - "description": "Title for having no courses", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Your student’s courses might not be published yet.": "Kaore e pānuitia ō ākonga akoranga i tēnei wā.", - "@Your student’s courses might not be published yet.": { - "description": "Message for having no courses", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading your student’s courses.": "He hapa i te wā e uta ana i tō ākonga akoranga.", - "@There was an error loading your student’s courses.": { - "description": "Message displayed when the list of student courses could not be loaded", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Grade": "Kaore he Kōeke", - "@No Grade": { - "description": "Message shown when there is currently no grade available for a course", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Filter by": "Tātari mā", - "@Filter by": { - "description": "Title for list of terms to filter grades by", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Grades": "Ngā Kōeke", - "@Grades": { - "description": "Label for the \"Grades\" tab in course details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Syllabus": "Marautanga", - "@Syllabus": { - "description": "Label for the \"Syllabus\" tab in course details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Front Page": "Whārangi mua", - "@Front Page": { - "description": "Label for the \"Front Page\" tab in course details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Summary": "Whakarāpopototanga", - "@Summary": { - "description": "Label for the \"Summary\" tab in course details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Send a message about this course": "Tukuna he karere mō tēnei akoranga", - "@Send a message about this course": { - "description": "Accessibility hint for the course messaage floating action button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Total Grade": "Kōeke Tapeke", - "@Total Grade": { - "description": "Label for the total grade in the course", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Graded": "Kōekehia", - "@Graded": { - "description": "Label for assignments that have been graded", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Submitted": "Kua Tukuna", - "@Submitted": { - "description": "Label for assignments that have been submitted", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Not Submitted": "E Kore E Tukua", - "@Not Submitted": { - "description": "Label for assignments that have not been submitted", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Late": "Tūreiti", - "@Late": { - "description": "Label for assignments that have been marked late or submitted late", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Missing": "Ngaro", - "@Missing": { - "description": "Label for assignments that have been marked missing or are not submitted and past the due date", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "-": "-", - "@-": { - "description": "Value representing no score for student submission", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "All Grading Periods": "Takiwā kōeke katoa", - "@All Grading Periods": { - "description": "Label for selecting all grading periods", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Assignments": "Kaore ngā whakataunga", - "@No Assignments": { - "description": "Title for the no assignments message", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "It looks like assignments haven't been created in this space yet.": "Ko te āhua nei kaore ngā whakataunga i hāngaia i roto i tēnei wāhi.", - "@It looks like assignments haven't been created in this space yet.": { - "description": "Message for no assignments", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading the summary details for this course.": "He hapa i te wā e uta ana i ngā taipitopito whakarāpopotanga mo tēnei akoranga.", - "@There was an error loading the summary details for this course.": { - "description": "Message shown when the course summary could not be loaded", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Summary": "Kaore he Whakarāpopototanga", - "@No Summary": { - "description": "Title displayed when there are no items in the course summary", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "This course does not have any assignments or calendar events yet.": "Kaore he whakataunga mo tēnei akoranga ara maramataka tauwhainga rānei i tēnei wā.", - "@This course does not have any assignments or calendar events yet.": { - "description": "Message displayed when there are no items in the course summary", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "gradeFormatScoreOutOfPointsPossible": "{score} / {pointsPossible}", - "@gradeFormatScoreOutOfPointsPossible": { - "description": "Formatted string for a student score out of the points possible", - "type": "text", - "placeholders_order": [ - "score", - "pointsPossible" - ], - "placeholders": { - "score": {}, - "pointsPossible": {} - } - }, - "contentDescriptionScoreOutOfPointsPossible": "{score} waho ō {pointsPossible} ngā koinga", - "@contentDescriptionScoreOutOfPointsPossible": { - "description": "Formatted string for a student score out of the points possible", - "type": "text", - "placeholders_order": [ - "score", - "pointsPossible" - ], - "placeholders": { - "score": {}, - "pointsPossible": {} - } - }, - "gradesSubjectMessage": "E pā ana: {studentName}, Ngā Kōeke", - "@gradesSubjectMessage": { - "description": "The subject line for a message to a teacher regarding a student's grades", - "type": "text", - "placeholders_order": [ - "studentName" - ], - "placeholders": { - "studentName": {} - } - }, - "syllabusSubjectMessage": "E pā ana: {studentName}, Marautanga", - "@syllabusSubjectMessage": { - "description": "The subject line for a message to a teacher regarding a course syllabus", - "type": "text", - "placeholders_order": [ - "studentName" - ], - "placeholders": { - "studentName": {} - } - }, - "frontPageSubjectMessage": "E pā ana: {studentName}, Whārangi Mua", - "@frontPageSubjectMessage": { - "description": "The subject line for a message to a teacher regarding a course front page", - "type": "text", - "placeholders_order": [ - "studentName" - ], - "placeholders": { - "studentName": {} - } - }, - "assignmentSubjectMessage": "E pā ana: {studentName}, Whakataunga: {assignmentName}", - "@assignmentSubjectMessage": { - "description": "The subject line for a message to a teacher regarding a student's assignment", - "type": "text", - "placeholders_order": [ - "studentName", - "assignmentName" - ], - "placeholders": { - "studentName": {}, - "assignmentName": {} - } - }, - "eventSubjectMessage": "E pā ana: {studentName}, Tawhainga: {eventTitle}", - "@eventSubjectMessage": { - "description": "The subject line for a message to a teacher regarding a calendar event", - "type": "text", - "placeholders_order": [ - "studentName", - "eventTitle" - ], - "placeholders": { - "studentName": {}, - "eventTitle": {} - } - }, - "There is no page information available.": "Kāore he mōhiohio whārangi e wātea ana.", - "@There is no page information available.": { - "description": "Description for when no page information is available", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Assignment Details": "Taipitopito whakataunga", - "@Assignment Details": { - "description": "Title for the page that shows details for an assignment", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "assignmentTotalPoints": "{points} ngā koinga", - "@assignmentTotalPoints": { - "description": "Label used for the total points the assignment is worth", - "type": "text", - "placeholders_order": [ - "points" - ], - "placeholders": { - "points": {} - } - }, - "assignmentTotalPointsAccessible": "{points} ngā koinga", - "@assignmentTotalPointsAccessible": { - "description": "Screen reader label used for the total points the assignment is worth", - "type": "text", - "placeholders_order": [ - "points" - ], - "placeholders": { - "points": {} - } - }, - "Due": "E tika ana", - "@Due": { - "description": "Label for an assignment due date", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Grade": "Kōeke", - "@Grade": { - "description": "Label for the section that displays an assignment's grade", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Locked": "Kua rakaina", - "@Locked": { - "description": "Label for when an assignment is locked", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "assignmentLockedModule": "Kua rakaina tō whakataunga e te kōwai \"{moduleName}\".", - "@assignmentLockedModule": { - "description": "The locked description when an assignment is locked by a module", - "type": "text", - "placeholders_order": [ - "moduleName" - ], - "placeholders": { - "moduleName": {} - } - }, - "Remind Me": "Whakamaumahara mai ki au", - "@Remind Me": { - "description": "Label for the row to set reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Set a date and time to be notified of this specific assignment.": "Whakatau he rā me te wā hei whakamōhiotia mo tēnei whakataunga ake.", - "@Set a date and time to be notified of this specific assignment.": { - "description": "Description for row to set reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You will be notified about this assignment on…": "Ka whakamōhiotia koe mo tēnei whakataunga i runga i...", - "@You will be notified about this assignment on…": { - "description": "Description for when a reminder is set", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Instructions": "Ngā Tohutohu", - "@Instructions": { - "description": "Label for the description of the assignment when it has quiz instructions", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Send a message about this assignment": "Tukuna he karere mō tēnei whakataunga", - "@Send a message about this assignment": { - "description": "Accessibility hint for the assignment messaage floating action button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "This app is not authorized for use.": "Kaore e mana tēnei taupānga ki te whakamahi.", - "@This app is not authorized for use.": { - "description": "The error shown when the app being used is not verified by Canvas", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The server you entered is not authorized for this app.": "E kore te tūmau kua whakauru koe te mana mo tenei taupānga.", - "@The server you entered is not authorized for this app.": { - "description": "The error shown when the desired login domain is not verified by Canvas", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The user agent for this app is not authorized.": "Te kaihoko kaiwhakamahi mo tenei taupānga kaore i manatia.", - "@The user agent for this app is not authorized.": { - "description": "The error shown when the user agent during verification is not verified by Canvas", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "We were unable to verify the server for use with this app.": "I taea e mātou ki te manatoko i te tūmau mō te whakamahi ki tenei taupānga matou.", - "@We were unable to verify the server for use with this app.": { - "description": "The generic error shown when we are unable to verify with Canvas", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Reminders": "Ngā Whakamaumahara", - "@Reminders": { - "description": "Name of the system notification channel for assignment and event reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Notifications for reminders about assignments and calendar events": "Ngā whakamōhiotanga mo ngā whakataunga me ngā tauwhāinga māramataka", - "@Notifications for reminders about assignments and calendar events": { - "description": "Description of the system notification channel for assignment and event reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Reminders have changed!": "Kua huria ngā Maumahara!", - "@Reminders have changed!": { - "description": "Title of the dialog shown when the user needs to update their reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "In order to provide you with a better experience, we have updated how reminders work. You can add new reminders by viewing an assignment or calendar event and tapping the switch under the \"Remind Me\" section.\n\nBe aware that any reminders created with older versions of this app will not be compatible with the new changes and you will need to create them again.": "I roto i te hoatu atu ki a koe he wheako pai, kua whakahoutia e mātou te whakamahi te pēhea te mahi ngā maumahara. Ka taea e koe te tāpiri maumahara hou ma te titiro he whakataunga ara maramataka Tauwhāinga rānei me te pātō te huringa i raro i te \"Maumahara Ahau\" wāhanga.\n\nKia matāra ngā mauamahara kua hangatia mai ngā wāhanga tawhito o tēnei taupānga kaore e uru atu ki ngā huringa hou ana me hanga e koe anō.", - "@In order to provide you with a better experience, we have updated how reminders work. You can add new reminders by viewing an assignment or calendar event and tapping the switch under the \"Remind Me\" section.\n\nBe aware that any reminders created with older versions of this app will not be compatible with the new changes and you will need to create them again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Not a parent?": "Kaore i te matua?", - "@Not a parent?": { - "description": "Title for the screen that shows when the user is not observing any students", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "We couldn't find any students associated with this account": "Kaore i kitea e mātou ngā ākonga e hono ana ki tēnei pūkete", - "@We couldn't find any students associated with this account": { - "description": "Subtitle for the screen that shows when the user is not observing any students", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Are you a student or teacher?": "He ākonga he kaiako rānei koe?", - "@Are you a student or teacher?": { - "description": "Label for button that will show users the option to view other Canvas apps in the Play Store", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "One of our other apps might be a better fit. Tap one to visit the Play Store.": "Ko tētahi atu o a mātou taupānga pea he pai ake te uru. Pātō kotahi ki te toro atu ki te Toa Tākaro.", - "@One of our other apps might be a better fit. Tap one to visit the Play Store.": { - "description": "Description of options to view other Canvas apps in the Play Store", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Return to Login": "Hoki ki te takiuru", - "@Return to Login": { - "description": "Label for the button that returns the user to the login screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "STUDENT": "ĀKONGA", - "@STUDENT": { - "description": "The \"student\" portion of the \"Canvas Student\" app name, in all caps. \"Canvas\" is excluded in this context as it will be displayed to the user as a wordmark image", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "TEACHER": "KAIAKO", - "@TEACHER": { - "description": "The \"teacher\" portion of the \"Canvas Teacher\" app name, in all caps. \"Canvas\" is excluded in this context as it will be displayed to the user as a wordmark image", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Canvas Student": "Canvas Ākonga", - "@Canvas Student": { - "description": "The name of the Canvas Student app. Only \"Student\" should be translated as \"Canvas\" is a brand name in this context and should not be translated.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Canvas Teacher": "Canvas Kaiako", - "@Canvas Teacher": { - "description": "The name of the Canvas Teacher app. Only \"Teacher\" should be translated as \"Canvas\" is a brand name in this context and should not be translated.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Alerts": "Kaore he whakamataara", - "@No Alerts": { - "description": "The title for the empty message to show to users when there are no alerts for the student.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There’s nothing to be notified of yet.": "Kaore he mea hei whakamōhio i tēnei wā.", - "@There’s nothing to be notified of yet.": { - "description": "The empty message to show to users when there are no alerts for the student.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "dismissAlertLabel": "Whakakore {alertTitle}", - "@dismissAlertLabel": { - "description": "Accessibility label to dismiss an alert", - "type": "text", - "placeholders_order": [ - "alertTitle" - ], - "placeholders": { - "alertTitle": {} - } - }, - "Course Announcement": "Akoranga Pānuitanga", - "@Course Announcement": { - "description": "Title for alerts when there is a course announcement", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Institution Announcement": "Pānuitanga o te Whakanōhanga", - "@Institution Announcement": { - "description": "Title for alerts when there is an institution announcement", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "assignmentGradeAboveThreshold": "Kōeke Whakataunga Runga {threshold}", - "@assignmentGradeAboveThreshold": { - "description": "Title for alerts when an assignment grade is above the threshold value", - "type": "text", - "placeholders_order": [ - "threshold" - ], - "placeholders": { - "threshold": {} - } - }, - "assignmentGradeBelowThreshold": "Kōeke Whakataunga Raro {threshold}", - "@assignmentGradeBelowThreshold": { - "description": "Title for alerts when an assignment grade is below the threshold value", - "type": "text", - "placeholders_order": [ - "threshold" - ], - "placeholders": { - "threshold": {} - } - }, - "courseGradeAboveThreshold": "Kōeke Akoranga Runga {threshold}", - "@courseGradeAboveThreshold": { - "description": "Title for alerts when a course grade is above the threshold value", - "type": "text", - "placeholders_order": [ - "threshold" - ], - "placeholders": { - "threshold": {} - } - }, - "courseGradeBelowThreshold": "Kōeke Akoranga Raro {threshold}", - "@courseGradeBelowThreshold": { - "description": "Title for alerts when a course grade is below the threshold value", - "type": "text", - "placeholders_order": [ - "threshold" - ], - "placeholders": { - "threshold": {} - } - }, - "Settings": "Ngā Tautuhinga", - "@Settings": { - "description": "Title for the settings screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Theme": "Kaupapa", - "@Theme": { - "description": "Label for the light/dark theme section in the settings page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Dark Mode": "Aratau Pouri", - "@Dark Mode": { - "description": "Label for the button that enables dark mode", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Light Mode": "Aratau Mārama", - "@Light Mode": { - "description": "Label for the button that enables light mode", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "High Contrast Mode": "Pūrata nui Aratau", - "@High Contrast Mode": { - "description": "Label for the switch that toggles high contrast mode", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Use Dark Theme in Web Content": "Whakamahia Kaupapa Pouri i roto i te Ipurangi Ihirangi", - "@Use Dark Theme in Web Content": { - "description": "Label for the switch that toggles dark mode for webviews", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Appearance": "Āhua", - "@Appearance": { - "description": "Label for the appearance section in the settings page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Successfully submitted!": "Oti pai te tuku!", - "@Successfully submitted!": { - "description": "Title displayed in the grade cell for an assignment that has been submitted", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "submissionStatusSuccessSubtitle": "I tukuna tēnei whakataunga i runga i {date} kī {time} ana kei te tatari ki te kōeketia", - "@submissionStatusSuccessSubtitle": { - "description": "Subtitle displayed in the grade cell for an assignment that has been submitted and is awaiting a grade", - "type": "text", - "placeholders_order": [ - "date", - "time" - ], - "placeholders": { - "date": {}, - "time": {} - } - }, - "outOfPoints": "{howMany,plural, =1{I waho i te 1 koinga}other{I waho i te {points} ngā kōinga}}", - "@outOfPoints": { - "description": "Description for an assignment grade that has points without a current scoroe", - "type": "text", - "placeholders_order": [ - "points", - "howMany" - ], - "placeholders": { - "points": {}, - "howMany": {} - } - }, - "Excused": "Whakawātea", - "@Excused": { - "description": "Grading status for an assignment marked as excused", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Complete": "Oti", - "@Complete": { - "description": "Grading status for an assignment marked as complete", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Incomplete": "Kaore i te oti", - "@Incomplete": { - "description": "Grading status for an assignment marked as incomplete", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "minus": "tango", - "@minus": { - "description": "Screen reader-friendly replacement for the \"-\" character in letter grades like \"A-\"", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "latePenalty": "Whiu tōmuri (-{pointsLost})", - "@latePenalty": { - "description": "Text displayed when a late penalty has been applied to the assignment", - "type": "text", - "placeholders_order": [ - "pointsLost" - ], - "placeholders": { - "pointsLost": {} - } - }, - "finalGrade": "Kōeke whakamutunga: {grade}", - "@finalGrade": { - "description": "Text that displays the final grade of an assignment", - "type": "text", - "placeholders_order": [ - "grade" - ], - "placeholders": { - "grade": {} - } - }, - "Alert Settings": "Matohi Tautuhinga", - "@Alert Settings": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Alert me when…": "Matohi ahau ina...", - "@Alert me when…": { - "description": "Header for the screen where the observer chooses the thresholds that will determine when they receive alerts (e.g. when an assignment is graded below 70%)", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Course grade below": "Kōeke akoranga i raro", - "@Course grade below": { - "description": "Label describing the threshold for when the course grade is below a certain percentage", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Course grade above": "Kōeke akoranga i runga", - "@Course grade above": { - "description": "Label describing the threshold for when the course grade is above a certain percentage", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Assignment missing": "E ngaro ana whakataunga", - "@Assignment missing": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Assignment grade below": "Kōeke whakataunga raro", - "@Assignment grade below": { - "description": "Label describing the threshold for when an assignment is graded below a certain percentage", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Assignment grade above": "Kōeke whakataunga runga", - "@Assignment grade above": { - "description": "Label describing the threshold for when an assignment is graded above a certain percentage", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Course Announcements": "Pānuitanga Akoranga", - "@Course Announcements": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Institution Announcements": "Whaaknōhanga pānutianga", - "@Institution Announcements": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Never": "Kaua rawa", - "@Never": { - "description": "Indication that tells the user they will not receive alert notifications of a specific kind", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Grade percentage": "Kōeke pai hēneti", - "@Grade percentage": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading your student's alerts.": "He hapa i te wā e uta ana ngā matohi a tō ākonga.", - "@There was an error loading your student's alerts.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Must be below 100": "Me raro iho i te 100", - "@Must be below 100": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "mustBeBelowN": "Me raro iho {percentage}", - "@mustBeBelowN": { - "description": "Validation error to the user that they must choose a percentage below 'n'", - "type": "text", - "placeholders_order": [ - "percentage" - ], - "placeholders": { - "percentage": { - "example": 5 - } - } - }, - "mustBeAboveN": "Me runga ake {percentage}", - "@mustBeAboveN": { - "description": "Validation error to the user that they must choose a percentage above 'n'", - "type": "text", - "placeholders_order": [ - "percentage" - ], - "placeholders": { - "percentage": { - "example": 5 - } - } - }, - "Select Student Color": "Tīpakohia te Ākonga Rōpū", - "@Select Student Color": { - "description": "Title for screen that allows users to assign a color to a specific student", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Electric, blue": "Hikohiko, Kahurangi", - "@Electric, blue": { - "description": "Name of the Electric (blue) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Plum, Purple": "Paramū, Waiporoporo", - "@Plum, Purple": { - "description": "Name of the Plum (purple) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Barney, Fuschia": "Barney, Ngenge", - "@Barney, Fuschia": { - "description": "Name of the Barney (fuschia) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Raspberry, Red": "Rāpere, Whero", - "@Raspberry, Red": { - "description": "Name of the Raspberry (red) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Fire, Orange": "Ahi, Ārani", - "@Fire, Orange": { - "description": "Name of the Fire (orange) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Shamrock, Green": "Rangirua, Kākariki", - "@Shamrock, Green": { - "description": "Name of the Shamrock (green) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "An error occurred while saving your selection. Please try again.": "He hapa i puta i te wā e tiaki ana i tō tīpako. Tēnā koa ngana anō.", - "@An error occurred while saving your selection. Please try again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "changeStudentColorLabel": "Huria tae mō {studentName}", - "@changeStudentColorLabel": { - "description": "Accessibility label for the button that lets users change the color associated with a specific student", - "type": "text", - "placeholders_order": [ - "studentName" - ], - "placeholders": { - "studentName": {} - } - }, - "Teacher": "Kaiako", - "@Teacher": { - "description": "Label for the Teacher enrollment type", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Student": "Ākonga", - "@Student": { - "description": "Label for the Student enrollment type", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "TA": "TA", - "@TA": { - "description": "Label for the Teaching Assistant enrollment type (also known as Teacher Aid or Education Assistant), reduced to a short acronym/initialism if appropriate.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Observer": "Kaimātakitaki", - "@Observer": { - "description": "Label for the Observer enrollment type", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Use Camera": "Whakamahi te Kāmera", - "@Use Camera": { - "description": "Label for the action item that lets the user capture a photo using the device camera", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Upload File": "Tukuake Kōnae", - "@Upload File": { - "description": "Label for the action item that lets the user upload a file from their device", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Choose from Gallery": "Kōwhiri mai i te Taiwhanga", - "@Choose from Gallery": { - "description": "Label for the action item that lets the user select a photo from their device gallery", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Preparing…": "E whakareri ana...", - "@Preparing…": { - "description": "Message shown while a file is being prepared to attach to a message", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Add student with…": "Tapiri ākonga me...", - "@Add student with…": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Add Student": "Tapiri Ākonga", - "@Add Student": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You are not observing any students.": "Kaore koe e tirotiro ana ētahi ākonga.", - "@You are not observing any students.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading your students.": "He hapa i te wā e uta ana i ō ākonga.", - "@There was an error loading your students.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Pairing Code": "Waihere Hono", - "@Pairing Code": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Students can obtain a pairing code through the Canvas website": "Ka taea e ngā ākonga te tiki waihere hono ma te mahi i te Canvas nipurangi", - "@Students can obtain a pairing code through the Canvas website": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Enter the student pairing code provided to you. If the pairing code doesn't work, it may have expired": "Whakauru te ākonga waihere hono kua tukuna atu ki a koe. Mehema kaore te waihere hono e mahi; kua pau pea te wā", - "@Enter the student pairing code provided to you. If the pairing code doesn't work, it may have expired": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Your code is incorrect or expired.": "Kei te hē kua pau rānei tō waihere.", - "@Your code is incorrect or expired.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Something went wrong trying to create your account, please reach out to your school for assistance.": "I raruraru tētahi mea i te wā e ngāna ana ki te hanga i tō pūkete; tēnā koa toro atu ki tō kura hei āwhina.", - "@Something went wrong trying to create your account, please reach out to your school for assistance.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "QR Code": "QR Waehere", - "@QR Code": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Students can create a QR code using the Canvas Student app on their mobile device": "Ka taea e ng aākonga te hanga he QR waehere ma te mahi i te Canvas Ākonga Taupanga i runga i tā rātou taonga haerēre", - "@Students can create a QR code using the Canvas Student app on their mobile device": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Add new student": "Tāpiri ākonga hou", - "@Add new student": { - "description": "Semantics label for the FAB on the Manage Students Screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Select": "Tīpakohia", - "@Select": { - "description": "Hint text to tell the user to choose one of two options", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I have a Canvas account": "He Pūkete Canvas tāku", - "@I have a Canvas account": { - "description": "Option to select for users that have a canvas account", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I don't have a Canvas account": "Kaore he pūkete Canvas tāku", - "@I don't have a Canvas account": { - "description": "Option to select for users that don't have a canvas account", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Create Account": "Waihanga Pūkete", - "@Create Account": { - "description": "Button text for account creation confirmation", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Full Name": "Ingoa Katoa", - "@Full Name": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Email Address": "Īmēra Wāhitau", - "@Email Address": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Password": "Kupuhipa", - "@Password": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Full Name…": "Ingoa Katoa ...", - "@Full Name…": { - "description": "hint label for inside form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Email…": "Īmēra ...", - "@Email…": { - "description": "hint label for inside form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Password…": "Kupuhipa ...", - "@Password…": { - "description": "hint label for inside form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Please enter full name": "Tēnā koa whakauru he ingoa hou.tonu", - "@Please enter full name": { - "description": "Error message for form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Please enter an email address": "Tēnā koa whakauru he īmēra wāhitau", - "@Please enter an email address": { - "description": "Error message for form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Please enter a valid email address": "Tēnā koa whakauru he īmēra wāhitau whiwhi mana", - "@Please enter a valid email address": { - "description": "Error message for form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Password is required": "E hiahiatia naa te kupuhipa", - "@Password is required": { - "description": "Error message for form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Password must contain at least 8 characters": "Me mau te kupuhipa iti atu i te 8 ngā pūāhua", - "@Password must contain at least 8 characters": { - "description": "Error message for form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "qrCreateAccountTos": "Ma te patopato i 'Hanga Pūkete', e whakāe ana koe ki te {termsOfService} me te whakamihi te {privacyPolicy}", - "@qrCreateAccountTos": { - "description": "The text show on the account creation screen", - "type": "text", - "placeholders_order": [ - "termsOfService", - "privacyPolicy" - ], - "placeholders": { - "termsOfService": {}, - "privacyPolicy": {} - } - }, - "Terms of Service": "Ngā Ture o te Ratonga", - "@Terms of Service": { - "description": "Label for the Canvas Terms of Service agreement. This will be used in the qrCreateAccountTos text and will be highlighted and clickable", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Privacy Policy": "Kaupapahere Tūmataiti", - "@Privacy Policy": { - "description": "Label for the Canvas Privacy Policy agreement. This will be used in the qrCreateAccountTos text and will be highlighted and clickable", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "View the Privacy Policy": "Tirohia te Kaupapahere Tūmataiti", - "@View the Privacy Policy": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Already have an account? ": "He pūkete tāū? ", - "@Already have an account? ": { - "description": "Part of multiline text span, includes AccountSignIn1-2, in that order", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Sign In": "Waitohu I roto i", - "@Sign In": { - "description": "Part of multiline text span, includes AccountSignIn1-2, in that order", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Hide Password": "Huna Kupuhipa", - "@Hide Password": { - "description": "content description for password hide button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Show Password": "Whakatu Kupuhipa", - "@Show Password": { - "description": "content description for password show button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Terms of Service Link": "Ngā Ture o te Ratonga Hono", - "@Terms of Service Link": { - "description": "content description for terms of service link", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Privacy Policy Link": "Kaupapahere Tūmataiti Hono", - "@Privacy Policy Link": { - "description": "content description for privacy policy link", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Event": "Tauwhāinga", - "@Event": { - "description": "Title for the event details screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Date": "Rā", - "@Date": { - "description": "Label for the event date", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Location": "Wāhi", - "@Location": { - "description": "Label for the location information", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Location Specified": "Tauwhāititia Kāore he Wāhi", - "@No Location Specified": { - "description": "Description for events that do not have a location", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "eventTime": "{startAt} - {endAt}", - "@eventTime": { - "description": "The time the event is happening, example: \"2:00 pm - 4:00 pm\"", - "type": "text", - "placeholders_order": [ - "startAt", - "endAt" - ], - "placeholders": { - "startAt": {}, - "endAt": {} - } - }, - "Set a date and time to be notified of this event.": "Whakatau he rā me te wā hei whakamōhiotia mo tēnei tauwhainga.", - "@Set a date and time to be notified of this event.": { - "description": "Description for row to set event reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You will be notified about this event on…": "Ka whakamōhiotia koe mo tēnei tauwhainga i runga i...", - "@You will be notified about this event on…": { - "description": "Description for when an event reminder is set", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Share Your Love for the App": "Tuari Tō Aroha mō te Taupānga", - "@Share Your Love for the App": { - "description": "Label for option to open the app store", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Tell us about your favorite parts of the app": "Korerotia mai ki a matou ngā wahi tino makau o te taupānga ki a koe", - "@Tell us about your favorite parts of the app": { - "description": "Description for option to open the app store", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Legal": "Ture", - "@Legal": { - "description": "Label for legal information option", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Privacy policy, terms of use, open source": "Kaupapahere tūmataitinga, tikanga whakamahi, puna tuwhera", - "@Privacy policy, terms of use, open source": { - "description": "Description for legal information option", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Idea for Canvas Parent App [Android]": "Whakaaro mō te Taupānga Canvas Matua [Android]", - "@Idea for Canvas Parent App [Android]": { - "description": "The subject for the email to request a feature", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The following information will help us better understand your idea:": "Ka awhinatia mātou ki te mōhio i tō whakāro i ngā mōhiohio e whai ake nei:", - "@The following information will help us better understand your idea:": { - "description": "The header for the users information that is attached to a feature request", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Domain:": "Rohe:", - "@Domain:": { - "description": "The label for the Canvas domain of the logged in user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "User ID:": "ID Kaiwhakamahi:", - "@User ID:": { - "description": "The label for the Canvas user ID of the logged in user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Email:": "Īmēra:", - "@Email:": { - "description": "The label for the eamil of the logged in user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Locale:": "Tauwāhi:", - "@Locale:": { - "description": "The label for the locale of the logged in user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Terms of Use": "Ngā ritenga whakamahi", - "@Terms of Use": { - "description": "Label for the terms of use", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Canvas on GitHub": "Canvas i runga GitHub", - "@Canvas on GitHub": { - "description": "Label for the button that opens the Canvas project on GitHub's website", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was a problem loading the Terms of Use": "He raruraru i te wā e uta ana i ngā Ture Whakamahia", - "@There was a problem loading the Terms of Use": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Device": "Pūrere", - "@Device": { - "description": "Label used for device manufacturer/model in the error report", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "OS Version": "OS Putanga", - "@OS Version": { - "description": "Label used for device operating system version in the error report", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Version Number": "Whakāturanga Tau", - "@Version Number": { - "description": "Label used for the app version number in the error report", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Report A Problem": "Pūrongo te raruraru", - "@Report A Problem": { - "description": "Title used for generic dialog to report problems", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Subject": "Kaupapa", - "@Subject": { - "description": "Label used for Subject text field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "A subject is required.": "He kaupapa e hiahiatia ana.", - "@A subject is required.": { - "description": "Error shown when the subject field is empty", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "An email address is required.": "He whakaaturanga e hiahiatia ana.", - "@An email address is required.": { - "description": "Error shown when the email field is empty", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Description": "Whakāhuatanga", - "@Description": { - "description": "Label used for Description text field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "A description is required.": "E hiahia ana he whakāturanga.", - "@A description is required.": { - "description": "Error shown when the description field is empty", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "How is this affecting you?": "Kia pehea e pa ana tenei ki a koe?", - "@How is this affecting you?": { - "description": "Label used for the dropdown to select how severe the issue is", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "send": "tukua", - "@send": { - "description": "Label used for send button when reporting a problem", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Just a casual question, comment, idea, suggestion…": "He pātai tüao, kōrero, whakāro, whakāro pūaki...", - "@Just a casual question, comment, idea, suggestion…": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I need some help but it's not urgent.": "E hiahia ana ahau ētahi awhina ēngari e kore te kōhukihuki.", - "@I need some help but it's not urgent.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Something's broken but I can work around it to get what I need done.": "Kua pakaru tētahi mea ēngari ka taea e ahau te mahi a tawhio noa ki a oti ai ngā mea e hiahia ana ahau.", - "@Something's broken but I can work around it to get what I need done.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I can't get things done until I hear back from you.": "Kaore e taea e ahau te whakaoti ki a hoki rongo rānō ahau mai ia koe.", - "@I can't get things done until I hear back from you.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "EXTREME CRITICAL EMERGENCY!!": "TINO URUPARE NUI!!", - "@EXTREME CRITICAL EMERGENCY!!": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Not Graded": "Kāore i kōekehia", - "@Not Graded": { - "description": "Description for an assignment has not been graded.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Login flow: Normal": "Rere o te takiuru: Noa", - "@Login flow: Normal": { - "description": "Description for the normal login flow", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Login flow: Canvas": "Rere o te takiuru: Canvas", - "@Login flow: Canvas": { - "description": "Description for the Canvas login flow", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Login flow: Site Admin": "Rere o te takiuru: Pae Whakahaere", - "@Login flow: Site Admin": { - "description": "Description for the Site Admin login flow", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Login flow: Skip mobile verify": "Rere o te takiuru: Peke tautoko i te waea haerēre", - "@Login flow: Skip mobile verify": { - "description": "Description for the login flow that skips domain verification for mobile", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Act As User": "Mahi Rite Kaiwhakamahi", - "@Act As User": { - "description": "Label for the button that allows the user to act (masquerade) as another user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Stop Acting as User": "Kati te mahi rite tonu i te kaiwhakamahi", - "@Stop Acting as User": { - "description": "Label for the button that allows the user to stop acting (masquerading) as another user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "actingAsUser": "Kei te mahi koe pēnei {userName}", - "@actingAsUser": { - "description": "Message shown while acting (masquerading) as another user", - "type": "text", - "placeholders_order": [ - "userName" - ], - "placeholders": { - "userName": {} - } - }, - "\"Act as\" is essentially logging in as this user without a password. You will be able to take any action as if you were this user, and from other users' points of views, it will be as if this user performed them. However, audit logs record that you were the one who performed the actions on behalf of this user.": "\"Ko te Mahi hei\" kei te takiuru tēnei kaiwhakamahi me te kore kupuhipa. Ka taea e koe te mahi i tētahi mahi me te mea ko koe tēnei kaiwhakamahi, me ētahi atu whakaaro ō ngā kaiwhakamahi, 'ka mahia anō nei ngā te kaiwhakamahi i mahi. Heoi, ka tuhia e ngā kaute tuhinga ko koe te kaihanga i ngā mahi mo tēnei kaiwhakamahi.", - "@\"Act as\" is essentially logging in as this user without a password. You will be able to take any action as if you were this user, and from other users' points of views, it will be as if this user performed them. However, audit logs record that you were the one who performed the actions on behalf of this user.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Domain": "Rohe", - "@Domain": { - "description": "Text field hint for domain url input", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You must enter a valid domain": "Me whakauru e koe i te rohe whaimana", - "@You must enter a valid domain": { - "description": "Message displayed for domain input error", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "User ID": "Kaiwhakamahi ID", - "@User ID": { - "description": "Text field hint for user ID input", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You must enter a user id": "Me whakauru e koe he kaiwhakamahi id", - "@You must enter a user id": { - "description": "Message displayed for user Id input error", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error trying to act as this user. Please check the Domain and User ID and try again.": "He hapa i te wā e ngana ana ki te mahi hei kaiwhakamahi. Tēnā koa āta titiro te Rohe me Kaiwhakamahi ID ana ka ngana anō.", - "@There was an error trying to act as this user. Please check the Domain and User ID and try again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "endMasqueradeMessage": "Ka mutu tō mahi hei {userName} ka hoki ki tāu pūkete.ake.", - "@endMasqueradeMessage": { - "description": "Confirmation message displayed when the user wants to stop acting (masquerading) as another user", - "type": "text", - "placeholders_order": [ - "userName" - ], - "placeholders": { - "userName": {} - } - }, - "endMasqueradeLogoutMessage": "Ka mutu tō mahi hei {userName} ana ka takiwahotia.", - "@endMasqueradeLogoutMessage": { - "description": "Confirmation message displayed when the user wants to stop acting (masquerading) as another user and will be logged out.", - "type": "text", - "placeholders_order": [ - "userName" - ], - "placeholders": { - "userName": {} - } - }, - "How are we doing?": "E pēhea ana tātou?", - "@How are we doing?": { - "description": "Title for dialog asking user to rate the app out of 5 stars.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Don't show again": "Kaua e whakātu anō", - "@Don't show again": { - "description": "Button to prevent the rating dialog from showing again.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "What can we do better?": "Me pēhea e whakapiki ake ai te mahi e mātou?", - "@What can we do better?": { - "description": "Hint text for providing a comment with the rating.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Send Feedback": "Tuku Urupare", - "@Send Feedback": { - "description": "Button to send rating with feedback", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "ratingDialogEmailSubject": "He whakāro pūaki mo Android - Canvas Matua {version}", - "@ratingDialogEmailSubject": { - "description": "The subject for an email to provide feedback for CanvasParent.", - "type": "text", - "placeholders_order": [ - "version" - ], - "placeholders": { - "version": {} - } - }, - "starRating": "{position,plural, =1{{position} whetu}other{{position} ngā whetu}}", - "@starRating": { - "description": "Accessibility label for the 1 stars to 5 stars rating", - "type": "text", - "placeholders_order": [ - "position" - ], - "placeholders": { - "position": { - "example": 1 - } - } - }, - "Student Pairing": "Akonga Hono", - "@Student Pairing": { - "description": "Title for the screen where users can pair to students using a QR code", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Open Canvas Student": "Huaki Canvas Ākonga", - "@Open Canvas Student": { - "description": "Title for QR pairing tutorial screen instructing users to open the Canvas Student app", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You'll need to open your student's Canvas Student app to continue. Go into Main Menu > Settings > Pair with Observer and scan the QR code you see there.": "Me huakina tō Canvas Ākonga Taupanga ki te haere tonu. Haere ki roto i te Tahua Matua > Ngā Tautuhinga me te Kaitirotiro me te matawai i te QR Waehere ka kitea e koe i reira.", - "@You'll need to open your student's Canvas Student app to continue. Go into Main Menu > Settings > Pair with Observer and scan the QR code you see there.": { - "description": "Message explaining how QR code pairing works", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Screenshot showing location of pairing QR code generation in the Canvas Student app": "Pere mata e tohu ana te wāhi o te hono QR Waehere whakatupuranga i roto i te Canvas Ākonga Taupanga", - "@Screenshot showing location of pairing QR code generation in the Canvas Student app": { - "description": "Content Description for qr pairing tutorial screenshot", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Expired QR Code": "Kua pau QR Waehere", - "@Expired QR Code": { - "description": "Error title shown when the users scans a QR code that has expired", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The QR code you scanned may have expired. Refresh the code on the student's device and try again.": "Te QR Waehere kua matawaiatia e koe kua pau. Whakahou te waeherre i runga i te taputapu a te ākonga ana ka ngana anō.", - "@The QR code you scanned may have expired. Refresh the code on the student's device and try again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "A network error occurred when adding this student. Check your connection and try again.": "He hapa whatunga i puta i te wā e tāpiri ana ki tēnei ākonga. Tirohia tō hononga ana ka ngana anō.", - "@A network error occurred when adding this student. Check your connection and try again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Invalid QR Code": "QR waehere koremana", - "@Invalid QR Code": { - "description": "Error title shown when the user scans an invalid QR code", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Incorrect Domain": "Rohe hē", - "@Incorrect Domain": { - "description": "Error title shown when the users scane a QR code for a student that belongs to a different domain", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The student you are trying to add belongs to a different school. Log in or create an account with that school to scan this code.": "Ko te akonga e ngana ana koe ki te tāpiri nō tētahi kura rerekē. Whakauru ara hanga rānei he pūkete me tēra kura ki te matawai ki tēnei waehere.", - "@The student you are trying to add belongs to a different school. Log in or create an account with that school to scan this code.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Camera Permission": "Kāmera Whakaaetanga", - "@Camera Permission": { - "description": "Error title shown when the user wans to scan a QR code but has denied the camera permission", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "This will unpair and remove all enrollments for this student from your account.": "Ka kore hono tēnei ara ka tango ngā whakaurunga mo tēnei ākonga mai i tō pūkete.", - "@This will unpair and remove all enrollments for this student from your account.": { - "description": "Confirmation message shown when the user tries to delete a student from their account", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was a problem removing this student from your account. Please check your connection and try again.": "He raruraru i te wā e tango ana i tēnei ākonga mai i tō pūkete. Tēnā koa tirohia tō hononga ana ka tarai anō.", - "@There was a problem removing this student from your account. Please check your connection and try again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Cancel": "Whakakore", - "@Cancel": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "next": "E haere ake nei", - "@next": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "ok": "Ae", - "@ok": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Yes": "Ae", - "@Yes": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No": "Kahore", - "@No": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Retry": "Ngana anō", - "@Retry": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Delete": "Muku", - "@Delete": { - "description": "Label used for general delete/remove actions", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Done": "Kua mahia", - "@Done": { - "description": "Label for general done/finished actions", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Refresh": "Whakahouhia", - "@Refresh": { - "description": "Label for button to refresh data from the web", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "View Description": "Tirohia te whakāturanga", - "@View Description": { - "description": "Button to view the description for an event or assignment", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "expanded": "whakawhānui", - "@expanded": { - "description": "Description for the accessibility reader for list groups that are expanded", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "collapsed": "hinga", - "@collapsed": { - "description": "Description for the accessibility reader for list groups that are expanded", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "An unexpected error occurred": "He hapa ohorere i puta", - "@An unexpected error occurred": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No description": "Kāore he whakaahuatanga", - "@No description": { - "description": "Message used when the assignment has no description", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Launch External Tool": "Neke Taputapu Waho", - "@Launch External Tool": { - "description": "Button text added to webviews to let users open external tools in their browser", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Interactions on this page are limited by your institution.": "Ngā whakapā i runga i tēnei whārangi ka aukatitia e tō wharenōhanga.", - "@Interactions on this page are limited by your institution.": { - "description": "Message describing how the webview has limited access due to an instution setting", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "dateAtTime": "{date} ī {time}", - "@dateAtTime": { - "description": "The string to format dates", - "type": "text", - "placeholders_order": [ - "date", - "time" - ], - "placeholders": { - "date": {}, - "time": {} - } - }, - "dueDateAtTime": "Rā tika {date} ī {time}", - "@dueDateAtTime": { - "description": "The string to format due dates", - "type": "text", - "placeholders_order": [ - "date", - "time" - ], - "placeholders": { - "date": {}, - "time": {} - } - }, - "No Due Date": "Kaore He Rā Tika", - "@No Due Date": { - "description": "Label for assignments that do not have a due date", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Filter": "Tātari", - "@Filter": { - "description": "Label for buttons to filter what items are visible", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "unread": "kaore i pānuitia", - "@unread": { - "description": "Label for things that are marked as unread", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "unreadCount": "{count} kaore i pānuihia", - "@unreadCount": { - "description": "Formatted string for when there are a number of unread items", - "type": "text", - "placeholders_order": [ - "count" - ], - "placeholders": { - "count": {} - } - }, - "badgeNumberPlus": "{count}+", - "@badgeNumberPlus": { - "description": "Formatted string for when too many items are being notified in a badge, generally something like: 99+", - "type": "text", - "placeholders_order": [ - "count" - ], - "placeholders": { - "count": {} - } - }, - "There was an error loading this announcement": "He hapa i te wā e uta ana i tēnei pānui", - "@There was an error loading this announcement": { - "description": "Message shown when an announcement detail screen fails to load", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Network error": "Hapa whatunga", - "@Network error": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Under Construction": "Kei raro i te hanga", - "@Under Construction": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "We are currently building this feature for your viewing pleasure.": "Kei te hanga mātou i tēnei āhuatanga kia pai ai tō mātakitaki.", - "@We are currently building this feature for your viewing pleasure.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Request Login Help Button": "Tonoa Takiuru Awhina Pātene", - "@Request Login Help Button": { - "description": "Accessibility hint for button that opens help dialog for a login help request", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Request Login Help": "Tonoa Takiuru Awhina", - "@Request Login Help": { - "description": "Title of help dialog for a login help request", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I'm having trouble logging in": "Kei te raru ahau ki te takiuru", - "@I'm having trouble logging in": { - "description": "Subject of help dialog for a login help request", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "An error occurred when trying to display this link": "He hapa i puta i te wā e ngana ana ki te whakātu i tēnei whārangi.hono", - "@An error occurred when trying to display this link": { - "description": "Error message shown when a link can't be opened", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "We are unable to display this link, it may belong to an institution you currently aren't logged in to.": "Kaore e taea e mātou te whakātu i tēnei hono, ekene e mau ana ki tētahi whakanōhanga kaore koe i te takiuru i tēnei wā.", - "@We are unable to display this link, it may belong to an institution you currently aren't logged in to.": { - "description": "Description for error page shown when clicking a link", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Link Error": "Hono Hapa", - "@Link Error": { - "description": "Title for error page shown when clicking a link", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Open In Browser": "Tuwhera I roto i te Pūtirotiro", - "@Open In Browser": { - "description": "Text for button to open a link in the browswer", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You'll find the QR code on the web in your account profile. Click 'QR for Mobile Login' in the list.": "Ka kitea e koe te QR waehere i runga i te ipurangi i roto i tō pūkete kōtaha. Pātō QR mo te Waea Haerēre Takiuru i roto i te rārangi.", - "@You'll find the QR code on the web in your account profile. Click 'QR for Mobile Login' in the list.": { - "description": "Text for qr login tutorial screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Locate QR Code": "Kimihia QR Waehere", - "@Locate QR Code": { - "description": "Text for qr login button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Please scan a QR code generated by Canvas": "Tēnā koa mātai he QR Waehere kua whakamahia e Canvas", - "@Please scan a QR code generated by Canvas": { - "description": "Text for qr login error with incorrect qr code", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error logging in. Please generate another QR Code and try again.": "He hapa i puta i te wā e takiuru ana. Tēnā koa whakamahi he QR Waehere anō ka ngana anō.", - "@There was an error logging in. Please generate another QR Code and try again.": { - "description": "Text for qr login error", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Screenshot showing location of QR code generation in browser": "Tangirua e whkātu ana rohe o te QR Waehere whakamahia i roto i te pūtirotiro", - "@Screenshot showing location of QR code generation in browser": { - "description": "Content Description for qr login tutorial screenshot", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "QR scanning requires camera access": "Ka hiahiatia te QR mātai i te whakauru ki te kāmera", - "@QR scanning requires camera access": { - "description": "placeholder for camera error for QR code scan", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The linked item is no longer available": "Kaore i te wātea te tuemi honotia", - "@The linked item is no longer available": { - "description": "error message when the alert could no be opened", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Message sent": "Kua tonoa te karere", - "@Message sent": { - "description": "confirmation message on the screen when the user succesfully sends a message", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Acceptable Use Policy": "Kaupapa Whakamahi e Whakāetia ana", - "@Acceptable Use Policy": { - "description": "title for the acceptable use policy screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Submit": "Tuku", - "@Submit": { - "description": "submit button title for acceptable use policy screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Either you're a new user or the Acceptable Use Policy has changed since you last agreed to it. Please agree to the Acceptable Use Policy before you continue.": "Ahakoa he kaiwhakamahi hou koe te Kaupapa Whakamahi Whakaae ranei kua rereke mai i to whakaaetanga whakamutunga. I mua i te haere whakaae mai ki te Kaupapa Whakamahi Whakaae.", - "@Either you're a new user or the Acceptable Use Policy has changed since you last agreed to it. Please agree to the Acceptable Use Policy before you continue.": { - "description": "acceptable use policy screen description", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I agree to the Acceptable Use Policy.": "Ko te Kaupapa Whakamahi Whakaae he pai ki ahau.", - "@I agree to the Acceptable Use Policy.": { - "description": "acceptable use policy switch title", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "About": "Mō", - "@About": { - "description": "Title for about menu item in settings", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "App": "Taupānga", - "@App": { - "description": "Title for App field on about page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Login ID": "Takiuru ID", - "@Login ID": { - "description": "Title for Login ID field on about page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Email": "Īmēra", - "@Email": { - "description": "Title for Email field on about page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Version": "Putanga", - "@Version": { - "description": "Title for Version field on about page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Instructure logo": "Tohu Instructure", - "@Instructure logo": { - "description": "Semantics label for the Instructure logo on the about page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - } -} \ No newline at end of file diff --git a/apps/flutter_parent/lib/l10n/res/intl_ms.arb b/apps/flutter_parent/lib/l10n/res/intl_ms.arb deleted file mode 100644 index 3efac2b1a0..0000000000 --- a/apps/flutter_parent/lib/l10n/res/intl_ms.arb +++ /dev/null @@ -1,2753 +0,0 @@ -{ - "@@last_modified": "2023-08-25T11:04:20.901151", - "alertsLabel": "Isyarat", - "@alertsLabel": { - "description": "The label for the Alerts tab", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "calendarLabel": "Kalendar", - "@calendarLabel": { - "description": "The label for the Calendar tab", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "coursesLabel": "Kursus", - "@coursesLabel": { - "description": "The label for the Courses tab", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Students": "Tiada Pelajar", - "@No Students": { - "description": "Text for when an observer has no students they are observing", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Tap to show student selector": "Ketik untuk menunjukkan pemilih pelajar", - "@Tap to show student selector": { - "description": "Semantics label for the area that will show the student selector when tapped", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Tap to pair with a new student": "Ketik untuk berpasangan dengan pelajar baharu", - "@Tap to pair with a new student": { - "description": "Semantics label for the add student button in the student selector", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Tap to select this student": "Ketik untuk memilih pelajar ini", - "@Tap to select this student": { - "description": "Semantics label on individual students in the student switcher", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Manage Students": "Urus Pelajar", - "@Manage Students": { - "description": "Label text for the Manage Students nav drawer button as well as the title for the Manage Students screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Help": "Bantuan", - "@Help": { - "description": "Label text for the help nav drawer button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Log Out": "Log Keluar", - "@Log Out": { - "description": "Label text for the Log Out nav drawer button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Switch Users": "Tukar Pengguna", - "@Switch Users": { - "description": "Label text for the Switch Users nav drawer button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "appVersion": "v. {version}", - "@appVersion": { - "description": "App version shown in the navigation drawer", - "type": "text", - "placeholders_order": [ - "version" - ], - "placeholders": { - "version": {} - } - }, - "Are you sure you want to log out?": "Adakah anda pasti anda ingin log keluar?", - "@Are you sure you want to log out?": { - "description": "Confirmation message displayed when the user tries to log out", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Calendars": "Kalendar", - "@Calendars": { - "description": "Label for button that lets users select which calendars to display", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "nextMonth": "Bulan seterusnya: {month}", - "@nextMonth": { - "description": "Label for the button that switches the calendar to the next month", - "type": "text", - "placeholders_order": [ - "month" - ], - "placeholders": { - "month": {} - } - }, - "previousMonth": "Bulan sebelumnya: {month}", - "@previousMonth": { - "description": "Label for the button that switches the calendar to the previous month", - "type": "text", - "placeholders_order": [ - "month" - ], - "placeholders": { - "month": {} - } - }, - "nextWeek": "Minggu seterusnya bermula {date}", - "@nextWeek": { - "description": "Label for the button that switches the calendar to the next week", - "type": "text", - "placeholders_order": [ - "date" - ], - "placeholders": { - "date": {} - } - }, - "previousWeek": "Minggu sebelumnya bermula {date}", - "@previousWeek": { - "description": "Label for the button that switches the calendar to the previous week", - "type": "text", - "placeholders_order": [ - "date" - ], - "placeholders": { - "date": {} - } - }, - "selectedMonthLabel": "Bulan {month}", - "@selectedMonthLabel": { - "description": "Accessibility label for the button that expands/collapses the month view", - "type": "text", - "placeholders_order": [ - "month" - ], - "placeholders": { - "month": {} - } - }, - "expand": "kembangkan", - "@expand": { - "description": "Accessibility label for the on-tap hint for the button that expands/collapses the month view", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "collapse": "kuncupkan", - "@collapse": { - "description": "Accessibility label for the on-tap hint for the button that expands/collapses the month view", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "pointsPossible": "{points} mata mungkin", - "@pointsPossible": { - "description": "Screen reader label used for the points possible for an assignment, quiz, etc.", - "type": "text", - "placeholders_order": [ - "points" - ], - "placeholders": { - "points": {} - } - }, - "calendarDaySemanticsLabel": "{eventCount,plural, =1{{date}, {eventCount} acara}other{{date}, {eventCount} acara}}", - "@calendarDaySemanticsLabel": { - "description": "Screen reader label used for calendar day, reads the date and count of events", - "type": "text", - "placeholders_order": [ - "date", - "eventCount" - ], - "placeholders": { - "date": {}, - "eventCount": {} - } - }, - "No Events Today!": "Tiada Acara Hari Ini!", - "@No Events Today!": { - "description": "Title displayed when there are no calendar events for the current day", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "It looks like a great day to rest, relax, and recharge.": "Nampaknya ini hari yang baik untuk berehat, bersantai dan merawat diri.", - "@It looks like a great day to rest, relax, and recharge.": { - "description": "Message displayed when there are no calendar events for the current day", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading your student's calendar": "Terdapat ralat untuk memuatkan kalendar pelajar anda", - "@There was an error loading your student's calendar": { - "description": "Message displayed when calendar events could not be loaded for the current student", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Tap to favorite the courses you want to see on the Calendar. Select up to 10.": "Ketik untuk menggemari kursus yang ingin anda lihat pada Kalendar. Pilih hingga 10.", - "@Tap to favorite the courses you want to see on the Calendar. Select up to 10.": { - "description": "Description text on calendar filter screen.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You may only choose 10 calendars to display": "Anda hanya boleh memilih 10 kalendar untuk dipaparkan", - "@You may only choose 10 calendars to display": { - "description": "Error text when trying to select more than 10 calendars", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You must select at least one calendar to display": "Anda mesti memilih sekurang-kurangnya satu kalendar untuk dipaparkan", - "@You must select at least one calendar to display": { - "description": "Error text when trying to de-select all calendars", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Planner Note": "Nota Perancang", - "@Planner Note": { - "description": "Label used for notes in the planner", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Go to today": "Terus ke hari ini", - "@Go to today": { - "description": "Accessibility label used for the today button in the planner", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Previous Logins": "Log Masuk Sebelumnya", - "@Previous Logins": { - "description": "Label for the list of previous user logins", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "canvasLogoLabel": "Logo Canvas", - "@canvasLogoLabel": { - "description": "The semantics label for the Canvas logo", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "findSchool": "Cari Sekolah", - "@findSchool": { - "description": "Text for the find-my-school button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "findAnotherSchool": "Cari sekolah lain", - "@findAnotherSchool": { - "description": "Text for the find-another-school button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "domainSearchInputHint": "Masukkan nama sekolah atau daerah...", - "@domainSearchInputHint": { - "description": "Input hint for the text box on the domain search screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "noDomainResults": "Tidak dapat mencari sekolah yang sepadan \"{query}\"", - "@noDomainResults": { - "description": "Message shown to users when the domain search query did not return any results", - "type": "text", - "placeholders_order": [ - "query" - ], - "placeholders": { - "query": {} - } - }, - "domainSearchHelpLabel": "Bagaimanakah cara mencari sekolah atau daerah saya?", - "@domainSearchHelpLabel": { - "description": "Label for the help button on the domain search screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "canvasGuides": "Panduan Canvas", - "@canvasGuides": { - "description": "Proper name for the Canvas Guides. This will be used in the domainSearchHelpBody text and will be highlighted and clickable", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "canvasSupport": "Sokongan Canvas", - "@canvasSupport": { - "description": "Proper name for Canvas Support. This will be used in the domainSearchHelpBody text and will be highlighted and clickable", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "domainSearchHelpBody": "Cuba cari nama sekolah atau daerah yang anda cuba akses, seperti \"Smith Private School\" atau \"Smith County Schools.\" Anda juga boleh terus memasukkan domain Canvas, seperti “smith.instructure.com.”\n\nUntuk maklumat lanjut tentang mencari akaun Canvas institusi anda, anda boleh melawati {canvasGuides}, berhubung dengan {canvasSupport} atau menghubungi sekolah anda untuk mendapatkan bantuan.", - "@domainSearchHelpBody": { - "description": "The body text shown in the help dialog on the domain search screen", - "type": "text", - "placeholders_order": [ - "canvasGuides", - "canvasSupport" - ], - "placeholders": { - "canvasGuides": {}, - "canvasSupport": {} - } - }, - "Uh oh!": "Op!", - "@Uh oh!": { - "description": "Title of the screen that shows when a crash has occurred", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "We’re not sure what happened, but it wasn’t good. Contact us if this keeps happening.": "Kami tidak pasti apa yang berlaku, mungkin ada sedikit masalah. Hubungi kami jika perkara ini berlanjutan.", - "@We’re not sure what happened, but it wasn’t good. Contact us if this keeps happening.": { - "description": "Message shown when a crash has occurred", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Contact Support": "Hubungi Sokongan", - "@Contact Support": { - "description": "Label for the button that allows users to contact support after a crash has occurred", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "View error details": "Lihat butiran ralat", - "@View error details": { - "description": "Label for the button that allowed users to view crash details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Restart app": "Mulakan semula apl", - "@Restart app": { - "description": "Label for the button that will restart the entire application", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Application version": "Versi aplikasi", - "@Application version": { - "description": "Label for the application version displayed in the crash details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Device model": "Model peranti", - "@Device model": { - "description": "Label for the device model displayed in the crash details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Android OS version": "Versi OS Android", - "@Android OS version": { - "description": "Label for the Android operating system version displayed in the crash details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Full error message": "Mesej ralat penuh", - "@Full error message": { - "description": "Label for the full error message displayed in the crash details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Inbox": "Peti masuk", - "@Inbox": { - "description": "Title for the Inbox screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading your inbox messages.": "Terdapat ralat untuk memuatkan mesej peti masuk anda.", - "@There was an error loading your inbox messages.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Subject": "Tiada Subjek", - "@No Subject": { - "description": "Title used for inbox messages that have no subject", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unable to fetch courses. Please check your connection and try again.": "Tidak dapat mengambil kursus. Sila semak sambungan anda dan cuba semula.", - "@Unable to fetch courses. Please check your connection and try again.": { - "description": "Message shown when an error occured while loading courses", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Choose a course to message": "Pilih kursus untuk dihantar mesej", - "@Choose a course to message": { - "description": "Header in the course list shown when the user is choosing which course to associate with a new message", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Inbox Zero": "Peti Masuk Kosong", - "@Inbox Zero": { - "description": "Title of the message shown when there are no inbox messages", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You’re all caught up!": "Anda telah mengetahui semua maklumat terkini!", - "@You’re all caught up!": { - "description": "Subtitle of the message shown when there are no inbox messages", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading recipients for this course": "Terdapat ralat untuk memuatkan penerima untuk kursus ini.", - "@There was an error loading recipients for this course": { - "description": "Message shown when attempting to create a new message but the recipients list failed to load", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unable to send message. Check your connection and try again.": "Tidak dapat menghantar mesej. Semak sambungan anda dan cuba semula.", - "@Unable to send message. Check your connection and try again.": { - "description": "Message show when there was an error creating or sending a new message", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unsaved changes": "Perubahan tidak disimpan", - "@Unsaved changes": { - "description": "Title of the dialog shown when the user tries to leave with unsaved changes", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Are you sure you wish to close this page? Your unsent message will be lost.": "Adakah anda pasti anda ingin menutup halaman ini? Mesej anda yang tidak dihantar akan hilang.", - "@Are you sure you wish to close this page? Your unsent message will be lost.": { - "description": "Body text of the dialog shown when the user tries leave with unsaved changes", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "New message": "Mesej baharu", - "@New message": { - "description": "Title of the new-message screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Add attachment": "Tambah kepilan", - "@Add attachment": { - "description": "Tooltip for the add-attachment button in the new-message screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Send message": "Hantar mesej", - "@Send message": { - "description": "Tooltip for the send-message button in the new-message screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Select recipients": "Pilih penerima", - "@Select recipients": { - "description": "Tooltip for the button that allows users to select message recipients", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No recipients selected": "Tiada penerima dipilih", - "@No recipients selected": { - "description": "Hint displayed when the user has not selected any message recipients", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Message subject": "Subjek Mesej", - "@Message subject": { - "description": "Hint text displayed in the input field for the message subject", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Message": "Mesej", - "@Message": { - "description": "Hint text displayed in the input field for the message body", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Recipients": "Penerima", - "@Recipients": { - "description": "Label for message recipients", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "plusRecipientCount": "+{count}", - "@plusRecipientCount": { - "description": "Shows the number of recipients that are selected but not displayed on screen.", - "type": "text", - "placeholders_order": [ - "count" - ], - "placeholders": { - "count": { - "example": 5 - } - } - }, - "Failed. Tap for options.": "Gagal. Ketik untuk pilihan.", - "@Failed. Tap for options.": { - "description": "Short message shown on a message attachment when uploading has failed", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "courseForWhom": "untuk {studentShortName}", - "@courseForWhom": { - "description": "Describes for whom a course is for (i.e. for Bill)", - "type": "text", - "placeholders_order": [ - "studentShortName" - ], - "placeholders": { - "studentShortName": {} - } - }, - "messageLinkPostscript": "Berkenaan: {studentName}, {linkUrl}", - "@messageLinkPostscript": { - "description": "A postscript appended to new messages that clarifies which student is the subject of the message and also includes a URL for the related Canvas component (course, assignment, event, etc).", - "type": "text", - "placeholders_order": [ - "studentName", - "linkUrl" - ], - "placeholders": { - "studentName": {}, - "linkUrl": {} - } - }, - "There was an error loading this conversation": "Terdapat ralat untuk memuatkan perbualan ini", - "@There was an error loading this conversation": { - "description": "Message shown when a conversation fails to load", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Reply": "Balas", - "@Reply": { - "description": "Button label for replying to a conversation", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Reply All": "Balas Semua", - "@Reply All": { - "description": "Button label for replying to all conversation participants", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unknown User": "Pengguna Tidak Diketahui", - "@Unknown User": { - "description": "Label used where the user name is not known", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "me": "saya", - "@me": { - "description": "First-person pronoun (i.e. 'me') that will be used in message author info, e.g. 'Me to 4 others' or 'Jon Snow to me'", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "authorToRecipient": "{authorName}kepada {recipientName}", - "@authorToRecipient": { - "description": "Author info for a single-recipient message; includes both the author name and the recipient name.", - "type": "text", - "placeholders_order": [ - "authorName", - "recipientName" - ], - "placeholders": { - "authorName": {}, - "recipientName": {} - } - }, - "authorToNOthers": "{howMany,plural, =1{{authorName} kepada 1 yang lain}other{{authorName} kepada {howMany} yang lain}}", - "@authorToNOthers": { - "description": "Author info for a mutli-recipient message; includes the author name and the number of recipients", - "type": "text", - "placeholders_order": [ - "authorName", - "howMany" - ], - "placeholders": { - "authorName": {}, - "howMany": {} - } - }, - "authorToRecipientAndNOthers": "{howMany,plural, =1{{authorName} kepada {recipientName} & 1 yang lain}other{{authorName} kepada {recipientName} & {howMany} yang lain}}", - "@authorToRecipientAndNOthers": { - "description": "Author info for a multi-recipient message; includes the author name, one recipient name, and the number of other recipients", - "type": "text", - "placeholders_order": [ - "authorName", - "recipientName", - "howMany" - ], - "placeholders": { - "authorName": {}, - "recipientName": {}, - "howMany": {} - } - }, - "Download": "Muat turun", - "@Download": { - "description": "Label for the button that will begin downloading a file", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Open with another app": "Buka dengan apl alternatif", - "@Open with another app": { - "description": "Label for the button that will allow users to open a file with another app", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There are no installed applications that can open this file": "Tiada aplikasi yang dipasang dapat membuka fail ini", - "@There are no installed applications that can open this file": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unsupported File": "Fail Tidak Disokong", - "@Unsupported File": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "This file is unsupported and can’t be viewed through the app": "Fail ini tidak disokong dan tidak dapat dilihat melalui apl ini", - "@This file is unsupported and can’t be viewed through the app": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unable to play this media file": "Tidak dapat memainkan fail media ini", - "@Unable to play this media file": { - "description": "Message shown when audio or video media could not be played", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unable to load this image": "Tidak dapat memuatkan imej ini", - "@Unable to load this image": { - "description": "Message shown when an image file could not be loaded or displayed", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading this file": "Terdapat ralat untuk memuatkan fail ini", - "@There was an error loading this file": { - "description": "Message shown when a file could not be loaded or displayed", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Courses": "Tiada Kursus", - "@No Courses": { - "description": "Title for having no courses", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Your student’s courses might not be published yet.": "Kursus pelajar anda mungkin belum diterbitkan.", - "@Your student’s courses might not be published yet.": { - "description": "Message for having no courses", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading your student’s courses.": "Terdapat ralat untuk memuatkan kursus pelajar anda.", - "@There was an error loading your student’s courses.": { - "description": "Message displayed when the list of student courses could not be loaded", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Grade": "Tiada gred", - "@No Grade": { - "description": "Message shown when there is currently no grade available for a course", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Filter by": "Tapis mengikut", - "@Filter by": { - "description": "Title for list of terms to filter grades by", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Grades": "Gred", - "@Grades": { - "description": "Label for the \"Grades\" tab in course details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Syllabus": "Silibus", - "@Syllabus": { - "description": "Label for the \"Syllabus\" tab in course details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Front Page": "Halaman Depan", - "@Front Page": { - "description": "Label for the \"Front Page\" tab in course details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Summary": "Rumusan", - "@Summary": { - "description": "Label for the \"Summary\" tab in course details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Send a message about this course": "Hantar mesej mengenai kursus ini", - "@Send a message about this course": { - "description": "Accessibility hint for the course messaage floating action button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Total Grade": "Jumlah Gred", - "@Total Grade": { - "description": "Label for the total grade in the course", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Graded": "Digredkan", - "@Graded": { - "description": "Label for assignments that have been graded", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Submitted": "Diserahkan", - "@Submitted": { - "description": "Label for assignments that have been submitted", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Not Submitted": "Tidak Diserahkan", - "@Not Submitted": { - "description": "Label for assignments that have not been submitted", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Late": "Lewat", - "@Late": { - "description": "Label for assignments that have been marked late or submitted late", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Missing": "Tiada", - "@Missing": { - "description": "Label for assignments that have been marked missing or are not submitted and past the due date", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "-": "-", - "@-": { - "description": "Value representing no score for student submission", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "All Grading Periods": "Semua Tempoh Penggredan", - "@All Grading Periods": { - "description": "Label for selecting all grading periods", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Assignments": "Tiada Tugasan", - "@No Assignments": { - "description": "Title for the no assignments message", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "It looks like assignments haven't been created in this space yet.": "Nampaknya tugasan belum dicipta dalam ruang ini.", - "@It looks like assignments haven't been created in this space yet.": { - "description": "Message for no assignments", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading the summary details for this course.": "Terdapat ralat untuk memuatkan butiran rumusan untuk kursus ini.", - "@There was an error loading the summary details for this course.": { - "description": "Message shown when the course summary could not be loaded", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Summary": "Tiada Rumusan", - "@No Summary": { - "description": "Title displayed when there are no items in the course summary", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "This course does not have any assignments or calendar events yet.": "Kursus ini belum mempunyai apa-apa tugasan atau acara kalendar.", - "@This course does not have any assignments or calendar events yet.": { - "description": "Message displayed when there are no items in the course summary", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "gradeFormatScoreOutOfPointsPossible": "{score} / {pointsPossible}", - "@gradeFormatScoreOutOfPointsPossible": { - "description": "Formatted string for a student score out of the points possible", - "type": "text", - "placeholders_order": [ - "score", - "pointsPossible" - ], - "placeholders": { - "score": {}, - "pointsPossible": {} - } - }, - "contentDescriptionScoreOutOfPointsPossible": "{score} daripada {pointsPossible} mata", - "@contentDescriptionScoreOutOfPointsPossible": { - "description": "Formatted string for a student score out of the points possible", - "type": "text", - "placeholders_order": [ - "score", - "pointsPossible" - ], - "placeholders": { - "score": {}, - "pointsPossible": {} - } - }, - "gradesSubjectMessage": "Berkenaan: {studentName}, Gred", - "@gradesSubjectMessage": { - "description": "The subject line for a message to a teacher regarding a student's grades", - "type": "text", - "placeholders_order": [ - "studentName" - ], - "placeholders": { - "studentName": {} - } - }, - "syllabusSubjectMessage": "Berkenaan: {studentName}, Silibus", - "@syllabusSubjectMessage": { - "description": "The subject line for a message to a teacher regarding a course syllabus", - "type": "text", - "placeholders_order": [ - "studentName" - ], - "placeholders": { - "studentName": {} - } - }, - "frontPageSubjectMessage": "Berkenaan: {studentName}, Halaman Depan", - "@frontPageSubjectMessage": { - "description": "The subject line for a message to a teacher regarding a course front page", - "type": "text", - "placeholders_order": [ - "studentName" - ], - "placeholders": { - "studentName": {} - } - }, - "assignmentSubjectMessage": "Berkenaan: {studentName}, Tugasan - {assignmentName}", - "@assignmentSubjectMessage": { - "description": "The subject line for a message to a teacher regarding a student's assignment", - "type": "text", - "placeholders_order": [ - "studentName", - "assignmentName" - ], - "placeholders": { - "studentName": {}, - "assignmentName": {} - } - }, - "eventSubjectMessage": "Berkenaan: {studentName}, Acara - {eventTitle}", - "@eventSubjectMessage": { - "description": "The subject line for a message to a teacher regarding a calendar event", - "type": "text", - "placeholders_order": [ - "studentName", - "eventTitle" - ], - "placeholders": { - "studentName": {}, - "eventTitle": {} - } - }, - "There is no page information available.": "Tiada maklumat halaman tersedia.", - "@There is no page information available.": { - "description": "Description for when no page information is available", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Assignment Details": "Butiran Tugasan", - "@Assignment Details": { - "description": "Title for the page that shows details for an assignment", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "assignmentTotalPoints": "{points} mata", - "@assignmentTotalPoints": { - "description": "Label used for the total points the assignment is worth", - "type": "text", - "placeholders_order": [ - "points" - ], - "placeholders": { - "points": {} - } - }, - "assignmentTotalPointsAccessible": "{points} mata", - "@assignmentTotalPointsAccessible": { - "description": "Screen reader label used for the total points the assignment is worth", - "type": "text", - "placeholders_order": [ - "points" - ], - "placeholders": { - "points": {} - } - }, - "Due": "Cukup tempoh", - "@Due": { - "description": "Label for an assignment due date", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Grade": "Gred", - "@Grade": { - "description": "Label for the section that displays an assignment's grade", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Locked": "Berkunci", - "@Locked": { - "description": "Label for when an assignment is locked", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "assignmentLockedModule": "Tugasan ini dikunci oleh modul \"{moduleName}\".", - "@assignmentLockedModule": { - "description": "The locked description when an assignment is locked by a module", - "type": "text", - "placeholders_order": [ - "moduleName" - ], - "placeholders": { - "moduleName": {} - } - }, - "Remind Me": "Ingatkan Saya", - "@Remind Me": { - "description": "Label for the row to set reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Set a date and time to be notified of this specific assignment.": "Tetapkan tarikh dan masa untuk diberitahu mengenai tugasan khusus ini.", - "@Set a date and time to be notified of this specific assignment.": { - "description": "Description for row to set reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You will be notified about this assignment on…": "Anda akan diberitahu mengenai tugasan ini pada...", - "@You will be notified about this assignment on…": { - "description": "Description for when a reminder is set", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Instructions": "Arahan", - "@Instructions": { - "description": "Label for the description of the assignment when it has quiz instructions", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Send a message about this assignment": "Hantar mesej mengenai tugasan ini", - "@Send a message about this assignment": { - "description": "Accessibility hint for the assignment messaage floating action button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "This app is not authorized for use.": "Penggunaan apl ini tidak dibenarkan.", - "@This app is not authorized for use.": { - "description": "The error shown when the app being used is not verified by Canvas", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The server you entered is not authorized for this app.": "Pelayan yang anda masukkan tidak dibenarkan untuk apl ini.", - "@The server you entered is not authorized for this app.": { - "description": "The error shown when the desired login domain is not verified by Canvas", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The user agent for this app is not authorized.": "Agen pengguna untuk apl ini tidak dibenarkan.", - "@The user agent for this app is not authorized.": { - "description": "The error shown when the user agent during verification is not verified by Canvas", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "We were unable to verify the server for use with this app.": "Kami tidak dapat menentusahkan pelayan untuk penggunaan apl ini.", - "@We were unable to verify the server for use with this app.": { - "description": "The generic error shown when we are unable to verify with Canvas", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Reminders": "Peringatan", - "@Reminders": { - "description": "Name of the system notification channel for assignment and event reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Notifications for reminders about assignments and calendar events": "Pemberitahuan sebagai peringatan mengenai tugasan dan acara kalendar", - "@Notifications for reminders about assignments and calendar events": { - "description": "Description of the system notification channel for assignment and event reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Reminders have changed!": "Peringatan telah berubah!", - "@Reminders have changed!": { - "description": "Title of the dialog shown when the user needs to update their reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "In order to provide you with a better experience, we have updated how reminders work. You can add new reminders by viewing an assignment or calendar event and tapping the switch under the \"Remind Me\" section.\n\nBe aware that any reminders created with older versions of this app will not be compatible with the new changes and you will need to create them again.": "Untuk memberi anda pengalaman yang lebih baik, kami telah mengemas kini cara peringatan berfungsi Anda boleh menambah peringatan baharu dengan melihat tugasan atau acara kalendar dan mengetik suis di bawah seksyen \"Ingatkan Saya\".\n\nPerhatikan bahawa sebarang peringatan yang dicipta dengan versi apl ini yang lebih lama tidak serasi dengan perubahan baharu dan anda perlu mencipta peringatan semula.", - "@In order to provide you with a better experience, we have updated how reminders work. You can add new reminders by viewing an assignment or calendar event and tapping the switch under the \"Remind Me\" section.\n\nBe aware that any reminders created with older versions of this app will not be compatible with the new changes and you will need to create them again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Not a parent?": "Bukan ibu bapa?", - "@Not a parent?": { - "description": "Title for the screen that shows when the user is not observing any students", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "We couldn't find any students associated with this account": "Kami tidak dapat mencari mana-mana pelajar yang berkaitan dengan akaun ini", - "@We couldn't find any students associated with this account": { - "description": "Subtitle for the screen that shows when the user is not observing any students", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Are you a student or teacher?": "Adakah anda seorang pelajar atau guru?", - "@Are you a student or teacher?": { - "description": "Label for button that will show users the option to view other Canvas apps in the Play Store", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "One of our other apps might be a better fit. Tap one to visit the Play Store.": "Salah satu apl kami yang lain mungkin lebih sesuai. Ketik satu untuk melawati Play Store.", - "@One of our other apps might be a better fit. Tap one to visit the Play Store.": { - "description": "Description of options to view other Canvas apps in the Play Store", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Return to Login": "Kembali ke Log Masuk", - "@Return to Login": { - "description": "Label for the button that returns the user to the login screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "STUDENT": "PELAJAR", - "@STUDENT": { - "description": "The \"student\" portion of the \"Canvas Student\" app name, in all caps. \"Canvas\" is excluded in this context as it will be displayed to the user as a wordmark image", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "TEACHER": "GURU", - "@TEACHER": { - "description": "The \"teacher\" portion of the \"Canvas Teacher\" app name, in all caps. \"Canvas\" is excluded in this context as it will be displayed to the user as a wordmark image", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Canvas Student": "Canvas Student", - "@Canvas Student": { - "description": "The name of the Canvas Student app. Only \"Student\" should be translated as \"Canvas\" is a brand name in this context and should not be translated.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Canvas Teacher": "Canvas Teacher", - "@Canvas Teacher": { - "description": "The name of the Canvas Teacher app. Only \"Teacher\" should be translated as \"Canvas\" is a brand name in this context and should not be translated.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Alerts": "Tiada Isyarat", - "@No Alerts": { - "description": "The title for the empty message to show to users when there are no alerts for the student.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There’s nothing to be notified of yet.": "Belum ada apa-apa lagi untuk diberitahu.", - "@There’s nothing to be notified of yet.": { - "description": "The empty message to show to users when there are no alerts for the student.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "dismissAlertLabel": "Tolak {alertTitle}", - "@dismissAlertLabel": { - "description": "Accessibility label to dismiss an alert", - "type": "text", - "placeholders_order": [ - "alertTitle" - ], - "placeholders": { - "alertTitle": {} - } - }, - "Course Announcement": "Pengumuman Kursus", - "@Course Announcement": { - "description": "Title for alerts when there is a course announcement", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Institution Announcement": "Pengumuman Institusi", - "@Institution Announcement": { - "description": "Title for alerts when there is an institution announcement", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "assignmentGradeAboveThreshold": "Gred Tugasan Atas {threshold}", - "@assignmentGradeAboveThreshold": { - "description": "Title for alerts when an assignment grade is above the threshold value", - "type": "text", - "placeholders_order": [ - "threshold" - ], - "placeholders": { - "threshold": {} - } - }, - "assignmentGradeBelowThreshold": "Gred Tugasan Bawah {threshold}", - "@assignmentGradeBelowThreshold": { - "description": "Title for alerts when an assignment grade is below the threshold value", - "type": "text", - "placeholders_order": [ - "threshold" - ], - "placeholders": { - "threshold": {} - } - }, - "courseGradeAboveThreshold": "Gred Kursus Atas {threshold}", - "@courseGradeAboveThreshold": { - "description": "Title for alerts when a course grade is above the threshold value", - "type": "text", - "placeholders_order": [ - "threshold" - ], - "placeholders": { - "threshold": {} - } - }, - "courseGradeBelowThreshold": "Gred Kursus Bawah {threshold}", - "@courseGradeBelowThreshold": { - "description": "Title for alerts when a course grade is below the threshold value", - "type": "text", - "placeholders_order": [ - "threshold" - ], - "placeholders": { - "threshold": {} - } - }, - "Settings": "Tetapan", - "@Settings": { - "description": "Title for the settings screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Theme": "Tema", - "@Theme": { - "description": "Label for the light/dark theme section in the settings page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Dark Mode": "Mod Gelap", - "@Dark Mode": { - "description": "Label for the button that enables dark mode", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Light Mode": "Mod Terang", - "@Light Mode": { - "description": "Label for the button that enables light mode", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "High Contrast Mode": "Mod Kontras Tinggi", - "@High Contrast Mode": { - "description": "Label for the switch that toggles high contrast mode", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Use Dark Theme in Web Content": "Gunakan Tema Gelap dalam Kandungan Web", - "@Use Dark Theme in Web Content": { - "description": "Label for the switch that toggles dark mode for webviews", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Appearance": "Penampilan", - "@Appearance": { - "description": "Label for the appearance section in the settings page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Successfully submitted!": "Berjaya diserahkan!", - "@Successfully submitted!": { - "description": "Title displayed in the grade cell for an assignment that has been submitted", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "submissionStatusSuccessSubtitle": "Tugasan ini berjaya diserahkan pada {date} {time} dan sedang menanti penggredan", - "@submissionStatusSuccessSubtitle": { - "description": "Subtitle displayed in the grade cell for an assignment that has been submitted and is awaiting a grade", - "type": "text", - "placeholders_order": [ - "date", - "time" - ], - "placeholders": { - "date": {}, - "time": {} - } - }, - "outOfPoints": "{howMany,plural, =1{Daripada 1 mata}other{Daripada {points} mata}}", - "@outOfPoints": { - "description": "Description for an assignment grade that has points without a current scoroe", - "type": "text", - "placeholders_order": [ - "points", - "howMany" - ], - "placeholders": { - "points": {}, - "howMany": {} - } - }, - "Excused": "Dimaafkan", - "@Excused": { - "description": "Grading status for an assignment marked as excused", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Complete": "Lengkap", - "@Complete": { - "description": "Grading status for an assignment marked as complete", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Incomplete": "Tidak lengkap", - "@Incomplete": { - "description": "Grading status for an assignment marked as incomplete", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "minus": "tolak", - "@minus": { - "description": "Screen reader-friendly replacement for the \"-\" character in letter grades like \"A-\"", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "latePenalty": "Denda lewat (-{pointsLost})", - "@latePenalty": { - "description": "Text displayed when a late penalty has been applied to the assignment", - "type": "text", - "placeholders_order": [ - "pointsLost" - ], - "placeholders": { - "pointsLost": {} - } - }, - "finalGrade": "Gred Akhir: {grade}", - "@finalGrade": { - "description": "Text that displays the final grade of an assignment", - "type": "text", - "placeholders_order": [ - "grade" - ], - "placeholders": { - "grade": {} - } - }, - "Alert Settings": "Tetapan Isyarat", - "@Alert Settings": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Alert me when…": "Beri isyarat kepada saya apabila...", - "@Alert me when…": { - "description": "Header for the screen where the observer chooses the thresholds that will determine when they receive alerts (e.g. when an assignment is graded below 70%)", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Course grade below": "Gred kursus bawah", - "@Course grade below": { - "description": "Label describing the threshold for when the course grade is below a certain percentage", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Course grade above": "Gred kursus atas", - "@Course grade above": { - "description": "Label describing the threshold for when the course grade is above a certain percentage", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Assignment missing": "Tugasan tiada", - "@Assignment missing": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Assignment grade below": "Gred tugasan bawah", - "@Assignment grade below": { - "description": "Label describing the threshold for when an assignment is graded below a certain percentage", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Assignment grade above": "Gred tugasan atas", - "@Assignment grade above": { - "description": "Label describing the threshold for when an assignment is graded above a certain percentage", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Course Announcements": "Pengumuman Kursus", - "@Course Announcements": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Institution Announcements": "Pengumuman Institusi", - "@Institution Announcements": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Never": "Tidak Pernah", - "@Never": { - "description": "Indication that tells the user they will not receive alert notifications of a specific kind", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Grade percentage": "Peratusan Gred", - "@Grade percentage": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading your student's alerts.": "Terdapat ralat untuk memuatkan isyarat pelajar anda.", - "@There was an error loading your student's alerts.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Must be below 100": "Mestilah bawah 100", - "@Must be below 100": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "mustBeBelowN": "Mestilah bawah {percentage}", - "@mustBeBelowN": { - "description": "Validation error to the user that they must choose a percentage below 'n'", - "type": "text", - "placeholders_order": [ - "percentage" - ], - "placeholders": { - "percentage": { - "example": 5 - } - } - }, - "mustBeAboveN": "Mestilah melebihi {percentage}", - "@mustBeAboveN": { - "description": "Validation error to the user that they must choose a percentage above 'n'", - "type": "text", - "placeholders_order": [ - "percentage" - ], - "placeholders": { - "percentage": { - "example": 5 - } - } - }, - "Select Student Color": "Pilih Warna Pelajar", - "@Select Student Color": { - "description": "Title for screen that allows users to assign a color to a specific student", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Electric, blue": "Elektrik, biru", - "@Electric, blue": { - "description": "Name of the Electric (blue) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Plum, Purple": "Plum, Ungu", - "@Plum, Purple": { - "description": "Name of the Plum (purple) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Barney, Fuschia": "Barney, Fuschia", - "@Barney, Fuschia": { - "description": "Name of the Barney (fuschia) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Raspberry, Red": "Raspberi, Merah", - "@Raspberry, Red": { - "description": "Name of the Raspberry (red) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Fire, Orange": "Api, Jingga", - "@Fire, Orange": { - "description": "Name of the Fire (orange) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Shamrock, Green": "Syamrok, Hijau", - "@Shamrock, Green": { - "description": "Name of the Shamrock (green) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "An error occurred while saving your selection. Please try again.": "Ralat berlaku semasa menyimpan pilihan anda. Sila cuba semula.", - "@An error occurred while saving your selection. Please try again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "changeStudentColorLabel": "Tukar warna kepada {studentName}", - "@changeStudentColorLabel": { - "description": "Accessibility label for the button that lets users change the color associated with a specific student", - "type": "text", - "placeholders_order": [ - "studentName" - ], - "placeholders": { - "studentName": {} - } - }, - "Teacher": "Guru", - "@Teacher": { - "description": "Label for the Teacher enrollment type", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Student": "Pelajar", - "@Student": { - "description": "Label for the Student enrollment type", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "TA": "PP", - "@TA": { - "description": "Label for the Teaching Assistant enrollment type (also known as Teacher Aid or Education Assistant), reduced to a short acronym/initialism if appropriate.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Observer": "Pemerhati", - "@Observer": { - "description": "Label for the Observer enrollment type", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Use Camera": "Gunakan Kamera", - "@Use Camera": { - "description": "Label for the action item that lets the user capture a photo using the device camera", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Upload File": "Muat Naik Fail", - "@Upload File": { - "description": "Label for the action item that lets the user upload a file from their device", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Choose from Gallery": "Pilih daripada Galeri", - "@Choose from Gallery": { - "description": "Label for the action item that lets the user select a photo from their device gallery", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Preparing…": "Menyediakan...", - "@Preparing…": { - "description": "Message shown while a file is being prepared to attach to a message", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Add student with…": "Tambah pelajar dengan...", - "@Add student with…": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Add Student": "Tambah Pelajar", - "@Add Student": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You are not observing any students.": "Anda tidak memerhatikan mana-mana pelajar.", - "@You are not observing any students.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading your students.": "Terdapat ralat untuk memuatkan pelajar anda.", - "@There was an error loading your students.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Pairing Code": "Kod Berpasangan", - "@Pairing Code": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Students can obtain a pairing code through the Canvas website": "Pelajar boleh mendapatkan kod berpasangan melalui laman web Canvas", - "@Students can obtain a pairing code through the Canvas website": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Enter the student pairing code provided to you. If the pairing code doesn't work, it may have expired": "Masukkan kod berpasangan pelajar yang diberikan kepada anda. Jika kod berpasangan tidak berfungsi, ia mungkin telah tamat tempoh", - "@Enter the student pairing code provided to you. If the pairing code doesn't work, it may have expired": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Your code is incorrect or expired.": "Kod anda tidak betul atau tamat tempoh.", - "@Your code is incorrect or expired.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Something went wrong trying to create your account, please reach out to your school for assistance.": "Sesuatu tidak kena semasa mencuba untuk mencipta akaun anda, sila berhubung dengan sekolah anda untuk mendapatkan bantuan", - "@Something went wrong trying to create your account, please reach out to your school for assistance.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "QR Code": "Kod QR", - "@QR Code": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Students can create a QR code using the Canvas Student app on their mobile device": "Pelajar boleh mencipta kod QR menggunakan apl Canvas Student pada peranti mudah alih mereka", - "@Students can create a QR code using the Canvas Student app on their mobile device": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Add new student": "Tambah pelajar baharu", - "@Add new student": { - "description": "Semantics label for the FAB on the Manage Students Screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Select": "Pilih", - "@Select": { - "description": "Hint text to tell the user to choose one of two options", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I have a Canvas account": "Saya sudah mempunyai akaun Canvas", - "@I have a Canvas account": { - "description": "Option to select for users that have a canvas account", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I don't have a Canvas account": "Saya tidak memiliki akaun Canvas", - "@I don't have a Canvas account": { - "description": "Option to select for users that don't have a canvas account", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Create Account": "Cipta Akaun", - "@Create Account": { - "description": "Button text for account creation confirmation", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Full Name": "Nama Penuh", - "@Full Name": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Email Address": "Alamat E-Mel", - "@Email Address": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Password": "Kata Laluan", - "@Password": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Full Name…": "Nama Penuh...", - "@Full Name…": { - "description": "hint label for inside form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Email…": "E-mel...", - "@Email…": { - "description": "hint label for inside form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Password…": "Kata Laluan...", - "@Password…": { - "description": "hint label for inside form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Please enter full name": "Sila masukkan nama penuh", - "@Please enter full name": { - "description": "Error message for form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Please enter an email address": "Sila masukkan alamat e-mel", - "@Please enter an email address": { - "description": "Error message for form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Please enter a valid email address": "Sila masukkan alamat e-mel yang sah", - "@Please enter a valid email address": { - "description": "Error message for form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Password is required": "Kata laluan diperlukan", - "@Password is required": { - "description": "Error message for form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Password must contain at least 8 characters": "Kata laluan mesti mengandungi sekurang-kurangnya 8 aksara", - "@Password must contain at least 8 characters": { - "description": "Error message for form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "qrCreateAccountTos": "Dengan mengetik 'Cipta Akaun', anda bersetuju untuk {termsOfService} dan memperakui {privacyPolicy}", - "@qrCreateAccountTos": { - "description": "The text show on the account creation screen", - "type": "text", - "placeholders_order": [ - "termsOfService", - "privacyPolicy" - ], - "placeholders": { - "termsOfService": {}, - "privacyPolicy": {} - } - }, - "Terms of Service": "Terma Perkhidmatan", - "@Terms of Service": { - "description": "Label for the Canvas Terms of Service agreement. This will be used in the qrCreateAccountTos text and will be highlighted and clickable", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Privacy Policy": "Dasar Privasi", - "@Privacy Policy": { - "description": "Label for the Canvas Privacy Policy agreement. This will be used in the qrCreateAccountTos text and will be highlighted and clickable", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "View the Privacy Policy": "Lihat Dasar Privasi", - "@View the Privacy Policy": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Already have an account? ": "Sudah memiliki akaun? ", - "@Already have an account? ": { - "description": "Part of multiline text span, includes AccountSignIn1-2, in that order", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Sign In": "Daftar Masuk", - "@Sign In": { - "description": "Part of multiline text span, includes AccountSignIn1-2, in that order", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Hide Password": "Sembunyikan Kata Laluan", - "@Hide Password": { - "description": "content description for password hide button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Show Password": "Tunjuk Kata Laluan", - "@Show Password": { - "description": "content description for password show button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Terms of Service Link": "Pautan Terma Perkhidmatan", - "@Terms of Service Link": { - "description": "content description for terms of service link", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Privacy Policy Link": "Pautan Dasar Privasi", - "@Privacy Policy Link": { - "description": "content description for privacy policy link", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Event": "Acara", - "@Event": { - "description": "Title for the event details screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Date": "Tarikh", - "@Date": { - "description": "Label for the event date", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Location": "Lokasi", - "@Location": { - "description": "Label for the location information", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Location Specified": "Tiada Lokasi Ditentukan", - "@No Location Specified": { - "description": "Description for events that do not have a location", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "eventTime": "{startAt} - {endAt}", - "@eventTime": { - "description": "The time the event is happening, example: \"2:00 pm - 4:00 pm\"", - "type": "text", - "placeholders_order": [ - "startAt", - "endAt" - ], - "placeholders": { - "startAt": {}, - "endAt": {} - } - }, - "Set a date and time to be notified of this event.": "Tetapkan tarikh dan masa untuk diberitahu mengenai acara ini.", - "@Set a date and time to be notified of this event.": { - "description": "Description for row to set event reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You will be notified about this event on…": "Anda akan diberitahu mengenai acara ini pada...", - "@You will be notified about this event on…": { - "description": "Description for when an event reminder is set", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Share Your Love for the App": "Kongsikan Rasa Teruja Anda terhadap Apl ini", - "@Share Your Love for the App": { - "description": "Label for option to open the app store", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Tell us about your favorite parts of the app": "Berita kami mengenai bahagian yang anda gemari pada apl ini", - "@Tell us about your favorite parts of the app": { - "description": "Description for option to open the app store", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Legal": "Undang-undang", - "@Legal": { - "description": "Label for legal information option", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Privacy policy, terms of use, open source": "Dasar privasi, terma penggunaan, sumber terbuka", - "@Privacy policy, terms of use, open source": { - "description": "Description for legal information option", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Idea for Canvas Parent App [Android]": "Idea untuk Apl Canvas Parent [Android]", - "@Idea for Canvas Parent App [Android]": { - "description": "The subject for the email to request a feature", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The following information will help us better understand your idea:": "Maklumat berikut akan membantu kami lebih memahami idea anda:", - "@The following information will help us better understand your idea:": { - "description": "The header for the users information that is attached to a feature request", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Domain:": "Domain:", - "@Domain:": { - "description": "The label for the Canvas domain of the logged in user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "User ID:": "ID Pengguna:", - "@User ID:": { - "description": "The label for the Canvas user ID of the logged in user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Email:": "E-mel:", - "@Email:": { - "description": "The label for the eamil of the logged in user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Locale:": "Tempatan:", - "@Locale:": { - "description": "The label for the locale of the logged in user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Terms of Use": "Terma Penggunaan", - "@Terms of Use": { - "description": "Label for the terms of use", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Canvas on GitHub": "Canvas di GitHub", - "@Canvas on GitHub": { - "description": "Label for the button that opens the Canvas project on GitHub's website", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was a problem loading the Terms of Use": "Terdapat masalah untuk memuatkan Terma Penggunaan.", - "@There was a problem loading the Terms of Use": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Device": "Peranti", - "@Device": { - "description": "Label used for device manufacturer/model in the error report", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "OS Version": "Versi OS", - "@OS Version": { - "description": "Label used for device operating system version in the error report", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Version Number": "Nombor Versi", - "@Version Number": { - "description": "Label used for the app version number in the error report", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Report A Problem": "Laporkan Masalah", - "@Report A Problem": { - "description": "Title used for generic dialog to report problems", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Subject": "Subjek", - "@Subject": { - "description": "Label used for Subject text field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "A subject is required.": "Subjek diperlukan.", - "@A subject is required.": { - "description": "Error shown when the subject field is empty", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "An email address is required.": "Alamat e-mel diperlukan.", - "@An email address is required.": { - "description": "Error shown when the email field is empty", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Description": "Penerangan", - "@Description": { - "description": "Label used for Description text field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "A description is required.": "Penerangan diperlukan.", - "@A description is required.": { - "description": "Error shown when the description field is empty", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "How is this affecting you?": "Bagaimanakah hal ini mempengaruhi anda?", - "@How is this affecting you?": { - "description": "Label used for the dropdown to select how severe the issue is", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "send": "hantar", - "@send": { - "description": "Label used for send button when reporting a problem", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Just a casual question, comment, idea, suggestion…": "Hanya soalan, komen, idea dan cadangan santai...", - "@Just a casual question, comment, idea, suggestion…": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I need some help but it's not urgent.": "Saya perlukan sedikit bantuan tetapi ia tidak mendesak.", - "@I need some help but it's not urgent.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Something's broken but I can work around it to get what I need done.": "Sesuatu tidak kena tetapi saya masih boleh mengatasinya pada masa ini untuk melakukan perkara yang saya ingin lakukan.", - "@Something's broken but I can work around it to get what I need done.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I can't get things done until I hear back from you.": "Saya tidak dapat menyelesaikan perkara ini sehingga saya menerima maklum balas daripada anda.", - "@I can't get things done until I hear back from you.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "EXTREME CRITICAL EMERGENCY!!": "KECEMASAN KRITIKAL MELAMPAU!!", - "@EXTREME CRITICAL EMERGENCY!!": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Not Graded": "Tidak Bergred", - "@Not Graded": { - "description": "Description for an assignment has not been graded.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Login flow: Normal": "Aliran log masuk: Biasa", - "@Login flow: Normal": { - "description": "Description for the normal login flow", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Login flow: Canvas": "Aliran log masuk: Canvas", - "@Login flow: Canvas": { - "description": "Description for the Canvas login flow", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Login flow: Site Admin": "Aliran log masuk: Pentadbir Laman Web", - "@Login flow: Site Admin": { - "description": "Description for the Site Admin login flow", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Login flow: Skip mobile verify": "Aliran log masuk: Langkau pengesahan mudah alih", - "@Login flow: Skip mobile verify": { - "description": "Description for the login flow that skips domain verification for mobile", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Act As User": "Bertindak Sebagai Pengguna", - "@Act As User": { - "description": "Label for the button that allows the user to act (masquerade) as another user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Stop Acting as User": "Berhenti Bertindak sebagai Pengguna", - "@Stop Acting as User": { - "description": "Label for the button that allows the user to stop acting (masquerading) as another user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "actingAsUser": "Anda bertindak sebagai {userName}", - "@actingAsUser": { - "description": "Message shown while acting (masquerading) as another user", - "type": "text", - "placeholders_order": [ - "userName" - ], - "placeholders": { - "userName": {} - } - }, - "\"Act as\" is essentially logging in as this user without a password. You will be able to take any action as if you were this user, and from other users' points of views, it will be as if this user performed them. However, audit logs record that you were the one who performed the actions on behalf of this user.": "\"Bertindak sebagai\" pada asasnya ialah log masuk sebagai pengguna ini tanpa kata laluan. Anda akan dapat mengambil tindakan seolah-olah anda pengguna ini, dan dari sudut pandang pengguna lain, akan menjadikan seolah-olah pengguna ini melaksanakan tindakan tersebut. Namun begitu, log audit merekodkan bahawa anda ialah orang yang melaksanakan tindakan bagi pihak pengguna ini.", - "@\"Act as\" is essentially logging in as this user without a password. You will be able to take any action as if you were this user, and from other users' points of views, it will be as if this user performed them. However, audit logs record that you were the one who performed the actions on behalf of this user.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Domain": "Domain", - "@Domain": { - "description": "Text field hint for domain url input", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You must enter a valid domain": "Anda mesti memasukkan domain yang sah", - "@You must enter a valid domain": { - "description": "Message displayed for domain input error", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "User ID": "ID Pengguna", - "@User ID": { - "description": "Text field hint for user ID input", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You must enter a user id": "Anda mesti memasukkan id pengguna yang sah", - "@You must enter a user id": { - "description": "Message displayed for user Id input error", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error trying to act as this user. Please check the Domain and User ID and try again.": "Terdapat ralat semasa cuba bertindak sebagai pengguna ini. Sila semak Domain dan ID Pengguna kemudian cuba semula.", - "@There was an error trying to act as this user. Please check the Domain and User ID and try again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "endMasqueradeMessage": "Anda akan berhenti bertindak sebagai {userName} dan kembali ke akaun asal anda.", - "@endMasqueradeMessage": { - "description": "Confirmation message displayed when the user wants to stop acting (masquerading) as another user", - "type": "text", - "placeholders_order": [ - "userName" - ], - "placeholders": { - "userName": {} - } - }, - "endMasqueradeLogoutMessage": "Anda akan berhenti bertindak sebagai {userName} dan dilog keluar.", - "@endMasqueradeLogoutMessage": { - "description": "Confirmation message displayed when the user wants to stop acting (masquerading) as another user and will be logged out.", - "type": "text", - "placeholders_order": [ - "userName" - ], - "placeholders": { - "userName": {} - } - }, - "How are we doing?": "Bagaimana keadaan kita sekarang?", - "@How are we doing?": { - "description": "Title for dialog asking user to rate the app out of 5 stars.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Don't show again": "Jangan Tunjuk Lagi", - "@Don't show again": { - "description": "Button to prevent the rating dialog from showing again.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "What can we do better?": "Apakah yang boleh kita tambah baik?", - "@What can we do better?": { - "description": "Hint text for providing a comment with the rating.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Send Feedback": "Hantar Maklum Balas", - "@Send Feedback": { - "description": "Button to send rating with feedback", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "ratingDialogEmailSubject": "Cadangan untuk Android - Canvas Parent {version}", - "@ratingDialogEmailSubject": { - "description": "The subject for an email to provide feedback for CanvasParent.", - "type": "text", - "placeholders_order": [ - "version" - ], - "placeholders": { - "version": {} - } - }, - "starRating": "{position,plural, =1{{position} bintang}other{{position} bintang}}", - "@starRating": { - "description": "Accessibility label for the 1 stars to 5 stars rating", - "type": "text", - "placeholders_order": [ - "position" - ], - "placeholders": { - "position": { - "example": 1 - } - } - }, - "Student Pairing": "Pemasangan Pelajar", - "@Student Pairing": { - "description": "Title for the screen where users can pair to students using a QR code", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Open Canvas Student": "Buka Canvas Student", - "@Open Canvas Student": { - "description": "Title for QR pairing tutorial screen instructing users to open the Canvas Student app", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You'll need to open your student's Canvas Student app to continue. Go into Main Menu > Settings > Pair with Observer and scan the QR code you see there.": "Anda perlu membuka apl Canvas Student pelajar anda untuk meneruskan. Pergi ke Menu Utama > Tetapan > Pasangkan dengan Pemerhati dan imbas kod QR yang anda lihat di sana.", - "@You'll need to open your student's Canvas Student app to continue. Go into Main Menu > Settings > Pair with Observer and scan the QR code you see there.": { - "description": "Message explaining how QR code pairing works", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Screenshot showing location of pairing QR code generation in the Canvas Student app": "Syot layar yang menunjukkan lokasi penjanaan kod QR berpasangan dalam apl Canvas Student", - "@Screenshot showing location of pairing QR code generation in the Canvas Student app": { - "description": "Content Description for qr pairing tutorial screenshot", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Expired QR Code": "Kod QR Tamat Tempoh", - "@Expired QR Code": { - "description": "Error title shown when the users scans a QR code that has expired", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The QR code you scanned may have expired. Refresh the code on the student's device and try again.": "Kod QR yang anda imbas mungkin telah tamat tempoh. Segarkan semula kod pada peranti pelajar dan cuba semula.", - "@The QR code you scanned may have expired. Refresh the code on the student's device and try again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "A network error occurred when adding this student. Check your connection and try again.": "Ralat rangkaian berlaku apabila menambah pelajar ini. Semak sambungan anda dan cuba semula.", - "@A network error occurred when adding this student. Check your connection and try again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Invalid QR Code": "Kod QR Tidak Sah", - "@Invalid QR Code": { - "description": "Error title shown when the user scans an invalid QR code", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Incorrect Domain": "Domain Tidak Betul", - "@Incorrect Domain": { - "description": "Error title shown when the users scane a QR code for a student that belongs to a different domain", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The student you are trying to add belongs to a different school. Log in or create an account with that school to scan this code.": "Pelajar yang anda cuba tambah tergolong dalam sekolah yang berbeza. Log masuk atau cipta akuan dengan sekolah tersebut untuk mengimbas kod ini.", - "@The student you are trying to add belongs to a different school. Log in or create an account with that school to scan this code.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Camera Permission": "Keizinan Kamera", - "@Camera Permission": { - "description": "Error title shown when the user wans to scan a QR code but has denied the camera permission", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "This will unpair and remove all enrollments for this student from your account.": "Tindakan ini akan menyahpasang dan mengalih kelaur semua pendaftaran untuk pelajar ini daripada akaun anda.", - "@This will unpair and remove all enrollments for this student from your account.": { - "description": "Confirmation message shown when the user tries to delete a student from their account", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was a problem removing this student from your account. Please check your connection and try again.": "Terdapat masalah untuk mengeluarkan pelajar ini daripada akaun anda. Sila semak sambungan anda dan cuba semula.", - "@There was a problem removing this student from your account. Please check your connection and try again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Cancel": "Batal", - "@Cancel": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "next": "Seterusnya", - "@next": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "ok": "OK", - "@ok": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Yes": "Ya", - "@Yes": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No": "Tidak", - "@No": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Retry": "Cuba semula", - "@Retry": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Delete": "Padam", - "@Delete": { - "description": "Label used for general delete/remove actions", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Done": "Siap", - "@Done": { - "description": "Label for general done/finished actions", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Refresh": "Segar semula", - "@Refresh": { - "description": "Label for button to refresh data from the web", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "View Description": "Lihat Penerangan", - "@View Description": { - "description": "Button to view the description for an event or assignment", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "expanded": "dikembangkan", - "@expanded": { - "description": "Description for the accessibility reader for list groups that are expanded", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "collapsed": "dikuncupkan", - "@collapsed": { - "description": "Description for the accessibility reader for list groups that are expanded", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "An unexpected error occurred": "Ralat tidak dijangka berlaku", - "@An unexpected error occurred": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No description": "Tiada penerangan", - "@No description": { - "description": "Message used when the assignment has no description", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Launch External Tool": "Lancarkan Alat Luar", - "@Launch External Tool": { - "description": "Button text added to webviews to let users open external tools in their browser", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Interactions on this page are limited by your institution.": "Interaksi pada halaman ini dihadkan oleh institusi anda.", - "@Interactions on this page are limited by your institution.": { - "description": "Message describing how the webview has limited access due to an instution setting", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "dateAtTime": "{date} di {time}", - "@dateAtTime": { - "description": "The string to format dates", - "type": "text", - "placeholders_order": [ - "date", - "time" - ], - "placeholders": { - "date": {}, - "time": {} - } - }, - "dueDateAtTime": "Cukup tempoh {date} pada {time}", - "@dueDateAtTime": { - "description": "The string to format due dates", - "type": "text", - "placeholders_order": [ - "date", - "time" - ], - "placeholders": { - "date": {}, - "time": {} - } - }, - "No Due Date": "Tiada Tarikh Siap", - "@No Due Date": { - "description": "Label for assignments that do not have a due date", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Filter": "Tapis", - "@Filter": { - "description": "Label for buttons to filter what items are visible", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "unread": "belum dibaca", - "@unread": { - "description": "Label for things that are marked as unread", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "unreadCount": "{count} belum dibaca.", - "@unreadCount": { - "description": "Formatted string for when there are a number of unread items", - "type": "text", - "placeholders_order": [ - "count" - ], - "placeholders": { - "count": {} - } - }, - "badgeNumberPlus": "{count}+", - "@badgeNumberPlus": { - "description": "Formatted string for when too many items are being notified in a badge, generally something like: 99+", - "type": "text", - "placeholders_order": [ - "count" - ], - "placeholders": { - "count": {} - } - }, - "There was an error loading this announcement": "Terdapat ralat untuk memuatkan pengumuman ini", - "@There was an error loading this announcement": { - "description": "Message shown when an announcement detail screen fails to load", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Network error": "Ralat rangkaian", - "@Network error": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Under Construction": "Dalam Pembinaan", - "@Under Construction": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "We are currently building this feature for your viewing pleasure.": "Kami sedang membina ciri ini untuk meningkatkan pengalaman tontonan anda.", - "@We are currently building this feature for your viewing pleasure.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Request Login Help Button": "Minta Butang Bantuan Log Masuk", - "@Request Login Help Button": { - "description": "Accessibility hint for button that opens help dialog for a login help request", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Request Login Help": "Minta Bantuan Log Masuk", - "@Request Login Help": { - "description": "Title of help dialog for a login help request", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I'm having trouble logging in": "Saya menghadapi masalah untuk log masuk", - "@I'm having trouble logging in": { - "description": "Subject of help dialog for a login help request", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "An error occurred when trying to display this link": "Ralat berlaku semasa cuba memaparkan pautan ini", - "@An error occurred when trying to display this link": { - "description": "Error message shown when a link can't be opened", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "We are unable to display this link, it may belong to an institution you currently aren't logged in to.": "Kami tidak dapat memaparkan pautan ini, ia mungkin dimiliki oleh institusi yang anda tidak log masuk pada masa ini.", - "@We are unable to display this link, it may belong to an institution you currently aren't logged in to.": { - "description": "Description for error page shown when clicking a link", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Link Error": "Ralat Pautan", - "@Link Error": { - "description": "Title for error page shown when clicking a link", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Open In Browser": "Buka dalam Pelayar", - "@Open In Browser": { - "description": "Text for button to open a link in the browswer", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You'll find the QR code on the web in your account profile. Click 'QR for Mobile Login' in the list.": "Anda akan menemui kod QR di web dalam profil akaun anda. Klik 'QR untuk Log Masuk Mudah Alih' dalam senarai.", - "@You'll find the QR code on the web in your account profile. Click 'QR for Mobile Login' in the list.": { - "description": "Text for qr login tutorial screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Locate QR Code": "Kesan Kod QR", - "@Locate QR Code": { - "description": "Text for qr login button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Please scan a QR code generated by Canvas": "Sila imbas kod QR yang dijana oleh Canvas", - "@Please scan a QR code generated by Canvas": { - "description": "Text for qr login error with incorrect qr code", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error logging in. Please generate another QR Code and try again.": "Terdapat ralat log masuk. Sila jana Kod QR lain dan cuba semula.", - "@There was an error logging in. Please generate another QR Code and try again.": { - "description": "Text for qr login error", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Screenshot showing location of QR code generation in browser": "Syot layar menunjukkan lokasi penjanaan kod QR dalam pelayar", - "@Screenshot showing location of QR code generation in browser": { - "description": "Content Description for qr login tutorial screenshot", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "QR scanning requires camera access": "Pengimbasan QR memerlukan akses kamera", - "@QR scanning requires camera access": { - "description": "placeholder for camera error for QR code scan", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The linked item is no longer available": "Item yang dipautkan tidak lagi tersedia", - "@The linked item is no longer available": { - "description": "error message when the alert could no be opened", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Message sent": "Mesej dihantar", - "@Message sent": { - "description": "confirmation message on the screen when the user succesfully sends a message", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Acceptable Use Policy": "Dasar Penggunaan Boleh Diterima", - "@Acceptable Use Policy": { - "description": "title for the acceptable use policy screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Submit": "Serahkan", - "@Submit": { - "description": "submit button title for acceptable use policy screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Either you're a new user or the Acceptable Use Policy has changed since you last agreed to it. Please agree to the Acceptable Use Policy before you continue.": "Sama ada anda pengguna baharu atau Dasar Penggunaan Boleh Diterima telah berubah sejak anda kali terakhir menyatakan persetujuan berkenaannya. Sila nyatakan persetujuan anda dengan Dasar Penggunaan Boleh Diterima sebelum anda meneruskan.", - "@Either you're a new user or the Acceptable Use Policy has changed since you last agreed to it. Please agree to the Acceptable Use Policy before you continue.": { - "description": "acceptable use policy screen description", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I agree to the Acceptable Use Policy.": "Anda mesti memberikan persetujuan untuk Dasar Penggunaan Boleh Diterima.", - "@I agree to the Acceptable Use Policy.": { - "description": "acceptable use policy switch title", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "About": "Perihal", - "@About": { - "description": "Title for about menu item in settings", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "App": "Apl", - "@App": { - "description": "Title for App field on about page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Login ID": "ID Log Masuk", - "@Login ID": { - "description": "Title for Login ID field on about page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Email": "E-mel", - "@Email": { - "description": "Title for Email field on about page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Version": "Versi", - "@Version": { - "description": "Title for Version field on about page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Instructure logo": "Logo Instructure", - "@Instructure logo": { - "description": "Semantics label for the Instructure logo on the about page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - } -} \ No newline at end of file diff --git a/apps/flutter_parent/lib/l10n/res/intl_nb.arb b/apps/flutter_parent/lib/l10n/res/intl_nb.arb deleted file mode 100644 index be343afbd5..0000000000 --- a/apps/flutter_parent/lib/l10n/res/intl_nb.arb +++ /dev/null @@ -1,2753 +0,0 @@ -{ - "@@last_modified": "2023-08-25T11:04:20.901151", - "alertsLabel": "Varsler", - "@alertsLabel": { - "description": "The label for the Alerts tab", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "calendarLabel": "Kalender", - "@calendarLabel": { - "description": "The label for the Calendar tab", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "coursesLabel": "Emner", - "@coursesLabel": { - "description": "The label for the Courses tab", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Students": "Ingen studenter", - "@No Students": { - "description": "Text for when an observer has no students they are observing", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Tap to show student selector": "Trykk for å vise studentvelger", - "@Tap to show student selector": { - "description": "Semantics label for the area that will show the student selector when tapped", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Tap to pair with a new student": "Trykk for å pare opp mot ny student", - "@Tap to pair with a new student": { - "description": "Semantics label for the add student button in the student selector", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Tap to select this student": "Trykk for å velge denne studenten", - "@Tap to select this student": { - "description": "Semantics label on individual students in the student switcher", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Manage Students": "Administrer studenter", - "@Manage Students": { - "description": "Label text for the Manage Students nav drawer button as well as the title for the Manage Students screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Help": "Hjelp", - "@Help": { - "description": "Label text for the help nav drawer button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Log Out": "Logg Ut", - "@Log Out": { - "description": "Label text for the Log Out nav drawer button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Switch Users": "Bytt brukere", - "@Switch Users": { - "description": "Label text for the Switch Users nav drawer button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "appVersion": "v. {version}", - "@appVersion": { - "description": "App version shown in the navigation drawer", - "type": "text", - "placeholders_order": [ - "version" - ], - "placeholders": { - "version": {} - } - }, - "Are you sure you want to log out?": "Er du sikker på at du vil logge ut?", - "@Are you sure you want to log out?": { - "description": "Confirmation message displayed when the user tries to log out", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Calendars": "Kalendere", - "@Calendars": { - "description": "Label for button that lets users select which calendars to display", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "nextMonth": "Neste måned: {month}", - "@nextMonth": { - "description": "Label for the button that switches the calendar to the next month", - "type": "text", - "placeholders_order": [ - "month" - ], - "placeholders": { - "month": {} - } - }, - "previousMonth": "Forrige måned: {month}", - "@previousMonth": { - "description": "Label for the button that switches the calendar to the previous month", - "type": "text", - "placeholders_order": [ - "month" - ], - "placeholders": { - "month": {} - } - }, - "nextWeek": "Neste uke begynner {date}", - "@nextWeek": { - "description": "Label for the button that switches the calendar to the next week", - "type": "text", - "placeholders_order": [ - "date" - ], - "placeholders": { - "date": {} - } - }, - "previousWeek": "Forrige uke begynte {date}", - "@previousWeek": { - "description": "Label for the button that switches the calendar to the previous week", - "type": "text", - "placeholders_order": [ - "date" - ], - "placeholders": { - "date": {} - } - }, - "selectedMonthLabel": "Måned {month}", - "@selectedMonthLabel": { - "description": "Accessibility label for the button that expands/collapses the month view", - "type": "text", - "placeholders_order": [ - "month" - ], - "placeholders": { - "month": {} - } - }, - "expand": "utvid", - "@expand": { - "description": "Accessibility label for the on-tap hint for the button that expands/collapses the month view", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "collapse": "skjult", - "@collapse": { - "description": "Accessibility label for the on-tap hint for the button that expands/collapses the month view", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "pointsPossible": "{points} poeng oppnåelig", - "@pointsPossible": { - "description": "Screen reader label used for the points possible for an assignment, quiz, etc.", - "type": "text", - "placeholders_order": [ - "points" - ], - "placeholders": { - "points": {} - } - }, - "calendarDaySemanticsLabel": "{eventCount,plural, =1{{date}, {eventCount} hendelse}other{{date}, {eventCount} hendelser}}", - "@calendarDaySemanticsLabel": { - "description": "Screen reader label used for calendar day, reads the date and count of events", - "type": "text", - "placeholders_order": [ - "date", - "eventCount" - ], - "placeholders": { - "date": {}, - "eventCount": {} - } - }, - "No Events Today!": "Ingen arrangementer i dag!", - "@No Events Today!": { - "description": "Title displayed when there are no calendar events for the current day", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "It looks like a great day to rest, relax, and recharge.": "Det ser ut som dette er en flott dag til å slappe av og lade batteriene.", - "@It looks like a great day to rest, relax, and recharge.": { - "description": "Message displayed when there are no calendar events for the current day", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading your student's calendar": "Det oppsto en feil under lasting av din studentkalender.", - "@There was an error loading your student's calendar": { - "description": "Message displayed when calendar events could not be loaded for the current student", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Tap to favorite the courses you want to see on the Calendar. Select up to 10.": "Trykk for å velge emnene du ønsker på se på kalenderen. Velg opptil 10.", - "@Tap to favorite the courses you want to see on the Calendar. Select up to 10.": { - "description": "Description text on calendar filter screen.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You may only choose 10 calendars to display": "Du kan kun velge 10 kalendere som skal vises", - "@You may only choose 10 calendars to display": { - "description": "Error text when trying to select more than 10 calendars", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You must select at least one calendar to display": "Du må velge minst én kalender som skal vises", - "@You must select at least one calendar to display": { - "description": "Error text when trying to de-select all calendars", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Planner Note": "Planleggingsmerknad", - "@Planner Note": { - "description": "Label used for notes in the planner", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Go to today": "Gå til idag", - "@Go to today": { - "description": "Accessibility label used for the today button in the planner", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Previous Logins": "Tidligere innlogginger", - "@Previous Logins": { - "description": "Label for the list of previous user logins", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "canvasLogoLabel": "Canvas-logo", - "@canvasLogoLabel": { - "description": "The semantics label for the Canvas logo", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "findSchool": "Finne skole", - "@findSchool": { - "description": "Text for the find-my-school button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "findAnotherSchool": "Finn en annen skole", - "@findAnotherSchool": { - "description": "Text for the find-another-school button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "domainSearchInputHint": "Skriv inn skolenavn eller område…", - "@domainSearchInputHint": { - "description": "Input hint for the text box on the domain search screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "noDomainResults": "Kan ikke finne skoler som stemmer med \"{query}\"", - "@noDomainResults": { - "description": "Message shown to users when the domain search query did not return any results", - "type": "text", - "placeholders_order": [ - "query" - ], - "placeholders": { - "query": {} - } - }, - "domainSearchHelpLabel": "Hvordan finner jeg skolen eller området mitt?", - "@domainSearchHelpLabel": { - "description": "Label for the help button on the domain search screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "canvasGuides": "Canvas-guider", - "@canvasGuides": { - "description": "Proper name for the Canvas Guides. This will be used in the domainSearchHelpBody text and will be highlighted and clickable", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "canvasSupport": "Canvas Support", - "@canvasSupport": { - "description": "Proper name for Canvas Support. This will be used in the domainSearchHelpBody text and will be highlighted and clickable", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "domainSearchHelpBody": "Prøv å søke på navnet til skolen eller området du forsøker å få tilgang til som f.eks. “Smith privatskole” eller “Smith kommunal skole.” Du kan også angi et Canvas-domene direkte som f.eks. “smith.instructure.com.”\n\nHvis du vil ha mer informasjon om hvordan du finner Canvas-kontoen til din institusjon, besøk {canvasGuides}, spør etter {canvasSupport} eller kontakt skolen din for hjelp.", - "@domainSearchHelpBody": { - "description": "The body text shown in the help dialog on the domain search screen", - "type": "text", - "placeholders_order": [ - "canvasGuides", - "canvasSupport" - ], - "placeholders": { - "canvasGuides": {}, - "canvasSupport": {} - } - }, - "Uh oh!": "Oi sann!", - "@Uh oh!": { - "description": "Title of the screen that shows when a crash has occurred", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "We’re not sure what happened, but it wasn’t good. Contact us if this keeps happening.": "Vi vet ikke hva som skjedde her, men det ser ikke bra ut. Ta kontakt med oss hvis denne situasjonen vedvarer.", - "@We’re not sure what happened, but it wasn’t good. Contact us if this keeps happening.": { - "description": "Message shown when a crash has occurred", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Contact Support": "Ta kontakt med kundestøtte", - "@Contact Support": { - "description": "Label for the button that allows users to contact support after a crash has occurred", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "View error details": "Vis feildetaljer", - "@View error details": { - "description": "Label for the button that allowed users to view crash details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Restart app": "Start app på nytt", - "@Restart app": { - "description": "Label for the button that will restart the entire application", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Application version": "Applikasjonsversjon", - "@Application version": { - "description": "Label for the application version displayed in the crash details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Device model": "Enhetsmodell", - "@Device model": { - "description": "Label for the device model displayed in the crash details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Android OS version": "Android OS-versjon", - "@Android OS version": { - "description": "Label for the Android operating system version displayed in the crash details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Full error message": "Fullstendig feilmelding", - "@Full error message": { - "description": "Label for the full error message displayed in the crash details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Inbox": "Innboks", - "@Inbox": { - "description": "Title for the Inbox screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading your inbox messages.": "Det oppsto en feil under lasting av innboksmeldingene dine.", - "@There was an error loading your inbox messages.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Subject": "Ingen tittel", - "@No Subject": { - "description": "Title used for inbox messages that have no subject", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unable to fetch courses. Please check your connection and try again.": "Kan ikke hente emner. Kontroller tilkoblingen og prøv på nytt.", - "@Unable to fetch courses. Please check your connection and try again.": { - "description": "Message shown when an error occured while loading courses", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Choose a course to message": "Velg et emne du vil sende melding til", - "@Choose a course to message": { - "description": "Header in the course list shown when the user is choosing which course to associate with a new message", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Inbox Zero": "Innboks null", - "@Inbox Zero": { - "description": "Title of the message shown when there are no inbox messages", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You’re all caught up!": "Du er oppdatert!", - "@You’re all caught up!": { - "description": "Subtitle of the message shown when there are no inbox messages", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading recipients for this course": "Det oppsto en feil under lasting av mottakere for dette emnet.", - "@There was an error loading recipients for this course": { - "description": "Message shown when attempting to create a new message but the recipients list failed to load", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unable to send message. Check your connection and try again.": "Kan ikke sende melding. Kontroller tilkoblingen og prøv på nytt.", - "@Unable to send message. Check your connection and try again.": { - "description": "Message show when there was an error creating or sending a new message", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unsaved changes": "Ulagrede endringer", - "@Unsaved changes": { - "description": "Title of the dialog shown when the user tries to leave with unsaved changes", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Are you sure you wish to close this page? Your unsent message will be lost.": "Er du sikker på at du vil lukke denne siden? Dine usendte meldinger vil bli slettet.", - "@Are you sure you wish to close this page? Your unsent message will be lost.": { - "description": "Body text of the dialog shown when the user tries leave with unsaved changes", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "New message": "Ny melding", - "@New message": { - "description": "Title of the new-message screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Add attachment": "Legg til vedlegg", - "@Add attachment": { - "description": "Tooltip for the add-attachment button in the new-message screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Send message": "Send melding", - "@Send message": { - "description": "Tooltip for the send-message button in the new-message screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Select recipients": "Velg mottakere", - "@Select recipients": { - "description": "Tooltip for the button that allows users to select message recipients", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No recipients selected": "Ingen mottakere er valgt", - "@No recipients selected": { - "description": "Hint displayed when the user has not selected any message recipients", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Message subject": "Meldingstittel", - "@Message subject": { - "description": "Hint text displayed in the input field for the message subject", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Message": "Melding", - "@Message": { - "description": "Hint text displayed in the input field for the message body", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Recipients": "Mottakere", - "@Recipients": { - "description": "Label for message recipients", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "plusRecipientCount": "+{count}", - "@plusRecipientCount": { - "description": "Shows the number of recipients that are selected but not displayed on screen.", - "type": "text", - "placeholders_order": [ - "count" - ], - "placeholders": { - "count": { - "example": 5 - } - } - }, - "Failed. Tap for options.": "Mislyktes. Trykk for alternativer.", - "@Failed. Tap for options.": { - "description": "Short message shown on a message attachment when uploading has failed", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "courseForWhom": "for {studentShortName}", - "@courseForWhom": { - "description": "Describes for whom a course is for (i.e. for Bill)", - "type": "text", - "placeholders_order": [ - "studentShortName" - ], - "placeholders": { - "studentShortName": {} - } - }, - "messageLinkPostscript": "Vedrørende: {studentName}, {linkUrl}", - "@messageLinkPostscript": { - "description": "A postscript appended to new messages that clarifies which student is the subject of the message and also includes a URL for the related Canvas component (course, assignment, event, etc).", - "type": "text", - "placeholders_order": [ - "studentName", - "linkUrl" - ], - "placeholders": { - "studentName": {}, - "linkUrl": {} - } - }, - "There was an error loading this conversation": "Det oppsto en feil under lasting av denne samtalen", - "@There was an error loading this conversation": { - "description": "Message shown when a conversation fails to load", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Reply": "Svar", - "@Reply": { - "description": "Button label for replying to a conversation", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Reply All": "Svar alle", - "@Reply All": { - "description": "Button label for replying to all conversation participants", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unknown User": "Ukjent bruker", - "@Unknown User": { - "description": "Label used where the user name is not known", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "me": "meg", - "@me": { - "description": "First-person pronoun (i.e. 'me') that will be used in message author info, e.g. 'Me to 4 others' or 'Jon Snow to me'", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "authorToRecipient": "{authorName} til {recipientName}", - "@authorToRecipient": { - "description": "Author info for a single-recipient message; includes both the author name and the recipient name.", - "type": "text", - "placeholders_order": [ - "authorName", - "recipientName" - ], - "placeholders": { - "authorName": {}, - "recipientName": {} - } - }, - "authorToNOthers": "{howMany,plural, =1{{authorName} til 1 annen}other{{authorName} til {howMany} andre}}", - "@authorToNOthers": { - "description": "Author info for a mutli-recipient message; includes the author name and the number of recipients", - "type": "text", - "placeholders_order": [ - "authorName", - "howMany" - ], - "placeholders": { - "authorName": {}, - "howMany": {} - } - }, - "authorToRecipientAndNOthers": "{howMany,plural, =1{{authorName} til {recipientName} og 1 annen}other{{authorName} til {recipientName} og {howMany} andre}}", - "@authorToRecipientAndNOthers": { - "description": "Author info for a multi-recipient message; includes the author name, one recipient name, and the number of other recipients", - "type": "text", - "placeholders_order": [ - "authorName", - "recipientName", - "howMany" - ], - "placeholders": { - "authorName": {}, - "recipientName": {}, - "howMany": {} - } - }, - "Download": "Last ned", - "@Download": { - "description": "Label for the button that will begin downloading a file", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Open with another app": "Åpne med en annen app", - "@Open with another app": { - "description": "Label for the button that will allow users to open a file with another app", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There are no installed applications that can open this file": "Det finnes ingen installerte applikasjoner som kan åpne denne filen", - "@There are no installed applications that can open this file": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unsupported File": "Filtypen støttes ikke", - "@Unsupported File": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "This file is unsupported and can’t be viewed through the app": "Denne filtypen støttes ikke og kan ikke vises på appen", - "@This file is unsupported and can’t be viewed through the app": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unable to play this media file": "Kan ikke spille av mediefilen", - "@Unable to play this media file": { - "description": "Message shown when audio or video media could not be played", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unable to load this image": "Kan ikke laste bildet", - "@Unable to load this image": { - "description": "Message shown when an image file could not be loaded or displayed", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading this file": "Det oppsto en feil under lasting av denne filen", - "@There was an error loading this file": { - "description": "Message shown when a file could not be loaded or displayed", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Courses": "Ingen emner", - "@No Courses": { - "description": "Title for having no courses", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Your student’s courses might not be published yet.": "Emnene til studentene dine er kanskje upublisert enda.", - "@Your student’s courses might not be published yet.": { - "description": "Message for having no courses", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading your student’s courses.": "Det oppsto en feil under lasting av studentemnene dine.", - "@There was an error loading your student’s courses.": { - "description": "Message displayed when the list of student courses could not be loaded", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Grade": "Ingen vurdering", - "@No Grade": { - "description": "Message shown when there is currently no grade available for a course", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Filter by": "Filtrer etter", - "@Filter by": { - "description": "Title for list of terms to filter grades by", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Grades": "Vurderinger", - "@Grades": { - "description": "Label for the \"Grades\" tab in course details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Syllabus": "Emneoversikt", - "@Syllabus": { - "description": "Label for the \"Syllabus\" tab in course details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Front Page": "Forside", - "@Front Page": { - "description": "Label for the \"Front Page\" tab in course details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Summary": "Sammendrag", - "@Summary": { - "description": "Label for the \"Summary\" tab in course details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Send a message about this course": "Send en melding om dette emnet", - "@Send a message about this course": { - "description": "Accessibility hint for the course messaage floating action button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Total Grade": "Samlet vurdering", - "@Total Grade": { - "description": "Label for the total grade in the course", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Graded": "Vurdert", - "@Graded": { - "description": "Label for assignments that have been graded", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Submitted": "Innlevert", - "@Submitted": { - "description": "Label for assignments that have been submitted", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Not Submitted": "Ikke levert", - "@Not Submitted": { - "description": "Label for assignments that have not been submitted", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Late": "Sent", - "@Late": { - "description": "Label for assignments that have been marked late or submitted late", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Missing": "Mangler", - "@Missing": { - "description": "Label for assignments that have been marked missing or are not submitted and past the due date", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "-": "-", - "@-": { - "description": "Value representing no score for student submission", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "All Grading Periods": "Alle vurderingsperioder", - "@All Grading Periods": { - "description": "Label for selecting all grading periods", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Assignments": "Ingen oppgaver", - "@No Assignments": { - "description": "Title for the no assignments message", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "It looks like assignments haven't been created in this space yet.": "Det ser ut som det ikke er opprettet oppgaver i dette området enda.", - "@It looks like assignments haven't been created in this space yet.": { - "description": "Message for no assignments", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading the summary details for this course.": "Det oppsto en feil under lasting av sammendragsdetaljer for dette emnet.", - "@There was an error loading the summary details for this course.": { - "description": "Message shown when the course summary could not be loaded", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Summary": "Ingen sammendrag", - "@No Summary": { - "description": "Title displayed when there are no items in the course summary", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "This course does not have any assignments or calendar events yet.": "Dette emnet mangler fortsatt oppgaver eller kalenderhendelser.", - "@This course does not have any assignments or calendar events yet.": { - "description": "Message displayed when there are no items in the course summary", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "gradeFormatScoreOutOfPointsPossible": "{score}/{pointsPossible}", - "@gradeFormatScoreOutOfPointsPossible": { - "description": "Formatted string for a student score out of the points possible", - "type": "text", - "placeholders_order": [ - "score", - "pointsPossible" - ], - "placeholders": { - "score": {}, - "pointsPossible": {} - } - }, - "contentDescriptionScoreOutOfPointsPossible": "{score} av {pointsPossible} poeng", - "@contentDescriptionScoreOutOfPointsPossible": { - "description": "Formatted string for a student score out of the points possible", - "type": "text", - "placeholders_order": [ - "score", - "pointsPossible" - ], - "placeholders": { - "score": {}, - "pointsPossible": {} - } - }, - "gradesSubjectMessage": "Vedrørende: {studentName}, Vurderinger", - "@gradesSubjectMessage": { - "description": "The subject line for a message to a teacher regarding a student's grades", - "type": "text", - "placeholders_order": [ - "studentName" - ], - "placeholders": { - "studentName": {} - } - }, - "syllabusSubjectMessage": "Vedrørende: {studentName}, Emneoversikt", - "@syllabusSubjectMessage": { - "description": "The subject line for a message to a teacher regarding a course syllabus", - "type": "text", - "placeholders_order": [ - "studentName" - ], - "placeholders": { - "studentName": {} - } - }, - "frontPageSubjectMessage": "Vedrørende: {studentName}, Forside", - "@frontPageSubjectMessage": { - "description": "The subject line for a message to a teacher regarding a course front page", - "type": "text", - "placeholders_order": [ - "studentName" - ], - "placeholders": { - "studentName": {} - } - }, - "assignmentSubjectMessage": "Vedrørende: {studentName}, Oppgave - {assignmentName}", - "@assignmentSubjectMessage": { - "description": "The subject line for a message to a teacher regarding a student's assignment", - "type": "text", - "placeholders_order": [ - "studentName", - "assignmentName" - ], - "placeholders": { - "studentName": {}, - "assignmentName": {} - } - }, - "eventSubjectMessage": "Vedrørende: {studentName}, Hendelse - {eventTitle}", - "@eventSubjectMessage": { - "description": "The subject line for a message to a teacher regarding a calendar event", - "type": "text", - "placeholders_order": [ - "studentName", - "eventTitle" - ], - "placeholders": { - "studentName": {}, - "eventTitle": {} - } - }, - "There is no page information available.": "Det er ingen sideinformasjon tilgjengelig.", - "@There is no page information available.": { - "description": "Description for when no page information is available", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Assignment Details": "Oppgavedetaljer", - "@Assignment Details": { - "description": "Title for the page that shows details for an assignment", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "assignmentTotalPoints": "{points} poeng", - "@assignmentTotalPoints": { - "description": "Label used for the total points the assignment is worth", - "type": "text", - "placeholders_order": [ - "points" - ], - "placeholders": { - "points": {} - } - }, - "assignmentTotalPointsAccessible": "{points} poeng", - "@assignmentTotalPointsAccessible": { - "description": "Screen reader label used for the total points the assignment is worth", - "type": "text", - "placeholders_order": [ - "points" - ], - "placeholders": { - "points": {} - } - }, - "Due": "Forfall", - "@Due": { - "description": "Label for an assignment due date", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Grade": "Vurdering", - "@Grade": { - "description": "Label for the section that displays an assignment's grade", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Locked": "Låst", - "@Locked": { - "description": "Label for when an assignment is locked", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "assignmentLockedModule": "Denne oppgaven er låst av modulen \"{moduleName}\".", - "@assignmentLockedModule": { - "description": "The locked description when an assignment is locked by a module", - "type": "text", - "placeholders_order": [ - "moduleName" - ], - "placeholders": { - "moduleName": {} - } - }, - "Remind Me": "Påminnelse", - "@Remind Me": { - "description": "Label for the row to set reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Set a date and time to be notified of this specific assignment.": "Angi tid og dato for påminnelse om denne bestemte oppgaven.", - "@Set a date and time to be notified of this specific assignment.": { - "description": "Description for row to set reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You will be notified about this assignment on…": "Du vil få en påminnelse om denne oppgaven den…", - "@You will be notified about this assignment on…": { - "description": "Description for when a reminder is set", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Instructions": "Instruksjoner", - "@Instructions": { - "description": "Label for the description of the assignment when it has quiz instructions", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Send a message about this assignment": "Send en melding om denne oppgaven", - "@Send a message about this assignment": { - "description": "Accessibility hint for the assignment messaage floating action button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "This app is not authorized for use.": "Denne appen er ikke autorisert for bruk.", - "@This app is not authorized for use.": { - "description": "The error shown when the app being used is not verified by Canvas", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The server you entered is not authorized for this app.": "Serveren du oppga er ikke tillatt for denne appen.", - "@The server you entered is not authorized for this app.": { - "description": "The error shown when the desired login domain is not verified by Canvas", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The user agent for this app is not authorized.": "Brukeragenten for denne appen er ikke autorisert.", - "@The user agent for this app is not authorized.": { - "description": "The error shown when the user agent during verification is not verified by Canvas", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "We were unable to verify the server for use with this app.": "Vi klarte ikke å verifisere serveren for bruk med denne appen.", - "@We were unable to verify the server for use with this app.": { - "description": "The generic error shown when we are unable to verify with Canvas", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Reminders": "Påminnelser", - "@Reminders": { - "description": "Name of the system notification channel for assignment and event reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Notifications for reminders about assignments and calendar events": "Gir deg påminnelser om oppgaver og kalenderhendelser", - "@Notifications for reminders about assignments and calendar events": { - "description": "Description of the system notification channel for assignment and event reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Reminders have changed!": "Påminnelser er endret!", - "@Reminders have changed!": { - "description": "Title of the dialog shown when the user needs to update their reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "In order to provide you with a better experience, we have updated how reminders work. You can add new reminders by viewing an assignment or calendar event and tapping the switch under the \"Remind Me\" section.\n\nBe aware that any reminders created with older versions of this app will not be compatible with the new changes and you will need to create them again.": "For å gi deg en bedre opplevelse, har vi oppdatert hvordan påminnelser fungerer. Du kan legge til påminnelser ved å vise en oppgave eller kalenderoppføring og trykke på bryteren under avsnittet ”Påminn meg”.\n\nVær oppmerksom på at påminnelser som ble opprettet med den gamle versjonen av denne appen ikke er kompatible med de nye endringene, og at du må opprette disse på nytt.", - "@In order to provide you with a better experience, we have updated how reminders work. You can add new reminders by viewing an assignment or calendar event and tapping the switch under the \"Remind Me\" section.\n\nBe aware that any reminders created with older versions of this app will not be compatible with the new changes and you will need to create them again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Not a parent?": "Ikke en foresatt?", - "@Not a parent?": { - "description": "Title for the screen that shows when the user is not observing any students", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "We couldn't find any students associated with this account": "Vi kunne ikke finne noen studenter knyttet til denne kontoen", - "@We couldn't find any students associated with this account": { - "description": "Subtitle for the screen that shows when the user is not observing any students", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Are you a student or teacher?": "Er du lærer eller student?", - "@Are you a student or teacher?": { - "description": "Label for button that will show users the option to view other Canvas apps in the Play Store", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "One of our other apps might be a better fit. Tap one to visit the Play Store.": "En av våre andre applikasjoner kan være mer tilpasset. Trykk på en for å gå til Play Store.", - "@One of our other apps might be a better fit. Tap one to visit the Play Store.": { - "description": "Description of options to view other Canvas apps in the Play Store", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Return to Login": "Tilbake til logg-inn", - "@Return to Login": { - "description": "Label for the button that returns the user to the login screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "STUDENT": "STUDENT", - "@STUDENT": { - "description": "The \"student\" portion of the \"Canvas Student\" app name, in all caps. \"Canvas\" is excluded in this context as it will be displayed to the user as a wordmark image", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "TEACHER": "LÆRER", - "@TEACHER": { - "description": "The \"teacher\" portion of the \"Canvas Teacher\" app name, in all caps. \"Canvas\" is excluded in this context as it will be displayed to the user as a wordmark image", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Canvas Student": "Canvas-student", - "@Canvas Student": { - "description": "The name of the Canvas Student app. Only \"Student\" should be translated as \"Canvas\" is a brand name in this context and should not be translated.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Canvas Teacher": "Canvas Teacher", - "@Canvas Teacher": { - "description": "The name of the Canvas Teacher app. Only \"Teacher\" should be translated as \"Canvas\" is a brand name in this context and should not be translated.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Alerts": "Ingen varsler", - "@No Alerts": { - "description": "The title for the empty message to show to users when there are no alerts for the student.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There’s nothing to be notified of yet.": "Det er ingenting du trenger å bli varslet om enda.", - "@There’s nothing to be notified of yet.": { - "description": "The empty message to show to users when there are no alerts for the student.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "dismissAlertLabel": "Avvise {alertTitle}", - "@dismissAlertLabel": { - "description": "Accessibility label to dismiss an alert", - "type": "text", - "placeholders_order": [ - "alertTitle" - ], - "placeholders": { - "alertTitle": {} - } - }, - "Course Announcement": "Emne-kunngjøring", - "@Course Announcement": { - "description": "Title for alerts when there is a course announcement", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Institution Announcement": "Institusjons-kunngjøring", - "@Institution Announcement": { - "description": "Title for alerts when there is an institution announcement", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "assignmentGradeAboveThreshold": "Oppgavevurdering over {threshold}", - "@assignmentGradeAboveThreshold": { - "description": "Title for alerts when an assignment grade is above the threshold value", - "type": "text", - "placeholders_order": [ - "threshold" - ], - "placeholders": { - "threshold": {} - } - }, - "assignmentGradeBelowThreshold": "Oppgavevurdering under {threshold}", - "@assignmentGradeBelowThreshold": { - "description": "Title for alerts when an assignment grade is below the threshold value", - "type": "text", - "placeholders_order": [ - "threshold" - ], - "placeholders": { - "threshold": {} - } - }, - "courseGradeAboveThreshold": "Emnevurdering over {threshold}", - "@courseGradeAboveThreshold": { - "description": "Title for alerts when a course grade is above the threshold value", - "type": "text", - "placeholders_order": [ - "threshold" - ], - "placeholders": { - "threshold": {} - } - }, - "courseGradeBelowThreshold": "Emnevurdering under {threshold}", - "@courseGradeBelowThreshold": { - "description": "Title for alerts when a course grade is below the threshold value", - "type": "text", - "placeholders_order": [ - "threshold" - ], - "placeholders": { - "threshold": {} - } - }, - "Settings": "Innstillinger", - "@Settings": { - "description": "Title for the settings screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Theme": "Tema", - "@Theme": { - "description": "Label for the light/dark theme section in the settings page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Dark Mode": "Mørk modus", - "@Dark Mode": { - "description": "Label for the button that enables dark mode", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Light Mode": "Lys modus", - "@Light Mode": { - "description": "Label for the button that enables light mode", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "High Contrast Mode": "Høy kontrast-modus", - "@High Contrast Mode": { - "description": "Label for the switch that toggles high contrast mode", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Use Dark Theme in Web Content": "Bruk Mørkt tema i webinnhold", - "@Use Dark Theme in Web Content": { - "description": "Label for the switch that toggles dark mode for webviews", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Appearance": "Utseende", - "@Appearance": { - "description": "Label for the appearance section in the settings page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Successfully submitted!": "Vellykket innlevering!", - "@Successfully submitted!": { - "description": "Title displayed in the grade cell for an assignment that has been submitted", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "submissionStatusSuccessSubtitle": "Denne oppgaven ble levert den {date} klokken {time} og avventer vurdering.", - "@submissionStatusSuccessSubtitle": { - "description": "Subtitle displayed in the grade cell for an assignment that has been submitted and is awaiting a grade", - "type": "text", - "placeholders_order": [ - "date", - "time" - ], - "placeholders": { - "date": {}, - "time": {} - } - }, - "outOfPoints": "{howMany,plural, =1{av 1 poeng}other{av {points} poenger}}", - "@outOfPoints": { - "description": "Description for an assignment grade that has points without a current scoroe", - "type": "text", - "placeholders_order": [ - "points", - "howMany" - ], - "placeholders": { - "points": {}, - "howMany": {} - } - }, - "Excused": "Fritatt", - "@Excused": { - "description": "Grading status for an assignment marked as excused", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Complete": "Godkjent", - "@Complete": { - "description": "Grading status for an assignment marked as complete", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Incomplete": "Ikke godkjent", - "@Incomplete": { - "description": "Grading status for an assignment marked as incomplete", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "minus": "minus", - "@minus": { - "description": "Screen reader-friendly replacement for the \"-\" character in letter grades like \"A-\"", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "latePenalty": "Forsinkelsesstraff (-{pointsLost})", - "@latePenalty": { - "description": "Text displayed when a late penalty has been applied to the assignment", - "type": "text", - "placeholders_order": [ - "pointsLost" - ], - "placeholders": { - "pointsLost": {} - } - }, - "finalGrade": "Avsluttende vurdering: {grade}", - "@finalGrade": { - "description": "Text that displays the final grade of an assignment", - "type": "text", - "placeholders_order": [ - "grade" - ], - "placeholders": { - "grade": {} - } - }, - "Alert Settings": "Varselsinnstillinger", - "@Alert Settings": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Alert me when…": "Varsle meg når…", - "@Alert me when…": { - "description": "Header for the screen where the observer chooses the thresholds that will determine when they receive alerts (e.g. when an assignment is graded below 70%)", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Course grade below": "Emnevurdering under", - "@Course grade below": { - "description": "Label describing the threshold for when the course grade is below a certain percentage", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Course grade above": "Emnevurdering over", - "@Course grade above": { - "description": "Label describing the threshold for when the course grade is above a certain percentage", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Assignment missing": "Oppgave mangler", - "@Assignment missing": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Assignment grade below": "Oppgavevurdering under", - "@Assignment grade below": { - "description": "Label describing the threshold for when an assignment is graded below a certain percentage", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Assignment grade above": "Oppgavevurdering over", - "@Assignment grade above": { - "description": "Label describing the threshold for when an assignment is graded above a certain percentage", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Course Announcements": "Emnekunngjøringer", - "@Course Announcements": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Institution Announcements": "Institusjonskunngjøringer", - "@Institution Announcements": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Never": "Aldri", - "@Never": { - "description": "Indication that tells the user they will not receive alert notifications of a specific kind", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Grade percentage": "Vurderingsskala i prosent", - "@Grade percentage": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading your student's alerts.": "Det oppsto en feil under lasting av studentvarslene dine.", - "@There was an error loading your student's alerts.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Must be below 100": "Må være under 100", - "@Must be below 100": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "mustBeBelowN": "Må være under {percentage}", - "@mustBeBelowN": { - "description": "Validation error to the user that they must choose a percentage below 'n'", - "type": "text", - "placeholders_order": [ - "percentage" - ], - "placeholders": { - "percentage": { - "example": 5 - } - } - }, - "mustBeAboveN": "Må være over {percentage}", - "@mustBeAboveN": { - "description": "Validation error to the user that they must choose a percentage above 'n'", - "type": "text", - "placeholders_order": [ - "percentage" - ], - "placeholders": { - "percentage": { - "example": 5 - } - } - }, - "Select Student Color": "Velg studentfarge", - "@Select Student Color": { - "description": "Title for screen that allows users to assign a color to a specific student", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Electric, blue": "Elektrisk, blå", - "@Electric, blue": { - "description": "Name of the Electric (blue) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Plum, Purple": "Plomme, blå", - "@Plum, Purple": { - "description": "Name of the Plum (purple) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Barney, Fuschia": "Barney, fuchsia", - "@Barney, Fuschia": { - "description": "Name of the Barney (fuschia) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Raspberry, Red": "Bringebær, rød", - "@Raspberry, Red": { - "description": "Name of the Raspberry (red) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Fire, Orange": "Ild, oransje", - "@Fire, Orange": { - "description": "Name of the Fire (orange) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Shamrock, Green": "Kløver, grønn", - "@Shamrock, Green": { - "description": "Name of the Shamrock (green) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "An error occurred while saving your selection. Please try again.": "Det oppsto en feil ved lagring av valget ditt. Prøv på nytt.", - "@An error occurred while saving your selection. Please try again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "changeStudentColorLabel": "Endre farge for {studentName}", - "@changeStudentColorLabel": { - "description": "Accessibility label for the button that lets users change the color associated with a specific student", - "type": "text", - "placeholders_order": [ - "studentName" - ], - "placeholders": { - "studentName": {} - } - }, - "Teacher": "Teacher", - "@Teacher": { - "description": "Label for the Teacher enrollment type", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Student": "Student", - "@Student": { - "description": "Label for the Student enrollment type", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "TA": "LA", - "@TA": { - "description": "Label for the Teaching Assistant enrollment type (also known as Teacher Aid or Education Assistant), reduced to a short acronym/initialism if appropriate.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Observer": "Observatør", - "@Observer": { - "description": "Label for the Observer enrollment type", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Use Camera": "Bruk kamera", - "@Use Camera": { - "description": "Label for the action item that lets the user capture a photo using the device camera", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Upload File": "Last opp fil", - "@Upload File": { - "description": "Label for the action item that lets the user upload a file from their device", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Choose from Gallery": "Velg fra galleri", - "@Choose from Gallery": { - "description": "Label for the action item that lets the user select a photo from their device gallery", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Preparing…": "Forbereder…", - "@Preparing…": { - "description": "Message shown while a file is being prepared to attach to a message", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Add student with…": "Legg til en student til…", - "@Add student with…": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Add Student": "Legg til student", - "@Add Student": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You are not observing any students.": "Du har ingen studenter under observasjon.", - "@You are not observing any students.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading your students.": "Det oppsto en feil under lasting av studentene dine.", - "@There was an error loading your students.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Pairing Code": "Paringskode", - "@Pairing Code": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Students can obtain a pairing code through the Canvas website": "Studenter kan få en paringskode gjennom Canvas-nettstedet", - "@Students can obtain a pairing code through the Canvas website": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Enter the student pairing code provided to you. If the pairing code doesn't work, it may have expired": "Angi studentparingskoden som ble gitt til deg. Hvis paringskoden ikke fungerer kan det hende at den er utgått", - "@Enter the student pairing code provided to you. If the pairing code doesn't work, it may have expired": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Your code is incorrect or expired.": "Koden din stemmer ikke eller den er utgått", - "@Your code is incorrect or expired.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Something went wrong trying to create your account, please reach out to your school for assistance.": "Noe gikk galt da vi forsøkte å opprette kontoen din. Kontakt skolen din for assistanse.", - "@Something went wrong trying to create your account, please reach out to your school for assistance.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "QR Code": "QR-kode", - "@QR Code": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Students can create a QR code using the Canvas Student app on their mobile device": "Studenter kan opprette en QR-kode ved å bruke Canvas Student-appen på mobilenheten", - "@Students can create a QR code using the Canvas Student app on their mobile device": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Add new student": "Legg til ny student", - "@Add new student": { - "description": "Semantics label for the FAB on the Manage Students Screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Select": "Velg", - "@Select": { - "description": "Hint text to tell the user to choose one of two options", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I have a Canvas account": "Jeg har en Canvas-konto", - "@I have a Canvas account": { - "description": "Option to select for users that have a canvas account", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I don't have a Canvas account": "Jeg har ikke en Canvas-konto", - "@I don't have a Canvas account": { - "description": "Option to select for users that don't have a canvas account", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Create Account": "Opprett konto", - "@Create Account": { - "description": "Button text for account creation confirmation", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Full Name": "Fullt navn", - "@Full Name": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Email Address": "E-postadresse", - "@Email Address": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Password": "Passord", - "@Password": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Full Name…": "Fullt navn…", - "@Full Name…": { - "description": "hint label for inside form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Email…": "E-post…", - "@Email…": { - "description": "hint label for inside form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Password…": "Passord…", - "@Password…": { - "description": "hint label for inside form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Please enter full name": "Angi fullt navn", - "@Please enter full name": { - "description": "Error message for form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Please enter an email address": "Angi en e-postadresse", - "@Please enter an email address": { - "description": "Error message for form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Please enter a valid email address": "Oppgi en gyldig e-postadresse", - "@Please enter a valid email address": { - "description": "Error message for form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Password is required": "Passord kreves", - "@Password is required": { - "description": "Error message for form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Password must contain at least 8 characters": "Passord må inneholde minst åtte tegn", - "@Password must contain at least 8 characters": { - "description": "Error message for form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "qrCreateAccountTos": "Ved å trykke på Opprett konto, samtykker du til {termsOfService} og godtar {privacyPolicy}", - "@qrCreateAccountTos": { - "description": "The text show on the account creation screen", - "type": "text", - "placeholders_order": [ - "termsOfService", - "privacyPolicy" - ], - "placeholders": { - "termsOfService": {}, - "privacyPolicy": {} - } - }, - "Terms of Service": "Tjenestevilkår", - "@Terms of Service": { - "description": "Label for the Canvas Terms of Service agreement. This will be used in the qrCreateAccountTos text and will be highlighted and clickable", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Privacy Policy": "Retningslinjer for personvern", - "@Privacy Policy": { - "description": "Label for the Canvas Privacy Policy agreement. This will be used in the qrCreateAccountTos text and will be highlighted and clickable", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "View the Privacy Policy": "Se retningslinjer for personvern", - "@View the Privacy Policy": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Already have an account? ": "Har du allerede en konto? ", - "@Already have an account? ": { - "description": "Part of multiline text span, includes AccountSignIn1-2, in that order", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Sign In": "Logg inn", - "@Sign In": { - "description": "Part of multiline text span, includes AccountSignIn1-2, in that order", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Hide Password": "Skjul passord", - "@Hide Password": { - "description": "content description for password hide button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Show Password": "Vis passord", - "@Show Password": { - "description": "content description for password show button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Terms of Service Link": "Lenke til tjenestevilkår", - "@Terms of Service Link": { - "description": "content description for terms of service link", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Privacy Policy Link": "Lenke til retningslinjer for personvern", - "@Privacy Policy Link": { - "description": "content description for privacy policy link", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Event": "Hendelse", - "@Event": { - "description": "Title for the event details screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Date": "Dato", - "@Date": { - "description": "Label for the event date", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Location": "Sted", - "@Location": { - "description": "Label for the location information", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Location Specified": "Ingen lokalisasjon spesifisert", - "@No Location Specified": { - "description": "Description for events that do not have a location", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "eventTime": "{startAt} - {endAt}", - "@eventTime": { - "description": "The time the event is happening, example: \"2:00 pm - 4:00 pm\"", - "type": "text", - "placeholders_order": [ - "startAt", - "endAt" - ], - "placeholders": { - "startAt": {}, - "endAt": {} - } - }, - "Set a date and time to be notified of this event.": "Angi tid og dato for påminnelse om denne oppgaven.", - "@Set a date and time to be notified of this event.": { - "description": "Description for row to set event reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You will be notified about this event on…": "Du vil få en påminnelse om denne hendelsen den…", - "@You will be notified about this event on…": { - "description": "Description for when an event reminder is set", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Share Your Love for the App": "Del din kjærlighet for appen", - "@Share Your Love for the App": { - "description": "Label for option to open the app store", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Tell us about your favorite parts of the app": "Fortell oss om dine favorittdeler av appen", - "@Tell us about your favorite parts of the app": { - "description": "Description for option to open the app store", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Legal": "Juss", - "@Legal": { - "description": "Label for legal information option", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Privacy policy, terms of use, open source": "Personvernregler, brukervilkår, åpen kilde", - "@Privacy policy, terms of use, open source": { - "description": "Description for legal information option", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Idea for Canvas Parent App [Android]": "Idé for appen Canvas Parent [Android]", - "@Idea for Canvas Parent App [Android]": { - "description": "The subject for the email to request a feature", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The following information will help us better understand your idea:": "Følgende informasjon vil hjelpe oss bedre til å forstå din idé:", - "@The following information will help us better understand your idea:": { - "description": "The header for the users information that is attached to a feature request", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Domain:": "Domene:", - "@Domain:": { - "description": "The label for the Canvas domain of the logged in user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "User ID:": "Bruker-ID:", - "@User ID:": { - "description": "The label for the Canvas user ID of the logged in user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Email:": "E-post:", - "@Email:": { - "description": "The label for the eamil of the logged in user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Locale:": "Sted:", - "@Locale:": { - "description": "The label for the locale of the logged in user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Terms of Use": "brukervilkår", - "@Terms of Use": { - "description": "Label for the terms of use", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Canvas on GitHub": "Canvas på GitHub", - "@Canvas on GitHub": { - "description": "Label for the button that opens the Canvas project on GitHub's website", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was a problem loading the Terms of Use": "Det oppsto et problem under opplastingen av brukervilkårene", - "@There was a problem loading the Terms of Use": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Device": "Enhet", - "@Device": { - "description": "Label used for device manufacturer/model in the error report", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "OS Version": "OS-versjon", - "@OS Version": { - "description": "Label used for device operating system version in the error report", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Version Number": "Versjon nummer", - "@Version Number": { - "description": "Label used for the app version number in the error report", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Report A Problem": "Rapporter et problem", - "@Report A Problem": { - "description": "Title used for generic dialog to report problems", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Subject": "Tema", - "@Subject": { - "description": "Label used for Subject text field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "A subject is required.": "Du må ha en tittel.", - "@A subject is required.": { - "description": "Error shown when the subject field is empty", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "An email address is required.": "Du må ha en e-postadresse.", - "@An email address is required.": { - "description": "Error shown when the email field is empty", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Description": "Beskrivelse", - "@Description": { - "description": "Label used for Description text field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "A description is required.": "Du må ha en beskrivelse.", - "@A description is required.": { - "description": "Error shown when the description field is empty", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "How is this affecting you?": "Hvordan påvirker dette deg?", - "@How is this affecting you?": { - "description": "Label used for the dropdown to select how severe the issue is", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "send": "send", - "@send": { - "description": "Label used for send button when reporting a problem", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Just a casual question, comment, idea, suggestion…": "Bare et tilfeldig spørsmål, kommentar, idé eller forslag…", - "@Just a casual question, comment, idea, suggestion…": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I need some help but it's not urgent.": "Jeg trenger litt hjelp men det haster ikke.", - "@I need some help but it's not urgent.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Something's broken but I can work around it to get what I need done.": "Noe er ødelagt, men jeg kan jobbe rundt problemet for å få gjort det jeg trenger å gjøre.", - "@Something's broken but I can work around it to get what I need done.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I can't get things done until I hear back from you.": "Jeg får gjort noenting før jeg hører i fra deg.", - "@I can't get things done until I hear back from you.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "EXTREME CRITICAL EMERGENCY!!": "EKSTREMT KRITISK NØDSITUASJON!!", - "@EXTREME CRITICAL EMERGENCY!!": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Not Graded": "Ikke vurdert", - "@Not Graded": { - "description": "Description for an assignment has not been graded.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Login flow: Normal": "Innloggingsflyt: Normal", - "@Login flow: Normal": { - "description": "Description for the normal login flow", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Login flow: Canvas": "Innloggingsflyt: Canvas", - "@Login flow: Canvas": { - "description": "Description for the Canvas login flow", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Login flow: Site Admin": "Innloggingsflyt: Nettstedadministrator", - "@Login flow: Site Admin": { - "description": "Description for the Site Admin login flow", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Login flow: Skip mobile verify": "Innloggingsflyt: Hopp over bekreftelse med mobil", - "@Login flow: Skip mobile verify": { - "description": "Description for the login flow that skips domain verification for mobile", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Act As User": "Opptre som bruker", - "@Act As User": { - "description": "Label for the button that allows the user to act (masquerade) as another user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Stop Acting as User": "Avslutt opptre som bruker", - "@Stop Acting as User": { - "description": "Label for the button that allows the user to stop acting (masquerading) as another user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "actingAsUser": "Du opptrer som {userName}", - "@actingAsUser": { - "description": "Message shown while acting (masquerading) as another user", - "type": "text", - "placeholders_order": [ - "userName" - ], - "placeholders": { - "userName": {} - } - }, - "\"Act as\" is essentially logging in as this user without a password. You will be able to take any action as if you were this user, and from other users' points of views, it will be as if this user performed them. However, audit logs record that you were the one who performed the actions on behalf of this user.": "\"Oppfør deg som\" er i realiteten å logge inn som denne brukeren uten passord. Du vil kunne utføre alle handlinger som om du var denne brukeren, og for andre brukere vil det se ut som om at denne brukeren utførte handlingene. Overvåkingloggen vil likevel notere at det var du som utførte handlingene på vegne av denne brukeren.", - "@\"Act as\" is essentially logging in as this user without a password. You will be able to take any action as if you were this user, and from other users' points of views, it will be as if this user performed them. However, audit logs record that you were the one who performed the actions on behalf of this user.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Domain": "Domene", - "@Domain": { - "description": "Text field hint for domain url input", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You must enter a valid domain": "Du må oppgi et gyldig domene", - "@You must enter a valid domain": { - "description": "Message displayed for domain input error", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "User ID": "Bruker-ID", - "@User ID": { - "description": "Text field hint for user ID input", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You must enter a user id": "Du må skrive inn en bruker-ID", - "@You must enter a user id": { - "description": "Message displayed for user Id input error", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error trying to act as this user. Please check the Domain and User ID and try again.": "Det oppsto en feil med å opptre som denne brukeren. Sjekk domenet og bruker-ID-en og prøv igjen.", - "@There was an error trying to act as this user. Please check the Domain and User ID and try again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "endMasqueradeMessage": "Du vil slutte å opptre som {userName} og gå tilbake til din originale konto.", - "@endMasqueradeMessage": { - "description": "Confirmation message displayed when the user wants to stop acting (masquerading) as another user", - "type": "text", - "placeholders_order": [ - "userName" - ], - "placeholders": { - "userName": {} - } - }, - "endMasqueradeLogoutMessage": "Du vil slutte å opptre som {userName} og bli logget ut.", - "@endMasqueradeLogoutMessage": { - "description": "Confirmation message displayed when the user wants to stop acting (masquerading) as another user and will be logged out.", - "type": "text", - "placeholders_order": [ - "userName" - ], - "placeholders": { - "userName": {} - } - }, - "How are we doing?": "Hvordan klarer vi oss?", - "@How are we doing?": { - "description": "Title for dialog asking user to rate the app out of 5 stars.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Don't show again": "Ikke vis igjen", - "@Don't show again": { - "description": "Button to prevent the rating dialog from showing again.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "What can we do better?": "Hva kan vi gjøre bedre?", - "@What can we do better?": { - "description": "Hint text for providing a comment with the rating.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Send Feedback": "Send tilbakemelding", - "@Send Feedback": { - "description": "Button to send rating with feedback", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "ratingDialogEmailSubject": "Forslag for Android - Canvas foreldre {version}", - "@ratingDialogEmailSubject": { - "description": "The subject for an email to provide feedback for CanvasParent.", - "type": "text", - "placeholders_order": [ - "version" - ], - "placeholders": { - "version": {} - } - }, - "starRating": "{position,plural, =1{{position} stjerne}other{{position} stjerner}}", - "@starRating": { - "description": "Accessibility label for the 1 stars to 5 stars rating", - "type": "text", - "placeholders_order": [ - "position" - ], - "placeholders": { - "position": { - "example": 1 - } - } - }, - "Student Pairing": "Studentparing", - "@Student Pairing": { - "description": "Title for the screen where users can pair to students using a QR code", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Open Canvas Student": "Åpne Canvas student", - "@Open Canvas Student": { - "description": "Title for QR pairing tutorial screen instructing users to open the Canvas Student app", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You'll need to open your student's Canvas Student app to continue. Go into Main Menu > Settings > Pair with Observer and scan the QR code you see there.": "Du må åpne Canvas Student-appen til studenten din for å fortsette. Gå til Hovedmeny > Innstillinger > Paring med observatør og skann QR-koden du ser der.", - "@You'll need to open your student's Canvas Student app to continue. Go into Main Menu > Settings > Pair with Observer and scan the QR code you see there.": { - "description": "Message explaining how QR code pairing works", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Screenshot showing location of pairing QR code generation in the Canvas Student app": "Skjermbilde som viser plasseringen av QR-koden som genereres i Canvas Student-appen", - "@Screenshot showing location of pairing QR code generation in the Canvas Student app": { - "description": "Content Description for qr pairing tutorial screenshot", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Expired QR Code": "Utgått QR-kode", - "@Expired QR Code": { - "description": "Error title shown when the users scans a QR code that has expired", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The QR code you scanned may have expired. Refresh the code on the student's device and try again.": "QR-koden du skannet kan ha utgått Gjenopprett koden på studentens enhet og prøv igjen.", - "@The QR code you scanned may have expired. Refresh the code on the student's device and try again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "A network error occurred when adding this student. Check your connection and try again.": "Det oppsto en nettverksfeil da du la til denne studenten. Kontroller tilkoblingen og prøv på nytt.", - "@A network error occurred when adding this student. Check your connection and try again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Invalid QR Code": "Ugyldig QR-kode", - "@Invalid QR Code": { - "description": "Error title shown when the user scans an invalid QR code", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Incorrect Domain": "Ugyldig domene", - "@Incorrect Domain": { - "description": "Error title shown when the users scane a QR code for a student that belongs to a different domain", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The student you are trying to add belongs to a different school. Log in or create an account with that school to scan this code.": "Studenten du forsøker å legge til tilhører en annen skole. Logg inn eller opprett en konto med den skolen for å skanne denne koden.", - "@The student you are trying to add belongs to a different school. Log in or create an account with that school to scan this code.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Camera Permission": "Kameratillatelse", - "@Camera Permission": { - "description": "Error title shown when the user wans to scan a QR code but has denied the camera permission", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "This will unpair and remove all enrollments for this student from your account.": "Dette vil koble fra og fjerne alle påmeldinger for denne studenten fra kontoen din.", - "@This will unpair and remove all enrollments for this student from your account.": { - "description": "Confirmation message shown when the user tries to delete a student from their account", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was a problem removing this student from your account. Please check your connection and try again.": "Det oppsto et problem ved fjerning av denne studenten fra kontoen din. Kontroller tilkoblingen og prøv på nytt.", - "@There was a problem removing this student from your account. Please check your connection and try again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Cancel": "Avbryt", - "@Cancel": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "next": "Neste", - "@next": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "ok": "OK", - "@ok": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Yes": "Ja", - "@Yes": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No": "Nei", - "@No": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Retry": "Prøv igjen", - "@Retry": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Delete": "Slett", - "@Delete": { - "description": "Label used for general delete/remove actions", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Done": "Ferdig", - "@Done": { - "description": "Label for general done/finished actions", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Refresh": "Oppdater", - "@Refresh": { - "description": "Label for button to refresh data from the web", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "View Description": "Vise beskrivelsen", - "@View Description": { - "description": "Button to view the description for an event or assignment", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "expanded": "utvidet", - "@expanded": { - "description": "Description for the accessibility reader for list groups that are expanded", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "collapsed": "skjult", - "@collapsed": { - "description": "Description for the accessibility reader for list groups that are expanded", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "An unexpected error occurred": "Det oppsto en uventet feil", - "@An unexpected error occurred": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No description": "Ingen beskrivelse", - "@No description": { - "description": "Message used when the assignment has no description", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Launch External Tool": "Åpne eksternt verktøy", - "@Launch External Tool": { - "description": "Button text added to webviews to let users open external tools in their browser", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Interactions on this page are limited by your institution.": "Interaksjoner på denne siden er begrenset av institusjonen din.", - "@Interactions on this page are limited by your institution.": { - "description": "Message describing how the webview has limited access due to an instution setting", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "dateAtTime": "{date} på {time}", - "@dateAtTime": { - "description": "The string to format dates", - "type": "text", - "placeholders_order": [ - "date", - "time" - ], - "placeholders": { - "date": {}, - "time": {} - } - }, - "dueDateAtTime": "Frist {date} klokken {time}", - "@dueDateAtTime": { - "description": "The string to format due dates", - "type": "text", - "placeholders_order": [ - "date", - "time" - ], - "placeholders": { - "date": {}, - "time": {} - } - }, - "No Due Date": "Ingen forfallsdato", - "@No Due Date": { - "description": "Label for assignments that do not have a due date", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Filter": "Filter", - "@Filter": { - "description": "Label for buttons to filter what items are visible", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "unread": "ulest", - "@unread": { - "description": "Label for things that are marked as unread", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "unreadCount": "{count} ulest", - "@unreadCount": { - "description": "Formatted string for when there are a number of unread items", - "type": "text", - "placeholders_order": [ - "count" - ], - "placeholders": { - "count": {} - } - }, - "badgeNumberPlus": "{count}+", - "@badgeNumberPlus": { - "description": "Formatted string for when too many items are being notified in a badge, generally something like: 99+", - "type": "text", - "placeholders_order": [ - "count" - ], - "placeholders": { - "count": {} - } - }, - "There was an error loading this announcement": "Det oppsto en feil under lasting av denne kunngjøringen", - "@There was an error loading this announcement": { - "description": "Message shown when an announcement detail screen fails to load", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Network error": "Nettverksfeil", - "@Network error": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Under Construction": "Under bygging", - "@Under Construction": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "We are currently building this feature for your viewing pleasure.": "Vi jobber for tiden med denne funksjonen slik at du kan få glede av den senere.", - "@We are currently building this feature for your viewing pleasure.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Request Login Help Button": "“Be om hjelp til å logge inn”-knapp", - "@Request Login Help Button": { - "description": "Accessibility hint for button that opens help dialog for a login help request", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Request Login Help": "Be om hjelp til å logge inn", - "@Request Login Help": { - "description": "Title of help dialog for a login help request", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I'm having trouble logging in": "Jeg har problemer med å logge inn", - "@I'm having trouble logging in": { - "description": "Subject of help dialog for a login help request", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "An error occurred when trying to display this link": "Feil oppsto da du ønsket å vise denne lenken.", - "@An error occurred when trying to display this link": { - "description": "Error message shown when a link can't be opened", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "We are unable to display this link, it may belong to an institution you currently aren't logged in to.": "Vi kan ikke vise denne lenken, den kan eies av en instutisjon som du for øyeblikket ikke er innlogget i.", - "@We are unable to display this link, it may belong to an institution you currently aren't logged in to.": { - "description": "Description for error page shown when clicking a link", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Link Error": "Feil på lenke", - "@Link Error": { - "description": "Title for error page shown when clicking a link", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Open In Browser": "Åpne i nettleser", - "@Open In Browser": { - "description": "Text for button to open a link in the browswer", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You'll find the QR code on the web in your account profile. Click 'QR for Mobile Login' in the list.": "Du finner QR-koden på nettet i kontoprofilen din. Klikk på “QR for mobil-innlogging” i listen.", - "@You'll find the QR code on the web in your account profile. Click 'QR for Mobile Login' in the list.": { - "description": "Text for qr login tutorial screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Locate QR Code": "Lokalisere QR-kode", - "@Locate QR Code": { - "description": "Text for qr login button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Please scan a QR code generated by Canvas": "Skann en QR-kode generert av Canvas", - "@Please scan a QR code generated by Canvas": { - "description": "Text for qr login error with incorrect qr code", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error logging in. Please generate another QR Code and try again.": "Det oppsto en feil ved innlogging. Vennligst lag en ny QR-kode og prøv på nytt.", - "@There was an error logging in. Please generate another QR Code and try again.": { - "description": "Text for qr login error", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Screenshot showing location of QR code generation in browser": "Skjermbilde som viser plassering av QR-kodegenerering i nettleser", - "@Screenshot showing location of QR code generation in browser": { - "description": "Content Description for qr login tutorial screenshot", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "QR scanning requires camera access": "QR-skanning krever kameratilgang", - "@QR scanning requires camera access": { - "description": "placeholder for camera error for QR code scan", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The linked item is no longer available": "Det koblede elementet er ikke lenger tilgjengelig", - "@The linked item is no longer available": { - "description": "error message when the alert could no be opened", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Message sent": "Melding sendt", - "@Message sent": { - "description": "confirmation message on the screen when the user succesfully sends a message", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Acceptable Use Policy": "Retningslinjer for retningslinjer for akseptabel bruk bruk", - "@Acceptable Use Policy": { - "description": "title for the acceptable use policy screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Submit": "Send inn", - "@Submit": { - "description": "submit button title for acceptable use policy screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Either you're a new user or the Acceptable Use Policy has changed since you last agreed to it. Please agree to the Acceptable Use Policy before you continue.": "Enten du er ny bruker eller retningslinjer for akseptabel bruk er endret siden sist du godkjente dem. Du må godta retningslinjer for akseptabel bruk før du fortsetter.", - "@Either you're a new user or the Acceptable Use Policy has changed since you last agreed to it. Please agree to the Acceptable Use Policy before you continue.": { - "description": "acceptable use policy screen description", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I agree to the Acceptable Use Policy.": "Jeg godtar retningslinjer for akseptabel bruk", - "@I agree to the Acceptable Use Policy.": { - "description": "acceptable use policy switch title", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "About": "Om", - "@About": { - "description": "Title for about menu item in settings", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "App": "App", - "@App": { - "description": "Title for App field on about page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Login ID": "Innloggings-ID", - "@Login ID": { - "description": "Title for Login ID field on about page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Email": "E-post", - "@Email": { - "description": "Title for Email field on about page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Version": "Versjon", - "@Version": { - "description": "Title for Version field on about page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Instructure logo": "Instructure-logo", - "@Instructure logo": { - "description": "Semantics label for the Instructure logo on the about page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - } -} \ No newline at end of file diff --git a/apps/flutter_parent/lib/l10n/res/intl_nb_instk12.arb b/apps/flutter_parent/lib/l10n/res/intl_nb_instk12.arb deleted file mode 100644 index 85d1ddabb1..0000000000 --- a/apps/flutter_parent/lib/l10n/res/intl_nb_instk12.arb +++ /dev/null @@ -1,2753 +0,0 @@ -{ - "@@last_modified": "2023-08-25T11:04:20.901151", - "alertsLabel": "Varsler", - "@alertsLabel": { - "description": "The label for the Alerts tab", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "calendarLabel": "Kalender", - "@calendarLabel": { - "description": "The label for the Calendar tab", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "coursesLabel": "Fag", - "@coursesLabel": { - "description": "The label for the Courses tab", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Students": "Ingen elever", - "@No Students": { - "description": "Text for when an observer has no students they are observing", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Tap to show student selector": "Trykk for å vise elevvelger", - "@Tap to show student selector": { - "description": "Semantics label for the area that will show the student selector when tapped", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Tap to pair with a new student": "Trykk for å pare opp mot ny elev", - "@Tap to pair with a new student": { - "description": "Semantics label for the add student button in the student selector", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Tap to select this student": "Trykk for å velge denne eleven", - "@Tap to select this student": { - "description": "Semantics label on individual students in the student switcher", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Manage Students": "Administrer elever", - "@Manage Students": { - "description": "Label text for the Manage Students nav drawer button as well as the title for the Manage Students screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Help": "Hjelp", - "@Help": { - "description": "Label text for the help nav drawer button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Log Out": "Logg Ut", - "@Log Out": { - "description": "Label text for the Log Out nav drawer button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Switch Users": "Bytt brukere", - "@Switch Users": { - "description": "Label text for the Switch Users nav drawer button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "appVersion": "v. {version}", - "@appVersion": { - "description": "App version shown in the navigation drawer", - "type": "text", - "placeholders_order": [ - "version" - ], - "placeholders": { - "version": {} - } - }, - "Are you sure you want to log out?": "Er du sikker på at du vil logge ut?", - "@Are you sure you want to log out?": { - "description": "Confirmation message displayed when the user tries to log out", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Calendars": "Kalendere", - "@Calendars": { - "description": "Label for button that lets users select which calendars to display", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "nextMonth": "Neste måned: {month}", - "@nextMonth": { - "description": "Label for the button that switches the calendar to the next month", - "type": "text", - "placeholders_order": [ - "month" - ], - "placeholders": { - "month": {} - } - }, - "previousMonth": "Forrige måned: {month}", - "@previousMonth": { - "description": "Label for the button that switches the calendar to the previous month", - "type": "text", - "placeholders_order": [ - "month" - ], - "placeholders": { - "month": {} - } - }, - "nextWeek": "Neste uke begynner {date}", - "@nextWeek": { - "description": "Label for the button that switches the calendar to the next week", - "type": "text", - "placeholders_order": [ - "date" - ], - "placeholders": { - "date": {} - } - }, - "previousWeek": "Forrige uke begynte {date}", - "@previousWeek": { - "description": "Label for the button that switches the calendar to the previous week", - "type": "text", - "placeholders_order": [ - "date" - ], - "placeholders": { - "date": {} - } - }, - "selectedMonthLabel": "Måned {month}", - "@selectedMonthLabel": { - "description": "Accessibility label for the button that expands/collapses the month view", - "type": "text", - "placeholders_order": [ - "month" - ], - "placeholders": { - "month": {} - } - }, - "expand": "utvid", - "@expand": { - "description": "Accessibility label for the on-tap hint for the button that expands/collapses the month view", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "collapse": "skjult", - "@collapse": { - "description": "Accessibility label for the on-tap hint for the button that expands/collapses the month view", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "pointsPossible": "{points} poeng oppnåelig", - "@pointsPossible": { - "description": "Screen reader label used for the points possible for an assignment, quiz, etc.", - "type": "text", - "placeholders_order": [ - "points" - ], - "placeholders": { - "points": {} - } - }, - "calendarDaySemanticsLabel": "{eventCount,plural, =1{{date}, {eventCount} hendelse}other{{date}, {eventCount} hendelser}}", - "@calendarDaySemanticsLabel": { - "description": "Screen reader label used for calendar day, reads the date and count of events", - "type": "text", - "placeholders_order": [ - "date", - "eventCount" - ], - "placeholders": { - "date": {}, - "eventCount": {} - } - }, - "No Events Today!": "Ingen arrangementer i dag!", - "@No Events Today!": { - "description": "Title displayed when there are no calendar events for the current day", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "It looks like a great day to rest, relax, and recharge.": "Det ser ut som dette er en flott dag til å slappe av og lade batteriene.", - "@It looks like a great day to rest, relax, and recharge.": { - "description": "Message displayed when there are no calendar events for the current day", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading your student's calendar": "Det oppsto en feil under lasting av din elevkalender.", - "@There was an error loading your student's calendar": { - "description": "Message displayed when calendar events could not be loaded for the current student", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Tap to favorite the courses you want to see on the Calendar. Select up to 10.": "Trykk for å velge fagene du ønsker på se på kalenderen. Velg opptil 10.", - "@Tap to favorite the courses you want to see on the Calendar. Select up to 10.": { - "description": "Description text on calendar filter screen.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You may only choose 10 calendars to display": "Du kan kun velge 10 kalendere som skal vises", - "@You may only choose 10 calendars to display": { - "description": "Error text when trying to select more than 10 calendars", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You must select at least one calendar to display": "Du må velge minst én kalender som skal vises", - "@You must select at least one calendar to display": { - "description": "Error text when trying to de-select all calendars", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Planner Note": "Planleggingsmerknad", - "@Planner Note": { - "description": "Label used for notes in the planner", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Go to today": "Gå til idag", - "@Go to today": { - "description": "Accessibility label used for the today button in the planner", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Previous Logins": "Tidligere innlogginger", - "@Previous Logins": { - "description": "Label for the list of previous user logins", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "canvasLogoLabel": "Canvas-logo", - "@canvasLogoLabel": { - "description": "The semantics label for the Canvas logo", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "findSchool": "Finne skole", - "@findSchool": { - "description": "Text for the find-my-school button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "findAnotherSchool": "Finn en annen skole", - "@findAnotherSchool": { - "description": "Text for the find-another-school button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "domainSearchInputHint": "Skriv inn skolenavn eller område…", - "@domainSearchInputHint": { - "description": "Input hint for the text box on the domain search screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "noDomainResults": "Kan ikke finne skoler som stemmer med \"{query}\"", - "@noDomainResults": { - "description": "Message shown to users when the domain search query did not return any results", - "type": "text", - "placeholders_order": [ - "query" - ], - "placeholders": { - "query": {} - } - }, - "domainSearchHelpLabel": "Hvordan finner jeg skolen eller området mitt?", - "@domainSearchHelpLabel": { - "description": "Label for the help button on the domain search screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "canvasGuides": "Canvas-guider", - "@canvasGuides": { - "description": "Proper name for the Canvas Guides. This will be used in the domainSearchHelpBody text and will be highlighted and clickable", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "canvasSupport": "Canvas Support", - "@canvasSupport": { - "description": "Proper name for Canvas Support. This will be used in the domainSearchHelpBody text and will be highlighted and clickable", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "domainSearchHelpBody": "Prøv å søke på navnet til skolen eller området du forsøker å få tilgang til som f.eks. “Smith privatskole” eller “Smith kommunal skole.” Du kan også angi et Canvas-domene direkte som f.eks. “smith.instructure.com.”\n\nHvis du vil ha mer informasjon om hvordan du finner Canvas-kontoen til din institusjon, besøk {canvasGuides}, spør etter {canvasSupport} eller kontakt skolen din for hjelp.", - "@domainSearchHelpBody": { - "description": "The body text shown in the help dialog on the domain search screen", - "type": "text", - "placeholders_order": [ - "canvasGuides", - "canvasSupport" - ], - "placeholders": { - "canvasGuides": {}, - "canvasSupport": {} - } - }, - "Uh oh!": "Oi sann!", - "@Uh oh!": { - "description": "Title of the screen that shows when a crash has occurred", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "We’re not sure what happened, but it wasn’t good. Contact us if this keeps happening.": "Vi vet ikke hva som skjedde her, men det ser ikke bra ut. Ta kontakt med oss hvis denne situasjonen vedvarer.", - "@We’re not sure what happened, but it wasn’t good. Contact us if this keeps happening.": { - "description": "Message shown when a crash has occurred", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Contact Support": "ta kontakt med kundestøtte", - "@Contact Support": { - "description": "Label for the button that allows users to contact support after a crash has occurred", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "View error details": "Vis feildetaljer", - "@View error details": { - "description": "Label for the button that allowed users to view crash details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Restart app": "Start app på nytt", - "@Restart app": { - "description": "Label for the button that will restart the entire application", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Application version": "Applikasjonsversjon", - "@Application version": { - "description": "Label for the application version displayed in the crash details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Device model": "Enhetsmodell", - "@Device model": { - "description": "Label for the device model displayed in the crash details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Android OS version": "Android OS-versjon", - "@Android OS version": { - "description": "Label for the Android operating system version displayed in the crash details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Full error message": "Fullstendig feilmelding", - "@Full error message": { - "description": "Label for the full error message displayed in the crash details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Inbox": "Innboks", - "@Inbox": { - "description": "Title for the Inbox screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading your inbox messages.": "Det oppsto en feil under lasting av innboksmeldingene dine.", - "@There was an error loading your inbox messages.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Subject": "Ingen tittel", - "@No Subject": { - "description": "Title used for inbox messages that have no subject", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unable to fetch courses. Please check your connection and try again.": "Kan ikke hente fag. Kontroller tilkoblingen og prøv på nytt.", - "@Unable to fetch courses. Please check your connection and try again.": { - "description": "Message shown when an error occured while loading courses", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Choose a course to message": "Velg et fag du vil sende melding til", - "@Choose a course to message": { - "description": "Header in the course list shown when the user is choosing which course to associate with a new message", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Inbox Zero": "Innboks null", - "@Inbox Zero": { - "description": "Title of the message shown when there are no inbox messages", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You’re all caught up!": "Du er oppdatert!", - "@You’re all caught up!": { - "description": "Subtitle of the message shown when there are no inbox messages", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading recipients for this course": "Det oppsto en feil under lasting av mottakere for dette faget.", - "@There was an error loading recipients for this course": { - "description": "Message shown when attempting to create a new message but the recipients list failed to load", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unable to send message. Check your connection and try again.": "Kan ikke sende melding. Kontroller tilkoblingen og prøv på nytt.", - "@Unable to send message. Check your connection and try again.": { - "description": "Message show when there was an error creating or sending a new message", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unsaved changes": "Ulagrede endringer", - "@Unsaved changes": { - "description": "Title of the dialog shown when the user tries to leave with unsaved changes", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Are you sure you wish to close this page? Your unsent message will be lost.": "Er du sikker på at du vil lukke denne siden? Dine usendte meldinger vil bli slettet.", - "@Are you sure you wish to close this page? Your unsent message will be lost.": { - "description": "Body text of the dialog shown when the user tries leave with unsaved changes", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "New message": "Ny melding", - "@New message": { - "description": "Title of the new-message screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Add attachment": "Legg til vedlegg", - "@Add attachment": { - "description": "Tooltip for the add-attachment button in the new-message screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Send message": "Send melding", - "@Send message": { - "description": "Tooltip for the send-message button in the new-message screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Select recipients": "Velg mottakere", - "@Select recipients": { - "description": "Tooltip for the button that allows users to select message recipients", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No recipients selected": "Ingen mottakere er valgt", - "@No recipients selected": { - "description": "Hint displayed when the user has not selected any message recipients", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Message subject": "Meldingstittel", - "@Message subject": { - "description": "Hint text displayed in the input field for the message subject", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Message": "Melding", - "@Message": { - "description": "Hint text displayed in the input field for the message body", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Recipients": "Mottakere", - "@Recipients": { - "description": "Label for message recipients", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "plusRecipientCount": "+{count}", - "@plusRecipientCount": { - "description": "Shows the number of recipients that are selected but not displayed on screen.", - "type": "text", - "placeholders_order": [ - "count" - ], - "placeholders": { - "count": { - "example": 5 - } - } - }, - "Failed. Tap for options.": "Mislyktes. Trykk for alternativer.", - "@Failed. Tap for options.": { - "description": "Short message shown on a message attachment when uploading has failed", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "courseForWhom": "for {studentShortName}", - "@courseForWhom": { - "description": "Describes for whom a course is for (i.e. for Bill)", - "type": "text", - "placeholders_order": [ - "studentShortName" - ], - "placeholders": { - "studentShortName": {} - } - }, - "messageLinkPostscript": "Vedrørende: {studentName}, {linkUrl}", - "@messageLinkPostscript": { - "description": "A postscript appended to new messages that clarifies which student is the subject of the message and also includes a URL for the related Canvas component (course, assignment, event, etc).", - "type": "text", - "placeholders_order": [ - "studentName", - "linkUrl" - ], - "placeholders": { - "studentName": {}, - "linkUrl": {} - } - }, - "There was an error loading this conversation": "Det oppsto en feil under lasting av denne samtalen", - "@There was an error loading this conversation": { - "description": "Message shown when a conversation fails to load", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Reply": "Svar", - "@Reply": { - "description": "Button label for replying to a conversation", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Reply All": "Svar alle", - "@Reply All": { - "description": "Button label for replying to all conversation participants", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unknown User": "Ukjent bruker", - "@Unknown User": { - "description": "Label used where the user name is not known", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "me": "meg", - "@me": { - "description": "First-person pronoun (i.e. 'me') that will be used in message author info, e.g. 'Me to 4 others' or 'Jon Snow to me'", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "authorToRecipient": "{authorName} til {recipientName}", - "@authorToRecipient": { - "description": "Author info for a single-recipient message; includes both the author name and the recipient name.", - "type": "text", - "placeholders_order": [ - "authorName", - "recipientName" - ], - "placeholders": { - "authorName": {}, - "recipientName": {} - } - }, - "authorToNOthers": "{howMany,plural, =1{{authorName} til 1 annen}other{{authorName} til {howMany} andre}}", - "@authorToNOthers": { - "description": "Author info for a mutli-recipient message; includes the author name and the number of recipients", - "type": "text", - "placeholders_order": [ - "authorName", - "howMany" - ], - "placeholders": { - "authorName": {}, - "howMany": {} - } - }, - "authorToRecipientAndNOthers": "{howMany,plural, =1{{authorName} til {recipientName} og 1 annen}other{{authorName} til {recipientName} og {howMany} andre}}", - "@authorToRecipientAndNOthers": { - "description": "Author info for a multi-recipient message; includes the author name, one recipient name, and the number of other recipients", - "type": "text", - "placeholders_order": [ - "authorName", - "recipientName", - "howMany" - ], - "placeholders": { - "authorName": {}, - "recipientName": {}, - "howMany": {} - } - }, - "Download": "Last ned", - "@Download": { - "description": "Label for the button that will begin downloading a file", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Open with another app": "Åpne med en annen app", - "@Open with another app": { - "description": "Label for the button that will allow users to open a file with another app", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There are no installed applications that can open this file": "Det finnes ingen installerte applikasjoner som kan åpne denne filen", - "@There are no installed applications that can open this file": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unsupported File": "Filtypen støttes ikke", - "@Unsupported File": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "This file is unsupported and can’t be viewed through the app": "Denne filtypen støttes ikke og kan ikke vises på appen", - "@This file is unsupported and can’t be viewed through the app": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unable to play this media file": "Kan ikke spille av mediefilen", - "@Unable to play this media file": { - "description": "Message shown when audio or video media could not be played", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unable to load this image": "Kan ikke laste bildet", - "@Unable to load this image": { - "description": "Message shown when an image file could not be loaded or displayed", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading this file": "Det oppsto en feil under lasting av denne filen", - "@There was an error loading this file": { - "description": "Message shown when a file could not be loaded or displayed", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Courses": "Ingen fag", - "@No Courses": { - "description": "Title for having no courses", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Your student’s courses might not be published yet.": "Fagene til elevene dine er kanskje upublisert enda.", - "@Your student’s courses might not be published yet.": { - "description": "Message for having no courses", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading your student’s courses.": "Det oppsto en feil under lasting av elevfagene dine.", - "@There was an error loading your student’s courses.": { - "description": "Message displayed when the list of student courses could not be loaded", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Grade": "Ingen vurdering", - "@No Grade": { - "description": "Message shown when there is currently no grade available for a course", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Filter by": "Filtrer etter", - "@Filter by": { - "description": "Title for list of terms to filter grades by", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Grades": "Vurderinger", - "@Grades": { - "description": "Label for the \"Grades\" tab in course details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Syllabus": "Fagoversikt", - "@Syllabus": { - "description": "Label for the \"Syllabus\" tab in course details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Front Page": "Forside", - "@Front Page": { - "description": "Label for the \"Front Page\" tab in course details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Summary": "Sammendrag", - "@Summary": { - "description": "Label for the \"Summary\" tab in course details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Send a message about this course": "Send en melding om dette faget", - "@Send a message about this course": { - "description": "Accessibility hint for the course messaage floating action button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Total Grade": "Samlet vurdering", - "@Total Grade": { - "description": "Label for the total grade in the course", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Graded": "Vurdert", - "@Graded": { - "description": "Label for assignments that have been graded", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Submitted": "Innlevert", - "@Submitted": { - "description": "Label for assignments that have been submitted", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Not Submitted": "Ikke levert", - "@Not Submitted": { - "description": "Label for assignments that have not been submitted", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Late": "Sent", - "@Late": { - "description": "Label for assignments that have been marked late or submitted late", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Missing": "Mangler", - "@Missing": { - "description": "Label for assignments that have been marked missing or are not submitted and past the due date", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "-": "-", - "@-": { - "description": "Value representing no score for student submission", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "All Grading Periods": "Alle vurderingsperioder", - "@All Grading Periods": { - "description": "Label for selecting all grading periods", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Assignments": "Ingen oppgaver", - "@No Assignments": { - "description": "Title for the no assignments message", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "It looks like assignments haven't been created in this space yet.": "Det ser ut som det ikke er opprettet oppgaver i dette området enda.", - "@It looks like assignments haven't been created in this space yet.": { - "description": "Message for no assignments", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading the summary details for this course.": "Det oppsto en feil under lasting av sammendragsdetaljer for dette faget.", - "@There was an error loading the summary details for this course.": { - "description": "Message shown when the course summary could not be loaded", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Summary": "Ingen sammendrag", - "@No Summary": { - "description": "Title displayed when there are no items in the course summary", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "This course does not have any assignments or calendar events yet.": "Dette faget mangler fortsatt oppgaver eller kalenderhendelser.", - "@This course does not have any assignments or calendar events yet.": { - "description": "Message displayed when there are no items in the course summary", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "gradeFormatScoreOutOfPointsPossible": "{score}/{pointsPossible}", - "@gradeFormatScoreOutOfPointsPossible": { - "description": "Formatted string for a student score out of the points possible", - "type": "text", - "placeholders_order": [ - "score", - "pointsPossible" - ], - "placeholders": { - "score": {}, - "pointsPossible": {} - } - }, - "contentDescriptionScoreOutOfPointsPossible": "{score} av {pointsPossible} poeng", - "@contentDescriptionScoreOutOfPointsPossible": { - "description": "Formatted string for a student score out of the points possible", - "type": "text", - "placeholders_order": [ - "score", - "pointsPossible" - ], - "placeholders": { - "score": {}, - "pointsPossible": {} - } - }, - "gradesSubjectMessage": "Vedrørende: {studentName}, Vurderinger", - "@gradesSubjectMessage": { - "description": "The subject line for a message to a teacher regarding a student's grades", - "type": "text", - "placeholders_order": [ - "studentName" - ], - "placeholders": { - "studentName": {} - } - }, - "syllabusSubjectMessage": "Vedrørende: {studentName}, Fagoversikt", - "@syllabusSubjectMessage": { - "description": "The subject line for a message to a teacher regarding a course syllabus", - "type": "text", - "placeholders_order": [ - "studentName" - ], - "placeholders": { - "studentName": {} - } - }, - "frontPageSubjectMessage": "Vedrørende: {studentName}, Forside", - "@frontPageSubjectMessage": { - "description": "The subject line for a message to a teacher regarding a course front page", - "type": "text", - "placeholders_order": [ - "studentName" - ], - "placeholders": { - "studentName": {} - } - }, - "assignmentSubjectMessage": "Vedrørende: {studentName}, Oppgave - {assignmentName}", - "@assignmentSubjectMessage": { - "description": "The subject line for a message to a teacher regarding a student's assignment", - "type": "text", - "placeholders_order": [ - "studentName", - "assignmentName" - ], - "placeholders": { - "studentName": {}, - "assignmentName": {} - } - }, - "eventSubjectMessage": "Vedrørende: {studentName}, Hendelse - {eventTitle}", - "@eventSubjectMessage": { - "description": "The subject line for a message to a teacher regarding a calendar event", - "type": "text", - "placeholders_order": [ - "studentName", - "eventTitle" - ], - "placeholders": { - "studentName": {}, - "eventTitle": {} - } - }, - "There is no page information available.": "Det er ingen sideinformasjon tilgjengelig.", - "@There is no page information available.": { - "description": "Description for when no page information is available", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Assignment Details": "Oppgavedetaljer", - "@Assignment Details": { - "description": "Title for the page that shows details for an assignment", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "assignmentTotalPoints": "{points} poeng", - "@assignmentTotalPoints": { - "description": "Label used for the total points the assignment is worth", - "type": "text", - "placeholders_order": [ - "points" - ], - "placeholders": { - "points": {} - } - }, - "assignmentTotalPointsAccessible": "{points} poeng", - "@assignmentTotalPointsAccessible": { - "description": "Screen reader label used for the total points the assignment is worth", - "type": "text", - "placeholders_order": [ - "points" - ], - "placeholders": { - "points": {} - } - }, - "Due": "Forfall", - "@Due": { - "description": "Label for an assignment due date", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Grade": "Vurdering", - "@Grade": { - "description": "Label for the section that displays an assignment's grade", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Locked": "Låst", - "@Locked": { - "description": "Label for when an assignment is locked", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "assignmentLockedModule": "Denne oppgaven er låst av modulen \"{moduleName}\".", - "@assignmentLockedModule": { - "description": "The locked description when an assignment is locked by a module", - "type": "text", - "placeholders_order": [ - "moduleName" - ], - "placeholders": { - "moduleName": {} - } - }, - "Remind Me": "Påminnelse", - "@Remind Me": { - "description": "Label for the row to set reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Set a date and time to be notified of this specific assignment.": "Angi tid og dato for påminnelse om denne bestemte oppgaven.", - "@Set a date and time to be notified of this specific assignment.": { - "description": "Description for row to set reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You will be notified about this assignment on…": "Du vil få en påminnelse om denne oppgaven den…", - "@You will be notified about this assignment on…": { - "description": "Description for when a reminder is set", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Instructions": "Instruksjoner", - "@Instructions": { - "description": "Label for the description of the assignment when it has quiz instructions", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Send a message about this assignment": "Send en melding om denne oppgaven", - "@Send a message about this assignment": { - "description": "Accessibility hint for the assignment messaage floating action button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "This app is not authorized for use.": "Denne appen er ikke autorisert for bruk.", - "@This app is not authorized for use.": { - "description": "The error shown when the app being used is not verified by Canvas", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The server you entered is not authorized for this app.": "Serveren du oppga er ikke tillatt for denne appen.", - "@The server you entered is not authorized for this app.": { - "description": "The error shown when the desired login domain is not verified by Canvas", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The user agent for this app is not authorized.": "Brukeragenten for denne appen er ikke autorisert.", - "@The user agent for this app is not authorized.": { - "description": "The error shown when the user agent during verification is not verified by Canvas", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "We were unable to verify the server for use with this app.": "Vi klarte ikke å verifisere serveren for bruk med denne appen.", - "@We were unable to verify the server for use with this app.": { - "description": "The generic error shown when we are unable to verify with Canvas", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Reminders": "Påminnelser", - "@Reminders": { - "description": "Name of the system notification channel for assignment and event reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Notifications for reminders about assignments and calendar events": "Gir deg påminnelser om oppgaver og kalenderhendelser", - "@Notifications for reminders about assignments and calendar events": { - "description": "Description of the system notification channel for assignment and event reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Reminders have changed!": "Påminnelser er endret!", - "@Reminders have changed!": { - "description": "Title of the dialog shown when the user needs to update their reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "In order to provide you with a better experience, we have updated how reminders work. You can add new reminders by viewing an assignment or calendar event and tapping the switch under the \"Remind Me\" section.\n\nBe aware that any reminders created with older versions of this app will not be compatible with the new changes and you will need to create them again.": "For å gi deg en bedre opplevelse, har vi oppdatert hvordan påminnelser fungerer. Du kan legge til påminnelser ved å vise en oppgave eller kalenderoppføring og trykke på bryteren under avsnittet ”Påminn meg”.\n\nVær oppmerksom på at påminnelser som ble opprettet med den gamle versjonen av denne appen ikke er kompatible med de nye endringene, og at du må opprette disse på nytt.", - "@In order to provide you with a better experience, we have updated how reminders work. You can add new reminders by viewing an assignment or calendar event and tapping the switch under the \"Remind Me\" section.\n\nBe aware that any reminders created with older versions of this app will not be compatible with the new changes and you will need to create them again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Not a parent?": "Ikke en foresatt?", - "@Not a parent?": { - "description": "Title for the screen that shows when the user is not observing any students", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "We couldn't find any students associated with this account": "Vi kunne ikke finne noen elever knyttet til denne kontoen", - "@We couldn't find any students associated with this account": { - "description": "Subtitle for the screen that shows when the user is not observing any students", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Are you a student or teacher?": "Er du lærer eller elev?", - "@Are you a student or teacher?": { - "description": "Label for button that will show users the option to view other Canvas apps in the Play Store", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "One of our other apps might be a better fit. Tap one to visit the Play Store.": "En av våre andre applikasjoner kan være mer tilpasset. Trykk på en for å gå til Play Store.", - "@One of our other apps might be a better fit. Tap one to visit the Play Store.": { - "description": "Description of options to view other Canvas apps in the Play Store", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Return to Login": "Tilbake til logg-inn", - "@Return to Login": { - "description": "Label for the button that returns the user to the login screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "STUDENT": "ELEV", - "@STUDENT": { - "description": "The \"student\" portion of the \"Canvas Student\" app name, in all caps. \"Canvas\" is excluded in this context as it will be displayed to the user as a wordmark image", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "TEACHER": "LÆRER", - "@TEACHER": { - "description": "The \"teacher\" portion of the \"Canvas Teacher\" app name, in all caps. \"Canvas\" is excluded in this context as it will be displayed to the user as a wordmark image", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Canvas Student": "Canvas-elev", - "@Canvas Student": { - "description": "The name of the Canvas Student app. Only \"Student\" should be translated as \"Canvas\" is a brand name in this context and should not be translated.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Canvas Teacher": "Canvas Teacher", - "@Canvas Teacher": { - "description": "The name of the Canvas Teacher app. Only \"Teacher\" should be translated as \"Canvas\" is a brand name in this context and should not be translated.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Alerts": "Ingen varsler", - "@No Alerts": { - "description": "The title for the empty message to show to users when there are no alerts for the student.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There’s nothing to be notified of yet.": "Det er ingenting du trenger å bli varslet om enda.", - "@There’s nothing to be notified of yet.": { - "description": "The empty message to show to users when there are no alerts for the student.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "dismissAlertLabel": "Avvise {alertTitle}", - "@dismissAlertLabel": { - "description": "Accessibility label to dismiss an alert", - "type": "text", - "placeholders_order": [ - "alertTitle" - ], - "placeholders": { - "alertTitle": {} - } - }, - "Course Announcement": "Fag-beskjed", - "@Course Announcement": { - "description": "Title for alerts when there is a course announcement", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Institution Announcement": "Institusjons-beskjed", - "@Institution Announcement": { - "description": "Title for alerts when there is an institution announcement", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "assignmentGradeAboveThreshold": "Oppgavevurdering over {threshold}", - "@assignmentGradeAboveThreshold": { - "description": "Title for alerts when an assignment grade is above the threshold value", - "type": "text", - "placeholders_order": [ - "threshold" - ], - "placeholders": { - "threshold": {} - } - }, - "assignmentGradeBelowThreshold": "Oppgavevurdering under {threshold}", - "@assignmentGradeBelowThreshold": { - "description": "Title for alerts when an assignment grade is below the threshold value", - "type": "text", - "placeholders_order": [ - "threshold" - ], - "placeholders": { - "threshold": {} - } - }, - "courseGradeAboveThreshold": "Fagvurdering over {threshold}", - "@courseGradeAboveThreshold": { - "description": "Title for alerts when a course grade is above the threshold value", - "type": "text", - "placeholders_order": [ - "threshold" - ], - "placeholders": { - "threshold": {} - } - }, - "courseGradeBelowThreshold": "Fagvurdering under {threshold}", - "@courseGradeBelowThreshold": { - "description": "Title for alerts when a course grade is below the threshold value", - "type": "text", - "placeholders_order": [ - "threshold" - ], - "placeholders": { - "threshold": {} - } - }, - "Settings": "Innstillinger", - "@Settings": { - "description": "Title for the settings screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Theme": "Tema", - "@Theme": { - "description": "Label for the light/dark theme section in the settings page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Dark Mode": "Mørk modus", - "@Dark Mode": { - "description": "Label for the button that enables dark mode", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Light Mode": "Lys modus", - "@Light Mode": { - "description": "Label for the button that enables light mode", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "High Contrast Mode": "Høy kontrast-modus", - "@High Contrast Mode": { - "description": "Label for the switch that toggles high contrast mode", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Use Dark Theme in Web Content": "Bruk Mørkt tema i webinnhold", - "@Use Dark Theme in Web Content": { - "description": "Label for the switch that toggles dark mode for webviews", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Appearance": "Utseende", - "@Appearance": { - "description": "Label for the appearance section in the settings page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Successfully submitted!": "Vellykket innlevering!", - "@Successfully submitted!": { - "description": "Title displayed in the grade cell for an assignment that has been submitted", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "submissionStatusSuccessSubtitle": "Denne oppgaven ble levert den {date} klokken {time} og avventer vurdering.", - "@submissionStatusSuccessSubtitle": { - "description": "Subtitle displayed in the grade cell for an assignment that has been submitted and is awaiting a grade", - "type": "text", - "placeholders_order": [ - "date", - "time" - ], - "placeholders": { - "date": {}, - "time": {} - } - }, - "outOfPoints": "{howMany,plural, =1{av 1 poeng}other{av {points} poenger}}", - "@outOfPoints": { - "description": "Description for an assignment grade that has points without a current scoroe", - "type": "text", - "placeholders_order": [ - "points", - "howMany" - ], - "placeholders": { - "points": {}, - "howMany": {} - } - }, - "Excused": "Fritatt", - "@Excused": { - "description": "Grading status for an assignment marked as excused", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Complete": "Fullført", - "@Complete": { - "description": "Grading status for an assignment marked as complete", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Incomplete": "Ikke fullført", - "@Incomplete": { - "description": "Grading status for an assignment marked as incomplete", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "minus": "minus", - "@minus": { - "description": "Screen reader-friendly replacement for the \"-\" character in letter grades like \"A-\"", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "latePenalty": "Forsinkelsesstraff (-{pointsLost})", - "@latePenalty": { - "description": "Text displayed when a late penalty has been applied to the assignment", - "type": "text", - "placeholders_order": [ - "pointsLost" - ], - "placeholders": { - "pointsLost": {} - } - }, - "finalGrade": "Avsluttende vurdering: {grade}", - "@finalGrade": { - "description": "Text that displays the final grade of an assignment", - "type": "text", - "placeholders_order": [ - "grade" - ], - "placeholders": { - "grade": {} - } - }, - "Alert Settings": "Varselsinnstillinger", - "@Alert Settings": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Alert me when…": "Varsle meg når…", - "@Alert me when…": { - "description": "Header for the screen where the observer chooses the thresholds that will determine when they receive alerts (e.g. when an assignment is graded below 70%)", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Course grade below": "Fagvurdering under", - "@Course grade below": { - "description": "Label describing the threshold for when the course grade is below a certain percentage", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Course grade above": "Fagvurdering over", - "@Course grade above": { - "description": "Label describing the threshold for when the course grade is above a certain percentage", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Assignment missing": "Oppgave mangler", - "@Assignment missing": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Assignment grade below": "Oppgavevurdering under", - "@Assignment grade below": { - "description": "Label describing the threshold for when an assignment is graded below a certain percentage", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Assignment grade above": "Oppgavevurdering over", - "@Assignment grade above": { - "description": "Label describing the threshold for when an assignment is graded above a certain percentage", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Course Announcements": "Fagbeskjeder", - "@Course Announcements": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Institution Announcements": "Institusjonsbeskjeder", - "@Institution Announcements": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Never": "Aldri", - "@Never": { - "description": "Indication that tells the user they will not receive alert notifications of a specific kind", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Grade percentage": "Vurderingsskala i prosent", - "@Grade percentage": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading your student's alerts.": "Det oppsto en feil under lasting av elevvarslene dine.", - "@There was an error loading your student's alerts.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Must be below 100": "Må være under 100", - "@Must be below 100": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "mustBeBelowN": "Må være under {percentage}", - "@mustBeBelowN": { - "description": "Validation error to the user that they must choose a percentage below 'n'", - "type": "text", - "placeholders_order": [ - "percentage" - ], - "placeholders": { - "percentage": { - "example": 5 - } - } - }, - "mustBeAboveN": "Må være over {percentage}", - "@mustBeAboveN": { - "description": "Validation error to the user that they must choose a percentage above 'n'", - "type": "text", - "placeholders_order": [ - "percentage" - ], - "placeholders": { - "percentage": { - "example": 5 - } - } - }, - "Select Student Color": "Velg elevfarge", - "@Select Student Color": { - "description": "Title for screen that allows users to assign a color to a specific student", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Electric, blue": "Elektrisk, blå", - "@Electric, blue": { - "description": "Name of the Electric (blue) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Plum, Purple": "Plomme, blå", - "@Plum, Purple": { - "description": "Name of the Plum (purple) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Barney, Fuschia": "Barney, fuchsia", - "@Barney, Fuschia": { - "description": "Name of the Barney (fuschia) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Raspberry, Red": "Bringebær, rød", - "@Raspberry, Red": { - "description": "Name of the Raspberry (red) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Fire, Orange": "Ild, oransje", - "@Fire, Orange": { - "description": "Name of the Fire (orange) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Shamrock, Green": "Kløver, grønn", - "@Shamrock, Green": { - "description": "Name of the Shamrock (green) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "An error occurred while saving your selection. Please try again.": "Det oppsto en feil ved lagring av valget ditt. Prøv på nytt.", - "@An error occurred while saving your selection. Please try again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "changeStudentColorLabel": "Endre farge for {studentName}", - "@changeStudentColorLabel": { - "description": "Accessibility label for the button that lets users change the color associated with a specific student", - "type": "text", - "placeholders_order": [ - "studentName" - ], - "placeholders": { - "studentName": {} - } - }, - "Teacher": "Lærer", - "@Teacher": { - "description": "Label for the Teacher enrollment type", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Student": "Elev", - "@Student": { - "description": "Label for the Student enrollment type", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "TA": "LA", - "@TA": { - "description": "Label for the Teaching Assistant enrollment type (also known as Teacher Aid or Education Assistant), reduced to a short acronym/initialism if appropriate.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Observer": "Observatør", - "@Observer": { - "description": "Label for the Observer enrollment type", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Use Camera": "Bruk kamera", - "@Use Camera": { - "description": "Label for the action item that lets the user capture a photo using the device camera", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Upload File": "Last opp fil", - "@Upload File": { - "description": "Label for the action item that lets the user upload a file from their device", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Choose from Gallery": "Velg fra galleri", - "@Choose from Gallery": { - "description": "Label for the action item that lets the user select a photo from their device gallery", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Preparing…": "Forbereder…", - "@Preparing…": { - "description": "Message shown while a file is being prepared to attach to a message", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Add student with…": "Legg til en elev til…", - "@Add student with…": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Add Student": "Legg til elev", - "@Add Student": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You are not observing any students.": "Du har ingen elever under observasjon.", - "@You are not observing any students.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading your students.": "Det oppsto en feil under lasting av elevene dine.", - "@There was an error loading your students.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Pairing Code": "Paringskode", - "@Pairing Code": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Students can obtain a pairing code through the Canvas website": "Elever kan få en paringskode gjennom Canvas-nettstedet", - "@Students can obtain a pairing code through the Canvas website": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Enter the student pairing code provided to you. If the pairing code doesn't work, it may have expired": "Angi elevparingskoden som ble gitt til deg. Hvis paringskoden ikke fungerer kan det hende at den er utgått", - "@Enter the student pairing code provided to you. If the pairing code doesn't work, it may have expired": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Your code is incorrect or expired.": "Koden din stemmer ikke eller den er utgått", - "@Your code is incorrect or expired.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Something went wrong trying to create your account, please reach out to your school for assistance.": "Noe gikk galt da vi forsøkte å opprette kontoen din. Kontakt skolen din for assistanse.", - "@Something went wrong trying to create your account, please reach out to your school for assistance.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "QR Code": "QR-kode", - "@QR Code": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Students can create a QR code using the Canvas Student app on their mobile device": "Elever kan opprette en QR-kode ved å bruke Canvas Elev-appen på mobilenheten", - "@Students can create a QR code using the Canvas Student app on their mobile device": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Add new student": "Legg til ny elev", - "@Add new student": { - "description": "Semantics label for the FAB on the Manage Students Screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Select": "Velg", - "@Select": { - "description": "Hint text to tell the user to choose one of two options", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I have a Canvas account": "Jeg har en Canvas-konto", - "@I have a Canvas account": { - "description": "Option to select for users that have a canvas account", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I don't have a Canvas account": "Jeg har ikke en Canvas-konto", - "@I don't have a Canvas account": { - "description": "Option to select for users that don't have a canvas account", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Create Account": "Opprett konto", - "@Create Account": { - "description": "Button text for account creation confirmation", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Full Name": "Fullt navn", - "@Full Name": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Email Address": "E-postadresse", - "@Email Address": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Password": "Passord", - "@Password": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Full Name…": "Fullt navn…", - "@Full Name…": { - "description": "hint label for inside form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Email…": "E-post…", - "@Email…": { - "description": "hint label for inside form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Password…": "Passord…", - "@Password…": { - "description": "hint label for inside form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Please enter full name": "Angi fullt navn", - "@Please enter full name": { - "description": "Error message for form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Please enter an email address": "Angi en e-postadresse", - "@Please enter an email address": { - "description": "Error message for form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Please enter a valid email address": "Oppgi en gyldig e-postadresse", - "@Please enter a valid email address": { - "description": "Error message for form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Password is required": "Passord kreves", - "@Password is required": { - "description": "Error message for form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Password must contain at least 8 characters": "Passord må inneholde minst åtte tegn", - "@Password must contain at least 8 characters": { - "description": "Error message for form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "qrCreateAccountTos": "Ved å trykke på Opprett konto, samtykker du til {termsOfService} og godtar {privacyPolicy}", - "@qrCreateAccountTos": { - "description": "The text show on the account creation screen", - "type": "text", - "placeholders_order": [ - "termsOfService", - "privacyPolicy" - ], - "placeholders": { - "termsOfService": {}, - "privacyPolicy": {} - } - }, - "Terms of Service": "Tjenestevilkår", - "@Terms of Service": { - "description": "Label for the Canvas Terms of Service agreement. This will be used in the qrCreateAccountTos text and will be highlighted and clickable", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Privacy Policy": "Retningslinjer for personvern", - "@Privacy Policy": { - "description": "Label for the Canvas Privacy Policy agreement. This will be used in the qrCreateAccountTos text and will be highlighted and clickable", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "View the Privacy Policy": "Se retningslinjer for personvern", - "@View the Privacy Policy": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Already have an account? ": "Har du allerede en konto? ", - "@Already have an account? ": { - "description": "Part of multiline text span, includes AccountSignIn1-2, in that order", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Sign In": "Logg inn", - "@Sign In": { - "description": "Part of multiline text span, includes AccountSignIn1-2, in that order", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Hide Password": "Skjul passord", - "@Hide Password": { - "description": "content description for password hide button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Show Password": "Vis passord", - "@Show Password": { - "description": "content description for password show button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Terms of Service Link": "Lenke til tjenestevilkår", - "@Terms of Service Link": { - "description": "content description for terms of service link", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Privacy Policy Link": "Lenke til retningslinjer for personvern", - "@Privacy Policy Link": { - "description": "content description for privacy policy link", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Event": "Hendelse", - "@Event": { - "description": "Title for the event details screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Date": "Dato", - "@Date": { - "description": "Label for the event date", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Location": "Sted", - "@Location": { - "description": "Label for the location information", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Location Specified": "Ingen lokalisasjon spesifisert", - "@No Location Specified": { - "description": "Description for events that do not have a location", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "eventTime": "{startAt} - {endAt}", - "@eventTime": { - "description": "The time the event is happening, example: \"2:00 pm - 4:00 pm\"", - "type": "text", - "placeholders_order": [ - "startAt", - "endAt" - ], - "placeholders": { - "startAt": {}, - "endAt": {} - } - }, - "Set a date and time to be notified of this event.": "Angi tid og dato for påminnelse om denne oppgaven.", - "@Set a date and time to be notified of this event.": { - "description": "Description for row to set event reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You will be notified about this event on…": "Du vil få en påminnelse om denne hendelsen den…", - "@You will be notified about this event on…": { - "description": "Description for when an event reminder is set", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Share Your Love for the App": "Del din kjærlighet for appen", - "@Share Your Love for the App": { - "description": "Label for option to open the app store", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Tell us about your favorite parts of the app": "Fortell oss om dine favorittdeler av appen", - "@Tell us about your favorite parts of the app": { - "description": "Description for option to open the app store", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Legal": "Juss", - "@Legal": { - "description": "Label for legal information option", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Privacy policy, terms of use, open source": "Personvernregler, brukervilkår, åpen kilde", - "@Privacy policy, terms of use, open source": { - "description": "Description for legal information option", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Idea for Canvas Parent App [Android]": "Idé for appen Canvas Parent [Android]", - "@Idea for Canvas Parent App [Android]": { - "description": "The subject for the email to request a feature", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The following information will help us better understand your idea:": "Følgende informasjon vil hjelpe oss bedre til å forstå din idé:", - "@The following information will help us better understand your idea:": { - "description": "The header for the users information that is attached to a feature request", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Domain:": "Domene:", - "@Domain:": { - "description": "The label for the Canvas domain of the logged in user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "User ID:": "Bruker-ID:", - "@User ID:": { - "description": "The label for the Canvas user ID of the logged in user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Email:": "E-post:", - "@Email:": { - "description": "The label for the eamil of the logged in user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Locale:": "Sted:", - "@Locale:": { - "description": "The label for the locale of the logged in user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Terms of Use": "brukervilkår", - "@Terms of Use": { - "description": "Label for the terms of use", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Canvas on GitHub": "Canvas på GitHub", - "@Canvas on GitHub": { - "description": "Label for the button that opens the Canvas project on GitHub's website", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was a problem loading the Terms of Use": "Det oppsto et problem under opplastingen av brukervilkårene", - "@There was a problem loading the Terms of Use": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Device": "Enhet", - "@Device": { - "description": "Label used for device manufacturer/model in the error report", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "OS Version": "OS-versjon", - "@OS Version": { - "description": "Label used for device operating system version in the error report", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Version Number": "Versjon nummer", - "@Version Number": { - "description": "Label used for the app version number in the error report", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Report A Problem": "Rapporter et problem", - "@Report A Problem": { - "description": "Title used for generic dialog to report problems", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Subject": "Tema", - "@Subject": { - "description": "Label used for Subject text field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "A subject is required.": "Du må ha en tittel.", - "@A subject is required.": { - "description": "Error shown when the subject field is empty", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "An email address is required.": "Du må ha en e-postadresse.", - "@An email address is required.": { - "description": "Error shown when the email field is empty", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Description": "Beskrivelse", - "@Description": { - "description": "Label used for Description text field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "A description is required.": "Du må ha en beskrivelse.", - "@A description is required.": { - "description": "Error shown when the description field is empty", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "How is this affecting you?": "Hvordan påvirker dette deg?", - "@How is this affecting you?": { - "description": "Label used for the dropdown to select how severe the issue is", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "send": "send", - "@send": { - "description": "Label used for send button when reporting a problem", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Just a casual question, comment, idea, suggestion…": "Bare et tilfeldig spørsmål, kommentar, idé eller forslag…", - "@Just a casual question, comment, idea, suggestion…": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I need some help but it's not urgent.": "Jeg trenger litt hjelp men det haster ikke.", - "@I need some help but it's not urgent.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Something's broken but I can work around it to get what I need done.": "Noe er ødelagt, men jeg kan jobbe rundt problemet for å få gjort det jeg trenger å gjøre.", - "@Something's broken but I can work around it to get what I need done.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I can't get things done until I hear back from you.": "Jeg får gjort noenting før jeg hører i fra deg.", - "@I can't get things done until I hear back from you.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "EXTREME CRITICAL EMERGENCY!!": "EKSTREMT KRITISK NØDSITUASJON!!", - "@EXTREME CRITICAL EMERGENCY!!": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Not Graded": "Ikke vurdert", - "@Not Graded": { - "description": "Description for an assignment has not been graded.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Login flow: Normal": "Innloggingsflyt: Normal", - "@Login flow: Normal": { - "description": "Description for the normal login flow", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Login flow: Canvas": "Innloggingsflyt: Canvas", - "@Login flow: Canvas": { - "description": "Description for the Canvas login flow", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Login flow: Site Admin": "Innloggingsflyt: Nettstedadministrator", - "@Login flow: Site Admin": { - "description": "Description for the Site Admin login flow", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Login flow: Skip mobile verify": "Innloggingsflyt: Hopp over bekreftelse med mobil", - "@Login flow: Skip mobile verify": { - "description": "Description for the login flow that skips domain verification for mobile", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Act As User": "Opptre som bruker", - "@Act As User": { - "description": "Label for the button that allows the user to act (masquerade) as another user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Stop Acting as User": "Avslutt opptre som bruker", - "@Stop Acting as User": { - "description": "Label for the button that allows the user to stop acting (masquerading) as another user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "actingAsUser": "Du opptrer som {userName}", - "@actingAsUser": { - "description": "Message shown while acting (masquerading) as another user", - "type": "text", - "placeholders_order": [ - "userName" - ], - "placeholders": { - "userName": {} - } - }, - "\"Act as\" is essentially logging in as this user without a password. You will be able to take any action as if you were this user, and from other users' points of views, it will be as if this user performed them. However, audit logs record that you were the one who performed the actions on behalf of this user.": "\"Oppfør deg som\" er i realiteten å logge inn som denne brukeren uten passord. Du vil kunne utføre alle handlinger som om du var denne brukeren, og for andre brukere vil det se ut som om at denne brukeren utførte handlingene. Overvåkingloggen vil likevel notere at det var du som utførte handlingene på vegne av denne brukeren.", - "@\"Act as\" is essentially logging in as this user without a password. You will be able to take any action as if you were this user, and from other users' points of views, it will be as if this user performed them. However, audit logs record that you were the one who performed the actions on behalf of this user.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Domain": "Domene", - "@Domain": { - "description": "Text field hint for domain url input", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You must enter a valid domain": "Du må oppgi et gyldig domene", - "@You must enter a valid domain": { - "description": "Message displayed for domain input error", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "User ID": "Bruker-ID", - "@User ID": { - "description": "Text field hint for user ID input", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You must enter a user id": "Du må skrive inn en bruker-ID", - "@You must enter a user id": { - "description": "Message displayed for user Id input error", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error trying to act as this user. Please check the Domain and User ID and try again.": "Det oppsto en feil med å opptre som denne brukeren. Sjekk domenet og bruker-ID-en og prøv igjen.", - "@There was an error trying to act as this user. Please check the Domain and User ID and try again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "endMasqueradeMessage": "Du vil slutte å opptre som {userName} og gå tilbake til din originale konto.", - "@endMasqueradeMessage": { - "description": "Confirmation message displayed when the user wants to stop acting (masquerading) as another user", - "type": "text", - "placeholders_order": [ - "userName" - ], - "placeholders": { - "userName": {} - } - }, - "endMasqueradeLogoutMessage": "Du vil slutte å opptre som {userName} og bli logget ut.", - "@endMasqueradeLogoutMessage": { - "description": "Confirmation message displayed when the user wants to stop acting (masquerading) as another user and will be logged out.", - "type": "text", - "placeholders_order": [ - "userName" - ], - "placeholders": { - "userName": {} - } - }, - "How are we doing?": "Hvordan klarer vi oss?", - "@How are we doing?": { - "description": "Title for dialog asking user to rate the app out of 5 stars.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Don't show again": "Ikke vis igjen", - "@Don't show again": { - "description": "Button to prevent the rating dialog from showing again.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "What can we do better?": "Hva kan vi gjøre bedre?", - "@What can we do better?": { - "description": "Hint text for providing a comment with the rating.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Send Feedback": "Send tilbakemelding", - "@Send Feedback": { - "description": "Button to send rating with feedback", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "ratingDialogEmailSubject": "Forslag for Android - Canvas foreldre {version}", - "@ratingDialogEmailSubject": { - "description": "The subject for an email to provide feedback for CanvasParent.", - "type": "text", - "placeholders_order": [ - "version" - ], - "placeholders": { - "version": {} - } - }, - "starRating": "{position,plural, =1{{position} stjerne}other{{position} stjerner}}", - "@starRating": { - "description": "Accessibility label for the 1 stars to 5 stars rating", - "type": "text", - "placeholders_order": [ - "position" - ], - "placeholders": { - "position": { - "example": 1 - } - } - }, - "Student Pairing": "Elevparing", - "@Student Pairing": { - "description": "Title for the screen where users can pair to students using a QR code", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Open Canvas Student": "Åpne Canvas elev", - "@Open Canvas Student": { - "description": "Title for QR pairing tutorial screen instructing users to open the Canvas Student app", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You'll need to open your student's Canvas Student app to continue. Go into Main Menu > Settings > Pair with Observer and scan the QR code you see there.": "Du må åpne Canvas Elev-appen til eleven din for å fortsette. Gå til Hovedmeny > Innstillinger > Paring med observatør og skann QR-koden du ser der.", - "@You'll need to open your student's Canvas Student app to continue. Go into Main Menu > Settings > Pair with Observer and scan the QR code you see there.": { - "description": "Message explaining how QR code pairing works", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Screenshot showing location of pairing QR code generation in the Canvas Student app": "Skjermbilde som viser plasseringen av QR-koden som genereres i Canvas Elev-appen", - "@Screenshot showing location of pairing QR code generation in the Canvas Student app": { - "description": "Content Description for qr pairing tutorial screenshot", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Expired QR Code": "Utgått QR-kode", - "@Expired QR Code": { - "description": "Error title shown when the users scans a QR code that has expired", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The QR code you scanned may have expired. Refresh the code on the student's device and try again.": "QR-koden du skannet kan ha utgått Gjenopprett koden på elevens enhet og prøv igjen.", - "@The QR code you scanned may have expired. Refresh the code on the student's device and try again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "A network error occurred when adding this student. Check your connection and try again.": "Det oppsto en nettverksfeil da du la til denne eleven. Kontroller tilkoblingen og prøv på nytt.", - "@A network error occurred when adding this student. Check your connection and try again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Invalid QR Code": "Ugyldig QR-kode", - "@Invalid QR Code": { - "description": "Error title shown when the user scans an invalid QR code", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Incorrect Domain": "Ugyldig domene", - "@Incorrect Domain": { - "description": "Error title shown when the users scane a QR code for a student that belongs to a different domain", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The student you are trying to add belongs to a different school. Log in or create an account with that school to scan this code.": "Eleven du forsøker å legge til tilhører en annen skole. Logg inn eller opprett en konto med den skolen for å skanne denne koden.", - "@The student you are trying to add belongs to a different school. Log in or create an account with that school to scan this code.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Camera Permission": "Kameratillatelse", - "@Camera Permission": { - "description": "Error title shown when the user wans to scan a QR code but has denied the camera permission", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "This will unpair and remove all enrollments for this student from your account.": "Dette vil koble fra og fjerne alle påmeldinger for denne eleven fra kontoen din.", - "@This will unpair and remove all enrollments for this student from your account.": { - "description": "Confirmation message shown when the user tries to delete a student from their account", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was a problem removing this student from your account. Please check your connection and try again.": "Det oppsto et problem ved fjerning av denne eleven fra kontoen din. Kontroller tilkoblingen og prøv på nytt.", - "@There was a problem removing this student from your account. Please check your connection and try again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Cancel": "Avbryt", - "@Cancel": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "next": "Neste", - "@next": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "ok": "OK", - "@ok": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Yes": "Ja", - "@Yes": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No": "Nei", - "@No": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Retry": "Forsøk igjen", - "@Retry": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Delete": "Slett", - "@Delete": { - "description": "Label used for general delete/remove actions", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Done": "Ferdig", - "@Done": { - "description": "Label for general done/finished actions", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Refresh": "Oppdater", - "@Refresh": { - "description": "Label for button to refresh data from the web", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "View Description": "Vise beskrivelsen", - "@View Description": { - "description": "Button to view the description for an event or assignment", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "expanded": "utvidet", - "@expanded": { - "description": "Description for the accessibility reader for list groups that are expanded", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "collapsed": "skjult", - "@collapsed": { - "description": "Description for the accessibility reader for list groups that are expanded", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "An unexpected error occurred": "Det oppsto en uventet feil", - "@An unexpected error occurred": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No description": "Ingen beskrivelse", - "@No description": { - "description": "Message used when the assignment has no description", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Launch External Tool": "Åpne eksternt verktøy", - "@Launch External Tool": { - "description": "Button text added to webviews to let users open external tools in their browser", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Interactions on this page are limited by your institution.": "Interaksjoner på denne siden er begrenset av institusjonen din.", - "@Interactions on this page are limited by your institution.": { - "description": "Message describing how the webview has limited access due to an instution setting", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "dateAtTime": "{date} på {time}", - "@dateAtTime": { - "description": "The string to format dates", - "type": "text", - "placeholders_order": [ - "date", - "time" - ], - "placeholders": { - "date": {}, - "time": {} - } - }, - "dueDateAtTime": "Frist {date} klokken {time}", - "@dueDateAtTime": { - "description": "The string to format due dates", - "type": "text", - "placeholders_order": [ - "date", - "time" - ], - "placeholders": { - "date": {}, - "time": {} - } - }, - "No Due Date": "Ingen forfallsdato", - "@No Due Date": { - "description": "Label for assignments that do not have a due date", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Filter": "Filter", - "@Filter": { - "description": "Label for buttons to filter what items are visible", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "unread": "ulest", - "@unread": { - "description": "Label for things that are marked as unread", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "unreadCount": "{count} ulest", - "@unreadCount": { - "description": "Formatted string for when there are a number of unread items", - "type": "text", - "placeholders_order": [ - "count" - ], - "placeholders": { - "count": {} - } - }, - "badgeNumberPlus": "{count}+", - "@badgeNumberPlus": { - "description": "Formatted string for when too many items are being notified in a badge, generally something like: 99+", - "type": "text", - "placeholders_order": [ - "count" - ], - "placeholders": { - "count": {} - } - }, - "There was an error loading this announcement": "Det oppsto en feil under lasting av denne beskjeden", - "@There was an error loading this announcement": { - "description": "Message shown when an announcement detail screen fails to load", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Network error": "Nettverksfeil", - "@Network error": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Under Construction": "Under bygging", - "@Under Construction": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "We are currently building this feature for your viewing pleasure.": "Vi jobber for tiden med denne funksjonen slik at du kan få glede av den senere.", - "@We are currently building this feature for your viewing pleasure.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Request Login Help Button": "“Be om hjelp til å logge inn”-knapp", - "@Request Login Help Button": { - "description": "Accessibility hint for button that opens help dialog for a login help request", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Request Login Help": "Be om hjelp til å logge inn", - "@Request Login Help": { - "description": "Title of help dialog for a login help request", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I'm having trouble logging in": "Jeg har problemer med å logge inn", - "@I'm having trouble logging in": { - "description": "Subject of help dialog for a login help request", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "An error occurred when trying to display this link": "Feil oppsto da du ønsket å vise denne lenken.", - "@An error occurred when trying to display this link": { - "description": "Error message shown when a link can't be opened", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "We are unable to display this link, it may belong to an institution you currently aren't logged in to.": "Vi kan ikke vise denne lenken, den kan eies av en instutisjon som du for øyeblikket ikke er innlogget i.", - "@We are unable to display this link, it may belong to an institution you currently aren't logged in to.": { - "description": "Description for error page shown when clicking a link", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Link Error": "Feil på lenke", - "@Link Error": { - "description": "Title for error page shown when clicking a link", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Open In Browser": "Åpne i nettleser", - "@Open In Browser": { - "description": "Text for button to open a link in the browswer", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You'll find the QR code on the web in your account profile. Click 'QR for Mobile Login' in the list.": "Du finner QR-koden på nettet i kontoprofilen din. Klikk på “QR for mobil-innlogging” i listen.", - "@You'll find the QR code on the web in your account profile. Click 'QR for Mobile Login' in the list.": { - "description": "Text for qr login tutorial screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Locate QR Code": "Lokalisere QR-kode", - "@Locate QR Code": { - "description": "Text for qr login button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Please scan a QR code generated by Canvas": "Skann en QR-kode generert av Canvas", - "@Please scan a QR code generated by Canvas": { - "description": "Text for qr login error with incorrect qr code", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error logging in. Please generate another QR Code and try again.": "Det oppsto en feil ved innlogging. Vennligst lag en ny QR-kode og prøv på nytt.", - "@There was an error logging in. Please generate another QR Code and try again.": { - "description": "Text for qr login error", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Screenshot showing location of QR code generation in browser": "Skjermbilde som viser plassering av QR-kodegenerering i nettleser", - "@Screenshot showing location of QR code generation in browser": { - "description": "Content Description for qr login tutorial screenshot", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "QR scanning requires camera access": "QR-skanning krever kameratilgang", - "@QR scanning requires camera access": { - "description": "placeholder for camera error for QR code scan", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The linked item is no longer available": "Det koblede elementet er ikke lenger tilgjengelig", - "@The linked item is no longer available": { - "description": "error message when the alert could no be opened", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Message sent": "Melding sendt", - "@Message sent": { - "description": "confirmation message on the screen when the user succesfully sends a message", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Acceptable Use Policy": "Retningslinjer for akseptabel bruk", - "@Acceptable Use Policy": { - "description": "title for the acceptable use policy screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Submit": "Send inn", - "@Submit": { - "description": "submit button title for acceptable use policy screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Either you're a new user or the Acceptable Use Policy has changed since you last agreed to it. Please agree to the Acceptable Use Policy before you continue.": "Enten du er ny bruker eller retningslinjer for akseptabel bruk er endret siden sist du godkjente dem. Du må godta retningslinjer for akseptabel bruk før du fortsetter.", - "@Either you're a new user or the Acceptable Use Policy has changed since you last agreed to it. Please agree to the Acceptable Use Policy before you continue.": { - "description": "acceptable use policy screen description", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I agree to the Acceptable Use Policy.": "Jeg godtar retningslinjer for akseptabel bruk", - "@I agree to the Acceptable Use Policy.": { - "description": "acceptable use policy switch title", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "About": "Om", - "@About": { - "description": "Title for about menu item in settings", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "App": "App", - "@App": { - "description": "Title for App field on about page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Login ID": "Innloggings-ID", - "@Login ID": { - "description": "Title for Login ID field on about page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Email": "E-post", - "@Email": { - "description": "Title for Email field on about page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Version": "Versjon", - "@Version": { - "description": "Title for Version field on about page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Instructure logo": "Instructure-logo", - "@Instructure logo": { - "description": "Semantics label for the Instructure logo on the about page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - } -} \ No newline at end of file diff --git a/apps/flutter_parent/lib/l10n/res/intl_nl.arb b/apps/flutter_parent/lib/l10n/res/intl_nl.arb deleted file mode 100644 index 6faf9e6f07..0000000000 --- a/apps/flutter_parent/lib/l10n/res/intl_nl.arb +++ /dev/null @@ -1,2753 +0,0 @@ -{ - "@@last_modified": "2023-08-25T11:04:20.901151", - "alertsLabel": "Waarschuwingen", - "@alertsLabel": { - "description": "The label for the Alerts tab", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "calendarLabel": "Kalender", - "@calendarLabel": { - "description": "The label for the Calendar tab", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "coursesLabel": "Cursussen", - "@coursesLabel": { - "description": "The label for the Courses tab", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Students": "Geen cursisten", - "@No Students": { - "description": "Text for when an observer has no students they are observing", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Tap to show student selector": "Tik om cursistkiezer weer te geven", - "@Tap to show student selector": { - "description": "Semantics label for the area that will show the student selector when tapped", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Tap to pair with a new student": "Tik om te koppelen met een nieuwe cursist", - "@Tap to pair with a new student": { - "description": "Semantics label for the add student button in the student selector", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Tap to select this student": "Tik om deze cursist te selecteren", - "@Tap to select this student": { - "description": "Semantics label on individual students in the student switcher", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Manage Students": "Cursisten beheren", - "@Manage Students": { - "description": "Label text for the Manage Students nav drawer button as well as the title for the Manage Students screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Help": "Help", - "@Help": { - "description": "Label text for the help nav drawer button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Log Out": "Afmelden", - "@Log Out": { - "description": "Label text for the Log Out nav drawer button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Switch Users": "Wissel van gebruikers", - "@Switch Users": { - "description": "Label text for the Switch Users nav drawer button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "appVersion": "v. {version}", - "@appVersion": { - "description": "App version shown in the navigation drawer", - "type": "text", - "placeholders_order": [ - "version" - ], - "placeholders": { - "version": {} - } - }, - "Are you sure you want to log out?": "Weet je zeker dat je wilt uitloggen?", - "@Are you sure you want to log out?": { - "description": "Confirmation message displayed when the user tries to log out", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Calendars": "Kalenders", - "@Calendars": { - "description": "Label for button that lets users select which calendars to display", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "nextMonth": "Volgende maand: {month}", - "@nextMonth": { - "description": "Label for the button that switches the calendar to the next month", - "type": "text", - "placeholders_order": [ - "month" - ], - "placeholders": { - "month": {} - } - }, - "previousMonth": "Vorige maand: {month}", - "@previousMonth": { - "description": "Label for the button that switches the calendar to the previous month", - "type": "text", - "placeholders_order": [ - "month" - ], - "placeholders": { - "month": {} - } - }, - "nextWeek": "Volgende week vanaf {date}", - "@nextWeek": { - "description": "Label for the button that switches the calendar to the next week", - "type": "text", - "placeholders_order": [ - "date" - ], - "placeholders": { - "date": {} - } - }, - "previousWeek": "Vorige week vanaf {date}", - "@previousWeek": { - "description": "Label for the button that switches the calendar to the previous week", - "type": "text", - "placeholders_order": [ - "date" - ], - "placeholders": { - "date": {} - } - }, - "selectedMonthLabel": "De maand {month}", - "@selectedMonthLabel": { - "description": "Accessibility label for the button that expands/collapses the month view", - "type": "text", - "placeholders_order": [ - "month" - ], - "placeholders": { - "month": {} - } - }, - "expand": "uitvouwen", - "@expand": { - "description": "Accessibility label for the on-tap hint for the button that expands/collapses the month view", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "collapse": "samenvouwen", - "@collapse": { - "description": "Accessibility label for the on-tap hint for the button that expands/collapses the month view", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "pointsPossible": "{points} punten mogelijk", - "@pointsPossible": { - "description": "Screen reader label used for the points possible for an assignment, quiz, etc.", - "type": "text", - "placeholders_order": [ - "points" - ], - "placeholders": { - "points": {} - } - }, - "calendarDaySemanticsLabel": "{eventCount,plural, =1{{date}, {eventCount} gebeurtenis}other{{date}, {eventCount} gebeurtenissen}}", - "@calendarDaySemanticsLabel": { - "description": "Screen reader label used for calendar day, reads the date and count of events", - "type": "text", - "placeholders_order": [ - "date", - "eventCount" - ], - "placeholders": { - "date": {}, - "eventCount": {} - } - }, - "No Events Today!": "Vandaag geen gebeurtenissen!", - "@No Events Today!": { - "description": "Title displayed when there are no calendar events for the current day", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "It looks like a great day to rest, relax, and recharge.": "Dat lijkt een prima dag om lekker uit te rusten, te relaxen en de batterij op te laden.", - "@It looks like a great day to rest, relax, and recharge.": { - "description": "Message displayed when there are no calendar events for the current day", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading your student's calendar": "Er is een fout opgetreden bij het laden van de kalender van je cursist", - "@There was an error loading your student's calendar": { - "description": "Message displayed when calendar events could not be loaded for the current student", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Tap to favorite the courses you want to see on the Calendar. Select up to 10.": "Tik op de cursussen die je als favoriet in de kalender wilt zien. Tot maximaal 10 selecteren.", - "@Tap to favorite the courses you want to see on the Calendar. Select up to 10.": { - "description": "Description text on calendar filter screen.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You may only choose 10 calendars to display": "Je kan slecht 10 kalenders kiezen om te tonen", - "@You may only choose 10 calendars to display": { - "description": "Error text when trying to select more than 10 calendars", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You must select at least one calendar to display": "Je moet minimaal één kalender selecteren om te tonen", - "@You must select at least one calendar to display": { - "description": "Error text when trying to de-select all calendars", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Planner Note": "Planneraantekening", - "@Planner Note": { - "description": "Label used for notes in the planner", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Go to today": "Ga naar vandaag", - "@Go to today": { - "description": "Accessibility label used for the today button in the planner", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Previous Logins": "Eerdere aanmeldingen", - "@Previous Logins": { - "description": "Label for the list of previous user logins", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "canvasLogoLabel": "Canvas-logo", - "@canvasLogoLabel": { - "description": "The semantics label for the Canvas logo", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "findSchool": "School zoeken", - "@findSchool": { - "description": "Text for the find-my-school button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "findAnotherSchool": "Zoek een andere school", - "@findAnotherSchool": { - "description": "Text for the find-another-school button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "domainSearchInputHint": "Voer de naam van de school of onderwijskoepel in…", - "@domainSearchInputHint": { - "description": "Input hint for the text box on the domain search screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "noDomainResults": "Kan geen scholen vinden met \"{query}\"", - "@noDomainResults": { - "description": "Message shown to users when the domain search query did not return any results", - "type": "text", - "placeholders_order": [ - "query" - ], - "placeholders": { - "query": {} - } - }, - "domainSearchHelpLabel": "Hoe vind ik mijn school of district?", - "@domainSearchHelpLabel": { - "description": "Label for the help button on the domain search screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "canvasGuides": "Canvas-handleidingen", - "@canvasGuides": { - "description": "Proper name for the Canvas Guides. This will be used in the domainSearchHelpBody text and will be highlighted and clickable", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "canvasSupport": "Canvas-ondersteuning", - "@canvasSupport": { - "description": "Proper name for Canvas Support. This will be used in the domainSearchHelpBody text and will be highlighted and clickable", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "domainSearchHelpBody": "Zoek naar de gewenste naam van de school of onderwijskoepel, zoals “Spinozacollege” of “INNOVO”. Je kunt ook rechtstreeks een Canvas-domein invoeren, zoals “smith.instructure.com.”\n\nVoor meer informatie over het vinden van het Canvas-account van jouw instelling kun je de {canvasGuides} bezoeken, contact opnemen met {canvasSupport} of met je school zelf.", - "@domainSearchHelpBody": { - "description": "The body text shown in the help dialog on the domain search screen", - "type": "text", - "placeholders_order": [ - "canvasGuides", - "canvasSupport" - ], - "placeholders": { - "canvasGuides": {}, - "canvasSupport": {} - } - }, - "Uh oh!": "O nee!", - "@Uh oh!": { - "description": "Title of the screen that shows when a crash has occurred", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "We’re not sure what happened, but it wasn’t good. Contact us if this keeps happening.": "We weten niet precies wat er is gebeurd, maar goed is het niet. Neem contact met ons op als dit blijft gebeuren.", - "@We’re not sure what happened, but it wasn’t good. Contact us if this keeps happening.": { - "description": "Message shown when a crash has occurred", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Contact Support": "Contact opnemen met ondersteuning", - "@Contact Support": { - "description": "Label for the button that allows users to contact support after a crash has occurred", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "View error details": "Foutgegevens weergeven", - "@View error details": { - "description": "Label for the button that allowed users to view crash details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Restart app": "App opnieuw starten", - "@Restart app": { - "description": "Label for the button that will restart the entire application", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Application version": "Versie van toepassing", - "@Application version": { - "description": "Label for the application version displayed in the crash details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Device model": "Apparaatmodel", - "@Device model": { - "description": "Label for the device model displayed in the crash details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Android OS version": "Android OS-versie", - "@Android OS version": { - "description": "Label for the Android operating system version displayed in the crash details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Full error message": "Volledig foutbericht", - "@Full error message": { - "description": "Label for the full error message displayed in the crash details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Inbox": "Inbox", - "@Inbox": { - "description": "Title for the Inbox screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading your inbox messages.": "Er is een fout opgetreden bij het laden van je inboxberichten.", - "@There was an error loading your inbox messages.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Subject": "Geen onderwerp", - "@No Subject": { - "description": "Title used for inbox messages that have no subject", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unable to fetch courses. Please check your connection and try again.": "Cursussen kunnen niet worden opgehaald. Controleer je verbinding en probeer het opnieuw.", - "@Unable to fetch courses. Please check your connection and try again.": { - "description": "Message shown when an error occured while loading courses", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Choose a course to message": "Kies een cursus voor bericht", - "@Choose a course to message": { - "description": "Header in the course list shown when the user is choosing which course to associate with a new message", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Inbox Zero": "Inbox leeg", - "@Inbox Zero": { - "description": "Title of the message shown when there are no inbox messages", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You’re all caught up!": "Je bent helemaal bij!", - "@You’re all caught up!": { - "description": "Subtitle of the message shown when there are no inbox messages", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading recipients for this course": "Er is een fout opgetreden bij het laden van ontvangers voor deze cursus", - "@There was an error loading recipients for this course": { - "description": "Message shown when attempting to create a new message but the recipients list failed to load", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unable to send message. Check your connection and try again.": "Kan het bericht niet verzenden. Controleer je verbinding en probeer het opnieuw.", - "@Unable to send message. Check your connection and try again.": { - "description": "Message show when there was an error creating or sending a new message", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unsaved changes": "Niet-opgeslagen wijzigingen", - "@Unsaved changes": { - "description": "Title of the dialog shown when the user tries to leave with unsaved changes", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Are you sure you wish to close this page? Your unsent message will be lost.": "Weet je zeker dat je deze pagina wilt sluiten? Je niet-verzonden bericht gaat verloren.", - "@Are you sure you wish to close this page? Your unsent message will be lost.": { - "description": "Body text of the dialog shown when the user tries leave with unsaved changes", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "New message": "Nieuw bericht", - "@New message": { - "description": "Title of the new-message screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Add attachment": "Bijlage toevoegen", - "@Add attachment": { - "description": "Tooltip for the add-attachment button in the new-message screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Send message": "Bericht verzenden", - "@Send message": { - "description": "Tooltip for the send-message button in the new-message screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Select recipients": "Ontvangers selecteren", - "@Select recipients": { - "description": "Tooltip for the button that allows users to select message recipients", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No recipients selected": "Geen ontvangers geselecteerd", - "@No recipients selected": { - "description": "Hint displayed when the user has not selected any message recipients", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Message subject": "Onderwerp van bericht", - "@Message subject": { - "description": "Hint text displayed in the input field for the message subject", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Message": "Bericht", - "@Message": { - "description": "Hint text displayed in the input field for the message body", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Recipients": "Geadresseerden", - "@Recipients": { - "description": "Label for message recipients", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "plusRecipientCount": "+{count}", - "@plusRecipientCount": { - "description": "Shows the number of recipients that are selected but not displayed on screen.", - "type": "text", - "placeholders_order": [ - "count" - ], - "placeholders": { - "count": { - "example": 5 - } - } - }, - "Failed. Tap for options.": "Mislukt. Tik voor opties.", - "@Failed. Tap for options.": { - "description": "Short message shown on a message attachment when uploading has failed", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "courseForWhom": "voor {studentShortName}", - "@courseForWhom": { - "description": "Describes for whom a course is for (i.e. for Bill)", - "type": "text", - "placeholders_order": [ - "studentShortName" - ], - "placeholders": { - "studentShortName": {} - } - }, - "messageLinkPostscript": "Betreffende: {studentName}, {linkUrl}", - "@messageLinkPostscript": { - "description": "A postscript appended to new messages that clarifies which student is the subject of the message and also includes a URL for the related Canvas component (course, assignment, event, etc).", - "type": "text", - "placeholders_order": [ - "studentName", - "linkUrl" - ], - "placeholders": { - "studentName": {}, - "linkUrl": {} - } - }, - "There was an error loading this conversation": "Er is een fout opgetreden bij het laden van dit gesprek.", - "@There was an error loading this conversation": { - "description": "Message shown when a conversation fails to load", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Reply": "Reageren", - "@Reply": { - "description": "Button label for replying to a conversation", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Reply All": "Allen beantwoorden", - "@Reply All": { - "description": "Button label for replying to all conversation participants", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unknown User": "Onbekende gebruiker", - "@Unknown User": { - "description": "Label used where the user name is not known", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "me": "mij", - "@me": { - "description": "First-person pronoun (i.e. 'me') that will be used in message author info, e.g. 'Me to 4 others' or 'Jon Snow to me'", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "authorToRecipient": "{authorName} tot {recipientName}", - "@authorToRecipient": { - "description": "Author info for a single-recipient message; includes both the author name and the recipient name.", - "type": "text", - "placeholders_order": [ - "authorName", - "recipientName" - ], - "placeholders": { - "authorName": {}, - "recipientName": {} - } - }, - "authorToNOthers": "{howMany,plural, =1{{authorName} naar 1 andere}other{{authorName} naar {howMany} andere}}", - "@authorToNOthers": { - "description": "Author info for a mutli-recipient message; includes the author name and the number of recipients", - "type": "text", - "placeholders_order": [ - "authorName", - "howMany" - ], - "placeholders": { - "authorName": {}, - "howMany": {} - } - }, - "authorToRecipientAndNOthers": "{howMany,plural, =1{{authorName} naar {recipientName} en 1 andere}other{{authorName} naar {recipientName} en {howMany} andere}}", - "@authorToRecipientAndNOthers": { - "description": "Author info for a multi-recipient message; includes the author name, one recipient name, and the number of other recipients", - "type": "text", - "placeholders_order": [ - "authorName", - "recipientName", - "howMany" - ], - "placeholders": { - "authorName": {}, - "recipientName": {}, - "howMany": {} - } - }, - "Download": "Downloaden", - "@Download": { - "description": "Label for the button that will begin downloading a file", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Open with another app": "Openen met een andere app", - "@Open with another app": { - "description": "Label for the button that will allow users to open a file with another app", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There are no installed applications that can open this file": "Er zijn geen apps geïnstalleerd die dit bestand kunnen openen", - "@There are no installed applications that can open this file": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unsupported File": "Niet-ondersteund bestand", - "@Unsupported File": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "This file is unsupported and can’t be viewed through the app": "Dit bestand wordt niet ondersteund en kan niet via de app worden bekeken", - "@This file is unsupported and can’t be viewed through the app": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unable to play this media file": "Kan dit mediabestand niet afspelen", - "@Unable to play this media file": { - "description": "Message shown when audio or video media could not be played", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unable to load this image": "Kan deze afbeelding niet laden", - "@Unable to load this image": { - "description": "Message shown when an image file could not be loaded or displayed", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading this file": "Er is een fout opgetreden bij het laden van dit bestand", - "@There was an error loading this file": { - "description": "Message shown when a file could not be loaded or displayed", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Courses": "Geen cursussen", - "@No Courses": { - "description": "Title for having no courses", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Your student’s courses might not be published yet.": "De cursussen van je cursist zijn mogelijk nog niet gepubliceerd.", - "@Your student’s courses might not be published yet.": { - "description": "Message for having no courses", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading your student’s courses.": "Er is een fout opgetreden bij het laden van de cursussen van je cursist.", - "@There was an error loading your student’s courses.": { - "description": "Message displayed when the list of student courses could not be loaded", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Grade": "Geen cijfer", - "@No Grade": { - "description": "Message shown when there is currently no grade available for a course", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Filter by": "Filteren op", - "@Filter by": { - "description": "Title for list of terms to filter grades by", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Grades": "Cijfers", - "@Grades": { - "description": "Label for the \"Grades\" tab in course details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Syllabus": "Syllabus", - "@Syllabus": { - "description": "Label for the \"Syllabus\" tab in course details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Front Page": "Voorpagina", - "@Front Page": { - "description": "Label for the \"Front Page\" tab in course details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Summary": "Samenvatting", - "@Summary": { - "description": "Label for the \"Summary\" tab in course details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Send a message about this course": "Een bericht over deze cursus verzenden", - "@Send a message about this course": { - "description": "Accessibility hint for the course messaage floating action button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Total Grade": "Totaalcijfer", - "@Total Grade": { - "description": "Label for the total grade in the course", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Graded": "Beoordeeld", - "@Graded": { - "description": "Label for assignments that have been graded", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Submitted": "Ingeleverd", - "@Submitted": { - "description": "Label for assignments that have been submitted", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Not Submitted": "Niet ingediend", - "@Not Submitted": { - "description": "Label for assignments that have not been submitted", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Late": "Te laat", - "@Late": { - "description": "Label for assignments that have been marked late or submitted late", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Missing": "Ontbrekend", - "@Missing": { - "description": "Label for assignments that have been marked missing or are not submitted and past the due date", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "-": "-", - "@-": { - "description": "Value representing no score for student submission", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "All Grading Periods": "Alle beoordelingsperioden", - "@All Grading Periods": { - "description": "Label for selecting all grading periods", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Assignments": "Geen opdrachten", - "@No Assignments": { - "description": "Title for the no assignments message", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "It looks like assignments haven't been created in this space yet.": "Het lijkt erop dat er in deze ruimte nog geen opdrachten zijn gemaakt.", - "@It looks like assignments haven't been created in this space yet.": { - "description": "Message for no assignments", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading the summary details for this course.": "Er is een fout opgetreden bij het laden van de samenvatting van deze cursus.", - "@There was an error loading the summary details for this course.": { - "description": "Message shown when the course summary could not be loaded", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Summary": "Geen samenvatting", - "@No Summary": { - "description": "Title displayed when there are no items in the course summary", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "This course does not have any assignments or calendar events yet.": "Deze cursus heeft nog geen opdrachten of kalendergebeurtenissen.", - "@This course does not have any assignments or calendar events yet.": { - "description": "Message displayed when there are no items in the course summary", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "gradeFormatScoreOutOfPointsPossible": "{score} / {pointsPossible}", - "@gradeFormatScoreOutOfPointsPossible": { - "description": "Formatted string for a student score out of the points possible", - "type": "text", - "placeholders_order": [ - "score", - "pointsPossible" - ], - "placeholders": { - "score": {}, - "pointsPossible": {} - } - }, - "contentDescriptionScoreOutOfPointsPossible": "{score} van de {pointsPossible} punten", - "@contentDescriptionScoreOutOfPointsPossible": { - "description": "Formatted string for a student score out of the points possible", - "type": "text", - "placeholders_order": [ - "score", - "pointsPossible" - ], - "placeholders": { - "score": {}, - "pointsPossible": {} - } - }, - "gradesSubjectMessage": "Betreffende: {studentName}, cijfers", - "@gradesSubjectMessage": { - "description": "The subject line for a message to a teacher regarding a student's grades", - "type": "text", - "placeholders_order": [ - "studentName" - ], - "placeholders": { - "studentName": {} - } - }, - "syllabusSubjectMessage": "Betreffende: {studentName}, syllabus", - "@syllabusSubjectMessage": { - "description": "The subject line for a message to a teacher regarding a course syllabus", - "type": "text", - "placeholders_order": [ - "studentName" - ], - "placeholders": { - "studentName": {} - } - }, - "frontPageSubjectMessage": "Betreffende: {studentName}, voorpagina", - "@frontPageSubjectMessage": { - "description": "The subject line for a message to a teacher regarding a course front page", - "type": "text", - "placeholders_order": [ - "studentName" - ], - "placeholders": { - "studentName": {} - } - }, - "assignmentSubjectMessage": "Betreffende: {studentName}, opdracht - {assignmentName}", - "@assignmentSubjectMessage": { - "description": "The subject line for a message to a teacher regarding a student's assignment", - "type": "text", - "placeholders_order": [ - "studentName", - "assignmentName" - ], - "placeholders": { - "studentName": {}, - "assignmentName": {} - } - }, - "eventSubjectMessage": "Betreffende: {studentName}, gebeurtenis - {eventTitle}", - "@eventSubjectMessage": { - "description": "The subject line for a message to a teacher regarding a calendar event", - "type": "text", - "placeholders_order": [ - "studentName", - "eventTitle" - ], - "placeholders": { - "studentName": {}, - "eventTitle": {} - } - }, - "There is no page information available.": "Er is geen pagina-informatie beschikbaar.", - "@There is no page information available.": { - "description": "Description for when no page information is available", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Assignment Details": "Opdrachtdetails", - "@Assignment Details": { - "description": "Title for the page that shows details for an assignment", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "assignmentTotalPoints": "{points} punten", - "@assignmentTotalPoints": { - "description": "Label used for the total points the assignment is worth", - "type": "text", - "placeholders_order": [ - "points" - ], - "placeholders": { - "points": {} - } - }, - "assignmentTotalPointsAccessible": "{points} punten", - "@assignmentTotalPointsAccessible": { - "description": "Screen reader label used for the total points the assignment is worth", - "type": "text", - "placeholders_order": [ - "points" - ], - "placeholders": { - "points": {} - } - }, - "Due": "Inleverdatum", - "@Due": { - "description": "Label for an assignment due date", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Grade": "Cijfer", - "@Grade": { - "description": "Label for the section that displays an assignment's grade", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Locked": "Vergrendeld", - "@Locked": { - "description": "Label for when an assignment is locked", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "assignmentLockedModule": "Deze opdracht wordt vergrendeld door de module \"{moduleName}\".", - "@assignmentLockedModule": { - "description": "The locked description when an assignment is locked by a module", - "type": "text", - "placeholders_order": [ - "moduleName" - ], - "placeholders": { - "moduleName": {} - } - }, - "Remind Me": "Stuur me een herinnering", - "@Remind Me": { - "description": "Label for the row to set reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Set a date and time to be notified of this specific assignment.": "Stel een datum en tijd in waarop je een melding wilt krijgen voor deze specifieke opdracht.", - "@Set a date and time to be notified of this specific assignment.": { - "description": "Description for row to set reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You will be notified about this assignment on…": "Je krijgt een melding over deze opdracht op…", - "@You will be notified about this assignment on…": { - "description": "Description for when a reminder is set", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Instructions": "Instructies", - "@Instructions": { - "description": "Label for the description of the assignment when it has quiz instructions", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Send a message about this assignment": "Een bericht over deze opdracht verzenden", - "@Send a message about this assignment": { - "description": "Accessibility hint for the assignment messaage floating action button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "This app is not authorized for use.": "Deze app mag niet gebruikt worden.", - "@This app is not authorized for use.": { - "description": "The error shown when the app being used is not verified by Canvas", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The server you entered is not authorized for this app.": "De server die je hebt ingevoerd, is niet gemachtigd voor deze app.", - "@The server you entered is not authorized for this app.": { - "description": "The error shown when the desired login domain is not verified by Canvas", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The user agent for this app is not authorized.": "De gebruikersagent voor deze app heeft geen toestemming.", - "@The user agent for this app is not authorized.": { - "description": "The error shown when the user agent during verification is not verified by Canvas", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "We were unable to verify the server for use with this app.": "We konden niet verifiëren of de server geschikt is voor deze app.", - "@We were unable to verify the server for use with this app.": { - "description": "The generic error shown when we are unable to verify with Canvas", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Reminders": "Herinneringen", - "@Reminders": { - "description": "Name of the system notification channel for assignment and event reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Notifications for reminders about assignments and calendar events": "Meldingen voor herinneringen over opdrachten en kalendergebeurtenissen", - "@Notifications for reminders about assignments and calendar events": { - "description": "Description of the system notification channel for assignment and event reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Reminders have changed!": "Herinneringen zijn veranderd!", - "@Reminders have changed!": { - "description": "Title of the dialog shown when the user needs to update their reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "In order to provide you with a better experience, we have updated how reminders work. You can add new reminders by viewing an assignment or calendar event and tapping the switch under the \"Remind Me\" section.\n\nBe aware that any reminders created with older versions of this app will not be compatible with the new changes and you will need to create them again.": "Om je een betere gebruikerservaring te geven, hebben we de wijze waarop herinneringen functioneren bijgewerkt. Je kunt nieuwe herinneringen toevoegen door een opdracht of kalendergebeurtenis te bekijken en op de schakelaar te tikken onder de sectie \"Stuur me een herinnering\".\n\nHoud er rekening mee dat herinneringen die zijn gemaakt met oudere versies van deze app niet compatibel zijn met de nieuwe wijzigingen en je deze herinneringen opnieuw moet maken.", - "@In order to provide you with a better experience, we have updated how reminders work. You can add new reminders by viewing an assignment or calendar event and tapping the switch under the \"Remind Me\" section.\n\nBe aware that any reminders created with older versions of this app will not be compatible with the new changes and you will need to create them again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Not a parent?": "Geen ouder?", - "@Not a parent?": { - "description": "Title for the screen that shows when the user is not observing any students", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "We couldn't find any students associated with this account": "We kunnen geen cursist vinden die aan dit account gekoppeld is.", - "@We couldn't find any students associated with this account": { - "description": "Subtitle for the screen that shows when the user is not observing any students", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Are you a student or teacher?": "Ben je cursist of cursusleider?", - "@Are you a student or teacher?": { - "description": "Label for button that will show users the option to view other Canvas apps in the Play Store", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "One of our other apps might be a better fit. Tap one to visit the Play Store.": "Wellicht is een van onze andere apps hiervoor beter geschikt. Tik op een van de apps om de Play Store te openen.", - "@One of our other apps might be a better fit. Tap one to visit the Play Store.": { - "description": "Description of options to view other Canvas apps in the Play Store", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Return to Login": "Terug naar Aanmelden", - "@Return to Login": { - "description": "Label for the button that returns the user to the login screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "STUDENT": "CURSIST", - "@STUDENT": { - "description": "The \"student\" portion of the \"Canvas Student\" app name, in all caps. \"Canvas\" is excluded in this context as it will be displayed to the user as a wordmark image", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "TEACHER": "CURSUSLEIDER", - "@TEACHER": { - "description": "The \"teacher\" portion of the \"Canvas Teacher\" app name, in all caps. \"Canvas\" is excluded in this context as it will be displayed to the user as a wordmark image", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Canvas Student": "Canvas Student", - "@Canvas Student": { - "description": "The name of the Canvas Student app. Only \"Student\" should be translated as \"Canvas\" is a brand name in this context and should not be translated.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Canvas Teacher": "Canvas Teacher", - "@Canvas Teacher": { - "description": "The name of the Canvas Teacher app. Only \"Teacher\" should be translated as \"Canvas\" is a brand name in this context and should not be translated.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Alerts": "Geen waarschuwingen", - "@No Alerts": { - "description": "The title for the empty message to show to users when there are no alerts for the student.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There’s nothing to be notified of yet.": "Er is nog niets om te melden.", - "@There’s nothing to be notified of yet.": { - "description": "The empty message to show to users when there are no alerts for the student.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "dismissAlertLabel": "{alertTitle} afwijzen", - "@dismissAlertLabel": { - "description": "Accessibility label to dismiss an alert", - "type": "text", - "placeholders_order": [ - "alertTitle" - ], - "placeholders": { - "alertTitle": {} - } - }, - "Course Announcement": "Cursusaankondiging", - "@Course Announcement": { - "description": "Title for alerts when there is a course announcement", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Institution Announcement": "Aankondiging organisatie", - "@Institution Announcement": { - "description": "Title for alerts when there is an institution announcement", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "assignmentGradeAboveThreshold": "Opdrachtcijfer hoger dan {threshold}", - "@assignmentGradeAboveThreshold": { - "description": "Title for alerts when an assignment grade is above the threshold value", - "type": "text", - "placeholders_order": [ - "threshold" - ], - "placeholders": { - "threshold": {} - } - }, - "assignmentGradeBelowThreshold": "Opdrachtcijfer lager dan {threshold}", - "@assignmentGradeBelowThreshold": { - "description": "Title for alerts when an assignment grade is below the threshold value", - "type": "text", - "placeholders_order": [ - "threshold" - ], - "placeholders": { - "threshold": {} - } - }, - "courseGradeAboveThreshold": "Cursuscijfer hoger dan {threshold}", - "@courseGradeAboveThreshold": { - "description": "Title for alerts when a course grade is above the threshold value", - "type": "text", - "placeholders_order": [ - "threshold" - ], - "placeholders": { - "threshold": {} - } - }, - "courseGradeBelowThreshold": "Cursuscijfer lager dan {threshold}", - "@courseGradeBelowThreshold": { - "description": "Title for alerts when a course grade is below the threshold value", - "type": "text", - "placeholders_order": [ - "threshold" - ], - "placeholders": { - "threshold": {} - } - }, - "Settings": "Instellingen", - "@Settings": { - "description": "Title for the settings screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Theme": "Thema", - "@Theme": { - "description": "Label for the light/dark theme section in the settings page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Dark Mode": "Donkere modus", - "@Dark Mode": { - "description": "Label for the button that enables dark mode", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Light Mode": "Lichte modus", - "@Light Mode": { - "description": "Label for the button that enables light mode", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "High Contrast Mode": "Modus hoog contrast", - "@High Contrast Mode": { - "description": "Label for the switch that toggles high contrast mode", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Use Dark Theme in Web Content": "Donker thema gebruiken voor webcontent", - "@Use Dark Theme in Web Content": { - "description": "Label for the switch that toggles dark mode for webviews", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Appearance": "Uiterlijk", - "@Appearance": { - "description": "Label for the appearance section in the settings page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Successfully submitted!": "Inlevering is gelukt!", - "@Successfully submitted!": { - "description": "Title displayed in the grade cell for an assignment that has been submitted", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "submissionStatusSuccessSubtitle": "Deze opdracht werd ingeleverd op {date} om {time} en wacht op beoordeling", - "@submissionStatusSuccessSubtitle": { - "description": "Subtitle displayed in the grade cell for an assignment that has been submitted and is awaiting a grade", - "type": "text", - "placeholders_order": [ - "date", - "time" - ], - "placeholders": { - "date": {}, - "time": {} - } - }, - "outOfPoints": "{howMany,plural, =1{Van 1 punt}other{Van {points} punten}}", - "@outOfPoints": { - "description": "Description for an assignment grade that has points without a current scoroe", - "type": "text", - "placeholders_order": [ - "points", - "howMany" - ], - "placeholders": { - "points": {}, - "howMany": {} - } - }, - "Excused": "Vrijgesteld", - "@Excused": { - "description": "Grading status for an assignment marked as excused", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Complete": "Voltooid", - "@Complete": { - "description": "Grading status for an assignment marked as complete", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Incomplete": "Onvoltooid", - "@Incomplete": { - "description": "Grading status for an assignment marked as incomplete", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "minus": "minus", - "@minus": { - "description": "Screen reader-friendly replacement for the \"-\" character in letter grades like \"A-\"", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "latePenalty": "Sanctie indien te laat (-{pointsLost})", - "@latePenalty": { - "description": "Text displayed when a late penalty has been applied to the assignment", - "type": "text", - "placeholders_order": [ - "pointsLost" - ], - "placeholders": { - "pointsLost": {} - } - }, - "finalGrade": "Eindcijfer: {grade}", - "@finalGrade": { - "description": "Text that displays the final grade of an assignment", - "type": "text", - "placeholders_order": [ - "grade" - ], - "placeholders": { - "grade": {} - } - }, - "Alert Settings": "Waarschuwingsinstellingen", - "@Alert Settings": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Alert me when…": "Waarschuw me als...", - "@Alert me when…": { - "description": "Header for the screen where the observer chooses the thresholds that will determine when they receive alerts (e.g. when an assignment is graded below 70%)", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Course grade below": "Cursuscijfer lager dan", - "@Course grade below": { - "description": "Label describing the threshold for when the course grade is below a certain percentage", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Course grade above": "Cursuscijfer hoger dan", - "@Course grade above": { - "description": "Label describing the threshold for when the course grade is above a certain percentage", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Assignment missing": "Opdracht ontbreekt", - "@Assignment missing": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Assignment grade below": "Opdrachtcijfer lager dan", - "@Assignment grade below": { - "description": "Label describing the threshold for when an assignment is graded below a certain percentage", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Assignment grade above": "Opdrachtcijfer hoger dan", - "@Assignment grade above": { - "description": "Label describing the threshold for when an assignment is graded above a certain percentage", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Course Announcements": "Cursusaankondigingen", - "@Course Announcements": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Institution Announcements": "Aankondigingen van instituut", - "@Institution Announcements": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Never": "Nooit", - "@Never": { - "description": "Indication that tells the user they will not receive alert notifications of a specific kind", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Grade percentage": "Cijferpercentage", - "@Grade percentage": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading your student's alerts.": "Er is een fout opgetreden bij het laden van de waarschuwingen van je cursist.", - "@There was an error loading your student's alerts.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Must be below 100": "Moet lager zijn dan 100", - "@Must be below 100": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "mustBeBelowN": "Moet lager zijn dan {percentage}", - "@mustBeBelowN": { - "description": "Validation error to the user that they must choose a percentage below 'n'", - "type": "text", - "placeholders_order": [ - "percentage" - ], - "placeholders": { - "percentage": { - "example": 5 - } - } - }, - "mustBeAboveN": "Moet hoger zijn dan {percentage}", - "@mustBeAboveN": { - "description": "Validation error to the user that they must choose a percentage above 'n'", - "type": "text", - "placeholders_order": [ - "percentage" - ], - "placeholders": { - "percentage": { - "example": 5 - } - } - }, - "Select Student Color": "Cursistkleur selecteren", - "@Select Student Color": { - "description": "Title for screen that allows users to assign a color to a specific student", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Electric, blue": "Elektrisch, blauw", - "@Electric, blue": { - "description": "Name of the Electric (blue) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Plum, Purple": "Pruim, paars", - "@Plum, Purple": { - "description": "Name of the Plum (purple) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Barney, Fuschia": "Barney, fuchsia", - "@Barney, Fuschia": { - "description": "Name of the Barney (fuschia) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Raspberry, Red": "Framboos, rood", - "@Raspberry, Red": { - "description": "Name of the Raspberry (red) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Fire, Orange": "Vuur, oranje", - "@Fire, Orange": { - "description": "Name of the Fire (orange) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Shamrock, Green": "Klaver, groen", - "@Shamrock, Green": { - "description": "Name of the Shamrock (green) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "An error occurred while saving your selection. Please try again.": "Er is een fout opgetreden tijdens het opslaan van je selectie. Probeer het opnieuw.", - "@An error occurred while saving your selection. Please try again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "changeStudentColorLabel": "Kleur wijzigen voor {studentName}", - "@changeStudentColorLabel": { - "description": "Accessibility label for the button that lets users change the color associated with a specific student", - "type": "text", - "placeholders_order": [ - "studentName" - ], - "placeholders": { - "studentName": {} - } - }, - "Teacher": "Docent", - "@Teacher": { - "description": "Label for the Teacher enrollment type", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Student": "Cursist", - "@Student": { - "description": "Label for the Student enrollment type", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "TA": "Onderwijsassistent", - "@TA": { - "description": "Label for the Teaching Assistant enrollment type (also known as Teacher Aid or Education Assistant), reduced to a short acronym/initialism if appropriate.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Observer": "Waarnemer", - "@Observer": { - "description": "Label for the Observer enrollment type", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Use Camera": "Camera gebruiken", - "@Use Camera": { - "description": "Label for the action item that lets the user capture a photo using the device camera", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Upload File": "Bestand uploaden", - "@Upload File": { - "description": "Label for the action item that lets the user upload a file from their device", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Choose from Gallery": "Kies uit galerij", - "@Choose from Gallery": { - "description": "Label for the action item that lets the user select a photo from their device gallery", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Preparing…": "Wordt voorbereid", - "@Preparing…": { - "description": "Message shown while a file is being prepared to attach to a message", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Add student with…": "Cursist toevoegen met…", - "@Add student with…": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Add Student": "Cursist toevoegen", - "@Add Student": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You are not observing any students.": "Je observeert geen cursisten.", - "@You are not observing any students.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading your students.": "Er is een probleem opgetreden bij het laden van je cursisten.", - "@There was an error loading your students.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Pairing Code": "Koppelingscode", - "@Pairing Code": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Students can obtain a pairing code through the Canvas website": "Cursisten kunnen een koppelingscode ophalen via de Canvas-website.", - "@Students can obtain a pairing code through the Canvas website": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Enter the student pairing code provided to you. If the pairing code doesn't work, it may have expired": "Voer de koppelingscode cursist in die je gekregen hebt. Als de koppelingscode niet werkt, is deze mogelijk verlopen", - "@Enter the student pairing code provided to you. If the pairing code doesn't work, it may have expired": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Your code is incorrect or expired.": "Je code is onjuist of verlopen.", - "@Your code is incorrect or expired.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Something went wrong trying to create your account, please reach out to your school for assistance.": "Er is iets mis gegaan bij het aanmaken van je account. Neem voor hulp contact op met je school.", - "@Something went wrong trying to create your account, please reach out to your school for assistance.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "QR Code": "QR-code", - "@QR Code": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Students can create a QR code using the Canvas Student app on their mobile device": "Cursisten kunnen een QR-code maken met behulp van de Canvas Student-app op hun mobiele apparaat", - "@Students can create a QR code using the Canvas Student app on their mobile device": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Add new student": "Nieuwe cursist toevoegen", - "@Add new student": { - "description": "Semantics label for the FAB on the Manage Students Screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Select": "Selecteren", - "@Select": { - "description": "Hint text to tell the user to choose one of two options", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I have a Canvas account": "Ik heb een Canvas-account", - "@I have a Canvas account": { - "description": "Option to select for users that have a canvas account", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I don't have a Canvas account": "Ik heb geen Canvas-account", - "@I don't have a Canvas account": { - "description": "Option to select for users that don't have a canvas account", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Create Account": "Account maken", - "@Create Account": { - "description": "Button text for account creation confirmation", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Full Name": "Volledige naam", - "@Full Name": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Email Address": "E-mailadres", - "@Email Address": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Password": "Wachtwoord", - "@Password": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Full Name…": "Volledige naam...", - "@Full Name…": { - "description": "hint label for inside form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Email…": "E-mail...", - "@Email…": { - "description": "hint label for inside form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Password…": "Wachtwoord...", - "@Password…": { - "description": "hint label for inside form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Please enter full name": "Voer volledige naam in", - "@Please enter full name": { - "description": "Error message for form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Please enter an email address": "Voer een e-mailadres in", - "@Please enter an email address": { - "description": "Error message for form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Please enter a valid email address": "Voer een geldig e-mailadres in", - "@Please enter a valid email address": { - "description": "Error message for form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Password is required": "Wachtwoord is vereist", - "@Password is required": { - "description": "Error message for form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Password must contain at least 8 characters": "Wachtwoord moet minstens 8 tekens bevatten.", - "@Password must contain at least 8 characters": { - "description": "Error message for form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "qrCreateAccountTos": "Door op 'Account maken’ te tikken ga je akkoord met de {termsOfService} en accepteer je het {privacyPolicy}", - "@qrCreateAccountTos": { - "description": "The text show on the account creation screen", - "type": "text", - "placeholders_order": [ - "termsOfService", - "privacyPolicy" - ], - "placeholders": { - "termsOfService": {}, - "privacyPolicy": {} - } - }, - "Terms of Service": "Servicevoorwaarden", - "@Terms of Service": { - "description": "Label for the Canvas Terms of Service agreement. This will be used in the qrCreateAccountTos text and will be highlighted and clickable", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Privacy Policy": "Privacybeleid", - "@Privacy Policy": { - "description": "Label for the Canvas Privacy Policy agreement. This will be used in the qrCreateAccountTos text and will be highlighted and clickable", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "View the Privacy Policy": "Privacybeleid weergeven", - "@View the Privacy Policy": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Already have an account? ": "Heb je al een account? ", - "@Already have an account? ": { - "description": "Part of multiline text span, includes AccountSignIn1-2, in that order", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Sign In": "Aanmelden", - "@Sign In": { - "description": "Part of multiline text span, includes AccountSignIn1-2, in that order", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Hide Password": "Wachtwoord verbergen", - "@Hide Password": { - "description": "content description for password hide button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Show Password": "Wachtwoord weergeven", - "@Show Password": { - "description": "content description for password show button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Terms of Service Link": "Link naar Servicevoorwaarden", - "@Terms of Service Link": { - "description": "content description for terms of service link", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Privacy Policy Link": "Link naar Privacybeleid", - "@Privacy Policy Link": { - "description": "content description for privacy policy link", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Event": "Gebeurtenis", - "@Event": { - "description": "Title for the event details screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Date": "Datum", - "@Date": { - "description": "Label for the event date", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Location": "Locatie", - "@Location": { - "description": "Label for the location information", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Location Specified": "Geen locatie opgegeven", - "@No Location Specified": { - "description": "Description for events that do not have a location", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "eventTime": "{startAt} - {endAt}", - "@eventTime": { - "description": "The time the event is happening, example: \"2:00 pm - 4:00 pm\"", - "type": "text", - "placeholders_order": [ - "startAt", - "endAt" - ], - "placeholders": { - "startAt": {}, - "endAt": {} - } - }, - "Set a date and time to be notified of this event.": "Stel een datum en tijd in waarop je een melding wilt krijgen voor deze gebeurtenis.", - "@Set a date and time to be notified of this event.": { - "description": "Description for row to set event reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You will be notified about this event on…": "Je krijgt een melding over deze gebeurtenis op…", - "@You will be notified about this event on…": { - "description": "Description for when an event reminder is set", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Share Your Love for the App": "Laat weten hoe goed je de App vindt", - "@Share Your Love for the App": { - "description": "Label for option to open the app store", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Tell us about your favorite parts of the app": "Laat ons weten wat jouw favoriete onderdelen van de app zijn", - "@Tell us about your favorite parts of the app": { - "description": "Description for option to open the app store", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Legal": "Juridisch", - "@Legal": { - "description": "Label for legal information option", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Privacy policy, terms of use, open source": "Privacybeleid, gebruiksvoor", - "@Privacy policy, terms of use, open source": { - "description": "Description for legal information option", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Idea for Canvas Parent App [Android]": "Idee voor Canvas Parent App [Android]", - "@Idea for Canvas Parent App [Android]": { - "description": "The subject for the email to request a feature", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The following information will help us better understand your idea:": "De volgende informatie helpt ons een beter idee te krijgen van jouw idee:", - "@The following information will help us better understand your idea:": { - "description": "The header for the users information that is attached to a feature request", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Domain:": "Domein:", - "@Domain:": { - "description": "The label for the Canvas domain of the logged in user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "User ID:": "Gebruikers-ID:", - "@User ID:": { - "description": "The label for the Canvas user ID of the logged in user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Email:": "E-mail:", - "@Email:": { - "description": "The label for the eamil of the logged in user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Locale:": "Landinstellingen:", - "@Locale:": { - "description": "The label for the locale of the logged in user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Terms of Use": "Gebruiksvoorwaarden", - "@Terms of Use": { - "description": "Label for the terms of use", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Canvas on GitHub": "Canvas op GitHub", - "@Canvas on GitHub": { - "description": "Label for the button that opens the Canvas project on GitHub's website", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was a problem loading the Terms of Use": "Er is een probleem met het laden van de gebruiksvoorwaarden", - "@There was a problem loading the Terms of Use": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Device": "Apparaat", - "@Device": { - "description": "Label used for device manufacturer/model in the error report", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "OS Version": "OS Versie", - "@OS Version": { - "description": "Label used for device operating system version in the error report", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Version Number": "Versienummer", - "@Version Number": { - "description": "Label used for the app version number in the error report", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Report A Problem": "Een probleem melden", - "@Report A Problem": { - "description": "Title used for generic dialog to report problems", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Subject": "Onderwerp", - "@Subject": { - "description": "Label used for Subject text field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "A subject is required.": "Er is een onderwerp vereist", - "@A subject is required.": { - "description": "Error shown when the subject field is empty", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "An email address is required.": "Er is een e-mailadres vereist.", - "@An email address is required.": { - "description": "Error shown when the email field is empty", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Description": "Beschrijving", - "@Description": { - "description": "Label used for Description text field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "A description is required.": "Er is een beschrijving vereist.", - "@A description is required.": { - "description": "Error shown when the description field is empty", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "How is this affecting you?": "Wat voor gevolgen heeft dit voor jou?", - "@How is this affecting you?": { - "description": "Label used for the dropdown to select how severe the issue is", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "send": "verzenden", - "@send": { - "description": "Label used for send button when reporting a problem", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Just a casual question, comment, idea, suggestion…": "Gewoon een informele vraag, opmerking, idee of suggestie...", - "@Just a casual question, comment, idea, suggestion…": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I need some help but it's not urgent.": "Ik heb hulp nodig, maar het is niet dringend.", - "@I need some help but it's not urgent.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Something's broken but I can work around it to get what I need done.": "Er is iets gebroken, maar daar kan ik wel omheen werken om gedaan te krijgen wat ik wil.", - "@Something's broken but I can work around it to get what I need done.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I can't get things done until I hear back from you.": "Ik kan pas iets voor je doen als je me antwoordt.", - "@I can't get things done until I hear back from you.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "EXTREME CRITICAL EMERGENCY!!": "ER IS EEN PROBLEEM, GRAAG DRINGEND HULP!", - "@EXTREME CRITICAL EMERGENCY!!": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Not Graded": "Niet beoordeeld", - "@Not Graded": { - "description": "Description for an assignment has not been graded.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Login flow: Normal": "Aanmeldingsstroom: Normaal", - "@Login flow: Normal": { - "description": "Description for the normal login flow", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Login flow: Canvas": "Aanmeldingsstroom: Canvas", - "@Login flow: Canvas": { - "description": "Description for the Canvas login flow", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Login flow: Site Admin": "Aanmeldingsstroom: Sitebeheerder", - "@Login flow: Site Admin": { - "description": "Description for the Site Admin login flow", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Login flow: Skip mobile verify": "Aanmeldingsstroom: Mobiel verifiëren overslaan", - "@Login flow: Skip mobile verify": { - "description": "Description for the login flow that skips domain verification for mobile", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Act As User": "Optreden als gebruiker", - "@Act As User": { - "description": "Label for the button that allows the user to act (masquerade) as another user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Stop Acting as User": "Stop met optreden als gebruiker", - "@Stop Acting as User": { - "description": "Label for the button that allows the user to stop acting (masquerading) as another user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "actingAsUser": "Je treedt op als {userName}", - "@actingAsUser": { - "description": "Message shown while acting (masquerading) as another user", - "type": "text", - "placeholders_order": [ - "userName" - ], - "placeholders": { - "userName": {} - } - }, - "\"Act as\" is essentially logging in as this user without a password. You will be able to take any action as if you were this user, and from other users' points of views, it will be as if this user performed them. However, audit logs record that you were the one who performed the actions on behalf of this user.": "\"Optreden als\" is in essentie hetzelfde als aanmelden als deze gebruiker zonder wachtwoord. Je kunt alle acties uitvoeren alsof je die gebruiker bent. Gezien vanuit andere gebruikers lijkt het dan ook alsof die acties door die gebruiker zijn uitgevoerd. De controleogboeken laten echter zien dat jij degene was die namens deze gebruiker die acties verricht hebt.", - "@\"Act as\" is essentially logging in as this user without a password. You will be able to take any action as if you were this user, and from other users' points of views, it will be as if this user performed them. However, audit logs record that you were the one who performed the actions on behalf of this user.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Domain": "Domein", - "@Domain": { - "description": "Text field hint for domain url input", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You must enter a valid domain": "Je moet een geldig domein invoeren", - "@You must enter a valid domain": { - "description": "Message displayed for domain input error", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "User ID": "Gebruikers-ID", - "@User ID": { - "description": "Text field hint for user ID input", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You must enter a user id": "Je moet een gebruikers-ID invoeren", - "@You must enter a user id": { - "description": "Message displayed for user Id input error", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error trying to act as this user. Please check the Domain and User ID and try again.": "Er is een fout opgetreden bij het optreden als deze gebruiker. Controleer het domein en de gebruikers-ID en probeer het opnieuw.", - "@There was an error trying to act as this user. Please check the Domain and User ID and try again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "endMasqueradeMessage": "Je stopt met optreden als {userName} en keert terug naar je oorspronkelijke account.", - "@endMasqueradeMessage": { - "description": "Confirmation message displayed when the user wants to stop acting (masquerading) as another user", - "type": "text", - "placeholders_order": [ - "userName" - ], - "placeholders": { - "userName": {} - } - }, - "endMasqueradeLogoutMessage": "Je stopt met optreden als {userName} en je wordt afgemeld.", - "@endMasqueradeLogoutMessage": { - "description": "Confirmation message displayed when the user wants to stop acting (masquerading) as another user and will be logged out.", - "type": "text", - "placeholders_order": [ - "userName" - ], - "placeholders": { - "userName": {} - } - }, - "How are we doing?": "Hoe gaat het?", - "@How are we doing?": { - "description": "Title for dialog asking user to rate the app out of 5 stars.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Don't show again": "Niet nogmaals tonen", - "@Don't show again": { - "description": "Button to prevent the rating dialog from showing again.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "What can we do better?": "Wat kunnen we beter doen?", - "@What can we do better?": { - "description": "Hint text for providing a comment with the rating.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Send Feedback": "Feedback versturen", - "@Send Feedback": { - "description": "Button to send rating with feedback", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "ratingDialogEmailSubject": "Suggesties voor Android - Canvas Parent {version}", - "@ratingDialogEmailSubject": { - "description": "The subject for an email to provide feedback for CanvasParent.", - "type": "text", - "placeholders_order": [ - "version" - ], - "placeholders": { - "version": {} - } - }, - "starRating": "{position,plural, =1{{position} ster}other{{position} sterren}}", - "@starRating": { - "description": "Accessibility label for the 1 stars to 5 stars rating", - "type": "text", - "placeholders_order": [ - "position" - ], - "placeholders": { - "position": { - "example": 1 - } - } - }, - "Student Pairing": "Cursistkoppeling", - "@Student Pairing": { - "description": "Title for the screen where users can pair to students using a QR code", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Open Canvas Student": "Canvas Student openen", - "@Open Canvas Student": { - "description": "Title for QR pairing tutorial screen instructing users to open the Canvas Student app", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You'll need to open your student's Canvas Student app to continue. Go into Main Menu > Settings > Pair with Observer and scan the QR code you see there.": "Je moet de Canvas Student-app van je cursist openen om door te kunnen gaan. Ga naar Hoofdmenu > Instellingen > Koppelen met waarnemer en scan de QR-code die je daar ziet.", - "@You'll need to open your student's Canvas Student app to continue. Go into Main Menu > Settings > Pair with Observer and scan the QR code you see there.": { - "description": "Message explaining how QR code pairing works", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Screenshot showing location of pairing QR code generation in the Canvas Student app": "Schermafbeelding die de locatie toont waar de QR-code voor de koppeling in de Canvas Student-app wordt gegenereerd", - "@Screenshot showing location of pairing QR code generation in the Canvas Student app": { - "description": "Content Description for qr pairing tutorial screenshot", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Expired QR Code": "Verlopen QR-code", - "@Expired QR Code": { - "description": "Error title shown when the users scans a QR code that has expired", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The QR code you scanned may have expired. Refresh the code on the student's device and try again.": "De QR-code die je hebt gescand is wellicht verlopen. Ververs de code op het apparaat van de cursist en probeer het opnieuw.", - "@The QR code you scanned may have expired. Refresh the code on the student's device and try again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "A network error occurred when adding this student. Check your connection and try again.": "Er is een netwerkfout opgetreden bij het toevoegen van deze cursist. Controleer je verbinding en probeer het opnieuw.", - "@A network error occurred when adding this student. Check your connection and try again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Invalid QR Code": "Ongeldige QR-code", - "@Invalid QR Code": { - "description": "Error title shown when the user scans an invalid QR code", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Incorrect Domain": "Verkeerd domein", - "@Incorrect Domain": { - "description": "Error title shown when the users scane a QR code for a student that belongs to a different domain", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The student you are trying to add belongs to a different school. Log in or create an account with that school to scan this code.": "De cursist die je probeert toe te voegen behoort tot een andere school. Log in of maak een account aan bij die school om deze code te scannen.", - "@The student you are trying to add belongs to a different school. Log in or create an account with that school to scan this code.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Camera Permission": "Cameramachtiging", - "@Camera Permission": { - "description": "Error title shown when the user wans to scan a QR code but has denied the camera permission", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "This will unpair and remove all enrollments for this student from your account.": "Dit zal alle inschrijvingen voor deze cursist van jouw account ontkoppelen en verwijderen.", - "@This will unpair and remove all enrollments for this student from your account.": { - "description": "Confirmation message shown when the user tries to delete a student from their account", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was a problem removing this student from your account. Please check your connection and try again.": "Er is een probleem met het verwijderen van deze cursist uit je account. Controleer je verbinding en probeer het opnieuw.", - "@There was a problem removing this student from your account. Please check your connection and try again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Cancel": "Annuleren", - "@Cancel": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "next": "Volgende", - "@next": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "ok": "OK", - "@ok": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Yes": "Ja", - "@Yes": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No": "Nee", - "@No": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Retry": "Opnieuw proberen", - "@Retry": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Delete": "Verwijderen", - "@Delete": { - "description": "Label used for general delete/remove actions", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Done": "Gereed", - "@Done": { - "description": "Label for general done/finished actions", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Refresh": "Vernieuwen", - "@Refresh": { - "description": "Label for button to refresh data from the web", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "View Description": "Beschrijving bekijken", - "@View Description": { - "description": "Button to view the description for an event or assignment", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "expanded": "uitgevouwen", - "@expanded": { - "description": "Description for the accessibility reader for list groups that are expanded", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "collapsed": "samengevouwen", - "@collapsed": { - "description": "Description for the accessibility reader for list groups that are expanded", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "An unexpected error occurred": "Er heeft zich een onverwachte fout voorgedaan", - "@An unexpected error occurred": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No description": "Geen beschrijving", - "@No description": { - "description": "Message used when the assignment has no description", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Launch External Tool": "Extern hulpmiddel lanceren", - "@Launch External Tool": { - "description": "Button text added to webviews to let users open external tools in their browser", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Interactions on this page are limited by your institution.": "Interacties op deze pagina zijn beperkt door je organisatie.", - "@Interactions on this page are limited by your institution.": { - "description": "Message describing how the webview has limited access due to an instution setting", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "dateAtTime": "{date} om {time}", - "@dateAtTime": { - "description": "The string to format dates", - "type": "text", - "placeholders_order": [ - "date", - "time" - ], - "placeholders": { - "date": {}, - "time": {} - } - }, - "dueDateAtTime": "In te leveren op {date} om {time}", - "@dueDateAtTime": { - "description": "The string to format due dates", - "type": "text", - "placeholders_order": [ - "date", - "time" - ], - "placeholders": { - "date": {}, - "time": {} - } - }, - "No Due Date": "Geen inleverdatum", - "@No Due Date": { - "description": "Label for assignments that do not have a due date", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Filter": "Filter", - "@Filter": { - "description": "Label for buttons to filter what items are visible", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "unread": "ongelezen", - "@unread": { - "description": "Label for things that are marked as unread", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "unreadCount": "{count} ongelezen", - "@unreadCount": { - "description": "Formatted string for when there are a number of unread items", - "type": "text", - "placeholders_order": [ - "count" - ], - "placeholders": { - "count": {} - } - }, - "badgeNumberPlus": "{count}+", - "@badgeNumberPlus": { - "description": "Formatted string for when too many items are being notified in a badge, generally something like: 99+", - "type": "text", - "placeholders_order": [ - "count" - ], - "placeholders": { - "count": {} - } - }, - "There was an error loading this announcement": "Er is een fout opgetreden bij het laden van deze aankondiging", - "@There was an error loading this announcement": { - "description": "Message shown when an announcement detail screen fails to load", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Network error": "Netwerkfout", - "@Network error": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Under Construction": "In aanbouw", - "@Under Construction": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "We are currently building this feature for your viewing pleasure.": "We werken momenteel aan deze functie om de weergave te verbeteren.", - "@We are currently building this feature for your viewing pleasure.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Request Login Help Button": "Knop Help bij inloggen aanvragen", - "@Request Login Help Button": { - "description": "Accessibility hint for button that opens help dialog for a login help request", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Request Login Help": "Help bij inloggen aanvragen", - "@Request Login Help": { - "description": "Title of help dialog for a login help request", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I'm having trouble logging in": "Ik ondervind problemen met inloggen", - "@I'm having trouble logging in": { - "description": "Subject of help dialog for a login help request", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "An error occurred when trying to display this link": "Er is een fout opgetreden bij het weergeven van deze van link.", - "@An error occurred when trying to display this link": { - "description": "Error message shown when a link can't be opened", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "We are unable to display this link, it may belong to an institution you currently aren't logged in to.": "We kunnen deze link niet weergeven omdat de link wellicht van een organisatie is waarbij je momenteel niet bent aangemeld.", - "@We are unable to display this link, it may belong to an institution you currently aren't logged in to.": { - "description": "Description for error page shown when clicking a link", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Link Error": "Fout met link", - "@Link Error": { - "description": "Title for error page shown when clicking a link", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Open In Browser": "Openen in browser", - "@Open In Browser": { - "description": "Text for button to open a link in the browswer", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You'll find the QR code on the web in your account profile. Click 'QR for Mobile Login' in the list.": "Je vindt de QR-code op het web in je accountprofiel. Klik op 'QR voor mobiel inloggen' in de lijst.", - "@You'll find the QR code on the web in your account profile. Click 'QR for Mobile Login' in the list.": { - "description": "Text for qr login tutorial screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Locate QR Code": "QR-code zoeken", - "@Locate QR Code": { - "description": "Text for qr login button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Please scan a QR code generated by Canvas": "Scan een door Canvas gegenereerde QR-code", - "@Please scan a QR code generated by Canvas": { - "description": "Text for qr login error with incorrect qr code", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error logging in. Please generate another QR Code and try again.": "Er is een fout opgetreden bij het aanmelden. Genereer een andere QR-code en probeer het opnieuw.", - "@There was an error logging in. Please generate another QR Code and try again.": { - "description": "Text for qr login error", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Screenshot showing location of QR code generation in browser": "Screenshot met locatie van het genereren van een QR-code in een browser", - "@Screenshot showing location of QR code generation in browser": { - "description": "Content Description for qr login tutorial screenshot", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "QR scanning requires camera access": "Scannen van QR-code vereist toegang tot camera", - "@QR scanning requires camera access": { - "description": "placeholder for camera error for QR code scan", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The linked item is no longer available": "Het gelinkte item is niet langer beschikbaar", - "@The linked item is no longer available": { - "description": "error message when the alert could no be opened", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Message sent": "Bericht verzonden", - "@Message sent": { - "description": "confirmation message on the screen when the user succesfully sends a message", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Acceptable Use Policy": "Beleid voor acceptabel gebruik", - "@Acceptable Use Policy": { - "description": "title for the acceptable use policy screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Submit": "Indienen", - "@Submit": { - "description": "submit button title for acceptable use policy screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Either you're a new user or the Acceptable Use Policy has changed since you last agreed to it. Please agree to the Acceptable Use Policy before you continue.": "Je bent een nieuwe gebruiker of het Beleid voor acceptabel gebruik is gewijzigd sinds je er de laatste keer mee akkoord bent gegaan. Ga akkoord met het Beleid voor acceptabel gebruik voordat je verdergaat.", - "@Either you're a new user or the Acceptable Use Policy has changed since you last agreed to it. Please agree to the Acceptable Use Policy before you continue.": { - "description": "acceptable use policy screen description", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I agree to the Acceptable Use Policy.": "Ik ga akkoord met het Beleid voor acceptabel gebruik.", - "@I agree to the Acceptable Use Policy.": { - "description": "acceptable use policy switch title", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "About": "Over", - "@About": { - "description": "Title for about menu item in settings", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "App": "App", - "@App": { - "description": "Title for App field on about page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Login ID": "Aanmeldings-ID", - "@Login ID": { - "description": "Title for Login ID field on about page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Email": "E-mail", - "@Email": { - "description": "Title for Email field on about page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Version": "Versie", - "@Version": { - "description": "Title for Version field on about page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Instructure logo": "Logo Instructure", - "@Instructure logo": { - "description": "Semantics label for the Instructure logo on the about page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - } -} \ No newline at end of file diff --git a/apps/flutter_parent/lib/l10n/res/intl_pl.arb b/apps/flutter_parent/lib/l10n/res/intl_pl.arb deleted file mode 100644 index 07affc143d..0000000000 --- a/apps/flutter_parent/lib/l10n/res/intl_pl.arb +++ /dev/null @@ -1,2753 +0,0 @@ -{ - "@@last_modified": "2023-08-25T11:04:20.901151", - "alertsLabel": "Alerty", - "@alertsLabel": { - "description": "The label for the Alerts tab", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "calendarLabel": "Kalendarz", - "@calendarLabel": { - "description": "The label for the Calendar tab", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "coursesLabel": "Kursy", - "@coursesLabel": { - "description": "The label for the Courses tab", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Students": "Brak uczestników", - "@No Students": { - "description": "Text for when an observer has no students they are observing", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Tap to show student selector": "Stuknij, aby wyświetlić opcję wyboru uczestników", - "@Tap to show student selector": { - "description": "Semantics label for the area that will show the student selector when tapped", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Tap to pair with a new student": "Stuknij, aby sparować z nowym uczestnikiem", - "@Tap to pair with a new student": { - "description": "Semantics label for the add student button in the student selector", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Tap to select this student": "Stuknij, aby wybrać tego uczestnika", - "@Tap to select this student": { - "description": "Semantics label on individual students in the student switcher", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Manage Students": "Zarządzaj uczestnikami", - "@Manage Students": { - "description": "Label text for the Manage Students nav drawer button as well as the title for the Manage Students screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Help": "Pomoc", - "@Help": { - "description": "Label text for the help nav drawer button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Log Out": "Wyloguj", - "@Log Out": { - "description": "Label text for the Log Out nav drawer button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Switch Users": "Przełącz użytkownika", - "@Switch Users": { - "description": "Label text for the Switch Users nav drawer button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "appVersion": "wer. {version}", - "@appVersion": { - "description": "App version shown in the navigation drawer", - "type": "text", - "placeholders_order": [ - "version" - ], - "placeholders": { - "version": {} - } - }, - "Are you sure you want to log out?": "Czy na pewno chcesz się wylogować?", - "@Are you sure you want to log out?": { - "description": "Confirmation message displayed when the user tries to log out", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Calendars": "Kalendarze", - "@Calendars": { - "description": "Label for button that lets users select which calendars to display", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "nextMonth": "Następny miesiąc: {month}", - "@nextMonth": { - "description": "Label for the button that switches the calendar to the next month", - "type": "text", - "placeholders_order": [ - "month" - ], - "placeholders": { - "month": {} - } - }, - "previousMonth": "Poprzedni miesiąc: {month}", - "@previousMonth": { - "description": "Label for the button that switches the calendar to the previous month", - "type": "text", - "placeholders_order": [ - "month" - ], - "placeholders": { - "month": {} - } - }, - "nextWeek": "Następny tydzień od {date}", - "@nextWeek": { - "description": "Label for the button that switches the calendar to the next week", - "type": "text", - "placeholders_order": [ - "date" - ], - "placeholders": { - "date": {} - } - }, - "previousWeek": "Poprzedni tydzień od {date}", - "@previousWeek": { - "description": "Label for the button that switches the calendar to the previous week", - "type": "text", - "placeholders_order": [ - "date" - ], - "placeholders": { - "date": {} - } - }, - "selectedMonthLabel": "Miesiąc: {month}", - "@selectedMonthLabel": { - "description": "Accessibility label for the button that expands/collapses the month view", - "type": "text", - "placeholders_order": [ - "month" - ], - "placeholders": { - "month": {} - } - }, - "expand": "rozwiń", - "@expand": { - "description": "Accessibility label for the on-tap hint for the button that expands/collapses the month view", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "collapse": "zwiń", - "@collapse": { - "description": "Accessibility label for the on-tap hint for the button that expands/collapses the month view", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "pointsPossible": "{points} pkt do zdobycia", - "@pointsPossible": { - "description": "Screen reader label used for the points possible for an assignment, quiz, etc.", - "type": "text", - "placeholders_order": [ - "points" - ], - "placeholders": { - "points": {} - } - }, - "calendarDaySemanticsLabel": "{eventCount,plural, =1{{date}, {eventCount} zdarzenie}other{{date}, {eventCount} zdarzenia}}", - "@calendarDaySemanticsLabel": { - "description": "Screen reader label used for calendar day, reads the date and count of events", - "type": "text", - "placeholders_order": [ - "date", - "eventCount" - ], - "placeholders": { - "date": {}, - "eventCount": {} - } - }, - "No Events Today!": "Brak wydarzeń na dziś!", - "@No Events Today!": { - "description": "Title displayed when there are no calendar events for the current day", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "It looks like a great day to rest, relax, and recharge.": "Wygląda to na świetny dzień do odpoczynku, relaksu i regeneracji.", - "@It looks like a great day to rest, relax, and recharge.": { - "description": "Message displayed when there are no calendar events for the current day", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading your student's calendar": "Wystąpił błąd podczas wczytywania kalendarza dla uczestników", - "@There was an error loading your student's calendar": { - "description": "Message displayed when calendar events could not be loaded for the current student", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Tap to favorite the courses you want to see on the Calendar. Select up to 10.": "Stuknij, aby dodać do ulubionych kursy, które chcesz wyświetlić w Kalendarzu. Wybierz maksymalnie 10.", - "@Tap to favorite the courses you want to see on the Calendar. Select up to 10.": { - "description": "Description text on calendar filter screen.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You may only choose 10 calendars to display": "Możesz wybrać tylko 10 kalendarzy do wyświetlenia", - "@You may only choose 10 calendars to display": { - "description": "Error text when trying to select more than 10 calendars", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You must select at least one calendar to display": "Musisz wybrać co najmniej jeden kalendarz do wyświetlenia", - "@You must select at least one calendar to display": { - "description": "Error text when trying to de-select all calendars", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Planner Note": "Notatka planera", - "@Planner Note": { - "description": "Label used for notes in the planner", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Go to today": "Przejdź do dziś", - "@Go to today": { - "description": "Accessibility label used for the today button in the planner", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Previous Logins": "Poprzednie logowania", - "@Previous Logins": { - "description": "Label for the list of previous user logins", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "canvasLogoLabel": "Logo Canvas", - "@canvasLogoLabel": { - "description": "The semantics label for the Canvas logo", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "findSchool": "Znajdź szkołę", - "@findSchool": { - "description": "Text for the find-my-school button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "findAnotherSchool": "Znajdź inną szkołę", - "@findAnotherSchool": { - "description": "Text for the find-another-school button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "domainSearchInputHint": "Wpisz nazwę szkoły lub okręg...", - "@domainSearchInputHint": { - "description": "Input hint for the text box on the domain search screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "noDomainResults": "Nie można znaleźć szkół spełniających kryterium \"{query}\"", - "@noDomainResults": { - "description": "Message shown to users when the domain search query did not return any results", - "type": "text", - "placeholders_order": [ - "query" - ], - "placeholders": { - "query": {} - } - }, - "domainSearchHelpLabel": "Jak mogę odnaleźć swoją szkołę lub okrąg?", - "@domainSearchHelpLabel": { - "description": "Label for the help button on the domain search screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "canvasGuides": "Przewodniki Canvas", - "@canvasGuides": { - "description": "Proper name for the Canvas Guides. This will be used in the domainSearchHelpBody text and will be highlighted and clickable", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "canvasSupport": "Wsparcie Canvas", - "@canvasSupport": { - "description": "Proper name for Canvas Support. This will be used in the domainSearchHelpBody text and will be highlighted and clickable", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "domainSearchHelpBody": "Spróbuj wyszukać nazwę szkoły lub okręg, do których chcesz uzyskać dostęp, np. Prywatna Szkoła im. Adama Smitha albo szkoły z okręgu mazowieckiego. Można także wpisać bezpośrednio domenę Canvas, np. smith.instructure.com.\n\nAby uzyskać więcej informacji o wyszukiwaniu konta Canvas instytucji, odwiedź {canvasGuides} lub skontaktuj się z {canvasSupport} bądź ze swoją szkołą.", - "@domainSearchHelpBody": { - "description": "The body text shown in the help dialog on the domain search screen", - "type": "text", - "placeholders_order": [ - "canvasGuides", - "canvasSupport" - ], - "placeholders": { - "canvasGuides": {}, - "canvasSupport": {} - } - }, - "Uh oh!": "O, nie!", - "@Uh oh!": { - "description": "Title of the screen that shows when a crash has occurred", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "We’re not sure what happened, but it wasn’t good. Contact us if this keeps happening.": "Nie mamy pewności, co się wydarzyło, ale nie było to dobre. Jeśli to będzie się powtarzać, skontaktuj się z nami.", - "@We’re not sure what happened, but it wasn’t good. Contact us if this keeps happening.": { - "description": "Message shown when a crash has occurred", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Contact Support": "Skontaktuj się z działem wsparcia", - "@Contact Support": { - "description": "Label for the button that allows users to contact support after a crash has occurred", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "View error details": "Wyświetl szczegóły błędu", - "@View error details": { - "description": "Label for the button that allowed users to view crash details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Restart app": "Ponownie uruchom aplikację", - "@Restart app": { - "description": "Label for the button that will restart the entire application", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Application version": "Wersja aplikacji", - "@Application version": { - "description": "Label for the application version displayed in the crash details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Device model": "Model urządzenia", - "@Device model": { - "description": "Label for the device model displayed in the crash details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Android OS version": "Wersja systemu Android", - "@Android OS version": { - "description": "Label for the Android operating system version displayed in the crash details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Full error message": "Pełny komunikat o błędzie", - "@Full error message": { - "description": "Label for the full error message displayed in the crash details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Inbox": "Skrzynka odbiorcza", - "@Inbox": { - "description": "Title for the Inbox screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading your inbox messages.": "Wystąpił błąd podczas wczytywania wiadomości ze skrzynki odbiorczej.", - "@There was an error loading your inbox messages.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Subject": "Brak tematu", - "@No Subject": { - "description": "Title used for inbox messages that have no subject", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unable to fetch courses. Please check your connection and try again.": "Nie udało się pobrać kursów. Sprawdź połączenie i spróbuj ponownie.", - "@Unable to fetch courses. Please check your connection and try again.": { - "description": "Message shown when an error occured while loading courses", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Choose a course to message": "Wybierz kurs do przesłania", - "@Choose a course to message": { - "description": "Header in the course list shown when the user is choosing which course to associate with a new message", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Inbox Zero": "Skrzynka odbiorcza zero", - "@Inbox Zero": { - "description": "Title of the message shown when there are no inbox messages", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You’re all caught up!": "To już wszystko!", - "@You’re all caught up!": { - "description": "Subtitle of the message shown when there are no inbox messages", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading recipients for this course": "Wystąpił problem z wczytaniem odbiorców dla tego kursu", - "@There was an error loading recipients for this course": { - "description": "Message shown when attempting to create a new message but the recipients list failed to load", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unable to send message. Check your connection and try again.": "Nie udało się wysłać wiadomości. Sprawdź połączenie sieciowe i spróbuj ponownie.", - "@Unable to send message. Check your connection and try again.": { - "description": "Message show when there was an error creating or sending a new message", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unsaved changes": "Niezapisane zmiany", - "@Unsaved changes": { - "description": "Title of the dialog shown when the user tries to leave with unsaved changes", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Are you sure you wish to close this page? Your unsent message will be lost.": "Czy na pewno chcesz zamknąć tę stronę? Niewysłana wiadomość zostanie utracona.", - "@Are you sure you wish to close this page? Your unsent message will be lost.": { - "description": "Body text of the dialog shown when the user tries leave with unsaved changes", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "New message": "Nowa wiadomość", - "@New message": { - "description": "Title of the new-message screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Add attachment": "Dodaj załącznik", - "@Add attachment": { - "description": "Tooltip for the add-attachment button in the new-message screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Send message": "Wyślij wiadomość", - "@Send message": { - "description": "Tooltip for the send-message button in the new-message screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Select recipients": "Wybierz odbiorców", - "@Select recipients": { - "description": "Tooltip for the button that allows users to select message recipients", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No recipients selected": "Nie wybrano odbiorców", - "@No recipients selected": { - "description": "Hint displayed when the user has not selected any message recipients", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Message subject": "Temat wiadomości", - "@Message subject": { - "description": "Hint text displayed in the input field for the message subject", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Message": "Wiadomość", - "@Message": { - "description": "Hint text displayed in the input field for the message body", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Recipients": "Odbiorcy", - "@Recipients": { - "description": "Label for message recipients", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "plusRecipientCount": "+{count}", - "@plusRecipientCount": { - "description": "Shows the number of recipients that are selected but not displayed on screen.", - "type": "text", - "placeholders_order": [ - "count" - ], - "placeholders": { - "count": { - "example": 5 - } - } - }, - "Failed. Tap for options.": "Nie powiodło się. Stuknij, aby wyświetlić opcje.", - "@Failed. Tap for options.": { - "description": "Short message shown on a message attachment when uploading has failed", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "courseForWhom": "dla {studentShortName}", - "@courseForWhom": { - "description": "Describes for whom a course is for (i.e. for Bill)", - "type": "text", - "placeholders_order": [ - "studentShortName" - ], - "placeholders": { - "studentShortName": {} - } - }, - "messageLinkPostscript": "W odniesieniu do: {studentName}, {linkUrl}", - "@messageLinkPostscript": { - "description": "A postscript appended to new messages that clarifies which student is the subject of the message and also includes a URL for the related Canvas component (course, assignment, event, etc).", - "type": "text", - "placeholders_order": [ - "studentName", - "linkUrl" - ], - "placeholders": { - "studentName": {}, - "linkUrl": {} - } - }, - "There was an error loading this conversation": "Wystąpił problem z wczytaniem tej rozmowy", - "@There was an error loading this conversation": { - "description": "Message shown when a conversation fails to load", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Reply": "Odpowiedz", - "@Reply": { - "description": "Button label for replying to a conversation", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Reply All": "Odpowiedz wszystkim", - "@Reply All": { - "description": "Button label for replying to all conversation participants", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unknown User": "Nieznany użytkownik", - "@Unknown User": { - "description": "Label used where the user name is not known", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "me": "ja", - "@me": { - "description": "First-person pronoun (i.e. 'me') that will be used in message author info, e.g. 'Me to 4 others' or 'Jon Snow to me'", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "authorToRecipient": "{authorName} do {recipientName}", - "@authorToRecipient": { - "description": "Author info for a single-recipient message; includes both the author name and the recipient name.", - "type": "text", - "placeholders_order": [ - "authorName", - "recipientName" - ], - "placeholders": { - "authorName": {}, - "recipientName": {} - } - }, - "authorToNOthers": "{howMany,plural, =1{{authorName} do 1 innego}other{{authorName} do {howMany} innych}}", - "@authorToNOthers": { - "description": "Author info for a mutli-recipient message; includes the author name and the number of recipients", - "type": "text", - "placeholders_order": [ - "authorName", - "howMany" - ], - "placeholders": { - "authorName": {}, - "howMany": {} - } - }, - "authorToRecipientAndNOthers": "{howMany,plural, =1{{authorName} do {recipientName} oraz 1 innego}other{{authorName} do {recipientName} oraz {howMany} innych}}", - "@authorToRecipientAndNOthers": { - "description": "Author info for a multi-recipient message; includes the author name, one recipient name, and the number of other recipients", - "type": "text", - "placeholders_order": [ - "authorName", - "recipientName", - "howMany" - ], - "placeholders": { - "authorName": {}, - "recipientName": {}, - "howMany": {} - } - }, - "Download": "Pobierz", - "@Download": { - "description": "Label for the button that will begin downloading a file", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Open with another app": "Otwórz w innej aplikacji", - "@Open with another app": { - "description": "Label for the button that will allow users to open a file with another app", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There are no installed applications that can open this file": "Brak zainstalowanych aplikacji, które mogłyby otworzyć ten plik", - "@There are no installed applications that can open this file": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unsupported File": "Nieobsługiwany plik", - "@Unsupported File": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "This file is unsupported and can’t be viewed through the app": "Ten plik nie jest obsługiwany i nie można go wyświetlić w aplikacji", - "@This file is unsupported and can’t be viewed through the app": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unable to play this media file": "Nie można odtworzyć pliku multimediów", - "@Unable to play this media file": { - "description": "Message shown when audio or video media could not be played", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unable to load this image": "Nie można wczytać tego obrazu", - "@Unable to load this image": { - "description": "Message shown when an image file could not be loaded or displayed", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading this file": "Wystąpił problem z wczytaniem tego pliku", - "@There was an error loading this file": { - "description": "Message shown when a file could not be loaded or displayed", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Courses": "Brak kursów", - "@No Courses": { - "description": "Title for having no courses", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Your student’s courses might not be published yet.": "Być może kursy uczestnika nie zostały jeszcze opublikowane.", - "@Your student’s courses might not be published yet.": { - "description": "Message for having no courses", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading your student’s courses.": "Wystąpił błąd podczas wczytywania kursów uczestnika.", - "@There was an error loading your student’s courses.": { - "description": "Message displayed when the list of student courses could not be loaded", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Grade": "Brak oceny", - "@No Grade": { - "description": "Message shown when there is currently no grade available for a course", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Filter by": "Filtruj wg", - "@Filter by": { - "description": "Title for list of terms to filter grades by", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Grades": "Oceny", - "@Grades": { - "description": "Label for the \"Grades\" tab in course details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Syllabus": "Program", - "@Syllabus": { - "description": "Label for the \"Syllabus\" tab in course details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Front Page": "Pierwsza strona", - "@Front Page": { - "description": "Label for the \"Front Page\" tab in course details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Summary": "Podsumowanie", - "@Summary": { - "description": "Label for the \"Summary\" tab in course details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Send a message about this course": "Wyślij wiadomość o tym kursie", - "@Send a message about this course": { - "description": "Accessibility hint for the course messaage floating action button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Total Grade": "Łączna ocena", - "@Total Grade": { - "description": "Label for the total grade in the course", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Graded": "Oceniono", - "@Graded": { - "description": "Label for assignments that have been graded", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Submitted": "Przesłano", - "@Submitted": { - "description": "Label for assignments that have been submitted", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Not Submitted": "Nie wysłano", - "@Not Submitted": { - "description": "Label for assignments that have not been submitted", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Late": "Późno", - "@Late": { - "description": "Label for assignments that have been marked late or submitted late", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Missing": "Brak", - "@Missing": { - "description": "Label for assignments that have been marked missing or are not submitted and past the due date", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "-": "-", - "@-": { - "description": "Value representing no score for student submission", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "All Grading Periods": "Wszystkie okresy oceniania", - "@All Grading Periods": { - "description": "Label for selecting all grading periods", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Assignments": "Brak zadań", - "@No Assignments": { - "description": "Title for the no assignments message", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "It looks like assignments haven't been created in this space yet.": "Wygląda na to, że w tej przestrzeni nie utworzono zadań.", - "@It looks like assignments haven't been created in this space yet.": { - "description": "Message for no assignments", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading the summary details for this course.": "Wystąpił problem z wczytaniem szczegółów podsumowania dla tego kursu.", - "@There was an error loading the summary details for this course.": { - "description": "Message shown when the course summary could not be loaded", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Summary": "Brak podsumowania", - "@No Summary": { - "description": "Title displayed when there are no items in the course summary", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "This course does not have any assignments or calendar events yet.": "Ten kurs nie ma żadnych zadań ani wydarzeń w kalendarzu.", - "@This course does not have any assignments or calendar events yet.": { - "description": "Message displayed when there are no items in the course summary", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "gradeFormatScoreOutOfPointsPossible": "{score} / {pointsPossible}", - "@gradeFormatScoreOutOfPointsPossible": { - "description": "Formatted string for a student score out of the points possible", - "type": "text", - "placeholders_order": [ - "score", - "pointsPossible" - ], - "placeholders": { - "score": {}, - "pointsPossible": {} - } - }, - "contentDescriptionScoreOutOfPointsPossible": "{score} z {pointsPossible} pkt", - "@contentDescriptionScoreOutOfPointsPossible": { - "description": "Formatted string for a student score out of the points possible", - "type": "text", - "placeholders_order": [ - "score", - "pointsPossible" - ], - "placeholders": { - "score": {}, - "pointsPossible": {} - } - }, - "gradesSubjectMessage": "W odniesieniu do: {studentName}, oceny", - "@gradesSubjectMessage": { - "description": "The subject line for a message to a teacher regarding a student's grades", - "type": "text", - "placeholders_order": [ - "studentName" - ], - "placeholders": { - "studentName": {} - } - }, - "syllabusSubjectMessage": "W odniesieniu do: {studentName}, program", - "@syllabusSubjectMessage": { - "description": "The subject line for a message to a teacher regarding a course syllabus", - "type": "text", - "placeholders_order": [ - "studentName" - ], - "placeholders": { - "studentName": {} - } - }, - "frontPageSubjectMessage": "W odniesieniu do: {studentName}, pierwsza strona", - "@frontPageSubjectMessage": { - "description": "The subject line for a message to a teacher regarding a course front page", - "type": "text", - "placeholders_order": [ - "studentName" - ], - "placeholders": { - "studentName": {} - } - }, - "assignmentSubjectMessage": "W odniesieniu do: {studentName}, zadanie - {assignmentName}", - "@assignmentSubjectMessage": { - "description": "The subject line for a message to a teacher regarding a student's assignment", - "type": "text", - "placeholders_order": [ - "studentName", - "assignmentName" - ], - "placeholders": { - "studentName": {}, - "assignmentName": {} - } - }, - "eventSubjectMessage": "W odniesieniu do: {studentName}, wydarzenie - {eventTitle}", - "@eventSubjectMessage": { - "description": "The subject line for a message to a teacher regarding a calendar event", - "type": "text", - "placeholders_order": [ - "studentName", - "eventTitle" - ], - "placeholders": { - "studentName": {}, - "eventTitle": {} - } - }, - "There is no page information available.": "Brak informacji o stronie.", - "@There is no page information available.": { - "description": "Description for when no page information is available", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Assignment Details": "Szczegóły zadania", - "@Assignment Details": { - "description": "Title for the page that shows details for an assignment", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "assignmentTotalPoints": "{points} pkt", - "@assignmentTotalPoints": { - "description": "Label used for the total points the assignment is worth", - "type": "text", - "placeholders_order": [ - "points" - ], - "placeholders": { - "points": {} - } - }, - "assignmentTotalPointsAccessible": "{points} punkty", - "@assignmentTotalPointsAccessible": { - "description": "Screen reader label used for the total points the assignment is worth", - "type": "text", - "placeholders_order": [ - "points" - ], - "placeholders": { - "points": {} - } - }, - "Due": "Termin", - "@Due": { - "description": "Label for an assignment due date", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Grade": "Ocena", - "@Grade": { - "description": "Label for the section that displays an assignment's grade", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Locked": "Zablokowany", - "@Locked": { - "description": "Label for when an assignment is locked", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "assignmentLockedModule": "To zadanie jest zablokowane przez moduł \"{moduleName}\".", - "@assignmentLockedModule": { - "description": "The locked description when an assignment is locked by a module", - "type": "text", - "placeholders_order": [ - "moduleName" - ], - "placeholders": { - "moduleName": {} - } - }, - "Remind Me": "Przypomnij mi", - "@Remind Me": { - "description": "Label for the row to set reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Set a date and time to be notified of this specific assignment.": "Ustaw datę i godzinę powiadomienia dla tego zadania.", - "@Set a date and time to be notified of this specific assignment.": { - "description": "Description for row to set reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You will be notified about this assignment on…": "Otrzymasz powiadomienie o tym zadaniu w dniu...", - "@You will be notified about this assignment on…": { - "description": "Description for when a reminder is set", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Instructions": "Instrukcje", - "@Instructions": { - "description": "Label for the description of the assignment when it has quiz instructions", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Send a message about this assignment": "Wyślij wiadomość o tym zadaniu", - "@Send a message about this assignment": { - "description": "Accessibility hint for the assignment messaage floating action button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "This app is not authorized for use.": "Ta aplikacja nie jest dopuszczona do użytku.", - "@This app is not authorized for use.": { - "description": "The error shown when the app being used is not verified by Canvas", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The server you entered is not authorized for this app.": "Wybrany serwer nie ma uprawnień dla tej aplikacji.", - "@The server you entered is not authorized for this app.": { - "description": "The error shown when the desired login domain is not verified by Canvas", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The user agent for this app is not authorized.": "Pośrednik użytkownika dla tej aplikacji nie ma uprawnień.", - "@The user agent for this app is not authorized.": { - "description": "The error shown when the user agent during verification is not verified by Canvas", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "We were unable to verify the server for use with this app.": "Nie udało się zweryfikować serwera do użycia z tą aplikacją.", - "@We were unable to verify the server for use with this app.": { - "description": "The generic error shown when we are unable to verify with Canvas", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Reminders": "Przypomnienia", - "@Reminders": { - "description": "Name of the system notification channel for assignment and event reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Notifications for reminders about assignments and calendar events": "Powiadomienia dla przypomnień o zadaniach i wydarzeniach w kalendarzu", - "@Notifications for reminders about assignments and calendar events": { - "description": "Description of the system notification channel for assignment and event reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Reminders have changed!": "Przypomnienia uległy zmianie!", - "@Reminders have changed!": { - "description": "Title of the dialog shown when the user needs to update their reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "In order to provide you with a better experience, we have updated how reminders work. You can add new reminders by viewing an assignment or calendar event and tapping the switch under the \"Remind Me\" section.\n\nBe aware that any reminders created with older versions of this app will not be compatible with the new changes and you will need to create them again.": "Aby zapewnić lepszą obsługę, zaktualizowaliśmy sposób działania przypomnień. Można dodawać nowe przypomnienia, wyświetlając zadanie lub wydarzenie w kalendarzu i stukając przełącznik pod sekcją \"Przypomnij mi\".\n\nNależy pamiętać, że przypomnienia utworzone w starszej wersji tej aplikacji nie będą zgodne z nowymi zmianami i będzie trzeba utworzyć je ponownie.", - "@In order to provide you with a better experience, we have updated how reminders work. You can add new reminders by viewing an assignment or calendar event and tapping the switch under the \"Remind Me\" section.\n\nBe aware that any reminders created with older versions of this app will not be compatible with the new changes and you will need to create them again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Not a parent?": "Nie jesteś rodzicem?", - "@Not a parent?": { - "description": "Title for the screen that shows when the user is not observing any students", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "We couldn't find any students associated with this account": "Nie udało się odnaleźć uczestnika powiązanego z tym kontem", - "@We couldn't find any students associated with this account": { - "description": "Subtitle for the screen that shows when the user is not observing any students", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Are you a student or teacher?": "Jesteś uczestnikiem czy nauczycielem?", - "@Are you a student or teacher?": { - "description": "Label for button that will show users the option to view other Canvas apps in the Play Store", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "One of our other apps might be a better fit. Tap one to visit the Play Store.": "Jedna z innych naszych aplikacji może być bardziej przydatna. Stuknij jedną z nich, aby odwiedzić sklep Play Store.", - "@One of our other apps might be a better fit. Tap one to visit the Play Store.": { - "description": "Description of options to view other Canvas apps in the Play Store", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Return to Login": "Powrót do logowania", - "@Return to Login": { - "description": "Label for the button that returns the user to the login screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "STUDENT": "UCZESTNIK", - "@STUDENT": { - "description": "The \"student\" portion of the \"Canvas Student\" app name, in all caps. \"Canvas\" is excluded in this context as it will be displayed to the user as a wordmark image", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "TEACHER": "NAUCZYCIEL", - "@TEACHER": { - "description": "The \"teacher\" portion of the \"Canvas Teacher\" app name, in all caps. \"Canvas\" is excluded in this context as it will be displayed to the user as a wordmark image", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Canvas Student": "Uczestnik Canvas", - "@Canvas Student": { - "description": "The name of the Canvas Student app. Only \"Student\" should be translated as \"Canvas\" is a brand name in this context and should not be translated.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Canvas Teacher": "Canvas Teacher", - "@Canvas Teacher": { - "description": "The name of the Canvas Teacher app. Only \"Teacher\" should be translated as \"Canvas\" is a brand name in this context and should not be translated.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Alerts": "Brak alertów", - "@No Alerts": { - "description": "The title for the empty message to show to users when there are no alerts for the student.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There’s nothing to be notified of yet.": "Brak informacji do przekazania.", - "@There’s nothing to be notified of yet.": { - "description": "The empty message to show to users when there are no alerts for the student.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "dismissAlertLabel": "Odrzuć {alertTitle}", - "@dismissAlertLabel": { - "description": "Accessibility label to dismiss an alert", - "type": "text", - "placeholders_order": [ - "alertTitle" - ], - "placeholders": { - "alertTitle": {} - } - }, - "Course Announcement": "Ogłoszenie kursu", - "@Course Announcement": { - "description": "Title for alerts when there is a course announcement", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Institution Announcement": "Ogłoszenie instytucji", - "@Institution Announcement": { - "description": "Title for alerts when there is an institution announcement", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "assignmentGradeAboveThreshold": "Ocena za zadanie powyżej {threshold}", - "@assignmentGradeAboveThreshold": { - "description": "Title for alerts when an assignment grade is above the threshold value", - "type": "text", - "placeholders_order": [ - "threshold" - ], - "placeholders": { - "threshold": {} - } - }, - "assignmentGradeBelowThreshold": "Ocena za zadanie poniżej {threshold}", - "@assignmentGradeBelowThreshold": { - "description": "Title for alerts when an assignment grade is below the threshold value", - "type": "text", - "placeholders_order": [ - "threshold" - ], - "placeholders": { - "threshold": {} - } - }, - "courseGradeAboveThreshold": "Ocena z kursu powyżej {threshold}", - "@courseGradeAboveThreshold": { - "description": "Title for alerts when a course grade is above the threshold value", - "type": "text", - "placeholders_order": [ - "threshold" - ], - "placeholders": { - "threshold": {} - } - }, - "courseGradeBelowThreshold": "Ocena z kursu poniżej {threshold}", - "@courseGradeBelowThreshold": { - "description": "Title for alerts when a course grade is below the threshold value", - "type": "text", - "placeholders_order": [ - "threshold" - ], - "placeholders": { - "threshold": {} - } - }, - "Settings": "Ustawienia", - "@Settings": { - "description": "Title for the settings screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Theme": "Motyw", - "@Theme": { - "description": "Label for the light/dark theme section in the settings page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Dark Mode": "Tryb ciemnego tła", - "@Dark Mode": { - "description": "Label for the button that enables dark mode", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Light Mode": "Tryb jasny", - "@Light Mode": { - "description": "Label for the button that enables light mode", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "High Contrast Mode": "Tryb wysokiego kontrastu", - "@High Contrast Mode": { - "description": "Label for the switch that toggles high contrast mode", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Use Dark Theme in Web Content": "Użyj ciemnego motywu w zawartości sieciowej", - "@Use Dark Theme in Web Content": { - "description": "Label for the switch that toggles dark mode for webviews", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Appearance": "Wygląd", - "@Appearance": { - "description": "Label for the appearance section in the settings page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Successfully submitted!": "Przesłano pomyślnie!", - "@Successfully submitted!": { - "description": "Title displayed in the grade cell for an assignment that has been submitted", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "submissionStatusSuccessSubtitle": "To zadanie zostało przesłane w dniu {date} o godz. {time} i oczekuje na ocenę", - "@submissionStatusSuccessSubtitle": { - "description": "Subtitle displayed in the grade cell for an assignment that has been submitted and is awaiting a grade", - "type": "text", - "placeholders_order": [ - "date", - "time" - ], - "placeholders": { - "date": {}, - "time": {} - } - }, - "outOfPoints": "{howMany,plural, =1{Z 1 pkt}other{Z {points} pkt}}", - "@outOfPoints": { - "description": "Description for an assignment grade that has points without a current scoroe", - "type": "text", - "placeholders_order": [ - "points", - "howMany" - ], - "placeholders": { - "points": {}, - "howMany": {} - } - }, - "Excused": "Usprawiedliwiony", - "@Excused": { - "description": "Grading status for an assignment marked as excused", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Complete": "Ukończony", - "@Complete": { - "description": "Grading status for an assignment marked as complete", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Incomplete": "Nie ukończono", - "@Incomplete": { - "description": "Grading status for an assignment marked as incomplete", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "minus": "minus", - "@minus": { - "description": "Screen reader-friendly replacement for the \"-\" character in letter grades like \"A-\"", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "latePenalty": "Kara za spóźnienie (-{pointsLost})", - "@latePenalty": { - "description": "Text displayed when a late penalty has been applied to the assignment", - "type": "text", - "placeholders_order": [ - "pointsLost" - ], - "placeholders": { - "pointsLost": {} - } - }, - "finalGrade": "Ocena końcowa: {grade}", - "@finalGrade": { - "description": "Text that displays the final grade of an assignment", - "type": "text", - "placeholders_order": [ - "grade" - ], - "placeholders": { - "grade": {} - } - }, - "Alert Settings": "Ustawienia alertów", - "@Alert Settings": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Alert me when…": "Powiadom mnie, gdy...", - "@Alert me when…": { - "description": "Header for the screen where the observer chooses the thresholds that will determine when they receive alerts (e.g. when an assignment is graded below 70%)", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Course grade below": "Ocena z kursu poniżej", - "@Course grade below": { - "description": "Label describing the threshold for when the course grade is below a certain percentage", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Course grade above": "Ocena z kursu powyżej", - "@Course grade above": { - "description": "Label describing the threshold for when the course grade is above a certain percentage", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Assignment missing": "Brak zadania", - "@Assignment missing": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Assignment grade below": "Ocena za zadanie poniżej", - "@Assignment grade below": { - "description": "Label describing the threshold for when an assignment is graded below a certain percentage", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Assignment grade above": "Ocena za zadanie powyżej", - "@Assignment grade above": { - "description": "Label describing the threshold for when an assignment is graded above a certain percentage", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Course Announcements": "Ogłoszenia dotyczące kursu", - "@Course Announcements": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Institution Announcements": "Ogłoszenia instytucji", - "@Institution Announcements": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Never": "Nigdy", - "@Never": { - "description": "Indication that tells the user they will not receive alert notifications of a specific kind", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Grade percentage": "Procent oceny", - "@Grade percentage": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading your student's alerts.": "Wystąpił błąd podczas wczytywania alertów dla uczestników.", - "@There was an error loading your student's alerts.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Must be below 100": "Wymagane poniżej 100", - "@Must be below 100": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "mustBeBelowN": "Wymagane poniżej {percentage}", - "@mustBeBelowN": { - "description": "Validation error to the user that they must choose a percentage below 'n'", - "type": "text", - "placeholders_order": [ - "percentage" - ], - "placeholders": { - "percentage": { - "example": 5 - } - } - }, - "mustBeAboveN": "Wymagane powyżej {percentage}", - "@mustBeAboveN": { - "description": "Validation error to the user that they must choose a percentage above 'n'", - "type": "text", - "placeholders_order": [ - "percentage" - ], - "placeholders": { - "percentage": { - "example": 5 - } - } - }, - "Select Student Color": "Wybierz kolor uczestnika", - "@Select Student Color": { - "description": "Title for screen that allows users to assign a color to a specific student", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Electric, blue": "Elektryczny, niebieski", - "@Electric, blue": { - "description": "Name of the Electric (blue) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Plum, Purple": "Śliwka, fioletowy", - "@Plum, Purple": { - "description": "Name of the Plum (purple) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Barney, Fuschia": "Barney, fuksjowy", - "@Barney, Fuschia": { - "description": "Name of the Barney (fuschia) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Raspberry, Red": "Poziomka, czerwony", - "@Raspberry, Red": { - "description": "Name of the Raspberry (red) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Fire, Orange": "Ogień, pomarańczowy", - "@Fire, Orange": { - "description": "Name of the Fire (orange) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Shamrock, Green": "Koniczynka, zielony", - "@Shamrock, Green": { - "description": "Name of the Shamrock (green) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "An error occurred while saving your selection. Please try again.": "Wystąpił błąd podczas zapisywania kolekcji. Spróbuj ponownie.", - "@An error occurred while saving your selection. Please try again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "changeStudentColorLabel": "Zmień kolor na {studentName}", - "@changeStudentColorLabel": { - "description": "Accessibility label for the button that lets users change the color associated with a specific student", - "type": "text", - "placeholders_order": [ - "studentName" - ], - "placeholders": { - "studentName": {} - } - }, - "Teacher": "Nauczyciel", - "@Teacher": { - "description": "Label for the Teacher enrollment type", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Student": "Uczestnik", - "@Student": { - "description": "Label for the Student enrollment type", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "TA": "TA", - "@TA": { - "description": "Label for the Teaching Assistant enrollment type (also known as Teacher Aid or Education Assistant), reduced to a short acronym/initialism if appropriate.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Observer": "Obserwujący", - "@Observer": { - "description": "Label for the Observer enrollment type", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Use Camera": "Użyj kamery", - "@Use Camera": { - "description": "Label for the action item that lets the user capture a photo using the device camera", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Upload File": "Prześlij plik", - "@Upload File": { - "description": "Label for the action item that lets the user upload a file from their device", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Choose from Gallery": "Wybierz z galerii", - "@Choose from Gallery": { - "description": "Label for the action item that lets the user select a photo from their device gallery", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Preparing…": "Przygotowywanie...", - "@Preparing…": { - "description": "Message shown while a file is being prepared to attach to a message", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Add student with…": "Dodaj uczestnika z...", - "@Add student with…": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Add Student": "Dodaj uczestnika", - "@Add Student": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You are not observing any students.": "Nie obserwujesz żadnych uczestników.", - "@You are not observing any students.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading your students.": "Wystąpił błąd podczas wczytywania uczestników.", - "@There was an error loading your students.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Pairing Code": "Kod parowania", - "@Pairing Code": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Students can obtain a pairing code through the Canvas website": "Uczestnicy mogą otrzymać kod parowania za pomocą witryny Canvas", - "@Students can obtain a pairing code through the Canvas website": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Enter the student pairing code provided to you. If the pairing code doesn't work, it may have expired": "Wpisz otrzymany kod parowania uczestnika. Jeśli kod parowania nie działa, mógł wygasnąć", - "@Enter the student pairing code provided to you. If the pairing code doesn't work, it may have expired": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Your code is incorrect or expired.": "Twój kod jest nieprawidłowy lub wygasł.", - "@Your code is incorrect or expired.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Something went wrong trying to create your account, please reach out to your school for assistance.": "Wystąpił błąd podczas tworzenia konta. Skontaktuj się ze swoją szkołą, aby uzyskać pomoc.", - "@Something went wrong trying to create your account, please reach out to your school for assistance.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "QR Code": "Kod QR", - "@QR Code": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Students can create a QR code using the Canvas Student app on their mobile device": "Uczestnicy mogą utworzyć kod QR za pomocą aplikacji Canvas Student na smartfonie", - "@Students can create a QR code using the Canvas Student app on their mobile device": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Add new student": "Dodaj nowego uczestnika", - "@Add new student": { - "description": "Semantics label for the FAB on the Manage Students Screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Select": "Wybierz", - "@Select": { - "description": "Hint text to tell the user to choose one of two options", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I have a Canvas account": "Posiadam konto Canvas", - "@I have a Canvas account": { - "description": "Option to select for users that have a canvas account", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I don't have a Canvas account": "Nie mam konta Canvas", - "@I don't have a Canvas account": { - "description": "Option to select for users that don't have a canvas account", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Create Account": "Utwórz konto", - "@Create Account": { - "description": "Button text for account creation confirmation", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Full Name": "Imię i nazwisko", - "@Full Name": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Email Address": "Adres e-mail", - "@Email Address": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Password": "Hasło", - "@Password": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Full Name…": "Imię i nazwisko...", - "@Full Name…": { - "description": "hint label for inside form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Email…": "Adres e-mail...", - "@Email…": { - "description": "hint label for inside form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Password…": "Hasło...", - "@Password…": { - "description": "hint label for inside form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Please enter full name": "Podaj pełną nazwę", - "@Please enter full name": { - "description": "Error message for form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Please enter an email address": "Podaj adres e-mail", - "@Please enter an email address": { - "description": "Error message for form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Please enter a valid email address": "Wprowadź prawidłowy adres e-mail", - "@Please enter a valid email address": { - "description": "Error message for form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Password is required": "Wymagane jest hasło", - "@Password is required": { - "description": "Error message for form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Password must contain at least 8 characters": "Hasło musi zawierać co najmniej 8 znaków.", - "@Password must contain at least 8 characters": { - "description": "Error message for form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "qrCreateAccountTos": "Stukając opcję Utwórz konto, zgadzasz się na {termsOfService} i potwierdzasz {privacyPolicy}.", - "@qrCreateAccountTos": { - "description": "The text show on the account creation screen", - "type": "text", - "placeholders_order": [ - "termsOfService", - "privacyPolicy" - ], - "placeholders": { - "termsOfService": {}, - "privacyPolicy": {} - } - }, - "Terms of Service": "Warunki korzystania z usługi", - "@Terms of Service": { - "description": "Label for the Canvas Terms of Service agreement. This will be used in the qrCreateAccountTos text and will be highlighted and clickable", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Privacy Policy": "Polityka prywatności", - "@Privacy Policy": { - "description": "Label for the Canvas Privacy Policy agreement. This will be used in the qrCreateAccountTos text and will be highlighted and clickable", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "View the Privacy Policy": "Pokaż politykę prywatności", - "@View the Privacy Policy": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Already have an account? ": "Masz już konto? ", - "@Already have an account? ": { - "description": "Part of multiline text span, includes AccountSignIn1-2, in that order", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Sign In": "Zaloguj się", - "@Sign In": { - "description": "Part of multiline text span, includes AccountSignIn1-2, in that order", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Hide Password": "Ukryj hasło", - "@Hide Password": { - "description": "content description for password hide button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Show Password": "Pokaż hasło", - "@Show Password": { - "description": "content description for password show button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Terms of Service Link": "Łącze do Warunków korzystania z usługi", - "@Terms of Service Link": { - "description": "content description for terms of service link", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Privacy Policy Link": "Łącze do Polityki prywatności", - "@Privacy Policy Link": { - "description": "content description for privacy policy link", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Event": "Wydarzenie", - "@Event": { - "description": "Title for the event details screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Date": "Data", - "@Date": { - "description": "Label for the event date", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Location": "Lokalizacja", - "@Location": { - "description": "Label for the location information", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Location Specified": "Brak określonej lokalizacji", - "@No Location Specified": { - "description": "Description for events that do not have a location", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "eventTime": "{startAt} - {endAt}", - "@eventTime": { - "description": "The time the event is happening, example: \"2:00 pm - 4:00 pm\"", - "type": "text", - "placeholders_order": [ - "startAt", - "endAt" - ], - "placeholders": { - "startAt": {}, - "endAt": {} - } - }, - "Set a date and time to be notified of this event.": "Ustaw datę i godzinę powiadomienia o tym wydarzeniu.", - "@Set a date and time to be notified of this event.": { - "description": "Description for row to set event reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You will be notified about this event on…": "Otrzymasz powiadomienie o tym wydarzeniu w dniu...", - "@You will be notified about this event on…": { - "description": "Description for when an event reminder is set", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Share Your Love for the App": "Podziel się miłością do Aplikacji", - "@Share Your Love for the App": { - "description": "Label for option to open the app store", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Tell us about your favorite parts of the app": "Powiedz nam o twoich ulubionych częściach aplikacji", - "@Tell us about your favorite parts of the app": { - "description": "Description for option to open the app store", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Legal": "Informacje prawne", - "@Legal": { - "description": "Label for legal information option", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Privacy policy, terms of use, open source": "Polityka prywatności, Warunki korzystania, open source", - "@Privacy policy, terms of use, open source": { - "description": "Description for legal information option", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Idea for Canvas Parent App [Android]": "Pomysł na aplikację Canvas Parent [Android]", - "@Idea for Canvas Parent App [Android]": { - "description": "The subject for the email to request a feature", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The following information will help us better understand your idea:": "Poniższe informacje pozwolą nam lepiej zrozumieć twój pomysł:", - "@The following information will help us better understand your idea:": { - "description": "The header for the users information that is attached to a feature request", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Domain:": "Domena:", - "@Domain:": { - "description": "The label for the Canvas domain of the logged in user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "User ID:": "Identyfikator użytkownika:", - "@User ID:": { - "description": "The label for the Canvas user ID of the logged in user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Email:": "Adres e-mail:", - "@Email:": { - "description": "The label for the eamil of the logged in user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Locale:": "Lokalizacja:", - "@Locale:": { - "description": "The label for the locale of the logged in user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Terms of Use": "Warunki korzystania", - "@Terms of Use": { - "description": "Label for the terms of use", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Canvas on GitHub": "Canvas na GitHub", - "@Canvas on GitHub": { - "description": "Label for the button that opens the Canvas project on GitHub's website", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was a problem loading the Terms of Use": "Wystąpił problem z wczytywaniem Warunków korzystania", - "@There was a problem loading the Terms of Use": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Device": "Urządzenie", - "@Device": { - "description": "Label used for device manufacturer/model in the error report", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "OS Version": "Wersja OS", - "@OS Version": { - "description": "Label used for device operating system version in the error report", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Version Number": "Numer wersji", - "@Version Number": { - "description": "Label used for the app version number in the error report", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Report A Problem": "Zgłoś problem", - "@Report A Problem": { - "description": "Title used for generic dialog to report problems", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Subject": "Temat", - "@Subject": { - "description": "Label used for Subject text field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "A subject is required.": "Wymagany jest temat.", - "@A subject is required.": { - "description": "Error shown when the subject field is empty", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "An email address is required.": "Wymagany jest adres e-mail.", - "@An email address is required.": { - "description": "Error shown when the email field is empty", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Description": "Opis", - "@Description": { - "description": "Label used for Description text field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "A description is required.": "Wymagany jest opis.", - "@A description is required.": { - "description": "Error shown when the description field is empty", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "How is this affecting you?": "W jaki sposób to na Ciebie wpływa?", - "@How is this affecting you?": { - "description": "Label used for the dropdown to select how severe the issue is", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "send": "wyślij", - "@send": { - "description": "Label used for send button when reporting a problem", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Just a casual question, comment, idea, suggestion…": "Jedynie przypadkowe pytanie, komentarz, pomysł, sugestię...", - "@Just a casual question, comment, idea, suggestion…": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I need some help but it's not urgent.": "Potrzebuję pomocy ale nie jest to pilne.", - "@I need some help but it's not urgent.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Something's broken but I can work around it to get what I need done.": "Coś się zepsuło ale jestem w stanie to obejść aby wykonać to czego potrzebuję.", - "@Something's broken but I can work around it to get what I need done.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I can't get things done until I hear back from you.": "Nie mogę nie zrobić dopóki się ze mną nie skontaktujesz.", - "@I can't get things done until I hear back from you.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "EXTREME CRITICAL EMERGENCY!!": "KRYTYCZNA SYTUACJA AWARYJNA!", - "@EXTREME CRITICAL EMERGENCY!!": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Not Graded": "Nie oceniono", - "@Not Graded": { - "description": "Description for an assignment has not been graded.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Login flow: Normal": "Proces logowania: Normalny", - "@Login flow: Normal": { - "description": "Description for the normal login flow", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Login flow: Canvas": "Proces logowania: Canvas", - "@Login flow: Canvas": { - "description": "Description for the Canvas login flow", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Login flow: Site Admin": "Proces logowania: Administrator strony", - "@Login flow: Site Admin": { - "description": "Description for the Site Admin login flow", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Login flow: Skip mobile verify": "Proces logowania: Pomiń weryfikację mobilną", - "@Login flow: Skip mobile verify": { - "description": "Description for the login flow that skips domain verification for mobile", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Act As User": "Działaj jako użytkownik", - "@Act As User": { - "description": "Label for the button that allows the user to act (masquerade) as another user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Stop Acting as User": "Przestań działać jako Użytkownik", - "@Stop Acting as User": { - "description": "Label for the button that allows the user to stop acting (masquerading) as another user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "actingAsUser": "Podszywasz się jako {userName}", - "@actingAsUser": { - "description": "Message shown while acting (masquerading) as another user", - "type": "text", - "placeholders_order": [ - "userName" - ], - "placeholders": { - "userName": {} - } - }, - "\"Act as\" is essentially logging in as this user without a password. You will be able to take any action as if you were this user, and from other users' points of views, it will be as if this user performed them. However, audit logs record that you were the one who performed the actions on behalf of this user.": "\"Podszywanie\" polega na logowaniu się jako inny użytkownik bez użycia hasła. Będziesz mieć możliwość podejmowania wszelkich działań jako ten użytkownik, a z perspektywy innych użytkowników będzie to wyglądać, jakby właśnie dany użytkownik przeprowadzał wszystkie czynności. W dzienniku audytu zostanie jednak zapisana informacja, że to Ty wykonywałeś(aś) działania w imieniu tego użytkownika.", - "@\"Act as\" is essentially logging in as this user without a password. You will be able to take any action as if you were this user, and from other users' points of views, it will be as if this user performed them. However, audit logs record that you were the one who performed the actions on behalf of this user.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Domain": "Domena", - "@Domain": { - "description": "Text field hint for domain url input", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You must enter a valid domain": "Musisz wpisać prawidłową domenę", - "@You must enter a valid domain": { - "description": "Message displayed for domain input error", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "User ID": "Identyfikator użytkownika", - "@User ID": { - "description": "Text field hint for user ID input", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You must enter a user id": "Musisz wpisać ID użytkownika", - "@You must enter a user id": { - "description": "Message displayed for user Id input error", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error trying to act as this user. Please check the Domain and User ID and try again.": "Wystąpił błąd podczas podszywania się jako ten użytkownik. Sprawdź domenę i ID użytkownika oraz spróbuj ponownie.", - "@There was an error trying to act as this user. Please check the Domain and User ID and try again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "endMasqueradeMessage": "Zatrzymasz podszywanie się jako {userName} i powrócisz do swojego konta.", - "@endMasqueradeMessage": { - "description": "Confirmation message displayed when the user wants to stop acting (masquerading) as another user", - "type": "text", - "placeholders_order": [ - "userName" - ], - "placeholders": { - "userName": {} - } - }, - "endMasqueradeLogoutMessage": "Zatrzymasz podszywanie się jako {userName} i nastąpi wylogowanie.", - "@endMasqueradeLogoutMessage": { - "description": "Confirmation message displayed when the user wants to stop acting (masquerading) as another user and will be logged out.", - "type": "text", - "placeholders_order": [ - "userName" - ], - "placeholders": { - "userName": {} - } - }, - "How are we doing?": "Jak się czujemy?", - "@How are we doing?": { - "description": "Title for dialog asking user to rate the app out of 5 stars.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Don't show again": "Nie pokazuj więcej", - "@Don't show again": { - "description": "Button to prevent the rating dialog from showing again.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "What can we do better?": "Co możemy ulepszyć?", - "@What can we do better?": { - "description": "Hint text for providing a comment with the rating.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Send Feedback": "Wyślij informację zwrotną", - "@Send Feedback": { - "description": "Button to send rating with feedback", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "ratingDialogEmailSubject": "Sugestie dla systemu Android - Canvas Parent {version}", - "@ratingDialogEmailSubject": { - "description": "The subject for an email to provide feedback for CanvasParent.", - "type": "text", - "placeholders_order": [ - "version" - ], - "placeholders": { - "version": {} - } - }, - "starRating": "{position,plural, =1{{position} gwiazdka}other{{position} gwiazdki}}", - "@starRating": { - "description": "Accessibility label for the 1 stars to 5 stars rating", - "type": "text", - "placeholders_order": [ - "position" - ], - "placeholders": { - "position": { - "example": 1 - } - } - }, - "Student Pairing": "Parowanie uczestnika", - "@Student Pairing": { - "description": "Title for the screen where users can pair to students using a QR code", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Open Canvas Student": "Otwórz aplikację Canvas Student", - "@Open Canvas Student": { - "description": "Title for QR pairing tutorial screen instructing users to open the Canvas Student app", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You'll need to open your student's Canvas Student app to continue. Go into Main Menu > Settings > Pair with Observer and scan the QR code you see there.": "Aby kontynuować, należy otworzyć aplikację Canvas Student. Przejdź do Menu głównego > Ustawienia > Paruj z obserwującym i zeskanuj podany kod QR.", - "@You'll need to open your student's Canvas Student app to continue. Go into Main Menu > Settings > Pair with Observer and scan the QR code you see there.": { - "description": "Message explaining how QR code pairing works", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Screenshot showing location of pairing QR code generation in the Canvas Student app": "Zrzut ekranu przedstawiający miejsce generowania kodu QR w aplikacji Canvas Student", - "@Screenshot showing location of pairing QR code generation in the Canvas Student app": { - "description": "Content Description for qr pairing tutorial screenshot", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Expired QR Code": "Nieważny kod QR", - "@Expired QR Code": { - "description": "Error title shown when the users scans a QR code that has expired", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The QR code you scanned may have expired. Refresh the code on the student's device and try again.": "Kod QR, który zeskanowano, mógł już wygasnąć. Odśwież kod na urządzeniu uczestnika i spróbuj ponownie.", - "@The QR code you scanned may have expired. Refresh the code on the student's device and try again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "A network error occurred when adding this student. Check your connection and try again.": "Wystąpił błąd sieciowy podczas dodawania uczestnika. Sprawdź połączenie sieciowe i spróbuj ponownie.", - "@A network error occurred when adding this student. Check your connection and try again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Invalid QR Code": "Niepoprawny kod QR", - "@Invalid QR Code": { - "description": "Error title shown when the user scans an invalid QR code", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Incorrect Domain": "Niepoprawna domena", - "@Incorrect Domain": { - "description": "Error title shown when the users scane a QR code for a student that belongs to a different domain", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The student you are trying to add belongs to a different school. Log in or create an account with that school to scan this code.": "Uczestnik, którego próbujesz dodać, należy do innej szkoły. Aby zeskanować ten kod, zaloguj się lub utwórz konto powiązane z tą szkołą.", - "@The student you are trying to add belongs to a different school. Log in or create an account with that school to scan this code.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Camera Permission": "Uprawnienia kamery", - "@Camera Permission": { - "description": "Error title shown when the user wans to scan a QR code but has denied the camera permission", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "This will unpair and remove all enrollments for this student from your account.": "Spowoduje to usunięcie parowania i wszystkich zapisów uczestnika z konta.", - "@This will unpair and remove all enrollments for this student from your account.": { - "description": "Confirmation message shown when the user tries to delete a student from their account", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was a problem removing this student from your account. Please check your connection and try again.": "Wystąpił błąd podczas usuwania tego uczestnika z konta. Sprawdź połączenie i spróbuj ponownie.", - "@There was a problem removing this student from your account. Please check your connection and try again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Cancel": "Anuluj", - "@Cancel": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "next": "Następny", - "@next": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "ok": "OK", - "@ok": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Yes": "Tak", - "@Yes": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No": "Nie", - "@No": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Retry": "Ponów próbę", - "@Retry": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Delete": "Usuń", - "@Delete": { - "description": "Label used for general delete/remove actions", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Done": "Gotowe", - "@Done": { - "description": "Label for general done/finished actions", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Refresh": "Odśwież", - "@Refresh": { - "description": "Label for button to refresh data from the web", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "View Description": "Wyświetl opis", - "@View Description": { - "description": "Button to view the description for an event or assignment", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "expanded": "rozwinięte", - "@expanded": { - "description": "Description for the accessibility reader for list groups that are expanded", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "collapsed": "zwinięte", - "@collapsed": { - "description": "Description for the accessibility reader for list groups that are expanded", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "An unexpected error occurred": "Wystąpił nieoczekiwany błąd", - "@An unexpected error occurred": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No description": "Brak opisu", - "@No description": { - "description": "Message used when the assignment has no description", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Launch External Tool": "Uruchom narzędzie zewnętrzne", - "@Launch External Tool": { - "description": "Button text added to webviews to let users open external tools in their browser", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Interactions on this page are limited by your institution.": "Interakcje na tej stronie zostały ograniczone przez Twoją instytucje.", - "@Interactions on this page are limited by your institution.": { - "description": "Message describing how the webview has limited access due to an instution setting", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "dateAtTime": "{date} o {time}", - "@dateAtTime": { - "description": "The string to format dates", - "type": "text", - "placeholders_order": [ - "date", - "time" - ], - "placeholders": { - "date": {}, - "time": {} - } - }, - "dueDateAtTime": "Termin {date} o {time}", - "@dueDateAtTime": { - "description": "The string to format due dates", - "type": "text", - "placeholders_order": [ - "date", - "time" - ], - "placeholders": { - "date": {}, - "time": {} - } - }, - "No Due Date": "Brak terminu", - "@No Due Date": { - "description": "Label for assignments that do not have a due date", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Filter": "Filtruj", - "@Filter": { - "description": "Label for buttons to filter what items are visible", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "unread": "nieprzeczytane", - "@unread": { - "description": "Label for things that are marked as unread", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "unreadCount": "{count} nieprzeczytane", - "@unreadCount": { - "description": "Formatted string for when there are a number of unread items", - "type": "text", - "placeholders_order": [ - "count" - ], - "placeholders": { - "count": {} - } - }, - "badgeNumberPlus": "{count}+", - "@badgeNumberPlus": { - "description": "Formatted string for when too many items are being notified in a badge, generally something like: 99+", - "type": "text", - "placeholders_order": [ - "count" - ], - "placeholders": { - "count": {} - } - }, - "There was an error loading this announcement": "Wystąpił problem z wczytaniem tego ogłoszenia", - "@There was an error loading this announcement": { - "description": "Message shown when an announcement detail screen fails to load", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Network error": "Błąd sieciowy", - "@Network error": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Under Construction": "Strona w budowie", - "@Under Construction": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "We are currently building this feature for your viewing pleasure.": "Tworzymy tę funkcję dla przyjemności użytkowników.", - "@We are currently building this feature for your viewing pleasure.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Request Login Help Button": "Przycisk prośby o pomoc w logowaniu", - "@Request Login Help Button": { - "description": "Accessibility hint for button that opens help dialog for a login help request", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Request Login Help": "Poproś o pomoc w logowaniu", - "@Request Login Help": { - "description": "Title of help dialog for a login help request", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I'm having trouble logging in": "Mam problem z logowaniem", - "@I'm having trouble logging in": { - "description": "Subject of help dialog for a login help request", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "An error occurred when trying to display this link": "Wystąpił błąd podczas wyświetlania tego łącza", - "@An error occurred when trying to display this link": { - "description": "Error message shown when a link can't be opened", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "We are unable to display this link, it may belong to an institution you currently aren't logged in to.": "Nie udało się wyświetlić tego łącza, może należeć do instytucji, do której nie jesteś zalogowany.", - "@We are unable to display this link, it may belong to an institution you currently aren't logged in to.": { - "description": "Description for error page shown when clicking a link", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Link Error": "Błąd łącza", - "@Link Error": { - "description": "Title for error page shown when clicking a link", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Open In Browser": "Otwórz w przeglądarce", - "@Open In Browser": { - "description": "Text for button to open a link in the browswer", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You'll find the QR code on the web in your account profile. Click 'QR for Mobile Login' in the list.": "Kod QR można znaleźć w witrynie, na profilu konta. Kliknij 'Kod QR do logowania mobilnego' na liście.", - "@You'll find the QR code on the web in your account profile. Click 'QR for Mobile Login' in the list.": { - "description": "Text for qr login tutorial screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Locate QR Code": "Znajdź kod QR", - "@Locate QR Code": { - "description": "Text for qr login button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Please scan a QR code generated by Canvas": "Zeskanuj kod QR wygenerowany przez Canvas", - "@Please scan a QR code generated by Canvas": { - "description": "Text for qr login error with incorrect qr code", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error logging in. Please generate another QR Code and try again.": "Wystąpił błąd podczas logowania. Wygeneruj kolejny kod QR i spróbuj ponownie.", - "@There was an error logging in. Please generate another QR Code and try again.": { - "description": "Text for qr login error", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Screenshot showing location of QR code generation in browser": "Zrzut ekranu z lokalizacją wygenerowanego kodu QR w przeglądarce", - "@Screenshot showing location of QR code generation in browser": { - "description": "Content Description for qr login tutorial screenshot", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "QR scanning requires camera access": "Skanowanie kodu QR wymaga dostępu kamery", - "@QR scanning requires camera access": { - "description": "placeholder for camera error for QR code scan", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The linked item is no longer available": "Wskazany element nie jest już dostępny.", - "@The linked item is no longer available": { - "description": "error message when the alert could no be opened", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Message sent": "Wiadomość wysłana", - "@Message sent": { - "description": "confirmation message on the screen when the user succesfully sends a message", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Acceptable Use Policy": "Zasady dozwolonego użytku", - "@Acceptable Use Policy": { - "description": "title for the acceptable use policy screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Submit": "Prześlij", - "@Submit": { - "description": "submit button title for acceptable use policy screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Either you're a new user or the Acceptable Use Policy has changed since you last agreed to it. Please agree to the Acceptable Use Policy before you continue.": "Albo jesteś nowym użytkownikiem, albo Zasady dozwolonego użytku uległy zmianie od momentu, gdy wyraziłeś na nie zgodę. Zaakceptuj Zasady dozwolonego użytku, aby kontynuować.", - "@Either you're a new user or the Acceptable Use Policy has changed since you last agreed to it. Please agree to the Acceptable Use Policy before you continue.": { - "description": "acceptable use policy screen description", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I agree to the Acceptable Use Policy.": "Wyrażam zgodę na Zasady dozwolonego użytku.", - "@I agree to the Acceptable Use Policy.": { - "description": "acceptable use policy switch title", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "About": "Informacje", - "@About": { - "description": "Title for about menu item in settings", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "App": "Aplikacja", - "@App": { - "description": "Title for App field on about page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Login ID": "Nazwa użytkownika", - "@Login ID": { - "description": "Title for Login ID field on about page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Email": "E-mail", - "@Email": { - "description": "Title for Email field on about page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Version": "Wersja", - "@Version": { - "description": "Title for Version field on about page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Instructure logo": "Logo Instructure", - "@Instructure logo": { - "description": "Semantics label for the Instructure logo on the about page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - } -} \ No newline at end of file diff --git a/apps/flutter_parent/lib/l10n/res/intl_pt_BR.arb b/apps/flutter_parent/lib/l10n/res/intl_pt_BR.arb deleted file mode 100644 index 6a389c22ec..0000000000 --- a/apps/flutter_parent/lib/l10n/res/intl_pt_BR.arb +++ /dev/null @@ -1,2753 +0,0 @@ -{ - "@@last_modified": "2023-08-25T11:04:20.901151", - "alertsLabel": "Alertas", - "@alertsLabel": { - "description": "The label for the Alerts tab", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "calendarLabel": "Calendário", - "@calendarLabel": { - "description": "The label for the Calendar tab", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "coursesLabel": "Cursos", - "@coursesLabel": { - "description": "The label for the Courses tab", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Students": "Sem Alunos", - "@No Students": { - "description": "Text for when an observer has no students they are observing", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Tap to show student selector": "Toque para exibir o seletor de alunos", - "@Tap to show student selector": { - "description": "Semantics label for the area that will show the student selector when tapped", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Tap to pair with a new student": "Toque para emparelhar com um novo aluno", - "@Tap to pair with a new student": { - "description": "Semantics label for the add student button in the student selector", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Tap to select this student": "Toque para selecionar este aluno", - "@Tap to select this student": { - "description": "Semantics label on individual students in the student switcher", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Manage Students": "Gerenciar alunos", - "@Manage Students": { - "description": "Label text for the Manage Students nav drawer button as well as the title for the Manage Students screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Help": "Ajuda", - "@Help": { - "description": "Label text for the help nav drawer button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Log Out": "Sair", - "@Log Out": { - "description": "Label text for the Log Out nav drawer button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Switch Users": "Alternar Usuários", - "@Switch Users": { - "description": "Label text for the Switch Users nav drawer button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "appVersion": "v. {version}", - "@appVersion": { - "description": "App version shown in the navigation drawer", - "type": "text", - "placeholders_order": [ - "version" - ], - "placeholders": { - "version": {} - } - }, - "Are you sure you want to log out?": "Tem certeza de que deseja sair?", - "@Are you sure you want to log out?": { - "description": "Confirmation message displayed when the user tries to log out", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Calendars": "Calendários", - "@Calendars": { - "description": "Label for button that lets users select which calendars to display", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "nextMonth": "Próximo mês: {month}", - "@nextMonth": { - "description": "Label for the button that switches the calendar to the next month", - "type": "text", - "placeholders_order": [ - "month" - ], - "placeholders": { - "month": {} - } - }, - "previousMonth": "Mês anterior: {month}", - "@previousMonth": { - "description": "Label for the button that switches the calendar to the previous month", - "type": "text", - "placeholders_order": [ - "month" - ], - "placeholders": { - "month": {} - } - }, - "nextWeek": "Próxima semana começando {date}", - "@nextWeek": { - "description": "Label for the button that switches the calendar to the next week", - "type": "text", - "placeholders_order": [ - "date" - ], - "placeholders": { - "date": {} - } - }, - "previousWeek": "Semana anterior começando {date}", - "@previousWeek": { - "description": "Label for the button that switches the calendar to the previous week", - "type": "text", - "placeholders_order": [ - "date" - ], - "placeholders": { - "date": {} - } - }, - "selectedMonthLabel": "Mês de {month}", - "@selectedMonthLabel": { - "description": "Accessibility label for the button that expands/collapses the month view", - "type": "text", - "placeholders_order": [ - "month" - ], - "placeholders": { - "month": {} - } - }, - "expand": "expandir", - "@expand": { - "description": "Accessibility label for the on-tap hint for the button that expands/collapses the month view", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "collapse": "recolher", - "@collapse": { - "description": "Accessibility label for the on-tap hint for the button that expands/collapses the month view", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "pointsPossible": "{points} pontos possíveis", - "@pointsPossible": { - "description": "Screen reader label used for the points possible for an assignment, quiz, etc.", - "type": "text", - "placeholders_order": [ - "points" - ], - "placeholders": { - "points": {} - } - }, - "calendarDaySemanticsLabel": "{eventCount,plural, =1{{date}, {eventCount} evento}other{{date}, {eventCount} eventos}}", - "@calendarDaySemanticsLabel": { - "description": "Screen reader label used for calendar day, reads the date and count of events", - "type": "text", - "placeholders_order": [ - "date", - "eventCount" - ], - "placeholders": { - "date": {}, - "eventCount": {} - } - }, - "No Events Today!": "Nenhum evento hoje!", - "@No Events Today!": { - "description": "Title displayed when there are no calendar events for the current day", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "It looks like a great day to rest, relax, and recharge.": "Parece um bom dia para descansar, relaxar e recarregar.", - "@It looks like a great day to rest, relax, and recharge.": { - "description": "Message displayed when there are no calendar events for the current day", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading your student's calendar": "Houve um erro ao carregar o calendário do seu aluno", - "@There was an error loading your student's calendar": { - "description": "Message displayed when calendar events could not be loaded for the current student", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Tap to favorite the courses you want to see on the Calendar. Select up to 10.": "Toque para favoritar os cursos que você deseja ver no calendário. Selecione até 10.", - "@Tap to favorite the courses you want to see on the Calendar. Select up to 10.": { - "description": "Description text on calendar filter screen.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You may only choose 10 calendars to display": "Você pode escolher apenas 10 calendários para exibir", - "@You may only choose 10 calendars to display": { - "description": "Error text when trying to select more than 10 calendars", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You must select at least one calendar to display": "Você deve selecionar pelo menos um calendário para exibir", - "@You must select at least one calendar to display": { - "description": "Error text when trying to de-select all calendars", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Planner Note": "Nota do planejador", - "@Planner Note": { - "description": "Label used for notes in the planner", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Go to today": "Ir para hoje", - "@Go to today": { - "description": "Accessibility label used for the today button in the planner", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Previous Logins": "Logins prévios", - "@Previous Logins": { - "description": "Label for the list of previous user logins", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "canvasLogoLabel": "Logotipo do Canvas", - "@canvasLogoLabel": { - "description": "The semantics label for the Canvas logo", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "findSchool": "Encontrar escola", - "@findSchool": { - "description": "Text for the find-my-school button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "findAnotherSchool": "Encontrar outra escola", - "@findAnotherSchool": { - "description": "Text for the find-another-school button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "domainSearchInputHint": "Inserir nome ou distrito da escola...", - "@domainSearchInputHint": { - "description": "Input hint for the text box on the domain search screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "noDomainResults": "Não é possível encontrar escolas correspondendo a \"{query}\"", - "@noDomainResults": { - "description": "Message shown to users when the domain search query did not return any results", - "type": "text", - "placeholders_order": [ - "query" - ], - "placeholders": { - "query": {} - } - }, - "domainSearchHelpLabel": "Como encontrar minha escola ou distrito?", - "@domainSearchHelpLabel": { - "description": "Label for the help button on the domain search screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "canvasGuides": "Canvas Guides", - "@canvasGuides": { - "description": "Proper name for the Canvas Guides. This will be used in the domainSearchHelpBody text and will be highlighted and clickable", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "canvasSupport": "Suporte do Canvas", - "@canvasSupport": { - "description": "Proper name for Canvas Support. This will be used in the domainSearchHelpBody text and will be highlighted and clickable", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "domainSearchHelpBody": "Tente pesquisar o nome da escola ou distrito que você está tentando acessar, como “Smith Private School” ou “Smith County Schools.” Também é possível inserir um domínio do Canvas diretamente, como “smith.instructure.com.”\n\nPara mais informações sobre encontrar a conta do Canvas da sua instituição, você pode visitar o {canvasGuides}, falar com o {canvasSupport} ou contatar a sua escola para assistência.", - "@domainSearchHelpBody": { - "description": "The body text shown in the help dialog on the domain search screen", - "type": "text", - "placeholders_order": [ - "canvasGuides", - "canvasSupport" - ], - "placeholders": { - "canvasGuides": {}, - "canvasSupport": {} - } - }, - "Uh oh!": "Que difícil...", - "@Uh oh!": { - "description": "Title of the screen that shows when a crash has occurred", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "We’re not sure what happened, but it wasn’t good. Contact us if this keeps happening.": "Não temos certeza do que aconteceu, mas não foi bom. Contate-nos se isso continuar acontecendo.", - "@We’re not sure what happened, but it wasn’t good. Contact us if this keeps happening.": { - "description": "Message shown when a crash has occurred", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Contact Support": "Entre em contato com o suporte", - "@Contact Support": { - "description": "Label for the button that allows users to contact support after a crash has occurred", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "View error details": "Visualizar detalhes do erro", - "@View error details": { - "description": "Label for the button that allowed users to view crash details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Restart app": "Reiniciar app", - "@Restart app": { - "description": "Label for the button that will restart the entire application", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Application version": "Versão do aplicativo", - "@Application version": { - "description": "Label for the application version displayed in the crash details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Device model": "Modelo do dispositivo", - "@Device model": { - "description": "Label for the device model displayed in the crash details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Android OS version": "Versão SO do Android", - "@Android OS version": { - "description": "Label for the Android operating system version displayed in the crash details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Full error message": "Mensagem de erro completa", - "@Full error message": { - "description": "Label for the full error message displayed in the crash details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Inbox": "Caixa de entrada", - "@Inbox": { - "description": "Title for the Inbox screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading your inbox messages.": "Houve um erro ao carregar as suas mensagens da caixa de entrada.", - "@There was an error loading your inbox messages.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Subject": "Sem assunto", - "@No Subject": { - "description": "Title used for inbox messages that have no subject", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unable to fetch courses. Please check your connection and try again.": "Não é possível obter cursos. Verifique a sua conexão e tente novamente.", - "@Unable to fetch courses. Please check your connection and try again.": { - "description": "Message shown when an error occured while loading courses", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Choose a course to message": "Escolher um curso para enviar mensagem", - "@Choose a course to message": { - "description": "Header in the course list shown when the user is choosing which course to associate with a new message", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Inbox Zero": "Caixa de Entrada Zero", - "@Inbox Zero": { - "description": "Title of the message shown when there are no inbox messages", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You’re all caught up!": "Você está em dia!", - "@You’re all caught up!": { - "description": "Subtitle of the message shown when there are no inbox messages", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading recipients for this course": "Houve um erro ao carregar recipientes para este curso", - "@There was an error loading recipients for this course": { - "description": "Message shown when attempting to create a new message but the recipients list failed to load", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unable to send message. Check your connection and try again.": "Incapaz de enviar mensagem. Verifique sua conexão e tente novamente.", - "@Unable to send message. Check your connection and try again.": { - "description": "Message show when there was an error creating or sending a new message", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unsaved changes": "Alterações não salvas", - "@Unsaved changes": { - "description": "Title of the dialog shown when the user tries to leave with unsaved changes", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Are you sure you wish to close this page? Your unsent message will be lost.": "Tem certeza de que deseja fechar esta página? Suas mensagens não enviadas serão perdidas.", - "@Are you sure you wish to close this page? Your unsent message will be lost.": { - "description": "Body text of the dialog shown when the user tries leave with unsaved changes", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "New message": "Nova mensagem", - "@New message": { - "description": "Title of the new-message screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Add attachment": "Adicionar anexo", - "@Add attachment": { - "description": "Tooltip for the add-attachment button in the new-message screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Send message": "Enviar mensagem", - "@Send message": { - "description": "Tooltip for the send-message button in the new-message screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Select recipients": "Selecionar recipientes", - "@Select recipients": { - "description": "Tooltip for the button that allows users to select message recipients", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No recipients selected": "Nenhum recipiente selecionado", - "@No recipients selected": { - "description": "Hint displayed when the user has not selected any message recipients", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Message subject": "Assunto da mensagem", - "@Message subject": { - "description": "Hint text displayed in the input field for the message subject", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Message": "Mensagem", - "@Message": { - "description": "Hint text displayed in the input field for the message body", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Recipients": "Recipientes", - "@Recipients": { - "description": "Label for message recipients", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "plusRecipientCount": "+{count}", - "@plusRecipientCount": { - "description": "Shows the number of recipients that are selected but not displayed on screen.", - "type": "text", - "placeholders_order": [ - "count" - ], - "placeholders": { - "count": { - "example": 5 - } - } - }, - "Failed. Tap for options.": "Falhou. Toque para opções.", - "@Failed. Tap for options.": { - "description": "Short message shown on a message attachment when uploading has failed", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "courseForWhom": "para {studentShortName}", - "@courseForWhom": { - "description": "Describes for whom a course is for (i.e. for Bill)", - "type": "text", - "placeholders_order": [ - "studentShortName" - ], - "placeholders": { - "studentShortName": {} - } - }, - "messageLinkPostscript": "Sobre: {studentName}, {linkUrl}", - "@messageLinkPostscript": { - "description": "A postscript appended to new messages that clarifies which student is the subject of the message and also includes a URL for the related Canvas component (course, assignment, event, etc).", - "type": "text", - "placeholders_order": [ - "studentName", - "linkUrl" - ], - "placeholders": { - "studentName": {}, - "linkUrl": {} - } - }, - "There was an error loading this conversation": "Houve um erro ao carregar esta conversa", - "@There was an error loading this conversation": { - "description": "Message shown when a conversation fails to load", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Reply": "Responder", - "@Reply": { - "description": "Button label for replying to a conversation", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Reply All": "Responder a todos", - "@Reply All": { - "description": "Button label for replying to all conversation participants", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unknown User": "Usuário desconhecido", - "@Unknown User": { - "description": "Label used where the user name is not known", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "me": "eu", - "@me": { - "description": "First-person pronoun (i.e. 'me') that will be used in message author info, e.g. 'Me to 4 others' or 'Jon Snow to me'", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "authorToRecipient": "{authorName} a {recipientName}", - "@authorToRecipient": { - "description": "Author info for a single-recipient message; includes both the author name and the recipient name.", - "type": "text", - "placeholders_order": [ - "authorName", - "recipientName" - ], - "placeholders": { - "authorName": {}, - "recipientName": {} - } - }, - "authorToNOthers": "{howMany,plural, =1{{authorName} para 1 outro}other{{authorName} para {howMany} outros}}", - "@authorToNOthers": { - "description": "Author info for a mutli-recipient message; includes the author name and the number of recipients", - "type": "text", - "placeholders_order": [ - "authorName", - "howMany" - ], - "placeholders": { - "authorName": {}, - "howMany": {} - } - }, - "authorToRecipientAndNOthers": "{howMany,plural, =1{{authorName} para {recipientName} e 1 outro}other{{authorName} para {recipientName} e {howMany} outros}}", - "@authorToRecipientAndNOthers": { - "description": "Author info for a multi-recipient message; includes the author name, one recipient name, and the number of other recipients", - "type": "text", - "placeholders_order": [ - "authorName", - "recipientName", - "howMany" - ], - "placeholders": { - "authorName": {}, - "recipientName": {}, - "howMany": {} - } - }, - "Download": "Baixar", - "@Download": { - "description": "Label for the button that will begin downloading a file", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Open with another app": "Abrir com outro app", - "@Open with another app": { - "description": "Label for the button that will allow users to open a file with another app", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There are no installed applications that can open this file": "Não há aplicativos instalados que podem abrir este arquivo", - "@There are no installed applications that can open this file": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unsupported File": "Arquivo não suportado", - "@Unsupported File": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "This file is unsupported and can’t be viewed through the app": "Este arquivo não é suportado e não pode ser visto através do app", - "@This file is unsupported and can’t be viewed through the app": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unable to play this media file": "Não é possível reproduzir este arquivo de mídia", - "@Unable to play this media file": { - "description": "Message shown when audio or video media could not be played", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unable to load this image": "Não é possível carregar esta mensagem", - "@Unable to load this image": { - "description": "Message shown when an image file could not be loaded or displayed", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading this file": "Houve um erro ao carregar este arquivo", - "@There was an error loading this file": { - "description": "Message shown when a file could not be loaded or displayed", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Courses": "Sem Cursos", - "@No Courses": { - "description": "Title for having no courses", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Your student’s courses might not be published yet.": "Os cursos do seu aluno podem ainda não ter sido publicados.", - "@Your student’s courses might not be published yet.": { - "description": "Message for having no courses", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading your student’s courses.": "Ocorreu um erro ao carregar os cursos dos seus alunos.", - "@There was an error loading your student’s courses.": { - "description": "Message displayed when the list of student courses could not be loaded", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Grade": "Sem nota", - "@No Grade": { - "description": "Message shown when there is currently no grade available for a course", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Filter by": "Filtrar por", - "@Filter by": { - "description": "Title for list of terms to filter grades by", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Grades": "Notas", - "@Grades": { - "description": "Label for the \"Grades\" tab in course details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Syllabus": "Programa", - "@Syllabus": { - "description": "Label for the \"Syllabus\" tab in course details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Front Page": "Primeira página", - "@Front Page": { - "description": "Label for the \"Front Page\" tab in course details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Summary": "Resumo", - "@Summary": { - "description": "Label for the \"Summary\" tab in course details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Send a message about this course": "Enviar uma mensagem sobre este curso", - "@Send a message about this course": { - "description": "Accessibility hint for the course messaage floating action button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Total Grade": "Nota Total", - "@Total Grade": { - "description": "Label for the total grade in the course", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Graded": "Avaliado", - "@Graded": { - "description": "Label for assignments that have been graded", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Submitted": "Enviado", - "@Submitted": { - "description": "Label for assignments that have been submitted", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Not Submitted": "Não Enviado", - "@Not Submitted": { - "description": "Label for assignments that have not been submitted", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Late": "Atrasado", - "@Late": { - "description": "Label for assignments that have been marked late or submitted late", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Missing": "Faltante", - "@Missing": { - "description": "Label for assignments that have been marked missing or are not submitted and past the due date", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "-": "-", - "@-": { - "description": "Value representing no score for student submission", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "All Grading Periods": "Todos os períodos de avaliação", - "@All Grading Periods": { - "description": "Label for selecting all grading periods", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Assignments": "Sem tarefas", - "@No Assignments": { - "description": "Title for the no assignments message", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "It looks like assignments haven't been created in this space yet.": "Parece que tarefas ainda não foram criadas nesse espaço.", - "@It looks like assignments haven't been created in this space yet.": { - "description": "Message for no assignments", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading the summary details for this course.": "Houve um erro ao carregar os detalhes do resumo para este curso.", - "@There was an error loading the summary details for this course.": { - "description": "Message shown when the course summary could not be loaded", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Summary": "Sem resumo", - "@No Summary": { - "description": "Title displayed when there are no items in the course summary", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "This course does not have any assignments or calendar events yet.": "Este curso ainda não tem quaisquer tarefas ou eventos de calendário.", - "@This course does not have any assignments or calendar events yet.": { - "description": "Message displayed when there are no items in the course summary", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "gradeFormatScoreOutOfPointsPossible": "{score} / {pointsPossible}", - "@gradeFormatScoreOutOfPointsPossible": { - "description": "Formatted string for a student score out of the points possible", - "type": "text", - "placeholders_order": [ - "score", - "pointsPossible" - ], - "placeholders": { - "score": {}, - "pointsPossible": {} - } - }, - "contentDescriptionScoreOutOfPointsPossible": "{score} de {pointsPossible} pontos", - "@contentDescriptionScoreOutOfPointsPossible": { - "description": "Formatted string for a student score out of the points possible", - "type": "text", - "placeholders_order": [ - "score", - "pointsPossible" - ], - "placeholders": { - "score": {}, - "pointsPossible": {} - } - }, - "gradesSubjectMessage": "Sobre: {studentName}, Notas", - "@gradesSubjectMessage": { - "description": "The subject line for a message to a teacher regarding a student's grades", - "type": "text", - "placeholders_order": [ - "studentName" - ], - "placeholders": { - "studentName": {} - } - }, - "syllabusSubjectMessage": "Sobre: {studentName}, Programa de estudos", - "@syllabusSubjectMessage": { - "description": "The subject line for a message to a teacher regarding a course syllabus", - "type": "text", - "placeholders_order": [ - "studentName" - ], - "placeholders": { - "studentName": {} - } - }, - "frontPageSubjectMessage": "Sobre: {studentName}, Primeira página", - "@frontPageSubjectMessage": { - "description": "The subject line for a message to a teacher regarding a course front page", - "type": "text", - "placeholders_order": [ - "studentName" - ], - "placeholders": { - "studentName": {} - } - }, - "assignmentSubjectMessage": "Sobre: {studentName}, Tarefa - {assignmentName}", - "@assignmentSubjectMessage": { - "description": "The subject line for a message to a teacher regarding a student's assignment", - "type": "text", - "placeholders_order": [ - "studentName", - "assignmentName" - ], - "placeholders": { - "studentName": {}, - "assignmentName": {} - } - }, - "eventSubjectMessage": "Sobre: {studentName}, Evento - {eventTitle}", - "@eventSubjectMessage": { - "description": "The subject line for a message to a teacher regarding a calendar event", - "type": "text", - "placeholders_order": [ - "studentName", - "eventTitle" - ], - "placeholders": { - "studentName": {}, - "eventTitle": {} - } - }, - "There is no page information available.": "Não há informação da página disponível.", - "@There is no page information available.": { - "description": "Description for when no page information is available", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Assignment Details": "Detalhes da tarefa", - "@Assignment Details": { - "description": "Title for the page that shows details for an assignment", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "assignmentTotalPoints": "{points} pts", - "@assignmentTotalPoints": { - "description": "Label used for the total points the assignment is worth", - "type": "text", - "placeholders_order": [ - "points" - ], - "placeholders": { - "points": {} - } - }, - "assignmentTotalPointsAccessible": "{points} pontos", - "@assignmentTotalPointsAccessible": { - "description": "Screen reader label used for the total points the assignment is worth", - "type": "text", - "placeholders_order": [ - "points" - ], - "placeholders": { - "points": {} - } - }, - "Due": "Vencimento", - "@Due": { - "description": "Label for an assignment due date", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Grade": "Avaliar", - "@Grade": { - "description": "Label for the section that displays an assignment's grade", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Locked": "Bloqueado(a)", - "@Locked": { - "description": "Label for when an assignment is locked", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "assignmentLockedModule": "Esta tarefa está bloqueada pelo módulo \"{moduleName}\".", - "@assignmentLockedModule": { - "description": "The locked description when an assignment is locked by a module", - "type": "text", - "placeholders_order": [ - "moduleName" - ], - "placeholders": { - "moduleName": {} - } - }, - "Remind Me": "Lembrar-me", - "@Remind Me": { - "description": "Label for the row to set reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Set a date and time to be notified of this specific assignment.": "Definir uma data e hora para ser notificado sobre esta tarefa específica.", - "@Set a date and time to be notified of this specific assignment.": { - "description": "Description for row to set reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You will be notified about this assignment on…": "Você será notificado sobre esta tarefa em...", - "@You will be notified about this assignment on…": { - "description": "Description for when a reminder is set", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Instructions": "Instruções", - "@Instructions": { - "description": "Label for the description of the assignment when it has quiz instructions", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Send a message about this assignment": "Enviar uma mensagem sobre esta tarefa", - "@Send a message about this assignment": { - "description": "Accessibility hint for the assignment messaage floating action button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "This app is not authorized for use.": "Este aplicativo não é autorizado para uso.", - "@This app is not authorized for use.": { - "description": "The error shown when the app being used is not verified by Canvas", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The server you entered is not authorized for this app.": "O servidor que você digitou não está autorizado para este aplicativo.", - "@The server you entered is not authorized for this app.": { - "description": "The error shown when the desired login domain is not verified by Canvas", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The user agent for this app is not authorized.": "O agente de usuário para este aplicativo não é autorizado.", - "@The user agent for this app is not authorized.": { - "description": "The error shown when the user agent during verification is not verified by Canvas", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "We were unable to verify the server for use with this app.": "Não fomos capazes de verificar o servidor para uso com este aplicativo.", - "@We were unable to verify the server for use with this app.": { - "description": "The generic error shown when we are unable to verify with Canvas", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Reminders": "Lembretes", - "@Reminders": { - "description": "Name of the system notification channel for assignment and event reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Notifications for reminders about assignments and calendar events": "Notificações para lembretes sobre tarefas e eventos do calendário", - "@Notifications for reminders about assignments and calendar events": { - "description": "Description of the system notification channel for assignment and event reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Reminders have changed!": "Lembretes mudaram!", - "@Reminders have changed!": { - "description": "Title of the dialog shown when the user needs to update their reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "In order to provide you with a better experience, we have updated how reminders work. You can add new reminders by viewing an assignment or calendar event and tapping the switch under the \"Remind Me\" section.\n\nBe aware that any reminders created with older versions of this app will not be compatible with the new changes and you will need to create them again.": "Para fornecer uma melhor experiência, atualizamos como os lembretes funcionam. É possível adicionar novos lembretes ao visualizar uma tarefa ou evento de calendário e tocar no interruptor sob a seção \"Lembrar de mim\".\n\nEsteja ciente de que quaisquer lembretes criados com versões antigas deste app não serão compatíveis com as novas alterações e será necessário criá-los novamente.", - "@In order to provide you with a better experience, we have updated how reminders work. You can add new reminders by viewing an assignment or calendar event and tapping the switch under the \"Remind Me\" section.\n\nBe aware that any reminders created with older versions of this app will not be compatible with the new changes and you will need to create them again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Not a parent?": "Não é um pai?", - "@Not a parent?": { - "description": "Title for the screen that shows when the user is not observing any students", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "We couldn't find any students associated with this account": "Não conseguimos encontrar quaisquer alunos associados a esta conta", - "@We couldn't find any students associated with this account": { - "description": "Subtitle for the screen that shows when the user is not observing any students", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Are you a student or teacher?": "Você é um aluno ou professor?", - "@Are you a student or teacher?": { - "description": "Label for button that will show users the option to view other Canvas apps in the Play Store", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "One of our other apps might be a better fit. Tap one to visit the Play Store.": "Um dos nossos outros aplicativos pode ser uma escolha melhor. Toque em um para visitar o Play Store.", - "@One of our other apps might be a better fit. Tap one to visit the Play Store.": { - "description": "Description of options to view other Canvas apps in the Play Store", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Return to Login": "Voltar ao login", - "@Return to Login": { - "description": "Label for the button that returns the user to the login screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "STUDENT": "ALUNO", - "@STUDENT": { - "description": "The \"student\" portion of the \"Canvas Student\" app name, in all caps. \"Canvas\" is excluded in this context as it will be displayed to the user as a wordmark image", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "TEACHER": "PROFESSOR", - "@TEACHER": { - "description": "The \"teacher\" portion of the \"Canvas Teacher\" app name, in all caps. \"Canvas\" is excluded in this context as it will be displayed to the user as a wordmark image", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Canvas Student": "Canvas Student", - "@Canvas Student": { - "description": "The name of the Canvas Student app. Only \"Student\" should be translated as \"Canvas\" is a brand name in this context and should not be translated.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Canvas Teacher": "Canvas Teacher", - "@Canvas Teacher": { - "description": "The name of the Canvas Teacher app. Only \"Teacher\" should be translated as \"Canvas\" is a brand name in this context and should not be translated.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Alerts": "Nenhum alerta", - "@No Alerts": { - "description": "The title for the empty message to show to users when there are no alerts for the student.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There’s nothing to be notified of yet.": "Ainda não há nada para ser notificado.", - "@There’s nothing to be notified of yet.": { - "description": "The empty message to show to users when there are no alerts for the student.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "dismissAlertLabel": "Descartar {alertTitle}", - "@dismissAlertLabel": { - "description": "Accessibility label to dismiss an alert", - "type": "text", - "placeholders_order": [ - "alertTitle" - ], - "placeholders": { - "alertTitle": {} - } - }, - "Course Announcement": "Aviso do curso", - "@Course Announcement": { - "description": "Title for alerts when there is a course announcement", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Institution Announcement": "Aviso da instituição", - "@Institution Announcement": { - "description": "Title for alerts when there is an institution announcement", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "assignmentGradeAboveThreshold": "Nota da tarefa acima {threshold}", - "@assignmentGradeAboveThreshold": { - "description": "Title for alerts when an assignment grade is above the threshold value", - "type": "text", - "placeholders_order": [ - "threshold" - ], - "placeholders": { - "threshold": {} - } - }, - "assignmentGradeBelowThreshold": "Nota da tarefa abaixo {threshold}", - "@assignmentGradeBelowThreshold": { - "description": "Title for alerts when an assignment grade is below the threshold value", - "type": "text", - "placeholders_order": [ - "threshold" - ], - "placeholders": { - "threshold": {} - } - }, - "courseGradeAboveThreshold": "Nota do curso acima {threshold}", - "@courseGradeAboveThreshold": { - "description": "Title for alerts when a course grade is above the threshold value", - "type": "text", - "placeholders_order": [ - "threshold" - ], - "placeholders": { - "threshold": {} - } - }, - "courseGradeBelowThreshold": "Nota do curso abaixo {threshold}", - "@courseGradeBelowThreshold": { - "description": "Title for alerts when a course grade is below the threshold value", - "type": "text", - "placeholders_order": [ - "threshold" - ], - "placeholders": { - "threshold": {} - } - }, - "Settings": "Configurações", - "@Settings": { - "description": "Title for the settings screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Theme": "Tema", - "@Theme": { - "description": "Label for the light/dark theme section in the settings page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Dark Mode": "Modo escuro", - "@Dark Mode": { - "description": "Label for the button that enables dark mode", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Light Mode": "Modo claro", - "@Light Mode": { - "description": "Label for the button that enables light mode", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "High Contrast Mode": "Modo de alto contraste", - "@High Contrast Mode": { - "description": "Label for the switch that toggles high contrast mode", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Use Dark Theme in Web Content": "Usar tema escuro em conteúdo web", - "@Use Dark Theme in Web Content": { - "description": "Label for the switch that toggles dark mode for webviews", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Appearance": "Aparência", - "@Appearance": { - "description": "Label for the appearance section in the settings page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Successfully submitted!": "Enviado com sucesso!", - "@Successfully submitted!": { - "description": "Title displayed in the grade cell for an assignment that has been submitted", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "submissionStatusSuccessSubtitle": "Esta tarefa foi enviada em {date} às {time} e está esperando avaliação", - "@submissionStatusSuccessSubtitle": { - "description": "Subtitle displayed in the grade cell for an assignment that has been submitted and is awaiting a grade", - "type": "text", - "placeholders_order": [ - "date", - "time" - ], - "placeholders": { - "date": {}, - "time": {} - } - }, - "outOfPoints": "{howMany,plural, =1{De 1 ponto}other{De {points} pontos}}", - "@outOfPoints": { - "description": "Description for an assignment grade that has points without a current scoroe", - "type": "text", - "placeholders_order": [ - "points", - "howMany" - ], - "placeholders": { - "points": {}, - "howMany": {} - } - }, - "Excused": "Dispensado", - "@Excused": { - "description": "Grading status for an assignment marked as excused", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Complete": "Concluído", - "@Complete": { - "description": "Grading status for an assignment marked as complete", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Incomplete": "Incompleto", - "@Incomplete": { - "description": "Grading status for an assignment marked as incomplete", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "minus": "menos", - "@minus": { - "description": "Screen reader-friendly replacement for the \"-\" character in letter grades like \"A-\"", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "latePenalty": "Penalidade por atraso (-{pointsLost})", - "@latePenalty": { - "description": "Text displayed when a late penalty has been applied to the assignment", - "type": "text", - "placeholders_order": [ - "pointsLost" - ], - "placeholders": { - "pointsLost": {} - } - }, - "finalGrade": "Nota final: {grade}", - "@finalGrade": { - "description": "Text that displays the final grade of an assignment", - "type": "text", - "placeholders_order": [ - "grade" - ], - "placeholders": { - "grade": {} - } - }, - "Alert Settings": "Configurações do alerta", - "@Alert Settings": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Alert me when…": "Avisem-me quando...", - "@Alert me when…": { - "description": "Header for the screen where the observer chooses the thresholds that will determine when they receive alerts (e.g. when an assignment is graded below 70%)", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Course grade below": "Nota do curso abaixo", - "@Course grade below": { - "description": "Label describing the threshold for when the course grade is below a certain percentage", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Course grade above": "Nota do curso acima", - "@Course grade above": { - "description": "Label describing the threshold for when the course grade is above a certain percentage", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Assignment missing": "Tarefa em falta", - "@Assignment missing": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Assignment grade below": "Nota da tarefa abaixo", - "@Assignment grade below": { - "description": "Label describing the threshold for when an assignment is graded below a certain percentage", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Assignment grade above": "Nota da tarefa acima", - "@Assignment grade above": { - "description": "Label describing the threshold for when an assignment is graded above a certain percentage", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Course Announcements": "Avisos do Curso", - "@Course Announcements": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Institution Announcements": "Avisos da Instituição", - "@Institution Announcements": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Never": "Nunca", - "@Never": { - "description": "Indication that tells the user they will not receive alert notifications of a specific kind", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Grade percentage": "Porcentagem da nota", - "@Grade percentage": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading your student's alerts.": "Houve um erro ao carregar os alertas do seu aluno.", - "@There was an error loading your student's alerts.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Must be below 100": "Deve ser abaixo de 100", - "@Must be below 100": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "mustBeBelowN": "Deve ser abaixo de {percentage}", - "@mustBeBelowN": { - "description": "Validation error to the user that they must choose a percentage below 'n'", - "type": "text", - "placeholders_order": [ - "percentage" - ], - "placeholders": { - "percentage": { - "example": 5 - } - } - }, - "mustBeAboveN": "Deve ser acima de {percentage}", - "@mustBeAboveN": { - "description": "Validation error to the user that they must choose a percentage above 'n'", - "type": "text", - "placeholders_order": [ - "percentage" - ], - "placeholders": { - "percentage": { - "example": 5 - } - } - }, - "Select Student Color": "Selecionar cor do aluno", - "@Select Student Color": { - "description": "Title for screen that allows users to assign a color to a specific student", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Electric, blue": "Elétrica, azul", - "@Electric, blue": { - "description": "Name of the Electric (blue) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Plum, Purple": "Ameixa, roxo", - "@Plum, Purple": { - "description": "Name of the Plum (purple) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Barney, Fuschia": "Barney, Fuschia", - "@Barney, Fuschia": { - "description": "Name of the Barney (fuschia) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Raspberry, Red": "Framboesa, vermelho", - "@Raspberry, Red": { - "description": "Name of the Raspberry (red) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Fire, Orange": "Fogo, laranja", - "@Fire, Orange": { - "description": "Name of the Fire (orange) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Shamrock, Green": "Trevo, verde", - "@Shamrock, Green": { - "description": "Name of the Shamrock (green) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "An error occurred while saving your selection. Please try again.": "Um erro ocorreu ao salvar a sua seleção. Por favor, tente novamente.", - "@An error occurred while saving your selection. Please try again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "changeStudentColorLabel": "Alterar cor para {studentName}", - "@changeStudentColorLabel": { - "description": "Accessibility label for the button that lets users change the color associated with a specific student", - "type": "text", - "placeholders_order": [ - "studentName" - ], - "placeholders": { - "studentName": {} - } - }, - "Teacher": "Professor", - "@Teacher": { - "description": "Label for the Teacher enrollment type", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Student": "Aluno", - "@Student": { - "description": "Label for the Student enrollment type", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "TA": "Assistente", - "@TA": { - "description": "Label for the Teaching Assistant enrollment type (also known as Teacher Aid or Education Assistant), reduced to a short acronym/initialism if appropriate.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Observer": "Observador", - "@Observer": { - "description": "Label for the Observer enrollment type", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Use Camera": "Usar câmera", - "@Use Camera": { - "description": "Label for the action item that lets the user capture a photo using the device camera", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Upload File": "Carregar arquivo", - "@Upload File": { - "description": "Label for the action item that lets the user upload a file from their device", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Choose from Gallery": "Escolher na galeria", - "@Choose from Gallery": { - "description": "Label for the action item that lets the user select a photo from their device gallery", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Preparing…": "Preparando...", - "@Preparing…": { - "description": "Message shown while a file is being prepared to attach to a message", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Add student with…": "Adicionar aluno com...", - "@Add student with…": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Add Student": "Adicionar Estudante", - "@Add Student": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You are not observing any students.": "Você não está observando quaisquer alunos.", - "@You are not observing any students.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading your students.": "Houve um erro ao carregar seus alunos.", - "@There was an error loading your students.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Pairing Code": "Código de emparelhamento", - "@Pairing Code": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Students can obtain a pairing code through the Canvas website": "Os alunos podem obter um código de emparelhamento no site do Canvas", - "@Students can obtain a pairing code through the Canvas website": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Enter the student pairing code provided to you. If the pairing code doesn't work, it may have expired": "Insira o código de emparelhamento do aluno fornecido. Se o código de emparelhamento não funcionar, ele pode ter expirado", - "@Enter the student pairing code provided to you. If the pairing code doesn't work, it may have expired": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Your code is incorrect or expired.": "Seu código está incorreto ou expirado.", - "@Your code is incorrect or expired.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Something went wrong trying to create your account, please reach out to your school for assistance.": "Algo deu errado ao tentar criar sua conta. Entre em contato com sua escola para obter ajuda.", - "@Something went wrong trying to create your account, please reach out to your school for assistance.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "QR Code": "Código QR", - "@QR Code": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Students can create a QR code using the Canvas Student app on their mobile device": "Os alunos podem criar um código QR usando o aplicativo Canvas Student em seu dispositivo móvel", - "@Students can create a QR code using the Canvas Student app on their mobile device": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Add new student": "Adicionar novo aluno", - "@Add new student": { - "description": "Semantics label for the FAB on the Manage Students Screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Select": "Selecionar", - "@Select": { - "description": "Hint text to tell the user to choose one of two options", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I have a Canvas account": "Eu tenho uma conta do Canvas", - "@I have a Canvas account": { - "description": "Option to select for users that have a canvas account", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I don't have a Canvas account": "Eu não tenho uma conta do Canvas", - "@I don't have a Canvas account": { - "description": "Option to select for users that don't have a canvas account", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Create Account": "Criar conta", - "@Create Account": { - "description": "Button text for account creation confirmation", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Full Name": "Nome completo", - "@Full Name": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Email Address": "Endereço de e-mail", - "@Email Address": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Password": "Senha", - "@Password": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Full Name…": "Nome completo...", - "@Full Name…": { - "description": "hint label for inside form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Email…": "E-mail...", - "@Email…": { - "description": "hint label for inside form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Password…": "Senha...", - "@Password…": { - "description": "hint label for inside form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Please enter full name": "Insira nome completo", - "@Please enter full name": { - "description": "Error message for form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Please enter an email address": "Insira um endereço de e-mail", - "@Please enter an email address": { - "description": "Error message for form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Please enter a valid email address": "Insira um endereço de e-mail válido", - "@Please enter a valid email address": { - "description": "Error message for form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Password is required": "Senha é necessária", - "@Password is required": { - "description": "Error message for form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Password must contain at least 8 characters": "Senha deve ter pelo menos 8 caracteres", - "@Password must contain at least 8 characters": { - "description": "Error message for form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "qrCreateAccountTos": "Ao tocar em ‘Criar conta’, você concorda com os {termsOfService} e reconhece a {privacyPolicy}", - "@qrCreateAccountTos": { - "description": "The text show on the account creation screen", - "type": "text", - "placeholders_order": [ - "termsOfService", - "privacyPolicy" - ], - "placeholders": { - "termsOfService": {}, - "privacyPolicy": {} - } - }, - "Terms of Service": "Termos de Serviço", - "@Terms of Service": { - "description": "Label for the Canvas Terms of Service agreement. This will be used in the qrCreateAccountTos text and will be highlighted and clickable", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Privacy Policy": "Política de privacidade", - "@Privacy Policy": { - "description": "Label for the Canvas Privacy Policy agreement. This will be used in the qrCreateAccountTos text and will be highlighted and clickable", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "View the Privacy Policy": "Visualizar Política de Privacidade", - "@View the Privacy Policy": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Already have an account? ": "Já tem uma conta? ", - "@Already have an account? ": { - "description": "Part of multiline text span, includes AccountSignIn1-2, in that order", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Sign In": "Conectar", - "@Sign In": { - "description": "Part of multiline text span, includes AccountSignIn1-2, in that order", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Hide Password": "Ocultar senha", - "@Hide Password": { - "description": "content description for password hide button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Show Password": "Exibir senha", - "@Show Password": { - "description": "content description for password show button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Terms of Service Link": "Link dos Termos de Serviço", - "@Terms of Service Link": { - "description": "content description for terms of service link", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Privacy Policy Link": "Link da Política de Privacidade", - "@Privacy Policy Link": { - "description": "content description for privacy policy link", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Event": "Evento", - "@Event": { - "description": "Title for the event details screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Date": "Data", - "@Date": { - "description": "Label for the event date", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Location": "Localização", - "@Location": { - "description": "Label for the location information", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Location Specified": "Nenhum Local Especificado", - "@No Location Specified": { - "description": "Description for events that do not have a location", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "eventTime": "{startAt} - {endAt}", - "@eventTime": { - "description": "The time the event is happening, example: \"2:00 pm - 4:00 pm\"", - "type": "text", - "placeholders_order": [ - "startAt", - "endAt" - ], - "placeholders": { - "startAt": {}, - "endAt": {} - } - }, - "Set a date and time to be notified of this event.": "Definir uma data e hora para ser notificado sobre este evento.", - "@Set a date and time to be notified of this event.": { - "description": "Description for row to set event reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You will be notified about this event on…": "Você será notificado sobre este evento em...", - "@You will be notified about this event on…": { - "description": "Description for when an event reminder is set", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Share Your Love for the App": "Divulgar o seu amor pelo aplicativo", - "@Share Your Love for the App": { - "description": "Label for option to open the app store", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Tell us about your favorite parts of the app": "Conte-nos as suas partes favoritas do aplicativo", - "@Tell us about your favorite parts of the app": { - "description": "Description for option to open the app store", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Legal": "Legal", - "@Legal": { - "description": "Label for legal information option", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Privacy policy, terms of use, open source": "Política de privacidade, termos e uso, fonte aberta", - "@Privacy policy, terms of use, open source": { - "description": "Description for legal information option", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Idea for Canvas Parent App [Android]": "Ideia para o Aplicativo Canvas Parent [Android]", - "@Idea for Canvas Parent App [Android]": { - "description": "The subject for the email to request a feature", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The following information will help us better understand your idea:": "As informações a seguir nos ajudarão a compreender melhor a sua ideia:", - "@The following information will help us better understand your idea:": { - "description": "The header for the users information that is attached to a feature request", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Domain:": "Domínio:", - "@Domain:": { - "description": "The label for the Canvas domain of the logged in user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "User ID:": "ID de Usuário:", - "@User ID:": { - "description": "The label for the Canvas user ID of the logged in user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Email:": "E-mail:", - "@Email:": { - "description": "The label for the eamil of the logged in user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Locale:": "Localidade:", - "@Locale:": { - "description": "The label for the locale of the logged in user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Terms of Use": "Termos de Uso", - "@Terms of Use": { - "description": "Label for the terms of use", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Canvas on GitHub": "Canvas no GitHub", - "@Canvas on GitHub": { - "description": "Label for the button that opens the Canvas project on GitHub's website", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was a problem loading the Terms of Use": "Houve um problema ao carregar os Termos de Uso", - "@There was a problem loading the Terms of Use": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Device": "Dispositivo", - "@Device": { - "description": "Label used for device manufacturer/model in the error report", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "OS Version": "Versão OS", - "@OS Version": { - "description": "Label used for device operating system version in the error report", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Version Number": "Número da versão", - "@Version Number": { - "description": "Label used for the app version number in the error report", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Report A Problem": "Relatar um problema", - "@Report A Problem": { - "description": "Title used for generic dialog to report problems", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Subject": "Assunto", - "@Subject": { - "description": "Label used for Subject text field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "A subject is required.": "Um assunto é necessário.", - "@A subject is required.": { - "description": "Error shown when the subject field is empty", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "An email address is required.": "Um endereço de e-mail é necessário.", - "@An email address is required.": { - "description": "Error shown when the email field is empty", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Description": "Descrição", - "@Description": { - "description": "Label used for Description text field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "A description is required.": "Uma descrição é necessária.", - "@A description is required.": { - "description": "Error shown when the description field is empty", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "How is this affecting you?": "Como isso está afetando você?", - "@How is this affecting you?": { - "description": "Label used for the dropdown to select how severe the issue is", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "send": "enviar", - "@send": { - "description": "Label used for send button when reporting a problem", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Just a casual question, comment, idea, suggestion…": "Só uma pergunta casual, comentário, idéia, sugestão ...", - "@Just a casual question, comment, idea, suggestion…": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I need some help but it's not urgent.": "Preciso de ajuda, mas não é urgente.", - "@I need some help but it's not urgent.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Something's broken but I can work around it to get what I need done.": "Alguma coisa não está funcionando, mas eu posso trabalhar em torno dela para conseguir fazer o que precisa ser feito.", - "@Something's broken but I can work around it to get what I need done.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I can't get things done until I hear back from you.": "Eu não posso fazer as coisas até que eu receba uma resposta de vocês.", - "@I can't get things done until I hear back from you.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "EXTREME CRITICAL EMERGENCY!!": "EMERGÊNCIA CRÍTICA EXTREMA!!", - "@EXTREME CRITICAL EMERGENCY!!": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Not Graded": "Sem nota", - "@Not Graded": { - "description": "Description for an assignment has not been graded.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Login flow: Normal": "Fluxo de login: Normal", - "@Login flow: Normal": { - "description": "Description for the normal login flow", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Login flow: Canvas": "Fluxo de login: Canvas", - "@Login flow: Canvas": { - "description": "Description for the Canvas login flow", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Login flow: Site Admin": "Fluxo de login: Administrador do site", - "@Login flow: Site Admin": { - "description": "Description for the Site Admin login flow", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Login flow: Skip mobile verify": "Fluxo de login: Pular verificação móvel", - "@Login flow: Skip mobile verify": { - "description": "Description for the login flow that skips domain verification for mobile", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Act As User": "Agir como usuário", - "@Act As User": { - "description": "Label for the button that allows the user to act (masquerade) as another user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Stop Acting as User": "Parar de Agir como Usuário", - "@Stop Acting as User": { - "description": "Label for the button that allows the user to stop acting (masquerading) as another user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "actingAsUser": "Você está agindo como {userName}", - "@actingAsUser": { - "description": "Message shown while acting (masquerading) as another user", - "type": "text", - "placeholders_order": [ - "userName" - ], - "placeholders": { - "userName": {} - } - }, - "\"Act as\" is essentially logging in as this user without a password. You will be able to take any action as if you were this user, and from other users' points of views, it will be as if this user performed them. However, audit logs record that you were the one who performed the actions on behalf of this user.": "\"Agir como\" é essencialmente fazer logon como este usuário sem uma senha. Você poderá realizar qualquer ação como se você fosse este usuário, e no ponto de vista dos outros usuários, será como se este usuário a estivesse executando. Contudo, logs de auditoria registram o fato de que você era a pessoa que realizou as ações em nome desse usuário.", - "@\"Act as\" is essentially logging in as this user without a password. You will be able to take any action as if you were this user, and from other users' points of views, it will be as if this user performed them. However, audit logs record that you were the one who performed the actions on behalf of this user.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Domain": "Domínio", - "@Domain": { - "description": "Text field hint for domain url input", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You must enter a valid domain": "É necessário inserir um domínio válido", - "@You must enter a valid domain": { - "description": "Message displayed for domain input error", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "User ID": "ID de Usuário", - "@User ID": { - "description": "Text field hint for user ID input", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You must enter a user id": "É necessário inserir uma id de usuário", - "@You must enter a user id": { - "description": "Message displayed for user Id input error", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error trying to act as this user. Please check the Domain and User ID and try again.": "Houve um erro ao tentar agir como este usuário. Verifique o Domínio e a ID de usuário e tente novamente.", - "@There was an error trying to act as this user. Please check the Domain and User ID and try again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "endMasqueradeMessage": "Você parará de agir como {userName} e voltará à sua conta original.", - "@endMasqueradeMessage": { - "description": "Confirmation message displayed when the user wants to stop acting (masquerading) as another user", - "type": "text", - "placeholders_order": [ - "userName" - ], - "placeholders": { - "userName": {} - } - }, - "endMasqueradeLogoutMessage": "Você parará de agir como {userName} e será desconectado.", - "@endMasqueradeLogoutMessage": { - "description": "Confirmation message displayed when the user wants to stop acting (masquerading) as another user and will be logged out.", - "type": "text", - "placeholders_order": [ - "userName" - ], - "placeholders": { - "userName": {} - } - }, - "How are we doing?": "Como estamos indo?", - "@How are we doing?": { - "description": "Title for dialog asking user to rate the app out of 5 stars.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Don't show again": "Não mostrar de novo", - "@Don't show again": { - "description": "Button to prevent the rating dialog from showing again.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "What can we do better?": "O que podemos fazer melhor?", - "@What can we do better?": { - "description": "Hint text for providing a comment with the rating.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Send Feedback": "Enviar Comentários", - "@Send Feedback": { - "description": "Button to send rating with feedback", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "ratingDialogEmailSubject": "Sugsetões para Android - Canvas Parent {version}", - "@ratingDialogEmailSubject": { - "description": "The subject for an email to provide feedback for CanvasParent.", - "type": "text", - "placeholders_order": [ - "version" - ], - "placeholders": { - "version": {} - } - }, - "starRating": "{position,plural, =1{{position} estrela}other{{position} estrelas}}", - "@starRating": { - "description": "Accessibility label for the 1 stars to 5 stars rating", - "type": "text", - "placeholders_order": [ - "position" - ], - "placeholders": { - "position": { - "example": 1 - } - } - }, - "Student Pairing": "Emparelhamento do aluno", - "@Student Pairing": { - "description": "Title for the screen where users can pair to students using a QR code", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Open Canvas Student": "Abrir Canvas Student", - "@Open Canvas Student": { - "description": "Title for QR pairing tutorial screen instructing users to open the Canvas Student app", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You'll need to open your student's Canvas Student app to continue. Go into Main Menu > Settings > Pair with Observer and scan the QR code you see there.": "Você precisará abrir o aplicativo Canvas Student do aluno para continuar. Vá para o Menu Principal > Configurações > Emparelhar com o Observer e escaneie o código QR que você vê lá.", - "@You'll need to open your student's Canvas Student app to continue. Go into Main Menu > Settings > Pair with Observer and scan the QR code you see there.": { - "description": "Message explaining how QR code pairing works", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Screenshot showing location of pairing QR code generation in the Canvas Student app": "Captura de tela mostrando o local da geração de código QR emparelhado no aplicativo Canvas Student", - "@Screenshot showing location of pairing QR code generation in the Canvas Student app": { - "description": "Content Description for qr pairing tutorial screenshot", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Expired QR Code": "Código QR expirado", - "@Expired QR Code": { - "description": "Error title shown when the users scans a QR code that has expired", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The QR code you scanned may have expired. Refresh the code on the student's device and try again.": "O código QR que você escaneou pode ter expirado. Atualize o código no dispositivo do aluno e tente novamente.", - "@The QR code you scanned may have expired. Refresh the code on the student's device and try again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "A network error occurred when adding this student. Check your connection and try again.": "Ocorreu um erro de rede ao adicionar este aluno. Verifique sua conexão e tente novamente.", - "@A network error occurred when adding this student. Check your connection and try again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Invalid QR Code": "Código QR inválido", - "@Invalid QR Code": { - "description": "Error title shown when the user scans an invalid QR code", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Incorrect Domain": "Domínio incorreto", - "@Incorrect Domain": { - "description": "Error title shown when the users scane a QR code for a student that belongs to a different domain", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The student you are trying to add belongs to a different school. Log in or create an account with that school to scan this code.": "O aluno que você está tentando adicionar pertence a uma escola diferente. Faça login ou crie uma conta nessa escola para escanear esse código.", - "@The student you are trying to add belongs to a different school. Log in or create an account with that school to scan this code.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Camera Permission": "Permissão para câmera", - "@Camera Permission": { - "description": "Error title shown when the user wans to scan a QR code but has denied the camera permission", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "This will unpair and remove all enrollments for this student from your account.": "Isso desemparelhará e removerá todas as matrículas desse aluno da sua conta.", - "@This will unpair and remove all enrollments for this student from your account.": { - "description": "Confirmation message shown when the user tries to delete a student from their account", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was a problem removing this student from your account. Please check your connection and try again.": "Ocorreu um problema ao remover este aluno da sua conta. Verifique a sua conexão e tente novamente.", - "@There was a problem removing this student from your account. Please check your connection and try again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Cancel": "Cancelar", - "@Cancel": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "next": "Seguinte", - "@next": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "ok": "OK", - "@ok": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Yes": "Sim", - "@Yes": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No": "Não", - "@No": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Retry": "Tentar novamente", - "@Retry": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Delete": "Excluir", - "@Delete": { - "description": "Label used for general delete/remove actions", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Done": "Feito", - "@Done": { - "description": "Label for general done/finished actions", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Refresh": "Atualizar", - "@Refresh": { - "description": "Label for button to refresh data from the web", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "View Description": "Ver descrição", - "@View Description": { - "description": "Button to view the description for an event or assignment", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "expanded": "expandido", - "@expanded": { - "description": "Description for the accessibility reader for list groups that are expanded", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "collapsed": "recolhido", - "@collapsed": { - "description": "Description for the accessibility reader for list groups that are expanded", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "An unexpected error occurred": "Ocorreu um erro inesperado", - "@An unexpected error occurred": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No description": "Sem descrição", - "@No description": { - "description": "Message used when the assignment has no description", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Launch External Tool": "Executar ferramenta externa", - "@Launch External Tool": { - "description": "Button text added to webviews to let users open external tools in their browser", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Interactions on this page are limited by your institution.": "Interações nesta página são limitadas pela sua instituição.", - "@Interactions on this page are limited by your institution.": { - "description": "Message describing how the webview has limited access due to an instution setting", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "dateAtTime": "{date} às {time}", - "@dateAtTime": { - "description": "The string to format dates", - "type": "text", - "placeholders_order": [ - "date", - "time" - ], - "placeholders": { - "date": {}, - "time": {} - } - }, - "dueDateAtTime": "Para ser entregue em {date} às {time}", - "@dueDateAtTime": { - "description": "The string to format due dates", - "type": "text", - "placeholders_order": [ - "date", - "time" - ], - "placeholders": { - "date": {}, - "time": {} - } - }, - "No Due Date": "Sem prazo de entrega", - "@No Due Date": { - "description": "Label for assignments that do not have a due date", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Filter": "Filtrar", - "@Filter": { - "description": "Label for buttons to filter what items are visible", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "unread": "não lido", - "@unread": { - "description": "Label for things that are marked as unread", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "unreadCount": "{count} não lido", - "@unreadCount": { - "description": "Formatted string for when there are a number of unread items", - "type": "text", - "placeholders_order": [ - "count" - ], - "placeholders": { - "count": {} - } - }, - "badgeNumberPlus": "{count}+", - "@badgeNumberPlus": { - "description": "Formatted string for when too many items are being notified in a badge, generally something like: 99+", - "type": "text", - "placeholders_order": [ - "count" - ], - "placeholders": { - "count": {} - } - }, - "There was an error loading this announcement": "Houve um erro ao carregar este anúncio", - "@There was an error loading this announcement": { - "description": "Message shown when an announcement detail screen fails to load", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Network error": "Erro de rede", - "@Network error": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Under Construction": "Em construção", - "@Under Construction": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "We are currently building this feature for your viewing pleasure.": "Atualmente estamos construindo este recurso para a sua visualização.", - "@We are currently building this feature for your viewing pleasure.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Request Login Help Button": "Solicitar botão de ajuda com login", - "@Request Login Help Button": { - "description": "Accessibility hint for button that opens help dialog for a login help request", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Request Login Help": "Solicitar ajuda com login", - "@Request Login Help": { - "description": "Title of help dialog for a login help request", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I'm having trouble logging in": "Estou tendo problemas em fazer login", - "@I'm having trouble logging in": { - "description": "Subject of help dialog for a login help request", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "An error occurred when trying to display this link": "Ocorreu um erro ao tentar exibir este link", - "@An error occurred when trying to display this link": { - "description": "Error message shown when a link can't be opened", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "We are unable to display this link, it may belong to an institution you currently aren't logged in to.": "Não podemos exibir este link, ele pode pertencer a uma instituição à qual você não está logado atualmente.", - "@We are unable to display this link, it may belong to an institution you currently aren't logged in to.": { - "description": "Description for error page shown when clicking a link", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Link Error": "Erro de link", - "@Link Error": { - "description": "Title for error page shown when clicking a link", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Open In Browser": "Abrir em Navegador", - "@Open In Browser": { - "description": "Text for button to open a link in the browswer", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You'll find the QR code on the web in your account profile. Click 'QR for Mobile Login' in the list.": "Você encontrará o código QR na web no seu perfil da conta. Clique em ‘QR para login móvel’ na lista.", - "@You'll find the QR code on the web in your account profile. Click 'QR for Mobile Login' in the list.": { - "description": "Text for qr login tutorial screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Locate QR Code": "Localizar código QR", - "@Locate QR Code": { - "description": "Text for qr login button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Please scan a QR code generated by Canvas": "Escaneie um código QR gerado pelo Canvas", - "@Please scan a QR code generated by Canvas": { - "description": "Text for qr login error with incorrect qr code", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error logging in. Please generate another QR Code and try again.": "Houve um erro ao fazer login. Gere outro código QR e tente novamente.", - "@There was an error logging in. Please generate another QR Code and try again.": { - "description": "Text for qr login error", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Screenshot showing location of QR code generation in browser": "Captura de tela mostrando local da geração do código QR no navegador", - "@Screenshot showing location of QR code generation in browser": { - "description": "Content Description for qr login tutorial screenshot", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "QR scanning requires camera access": "O escaneamento QR requer acesso à câmera", - "@QR scanning requires camera access": { - "description": "placeholder for camera error for QR code scan", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The linked item is no longer available": "O item vinculado não está mais disponível", - "@The linked item is no longer available": { - "description": "error message when the alert could no be opened", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Message sent": "Mensagem enviada", - "@Message sent": { - "description": "confirmation message on the screen when the user succesfully sends a message", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Acceptable Use Policy": "Política de uso aceitável", - "@Acceptable Use Policy": { - "description": "title for the acceptable use policy screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Submit": "Enviar", - "@Submit": { - "description": "submit button title for acceptable use policy screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Either you're a new user or the Acceptable Use Policy has changed since you last agreed to it. Please agree to the Acceptable Use Policy before you continue.": "Ou você é um novo usuário ou a Política de Uso Aceitável mudou desde a última vez que você concordou com ela. Por favor, concorde com a Política de Uso Aceitável antes de continuar.", - "@Either you're a new user or the Acceptable Use Policy has changed since you last agreed to it. Please agree to the Acceptable Use Policy before you continue.": { - "description": "acceptable use policy screen description", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I agree to the Acceptable Use Policy.": "Eu concordo com a Política de Uso Aceitável.", - "@I agree to the Acceptable Use Policy.": { - "description": "acceptable use policy switch title", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "About": "Sobre", - "@About": { - "description": "Title for about menu item in settings", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "App": "Aplicativo", - "@App": { - "description": "Title for App field on about page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Login ID": "ID de Login", - "@Login ID": { - "description": "Title for Login ID field on about page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Email": "E-mail", - "@Email": { - "description": "Title for Email field on about page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Version": "Versão", - "@Version": { - "description": "Title for Version field on about page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Instructure logo": "Logotipo Instructure", - "@Instructure logo": { - "description": "Semantics label for the Instructure logo on the about page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - } -} \ No newline at end of file diff --git a/apps/flutter_parent/lib/l10n/res/intl_pt_PT.arb b/apps/flutter_parent/lib/l10n/res/intl_pt_PT.arb deleted file mode 100644 index 2c6eaab49a..0000000000 --- a/apps/flutter_parent/lib/l10n/res/intl_pt_PT.arb +++ /dev/null @@ -1,2753 +0,0 @@ -{ - "@@last_modified": "2023-08-25T11:04:20.901151", - "alertsLabel": "Alertas", - "@alertsLabel": { - "description": "The label for the Alerts tab", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "calendarLabel": "Calendário", - "@calendarLabel": { - "description": "The label for the Calendar tab", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "coursesLabel": "Disciplinas", - "@coursesLabel": { - "description": "The label for the Courses tab", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Students": "Não existem alunos", - "@No Students": { - "description": "Text for when an observer has no students they are observing", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Tap to show student selector": "Toque para mostrar o seletor de alunos", - "@Tap to show student selector": { - "description": "Semantics label for the area that will show the student selector when tapped", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Tap to pair with a new student": "Toque para parelhar com um novo aluno", - "@Tap to pair with a new student": { - "description": "Semantics label for the add student button in the student selector", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Tap to select this student": "Toque para selecionar este aluno", - "@Tap to select this student": { - "description": "Semantics label on individual students in the student switcher", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Manage Students": "Gerir alunos", - "@Manage Students": { - "description": "Label text for the Manage Students nav drawer button as well as the title for the Manage Students screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Help": "Ajuda", - "@Help": { - "description": "Label text for the help nav drawer button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Log Out": "Sair", - "@Log Out": { - "description": "Label text for the Log Out nav drawer button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Switch Users": "Alterar Utilizadores", - "@Switch Users": { - "description": "Label text for the Switch Users nav drawer button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "appVersion": "v. {version}", - "@appVersion": { - "description": "App version shown in the navigation drawer", - "type": "text", - "placeholders_order": [ - "version" - ], - "placeholders": { - "version": {} - } - }, - "Are you sure you want to log out?": "Tem a certeza de que quer terminar a sessão?", - "@Are you sure you want to log out?": { - "description": "Confirmation message displayed when the user tries to log out", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Calendars": "Calendários", - "@Calendars": { - "description": "Label for button that lets users select which calendars to display", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "nextMonth": "Próximo mês: {month}", - "@nextMonth": { - "description": "Label for the button that switches the calendar to the next month", - "type": "text", - "placeholders_order": [ - "month" - ], - "placeholders": { - "month": {} - } - }, - "previousMonth": "Mês anterior: {month}", - "@previousMonth": { - "description": "Label for the button that switches the calendar to the previous month", - "type": "text", - "placeholders_order": [ - "month" - ], - "placeholders": { - "month": {} - } - }, - "nextWeek": "A partir da próxima semana {date}", - "@nextWeek": { - "description": "Label for the button that switches the calendar to the next week", - "type": "text", - "placeholders_order": [ - "date" - ], - "placeholders": { - "date": {} - } - }, - "previousWeek": "A partir da semana anterior {date}", - "@previousWeek": { - "description": "Label for the button that switches the calendar to the previous week", - "type": "text", - "placeholders_order": [ - "date" - ], - "placeholders": { - "date": {} - } - }, - "selectedMonthLabel": "Mês de {month}", - "@selectedMonthLabel": { - "description": "Accessibility label for the button that expands/collapses the month view", - "type": "text", - "placeholders_order": [ - "month" - ], - "placeholders": { - "month": {} - } - }, - "expand": "expandido", - "@expand": { - "description": "Accessibility label for the on-tap hint for the button that expands/collapses the month view", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "collapse": "recolhido", - "@collapse": { - "description": "Accessibility label for the on-tap hint for the button that expands/collapses the month view", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "pointsPossible": "{points} ponto possível", - "@pointsPossible": { - "description": "Screen reader label used for the points possible for an assignment, quiz, etc.", - "type": "text", - "placeholders_order": [ - "points" - ], - "placeholders": { - "points": {} - } - }, - "calendarDaySemanticsLabel": "{eventCount,plural, =1{{date}, {eventCount} evento}other{{date}, {eventCount} eventos}}", - "@calendarDaySemanticsLabel": { - "description": "Screen reader label used for calendar day, reads the date and count of events", - "type": "text", - "placeholders_order": [ - "date", - "eventCount" - ], - "placeholders": { - "date": {}, - "eventCount": {} - } - }, - "No Events Today!": "Nenhum evento hoje!", - "@No Events Today!": { - "description": "Title displayed when there are no calendar events for the current day", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "It looks like a great day to rest, relax, and recharge.": "Parece um ótimo dia para descansar, relaxar e recarregar.", - "@It looks like a great day to rest, relax, and recharge.": { - "description": "Message displayed when there are no calendar events for the current day", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading your student's calendar": "Houve um erro ao carregar o calendário do seu aluno.", - "@There was an error loading your student's calendar": { - "description": "Message displayed when calendar events could not be loaded for the current student", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Tap to favorite the courses you want to see on the Calendar. Select up to 10.": "Toque para escolher os percursos que pretende ver no Calendário. Seleccione até 10.", - "@Tap to favorite the courses you want to see on the Calendar. Select up to 10.": { - "description": "Description text on calendar filter screen.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You may only choose 10 calendars to display": "Você só pode escolher 10 calendários para exibir", - "@You may only choose 10 calendars to display": { - "description": "Error text when trying to select more than 10 calendars", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You must select at least one calendar to display": "Deve selecionar pelo menos um calendário para visualizar", - "@You must select at least one calendar to display": { - "description": "Error text when trying to de-select all calendars", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Planner Note": "Nota do planeador", - "@Planner Note": { - "description": "Label used for notes in the planner", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Go to today": "Ir para hoje", - "@Go to today": { - "description": "Accessibility label used for the today button in the planner", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Previous Logins": "Logins anteriores", - "@Previous Logins": { - "description": "Label for the list of previous user logins", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "canvasLogoLabel": "Logo Canvas", - "@canvasLogoLabel": { - "description": "The semantics label for the Canvas logo", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "findSchool": "Encontrar Escola", - "@findSchool": { - "description": "Text for the find-my-school button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "findAnotherSchool": "Encontrar outra escola", - "@findAnotherSchool": { - "description": "Text for the find-another-school button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "domainSearchInputHint": "Digite o nome da escola ou distrito...", - "@domainSearchInputHint": { - "description": "Input hint for the text box on the domain search screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "noDomainResults": "Incapaz de encontrar escolas iguais “{query}”", - "@noDomainResults": { - "description": "Message shown to users when the domain search query did not return any results", - "type": "text", - "placeholders_order": [ - "query" - ], - "placeholders": { - "query": {} - } - }, - "domainSearchHelpLabel": "Como posso encontrar a minha escola ou distrito?", - "@domainSearchHelpLabel": { - "description": "Label for the help button on the domain search screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "canvasGuides": "Guias Canvas", - "@canvasGuides": { - "description": "Proper name for the Canvas Guides. This will be used in the domainSearchHelpBody text and will be highlighted and clickable", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "canvasSupport": "Suporte Canvas", - "@canvasSupport": { - "description": "Proper name for Canvas Support. This will be used in the domainSearchHelpBody text and will be highlighted and clickable", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "domainSearchHelpBody": "Tente procurar o nome da escola ou distrito que você está a tentar aceder, como “Smith Private School” ou “Smith County Schools”. Você também pode entrar diretamente em um domínio do Canvas , como “smith.instructure.com.”\n\nPara mais informações sobre como encontrar a conta do Canvas da sua instituição, você pode visitar o {canvasGuides}, alcançar a {canvasSupport}, ou contatar a sua escola para obter assistência.", - "@domainSearchHelpBody": { - "description": "The body text shown in the help dialog on the domain search screen", - "type": "text", - "placeholders_order": [ - "canvasGuides", - "canvasSupport" - ], - "placeholders": { - "canvasGuides": {}, - "canvasSupport": {} - } - }, - "Uh oh!": "Ah não!", - "@Uh oh!": { - "description": "Title of the screen that shows when a crash has occurred", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "We’re not sure what happened, but it wasn’t good. Contact us if this keeps happening.": "Nós não temos certeza do que aconteceu, mas não foi bom. Contacte-nos se isto continuar a acontecer.", - "@We’re not sure what happened, but it wasn’t good. Contact us if this keeps happening.": { - "description": "Message shown when a crash has occurred", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Contact Support": "Contactar Suporte", - "@Contact Support": { - "description": "Label for the button that allows users to contact support after a crash has occurred", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "View error details": "Ver detalhes do erro", - "@View error details": { - "description": "Label for the button that allowed users to view crash details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Restart app": "Reiniciar aplicação", - "@Restart app": { - "description": "Label for the button that will restart the entire application", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Application version": "Versão da aplicação", - "@Application version": { - "description": "Label for the application version displayed in the crash details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Device model": "Modelo do dispositivo", - "@Device model": { - "description": "Label for the device model displayed in the crash details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Android OS version": "versão do Android OS", - "@Android OS version": { - "description": "Label for the Android operating system version displayed in the crash details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Full error message": "Mensagem de erro completa", - "@Full error message": { - "description": "Label for the full error message displayed in the crash details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Inbox": "Caixa de entrada", - "@Inbox": { - "description": "Title for the Inbox screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading your inbox messages.": "Houve um erro ao carregar as mensagens da sua caixa de entrada.", - "@There was an error loading your inbox messages.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Subject": "Sem assunto", - "@No Subject": { - "description": "Title used for inbox messages that have no subject", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unable to fetch courses. Please check your connection and try again.": "Incapaz de ir buscar disciplinas. É favor verificar sua conexão e tente novamente.", - "@Unable to fetch courses. Please check your connection and try again.": { - "description": "Message shown when an error occured while loading courses", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Choose a course to message": "Escolha uma disciplina para a mensagem", - "@Choose a course to message": { - "description": "Header in the course list shown when the user is choosing which course to associate with a new message", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Inbox Zero": "Caixa de mensagem Zero", - "@Inbox Zero": { - "description": "Title of the message shown when there are no inbox messages", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You’re all caught up!": "Vocês estão todos apanhados!", - "@You’re all caught up!": { - "description": "Subtitle of the message shown when there are no inbox messages", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading recipients for this course": "Houve um erro ao carregar os destinatários para esta disciplina", - "@There was an error loading recipients for this course": { - "description": "Message shown when attempting to create a new message but the recipients list failed to load", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unable to send message. Check your connection and try again.": "Incapaz de enviar mensagem. Verifique a sua ligação e tente novamente.", - "@Unable to send message. Check your connection and try again.": { - "description": "Message show when there was an error creating or sending a new message", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unsaved changes": "Alterações não guardadas", - "@Unsaved changes": { - "description": "Title of the dialog shown when the user tries to leave with unsaved changes", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Are you sure you wish to close this page? Your unsent message will be lost.": "Tem a certeza de que pretende fechar esta página? A sua mensagem não enviada será perdida.", - "@Are you sure you wish to close this page? Your unsent message will be lost.": { - "description": "Body text of the dialog shown when the user tries leave with unsaved changes", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "New message": "Nova mensagem", - "@New message": { - "description": "Title of the new-message screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Add attachment": "Adicionar Anexo", - "@Add attachment": { - "description": "Tooltip for the add-attachment button in the new-message screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Send message": "Enviar mensagem", - "@Send message": { - "description": "Tooltip for the send-message button in the new-message screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Select recipients": "Selecione Destinatários", - "@Select recipients": { - "description": "Tooltip for the button that allows users to select message recipients", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No recipients selected": "Nenhum beneficiário selecionado", - "@No recipients selected": { - "description": "Hint displayed when the user has not selected any message recipients", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Message subject": "Assunto da mensagem", - "@Message subject": { - "description": "Hint text displayed in the input field for the message subject", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Message": "Mensagem", - "@Message": { - "description": "Hint text displayed in the input field for the message body", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Recipients": "Destinatários", - "@Recipients": { - "description": "Label for message recipients", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "plusRecipientCount": "+{count}", - "@plusRecipientCount": { - "description": "Shows the number of recipients that are selected but not displayed on screen.", - "type": "text", - "placeholders_order": [ - "count" - ], - "placeholders": { - "count": { - "example": 5 - } - } - }, - "Failed. Tap for options.": "Falhou. Toque para opções.", - "@Failed. Tap for options.": { - "description": "Short message shown on a message attachment when uploading has failed", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "courseForWhom": "para {studentShortName}", - "@courseForWhom": { - "description": "Describes for whom a course is for (i.e. for Bill)", - "type": "text", - "placeholders_order": [ - "studentShortName" - ], - "placeholders": { - "studentShortName": {} - } - }, - "messageLinkPostscript": "Em relação a: {studentName}, {linkUrl}", - "@messageLinkPostscript": { - "description": "A postscript appended to new messages that clarifies which student is the subject of the message and also includes a URL for the related Canvas component (course, assignment, event, etc).", - "type": "text", - "placeholders_order": [ - "studentName", - "linkUrl" - ], - "placeholders": { - "studentName": {}, - "linkUrl": {} - } - }, - "There was an error loading this conversation": "Ocorreu um erro ao carregar esta conversa", - "@There was an error loading this conversation": { - "description": "Message shown when a conversation fails to load", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Reply": "Responder", - "@Reply": { - "description": "Button label for replying to a conversation", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Reply All": "Responder a todos", - "@Reply All": { - "description": "Button label for replying to all conversation participants", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unknown User": "Utilizador desconhecido", - "@Unknown User": { - "description": "Label used where the user name is not known", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "me": "eu", - "@me": { - "description": "First-person pronoun (i.e. 'me') that will be used in message author info, e.g. 'Me to 4 others' or 'Jon Snow to me'", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "authorToRecipient": "{authorName} a {recipientName}", - "@authorToRecipient": { - "description": "Author info for a single-recipient message; includes both the author name and the recipient name.", - "type": "text", - "placeholders_order": [ - "authorName", - "recipientName" - ], - "placeholders": { - "authorName": {}, - "recipientName": {} - } - }, - "authorToNOthers": "{howMany,plural, =1{{authorName} para 1 outro}other{{authorName} para {howMany} outros}}", - "@authorToNOthers": { - "description": "Author info for a mutli-recipient message; includes the author name and the number of recipients", - "type": "text", - "placeholders_order": [ - "authorName", - "howMany" - ], - "placeholders": { - "authorName": {}, - "howMany": {} - } - }, - "authorToRecipientAndNOthers": "{howMany,plural, =1{{authorName} para {recipientName} & 1 outro}other{{authorName} para {recipientName} & {howMany} outros}}", - "@authorToRecipientAndNOthers": { - "description": "Author info for a multi-recipient message; includes the author name, one recipient name, and the number of other recipients", - "type": "text", - "placeholders_order": [ - "authorName", - "recipientName", - "howMany" - ], - "placeholders": { - "authorName": {}, - "recipientName": {}, - "howMany": {} - } - }, - "Download": "Descarregar", - "@Download": { - "description": "Label for the button that will begin downloading a file", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Open with another app": "Abrir com outra aplicação", - "@Open with another app": { - "description": "Label for the button that will allow users to open a file with another app", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There are no installed applications that can open this file": "Não existem aplicações instaladas que possam abrir este ficheiro", - "@There are no installed applications that can open this file": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unsupported File": "Ficheiro não suportado", - "@Unsupported File": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "This file is unsupported and can’t be viewed through the app": "Este ficheiro não tem suporte e não pode ser visualizado através da aplicação", - "@This file is unsupported and can’t be viewed through the app": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unable to play this media file": "Incapaz de reproduzir este ficheiro multimédia", - "@Unable to play this media file": { - "description": "Message shown when audio or video media could not be played", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unable to load this image": "Incapaz de carregar esta imagem", - "@Unable to load this image": { - "description": "Message shown when an image file could not be loaded or displayed", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading this file": "Houve um erro ao carregar este ficheiro", - "@There was an error loading this file": { - "description": "Message shown when a file could not be loaded or displayed", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Courses": "Sem Disciplinas", - "@No Courses": { - "description": "Title for having no courses", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Your student’s courses might not be published yet.": "As disciplinas dos seus alunos podem ainda não ter sido publicadas.", - "@Your student’s courses might not be published yet.": { - "description": "Message for having no courses", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading your student’s courses.": "Houve um erro ao carregar as disciplinas dos seus alunos.", - "@There was an error loading your student’s courses.": { - "description": "Message displayed when the list of student courses could not be loaded", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Grade": "Sem classificação", - "@No Grade": { - "description": "Message shown when there is currently no grade available for a course", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Filter by": "Filtrar por", - "@Filter by": { - "description": "Title for list of terms to filter grades by", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Grades": "Classificações", - "@Grades": { - "description": "Label for the \"Grades\" tab in course details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Syllabus": "Programa", - "@Syllabus": { - "description": "Label for the \"Syllabus\" tab in course details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Front Page": "Primeira página", - "@Front Page": { - "description": "Label for the \"Front Page\" tab in course details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Summary": "Sumário", - "@Summary": { - "description": "Label for the \"Summary\" tab in course details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Send a message about this course": "Enviar uma mensagem a cerca dessa disciplina", - "@Send a message about this course": { - "description": "Accessibility hint for the course messaage floating action button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Total Grade": "Nota Completa", - "@Total Grade": { - "description": "Label for the total grade in the course", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Graded": "Classificado", - "@Graded": { - "description": "Label for assignments that have been graded", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Submitted": "Submetido", - "@Submitted": { - "description": "Label for assignments that have been submitted", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Not Submitted": "Não Entregue", - "@Not Submitted": { - "description": "Label for assignments that have not been submitted", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Late": "Atrasado", - "@Late": { - "description": "Label for assignments that have been marked late or submitted late", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Missing": "Em falta", - "@Missing": { - "description": "Label for assignments that have been marked missing or are not submitted and past the due date", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "-": "-", - "@-": { - "description": "Value representing no score for student submission", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "All Grading Periods": "Todos os períodos de classificação", - "@All Grading Periods": { - "description": "Label for selecting all grading periods", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Assignments": "Nenhuma tarefa", - "@No Assignments": { - "description": "Title for the no assignments message", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "It looks like assignments haven't been created in this space yet.": "Parece que as tarefas ainda não foram criadas neste espaço.", - "@It looks like assignments haven't been created in this space yet.": { - "description": "Message for no assignments", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading the summary details for this course.": "Houve um erro ao carregar os detalhes resumidos para esta disciplina.", - "@There was an error loading the summary details for this course.": { - "description": "Message shown when the course summary could not be loaded", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Summary": "Nenhum Resumo", - "@No Summary": { - "description": "Title displayed when there are no items in the course summary", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "This course does not have any assignments or calendar events yet.": "Esta disciplina ainda não tem nenhuma tarefa ou calendário de eventos.", - "@This course does not have any assignments or calendar events yet.": { - "description": "Message displayed when there are no items in the course summary", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "gradeFormatScoreOutOfPointsPossible": "{score} / {pointsPossible}", - "@gradeFormatScoreOutOfPointsPossible": { - "description": "Formatted string for a student score out of the points possible", - "type": "text", - "placeholders_order": [ - "score", - "pointsPossible" - ], - "placeholders": { - "score": {}, - "pointsPossible": {} - } - }, - "contentDescriptionScoreOutOfPointsPossible": "{score} de {pointsPossible} pontos", - "@contentDescriptionScoreOutOfPointsPossible": { - "description": "Formatted string for a student score out of the points possible", - "type": "text", - "placeholders_order": [ - "score", - "pointsPossible" - ], - "placeholders": { - "score": {}, - "pointsPossible": {} - } - }, - "gradesSubjectMessage": "Em relação a: {studentName}, Classificações", - "@gradesSubjectMessage": { - "description": "The subject line for a message to a teacher regarding a student's grades", - "type": "text", - "placeholders_order": [ - "studentName" - ], - "placeholders": { - "studentName": {} - } - }, - "syllabusSubjectMessage": "Em relação a: {studentName}, Programa", - "@syllabusSubjectMessage": { - "description": "The subject line for a message to a teacher regarding a course syllabus", - "type": "text", - "placeholders_order": [ - "studentName" - ], - "placeholders": { - "studentName": {} - } - }, - "frontPageSubjectMessage": "Em relação a: {studentName}, Primeira página", - "@frontPageSubjectMessage": { - "description": "The subject line for a message to a teacher regarding a course front page", - "type": "text", - "placeholders_order": [ - "studentName" - ], - "placeholders": { - "studentName": {} - } - }, - "assignmentSubjectMessage": "Em relação a: {studentName}, Tarefa - {assignmentName}", - "@assignmentSubjectMessage": { - "description": "The subject line for a message to a teacher regarding a student's assignment", - "type": "text", - "placeholders_order": [ - "studentName", - "assignmentName" - ], - "placeholders": { - "studentName": {}, - "assignmentName": {} - } - }, - "eventSubjectMessage": "Em relação a: {studentName}, Evento - {eventTitle}", - "@eventSubjectMessage": { - "description": "The subject line for a message to a teacher regarding a calendar event", - "type": "text", - "placeholders_order": [ - "studentName", - "eventTitle" - ], - "placeholders": { - "studentName": {}, - "eventTitle": {} - } - }, - "There is no page information available.": "Não existe informação de página disponível.", - "@There is no page information available.": { - "description": "Description for when no page information is available", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Assignment Details": "Detalhes da tarefa", - "@Assignment Details": { - "description": "Title for the page that shows details for an assignment", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "assignmentTotalPoints": "{points} pts", - "@assignmentTotalPoints": { - "description": "Label used for the total points the assignment is worth", - "type": "text", - "placeholders_order": [ - "points" - ], - "placeholders": { - "points": {} - } - }, - "assignmentTotalPointsAccessible": "{points} pontos", - "@assignmentTotalPointsAccessible": { - "description": "Screen reader label used for the total points the assignment is worth", - "type": "text", - "placeholders_order": [ - "points" - ], - "placeholders": { - "points": {} - } - }, - "Due": "Data limite", - "@Due": { - "description": "Label for an assignment due date", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Grade": "Nota", - "@Grade": { - "description": "Label for the section that displays an assignment's grade", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Locked": "Bloqueado", - "@Locked": { - "description": "Label for when an assignment is locked", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "assignmentLockedModule": "Sua tarefa está bloqueada pelo módulo “{moduleName}”.", - "@assignmentLockedModule": { - "description": "The locked description when an assignment is locked by a module", - "type": "text", - "placeholders_order": [ - "moduleName" - ], - "placeholders": { - "moduleName": {} - } - }, - "Remind Me": "Relembra-me", - "@Remind Me": { - "description": "Label for the row to set reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Set a date and time to be notified of this specific assignment.": "Defina uma data e hora para ser notificado sobre esta tarefa específica.", - "@Set a date and time to be notified of this specific assignment.": { - "description": "Description for row to set reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You will be notified about this assignment on…": "Você será notificado sobre esta tarefa em...", - "@You will be notified about this assignment on…": { - "description": "Description for when a reminder is set", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Instructions": "Instruções", - "@Instructions": { - "description": "Label for the description of the assignment when it has quiz instructions", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Send a message about this assignment": "Enviar uma mensagem sobre esta tarefa", - "@Send a message about this assignment": { - "description": "Accessibility hint for the assignment messaage floating action button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "This app is not authorized for use.": "Esta app não está autorizada para utilização.", - "@This app is not authorized for use.": { - "description": "The error shown when the app being used is not verified by Canvas", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The server you entered is not authorized for this app.": "O servidor que você digitou não está autorizado para esta app.", - "@The server you entered is not authorized for this app.": { - "description": "The error shown when the desired login domain is not verified by Canvas", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The user agent for this app is not authorized.": "O agente do utilizador para esta app não está autorizado.", - "@The user agent for this app is not authorized.": { - "description": "The error shown when the user agent during verification is not verified by Canvas", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "We were unable to verify the server for use with this app.": "Não conseguimos verificar o servidor para utilização com esta app.", - "@We were unable to verify the server for use with this app.": { - "description": "The generic error shown when we are unable to verify with Canvas", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Reminders": "Lembretes", - "@Reminders": { - "description": "Name of the system notification channel for assignment and event reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Notifications for reminders about assignments and calendar events": "Notificações para lembretes sobre tarefas e eventos do calendário", - "@Notifications for reminders about assignments and calendar events": { - "description": "Description of the system notification channel for assignment and event reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Reminders have changed!": "Os lembretes mudaram!", - "@Reminders have changed!": { - "description": "Title of the dialog shown when the user needs to update their reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "In order to provide you with a better experience, we have updated how reminders work. You can add new reminders by viewing an assignment or calendar event and tapping the switch under the \"Remind Me\" section.\n\nBe aware that any reminders created with older versions of this app will not be compatible with the new changes and you will need to create them again.": "A fim de lhe proporcionar uma melhor experiência, atualizámos a forma como os lembretes funcionam. Pode adicionar novos lembretes ao visualizar uma tarefa ou evento de calendário e tocar no botão na seção \"Lembre-me\".\n\nTenha em atenção que quaisquer lembretes criados com versões antigas desta aplicação não serão compatíveis com as novas alterações e terá de os criar novamente.", - "@In order to provide you with a better experience, we have updated how reminders work. You can add new reminders by viewing an assignment or calendar event and tapping the switch under the \"Remind Me\" section.\n\nBe aware that any reminders created with older versions of this app will not be compatible with the new changes and you will need to create them again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Not a parent?": "Não é um pai?", - "@Not a parent?": { - "description": "Title for the screen that shows when the user is not observing any students", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "We couldn't find any students associated with this account": "Não conseguimos encontrar nenhum estudante associado a esta conta", - "@We couldn't find any students associated with this account": { - "description": "Subtitle for the screen that shows when the user is not observing any students", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Are you a student or teacher?": "Você é um aluno ou professor?", - "@Are you a student or teacher?": { - "description": "Label for button that will show users the option to view other Canvas apps in the Play Store", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "One of our other apps might be a better fit. Tap one to visit the Play Store.": "Uma das nossas outras aplicações pode ser um ajuste melhor. Toque em um para visitar a App Store.", - "@One of our other apps might be a better fit. Tap one to visit the Play Store.": { - "description": "Description of options to view other Canvas apps in the Play Store", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Return to Login": "Voltar para Login", - "@Return to Login": { - "description": "Label for the button that returns the user to the login screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "STUDENT": "ALUNO", - "@STUDENT": { - "description": "The \"student\" portion of the \"Canvas Student\" app name, in all caps. \"Canvas\" is excluded in this context as it will be displayed to the user as a wordmark image", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "TEACHER": "PROFESSOR", - "@TEACHER": { - "description": "The \"teacher\" portion of the \"Canvas Teacher\" app name, in all caps. \"Canvas\" is excluded in this context as it will be displayed to the user as a wordmark image", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Canvas Student": "Aluno Canvas", - "@Canvas Student": { - "description": "The name of the Canvas Student app. Only \"Student\" should be translated as \"Canvas\" is a brand name in this context and should not be translated.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Canvas Teacher": "Canvas Teacher", - "@Canvas Teacher": { - "description": "The name of the Canvas Teacher app. Only \"Teacher\" should be translated as \"Canvas\" is a brand name in this context and should not be translated.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Alerts": "Sem Alertas", - "@No Alerts": { - "description": "The title for the empty message to show to users when there are no alerts for the student.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There’s nothing to be notified of yet.": "Não há nada para ser notificado ainda.", - "@There’s nothing to be notified of yet.": { - "description": "The empty message to show to users when there are no alerts for the student.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "dismissAlertLabel": "Ignorar {alertTitle}", - "@dismissAlertLabel": { - "description": "Accessibility label to dismiss an alert", - "type": "text", - "placeholders_order": [ - "alertTitle" - ], - "placeholders": { - "alertTitle": {} - } - }, - "Course Announcement": "Anúncio da disciplina", - "@Course Announcement": { - "description": "Title for alerts when there is a course announcement", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Institution Announcement": "Anúncio da Instituição", - "@Institution Announcement": { - "description": "Title for alerts when there is an institution announcement", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "assignmentGradeAboveThreshold": "Classificação de tarefa acima {threshold}", - "@assignmentGradeAboveThreshold": { - "description": "Title for alerts when an assignment grade is above the threshold value", - "type": "text", - "placeholders_order": [ - "threshold" - ], - "placeholders": { - "threshold": {} - } - }, - "assignmentGradeBelowThreshold": "Classificação de tarefa abaixo {threshold}", - "@assignmentGradeBelowThreshold": { - "description": "Title for alerts when an assignment grade is below the threshold value", - "type": "text", - "placeholders_order": [ - "threshold" - ], - "placeholders": { - "threshold": {} - } - }, - "courseGradeAboveThreshold": "Grau da Disciplina Acima {threshold}", - "@courseGradeAboveThreshold": { - "description": "Title for alerts when a course grade is above the threshold value", - "type": "text", - "placeholders_order": [ - "threshold" - ], - "placeholders": { - "threshold": {} - } - }, - "courseGradeBelowThreshold": "Grau da Disciplina Abaixo {threshold}", - "@courseGradeBelowThreshold": { - "description": "Title for alerts when a course grade is below the threshold value", - "type": "text", - "placeholders_order": [ - "threshold" - ], - "placeholders": { - "threshold": {} - } - }, - "Settings": "Definições", - "@Settings": { - "description": "Title for the settings screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Theme": "Tema", - "@Theme": { - "description": "Label for the light/dark theme section in the settings page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Dark Mode": "Modo Escuro", - "@Dark Mode": { - "description": "Label for the button that enables dark mode", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Light Mode": "Modo de luz", - "@Light Mode": { - "description": "Label for the button that enables light mode", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "High Contrast Mode": "Modo de Alto Contraste", - "@High Contrast Mode": { - "description": "Label for the switch that toggles high contrast mode", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Use Dark Theme in Web Content": "Usar Tema Escuro no Conteúdo da Web", - "@Use Dark Theme in Web Content": { - "description": "Label for the switch that toggles dark mode for webviews", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Appearance": "Aparência", - "@Appearance": { - "description": "Label for the appearance section in the settings page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Successfully submitted!": "Submetido com sucesso!", - "@Successfully submitted!": { - "description": "Title displayed in the grade cell for an assignment that has been submitted", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "submissionStatusSuccessSubtitle": "Esta tarefa foi submetida em {date} em {time} e está à espera de ser classificada", - "@submissionStatusSuccessSubtitle": { - "description": "Subtitle displayed in the grade cell for an assignment that has been submitted and is awaiting a grade", - "type": "text", - "placeholders_order": [ - "date", - "time" - ], - "placeholders": { - "date": {}, - "time": {} - } - }, - "outOfPoints": "{howMany,plural, =1{De 1 ponto}other{Fora de {points} pontos}}", - "@outOfPoints": { - "description": "Description for an assignment grade that has points without a current scoroe", - "type": "text", - "placeholders_order": [ - "points", - "howMany" - ], - "placeholders": { - "points": {}, - "howMany": {} - } - }, - "Excused": "Desculpado", - "@Excused": { - "description": "Grading status for an assignment marked as excused", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Complete": "Completo", - "@Complete": { - "description": "Grading status for an assignment marked as complete", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Incomplete": "Incompleto", - "@Incomplete": { - "description": "Grading status for an assignment marked as incomplete", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "minus": "menos", - "@minus": { - "description": "Screen reader-friendly replacement for the \"-\" character in letter grades like \"A-\"", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "latePenalty": "Penalidade tardia (-{pointsLost})", - "@latePenalty": { - "description": "Text displayed when a late penalty has been applied to the assignment", - "type": "text", - "placeholders_order": [ - "pointsLost" - ], - "placeholders": { - "pointsLost": {} - } - }, - "finalGrade": "Nota final: {grade}", - "@finalGrade": { - "description": "Text that displays the final grade of an assignment", - "type": "text", - "placeholders_order": [ - "grade" - ], - "placeholders": { - "grade": {} - } - }, - "Alert Settings": "Configurações de Alerta", - "@Alert Settings": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Alert me when…": "Alerte-me quando...", - "@Alert me when…": { - "description": "Header for the screen where the observer chooses the thresholds that will determine when they receive alerts (e.g. when an assignment is graded below 70%)", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Course grade below": "Classificação da disciplina abaixo", - "@Course grade below": { - "description": "Label describing the threshold for when the course grade is below a certain percentage", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Course grade above": "Classificação da disciplina acima", - "@Course grade above": { - "description": "Label describing the threshold for when the course grade is above a certain percentage", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Assignment missing": "Tarefa em falta", - "@Assignment missing": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Assignment grade below": "Classificação de tarefa abaixo", - "@Assignment grade below": { - "description": "Label describing the threshold for when an assignment is graded below a certain percentage", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Assignment grade above": "Classificação de tarefa acima", - "@Assignment grade above": { - "description": "Label describing the threshold for when an assignment is graded above a certain percentage", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Course Announcements": "Anúncios da disciplina", - "@Course Announcements": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Institution Announcements": "Anúncios da Instituição", - "@Institution Announcements": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Never": "Nunca", - "@Never": { - "description": "Indication that tells the user they will not receive alert notifications of a specific kind", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Grade percentage": "Classificação percentual", - "@Grade percentage": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading your student's alerts.": "Houve um erro ao carregar os alertas dos seus alunos.", - "@There was an error loading your student's alerts.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Must be below 100": "Deve estar abaixo de 100", - "@Must be below 100": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "mustBeBelowN": "Deve estar abaixo {percentage}", - "@mustBeBelowN": { - "description": "Validation error to the user that they must choose a percentage below 'n'", - "type": "text", - "placeholders_order": [ - "percentage" - ], - "placeholders": { - "percentage": { - "example": 5 - } - } - }, - "mustBeAboveN": "Deve estar acima de {percentage}", - "@mustBeAboveN": { - "description": "Validation error to the user that they must choose a percentage above 'n'", - "type": "text", - "placeholders_order": [ - "percentage" - ], - "placeholders": { - "percentage": { - "example": 5 - } - } - }, - "Select Student Color": "Seleccionar a cor do aluno", - "@Select Student Color": { - "description": "Title for screen that allows users to assign a color to a specific student", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Electric, blue": "Elétrico, azul", - "@Electric, blue": { - "description": "Name of the Electric (blue) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Plum, Purple": "Ameixa, Púrpura", - "@Plum, Purple": { - "description": "Name of the Plum (purple) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Barney, Fuschia": "Barney, Fuschia", - "@Barney, Fuschia": { - "description": "Name of the Barney (fuschia) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Raspberry, Red": "Framboesa, Vermelho", - "@Raspberry, Red": { - "description": "Name of the Raspberry (red) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Fire, Orange": "Fogo, Laranja", - "@Fire, Orange": { - "description": "Name of the Fire (orange) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Shamrock, Green": "Shamrock, Verde", - "@Shamrock, Green": { - "description": "Name of the Shamrock (green) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "An error occurred while saving your selection. Please try again.": "Ocorreu um erro ao salvar a sua selecção. É favor tentar novamente.", - "@An error occurred while saving your selection. Please try again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "changeStudentColorLabel": "Alterar cor para {studentName}", - "@changeStudentColorLabel": { - "description": "Accessibility label for the button that lets users change the color associated with a specific student", - "type": "text", - "placeholders_order": [ - "studentName" - ], - "placeholders": { - "studentName": {} - } - }, - "Teacher": "Professor", - "@Teacher": { - "description": "Label for the Teacher enrollment type", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Student": "Aluno", - "@Student": { - "description": "Label for the Student enrollment type", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "TA": "Assistente", - "@TA": { - "description": "Label for the Teaching Assistant enrollment type (also known as Teacher Aid or Education Assistant), reduced to a short acronym/initialism if appropriate.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Observer": "Observador", - "@Observer": { - "description": "Label for the Observer enrollment type", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Use Camera": "Use a câmara", - "@Use Camera": { - "description": "Label for the action item that lets the user capture a photo using the device camera", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Upload File": "Carregar ficheiro", - "@Upload File": { - "description": "Label for the action item that lets the user upload a file from their device", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Choose from Gallery": "Escolha na Galeria", - "@Choose from Gallery": { - "description": "Label for the action item that lets the user select a photo from their device gallery", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Preparing…": "A preparar...", - "@Preparing…": { - "description": "Message shown while a file is being prepared to attach to a message", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Add student with…": "Adicionar aluno com...", - "@Add student with…": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Add Student": "Adicionar aluno", - "@Add Student": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You are not observing any students.": "Você não está a observar nenhum aluno.", - "@You are not observing any students.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading your students.": "Houve um erro ao carregar os seus alunos.", - "@There was an error loading your students.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Pairing Code": "Código de emparelhamento", - "@Pairing Code": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Students can obtain a pairing code through the Canvas website": "Os alunos podem obter um código de parelhamento através do sitio web do Canvas", - "@Students can obtain a pairing code through the Canvas website": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Enter the student pairing code provided to you. If the pairing code doesn't work, it may have expired": "Introduza o código de pareamento de alunos que lhe foi fornecido. Se o código de pareamento não funcionar, ele pode ter expirado", - "@Enter the student pairing code provided to you. If the pairing code doesn't work, it may have expired": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Your code is incorrect or expired.": "O seu código está incorrecto ou expirou.", - "@Your code is incorrect or expired.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Something went wrong trying to create your account, please reach out to your school for assistance.": "Algo correu mal ao tentar criar a sua conta, por favor contacte a sua escola para obter assistência.", - "@Something went wrong trying to create your account, please reach out to your school for assistance.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "QR Code": "Código QR", - "@QR Code": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Students can create a QR code using the Canvas Student app on their mobile device": "Os alunos podem criar um código QR utilizando a aplicação Canvas Student no seu dispositivo móvel", - "@Students can create a QR code using the Canvas Student app on their mobile device": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Add new student": "Adicionar novo aluno", - "@Add new student": { - "description": "Semantics label for the FAB on the Manage Students Screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Select": "Selecionar", - "@Select": { - "description": "Hint text to tell the user to choose one of two options", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I have a Canvas account": "Eu tenho uma conta Canvas", - "@I have a Canvas account": { - "description": "Option to select for users that have a canvas account", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I don't have a Canvas account": "Não tenho uma conta Canvas", - "@I don't have a Canvas account": { - "description": "Option to select for users that don't have a canvas account", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Create Account": "Criar Conta", - "@Create Account": { - "description": "Button text for account creation confirmation", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Full Name": "Nome completo", - "@Full Name": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Email Address": "Endereço de e-mail", - "@Email Address": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Password": "Palavra-passe", - "@Password": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Full Name…": "Nome completo...", - "@Full Name…": { - "description": "hint label for inside form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Email…": "E-mail...", - "@Email…": { - "description": "hint label for inside form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Password…": "Palavra-passe...", - "@Password…": { - "description": "hint label for inside form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Please enter full name": "Por favor, insira nome completo", - "@Please enter full name": { - "description": "Error message for form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Please enter an email address": "Por favor, insira um endereço de e-mail", - "@Please enter an email address": { - "description": "Error message for form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Please enter a valid email address": "Por favor insira um endereço de e-mail válido", - "@Please enter a valid email address": { - "description": "Error message for form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Password is required": "Palavra passe é necessária", - "@Password is required": { - "description": "Error message for form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Password must contain at least 8 characters": "A palavra-passe deve conter pelo menos 8 caracteres", - "@Password must contain at least 8 characters": { - "description": "Error message for form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "qrCreateAccountTos": "Ao tocar em “Criar conta”, concorda com o {termsOfService} e reconhece o {privacyPolicy}", - "@qrCreateAccountTos": { - "description": "The text show on the account creation screen", - "type": "text", - "placeholders_order": [ - "termsOfService", - "privacyPolicy" - ], - "placeholders": { - "termsOfService": {}, - "privacyPolicy": {} - } - }, - "Terms of Service": "Termos de serviço", - "@Terms of Service": { - "description": "Label for the Canvas Terms of Service agreement. This will be used in the qrCreateAccountTos text and will be highlighted and clickable", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Privacy Policy": "Política de Privacidade", - "@Privacy Policy": { - "description": "Label for the Canvas Privacy Policy agreement. This will be used in the qrCreateAccountTos text and will be highlighted and clickable", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "View the Privacy Policy": "Ver a Política de Privacidade", - "@View the Privacy Policy": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Already have an account? ": "Já tens uma conta? ", - "@Already have an account? ": { - "description": "Part of multiline text span, includes AccountSignIn1-2, in that order", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Sign In": "Iniciar sessão", - "@Sign In": { - "description": "Part of multiline text span, includes AccountSignIn1-2, in that order", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Hide Password": "Ocultar Palavra-passe", - "@Hide Password": { - "description": "content description for password hide button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Show Password": "Mostrar Palavra-passe", - "@Show Password": { - "description": "content description for password show button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Terms of Service Link": "Ligação dos Termos de serviço", - "@Terms of Service Link": { - "description": "content description for terms of service link", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Privacy Policy Link": "Ligação à Política de Privacidade", - "@Privacy Policy Link": { - "description": "content description for privacy policy link", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Event": "Evento", - "@Event": { - "description": "Title for the event details screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Date": "Data", - "@Date": { - "description": "Label for the event date", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Location": "Local", - "@Location": { - "description": "Label for the location information", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Location Specified": "Sem Local Especificado", - "@No Location Specified": { - "description": "Description for events that do not have a location", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "eventTime": "{startAt} - {endAt}", - "@eventTime": { - "description": "The time the event is happening, example: \"2:00 pm - 4:00 pm\"", - "type": "text", - "placeholders_order": [ - "startAt", - "endAt" - ], - "placeholders": { - "startAt": {}, - "endAt": {} - } - }, - "Set a date and time to be notified of this event.": "Defina uma data e hora para ser notificado deste evento.", - "@Set a date and time to be notified of this event.": { - "description": "Description for row to set event reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You will be notified about this event on…": "Você será notificado sobre este evento em...", - "@You will be notified about this event on…": { - "description": "Description for when an event reminder is set", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Share Your Love for the App": "Partilhe o Seu Carinho pela App", - "@Share Your Love for the App": { - "description": "Label for option to open the app store", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Tell us about your favorite parts of the app": "Diga-nos quais são as suas partes favoritas da app", - "@Tell us about your favorite parts of the app": { - "description": "Description for option to open the app store", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Legal": "Legal", - "@Legal": { - "description": "Label for legal information option", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Privacy policy, terms of use, open source": "Política de privacidade, termos de uso, código aberto", - "@Privacy policy, terms of use, open source": { - "description": "Description for legal information option", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Idea for Canvas Parent App [Android]": "Ideia para a App Canvas Parent [Android]", - "@Idea for Canvas Parent App [Android]": { - "description": "The subject for the email to request a feature", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The following information will help us better understand your idea:": "A seguinte informação vai ajudar-nos a compreender melhora sua ideia:", - "@The following information will help us better understand your idea:": { - "description": "The header for the users information that is attached to a feature request", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Domain:": "Domínio:", - "@Domain:": { - "description": "The label for the Canvas domain of the logged in user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "User ID:": "ID do Utilizador:", - "@User ID:": { - "description": "The label for the Canvas user ID of the logged in user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Email:": "Email:", - "@Email:": { - "description": "The label for the eamil of the logged in user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Locale:": "Local:", - "@Locale:": { - "description": "The label for the locale of the logged in user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Terms of Use": "Termos de uso", - "@Terms of Use": { - "description": "Label for the terms of use", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Canvas on GitHub": "Canvas no GitHub", - "@Canvas on GitHub": { - "description": "Label for the button that opens the Canvas project on GitHub's website", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was a problem loading the Terms of Use": "Ocorreu um problema ao carregar os Termos de Uso", - "@There was a problem loading the Terms of Use": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Device": "Dispositivo", - "@Device": { - "description": "Label used for device manufacturer/model in the error report", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "OS Version": "Versão SO", - "@OS Version": { - "description": "Label used for device operating system version in the error report", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Version Number": "Número da versão", - "@Version Number": { - "description": "Label used for the app version number in the error report", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Report A Problem": "Relatar um Problema", - "@Report A Problem": { - "description": "Title used for generic dialog to report problems", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Subject": "Assunto", - "@Subject": { - "description": "Label used for Subject text field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "A subject is required.": "É necessário um sujeito.", - "@A subject is required.": { - "description": "Error shown when the subject field is empty", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "An email address is required.": "É necessário um endereço de e-mail.", - "@An email address is required.": { - "description": "Error shown when the email field is empty", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Description": "Descrição", - "@Description": { - "description": "Label used for Description text field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "A description is required.": "Uma descrição é necessária.", - "@A description is required.": { - "description": "Error shown when the description field is empty", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "How is this affecting you?": "Como é que isto o afeta?", - "@How is this affecting you?": { - "description": "Label used for the dropdown to select how severe the issue is", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "send": "enviar", - "@send": { - "description": "Label used for send button when reporting a problem", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Just a casual question, comment, idea, suggestion…": "Apenas uma questão casual, comentário, ideia, sugestão...", - "@Just a casual question, comment, idea, suggestion…": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I need some help but it's not urgent.": "Preciso de ajuda mas não é urgente.", - "@I need some help but it's not urgent.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Something's broken but I can work around it to get what I need done.": "Algo não está bem mas consigo contornar a dificuldade e fazer o que preciso.", - "@Something's broken but I can work around it to get what I need done.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I can't get things done until I hear back from you.": "Não consigo terminar as tarefas até receber indicações vossas.", - "@I can't get things done until I hear back from you.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "EXTREME CRITICAL EMERGENCY!!": "EMERGÊNCIA EXTREMA CRÍTICA !!", - "@EXTREME CRITICAL EMERGENCY!!": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Not Graded": "Sem classificação", - "@Not Graded": { - "description": "Description for an assignment has not been graded.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Login flow: Normal": "Fluxo de login: Normal", - "@Login flow: Normal": { - "description": "Description for the normal login flow", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Login flow: Canvas": "Fluxo de login: Canvas", - "@Login flow: Canvas": { - "description": "Description for the Canvas login flow", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Login flow: Site Admin": "Fluxo de login: Administrador do site", - "@Login flow: Site Admin": { - "description": "Description for the Site Admin login flow", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Login flow: Skip mobile verify": "Fluxo de login: Saltar verificação móvel", - "@Login flow: Skip mobile verify": { - "description": "Description for the login flow that skips domain verification for mobile", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Act As User": "Agir como Utilizador", - "@Act As User": { - "description": "Label for the button that allows the user to act (masquerade) as another user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Stop Acting as User": "Parar de atuar como utilizador", - "@Stop Acting as User": { - "description": "Label for the button that allows the user to stop acting (masquerading) as another user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "actingAsUser": "Você está a agir como {userName}", - "@actingAsUser": { - "description": "Message shown while acting (masquerading) as another user", - "type": "text", - "placeholders_order": [ - "userName" - ], - "placeholders": { - "userName": {} - } - }, - "\"Act as\" is essentially logging in as this user without a password. You will be able to take any action as if you were this user, and from other users' points of views, it will be as if this user performed them. However, audit logs record that you were the one who performed the actions on behalf of this user.": "\"Atuar como\" é essencialmente fazer logon como esse utilizador sem uma palavra passe. Você será capaz de executar qualquer ação como se fosse este utilizador e de pontos de vista de outros utilizadores, será como se este utilizador executou-os. No entanto, registos de auditoria registam que você foi o único que realizou as ações em nome desse utilizador.", - "@\"Act as\" is essentially logging in as this user without a password. You will be able to take any action as if you were this user, and from other users' points of views, it will be as if this user performed them. However, audit logs record that you were the one who performed the actions on behalf of this user.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Domain": "Domínio", - "@Domain": { - "description": "Text field hint for domain url input", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You must enter a valid domain": "É necessário introduzir um domínio válido", - "@You must enter a valid domain": { - "description": "Message displayed for domain input error", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "User ID": "ID do utilizador", - "@User ID": { - "description": "Text field hint for user ID input", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You must enter a user id": "É necessário introduzir uma id do utilizador", - "@You must enter a user id": { - "description": "Message displayed for user Id input error", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error trying to act as this user. Please check the Domain and User ID and try again.": "Houve um erro ao tentar agir como este utilizador. Por favor, verifique o Domínio e o ID do Utilizador e tente novamente.", - "@There was an error trying to act as this user. Please check the Domain and User ID and try again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "endMasqueradeMessage": "Vai deixar de agir como {userName} e voltar à sua conta original.", - "@endMasqueradeMessage": { - "description": "Confirmation message displayed when the user wants to stop acting (masquerading) as another user", - "type": "text", - "placeholders_order": [ - "userName" - ], - "placeholders": { - "userName": {} - } - }, - "endMasqueradeLogoutMessage": "Você vai deixar de agir como {userName} e será desconectado.", - "@endMasqueradeLogoutMessage": { - "description": "Confirmation message displayed when the user wants to stop acting (masquerading) as another user and will be logged out.", - "type": "text", - "placeholders_order": [ - "userName" - ], - "placeholders": { - "userName": {} - } - }, - "How are we doing?": "Como está?", - "@How are we doing?": { - "description": "Title for dialog asking user to rate the app out of 5 stars.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Don't show again": "Não apresentar novamente", - "@Don't show again": { - "description": "Button to prevent the rating dialog from showing again.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "What can we do better?": "O que podemos melhorar?", - "@What can we do better?": { - "description": "Hint text for providing a comment with the rating.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Send Feedback": "Enviar Comentários", - "@Send Feedback": { - "description": "Button to send rating with feedback", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "ratingDialogEmailSubject": "Sugestões para Android - Canvas Parent {version}", - "@ratingDialogEmailSubject": { - "description": "The subject for an email to provide feedback for CanvasParent.", - "type": "text", - "placeholders_order": [ - "version" - ], - "placeholders": { - "version": {} - } - }, - "starRating": "{position,plural, =1{{position} estrelas}other{{position} estrelas}}", - "@starRating": { - "description": "Accessibility label for the 1 stars to 5 stars rating", - "type": "text", - "placeholders_order": [ - "position" - ], - "placeholders": { - "position": { - "example": 1 - } - } - }, - "Student Pairing": "Parelhamento de alunos", - "@Student Pairing": { - "description": "Title for the screen where users can pair to students using a QR code", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Open Canvas Student": "Abrir Canvas Student", - "@Open Canvas Student": { - "description": "Title for QR pairing tutorial screen instructing users to open the Canvas Student app", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You'll need to open your student's Canvas Student app to continue. Go into Main Menu > Settings > Pair with Observer and scan the QR code you see there.": "Terá de abrir a aplicação Canvas Student do seu aluno para poder continuar. Vá ao Menu Principal > Configurações > Parelhar com Observador e digitalize o código QR que aí vê.", - "@You'll need to open your student's Canvas Student app to continue. Go into Main Menu > Settings > Pair with Observer and scan the QR code you see there.": { - "description": "Message explaining how QR code pairing works", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Screenshot showing location of pairing QR code generation in the Canvas Student app": "Imagem do ecrã mostrando a localização da geração do código QR de parelhamento na aplicação Canvas Student", - "@Screenshot showing location of pairing QR code generation in the Canvas Student app": { - "description": "Content Description for qr pairing tutorial screenshot", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Expired QR Code": "Código QR expirado", - "@Expired QR Code": { - "description": "Error title shown when the users scans a QR code that has expired", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The QR code you scanned may have expired. Refresh the code on the student's device and try again.": "O código QR que digitalizou pode ter expirado. Actualize o código no dispositivo do aluno e tente novamente.", - "@The QR code you scanned may have expired. Refresh the code on the student's device and try again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "A network error occurred when adding this student. Check your connection and try again.": "Ocorreu um erro de rede ao adicionar este aluno. Verifique a sua ligação e tente novamente.", - "@A network error occurred when adding this student. Check your connection and try again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Invalid QR Code": "Código QR inválido", - "@Invalid QR Code": { - "description": "Error title shown when the user scans an invalid QR code", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Incorrect Domain": "Domínio Incorrecto", - "@Incorrect Domain": { - "description": "Error title shown when the users scane a QR code for a student that belongs to a different domain", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The student you are trying to add belongs to a different school. Log in or create an account with that school to scan this code.": "O aluno que está a tentar acrescentar pertence a uma escola diferente. Inicie sessão ou crie uma conta com essa escola para digitalizar este código.", - "@The student you are trying to add belongs to a different school. Log in or create an account with that school to scan this code.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Camera Permission": "Permissão de câmara", - "@Camera Permission": { - "description": "Error title shown when the user wans to scan a QR code but has denied the camera permission", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "This will unpair and remove all enrollments for this student from your account.": "Isto irá desesperar e remover todas as inscrições para este aluno da sua conta.", - "@This will unpair and remove all enrollments for this student from your account.": { - "description": "Confirmation message shown when the user tries to delete a student from their account", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was a problem removing this student from your account. Please check your connection and try again.": "Houve um problema ao retirar este aluno da sua conta. É favor verificar sua conexão e tente novamente.", - "@There was a problem removing this student from your account. Please check your connection and try again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Cancel": "Cancelar", - "@Cancel": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "next": "Próximo", - "@next": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "ok": "OK", - "@ok": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Yes": "Sim", - "@Yes": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No": "Não", - "@No": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Retry": "Tentar novamente", - "@Retry": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Delete": "Eliminar", - "@Delete": { - "description": "Label used for general delete/remove actions", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Done": "Feito", - "@Done": { - "description": "Label for general done/finished actions", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Refresh": "Atualizar", - "@Refresh": { - "description": "Label for button to refresh data from the web", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "View Description": "Ver descrição", - "@View Description": { - "description": "Button to view the description for an event or assignment", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "expanded": "expandido", - "@expanded": { - "description": "Description for the accessibility reader for list groups that are expanded", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "collapsed": "recolhido", - "@collapsed": { - "description": "Description for the accessibility reader for list groups that are expanded", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "An unexpected error occurred": "Ocorreu um erro inesperado", - "@An unexpected error occurred": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No description": "Sem descrição", - "@No description": { - "description": "Message used when the assignment has no description", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Launch External Tool": "Lançar Ferramenta Externa", - "@Launch External Tool": { - "description": "Button text added to webviews to let users open external tools in their browser", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Interactions on this page are limited by your institution.": "As interações nesta página são limitadas pela sua instituição.", - "@Interactions on this page are limited by your institution.": { - "description": "Message describing how the webview has limited access due to an instution setting", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "dateAtTime": "{date} em {time}", - "@dateAtTime": { - "description": "The string to format dates", - "type": "text", - "placeholders_order": [ - "date", - "time" - ], - "placeholders": { - "date": {}, - "time": {} - } - }, - "dueDateAtTime": "Termina {date} a {time}", - "@dueDateAtTime": { - "description": "The string to format due dates", - "type": "text", - "placeholders_order": [ - "date", - "time" - ], - "placeholders": { - "date": {}, - "time": {} - } - }, - "No Due Date": "Sem data de limite", - "@No Due Date": { - "description": "Label for assignments that do not have a due date", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Filter": "Filtrar", - "@Filter": { - "description": "Label for buttons to filter what items are visible", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "unread": "não lida", - "@unread": { - "description": "Label for things that are marked as unread", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "unreadCount": "{count} não lida", - "@unreadCount": { - "description": "Formatted string for when there are a number of unread items", - "type": "text", - "placeholders_order": [ - "count" - ], - "placeholders": { - "count": {} - } - }, - "badgeNumberPlus": "{count}+", - "@badgeNumberPlus": { - "description": "Formatted string for when too many items are being notified in a badge, generally something like: 99+", - "type": "text", - "placeholders_order": [ - "count" - ], - "placeholders": { - "count": {} - } - }, - "There was an error loading this announcement": "Houve um erro ao carregar este anúncio", - "@There was an error loading this announcement": { - "description": "Message shown when an announcement detail screen fails to load", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Network error": "Erro de rede", - "@Network error": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Under Construction": "Em construção", - "@Under Construction": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "We are currently building this feature for your viewing pleasure.": "Estamos atualmente a construir esta funcionalidade para o seu prazer visual.", - "@We are currently building this feature for your viewing pleasure.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Request Login Help Button": "Solicitar botão de Ajuda de Login", - "@Request Login Help Button": { - "description": "Accessibility hint for button that opens help dialog for a login help request", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Request Login Help": "Solicitar Ajuda de Login", - "@Request Login Help": { - "description": "Title of help dialog for a login help request", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I'm having trouble logging in": "Estou a ter problemas para fazer login", - "@I'm having trouble logging in": { - "description": "Subject of help dialog for a login help request", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "An error occurred when trying to display this link": "Ocorreu um erro ao tentar mostrar esta ligação", - "@An error occurred when trying to display this link": { - "description": "Error message shown when a link can't be opened", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "We are unable to display this link, it may belong to an institution you currently aren't logged in to.": "Não podemos mostrar esta ligação, ela pode pertencer a uma instituição na qual você não está atualmente ligado.", - "@We are unable to display this link, it may belong to an institution you currently aren't logged in to.": { - "description": "Description for error page shown when clicking a link", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Link Error": "Erro de Ligação", - "@Link Error": { - "description": "Title for error page shown when clicking a link", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Open In Browser": "Abrir no Navegador", - "@Open In Browser": { - "description": "Text for button to open a link in the browswer", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You'll find the QR code on the web in your account profile. Click 'QR for Mobile Login' in the list.": "Encontrará o código QR na Internet no perfil da sua conta. Clique em 'QR para Login de Telemóvel' na lista.", - "@You'll find the QR code on the web in your account profile. Click 'QR for Mobile Login' in the list.": { - "description": "Text for qr login tutorial screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Locate QR Code": "Localizar código QR", - "@Locate QR Code": { - "description": "Text for qr login button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Please scan a QR code generated by Canvas": "Por favor, digitalize um código QR gerado pela Canvas", - "@Please scan a QR code generated by Canvas": { - "description": "Text for qr login error with incorrect qr code", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error logging in. Please generate another QR Code and try again.": "Houve um erro no registo. Por favor, gere outro código QR e tente novamente.", - "@There was an error logging in. Please generate another QR Code and try again.": { - "description": "Text for qr login error", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Screenshot showing location of QR code generation in browser": "Captura de tela mostrando a localização da geração do código QR no navegador", - "@Screenshot showing location of QR code generation in browser": { - "description": "Content Description for qr login tutorial screenshot", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "QR scanning requires camera access": "A digitalização QR requer acesso à câmara", - "@QR scanning requires camera access": { - "description": "placeholder for camera error for QR code scan", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The linked item is no longer available": "O item ligado já não está disponível", - "@The linked item is no longer available": { - "description": "error message when the alert could no be opened", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Message sent": "Mensagem enviada", - "@Message sent": { - "description": "confirmation message on the screen when the user succesfully sends a message", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Acceptable Use Policy": "Política de Utilização Aceitável", - "@Acceptable Use Policy": { - "description": "title for the acceptable use policy screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Submit": "Submeter", - "@Submit": { - "description": "submit button title for acceptable use policy screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Either you're a new user or the Acceptable Use Policy has changed since you last agreed to it. Please agree to the Acceptable Use Policy before you continue.": "Ou é um novo utilizador ou a Política de Utilização Aceitável mudou desde a última vez que concordou com ela. Por favor, aceite a Política de Utilização Aceitável antes de continuar.", - "@Either you're a new user or the Acceptable Use Policy has changed since you last agreed to it. Please agree to the Acceptable Use Policy before you continue.": { - "description": "acceptable use policy screen description", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I agree to the Acceptable Use Policy.": "Concordo com a Política de Utilização Aceitável.", - "@I agree to the Acceptable Use Policy.": { - "description": "acceptable use policy switch title", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "About": "Sobre", - "@About": { - "description": "Title for about menu item in settings", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "App": "Aplicação", - "@App": { - "description": "Title for App field on about page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Login ID": "ID de login", - "@Login ID": { - "description": "Title for Login ID field on about page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Email": "E-mail", - "@Email": { - "description": "Title for Email field on about page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Version": "Versão", - "@Version": { - "description": "Title for Version field on about page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Instructure logo": "Logótipo da Instructure", - "@Instructure logo": { - "description": "Semantics label for the Instructure logo on the about page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - } -} \ No newline at end of file diff --git a/apps/flutter_parent/lib/l10n/res/intl_ru.arb b/apps/flutter_parent/lib/l10n/res/intl_ru.arb deleted file mode 100644 index 8a19ee89e1..0000000000 --- a/apps/flutter_parent/lib/l10n/res/intl_ru.arb +++ /dev/null @@ -1,2753 +0,0 @@ -{ - "@@last_modified": "2023-08-25T11:04:20.901151", - "alertsLabel": "Предупреждения", - "@alertsLabel": { - "description": "The label for the Alerts tab", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "calendarLabel": "Календарь", - "@calendarLabel": { - "description": "The label for the Calendar tab", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "coursesLabel": "Курсы", - "@coursesLabel": { - "description": "The label for the Courses tab", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Students": "Студенты отсутствуют", - "@No Students": { - "description": "Text for when an observer has no students they are observing", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Tap to show student selector": "Коснитесь для отображения селектора студентов", - "@Tap to show student selector": { - "description": "Semantics label for the area that will show the student selector when tapped", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Tap to pair with a new student": "Коснитесь для связывания с новыми студентами", - "@Tap to pair with a new student": { - "description": "Semantics label for the add student button in the student selector", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Tap to select this student": "Коснитесь для выбора этого студента", - "@Tap to select this student": { - "description": "Semantics label on individual students in the student switcher", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Manage Students": "Управление студентами", - "@Manage Students": { - "description": "Label text for the Manage Students nav drawer button as well as the title for the Manage Students screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Help": "Справка", - "@Help": { - "description": "Label text for the help nav drawer button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Log Out": "Выйти", - "@Log Out": { - "description": "Label text for the Log Out nav drawer button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Switch Users": "Сменить пользователя", - "@Switch Users": { - "description": "Label text for the Switch Users nav drawer button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "appVersion": "в. {version}", - "@appVersion": { - "description": "App version shown in the navigation drawer", - "type": "text", - "placeholders_order": [ - "version" - ], - "placeholders": { - "version": {} - } - }, - "Are you sure you want to log out?": "Вы уверены, что вы хотите выйти?", - "@Are you sure you want to log out?": { - "description": "Confirmation message displayed when the user tries to log out", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Calendars": "Календари", - "@Calendars": { - "description": "Label for button that lets users select which calendars to display", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "nextMonth": "Следующий месяц: {month}", - "@nextMonth": { - "description": "Label for the button that switches the calendar to the next month", - "type": "text", - "placeholders_order": [ - "month" - ], - "placeholders": { - "month": {} - } - }, - "previousMonth": "Предыдущий месяц: {month}", - "@previousMonth": { - "description": "Label for the button that switches the calendar to the previous month", - "type": "text", - "placeholders_order": [ - "month" - ], - "placeholders": { - "month": {} - } - }, - "nextWeek": "Начало на следующей неделе {date}", - "@nextWeek": { - "description": "Label for the button that switches the calendar to the next week", - "type": "text", - "placeholders_order": [ - "date" - ], - "placeholders": { - "date": {} - } - }, - "previousWeek": "Начало на предыдущей неделе {date}", - "@previousWeek": { - "description": "Label for the button that switches the calendar to the previous week", - "type": "text", - "placeholders_order": [ - "date" - ], - "placeholders": { - "date": {} - } - }, - "selectedMonthLabel": "Месяц из {month}", - "@selectedMonthLabel": { - "description": "Accessibility label for the button that expands/collapses the month view", - "type": "text", - "placeholders_order": [ - "month" - ], - "placeholders": { - "month": {} - } - }, - "expand": "развернуть", - "@expand": { - "description": "Accessibility label for the on-tap hint for the button that expands/collapses the month view", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "collapse": "свернуть", - "@collapse": { - "description": "Accessibility label for the on-tap hint for the button that expands/collapses the month view", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "pointsPossible": "можно получить {points} баллов", - "@pointsPossible": { - "description": "Screen reader label used for the points possible for an assignment, quiz, etc.", - "type": "text", - "placeholders_order": [ - "points" - ], - "placeholders": { - "points": {} - } - }, - "calendarDaySemanticsLabel": "{eventCount,plural, =1{{date}, {eventCount} событие}other{{date}, {eventCount} события}}", - "@calendarDaySemanticsLabel": { - "description": "Screen reader label used for calendar day, reads the date and count of events", - "type": "text", - "placeholders_order": [ - "date", - "eventCount" - ], - "placeholders": { - "date": {}, - "eventCount": {} - } - }, - "No Events Today!": "На сегодня события отсутствуют!", - "@No Events Today!": { - "description": "Title displayed when there are no calendar events for the current day", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "It looks like a great day to rest, relax, and recharge.": "Похоже, что сегодня можно отдохнуть, расслабиться и набраться сил.", - "@It looks like a great day to rest, relax, and recharge.": { - "description": "Message displayed when there are no calendar events for the current day", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading your student's calendar": "Произошла ошибка при загрузке календаря ваших учащихся.", - "@There was an error loading your student's calendar": { - "description": "Message displayed when calendar events could not be loaded for the current student", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Tap to favorite the courses you want to see on the Calendar. Select up to 10.": "Коснитесь, чтобы отправить в избранное курсы, которые вам хотелось бы видеть в календаре. Выберите до 10.", - "@Tap to favorite the courses you want to see on the Calendar. Select up to 10.": { - "description": "Description text on calendar filter screen.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You may only choose 10 calendars to display": "Вы можете выбрать только 10 календарей для отображения", - "@You may only choose 10 calendars to display": { - "description": "Error text when trying to select more than 10 calendars", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You must select at least one calendar to display": "Вы должны выбрать как минимум один календарь для отображения", - "@You must select at least one calendar to display": { - "description": "Error text when trying to de-select all calendars", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Planner Note": "Примечание планировщика", - "@Planner Note": { - "description": "Label used for notes in the planner", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Go to today": "Перейти к сегодня", - "@Go to today": { - "description": "Accessibility label used for the today button in the planner", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Previous Logins": "Предыдущие идентификаторы", - "@Previous Logins": { - "description": "Label for the list of previous user logins", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "canvasLogoLabel": "Логотип Canvas", - "@canvasLogoLabel": { - "description": "The semantics label for the Canvas logo", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "findSchool": "Найти школу", - "@findSchool": { - "description": "Text for the find-my-school button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "findAnotherSchool": "Найти другую школу", - "@findAnotherSchool": { - "description": "Text for the find-another-school button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "domainSearchInputHint": "Введите название школы или округа…", - "@domainSearchInputHint": { - "description": "Input hint for the text box on the domain search screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "noDomainResults": "Невозможно найти школу, соответствующую \"{query}\"", - "@noDomainResults": { - "description": "Message shown to users when the domain search query did not return any results", - "type": "text", - "placeholders_order": [ - "query" - ], - "placeholders": { - "query": {} - } - }, - "domainSearchHelpLabel": "Как найти мою школу или округ?", - "@domainSearchHelpLabel": { - "description": "Label for the help button on the domain search screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "canvasGuides": "Руководства Canvas", - "@canvasGuides": { - "description": "Proper name for the Canvas Guides. This will be used in the domainSearchHelpBody text and will be highlighted and clickable", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "canvasSupport": "Поддержка Canvas", - "@canvasSupport": { - "description": "Proper name for Canvas Support. This will be used in the domainSearchHelpBody text and will be highlighted and clickable", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "domainSearchHelpBody": "Попытайтесь выполнить поиск названия школы или округа, к которым вы пытаетесь получить доступ, например, «частная школа Смита» или «школа графства Смит». Также вы можете ввести название домена Canvas напрямую, например, «smith.instructure.com.»\n\nДля получения более подробной информации по поиску учетной записи учреждения Canvas вы можете посетить {canvasGuides}, обратиться в {canvasSupport} или в свою школу за поддержкой.", - "@domainSearchHelpBody": { - "description": "The body text shown in the help dialog on the domain search screen", - "type": "text", - "placeholders_order": [ - "canvasGuides", - "canvasSupport" - ], - "placeholders": { - "canvasGuides": {}, - "canvasSupport": {} - } - }, - "Uh oh!": "Ой-ой!", - "@Uh oh!": { - "description": "Title of the screen that shows when a crash has occurred", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "We’re not sure what happened, but it wasn’t good. Contact us if this keeps happening.": "Мы не знаем точно, что произошло, но это нехорошо. Обратитесь к нам, если это происходит дальше.", - "@We’re not sure what happened, but it wasn’t good. Contact us if this keeps happening.": { - "description": "Message shown when a crash has occurred", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Contact Support": "Связаться со службой поддержки", - "@Contact Support": { - "description": "Label for the button that allows users to contact support after a crash has occurred", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "View error details": "Просмотр подробностей ошибки", - "@View error details": { - "description": "Label for the button that allowed users to view crash details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Restart app": "Перезапуск приложения", - "@Restart app": { - "description": "Label for the button that will restart the entire application", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Application version": "Версия приложения", - "@Application version": { - "description": "Label for the application version displayed in the crash details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Device model": "Модель устройства", - "@Device model": { - "description": "Label for the device model displayed in the crash details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Android OS version": "Версия ОС Android", - "@Android OS version": { - "description": "Label for the Android operating system version displayed in the crash details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Full error message": "Полное сообщение об ошибке", - "@Full error message": { - "description": "Label for the full error message displayed in the crash details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Inbox": "Входящие", - "@Inbox": { - "description": "Title for the Inbox screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading your inbox messages.": "Произошла ошибка при загрузке ваших сообщений из папки «Входящие».", - "@There was an error loading your inbox messages.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Subject": "Нет темы", - "@No Subject": { - "description": "Title used for inbox messages that have no subject", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unable to fetch courses. Please check your connection and try again.": "Невозможно сделать выборку курсов. Проверьте подключение и попробуйте еще раз.", - "@Unable to fetch courses. Please check your connection and try again.": { - "description": "Message shown when an error occured while loading courses", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Choose a course to message": "Выбрать курс для сообщения", - "@Choose a course to message": { - "description": "Header in the course list shown when the user is choosing which course to associate with a new message", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Inbox Zero": "Входящие Ноль", - "@Inbox Zero": { - "description": "Title of the message shown when there are no inbox messages", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You’re all caught up!": "Вы все нагнали!", - "@You’re all caught up!": { - "description": "Subtitle of the message shown when there are no inbox messages", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading recipients for this course": "Произошла ошибка при загрузке получателей для этого курса", - "@There was an error loading recipients for this course": { - "description": "Message shown when attempting to create a new message but the recipients list failed to load", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unable to send message. Check your connection and try again.": "Невозможно отправить сообщение. Проверьте подключение и попробуйте еще раз.", - "@Unable to send message. Check your connection and try again.": { - "description": "Message show when there was an error creating or sending a new message", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unsaved changes": "Несохраненные изменения", - "@Unsaved changes": { - "description": "Title of the dialog shown when the user tries to leave with unsaved changes", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Are you sure you wish to close this page? Your unsent message will be lost.": "Вы действительно хотите закрыть эту страницу? Ваше неотправленное сообщение будет потеряно.", - "@Are you sure you wish to close this page? Your unsent message will be lost.": { - "description": "Body text of the dialog shown when the user tries leave with unsaved changes", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "New message": "Новое сообщение", - "@New message": { - "description": "Title of the new-message screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Add attachment": "Добавить вложение", - "@Add attachment": { - "description": "Tooltip for the add-attachment button in the new-message screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Send message": "Отправить сообщение", - "@Send message": { - "description": "Tooltip for the send-message button in the new-message screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Select recipients": "Выбрать получателей", - "@Select recipients": { - "description": "Tooltip for the button that allows users to select message recipients", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No recipients selected": "Получатели не выбраны", - "@No recipients selected": { - "description": "Hint displayed when the user has not selected any message recipients", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Message subject": "Тема сообщения", - "@Message subject": { - "description": "Hint text displayed in the input field for the message subject", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Message": "Сообщение", - "@Message": { - "description": "Hint text displayed in the input field for the message body", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Recipients": "Получатели", - "@Recipients": { - "description": "Label for message recipients", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "plusRecipientCount": "+{count}", - "@plusRecipientCount": { - "description": "Shows the number of recipients that are selected but not displayed on screen.", - "type": "text", - "placeholders_order": [ - "count" - ], - "placeholders": { - "count": { - "example": 5 - } - } - }, - "Failed. Tap for options.": "Сбой. Коснитесь для просмотра опций.", - "@Failed. Tap for options.": { - "description": "Short message shown on a message attachment when uploading has failed", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "courseForWhom": "для {studentShortName}", - "@courseForWhom": { - "description": "Describes for whom a course is for (i.e. for Bill)", - "type": "text", - "placeholders_order": [ - "studentShortName" - ], - "placeholders": { - "studentShortName": {} - } - }, - "messageLinkPostscript": "Касательно: {studentName}, {linkUrl}", - "@messageLinkPostscript": { - "description": "A postscript appended to new messages that clarifies which student is the subject of the message and also includes a URL for the related Canvas component (course, assignment, event, etc).", - "type": "text", - "placeholders_order": [ - "studentName", - "linkUrl" - ], - "placeholders": { - "studentName": {}, - "linkUrl": {} - } - }, - "There was an error loading this conversation": "Произошла ошибка при загрузке этого обсуждения", - "@There was an error loading this conversation": { - "description": "Message shown when a conversation fails to load", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Reply": "Ответить", - "@Reply": { - "description": "Button label for replying to a conversation", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Reply All": "Ответить на все", - "@Reply All": { - "description": "Button label for replying to all conversation participants", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unknown User": "Неизвестный пользователь", - "@Unknown User": { - "description": "Label used where the user name is not known", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "me": "меня", - "@me": { - "description": "First-person pronoun (i.e. 'me') that will be used in message author info, e.g. 'Me to 4 others' or 'Jon Snow to me'", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "authorToRecipient": "{authorName} до {recipientName}", - "@authorToRecipient": { - "description": "Author info for a single-recipient message; includes both the author name and the recipient name.", - "type": "text", - "placeholders_order": [ - "authorName", - "recipientName" - ], - "placeholders": { - "authorName": {}, - "recipientName": {} - } - }, - "authorToNOthers": "{howMany,plural, =1{{authorName} до 1 другое}other{{authorName} до {howMany} другие}}", - "@authorToNOthers": { - "description": "Author info for a mutli-recipient message; includes the author name and the number of recipients", - "type": "text", - "placeholders_order": [ - "authorName", - "howMany" - ], - "placeholders": { - "authorName": {}, - "howMany": {} - } - }, - "authorToRecipientAndNOthers": "{howMany,plural, =1{{authorName} до {recipientName} и 1 другой}other{{authorName} до {recipientName} и {howMany} другие}}", - "@authorToRecipientAndNOthers": { - "description": "Author info for a multi-recipient message; includes the author name, one recipient name, and the number of other recipients", - "type": "text", - "placeholders_order": [ - "authorName", - "recipientName", - "howMany" - ], - "placeholders": { - "authorName": {}, - "recipientName": {}, - "howMany": {} - } - }, - "Download": "Скачать", - "@Download": { - "description": "Label for the button that will begin downloading a file", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Open with another app": "Открыть с помощью другого приложения", - "@Open with another app": { - "description": "Label for the button that will allow users to open a file with another app", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There are no installed applications that can open this file": "Нет установленных приложений, которые могут открыть этот файл", - "@There are no installed applications that can open this file": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unsupported File": "Неподдерживаемый файл", - "@Unsupported File": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "This file is unsupported and can’t be viewed through the app": "Этот файл не поддерживается и не может быть просмотрен в приложении", - "@This file is unsupported and can’t be viewed through the app": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unable to play this media file": "Невозможно воспроизвести этот медиафайл", - "@Unable to play this media file": { - "description": "Message shown when audio or video media could not be played", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unable to load this image": "Невозможно скачать это изображение", - "@Unable to load this image": { - "description": "Message shown when an image file could not be loaded or displayed", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading this file": "Произошла ошибка при загрузке этого файла", - "@There was an error loading this file": { - "description": "Message shown when a file could not be loaded or displayed", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Courses": "Курсы отсутствуют", - "@No Courses": { - "description": "Title for having no courses", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Your student’s courses might not be published yet.": "Курсы вашего студента пока еще не могут быть опубликованы.", - "@Your student’s courses might not be published yet.": { - "description": "Message for having no courses", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading your student’s courses.": "Произошла ошибка при загрузке курсов ваших студентов.", - "@There was an error loading your student’s courses.": { - "description": "Message displayed when the list of student courses could not be loaded", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Grade": "Нет оценки", - "@No Grade": { - "description": "Message shown when there is currently no grade available for a course", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Filter by": "Фильтровать по", - "@Filter by": { - "description": "Title for list of terms to filter grades by", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Grades": "Оценки", - "@Grades": { - "description": "Label for the \"Grades\" tab in course details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Syllabus": "Содержание курса", - "@Syllabus": { - "description": "Label for the \"Syllabus\" tab in course details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Front Page": "Первая страница", - "@Front Page": { - "description": "Label for the \"Front Page\" tab in course details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Summary": "Сводные данные", - "@Summary": { - "description": "Label for the \"Summary\" tab in course details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Send a message about this course": "Отправить сообщение об этом курсе", - "@Send a message about this course": { - "description": "Accessibility hint for the course messaage floating action button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Total Grade": "Общая оценка", - "@Total Grade": { - "description": "Label for the total grade in the course", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Graded": "С оценкой", - "@Graded": { - "description": "Label for assignments that have been graded", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Submitted": "Отправлено", - "@Submitted": { - "description": "Label for assignments that have been submitted", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Not Submitted": "Не отправлено", - "@Not Submitted": { - "description": "Label for assignments that have not been submitted", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Late": "Поздно", - "@Late": { - "description": "Label for assignments that have been marked late or submitted late", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Missing": "Отсутствует", - "@Missing": { - "description": "Label for assignments that have been marked missing or are not submitted and past the due date", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "-": "-", - "@-": { - "description": "Value representing no score for student submission", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "All Grading Periods": "Все академические периоды", - "@All Grading Periods": { - "description": "Label for selecting all grading periods", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Assignments": "Задания отсутствуют", - "@No Assignments": { - "description": "Title for the no assignments message", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "It looks like assignments haven't been created in this space yet.": "Похоже, что в этом разделе пока что не было создано ни одного задания.", - "@It looks like assignments haven't been created in this space yet.": { - "description": "Message for no assignments", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading the summary details for this course.": "Произошла ошибка при загрузке подробных сводных данных для этого курса.", - "@There was an error loading the summary details for this course.": { - "description": "Message shown when the course summary could not be loaded", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Summary": "Нет сводных данных", - "@No Summary": { - "description": "Title displayed when there are no items in the course summary", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "This course does not have any assignments or calendar events yet.": "Этот курс пока что не имеет никаких заданий или календарных событий.", - "@This course does not have any assignments or calendar events yet.": { - "description": "Message displayed when there are no items in the course summary", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "gradeFormatScoreOutOfPointsPossible": "{score} / {pointsPossible}", - "@gradeFormatScoreOutOfPointsPossible": { - "description": "Formatted string for a student score out of the points possible", - "type": "text", - "placeholders_order": [ - "score", - "pointsPossible" - ], - "placeholders": { - "score": {}, - "pointsPossible": {} - } - }, - "contentDescriptionScoreOutOfPointsPossible": "{score} из {pointsPossible} баллов", - "@contentDescriptionScoreOutOfPointsPossible": { - "description": "Formatted string for a student score out of the points possible", - "type": "text", - "placeholders_order": [ - "score", - "pointsPossible" - ], - "placeholders": { - "score": {}, - "pointsPossible": {} - } - }, - "gradesSubjectMessage": "Касательно: {studentName}, оценки", - "@gradesSubjectMessage": { - "description": "The subject line for a message to a teacher regarding a student's grades", - "type": "text", - "placeholders_order": [ - "studentName" - ], - "placeholders": { - "studentName": {} - } - }, - "syllabusSubjectMessage": "Касательно: {studentName}, содержание курса", - "@syllabusSubjectMessage": { - "description": "The subject line for a message to a teacher regarding a course syllabus", - "type": "text", - "placeholders_order": [ - "studentName" - ], - "placeholders": { - "studentName": {} - } - }, - "frontPageSubjectMessage": "Касательно: {studentName}, первая страница", - "@frontPageSubjectMessage": { - "description": "The subject line for a message to a teacher regarding a course front page", - "type": "text", - "placeholders_order": [ - "studentName" - ], - "placeholders": { - "studentName": {} - } - }, - "assignmentSubjectMessage": "Касательно: {studentName}, задание - {assignmentName}", - "@assignmentSubjectMessage": { - "description": "The subject line for a message to a teacher regarding a student's assignment", - "type": "text", - "placeholders_order": [ - "studentName", - "assignmentName" - ], - "placeholders": { - "studentName": {}, - "assignmentName": {} - } - }, - "eventSubjectMessage": "Касательно: {studentName}, событие - {eventTitle}", - "@eventSubjectMessage": { - "description": "The subject line for a message to a teacher regarding a calendar event", - "type": "text", - "placeholders_order": [ - "studentName", - "eventTitle" - ], - "placeholders": { - "studentName": {}, - "eventTitle": {} - } - }, - "There is no page information available.": "Нет доступной информации о странице.", - "@There is no page information available.": { - "description": "Description for when no page information is available", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Assignment Details": "Сведения о задании", - "@Assignment Details": { - "description": "Title for the page that shows details for an assignment", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "assignmentTotalPoints": "{points} баллов", - "@assignmentTotalPoints": { - "description": "Label used for the total points the assignment is worth", - "type": "text", - "placeholders_order": [ - "points" - ], - "placeholders": { - "points": {} - } - }, - "assignmentTotalPointsAccessible": "{points} баллов", - "@assignmentTotalPointsAccessible": { - "description": "Screen reader label used for the total points the assignment is worth", - "type": "text", - "placeholders_order": [ - "points" - ], - "placeholders": { - "points": {} - } - }, - "Due": "Срок", - "@Due": { - "description": "Label for an assignment due date", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Grade": "Оценка", - "@Grade": { - "description": "Label for the section that displays an assignment's grade", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Locked": "Заблокировано", - "@Locked": { - "description": "Label for when an assignment is locked", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "assignmentLockedModule": "Это задание заблокировано модулем \"{moduleName}\".", - "@assignmentLockedModule": { - "description": "The locked description when an assignment is locked by a module", - "type": "text", - "placeholders_order": [ - "moduleName" - ], - "placeholders": { - "moduleName": {} - } - }, - "Remind Me": "Напомнить", - "@Remind Me": { - "description": "Label for the row to set reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Set a date and time to be notified of this specific assignment.": "Задать дату и время уведомления об этом конкретном задании.", - "@Set a date and time to be notified of this specific assignment.": { - "description": "Description for row to set reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You will be notified about this assignment on…": "Вы будете уведомлены об этом задании…", - "@You will be notified about this assignment on…": { - "description": "Description for when a reminder is set", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Instructions": "Инструкции", - "@Instructions": { - "description": "Label for the description of the assignment when it has quiz instructions", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Send a message about this assignment": "Отправить сообщение об этом задании", - "@Send a message about this assignment": { - "description": "Accessibility hint for the assignment messaage floating action button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "This app is not authorized for use.": "Это приложение не авторизовано для использования.", - "@This app is not authorized for use.": { - "description": "The error shown when the app being used is not verified by Canvas", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The server you entered is not authorized for this app.": "Введенный сервер не авторизован для этого приложения.", - "@The server you entered is not authorized for this app.": { - "description": "The error shown when the desired login domain is not verified by Canvas", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The user agent for this app is not authorized.": "Пользовательский агент для этого приложения не авторизован.", - "@The user agent for this app is not authorized.": { - "description": "The error shown when the user agent during verification is not verified by Canvas", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "We were unable to verify the server for use with this app.": "Мы не смогли проверить сервер для использования с этим приложением.", - "@We were unable to verify the server for use with this app.": { - "description": "The generic error shown when we are unable to verify with Canvas", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Reminders": "Оповещения", - "@Reminders": { - "description": "Name of the system notification channel for assignment and event reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Notifications for reminders about assignments and calendar events": "Уведомления по напоминаниям о заданиях и календарных событиях", - "@Notifications for reminders about assignments and calendar events": { - "description": "Description of the system notification channel for assignment and event reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Reminders have changed!": "Напоминания изменились!", - "@Reminders have changed!": { - "description": "Title of the dialog shown when the user needs to update their reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "In order to provide you with a better experience, we have updated how reminders work. You can add new reminders by viewing an assignment or calendar event and tapping the switch under the \"Remind Me\" section.\n\nBe aware that any reminders created with older versions of this app will not be compatible with the new changes and you will need to create them again.": "Для обеспечения высокого качества обслуживания мы обновили порядок использования напоминаний. Добавить новые напоминания можно, просмотрев задание или событие календаря и нажав переключатель в разделе «Напоминание».\n\nСледует иметь в виду, что напоминания, созданные с помощью старых версий данного приложения, не будут совместимы с новыми изменениями, и их нужно будет создавать заново.", - "@In order to provide you with a better experience, we have updated how reminders work. You can add new reminders by viewing an assignment or calendar event and tapping the switch under the \"Remind Me\" section.\n\nBe aware that any reminders created with older versions of this app will not be compatible with the new changes and you will need to create them again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Not a parent?": "Не являетесь родителем?", - "@Not a parent?": { - "description": "Title for the screen that shows when the user is not observing any students", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "We couldn't find any students associated with this account": "Мы не смогли найти студентов, ассоциированных с этой учетной записью", - "@We couldn't find any students associated with this account": { - "description": "Subtitle for the screen that shows when the user is not observing any students", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Are you a student or teacher?": "Вы студент или преподаватель?", - "@Are you a student or teacher?": { - "description": "Label for button that will show users the option to view other Canvas apps in the Play Store", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "One of our other apps might be a better fit. Tap one to visit the Play Store.": "Одно из наших других приложений может подойти лучше. Прикоснитесь один раз для входа в Play Store.", - "@One of our other apps might be a better fit. Tap one to visit the Play Store.": { - "description": "Description of options to view other Canvas apps in the Play Store", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Return to Login": "Вернуться к авторизации", - "@Return to Login": { - "description": "Label for the button that returns the user to the login screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "STUDENT": "СТУДЕНТ", - "@STUDENT": { - "description": "The \"student\" portion of the \"Canvas Student\" app name, in all caps. \"Canvas\" is excluded in this context as it will be displayed to the user as a wordmark image", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "TEACHER": "ПРЕПОДАВАТЕЛЬ", - "@TEACHER": { - "description": "The \"teacher\" portion of the \"Canvas Teacher\" app name, in all caps. \"Canvas\" is excluded in this context as it will be displayed to the user as a wordmark image", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Canvas Student": "Студент Canvas", - "@Canvas Student": { - "description": "The name of the Canvas Student app. Only \"Student\" should be translated as \"Canvas\" is a brand name in this context and should not be translated.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Canvas Teacher": "Преподаватель Canvas", - "@Canvas Teacher": { - "description": "The name of the Canvas Teacher app. Only \"Teacher\" should be translated as \"Canvas\" is a brand name in this context and should not be translated.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Alerts": "Нет оповещений", - "@No Alerts": { - "description": "The title for the empty message to show to users when there are no alerts for the student.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There’s nothing to be notified of yet.": "На данный момент оповещать не о чем.", - "@There’s nothing to be notified of yet.": { - "description": "The empty message to show to users when there are no alerts for the student.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "dismissAlertLabel": "Исключить {alertTitle}", - "@dismissAlertLabel": { - "description": "Accessibility label to dismiss an alert", - "type": "text", - "placeholders_order": [ - "alertTitle" - ], - "placeholders": { - "alertTitle": {} - } - }, - "Course Announcement": "Объявление о курсе", - "@Course Announcement": { - "description": "Title for alerts when there is a course announcement", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Institution Announcement": "Объявление об учебном заведении", - "@Institution Announcement": { - "description": "Title for alerts when there is an institution announcement", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "assignmentGradeAboveThreshold": "Оценка за задание выше {threshold}", - "@assignmentGradeAboveThreshold": { - "description": "Title for alerts when an assignment grade is above the threshold value", - "type": "text", - "placeholders_order": [ - "threshold" - ], - "placeholders": { - "threshold": {} - } - }, - "assignmentGradeBelowThreshold": "Оценка за задание ниже {threshold}", - "@assignmentGradeBelowThreshold": { - "description": "Title for alerts when an assignment grade is below the threshold value", - "type": "text", - "placeholders_order": [ - "threshold" - ], - "placeholders": { - "threshold": {} - } - }, - "courseGradeAboveThreshold": "Оценка за курс выше {threshold}", - "@courseGradeAboveThreshold": { - "description": "Title for alerts when a course grade is above the threshold value", - "type": "text", - "placeholders_order": [ - "threshold" - ], - "placeholders": { - "threshold": {} - } - }, - "courseGradeBelowThreshold": "Оценка за курс ниже {threshold}", - "@courseGradeBelowThreshold": { - "description": "Title for alerts when a course grade is below the threshold value", - "type": "text", - "placeholders_order": [ - "threshold" - ], - "placeholders": { - "threshold": {} - } - }, - "Settings": "Настройки", - "@Settings": { - "description": "Title for the settings screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Theme": "Тема", - "@Theme": { - "description": "Label for the light/dark theme section in the settings page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Dark Mode": "Темный режим", - "@Dark Mode": { - "description": "Label for the button that enables dark mode", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Light Mode": "Светлый режим", - "@Light Mode": { - "description": "Label for the button that enables light mode", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "High Contrast Mode": "Высококонтрастный режим", - "@High Contrast Mode": { - "description": "Label for the switch that toggles high contrast mode", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Use Dark Theme in Web Content": "Использовать темную тему в веб-контенте", - "@Use Dark Theme in Web Content": { - "description": "Label for the switch that toggles dark mode for webviews", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Appearance": "Представление", - "@Appearance": { - "description": "Label for the appearance section in the settings page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Successfully submitted!": "Успешно отправлено!", - "@Successfully submitted!": { - "description": "Title displayed in the grade cell for an assignment that has been submitted", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "submissionStatusSuccessSubtitle": "Это задание было отправлено {date} в {time} и ожидает оценки", - "@submissionStatusSuccessSubtitle": { - "description": "Subtitle displayed in the grade cell for an assignment that has been submitted and is awaiting a grade", - "type": "text", - "placeholders_order": [ - "date", - "time" - ], - "placeholders": { - "date": {}, - "time": {} - } - }, - "outOfPoints": "{howMany,plural, =1{Из 1 балла}other{Из {points} баллов}}", - "@outOfPoints": { - "description": "Description for an assignment grade that has points without a current scoroe", - "type": "text", - "placeholders_order": [ - "points", - "howMany" - ], - "placeholders": { - "points": {}, - "howMany": {} - } - }, - "Excused": "По уважительной причине", - "@Excused": { - "description": "Grading status for an assignment marked as excused", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Complete": "Завершить", - "@Complete": { - "description": "Grading status for an assignment marked as complete", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Incomplete": "Не завершено", - "@Incomplete": { - "description": "Grading status for an assignment marked as incomplete", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "minus": "минус", - "@minus": { - "description": "Screen reader-friendly replacement for the \"-\" character in letter grades like \"A-\"", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "latePenalty": "Снижение оценки за опоздание (-{pointsLost})", - "@latePenalty": { - "description": "Text displayed when a late penalty has been applied to the assignment", - "type": "text", - "placeholders_order": [ - "pointsLost" - ], - "placeholders": { - "pointsLost": {} - } - }, - "finalGrade": "Итоговая оценка: {grade}", - "@finalGrade": { - "description": "Text that displays the final grade of an assignment", - "type": "text", - "placeholders_order": [ - "grade" - ], - "placeholders": { - "grade": {} - } - }, - "Alert Settings": "Настройки оповещения", - "@Alert Settings": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Alert me when…": "Оповестить меня, когда…", - "@Alert me when…": { - "description": "Header for the screen where the observer chooses the thresholds that will determine when they receive alerts (e.g. when an assignment is graded below 70%)", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Course grade below": "Оценка за курс ниже", - "@Course grade below": { - "description": "Label describing the threshold for when the course grade is below a certain percentage", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Course grade above": "Оценка за курс выше", - "@Course grade above": { - "description": "Label describing the threshold for when the course grade is above a certain percentage", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Assignment missing": "Задание отсутствует", - "@Assignment missing": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Assignment grade below": "Оценка за задание ниже", - "@Assignment grade below": { - "description": "Label describing the threshold for when an assignment is graded below a certain percentage", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Assignment grade above": "Оценка за задание выше", - "@Assignment grade above": { - "description": "Label describing the threshold for when an assignment is graded above a certain percentage", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Course Announcements": "Объявления курса", - "@Course Announcements": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Institution Announcements": "Объявления заведения", - "@Institution Announcements": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Never": "Никогда", - "@Never": { - "description": "Indication that tells the user they will not receive alert notifications of a specific kind", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Grade percentage": "Процент оценок", - "@Grade percentage": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading your student's alerts.": "Произошла ошибка при загрузке оповещений ваших студентов.", - "@There was an error loading your student's alerts.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Must be below 100": "Должно быть меньше 100", - "@Must be below 100": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "mustBeBelowN": "Должно быть меньше {percentage}", - "@mustBeBelowN": { - "description": "Validation error to the user that they must choose a percentage below 'n'", - "type": "text", - "placeholders_order": [ - "percentage" - ], - "placeholders": { - "percentage": { - "example": 5 - } - } - }, - "mustBeAboveN": "Должно быть больше {percentage}", - "@mustBeAboveN": { - "description": "Validation error to the user that they must choose a percentage above 'n'", - "type": "text", - "placeholders_order": [ - "percentage" - ], - "placeholders": { - "percentage": { - "example": 5 - } - } - }, - "Select Student Color": "Выбрать цвет студента", - "@Select Student Color": { - "description": "Title for screen that allows users to assign a color to a specific student", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Electric, blue": "Электрик, синий", - "@Electric, blue": { - "description": "Name of the Electric (blue) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Plum, Purple": "Слива, фиолетовый", - "@Plum, Purple": { - "description": "Name of the Plum (purple) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Barney, Fuschia": "Барни, фуксия", - "@Barney, Fuschia": { - "description": "Name of the Barney (fuschia) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Raspberry, Red": "Малина, красный", - "@Raspberry, Red": { - "description": "Name of the Raspberry (red) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Fire, Orange": "Огонь, оранжевый", - "@Fire, Orange": { - "description": "Name of the Fire (orange) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Shamrock, Green": "Трилистник, зеленый", - "@Shamrock, Green": { - "description": "Name of the Shamrock (green) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "An error occurred while saving your selection. Please try again.": "Произошла ошибка при сохранении вашего выбора. Попробуйте еще раз.", - "@An error occurred while saving your selection. Please try again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "changeStudentColorLabel": "Изменить цвет для {studentName}", - "@changeStudentColorLabel": { - "description": "Accessibility label for the button that lets users change the color associated with a specific student", - "type": "text", - "placeholders_order": [ - "studentName" - ], - "placeholders": { - "studentName": {} - } - }, - "Teacher": "Преподаватель", - "@Teacher": { - "description": "Label for the Teacher enrollment type", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Student": "Студент", - "@Student": { - "description": "Label for the Student enrollment type", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "TA": "TA", - "@TA": { - "description": "Label for the Teaching Assistant enrollment type (also known as Teacher Aid or Education Assistant), reduced to a short acronym/initialism if appropriate.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Observer": "Наблюдатель", - "@Observer": { - "description": "Label for the Observer enrollment type", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Use Camera": "Использование камеры", - "@Use Camera": { - "description": "Label for the action item that lets the user capture a photo using the device camera", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Upload File": "Загрузить файл", - "@Upload File": { - "description": "Label for the action item that lets the user upload a file from their device", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Choose from Gallery": "Выбрать из галереи", - "@Choose from Gallery": { - "description": "Label for the action item that lets the user select a photo from their device gallery", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Preparing…": "Подготовка...", - "@Preparing…": { - "description": "Message shown while a file is being prepared to attach to a message", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Add student with…": "Добавить студента с…", - "@Add student with…": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Add Student": "Добавить студента", - "@Add Student": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You are not observing any students.": "Вы не наблюдаете ни за одни студентом.", - "@You are not observing any students.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading your students.": "Произошла ошибка при загрузке ваших студентов.", - "@There was an error loading your students.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Pairing Code": "Код сопряжения", - "@Pairing Code": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Students can obtain a pairing code through the Canvas website": "Студенты могут получить код подключения на веб-сайте Canvas", - "@Students can obtain a pairing code through the Canvas website": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Enter the student pairing code provided to you. If the pairing code doesn't work, it may have expired": "Введите предоставленный вам код сопряжения студентов. Если сопряжение не работает, срок его действия может закончиться", - "@Enter the student pairing code provided to you. If the pairing code doesn't work, it may have expired": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Your code is incorrect or expired.": "Ваш код неверен, или истек срок его действия.", - "@Your code is incorrect or expired.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Something went wrong trying to create your account, please reach out to your school for assistance.": "Что-то пошло не так при попытке создания вашей учетной записи. Обратитесь в свою школу за помощью.", - "@Something went wrong trying to create your account, please reach out to your school for assistance.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "QR Code": "QR-код", - "@QR Code": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Students can create a QR code using the Canvas Student app on their mobile device": "Студенты могут создать QR-код с помощью приложения Canvas Student на своем мобильном устройстве", - "@Students can create a QR code using the Canvas Student app on their mobile device": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Add new student": "Добавить нового студента", - "@Add new student": { - "description": "Semantics label for the FAB on the Manage Students Screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Select": "Выбрать", - "@Select": { - "description": "Hint text to tell the user to choose one of two options", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I have a Canvas account": "У меня есть учетная запись Canvas", - "@I have a Canvas account": { - "description": "Option to select for users that have a canvas account", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I don't have a Canvas account": "У меня нет учетной записи Canvas", - "@I don't have a Canvas account": { - "description": "Option to select for users that don't have a canvas account", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Create Account": "Создать учетную запись", - "@Create Account": { - "description": "Button text for account creation confirmation", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Full Name": "Полное имя", - "@Full Name": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Email Address": "Адрес электронной почты", - "@Email Address": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Password": "Пароль", - "@Password": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Full Name…": "Полное имя...", - "@Full Name…": { - "description": "hint label for inside form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Email…": "Электронная почта...", - "@Email…": { - "description": "hint label for inside form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Password…": "Пароль...", - "@Password…": { - "description": "hint label for inside form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Please enter full name": "Введите полное имя", - "@Please enter full name": { - "description": "Error message for form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Please enter an email address": "Введите адрес эл. почты", - "@Please enter an email address": { - "description": "Error message for form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Please enter a valid email address": "Введите действительный адрес эл. почты", - "@Please enter a valid email address": { - "description": "Error message for form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Password is required": "Требуется пароль", - "@Password is required": { - "description": "Error message for form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Password must contain at least 8 characters": "Пароль должен содержать не менее 8 символов", - "@Password must contain at least 8 characters": { - "description": "Error message for form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "qrCreateAccountTos": "Нажимая «Создать учетную запись», вы соглашаетесь с {termsOfService} и признаете {privacyPolicy}", - "@qrCreateAccountTos": { - "description": "The text show on the account creation screen", - "type": "text", - "placeholders_order": [ - "termsOfService", - "privacyPolicy" - ], - "placeholders": { - "termsOfService": {}, - "privacyPolicy": {} - } - }, - "Terms of Service": "Условия предоставления услуг", - "@Terms of Service": { - "description": "Label for the Canvas Terms of Service agreement. This will be used in the qrCreateAccountTos text and will be highlighted and clickable", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Privacy Policy": "Политика конфиденциальности", - "@Privacy Policy": { - "description": "Label for the Canvas Privacy Policy agreement. This will be used in the qrCreateAccountTos text and will be highlighted and clickable", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "View the Privacy Policy": "Посмотреть политику конфиденциальности", - "@View the Privacy Policy": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Already have an account? ": "Уже есть учетная запись? ", - "@Already have an account? ": { - "description": "Part of multiline text span, includes AccountSignIn1-2, in that order", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Sign In": "Войти в систему", - "@Sign In": { - "description": "Part of multiline text span, includes AccountSignIn1-2, in that order", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Hide Password": "Скрыть пароль", - "@Hide Password": { - "description": "content description for password hide button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Show Password": "Показать пароль", - "@Show Password": { - "description": "content description for password show button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Terms of Service Link": "Ссылка на условия обслуживания", - "@Terms of Service Link": { - "description": "content description for terms of service link", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Privacy Policy Link": "Ссылка на политику конфиденциальности", - "@Privacy Policy Link": { - "description": "content description for privacy policy link", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Event": "Событие", - "@Event": { - "description": "Title for the event details screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Date": "Дата", - "@Date": { - "description": "Label for the event date", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Location": "Местоположение", - "@Location": { - "description": "Label for the location information", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Location Specified": "Местоположение не указано", - "@No Location Specified": { - "description": "Description for events that do not have a location", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "eventTime": "{startAt} - {endAt}", - "@eventTime": { - "description": "The time the event is happening, example: \"2:00 pm - 4:00 pm\"", - "type": "text", - "placeholders_order": [ - "startAt", - "endAt" - ], - "placeholders": { - "startAt": {}, - "endAt": {} - } - }, - "Set a date and time to be notified of this event.": "Задать дату и время уведомления об этом событии.", - "@Set a date and time to be notified of this event.": { - "description": "Description for row to set event reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You will be notified about this event on…": "Вы будете уведомлены об этом событии…", - "@You will be notified about this event on…": { - "description": "Description for when an event reminder is set", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Share Your Love for the App": "Поделитесь своей любовью к приложению", - "@Share Your Love for the App": { - "description": "Label for option to open the app store", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Tell us about your favorite parts of the app": "Расскажите нам о своих любимых моментах приложения", - "@Tell us about your favorite parts of the app": { - "description": "Description for option to open the app store", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Legal": "Юридические вопросы", - "@Legal": { - "description": "Label for legal information option", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Privacy policy, terms of use, open source": "Политика конфиденциальности, условия использования, открытый источник", - "@Privacy policy, terms of use, open source": { - "description": "Description for legal information option", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Idea for Canvas Parent App [Android]": "Идея для приложения Canvas Родители [Android]", - "@Idea for Canvas Parent App [Android]": { - "description": "The subject for the email to request a feature", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The following information will help us better understand your idea:": "Следующая информация поможет нам лучше понять вашу идею:", - "@The following information will help us better understand your idea:": { - "description": "The header for the users information that is attached to a feature request", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Domain:": "Домен:", - "@Domain:": { - "description": "The label for the Canvas domain of the logged in user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "User ID:": "Идентификатор пользователя:", - "@User ID:": { - "description": "The label for the Canvas user ID of the logged in user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Email:": "Эл. почта:", - "@Email:": { - "description": "The label for the eamil of the logged in user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Locale:": "Язык:", - "@Locale:": { - "description": "The label for the locale of the logged in user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Terms of Use": "Условия использования", - "@Terms of Use": { - "description": "Label for the terms of use", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Canvas on GitHub": "Canvas на GitHub", - "@Canvas on GitHub": { - "description": "Label for the button that opens the Canvas project on GitHub's website", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was a problem loading the Terms of Use": "Возникала проблема при загрузке условий использования", - "@There was a problem loading the Terms of Use": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Device": "Устройство", - "@Device": { - "description": "Label used for device manufacturer/model in the error report", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "OS Version": "Версия ОС", - "@OS Version": { - "description": "Label used for device operating system version in the error report", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Version Number": "Номер версии", - "@Version Number": { - "description": "Label used for the app version number in the error report", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Report A Problem": "Сообщить о проблеме", - "@Report A Problem": { - "description": "Title used for generic dialog to report problems", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Subject": "Тема", - "@Subject": { - "description": "Label used for Subject text field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "A subject is required.": "Необходима тема.", - "@A subject is required.": { - "description": "Error shown when the subject field is empty", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "An email address is required.": "Необходим адрес электронной почты.", - "@An email address is required.": { - "description": "Error shown when the email field is empty", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Description": "Описание", - "@Description": { - "description": "Label used for Description text field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "A description is required.": "Требуется описание.", - "@A description is required.": { - "description": "Error shown when the description field is empty", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "How is this affecting you?": "Как это влияет на вас?", - "@How is this affecting you?": { - "description": "Label used for the dropdown to select how severe the issue is", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "send": "отправить", - "@send": { - "description": "Label used for send button when reporting a problem", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Just a casual question, comment, idea, suggestion…": "Просто обычный вопрос, комментарий, идея, предложение...", - "@Just a casual question, comment, idea, suggestion…": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I need some help but it's not urgent.": "Мне нужна помощь, но это не срочно.", - "@I need some help but it's not urgent.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Something's broken but I can work around it to get what I need done.": "Что-то не работает, но я могу обойтись без этого, чтобы получить то, что мне нужно сделать.", - "@Something's broken but I can work around it to get what I need done.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I can't get things done until I hear back from you.": "Я не могу добиться своей цели, пока не услышу от вас ответа.", - "@I can't get things done until I hear back from you.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "EXTREME CRITICAL EMERGENCY!!": "ЧРЕЗВЫЧАЙНО КРИТИЧЕСКАЯ СИТУАЦИЯ!!", - "@EXTREME CRITICAL EMERGENCY!!": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Not Graded": "Оценка не выставлена", - "@Not Graded": { - "description": "Description for an assignment has not been graded.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Login flow: Normal": "Процесс авторизации: Обычный", - "@Login flow: Normal": { - "description": "Description for the normal login flow", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Login flow: Canvas": "Процесс авторизации: Canvas", - "@Login flow: Canvas": { - "description": "Description for the Canvas login flow", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Login flow: Site Admin": "Процесс авторизации: Администратор сайта", - "@Login flow: Site Admin": { - "description": "Description for the Site Admin login flow", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Login flow: Skip mobile verify": "Процесс авторизации: Пропустить проверку мобильного устройства", - "@Login flow: Skip mobile verify": { - "description": "Description for the login flow that skips domain verification for mobile", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Act As User": "Действовать как пользователь", - "@Act As User": { - "description": "Label for the button that allows the user to act (masquerade) as another user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Stop Acting as User": "Перестать действовать как пользователь", - "@Stop Acting as User": { - "description": "Label for the button that allows the user to stop acting (masquerading) as another user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "actingAsUser": "Вы действуете как {userName}", - "@actingAsUser": { - "description": "Message shown while acting (masquerading) as another user", - "type": "text", - "placeholders_order": [ - "userName" - ], - "placeholders": { - "userName": {} - } - }, - "\"Act as\" is essentially logging in as this user without a password. You will be able to take any action as if you were this user, and from other users' points of views, it will be as if this user performed them. However, audit logs record that you were the one who performed the actions on behalf of this user.": "«Действовать как пользователь» является по существу входом в систему в качестве этого пользователя без пароля. Вы сможете совершать любые действия, как если бы вы были этим пользователем, а для других пользователей это будет выглядеть так, как будто эти действия совершил этот пользователь. Тем не менее, в контрольных журналах записывается информация от том, что именно вы выполняли указанные действия от имени этого пользователя.", - "@\"Act as\" is essentially logging in as this user without a password. You will be able to take any action as if you were this user, and from other users' points of views, it will be as if this user performed them. However, audit logs record that you were the one who performed the actions on behalf of this user.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Domain": "Домен", - "@Domain": { - "description": "Text field hint for domain url input", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You must enter a valid domain": "Необходимо указать действительный домен", - "@You must enter a valid domain": { - "description": "Message displayed for domain input error", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "User ID": "Идентификатор пользователя", - "@User ID": { - "description": "Text field hint for user ID input", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You must enter a user id": "Необходимо ввести идентификатор пользователя", - "@You must enter a user id": { - "description": "Message displayed for user Id input error", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error trying to act as this user. Please check the Domain and User ID and try again.": "Произошла ошибка при попытке использования функции «Действовать как пользователь». Проверьте домен и идентификатор пользователя и повторите попытку.", - "@There was an error trying to act as this user. Please check the Domain and User ID and try again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "endMasqueradeMessage": "Функция «Действовать как {userName}» будет отключена и вы вернетесь в свою исходную учетную запись.", - "@endMasqueradeMessage": { - "description": "Confirmation message displayed when the user wants to stop acting (masquerading) as another user", - "type": "text", - "placeholders_order": [ - "userName" - ], - "placeholders": { - "userName": {} - } - }, - "endMasqueradeLogoutMessage": "Функция «Действовать как {userName}» будет отключена, и сеанс будет завершен.", - "@endMasqueradeLogoutMessage": { - "description": "Confirmation message displayed when the user wants to stop acting (masquerading) as another user and will be logged out.", - "type": "text", - "placeholders_order": [ - "userName" - ], - "placeholders": { - "userName": {} - } - }, - "How are we doing?": "Как мы работаем?", - "@How are we doing?": { - "description": "Title for dialog asking user to rate the app out of 5 stars.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Don't show again": "Не показывать снова", - "@Don't show again": { - "description": "Button to prevent the rating dialog from showing again.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "What can we do better?": "Что мы можем сделать лучше?", - "@What can we do better?": { - "description": "Hint text for providing a comment with the rating.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Send Feedback": "Отправить оценку", - "@Send Feedback": { - "description": "Button to send rating with feedback", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "ratingDialogEmailSubject": "Предложения для Android - Canvas Parent {version}", - "@ratingDialogEmailSubject": { - "description": "The subject for an email to provide feedback for CanvasParent.", - "type": "text", - "placeholders_order": [ - "version" - ], - "placeholders": { - "version": {} - } - }, - "starRating": "{position,plural, =1{{position} звезда}other{{position} звезд(-ы)}}", - "@starRating": { - "description": "Accessibility label for the 1 stars to 5 stars rating", - "type": "text", - "placeholders_order": [ - "position" - ], - "placeholders": { - "position": { - "example": 1 - } - } - }, - "Student Pairing": "Подключение студентов", - "@Student Pairing": { - "description": "Title for the screen where users can pair to students using a QR code", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Open Canvas Student": "Откройте Canvas Student", - "@Open Canvas Student": { - "description": "Title for QR pairing tutorial screen instructing users to open the Canvas Student app", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You'll need to open your student's Canvas Student app to continue. Go into Main Menu > Settings > Pair with Observer and scan the QR code you see there.": "Вам понадобится открыть приложение Canvas Student, чтобы продолжить. Перейдите в Главное меню > Настройки > Подключить к Observer и отсканируйте QR-код, который вы видите здесь.", - "@You'll need to open your student's Canvas Student app to continue. Go into Main Menu > Settings > Pair with Observer and scan the QR code you see there.": { - "description": "Message explaining how QR code pairing works", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Screenshot showing location of pairing QR code generation in the Canvas Student app": "Снимок экрана, на котором показано расположение генерирования QR-кода для подключения в приложение Canvas Student", - "@Screenshot showing location of pairing QR code generation in the Canvas Student app": { - "description": "Content Description for qr pairing tutorial screenshot", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Expired QR Code": "QR-код с истекшим сроком действия", - "@Expired QR Code": { - "description": "Error title shown when the users scans a QR code that has expired", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The QR code you scanned may have expired. Refresh the code on the student's device and try again.": "У отсканированного вами QR-кода мог истечь срок действия. Обновите код на устройстве студента и попробуйте еще раз.", - "@The QR code you scanned may have expired. Refresh the code on the student's device and try again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "A network error occurred when adding this student. Check your connection and try again.": "При добавлении студента произошла ошибка. Проверьте подключение и попробуйте еще раз.", - "@A network error occurred when adding this student. Check your connection and try again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Invalid QR Code": "Неверный QR-код", - "@Invalid QR Code": { - "description": "Error title shown when the user scans an invalid QR code", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Incorrect Domain": "Неверный домен", - "@Incorrect Domain": { - "description": "Error title shown when the users scane a QR code for a student that belongs to a different domain", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The student you are trying to add belongs to a different school. Log in or create an account with that school to scan this code.": "Студент, которого вы пытаетесь добавить, относится к другому факультету. Выполните вход или создайте учетную запись на этом факультете, чтобы отсканировать этот код.", - "@The student you are trying to add belongs to a different school. Log in or create an account with that school to scan this code.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Camera Permission": "Разрешение для камеры", - "@Camera Permission": { - "description": "Error title shown when the user wans to scan a QR code but has denied the camera permission", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "This will unpair and remove all enrollments for this student from your account.": "Это приведет к отключению и удалению всех зачислений для этого студента из вашей учетной записи.", - "@This will unpair and remove all enrollments for this student from your account.": { - "description": "Confirmation message shown when the user tries to delete a student from their account", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was a problem removing this student from your account. Please check your connection and try again.": "Возникла проблема при удалении этого студента из вашей учетной записи. Проверьте подключение и попробуйте еще раз.", - "@There was a problem removing this student from your account. Please check your connection and try again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Cancel": "Отменить", - "@Cancel": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "next": "Далее", - "@next": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "ok": "OK", - "@ok": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Yes": "Да", - "@Yes": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No": "Нет", - "@No": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Retry": "Повторить", - "@Retry": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Delete": "Удалить", - "@Delete": { - "description": "Label used for general delete/remove actions", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Done": "Готово", - "@Done": { - "description": "Label for general done/finished actions", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Refresh": "Обновить", - "@Refresh": { - "description": "Label for button to refresh data from the web", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "View Description": "Просмотреть описание", - "@View Description": { - "description": "Button to view the description for an event or assignment", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "expanded": "в развернутом виде", - "@expanded": { - "description": "Description for the accessibility reader for list groups that are expanded", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "collapsed": "в свернутом виде", - "@collapsed": { - "description": "Description for the accessibility reader for list groups that are expanded", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "An unexpected error occurred": "Произошла непредвиденная ошибка", - "@An unexpected error occurred": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No description": "Описание отсутствует", - "@No description": { - "description": "Message used when the assignment has no description", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Launch External Tool": "Запуск внешнего инструмента", - "@Launch External Tool": { - "description": "Button text added to webviews to let users open external tools in their browser", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Interactions on this page are limited by your institution.": "Взаимодействие на этой странице ограничено вашей организацией.", - "@Interactions on this page are limited by your institution.": { - "description": "Message describing how the webview has limited access due to an instution setting", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "dateAtTime": "{date} в {time}", - "@dateAtTime": { - "description": "The string to format dates", - "type": "text", - "placeholders_order": [ - "date", - "time" - ], - "placeholders": { - "date": {}, - "time": {} - } - }, - "dueDateAtTime": "Срок выполнения {date} в {time}", - "@dueDateAtTime": { - "description": "The string to format due dates", - "type": "text", - "placeholders_order": [ - "date", - "time" - ], - "placeholders": { - "date": {}, - "time": {} - } - }, - "No Due Date": "Срок выполнения не задан", - "@No Due Date": { - "description": "Label for assignments that do not have a due date", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Filter": "Фильтровать", - "@Filter": { - "description": "Label for buttons to filter what items are visible", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "unread": "не прочитано", - "@unread": { - "description": "Label for things that are marked as unread", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "unreadCount": "{count} непрочитанных", - "@unreadCount": { - "description": "Formatted string for when there are a number of unread items", - "type": "text", - "placeholders_order": [ - "count" - ], - "placeholders": { - "count": {} - } - }, - "badgeNumberPlus": "{count}+", - "@badgeNumberPlus": { - "description": "Formatted string for when too many items are being notified in a badge, generally something like: 99+", - "type": "text", - "placeholders_order": [ - "count" - ], - "placeholders": { - "count": {} - } - }, - "There was an error loading this announcement": "Произошла ошибка при загрузке этого объявления", - "@There was an error loading this announcement": { - "description": "Message shown when an announcement detail screen fails to load", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Network error": "Ошибка сети", - "@Network error": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Under Construction": "В разработке", - "@Under Construction": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "We are currently building this feature for your viewing pleasure.": "В настоящее время мы разрабатываем эту функцию для более комфортного просмотра.", - "@We are currently building this feature for your viewing pleasure.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Request Login Help Button": "Кнопка запроса помощи по входу в систему", - "@Request Login Help Button": { - "description": "Accessibility hint for button that opens help dialog for a login help request", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Request Login Help": "Запрос помощи со входом в систему", - "@Request Login Help": { - "description": "Title of help dialog for a login help request", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I'm having trouble logging in": "У меня проблема со входом в систему", - "@I'm having trouble logging in": { - "description": "Subject of help dialog for a login help request", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "An error occurred when trying to display this link": "Произошла ошибка при попытке открытия данной ссылки", - "@An error occurred when trying to display this link": { - "description": "Error message shown when a link can't be opened", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "We are unable to display this link, it may belong to an institution you currently aren't logged in to.": "Мы не можем открыть данную ссылку, она может принадлежать учреждению, в систему которого вы в настоящее время не вошли.", - "@We are unable to display this link, it may belong to an institution you currently aren't logged in to.": { - "description": "Description for error page shown when clicking a link", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Link Error": "Ошибка ссылки", - "@Link Error": { - "description": "Title for error page shown when clicking a link", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Open In Browser": "Открыть в браузере", - "@Open In Browser": { - "description": "Text for button to open a link in the browswer", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You'll find the QR code on the web in your account profile. Click 'QR for Mobile Login' in the list.": "В профиле своей учетной записи вы найдете QR-код. Нажмите «QR для входа с мобильного устройства» в списке.", - "@You'll find the QR code on the web in your account profile. Click 'QR for Mobile Login' in the list.": { - "description": "Text for qr login tutorial screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Locate QR Code": "Определить местонахождение кода QR", - "@Locate QR Code": { - "description": "Text for qr login button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Please scan a QR code generated by Canvas": "Отсканируйте QR-код, сгенерированный Canvas", - "@Please scan a QR code generated by Canvas": { - "description": "Text for qr login error with incorrect qr code", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error logging in. Please generate another QR Code and try again.": "Ошибка входа в систему. Сгенерируйте другой QR-код и попробуйте еще раз.", - "@There was an error logging in. Please generate another QR Code and try again.": { - "description": "Text for qr login error", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Screenshot showing location of QR code generation in browser": "Снимок экрана с отображением места генерирования QR-кода в браузере", - "@Screenshot showing location of QR code generation in browser": { - "description": "Content Description for qr login tutorial screenshot", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "QR scanning requires camera access": "Для сканирования QR-кода необходим доступ к камере", - "@QR scanning requires camera access": { - "description": "placeholder for camera error for QR code scan", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The linked item is no longer available": "Связанная позиция более недоступна", - "@The linked item is no longer available": { - "description": "error message when the alert could no be opened", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Message sent": "Сообщение отправлено", - "@Message sent": { - "description": "confirmation message on the screen when the user succesfully sends a message", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Acceptable Use Policy": "Приемлемая политика использования", - "@Acceptable Use Policy": { - "description": "title for the acceptable use policy screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Submit": "Отправить", - "@Submit": { - "description": "submit button title for acceptable use policy screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Either you're a new user or the Acceptable Use Policy has changed since you last agreed to it. Please agree to the Acceptable Use Policy before you continue.": "Вы либо новый пользователь, либо Политика допустимого использования изменились после того, как вы в последний раз приняли их. Согласитесь с Политикой допустимого использования, прежде чем продолжить.", - "@Either you're a new user or the Acceptable Use Policy has changed since you last agreed to it. Please agree to the Acceptable Use Policy before you continue.": { - "description": "acceptable use policy screen description", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I agree to the Acceptable Use Policy.": "Я соглашаюсь с Политикой допустимого использования.", - "@I agree to the Acceptable Use Policy.": { - "description": "acceptable use policy switch title", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "About": "О проекте", - "@About": { - "description": "Title for about menu item in settings", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "App": "Приложение", - "@App": { - "description": "Title for App field on about page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Login ID": "Имя пользователя", - "@Login ID": { - "description": "Title for Login ID field on about page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Email": "Адрес электронной почты", - "@Email": { - "description": "Title for Email field on about page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Version": "Версия", - "@Version": { - "description": "Title for Version field on about page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Instructure logo": "Логотип Instructure", - "@Instructure logo": { - "description": "Semantics label for the Instructure logo on the about page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - } -} \ No newline at end of file diff --git a/apps/flutter_parent/lib/l10n/res/intl_sl.arb b/apps/flutter_parent/lib/l10n/res/intl_sl.arb deleted file mode 100644 index 30cc7a1e70..0000000000 --- a/apps/flutter_parent/lib/l10n/res/intl_sl.arb +++ /dev/null @@ -1,2746 +0,0 @@ -{ - "@@last_modified": "2023-04-14T11:04:46.988317", - "alertsLabel": "Opozorila", - "@alertsLabel": { - "description": "The label for the Alerts tab", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "calendarLabel": "Koledar", - "@calendarLabel": { - "description": "The label for the Calendar tab", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "coursesLabel": "Predmeti", - "@coursesLabel": { - "description": "The label for the Courses tab", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Students": "Ni študentov", - "@No Students": { - "description": "Text for when an observer has no students they are observing", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Tap to show student selector": "Tapnite za prikaz izbirnika študentov", - "@Tap to show student selector": { - "description": "Semantics label for the area that will show the student selector when tapped", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Tap to pair with a new student": "Tapnite za povezavo z novim študentom", - "@Tap to pair with a new student": { - "description": "Semantics label for the add student button in the student selector", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Tap to select this student": "Tapnite za izbiro tega študenta", - "@Tap to select this student": { - "description": "Semantics label on individual students in the student switcher", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Manage Students": "Uredi študente", - "@Manage Students": { - "description": "Label text for the Manage Students nav drawer button as well as the title for the Manage Students screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Help": "Pomoč", - "@Help": { - "description": "Label text for the help nav drawer button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Log Out": "Odjava", - "@Log Out": { - "description": "Label text for the Log Out nav drawer button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Switch Users": "Preklopi uporabnika", - "@Switch Users": { - "description": "Label text for the Switch Users nav drawer button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "appVersion": "r. {version}", - "@appVersion": { - "description": "App version shown in the navigation drawer", - "type": "text", - "placeholders_order": [ - "version" - ], - "placeholders": { - "version": {} - } - }, - "Are you sure you want to log out?": "Ali ste prepričani, da se želite odjaviti?", - "@Are you sure you want to log out?": { - "description": "Confirmation message displayed when the user tries to log out", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Calendars": "Koledarji", - "@Calendars": { - "description": "Label for button that lets users select which calendars to display", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "nextMonth": "Naslednji mesec: {month}", - "@nextMonth": { - "description": "Label for the button that switches the calendar to the next month", - "type": "text", - "placeholders_order": [ - "month" - ], - "placeholders": { - "month": {} - } - }, - "previousMonth": "Predhodni mesec: {month}", - "@previousMonth": { - "description": "Label for the button that switches the calendar to the previous month", - "type": "text", - "placeholders_order": [ - "month" - ], - "placeholders": { - "month": {} - } - }, - "nextWeek": "Naslednji teden z začetkom {date}", - "@nextWeek": { - "description": "Label for the button that switches the calendar to the next week", - "type": "text", - "placeholders_order": [ - "date" - ], - "placeholders": { - "date": {} - } - }, - "previousWeek": "Predhodni teden z začetkom {date}", - "@previousWeek": { - "description": "Label for the button that switches the calendar to the previous week", - "type": "text", - "placeholders_order": [ - "date" - ], - "placeholders": { - "date": {} - } - }, - "selectedMonthLabel": "Mesec {month}", - "@selectedMonthLabel": { - "description": "Accessibility label for the button that expands/collapses the month view", - "type": "text", - "placeholders_order": [ - "month" - ], - "placeholders": { - "month": {} - } - }, - "expand": "razširi", - "@expand": { - "description": "Accessibility label for the on-tap hint for the button that expands/collapses the month view", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "collapse": "strni", - "@collapse": { - "description": "Accessibility label for the on-tap hint for the button that expands/collapses the month view", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "pointsPossible": "{points} možnih točk", - "@pointsPossible": { - "description": "Screen reader label used for the points possible for an assignment, quiz, etc.", - "type": "text", - "placeholders_order": [ - "points" - ], - "placeholders": { - "points": {} - } - }, - "calendarDaySemanticsLabel": "{eventCount,plural, =1{{date}, {eventCount} dogodek}other{{date}, {eventCount} dogodkov(-a/-i)}}", - "@calendarDaySemanticsLabel": { - "description": "Screen reader label used for calendar day, reads the date and count of events", - "type": "text", - "placeholders_order": [ - "date", - "eventCount" - ], - "placeholders": { - "date": {}, - "eventCount": {} - } - }, - "No Events Today!": "Danes ni dogodkov.", - "@No Events Today!": { - "description": "Title displayed when there are no calendar events for the current day", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "It looks like a great day to rest, relax, and recharge.": "Videti je, da je to krasen dan za počitek, sprostitev in regeneracijo.", - "@It looks like a great day to rest, relax, and recharge.": { - "description": "Message displayed when there are no calendar events for the current day", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading your student's calendar": "Pri nalaganju koledarja vašega študenta je prišlo do napake", - "@There was an error loading your student's calendar": { - "description": "Message displayed when calendar events could not be loaded for the current student", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Tap to favorite the courses you want to see on the Calendar. Select up to 10.": "Tapnite za dodajanje predmetov, ki jih želite prikazane na koledarju, med priljubljene. Izberite do 10 elementov.", - "@Tap to favorite the courses you want to see on the Calendar. Select up to 10.": { - "description": "Description text on calendar filter screen.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You may only choose 10 calendars to display": "Za prikaz lahko izberete le 10 koledarjev.", - "@You may only choose 10 calendars to display": { - "description": "Error text when trying to select more than 10 calendars", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You must select at least one calendar to display": "Izbrati morate vsaj en koledar za prikaz.", - "@You must select at least one calendar to display": { - "description": "Error text when trying to de-select all calendars", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Planner Note": "Opomba orodja Planner", - "@Planner Note": { - "description": "Label used for notes in the planner", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Go to today": "Pojdi na danes", - "@Go to today": { - "description": "Accessibility label used for the today button in the planner", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Previous Logins": "Predhodne prijave", - "@Previous Logins": { - "description": "Label for the list of previous user logins", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "canvasLogoLabel": "Logotip sistema Canvas", - "@canvasLogoLabel": { - "description": "The semantics label for the Canvas logo", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "findSchool": "Poišči šolo", - "@findSchool": { - "description": "Text for the find-my-school button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "findAnotherSchool": "Najdi drugo šolo", - "@findAnotherSchool": { - "description": "Text for the find-another-school button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "domainSearchInputHint": "Vnos imena šole ali okrožja ...", - "@domainSearchInputHint": { - "description": "Input hint for the text box on the domain search screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "noDomainResults": "Ni mogoče najti šol, ki se ujemajo s/z »{query}«", - "@noDomainResults": { - "description": "Message shown to users when the domain search query did not return any results", - "type": "text", - "placeholders_order": [ - "query" - ], - "placeholders": { - "query": {} - } - }, - "domainSearchHelpLabel": "Kako najdem svojo šolo ali okrožje?", - "@domainSearchHelpLabel": { - "description": "Label for the help button on the domain search screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "canvasGuides": "Vodniki po sistemu Canvas", - "@canvasGuides": { - "description": "Proper name for the Canvas Guides. This will be used in the domainSearchHelpBody text and will be highlighted and clickable", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "canvasSupport": "Podpora za sistem Canvas", - "@canvasSupport": { - "description": "Proper name for Canvas Support. This will be used in the domainSearchHelpBody text and will be highlighted and clickable", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "domainSearchHelpBody": "Poskusite poiskati ime šole ali okrožja, do katerega poskušate dostopati, na primer »Smith Private School« ali »Smith County Schools«. V domeno sistema Canvas lahko vstopite neposredno, na primer »smith.instructure.com«.\n\nZa več informacij o iskanju računa Canvas vaše ustanove, obiščite spletno mesto {canvasGuides} in se za pomoč obrnite na {canvasSupport} ali na šolo.", - "@domainSearchHelpBody": { - "description": "The body text shown in the help dialog on the domain search screen", - "type": "text", - "placeholders_order": [ - "canvasGuides", - "canvasSupport" - ], - "placeholders": { - "canvasGuides": {}, - "canvasSupport": {} - } - }, - "Uh oh!": "Ojoj.", - "@Uh oh!": { - "description": "Title of the screen that shows when a crash has occurred", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "We’re not sure what happened, but it wasn’t good. Contact us if this keeps happening.": "Nismo prepričano, kaj se je zgodilo, ni pa bilo dobro. Če se napaka ponovi, nas kontaktirajte.", - "@We’re not sure what happened, but it wasn’t good. Contact us if this keeps happening.": { - "description": "Message shown when a crash has occurred", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Contact Support": "Stik s podporo", - "@Contact Support": { - "description": "Label for the button that allows users to contact support after a crash has occurred", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "View error details": "Prikaz podrobnosti o napaki", - "@View error details": { - "description": "Label for the button that allowed users to view crash details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Restart app": "Ponovno zaženite aplikacijo", - "@Restart app": { - "description": "Label for the button that will restart the entire application", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Application version": "Različica aplikacije", - "@Application version": { - "description": "Label for the application version displayed in the crash details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Device model": "Model naprave", - "@Device model": { - "description": "Label for the device model displayed in the crash details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Android OS version": "Različica sistema Android", - "@Android OS version": { - "description": "Label for the Android operating system version displayed in the crash details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Full error message": "Polni prikaz sporočila o napaki", - "@Full error message": { - "description": "Label for the full error message displayed in the crash details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Inbox": "Pošta", - "@Inbox": { - "description": "Title for the Inbox screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading your inbox messages.": "Pri nalaganju sporočil vašega nabiralnika je prišlo do napake.", - "@There was an error loading your inbox messages.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Subject": "Ni zadeve", - "@No Subject": { - "description": "Title used for inbox messages that have no subject", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unable to fetch courses. Please check your connection and try again.": "Predmetov ni bilo mogoče pridobiti. Preverite svojo povezavo in poskusite znova.", - "@Unable to fetch courses. Please check your connection and try again.": { - "description": "Message shown when an error occured while loading courses", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Choose a course to message": "Izberite predmet za pošiljanje sporočila", - "@Choose a course to message": { - "description": "Header in the course list shown when the user is choosing which course to associate with a new message", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Inbox Zero": "Nabiralnik je prazen", - "@Inbox Zero": { - "description": "Title of the message shown when there are no inbox messages", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You’re all caught up!": "Seznanjeni ste z vsem!", - "@You’re all caught up!": { - "description": "Subtitle of the message shown when there are no inbox messages", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading recipients for this course": "Prišlo je do napake pri nalaganju prejemnikov za ta predmet", - "@There was an error loading recipients for this course": { - "description": "Message shown when attempting to create a new message but the recipients list failed to load", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unable to send message. Check your connection and try again.": "Sporočila ni bilo mogoče poslati. Preverite svojo povezavo in poskusite znova.", - "@Unable to send message. Check your connection and try again.": { - "description": "Message show when there was an error creating or sending a new message", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unsaved changes": "Neshranjene spremembe", - "@Unsaved changes": { - "description": "Title of the dialog shown when the user tries to leave with unsaved changes", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Are you sure you wish to close this page? Your unsent message will be lost.": "Ali ste prepričani, da želite zapreti to stran? Neposlana sporočila bodo izgubljena.", - "@Are you sure you wish to close this page? Your unsent message will be lost.": { - "description": "Body text of the dialog shown when the user tries leave with unsaved changes", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "New message": "Novo sporočilo", - "@New message": { - "description": "Title of the new-message screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Add attachment": "Dodaj prilogo", - "@Add attachment": { - "description": "Tooltip for the add-attachment button in the new-message screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Send message": "Pošlji sporočilo", - "@Send message": { - "description": "Tooltip for the send-message button in the new-message screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Select recipients": "Izberi prejemnike", - "@Select recipients": { - "description": "Tooltip for the button that allows users to select message recipients", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No recipients selected": "Izbran ni noben prejemnik", - "@No recipients selected": { - "description": "Hint displayed when the user has not selected any message recipients", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Message subject": "Zadeva sporočila", - "@Message subject": { - "description": "Hint text displayed in the input field for the message subject", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Message": "Sporočilo", - "@Message": { - "description": "Hint text displayed in the input field for the message body", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Recipients": "Prejemniki", - "@Recipients": { - "description": "Label for message recipients", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "plusRecipientCount": "+{count}", - "@plusRecipientCount": { - "description": "Shows the number of recipients that are selected but not displayed on screen.", - "type": "text", - "placeholders_order": [ - "count" - ], - "placeholders": { - "count": { - "example": 5 - } - } - }, - "Failed. Tap for options.": "Ni uspelo. Tapnite za možnosti.", - "@Failed. Tap for options.": { - "description": "Short message shown on a message attachment when uploading has failed", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "courseForWhom": "za {studentShortName}", - "@courseForWhom": { - "description": "Describes for whom a course is for (i.e. for Bill)", - "type": "text", - "placeholders_order": [ - "studentShortName" - ], - "placeholders": { - "studentShortName": {} - } - }, - "messageLinkPostscript": "Zadeva: {studentName}, {linkUrl}", - "@messageLinkPostscript": { - "description": "A postscript appended to new messages that clarifies which student is the subject of the message and also includes a URL for the related Canvas component (course, assignment, event, etc).", - "type": "text", - "placeholders_order": [ - "studentName", - "linkUrl" - ], - "placeholders": { - "studentName": {}, - "linkUrl": {} - } - }, - "There was an error loading this conversation": "Prišlo je do napake pri nalaganju tega pogovora", - "@There was an error loading this conversation": { - "description": "Message shown when a conversation fails to load", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Reply": "Odgovori", - "@Reply": { - "description": "Button label for replying to a conversation", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Reply All": "Odgovori vsem", - "@Reply All": { - "description": "Button label for replying to all conversation participants", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unknown User": "Neznani uporabnik", - "@Unknown User": { - "description": "Label used where the user name is not known", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "me": "jaz", - "@me": { - "description": "First-person pronoun (i.e. 'me') that will be used in message author info, e.g. 'Me to 4 others' or 'Jon Snow to me'", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "authorToRecipient": "{authorName} do {recipientName}", - "@authorToRecipient": { - "description": "Author info for a single-recipient message; includes both the author name and the recipient name.", - "type": "text", - "placeholders_order": [ - "authorName", - "recipientName" - ], - "placeholders": { - "authorName": {}, - "recipientName": {} - } - }, - "authorToNOthers": "{howMany,plural, =1{{authorName} do 1 drugi}other{{authorName} do {howMany} drugih}}", - "@authorToNOthers": { - "description": "Author info for a mutli-recipient message; includes the author name and the number of recipients", - "type": "text", - "placeholders_order": [ - "authorName", - "howMany" - ], - "placeholders": { - "authorName": {}, - "howMany": {} - } - }, - "authorToRecipientAndNOthers": "{howMany,plural, =1{{authorName} do {recipientName} in 1 drugi}other{{authorName} do {recipientName} in {howMany} drugih}}", - "@authorToRecipientAndNOthers": { - "description": "Author info for a multi-recipient message; includes the author name, one recipient name, and the number of other recipients", - "type": "text", - "placeholders_order": [ - "authorName", - "recipientName", - "howMany" - ], - "placeholders": { - "authorName": {}, - "recipientName": {}, - "howMany": {} - } - }, - "Download": "Prenesi", - "@Download": { - "description": "Label for the button that will begin downloading a file", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Open with another app": "Odpri z drugo aplikacijo", - "@Open with another app": { - "description": "Label for the button that will allow users to open a file with another app", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There are no installed applications that can open this file": "Nameščene nimate nobene aplikacije, ki bi lahko odprla to datoteko", - "@There are no installed applications that can open this file": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unsupported File": "Nepodprta datoteka", - "@Unsupported File": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "This file is unsupported and can’t be viewed through the app": "Datoteka ni podprta in si je ni mogoče ogledati v aplikaciji", - "@This file is unsupported and can’t be viewed through the app": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unable to play this media file": "Te predstavnostne datoteke ni mogoče predvajati", - "@Unable to play this media file": { - "description": "Message shown when audio or video media could not be played", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unable to load this image": "Te slike ni mogoče naložiti", - "@Unable to load this image": { - "description": "Message shown when an image file could not be loaded or displayed", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading this file": "Prišlo je do napake pri nalaganju te datoteke", - "@There was an error loading this file": { - "description": "Message shown when a file could not be loaded or displayed", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Courses": "Ni predmetov", - "@No Courses": { - "description": "Title for having no courses", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Your student’s courses might not be published yet.": "Predmeti vašega študenta morda še niso objavljeni.", - "@Your student’s courses might not be published yet.": { - "description": "Message for having no courses", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading your student’s courses.": "Pri nalaganju predmetov vašega študenta je prišlo do napake.", - "@There was an error loading your student’s courses.": { - "description": "Message displayed when the list of student courses could not be loaded", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Grade": "Ni ocen", - "@No Grade": { - "description": "Message shown when there is currently no grade available for a course", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Filter by": "Filtriraj glede na", - "@Filter by": { - "description": "Title for list of terms to filter grades by", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Grades": "Ocene", - "@Grades": { - "description": "Label for the \"Grades\" tab in course details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Syllabus": "Učni načrt", - "@Syllabus": { - "description": "Label for the \"Syllabus\" tab in course details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Front Page": "Prva stran", - "@Front Page": { - "description": "Label for the \"Front Page\" tab in course details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Summary": "Povzetek", - "@Summary": { - "description": "Label for the \"Summary\" tab in course details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Send a message about this course": "Pošlji sporočilo o tem predmetu", - "@Send a message about this course": { - "description": "Accessibility hint for the course messaage floating action button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Total Grade": "Skupna ocena", - "@Total Grade": { - "description": "Label for the total grade in the course", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Graded": "Ocenjeno", - "@Graded": { - "description": "Label for assignments that have been graded", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Submitted": "Poslano", - "@Submitted": { - "description": "Label for assignments that have been submitted", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Not Submitted": "Ni oddano.", - "@Not Submitted": { - "description": "Label for assignments that have not been submitted", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Late": "Zamuda", - "@Late": { - "description": "Label for assignments that have been marked late or submitted late", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Missing": "Manjkajoče", - "@Missing": { - "description": "Label for assignments that have been marked missing or are not submitted and past the due date", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "-": "-", - "@-": { - "description": "Value representing no score for student submission", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "All Grading Periods": "Vsa ocenjevalna obdobja", - "@All Grading Periods": { - "description": "Label for selecting all grading periods", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Assignments": "Ni nalog", - "@No Assignments": { - "description": "Title for the no assignments message", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "It looks like assignments haven't been created in this space yet.": "Videti je, da v tem prostoru naloge še niso bile ustvarjene.", - "@It looks like assignments haven't been created in this space yet.": { - "description": "Message for no assignments", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading the summary details for this course.": "Prišlo je do napake pri nalaganju povzetka podrobnosti za ta predmet.", - "@There was an error loading the summary details for this course.": { - "description": "Message shown when the course summary could not be loaded", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Summary": "Ni povzetka", - "@No Summary": { - "description": "Title displayed when there are no items in the course summary", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "This course does not have any assignments or calendar events yet.": "Ta predmet še nima nalog ali koledarskih dogodkov.", - "@This course does not have any assignments or calendar events yet.": { - "description": "Message displayed when there are no items in the course summary", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "gradeFormatScoreOutOfPointsPossible": "{score}/{pointsPossible}", - "@gradeFormatScoreOutOfPointsPossible": { - "description": "Formatted string for a student score out of the points possible", - "type": "text", - "placeholders_order": [ - "score", - "pointsPossible" - ], - "placeholders": { - "score": {}, - "pointsPossible": {} - } - }, - "contentDescriptionScoreOutOfPointsPossible": "{score} od {pointsPossible} točk", - "@contentDescriptionScoreOutOfPointsPossible": { - "description": "Formatted string for a student score out of the points possible", - "type": "text", - "placeholders_order": [ - "score", - "pointsPossible" - ], - "placeholders": { - "score": {}, - "pointsPossible": {} - } - }, - "gradesSubjectMessage": "Zadeva: {studentName}, Ocene", - "@gradesSubjectMessage": { - "description": "The subject line for a message to a teacher regarding a student's grades", - "type": "text", - "placeholders_order": [ - "studentName" - ], - "placeholders": { - "studentName": {} - } - }, - "syllabusSubjectMessage": "Zadeva: {studentName}, Učni načrt predmeta", - "@syllabusSubjectMessage": { - "description": "The subject line for a message to a teacher regarding a course syllabus", - "type": "text", - "placeholders_order": [ - "studentName" - ], - "placeholders": { - "studentName": {} - } - }, - "frontPageSubjectMessage": "Zadeva: {studentName}, Prva stran", - "@frontPageSubjectMessage": { - "description": "The subject line for a message to a teacher regarding a course front page", - "type": "text", - "placeholders_order": [ - "studentName" - ], - "placeholders": { - "studentName": {} - } - }, - "assignmentSubjectMessage": "Zadeva: {studentName}, Naloga – {assignmentName}", - "@assignmentSubjectMessage": { - "description": "The subject line for a message to a teacher regarding a student's assignment", - "type": "text", - "placeholders_order": [ - "studentName", - "assignmentName" - ], - "placeholders": { - "studentName": {}, - "assignmentName": {} - } - }, - "eventSubjectMessage": "Zadeva: {studentName}, Dogodek – {eventTitle}", - "@eventSubjectMessage": { - "description": "The subject line for a message to a teacher regarding a calendar event", - "type": "text", - "placeholders_order": [ - "studentName", - "eventTitle" - ], - "placeholders": { - "studentName": {}, - "eventTitle": {} - } - }, - "There is no page information available.": "Informacije o strani niso na voljo.", - "@There is no page information available.": { - "description": "Description for when no page information is available", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Assignment Details": "Podrobnosti o nalogi", - "@Assignment Details": { - "description": "Title for the page that shows details for an assignment", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "assignmentTotalPoints": "{points} točk", - "@assignmentTotalPoints": { - "description": "Label used for the total points the assignment is worth", - "type": "text", - "placeholders_order": [ - "points" - ], - "placeholders": { - "points": {} - } - }, - "assignmentTotalPointsAccessible": "{points} točk", - "@assignmentTotalPointsAccessible": { - "description": "Screen reader label used for the total points the assignment is worth", - "type": "text", - "placeholders_order": [ - "points" - ], - "placeholders": { - "points": {} - } - }, - "Due": "Roki", - "@Due": { - "description": "Label for an assignment due date", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Grade": "Ocena", - "@Grade": { - "description": "Label for the section that displays an assignment's grade", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Locked": "Zaklenjeno", - "@Locked": { - "description": "Label for when an assignment is locked", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "assignmentLockedModule": "To nalogo je zaklenil modul »{moduleName}«.", - "@assignmentLockedModule": { - "description": "The locked description when an assignment is locked by a module", - "type": "text", - "placeholders_order": [ - "moduleName" - ], - "placeholders": { - "moduleName": {} - } - }, - "Remind Me": "Opomni me", - "@Remind Me": { - "description": "Label for the row to set reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Set a date and time to be notified of this specific assignment.": "Nastavite datum in čas obvestila o tej določeni nalogi.", - "@Set a date and time to be notified of this specific assignment.": { - "description": "Description for row to set reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You will be notified about this assignment on…": "O tej nalogi boste obveščeni dne ...", - "@You will be notified about this assignment on…": { - "description": "Description for when a reminder is set", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Instructions": "Navodila", - "@Instructions": { - "description": "Label for the description of the assignment when it has quiz instructions", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Send a message about this assignment": "Pošlji sporočilo o tej nalogi", - "@Send a message about this assignment": { - "description": "Accessibility hint for the assignment messaage floating action button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "This app is not authorized for use.": "Te aplikacije ni dovoljeno uporabljati.", - "@This app is not authorized for use.": { - "description": "The error shown when the app being used is not verified by Canvas", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The server you entered is not authorized for this app.": "Strežnik, ki ste ga vnesli, nima pooblastila za to aplikacijo.", - "@The server you entered is not authorized for this app.": { - "description": "The error shown when the desired login domain is not verified by Canvas", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The user agent for this app is not authorized.": "Zastopnik uporabnika za to aplikacijo ni pooblaščen.", - "@The user agent for this app is not authorized.": { - "description": "The error shown when the user agent during verification is not verified by Canvas", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "We were unable to verify the server for use with this app.": "Strežnika za uporabo pri tej aplikaciji nismo uspeli preveriti.", - "@We were unable to verify the server for use with this app.": { - "description": "The generic error shown when we are unable to verify with Canvas", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Reminders": "Opomniki", - "@Reminders": { - "description": "Name of the system notification channel for assignment and event reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Notifications for reminders about assignments and calendar events": "Sporočila za opomnike o nalogah in koledarskih dogodkih", - "@Notifications for reminders about assignments and calendar events": { - "description": "Description of the system notification channel for assignment and event reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Reminders have changed!": "Opomniki so se spremenili!", - "@Reminders have changed!": { - "description": "Title of the dialog shown when the user needs to update their reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "In order to provide you with a better experience, we have updated how reminders work. You can add new reminders by viewing an assignment or calendar event and tapping the switch under the \"Remind Me\" section.\n\nBe aware that any reminders created with older versions of this app will not be compatible with the new changes and you will need to create them again.": "Da vam zagotovimo boljšo izkušnjo, smo posodobili delovanje opomnikov. Nove opomnike lahko dodate, tako da si ogledate nalogo ali dogodek v koledarju in tapnete stikalo v razdelku »Opomni me«.\n\nUpoštevajte, da noben opomnik, ustvarjen v starejši različici te aplikacije, ne bo združljiv z novimi spremembami in boste te morali ustvariti znova.", - "@In order to provide you with a better experience, we have updated how reminders work. You can add new reminders by viewing an assignment or calendar event and tapping the switch under the \"Remind Me\" section.\n\nBe aware that any reminders created with older versions of this app will not be compatible with the new changes and you will need to create them again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Not a parent?": "Niste eden od staršev?", - "@Not a parent?": { - "description": "Title for the screen that shows when the user is not observing any students", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "We couldn't find any students associated with this account": "Nismo uspeli najti nobenega študenta, povezanega s tem računom", - "@We couldn't find any students associated with this account": { - "description": "Subtitle for the screen that shows when the user is not observing any students", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Are you a student or teacher?": "Ste študent ali izvajalec?", - "@Are you a student or teacher?": { - "description": "Label for button that will show users the option to view other Canvas apps in the Play Store", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "One of our other apps might be a better fit. Tap one to visit the Play Store.": "Morda bi bolj ustrezala kakšna druga aplikacija. Tapnite eno od njih, da obiščete trgovino Play Store.", - "@One of our other apps might be a better fit. Tap one to visit the Play Store.": { - "description": "Description of options to view other Canvas apps in the Play Store", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Return to Login": "Nazaj na prijavo", - "@Return to Login": { - "description": "Label for the button that returns the user to the login screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "STUDENT": "ŠTUDENT", - "@STUDENT": { - "description": "The \"student\" portion of the \"Canvas Student\" app name, in all caps. \"Canvas\" is excluded in this context as it will be displayed to the user as a wordmark image", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "TEACHER": "IZVAJALEC", - "@TEACHER": { - "description": "The \"teacher\" portion of the \"Canvas Teacher\" app name, in all caps. \"Canvas\" is excluded in this context as it will be displayed to the user as a wordmark image", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Canvas Student": "Študent v sistemu Canvas", - "@Canvas Student": { - "description": "The name of the Canvas Student app. Only \"Student\" should be translated as \"Canvas\" is a brand name in this context and should not be translated.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Canvas Teacher": "Izvajalec v sistemu Canvas", - "@Canvas Teacher": { - "description": "The name of the Canvas Teacher app. Only \"Teacher\" should be translated as \"Canvas\" is a brand name in this context and should not be translated.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Alerts": "Ni opozoril", - "@No Alerts": { - "description": "The title for the empty message to show to users when there are no alerts for the student.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There’s nothing to be notified of yet.": "Ni ničesar, o čemer bi bilo treba obveščati.", - "@There’s nothing to be notified of yet.": { - "description": "The empty message to show to users when there are no alerts for the student.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "dismissAlertLabel": "Opusti {alertTitle}", - "@dismissAlertLabel": { - "description": "Accessibility label to dismiss an alert", - "type": "text", - "placeholders_order": [ - "alertTitle" - ], - "placeholders": { - "alertTitle": {} - } - }, - "Course Announcement": "Obvestilo o predmetu", - "@Course Announcement": { - "description": "Title for alerts when there is a course announcement", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Institution Announcement": "Obvestilo ustanove", - "@Institution Announcement": { - "description": "Title for alerts when there is an institution announcement", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "assignmentGradeAboveThreshold": "Ocena pri nalogi višja od {threshold}", - "@assignmentGradeAboveThreshold": { - "description": "Title for alerts when an assignment grade is above the threshold value", - "type": "text", - "placeholders_order": [ - "threshold" - ], - "placeholders": { - "threshold": {} - } - }, - "assignmentGradeBelowThreshold": "Ocena pri nalogi nižja od {threshold}", - "@assignmentGradeBelowThreshold": { - "description": "Title for alerts when an assignment grade is below the threshold value", - "type": "text", - "placeholders_order": [ - "threshold" - ], - "placeholders": { - "threshold": {} - } - }, - "courseGradeAboveThreshold": "Ocena pri predmetu višja od {threshold}", - "@courseGradeAboveThreshold": { - "description": "Title for alerts when a course grade is above the threshold value", - "type": "text", - "placeholders_order": [ - "threshold" - ], - "placeholders": { - "threshold": {} - } - }, - "courseGradeBelowThreshold": "Ocena pri predmetu nižja od {threshold}", - "@courseGradeBelowThreshold": { - "description": "Title for alerts when a course grade is below the threshold value", - "type": "text", - "placeholders_order": [ - "threshold" - ], - "placeholders": { - "threshold": {} - } - }, - "Settings": "Nastavitve", - "@Settings": { - "description": "Title for the settings screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Theme": "Tema", - "@Theme": { - "description": "Label for the light/dark theme section in the settings page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Dark Mode": "Temni način", - "@Dark Mode": { - "description": "Label for the button that enables dark mode", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Light Mode": "Svetli način", - "@Light Mode": { - "description": "Label for the button that enables light mode", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "High Contrast Mode": "Visokokontrastni način", - "@High Contrast Mode": { - "description": "Label for the switch that toggles high contrast mode", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Use Dark Theme in Web Content": "Uporabi temno temo za spletno vsebino", - "@Use Dark Theme in Web Content": { - "description": "Label for the switch that toggles dark mode for webviews", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Appearance": "Videz", - "@Appearance": { - "description": "Label for the appearance section in the settings page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Successfully submitted!": "Uspešno poslano.", - "@Successfully submitted!": { - "description": "Title displayed in the grade cell for an assignment that has been submitted", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "submissionStatusSuccessSubtitle": "Ta naloga je bila poslana dne {date} ob {time} in čaka na ocenjevanje", - "@submissionStatusSuccessSubtitle": { - "description": "Subtitle displayed in the grade cell for an assignment that has been submitted and is awaiting a grade", - "type": "text", - "placeholders_order": [ - "date", - "time" - ], - "placeholders": { - "date": {}, - "time": {} - } - }, - "outOfPoints": "{howMany,plural, =1{Od 1 točke}other{Od {points} točk}}", - "@outOfPoints": { - "description": "Description for an assignment grade that has points without a current scoroe", - "type": "text", - "placeholders_order": [ - "points", - "howMany" - ], - "placeholders": { - "points": {}, - "howMany": {} - } - }, - "Excused": "Opravičeno", - "@Excused": { - "description": "Grading status for an assignment marked as excused", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Complete": "Zaključeno", - "@Complete": { - "description": "Grading status for an assignment marked as complete", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Incomplete": "Nezaključeno", - "@Incomplete": { - "description": "Grading status for an assignment marked as incomplete", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "minus": "minus", - "@minus": { - "description": "Screen reader-friendly replacement for the \"-\" character in letter grades like \"A-\"", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "latePenalty": "Kazen za zamudo (-{pointsLost})", - "@latePenalty": { - "description": "Text displayed when a late penalty has been applied to the assignment", - "type": "text", - "placeholders_order": [ - "pointsLost" - ], - "placeholders": { - "pointsLost": {} - } - }, - "finalGrade": "Končna ocena: {grade}", - "@finalGrade": { - "description": "Text that displays the final grade of an assignment", - "type": "text", - "placeholders_order": [ - "grade" - ], - "placeholders": { - "grade": {} - } - }, - "Alert Settings": "Nastavitve opozoril", - "@Alert Settings": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Alert me when…": "Opozori me, ko ...", - "@Alert me when…": { - "description": "Header for the screen where the observer chooses the thresholds that will determine when they receive alerts (e.g. when an assignment is graded below 70%)", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Course grade below": "Ocena pri predmetu nižja od", - "@Course grade below": { - "description": "Label describing the threshold for when the course grade is below a certain percentage", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Course grade above": "Ocena pri predmetu višja od", - "@Course grade above": { - "description": "Label describing the threshold for when the course grade is above a certain percentage", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Assignment missing": "Manjkajoča naloga", - "@Assignment missing": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Assignment grade below": "Ocena pri nalogi nižja od", - "@Assignment grade below": { - "description": "Label describing the threshold for when an assignment is graded below a certain percentage", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Assignment grade above": "Ocena pri nalogi višja od", - "@Assignment grade above": { - "description": "Label describing the threshold for when an assignment is graded above a certain percentage", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Course Announcements": "Obvestila o predmetu", - "@Course Announcements": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Institution Announcements": "Obvestila ustanove", - "@Institution Announcements": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Never": "Nikoli", - "@Never": { - "description": "Indication that tells the user they will not receive alert notifications of a specific kind", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Grade percentage": "Odstotek ocene", - "@Grade percentage": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading your student's alerts.": "Pri nalaganju opozoril vašega študenta je prišlo do napake.", - "@There was an error loading your student's alerts.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Must be below 100": "Mora biti nižje od 100", - "@Must be below 100": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "mustBeBelowN": "Mora biti nižje od {percentage}", - "@mustBeBelowN": { - "description": "Validation error to the user that they must choose a percentage below 'n'", - "type": "text", - "placeholders_order": [ - "percentage" - ], - "placeholders": { - "percentage": { - "example": 5 - } - } - }, - "mustBeAboveN": "Mora biti višje od {percentage}", - "@mustBeAboveN": { - "description": "Validation error to the user that they must choose a percentage above 'n'", - "type": "text", - "placeholders_order": [ - "percentage" - ], - "placeholders": { - "percentage": { - "example": 5 - } - } - }, - "Select Student Color": "Izberite barvo študenta", - "@Select Student Color": { - "description": "Title for screen that allows users to assign a color to a specific student", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Electric, blue": "Elektrika, modra", - "@Electric, blue": { - "description": "Name of the Electric (blue) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Plum, Purple": "Sliva, vijolična", - "@Plum, Purple": { - "description": "Name of the Plum (purple) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Barney, Fuschia": "Barney, rožnato-vijolična", - "@Barney, Fuschia": { - "description": "Name of the Barney (fuschia) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Raspberry, Red": "Malina, rdeča", - "@Raspberry, Red": { - "description": "Name of the Raspberry (red) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Fire, Orange": "Ogenj, oranžna", - "@Fire, Orange": { - "description": "Name of the Fire (orange) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Shamrock, Green": "Detelja, zelena", - "@Shamrock, Green": { - "description": "Name of the Shamrock (green) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "An error occurred while saving your selection. Please try again.": "Med shranjevanjem vaše izbire je prišlo do napake. Poskusite znova.", - "@An error occurred while saving your selection. Please try again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "changeStudentColorLabel": "Spremeni barvo za {studentName}", - "@changeStudentColorLabel": { - "description": "Accessibility label for the button that lets users change the color associated with a specific student", - "type": "text", - "placeholders_order": [ - "studentName" - ], - "placeholders": { - "studentName": {} - } - }, - "Teacher": "Izvajalec", - "@Teacher": { - "description": "Label for the Teacher enrollment type", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Student": "Študent", - "@Student": { - "description": "Label for the Student enrollment type", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "TA": "Demonstrator", - "@TA": { - "description": "Label for the Teaching Assistant enrollment type (also known as Teacher Aid or Education Assistant), reduced to a short acronym/initialism if appropriate.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Observer": "Skriti bralec", - "@Observer": { - "description": "Label for the Observer enrollment type", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Use Camera": "Uporabi fotoaparat", - "@Use Camera": { - "description": "Label for the action item that lets the user capture a photo using the device camera", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Upload File": "Naloži datoteko", - "@Upload File": { - "description": "Label for the action item that lets the user upload a file from their device", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Choose from Gallery": "Izberi iz galerije", - "@Choose from Gallery": { - "description": "Label for the action item that lets the user select a photo from their device gallery", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Preparing…": "Pripravljam ...", - "@Preparing…": { - "description": "Message shown while a file is being prepared to attach to a message", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Add student with…": "Dodaj študenta s/z ...", - "@Add student with…": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Add Student": "Dodaj študenta", - "@Add Student": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You are not observing any students.": "Ne opazujete nobenega študenta.", - "@You are not observing any students.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading your students.": "Pri nalaganju vaših študentov je prišlo do napake.", - "@There was an error loading your students.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Pairing Code": "Koda za seznanjanje naprave", - "@Pairing Code": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Students can obtain a pairing code through the Canvas website": "Študenti lahko pridobijo kodo za seznanitev prek spletnega mesta Canvas", - "@Students can obtain a pairing code through the Canvas website": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Enter the student pairing code provided to you. If the pairing code doesn't work, it may have expired": "Vnesite kodo za povezovanje s študentom, ki ste jo prejeli. Če koda za povezovanje ne deluje, je morda potekla", - "@Enter the student pairing code provided to you. If the pairing code doesn't work, it may have expired": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Your code is incorrect or expired.": "Vaša koda je nepravilna ali potekla.", - "@Your code is incorrect or expired.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Something went wrong trying to create your account, please reach out to your school for assistance.": "Pri poskusu ustvarjanja računa je prišlo do napake. Za pomoč se obrnite na šolo.", - "@Something went wrong trying to create your account, please reach out to your school for assistance.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "QR Code": "Koda QR", - "@QR Code": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Students can create a QR code using the Canvas Student app on their mobile device": "Študenti lahko ustvarijo kodo QR z aplikacijo Canvas Student na svoji mobilni napravi", - "@Students can create a QR code using the Canvas Student app on their mobile device": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Add new student": "Dodaj novega študenta", - "@Add new student": { - "description": "Semantics label for the FAB on the Manage Students Screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Select": "Izberi", - "@Select": { - "description": "Hint text to tell the user to choose one of two options", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I have a Canvas account": "Imam račun Canvas", - "@I have a Canvas account": { - "description": "Option to select for users that have a canvas account", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I don't have a Canvas account": "Nimam računa Canvas", - "@I don't have a Canvas account": { - "description": "Option to select for users that don't have a canvas account", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Create Account": "Ustvari račun", - "@Create Account": { - "description": "Button text for account creation confirmation", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Full Name": "Polno ime", - "@Full Name": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Email Address": "E-poštni naslov", - "@Email Address": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Password": "Geslo", - "@Password": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Full Name…": "Polno ime ...", - "@Full Name…": { - "description": "hint label for inside form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Email…": "E-pošta ...", - "@Email…": { - "description": "hint label for inside form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Password…": "Geslo ...", - "@Password…": { - "description": "hint label for inside form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Please enter full name": "Vnesite polno ime", - "@Please enter full name": { - "description": "Error message for form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Please enter an email address": "Vnesite e-poštni naslov", - "@Please enter an email address": { - "description": "Error message for form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Please enter a valid email address": "Vnesite veljavni e-poštni naslov.", - "@Please enter a valid email address": { - "description": "Error message for form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Password is required": "Geslo je obvezno", - "@Password is required": { - "description": "Error message for form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Password must contain at least 8 characters": "Geslo mora vsebovati vsaj 8 znakov.", - "@Password must contain at least 8 characters": { - "description": "Error message for form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "qrCreateAccountTos": "Če tapnete »Ustvari račun«, pristajate na {termsOfService} in potrdite {privacyPolicy}.", - "@qrCreateAccountTos": { - "description": "The text show on the account creation screen", - "type": "text", - "placeholders_order": [ - "termsOfService", - "privacyPolicy" - ], - "placeholders": { - "termsOfService": {}, - "privacyPolicy": {} - } - }, - "Terms of Service": "Pogoji storitve", - "@Terms of Service": { - "description": "Label for the Canvas Terms of Service agreement. This will be used in the qrCreateAccountTos text and will be highlighted and clickable", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Privacy Policy": "Pravilnik o zasebnosti", - "@Privacy Policy": { - "description": "Label for the Canvas Privacy Policy agreement. This will be used in the qrCreateAccountTos text and will be highlighted and clickable", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "View the Privacy Policy": "Ogled Pravilnika o zasebnosti", - "@View the Privacy Policy": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Already have an account? ": "Ali že imate račun? ", - "@Already have an account? ": { - "description": "Part of multiline text span, includes AccountSignIn1-2, in that order", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Sign In": "Prijava", - "@Sign In": { - "description": "Part of multiline text span, includes AccountSignIn1-2, in that order", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Hide Password": "Skrij geslo", - "@Hide Password": { - "description": "content description for password hide button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Show Password": "Pokaži geslo", - "@Show Password": { - "description": "content description for password show button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Terms of Service Link": "Povezava na Pogoji za uporabo storitve", - "@Terms of Service Link": { - "description": "content description for terms of service link", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Privacy Policy Link": "Povezava na Pravilnik o zasebnosti", - "@Privacy Policy Link": { - "description": "content description for privacy policy link", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Event": "Dogodek", - "@Event": { - "description": "Title for the event details screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Date": "Datum", - "@Date": { - "description": "Label for the event date", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Location": "Mesto", - "@Location": { - "description": "Label for the location information", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Location Specified": "Mesto ni določeno", - "@No Location Specified": { - "description": "Description for events that do not have a location", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "eventTime": "{startAt} – {endAt}", - "@eventTime": { - "description": "The time the event is happening, example: \"2:00 pm - 4:00 pm\"", - "type": "text", - "placeholders_order": [ - "startAt", - "endAt" - ], - "placeholders": { - "startAt": {}, - "endAt": {} - } - }, - "Set a date and time to be notified of this event.": "Nastavite datum in čas obvestila o tem dogodku.", - "@Set a date and time to be notified of this event.": { - "description": "Description for row to set event reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You will be notified about this event on…": "O tem dogodku boste obveščeni dne ...", - "@You will be notified about this event on…": { - "description": "Description for when an event reminder is set", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Share Your Love for the App": "Delite svoje navdušenje nad aplikacijo", - "@Share Your Love for the App": { - "description": "Label for option to open the app store", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Tell us about your favorite parts of the app": "Opišite nam, kateri deli aplikacije so vam najljubši.", - "@Tell us about your favorite parts of the app": { - "description": "Description for option to open the app store", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Legal": "Pravne informacije", - "@Legal": { - "description": "Label for legal information option", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Privacy policy, terms of use, open source": "Politika zasebnosti, pogoji uporabe, odprti vir", - "@Privacy policy, terms of use, open source": { - "description": "Description for legal information option", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Idea for Canvas Parent App [Android]": "Zamisel za aplikacijo Canvas Parent [Android]", - "@Idea for Canvas Parent App [Android]": { - "description": "The subject for the email to request a feature", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The following information will help us better understand your idea:": "Z naslednjimi informacijami bomo bolje razumeli vašo zamisel:", - "@The following information will help us better understand your idea:": { - "description": "The header for the users information that is attached to a feature request", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Domain:": "Domena:", - "@Domain:": { - "description": "The label for the Canvas domain of the logged in user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "User ID:": "ID uporabnika:", - "@User ID:": { - "description": "The label for the Canvas user ID of the logged in user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Email:": "E-pošta:", - "@Email:": { - "description": "The label for the eamil of the logged in user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Locale:": "Območna nastavitev:", - "@Locale:": { - "description": "The label for the locale of the logged in user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Terms of Use": "Pogoji uporabe", - "@Terms of Use": { - "description": "Label for the terms of use", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Canvas on GitHub": "Canvas na GitHub", - "@Canvas on GitHub": { - "description": "Label for the button that opens the Canvas project on GitHub's website", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was a problem loading the Terms of Use": "Prišlo je do težav pri nalaganju pogojev uporabe.", - "@There was a problem loading the Terms of Use": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Device": "Naprava", - "@Device": { - "description": "Label used for device manufacturer/model in the error report", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "OS Version": "Različica OS", - "@OS Version": { - "description": "Label used for device operating system version in the error report", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Version Number": "Številka različice", - "@Version Number": { - "description": "Label used for the app version number in the error report", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Report A Problem": "Poročajte o težavi", - "@Report A Problem": { - "description": "Title used for generic dialog to report problems", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Subject": "Kratek opis predmeta", - "@Subject": { - "description": "Label used for Subject text field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "A subject is required.": "Polje za zadevo mora biti izpolnjeno.", - "@A subject is required.": { - "description": "Error shown when the subject field is empty", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "An email address is required.": "Potreben je e-poštni naslov.", - "@An email address is required.": { - "description": "Error shown when the email field is empty", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Description": "Opis", - "@Description": { - "description": "Label used for Description text field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "A description is required.": "Opis je obvezen.", - "@A description is required.": { - "description": "Error shown when the description field is empty", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "How is this affecting you?": "Kako to vpliva na vas?", - "@How is this affecting you?": { - "description": "Label used for the dropdown to select how severe the issue is", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "send": "pošlji", - "@send": { - "description": "Label used for send button when reporting a problem", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Just a casual question, comment, idea, suggestion…": "Samo neobvezno vprašanje, komentar, zamisel, predlog ...", - "@Just a casual question, comment, idea, suggestion…": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I need some help but it's not urgent.": "Potrebujem pomoč, ni pa nujno.", - "@I need some help but it's not urgent.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Something's broken but I can work around it to get what I need done.": "Nekaj ne deluje, a znam to rešiti, da dokončam, kar je treba.", - "@Something's broken but I can work around it to get what I need done.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I can't get things done until I hear back from you.": "Ne morem dokončati zadev, dokler ne prejmem vašega odziva.", - "@I can't get things done until I hear back from you.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "EXTREME CRITICAL EMERGENCY!!": "SKRAJNO KRITIČNI NUJNI PRIMER", - "@EXTREME CRITICAL EMERGENCY!!": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Not Graded": "Ni ocenjeno", - "@Not Graded": { - "description": "Description for an assignment has not been graded.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Login flow: Normal": "Potek prijave: Aktivno", - "@Login flow: Normal": { - "description": "Description for the normal login flow", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Login flow: Canvas": "Potek prijave: Sistem Canvas", - "@Login flow: Canvas": { - "description": "Description for the Canvas login flow", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Login flow: Site Admin": "Potek prijave: Skrbnik mesta", - "@Login flow: Site Admin": { - "description": "Description for the Site Admin login flow", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Login flow: Skip mobile verify": "Potek prijave: Preskoči mobilno potrditev", - "@Login flow: Skip mobile verify": { - "description": "Description for the login flow that skips domain verification for mobile", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Act As User": "Prevzemi vlogo uporabnika", - "@Act As User": { - "description": "Label for the button that allows the user to act (masquerade) as another user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Stop Acting as User": "Opustite vlogo uporabnika", - "@Stop Acting as User": { - "description": "Label for the button that allows the user to stop acting (masquerading) as another user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "actingAsUser": "Nastopate v vlogi {userName}", - "@actingAsUser": { - "description": "Message shown while acting (masquerading) as another user", - "type": "text", - "placeholders_order": [ - "userName" - ], - "placeholders": { - "userName": {} - } - }, - "\"Act as\" is essentially logging in as this user without a password. You will be able to take any action as if you were this user, and from other users' points of views, it will be as if this user performed them. However, audit logs record that you were the one who performed the actions on behalf of this user.": "»Nastopajoči v vlogi« se v osnovi prijavlja kot ta uporabnik brez gesla. Lahko boste izvedli katero koli dejanje, kot bi bili ta uporabnik, z vidika drugih uporabnikov pa bo videti, kot da je dejanja izvedel ta uporabnik. Vendar dnevniki dogodkov beležijo, da ste v imenu tega uporabnika dejanja izvedli vi.", - "@\"Act as\" is essentially logging in as this user without a password. You will be able to take any action as if you were this user, and from other users' points of views, it will be as if this user performed them. However, audit logs record that you were the one who performed the actions on behalf of this user.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Domain": "Domena", - "@Domain": { - "description": "Text field hint for domain url input", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You must enter a valid domain": "Vnesti morate veljavno domeno", - "@You must enter a valid domain": { - "description": "Message displayed for domain input error", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "User ID": "ID uporabnika", - "@User ID": { - "description": "Text field hint for user ID input", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You must enter a user id": "Vnesti morate ID uporabnika", - "@You must enter a user id": { - "description": "Message displayed for user Id input error", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error trying to act as this user. Please check the Domain and User ID and try again.": "Prišlo je do napake pri prevzemanju vloge tega uporabnika. Preverite domeno in ID uporabnika ter poskusite znova.", - "@There was an error trying to act as this user. Please check the Domain and User ID and try again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "endMasqueradeMessage": "Prenehali boste nastopati v vlogi {userName} in se vrnili v svoj prvotni račun.", - "@endMasqueradeMessage": { - "description": "Confirmation message displayed when the user wants to stop acting (masquerading) as another user", - "type": "text", - "placeholders_order": [ - "userName" - ], - "placeholders": { - "userName": {} - } - }, - "endMasqueradeLogoutMessage": "Prenehali boste nastopati v vlogi {userName} in boste odjavljeni.", - "@endMasqueradeLogoutMessage": { - "description": "Confirmation message displayed when the user wants to stop acting (masquerading) as another user and will be logged out.", - "type": "text", - "placeholders_order": [ - "userName" - ], - "placeholders": { - "userName": {} - } - }, - "How are we doing?": "Kako nam gre?", - "@How are we doing?": { - "description": "Title for dialog asking user to rate the app out of 5 stars.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Don't show again": "Ne prikaži znova", - "@Don't show again": { - "description": "Button to prevent the rating dialog from showing again.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "What can we do better?": "Kaj lahko izboljšamo?", - "@What can we do better?": { - "description": "Hint text for providing a comment with the rating.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Send Feedback": "Pošlji povratne informacije", - "@Send Feedback": { - "description": "Button to send rating with feedback", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "ratingDialogEmailSubject": "Predlogi za sistem Android – Canvas Parent {version}", - "@ratingDialogEmailSubject": { - "description": "The subject for an email to provide feedback for CanvasParent.", - "type": "text", - "placeholders_order": [ - "version" - ], - "placeholders": { - "version": {} - } - }, - "starRating": "{position,plural, =1{{position} zvezda}other{{position} zvezde}}", - "@starRating": { - "description": "Accessibility label for the 1 stars to 5 stars rating", - "type": "text", - "placeholders_order": [ - "position" - ], - "placeholders": { - "position": { - "example": 1 - } - } - }, - "Student Pairing": "Seznanjanje študenta", - "@Student Pairing": { - "description": "Title for the screen where users can pair to students using a QR code", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Open Canvas Student": "Odpiranje Canvas Student", - "@Open Canvas Student": { - "description": "Title for QR pairing tutorial screen instructing users to open the Canvas Student app", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You'll need to open your student's Canvas Student app to continue. Go into Main Menu > Settings > Pair with Observer and scan the QR code you see there.": "Če želite nadaljevati, odprite aplikacijo Canvas Student za študente. Pojdite v glavni meni > Nastavitve > Seznani s skritim bralcem in odčitajte prikazano kodo QR", - "@You'll need to open your student's Canvas Student app to continue. Go into Main Menu > Settings > Pair with Observer and scan the QR code you see there.": { - "description": "Message explaining how QR code pairing works", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Screenshot showing location of pairing QR code generation in the Canvas Student app": "Posnetek zaslona, ki prikazuje lokacijo za ustvarjanje kode QR za seznanjanje v aplikaciji Canvas Student", - "@Screenshot showing location of pairing QR code generation in the Canvas Student app": { - "description": "Content Description for qr pairing tutorial screenshot", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Expired QR Code": "Koda QR je potekla", - "@Expired QR Code": { - "description": "Error title shown when the users scans a QR code that has expired", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The QR code you scanned may have expired. Refresh the code on the student's device and try again.": "Veljavnost kode QR, ki ste jo odčitali, je potekla. Osvežite kodo na študentovi napravi in poskusite znova.", - "@The QR code you scanned may have expired. Refresh the code on the student's device and try again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "A network error occurred when adding this student. Check your connection and try again.": "Pri dodajanju tega študenta je prišlo do napake v omrežju. Preverite svojo povezavo in poskusite znova.", - "@A network error occurred when adding this student. Check your connection and try again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Invalid QR Code": "Neveljavna koda QR", - "@Invalid QR Code": { - "description": "Error title shown when the user scans an invalid QR code", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Incorrect Domain": "Nepravilna domena", - "@Incorrect Domain": { - "description": "Error title shown when the users scane a QR code for a student that belongs to a different domain", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The student you are trying to add belongs to a different school. Log in or create an account with that school to scan this code.": "Študent, ki ga poskušate dodati, spada v drugo šolo. Prijavite se ali ustvarite račun pri tej šoli, če želite odčitati to kodo.", - "@The student you are trying to add belongs to a different school. Log in or create an account with that school to scan this code.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Camera Permission": "Dovoljenje za uporabo kamere", - "@Camera Permission": { - "description": "Error title shown when the user wans to scan a QR code but has denied the camera permission", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "This will unpair and remove all enrollments for this student from your account.": "Ta možnost bo odstranila seznanitev in vse vpise za študenta v vašem računu.", - "@This will unpair and remove all enrollments for this student from your account.": { - "description": "Confirmation message shown when the user tries to delete a student from their account", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was a problem removing this student from your account. Please check your connection and try again.": "Prišlo je do težave pri odstranjevanju tega študenta iz računa. Preverite svojo povezavo in poskusite znova.", - "@There was a problem removing this student from your account. Please check your connection and try again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Cancel": "Prekliči", - "@Cancel": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "next": "Naprej", - "@next": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "ok": "V redu", - "@ok": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Yes": "Da", - "@Yes": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No": "Ne", - "@No": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Retry": "Ponovno poskusi", - "@Retry": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Delete": "Odstrani", - "@Delete": { - "description": "Label used for general delete/remove actions", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Done": "Dokončano", - "@Done": { - "description": "Label for general done/finished actions", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Refresh": "Osveži", - "@Refresh": { - "description": "Label for button to refresh data from the web", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "View Description": "Prikaz opisa", - "@View Description": { - "description": "Button to view the description for an event or assignment", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "expanded": "razširjeno", - "@expanded": { - "description": "Description for the accessibility reader for list groups that are expanded", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "collapsed": "strnjeno", - "@collapsed": { - "description": "Description for the accessibility reader for list groups that are expanded", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "An unexpected error occurred": "Prišlo je do nepričakovane napake", - "@An unexpected error occurred": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No description": "Brez opisa", - "@No description": { - "description": "Message used when the assignment has no description", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Launch External Tool": "Zaženi zunanje orodje", - "@Launch External Tool": { - "description": "Button text added to webviews to let users open external tools in their browser", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Interactions on this page are limited by your institution.": "Interakcije na tej strani omejuje vaša ustanova.", - "@Interactions on this page are limited by your institution.": { - "description": "Message describing how the webview has limited access due to an instution setting", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "dateAtTime": "{date} ob {time}", - "@dateAtTime": { - "description": "The string to format dates", - "type": "text", - "placeholders_order": [ - "date", - "time" - ], - "placeholders": { - "date": {}, - "time": {} - } - }, - "dueDateAtTime": "Roki {date} ob {time}", - "@dueDateAtTime": { - "description": "The string to format due dates", - "type": "text", - "placeholders_order": [ - "date", - "time" - ], - "placeholders": { - "date": {}, - "time": {} - } - }, - "No Due Date": "Ni roka.", - "@No Due Date": { - "description": "Label for assignments that do not have a due date", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Filter": "Filter", - "@Filter": { - "description": "Label for buttons to filter what items are visible", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "unread": "neprebrano", - "@unread": { - "description": "Label for things that are marked as unread", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "unreadCount": "{count} neprebranih", - "@unreadCount": { - "description": "Formatted string for when there are a number of unread items", - "type": "text", - "placeholders_order": [ - "count" - ], - "placeholders": { - "count": {} - } - }, - "badgeNumberPlus": "{count}+", - "@badgeNumberPlus": { - "description": "Formatted string for when too many items are being notified in a badge, generally something like: 99+", - "type": "text", - "placeholders_order": [ - "count" - ], - "placeholders": { - "count": {} - } - }, - "There was an error loading this announcement": "Prišlo je do napake pri nalaganju tega obvestila", - "@There was an error loading this announcement": { - "description": "Message shown when an announcement detail screen fails to load", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Network error": "Napaka v omrežju", - "@Network error": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Under Construction": "V delu", - "@Under Construction": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "We are currently building this feature for your viewing pleasure.": "Ta funkcija je v izdelavi za vaš užitek ob gledanju.", - "@We are currently building this feature for your viewing pleasure.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Request Login Help Button": "Zahtevaj gumb za pomoč pri prijavi", - "@Request Login Help Button": { - "description": "Accessibility hint for button that opens help dialog for a login help request", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Request Login Help": "Zahtevaj pomoč pri prijavi", - "@Request Login Help": { - "description": "Title of help dialog for a login help request", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I'm having trouble logging in": "Imam težave pri prijavi", - "@I'm having trouble logging in": { - "description": "Subject of help dialog for a login help request", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "An error occurred when trying to display this link": "Med prikazovanjem te povezave je prišlo do napake", - "@An error occurred when trying to display this link": { - "description": "Error message shown when a link can't be opened", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "We are unable to display this link, it may belong to an institution you currently aren't logged in to.": "Te povezave ne moremo prikazati; morda pripada ustanovi, v katero trenutno niste prijavljeni.", - "@We are unable to display this link, it may belong to an institution you currently aren't logged in to.": { - "description": "Description for error page shown when clicking a link", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Link Error": "Napaka povezave", - "@Link Error": { - "description": "Title for error page shown when clicking a link", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Open In Browser": "Odpri v brskalniku", - "@Open In Browser": { - "description": "Text for button to open a link in the browswer", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You'll find the QR code on the web in your account profile. Click 'QR for Mobile Login' in the list.": "Kodo QR boste našli v svojem profilu računa na spletu. Na seznamu kliknite »QR za mobilno prijavo«.", - "@You'll find the QR code on the web in your account profile. Click 'QR for Mobile Login' in the list.": { - "description": "Text for qr login tutorial screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Locate QR Code": "Poiščite kodo QR", - "@Locate QR Code": { - "description": "Text for qr login button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Please scan a QR code generated by Canvas": "Preberite kodo QR, ustvarjeno v sistemu Canvas", - "@Please scan a QR code generated by Canvas": { - "description": "Text for qr login error with incorrect qr code", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error logging in. Please generate another QR Code and try again.": "Pri prijavi je prišlo do napake. Ustvarite novo kodo QR in poskusite znova.", - "@There was an error logging in. Please generate another QR Code and try again.": { - "description": "Text for qr login error", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Screenshot showing location of QR code generation in browser": "Posnetek zaslona, ki prikazuje, kje v brskalniku ustvarite kodo QR", - "@Screenshot showing location of QR code generation in browser": { - "description": "Content Description for qr login tutorial screenshot", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "QR scanning requires camera access": "Za branje kode QR je potreben dostop do kamere", - "@QR scanning requires camera access": { - "description": "placeholder for camera error for QR code scan", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The linked item is no longer available": "Povezani element ni več na voljo", - "@The linked item is no longer available": { - "description": "error message when the alert could no be opened", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Message sent": "Sporočilo je bilo poslano", - "@Message sent": { - "description": "confirmation message on the screen when the user succesfully sends a message", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Acceptable Use Policy": "Pravilnik o sprejemljivi rabi", - "@Acceptable Use Policy": { - "description": "title for the acceptable use policy screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Submit": "Oddaj", - "@Submit": { - "description": "submit button title for acceptable use policy screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Either you're a new user or the Acceptable Use Policy has changed since you last agreed to it. Please agree to the Acceptable Use Policy before you continue.": "Ste nov uporabnik ali pa so Pravilnik o sprejemljivi rabi spremenili, odkar ste se nazadnje strinjali z njim. Pred nadaljevanjem potrdite, da se strinjate s Pravilnikom o sprejemljivi rabi.", - "@Either you're a new user or the Acceptable Use Policy has changed since you last agreed to it. Please agree to the Acceptable Use Policy before you continue.": { - "description": "acceptable use policy screen description", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I agree to the Acceptable Use Policy.": "Strinjam se s Pravilnikom o sprejemljivi rabi.", - "@I agree to the Acceptable Use Policy.": { - "description": "acceptable use policy switch title", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "About": "Vizitka", - "@About": { - "description": "Title for about menu item in settings", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "App": "Aplikacija", - "@App": { - "description": "Title for App field on about page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Login ID": "ID prijave", - "@Login ID": { - "description": "Title for Login ID field on about page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Email": "E-pošta", - "@Email": { - "description": "Title for Email field on about page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Version": "Različica", - "@Version": { - "description": "Title for Version field on about page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - } -} \ No newline at end of file diff --git a/apps/flutter_parent/lib/l10n/res/intl_sv.arb b/apps/flutter_parent/lib/l10n/res/intl_sv.arb deleted file mode 100644 index cf0f525594..0000000000 --- a/apps/flutter_parent/lib/l10n/res/intl_sv.arb +++ /dev/null @@ -1,2753 +0,0 @@ -{ - "@@last_modified": "2023-08-25T11:04:20.901151", - "alertsLabel": "Notiser", - "@alertsLabel": { - "description": "The label for the Alerts tab", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "calendarLabel": "Kalender", - "@calendarLabel": { - "description": "The label for the Calendar tab", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "coursesLabel": "Kurser", - "@coursesLabel": { - "description": "The label for the Courses tab", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Students": "Inga studenter", - "@No Students": { - "description": "Text for when an observer has no students they are observing", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Tap to show student selector": "Tryck för att visa studentväljare", - "@Tap to show student selector": { - "description": "Semantics label for the area that will show the student selector when tapped", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Tap to pair with a new student": "Tryck för att koppla samman med en ny student", - "@Tap to pair with a new student": { - "description": "Semantics label for the add student button in the student selector", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Tap to select this student": "Tryck för att välja den här studenten", - "@Tap to select this student": { - "description": "Semantics label on individual students in the student switcher", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Manage Students": "Hantera studenter", - "@Manage Students": { - "description": "Label text for the Manage Students nav drawer button as well as the title for the Manage Students screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Help": "Hjälp", - "@Help": { - "description": "Label text for the help nav drawer button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Log Out": "Logga ut", - "@Log Out": { - "description": "Label text for the Log Out nav drawer button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Switch Users": "Växla användare", - "@Switch Users": { - "description": "Label text for the Switch Users nav drawer button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "appVersion": "v. {version}", - "@appVersion": { - "description": "App version shown in the navigation drawer", - "type": "text", - "placeholders_order": [ - "version" - ], - "placeholders": { - "version": {} - } - }, - "Are you sure you want to log out?": "Vill du logga ut?", - "@Are you sure you want to log out?": { - "description": "Confirmation message displayed when the user tries to log out", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Calendars": "Kalendrar", - "@Calendars": { - "description": "Label for button that lets users select which calendars to display", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "nextMonth": "Nästa månad: {month}", - "@nextMonth": { - "description": "Label for the button that switches the calendar to the next month", - "type": "text", - "placeholders_order": [ - "month" - ], - "placeholders": { - "month": {} - } - }, - "previousMonth": "Föregående månad: {month}", - "@previousMonth": { - "description": "Label for the button that switches the calendar to the previous month", - "type": "text", - "placeholders_order": [ - "month" - ], - "placeholders": { - "month": {} - } - }, - "nextWeek": "Nästa vecka börjar {date}", - "@nextWeek": { - "description": "Label for the button that switches the calendar to the next week", - "type": "text", - "placeholders_order": [ - "date" - ], - "placeholders": { - "date": {} - } - }, - "previousWeek": "Föregående vecka startade {date}", - "@previousWeek": { - "description": "Label for the button that switches the calendar to the previous week", - "type": "text", - "placeholders_order": [ - "date" - ], - "placeholders": { - "date": {} - } - }, - "selectedMonthLabel": "Månaden {month}", - "@selectedMonthLabel": { - "description": "Accessibility label for the button that expands/collapses the month view", - "type": "text", - "placeholders_order": [ - "month" - ], - "placeholders": { - "month": {} - } - }, - "expand": "visa", - "@expand": { - "description": "Accessibility label for the on-tap hint for the button that expands/collapses the month view", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "collapse": "dölj", - "@collapse": { - "description": "Accessibility label for the on-tap hint for the button that expands/collapses the month view", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "pointsPossible": "{points} möjliga poäng", - "@pointsPossible": { - "description": "Screen reader label used for the points possible for an assignment, quiz, etc.", - "type": "text", - "placeholders_order": [ - "points" - ], - "placeholders": { - "points": {} - } - }, - "calendarDaySemanticsLabel": "{eventCount,plural, =1{{date}, {eventCount} händelse}other{{date}, {eventCount} händelser}}", - "@calendarDaySemanticsLabel": { - "description": "Screen reader label used for calendar day, reads the date and count of events", - "type": "text", - "placeholders_order": [ - "date", - "eventCount" - ], - "placeholders": { - "date": {}, - "eventCount": {} - } - }, - "No Events Today!": "Inga händelser idag!", - "@No Events Today!": { - "description": "Title displayed when there are no calendar events for the current day", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "It looks like a great day to rest, relax, and recharge.": "Det verkar vara en bra dag för vila, avslappning och omladdning.", - "@It looks like a great day to rest, relax, and recharge.": { - "description": "Message displayed when there are no calendar events for the current day", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading your student's calendar": "Det gick inte att läsa in din studentkalender.", - "@There was an error loading your student's calendar": { - "description": "Message displayed when calendar events could not be loaded for the current student", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Tap to favorite the courses you want to see on the Calendar. Select up to 10.": "Tryck för att favoritmarkera de kurser du vill se i kalendern. Välj upp till 10.", - "@Tap to favorite the courses you want to see on the Calendar. Select up to 10.": { - "description": "Description text on calendar filter screen.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You may only choose 10 calendars to display": "Du kan endast välja 10 kalendrar att visa", - "@You may only choose 10 calendars to display": { - "description": "Error text when trying to select more than 10 calendars", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You must select at least one calendar to display": "Du måste välja minst en kalender att visa", - "@You must select at least one calendar to display": { - "description": "Error text when trying to de-select all calendars", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Planner Note": "Planner-anteckning", - "@Planner Note": { - "description": "Label used for notes in the planner", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Go to today": "Gå till i dag", - "@Go to today": { - "description": "Accessibility label used for the today button in the planner", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Previous Logins": "Tidigare inloggningar", - "@Previous Logins": { - "description": "Label for the list of previous user logins", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "canvasLogoLabel": "Canvas-logotyp", - "@canvasLogoLabel": { - "description": "The semantics label for the Canvas logo", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "findSchool": "Sök efter skola", - "@findSchool": { - "description": "Text for the find-my-school button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "findAnotherSchool": "Hitta en annan skola", - "@findAnotherSchool": { - "description": "Text for the find-another-school button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "domainSearchInputHint": "Ange skolans namn eller distrikt...", - "@domainSearchInputHint": { - "description": "Input hint for the text box on the domain search screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "noDomainResults": "Det gick inte att hitta skolar som matchar \"{query}\"", - "@noDomainResults": { - "description": "Message shown to users when the domain search query did not return any results", - "type": "text", - "placeholders_order": [ - "query" - ], - "placeholders": { - "query": {} - } - }, - "domainSearchHelpLabel": "Hur hittar jag min skola eller distrikt?", - "@domainSearchHelpLabel": { - "description": "Label for the help button on the domain search screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "canvasGuides": "Canvas-guider", - "@canvasGuides": { - "description": "Proper name for the Canvas Guides. This will be used in the domainSearchHelpBody text and will be highlighted and clickable", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "canvasSupport": "Canvas Support", - "@canvasSupport": { - "description": "Proper name for Canvas Support. This will be used in the domainSearchHelpBody text and will be highlighted and clickable", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "domainSearchHelpBody": "Försök med att söka efter namnet på skolan eller distrikten du vill ansluta till, t.ex. “Allmänna skolan” eller “Skolor i Skåne”. Du kan även ange en Canvas-domän direkt, t.ex. “smith.instructure.com.”\n\nMer information om hur du kan hitta din lärosätes Canvas-konto finns på {canvasGuides} eller kontakta {canvasSupport} eller din skola för att få hjälp.", - "@domainSearchHelpBody": { - "description": "The body text shown in the help dialog on the domain search screen", - "type": "text", - "placeholders_order": [ - "canvasGuides", - "canvasSupport" - ], - "placeholders": { - "canvasGuides": {}, - "canvasSupport": {} - } - }, - "Uh oh!": "Oj då!", - "@Uh oh!": { - "description": "Title of the screen that shows when a crash has occurred", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "We’re not sure what happened, but it wasn’t good. Contact us if this keeps happening.": "Vi vet inte vad som hände, men det fungerar inte. Kontakta oss om detta fortsätter att inträffa.", - "@We’re not sure what happened, but it wasn’t good. Contact us if this keeps happening.": { - "description": "Message shown when a crash has occurred", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Contact Support": "Kontakta supporten", - "@Contact Support": { - "description": "Label for the button that allows users to contact support after a crash has occurred", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "View error details": "Visa felinformation", - "@View error details": { - "description": "Label for the button that allowed users to view crash details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Restart app": "Starta om appen", - "@Restart app": { - "description": "Label for the button that will restart the entire application", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Application version": "Programversion", - "@Application version": { - "description": "Label for the application version displayed in the crash details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Device model": "Enhetsmodell", - "@Device model": { - "description": "Label for the device model displayed in the crash details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Android OS version": "Android AS-version", - "@Android OS version": { - "description": "Label for the Android operating system version displayed in the crash details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Full error message": "Fullständigt felmeddelande", - "@Full error message": { - "description": "Label for the full error message displayed in the crash details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Inbox": "Inkorg", - "@Inbox": { - "description": "Title for the Inbox screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading your inbox messages.": "Det gick inte att läsa in dina meddelanden i inkorgen.", - "@There was an error loading your inbox messages.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Subject": "Inget ämne", - "@No Subject": { - "description": "Title used for inbox messages that have no subject", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unable to fetch courses. Please check your connection and try again.": "Det gick inte att hämta kurser. Kontrollera din anslutning och försök igen.", - "@Unable to fetch courses. Please check your connection and try again.": { - "description": "Message shown when an error occured while loading courses", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Choose a course to message": "Välj en kurs att skicka meddelande till", - "@Choose a course to message": { - "description": "Header in the course list shown when the user is choosing which course to associate with a new message", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Inbox Zero": "Inbox Zero", - "@Inbox Zero": { - "description": "Title of the message shown when there are no inbox messages", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You’re all caught up!": "Du är helt i kapp!", - "@You’re all caught up!": { - "description": "Subtitle of the message shown when there are no inbox messages", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading recipients for this course": "Det gick inte att läsa in mottagare för den här kursen", - "@There was an error loading recipients for this course": { - "description": "Message shown when attempting to create a new message but the recipients list failed to load", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unable to send message. Check your connection and try again.": "Det gick inte att skicka meddelandet. Kontrollera din anslutning och försök igen.", - "@Unable to send message. Check your connection and try again.": { - "description": "Message show when there was an error creating or sending a new message", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unsaved changes": "Osparade ändringar", - "@Unsaved changes": { - "description": "Title of the dialog shown when the user tries to leave with unsaved changes", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Are you sure you wish to close this page? Your unsent message will be lost.": "Är du säker på att du vill stänga den här sidan? Ditt meddelande du ännu inte skickat kommer att tas bort.", - "@Are you sure you wish to close this page? Your unsent message will be lost.": { - "description": "Body text of the dialog shown when the user tries leave with unsaved changes", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "New message": "Nytt meddelande", - "@New message": { - "description": "Title of the new-message screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Add attachment": "Lägg till bilaga", - "@Add attachment": { - "description": "Tooltip for the add-attachment button in the new-message screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Send message": "Skicka meddelandet", - "@Send message": { - "description": "Tooltip for the send-message button in the new-message screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Select recipients": "Välj mottagare", - "@Select recipients": { - "description": "Tooltip for the button that allows users to select message recipients", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No recipients selected": "Inga mottagare har valts", - "@No recipients selected": { - "description": "Hint displayed when the user has not selected any message recipients", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Message subject": "Meddelandeämne", - "@Message subject": { - "description": "Hint text displayed in the input field for the message subject", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Message": "Meddelande", - "@Message": { - "description": "Hint text displayed in the input field for the message body", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Recipients": "Mottagare", - "@Recipients": { - "description": "Label for message recipients", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "plusRecipientCount": "+{count}", - "@plusRecipientCount": { - "description": "Shows the number of recipients that are selected but not displayed on screen.", - "type": "text", - "placeholders_order": [ - "count" - ], - "placeholders": { - "count": { - "example": 5 - } - } - }, - "Failed. Tap for options.": "Misslyckades. Tryck för alternativ.", - "@Failed. Tap for options.": { - "description": "Short message shown on a message attachment when uploading has failed", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "courseForWhom": "för {studentShortName}", - "@courseForWhom": { - "description": "Describes for whom a course is for (i.e. for Bill)", - "type": "text", - "placeholders_order": [ - "studentShortName" - ], - "placeholders": { - "studentShortName": {} - } - }, - "messageLinkPostscript": "Angående : {studentName}, {linkUrl}", - "@messageLinkPostscript": { - "description": "A postscript appended to new messages that clarifies which student is the subject of the message and also includes a URL for the related Canvas component (course, assignment, event, etc).", - "type": "text", - "placeholders_order": [ - "studentName", - "linkUrl" - ], - "placeholders": { - "studentName": {}, - "linkUrl": {} - } - }, - "There was an error loading this conversation": "Det gick inte att läsa in den här konversationen", - "@There was an error loading this conversation": { - "description": "Message shown when a conversation fails to load", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Reply": "Svara", - "@Reply": { - "description": "Button label for replying to a conversation", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Reply All": "Svara alla", - "@Reply All": { - "description": "Button label for replying to all conversation participants", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unknown User": "Okänd användare", - "@Unknown User": { - "description": "Label used where the user name is not known", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "me": "jag", - "@me": { - "description": "First-person pronoun (i.e. 'me') that will be used in message author info, e.g. 'Me to 4 others' or 'Jon Snow to me'", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "authorToRecipient": "{authorName} till {recipientName}", - "@authorToRecipient": { - "description": "Author info for a single-recipient message; includes both the author name and the recipient name.", - "type": "text", - "placeholders_order": [ - "authorName", - "recipientName" - ], - "placeholders": { - "authorName": {}, - "recipientName": {} - } - }, - "authorToNOthers": "{howMany,plural, =1{{authorName} till 1 annan}other{{authorName} till {howMany} andra}}", - "@authorToNOthers": { - "description": "Author info for a mutli-recipient message; includes the author name and the number of recipients", - "type": "text", - "placeholders_order": [ - "authorName", - "howMany" - ], - "placeholders": { - "authorName": {}, - "howMany": {} - } - }, - "authorToRecipientAndNOthers": "{howMany,plural, =1{{authorName} till {recipientName} och 1 annan}other{{authorName} till {recipientName} och {howMany} andra}}", - "@authorToRecipientAndNOthers": { - "description": "Author info for a multi-recipient message; includes the author name, one recipient name, and the number of other recipients", - "type": "text", - "placeholders_order": [ - "authorName", - "recipientName", - "howMany" - ], - "placeholders": { - "authorName": {}, - "recipientName": {}, - "howMany": {} - } - }, - "Download": "Ladda ner", - "@Download": { - "description": "Label for the button that will begin downloading a file", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Open with another app": "Öppna med en annan app", - "@Open with another app": { - "description": "Label for the button that will allow users to open a file with another app", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There are no installed applications that can open this file": "Det finns inga installerade program som kan öppna den här filen", - "@There are no installed applications that can open this file": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unsupported File": "Filtyp som inte stöds", - "@Unsupported File": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "This file is unsupported and can’t be viewed through the app": "Den här filen stöds inte och kan inte visas i appen", - "@This file is unsupported and can’t be viewed through the app": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unable to play this media file": "Det går inte att spela upp den här mediefilen", - "@Unable to play this media file": { - "description": "Message shown when audio or video media could not be played", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unable to load this image": "Det går inte att läsa in den här bilden", - "@Unable to load this image": { - "description": "Message shown when an image file could not be loaded or displayed", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading this file": "Det gick inte att läsa in den här filen", - "@There was an error loading this file": { - "description": "Message shown when a file could not be loaded or displayed", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Courses": "Inga kurser", - "@No Courses": { - "description": "Title for having no courses", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Your student’s courses might not be published yet.": "Dina studentkurser kanske inte publicerats än.", - "@Your student’s courses might not be published yet.": { - "description": "Message for having no courses", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading your student’s courses.": "Det gick inte att läsa in din students kurser.", - "@There was an error loading your student’s courses.": { - "description": "Message displayed when the list of student courses could not be loaded", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Grade": "Ingen omdöme", - "@No Grade": { - "description": "Message shown when there is currently no grade available for a course", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Filter by": "Filtrera efter", - "@Filter by": { - "description": "Title for list of terms to filter grades by", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Grades": "Omdömen", - "@Grades": { - "description": "Label for the \"Grades\" tab in course details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Syllabus": "Kursöversikt", - "@Syllabus": { - "description": "Label for the \"Syllabus\" tab in course details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Front Page": "Framsida", - "@Front Page": { - "description": "Label for the \"Front Page\" tab in course details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Summary": "Sammanfattning", - "@Summary": { - "description": "Label for the \"Summary\" tab in course details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Send a message about this course": "Skicka ett meddelande om den här kursen", - "@Send a message about this course": { - "description": "Accessibility hint for the course messaage floating action button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Total Grade": "Total omdöme", - "@Total Grade": { - "description": "Label for the total grade in the course", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Graded": "Har bedömts", - "@Graded": { - "description": "Label for assignments that have been graded", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Submitted": "Skickad", - "@Submitted": { - "description": "Label for assignments that have been submitted", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Not Submitted": "Inte inlämnat", - "@Not Submitted": { - "description": "Label for assignments that have not been submitted", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Late": "Sen", - "@Late": { - "description": "Label for assignments that have been marked late or submitted late", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Missing": "Saknad", - "@Missing": { - "description": "Label for assignments that have been marked missing or are not submitted and past the due date", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "-": "-", - "@-": { - "description": "Value representing no score for student submission", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "All Grading Periods": "Alla bedömningsperioder", - "@All Grading Periods": { - "description": "Label for selecting all grading periods", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Assignments": "Inga uppgifter", - "@No Assignments": { - "description": "Title for the no assignments message", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "It looks like assignments haven't been created in this space yet.": "Det verkar som om inga uppgifter har skapats för den här platsen än.", - "@It looks like assignments haven't been created in this space yet.": { - "description": "Message for no assignments", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading the summary details for this course.": "Det gick inte att läsa in sammanfattningsinformationen för den här kursen.", - "@There was an error loading the summary details for this course.": { - "description": "Message shown when the course summary could not be loaded", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Summary": "Ingen sammanfattning", - "@No Summary": { - "description": "Title displayed when there are no items in the course summary", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "This course does not have any assignments or calendar events yet.": "Den här kursen har inga uppgifter eller kalenderhändelser än.", - "@This course does not have any assignments or calendar events yet.": { - "description": "Message displayed when there are no items in the course summary", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "gradeFormatScoreOutOfPointsPossible": "{score}/{pointsPossible}", - "@gradeFormatScoreOutOfPointsPossible": { - "description": "Formatted string for a student score out of the points possible", - "type": "text", - "placeholders_order": [ - "score", - "pointsPossible" - ], - "placeholders": { - "score": {}, - "pointsPossible": {} - } - }, - "contentDescriptionScoreOutOfPointsPossible": "{score} av {pointsPossible} poäng", - "@contentDescriptionScoreOutOfPointsPossible": { - "description": "Formatted string for a student score out of the points possible", - "type": "text", - "placeholders_order": [ - "score", - "pointsPossible" - ], - "placeholders": { - "score": {}, - "pointsPossible": {} - } - }, - "gradesSubjectMessage": "Angående : {studentName}, omdömen", - "@gradesSubjectMessage": { - "description": "The subject line for a message to a teacher regarding a student's grades", - "type": "text", - "placeholders_order": [ - "studentName" - ], - "placeholders": { - "studentName": {} - } - }, - "syllabusSubjectMessage": "Angående : {studentName}, kursöversikt", - "@syllabusSubjectMessage": { - "description": "The subject line for a message to a teacher regarding a course syllabus", - "type": "text", - "placeholders_order": [ - "studentName" - ], - "placeholders": { - "studentName": {} - } - }, - "frontPageSubjectMessage": "Angående : {studentName}, framsida", - "@frontPageSubjectMessage": { - "description": "The subject line for a message to a teacher regarding a course front page", - "type": "text", - "placeholders_order": [ - "studentName" - ], - "placeholders": { - "studentName": {} - } - }, - "assignmentSubjectMessage": "Angående : {studentName}, uppgift – {assignmentName}", - "@assignmentSubjectMessage": { - "description": "The subject line for a message to a teacher regarding a student's assignment", - "type": "text", - "placeholders_order": [ - "studentName", - "assignmentName" - ], - "placeholders": { - "studentName": {}, - "assignmentName": {} - } - }, - "eventSubjectMessage": "Angående : {studentName}, händelse – {eventTitle}", - "@eventSubjectMessage": { - "description": "The subject line for a message to a teacher regarding a calendar event", - "type": "text", - "placeholders_order": [ - "studentName", - "eventTitle" - ], - "placeholders": { - "studentName": {}, - "eventTitle": {} - } - }, - "There is no page information available.": "Det finns ingen sidinformation tillgänglig.", - "@There is no page information available.": { - "description": "Description for when no page information is available", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Assignment Details": "Uppgiftsdetaljer", - "@Assignment Details": { - "description": "Title for the page that shows details for an assignment", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "assignmentTotalPoints": "{points} poäng", - "@assignmentTotalPoints": { - "description": "Label used for the total points the assignment is worth", - "type": "text", - "placeholders_order": [ - "points" - ], - "placeholders": { - "points": {} - } - }, - "assignmentTotalPointsAccessible": "{points} poäng", - "@assignmentTotalPointsAccessible": { - "description": "Screen reader label used for the total points the assignment is worth", - "type": "text", - "placeholders_order": [ - "points" - ], - "placeholders": { - "points": {} - } - }, - "Due": "Inlämningsdatum", - "@Due": { - "description": "Label for an assignment due date", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Grade": "Omdöme", - "@Grade": { - "description": "Label for the section that displays an assignment's grade", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Locked": "Låst", - "@Locked": { - "description": "Label for when an assignment is locked", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "assignmentLockedModule": "Den här uppgiften har låsts av modulen \"{moduleName}\".", - "@assignmentLockedModule": { - "description": "The locked description when an assignment is locked by a module", - "type": "text", - "placeholders_order": [ - "moduleName" - ], - "placeholders": { - "moduleName": {} - } - }, - "Remind Me": "Påminn mig", - "@Remind Me": { - "description": "Label for the row to set reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Set a date and time to be notified of this specific assignment.": "Ange ett datum och tid för att få en notis för den här specifika uppgiften.", - "@Set a date and time to be notified of this specific assignment.": { - "description": "Description for row to set reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You will be notified about this assignment on…": "Du kommer att få en notis om den här uppgiften på...", - "@You will be notified about this assignment on…": { - "description": "Description for when a reminder is set", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Instructions": "Instruktioner", - "@Instructions": { - "description": "Label for the description of the assignment when it has quiz instructions", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Send a message about this assignment": "Skicka ett meddelande om den här kursen", - "@Send a message about this assignment": { - "description": "Accessibility hint for the assignment messaage floating action button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "This app is not authorized for use.": "Den här appen har inte auktoriserats för användning.", - "@This app is not authorized for use.": { - "description": "The error shown when the app being used is not verified by Canvas", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The server you entered is not authorized for this app.": "Den server du har angett har inte auktoriserats för den här appen.", - "@The server you entered is not authorized for this app.": { - "description": "The error shown when the desired login domain is not verified by Canvas", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The user agent for this app is not authorized.": "Användaragenten för den här appen är inte auktoriserad.", - "@The user agent for this app is not authorized.": { - "description": "The error shown when the user agent during verification is not verified by Canvas", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "We were unable to verify the server for use with this app.": "Vi kunde inte verifiera servern för användning med den här appen.", - "@We were unable to verify the server for use with this app.": { - "description": "The generic error shown when we are unable to verify with Canvas", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Reminders": "Påminnelser", - "@Reminders": { - "description": "Name of the system notification channel for assignment and event reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Notifications for reminders about assignments and calendar events": "Påminnelsenotiser om uppgifter och kalenderhändelser", - "@Notifications for reminders about assignments and calendar events": { - "description": "Description of the system notification channel for assignment and event reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Reminders have changed!": "Påminnelser har ändrats!", - "@Reminders have changed!": { - "description": "Title of the dialog shown when the user needs to update their reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "In order to provide you with a better experience, we have updated how reminders work. You can add new reminders by viewing an assignment or calendar event and tapping the switch under the \"Remind Me\" section.\n\nBe aware that any reminders created with older versions of this app will not be compatible with the new changes and you will need to create them again.": "För att tillhandahålla dig en förbättrad upplevelse har vi uppdaterat påminnelsefunktionen. Du kan lägga till nya påminnelser genom att visa en uppgift eller en kalenderhändelse och trycka på reglaget under avsnittet \"Påminn mig\".\n\nTänk på att påminnelser som skapats i äldre versionen av den här appen inte är kompatibla med de nya ändringarna och måste därför skapas om igen.", - "@In order to provide you with a better experience, we have updated how reminders work. You can add new reminders by viewing an assignment or calendar event and tapping the switch under the \"Remind Me\" section.\n\nBe aware that any reminders created with older versions of this app will not be compatible with the new changes and you will need to create them again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Not a parent?": "Är du inte vårdnadshavare?", - "@Not a parent?": { - "description": "Title for the screen that shows when the user is not observing any students", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "We couldn't find any students associated with this account": "Det gick inte att hitta studenter kopplade till det här kontot", - "@We couldn't find any students associated with this account": { - "description": "Subtitle for the screen that shows when the user is not observing any students", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Are you a student or teacher?": "Är du student eller lärare?", - "@Are you a student or teacher?": { - "description": "Label for button that will show users the option to view other Canvas apps in the Play Store", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "One of our other apps might be a better fit. Tap one to visit the Play Store.": "Någon av våra andra appar kan vara bättre lämpade. Tryck på en för att besöka Play Store.", - "@One of our other apps might be a better fit. Tap one to visit the Play Store.": { - "description": "Description of options to view other Canvas apps in the Play Store", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Return to Login": "Gå tillbaka till inloggning", - "@Return to Login": { - "description": "Label for the button that returns the user to the login screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "STUDENT": "STUDENT", - "@STUDENT": { - "description": "The \"student\" portion of the \"Canvas Student\" app name, in all caps. \"Canvas\" is excluded in this context as it will be displayed to the user as a wordmark image", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "TEACHER": "LÄRARE", - "@TEACHER": { - "description": "The \"teacher\" portion of the \"Canvas Teacher\" app name, in all caps. \"Canvas\" is excluded in this context as it will be displayed to the user as a wordmark image", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Canvas Student": "Canvas-student", - "@Canvas Student": { - "description": "The name of the Canvas Student app. Only \"Student\" should be translated as \"Canvas\" is a brand name in this context and should not be translated.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Canvas Teacher": "Canvas-lärare", - "@Canvas Teacher": { - "description": "The name of the Canvas Teacher app. Only \"Teacher\" should be translated as \"Canvas\" is a brand name in this context and should not be translated.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Alerts": "Inga notiser", - "@No Alerts": { - "description": "The title for the empty message to show to users when there are no alerts for the student.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There’s nothing to be notified of yet.": "Det finns inget att avisera om än.", - "@There’s nothing to be notified of yet.": { - "description": "The empty message to show to users when there are no alerts for the student.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "dismissAlertLabel": "Avvisa {alertTitle}", - "@dismissAlertLabel": { - "description": "Accessibility label to dismiss an alert", - "type": "text", - "placeholders_order": [ - "alertTitle" - ], - "placeholders": { - "alertTitle": {} - } - }, - "Course Announcement": "Anslag", - "@Course Announcement": { - "description": "Title for alerts when there is a course announcement", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Institution Announcement": "Meddelande från lärosätet", - "@Institution Announcement": { - "description": "Title for alerts when there is an institution announcement", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "assignmentGradeAboveThreshold": "Uppgiftsomdöme över {threshold}", - "@assignmentGradeAboveThreshold": { - "description": "Title for alerts when an assignment grade is above the threshold value", - "type": "text", - "placeholders_order": [ - "threshold" - ], - "placeholders": { - "threshold": {} - } - }, - "assignmentGradeBelowThreshold": "Uppgiftsomdöme under {threshold}", - "@assignmentGradeBelowThreshold": { - "description": "Title for alerts when an assignment grade is below the threshold value", - "type": "text", - "placeholders_order": [ - "threshold" - ], - "placeholders": { - "threshold": {} - } - }, - "courseGradeAboveThreshold": "Kursomdöme över {threshold}", - "@courseGradeAboveThreshold": { - "description": "Title for alerts when a course grade is above the threshold value", - "type": "text", - "placeholders_order": [ - "threshold" - ], - "placeholders": { - "threshold": {} - } - }, - "courseGradeBelowThreshold": "Kursomdöme under {threshold}", - "@courseGradeBelowThreshold": { - "description": "Title for alerts when a course grade is below the threshold value", - "type": "text", - "placeholders_order": [ - "threshold" - ], - "placeholders": { - "threshold": {} - } - }, - "Settings": "Inställningar", - "@Settings": { - "description": "Title for the settings screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Theme": "Tema", - "@Theme": { - "description": "Label for the light/dark theme section in the settings page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Dark Mode": "Mörkt läge", - "@Dark Mode": { - "description": "Label for the button that enables dark mode", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Light Mode": "Ljust läge", - "@Light Mode": { - "description": "Label for the button that enables light mode", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "High Contrast Mode": "Högt kontrastläge", - "@High Contrast Mode": { - "description": "Label for the switch that toggles high contrast mode", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Use Dark Theme in Web Content": "Använd mörkt tema i webbinnehållet", - "@Use Dark Theme in Web Content": { - "description": "Label for the switch that toggles dark mode for webviews", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Appearance": "Utseende", - "@Appearance": { - "description": "Label for the appearance section in the settings page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Successfully submitted!": "Uppgiften har skickats in!", - "@Successfully submitted!": { - "description": "Title displayed in the grade cell for an assignment that has been submitted", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "submissionStatusSuccessSubtitle": "Uppgiften lämnades in {date} kl. {time} och väntar på bedömning", - "@submissionStatusSuccessSubtitle": { - "description": "Subtitle displayed in the grade cell for an assignment that has been submitted and is awaiting a grade", - "type": "text", - "placeholders_order": [ - "date", - "time" - ], - "placeholders": { - "date": {}, - "time": {} - } - }, - "outOfPoints": "{howMany,plural, =1{En av 1 poäng}other{En av {points} poäng}}", - "@outOfPoints": { - "description": "Description for an assignment grade that has points without a current scoroe", - "type": "text", - "placeholders_order": [ - "points", - "howMany" - ], - "placeholders": { - "points": {}, - "howMany": {} - } - }, - "Excused": "Ursäktad", - "@Excused": { - "description": "Grading status for an assignment marked as excused", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Complete": "Färdig", - "@Complete": { - "description": "Grading status for an assignment marked as complete", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Incomplete": "Inte färdig", - "@Incomplete": { - "description": "Grading status for an assignment marked as incomplete", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "minus": "minus", - "@minus": { - "description": "Screen reader-friendly replacement for the \"-\" character in letter grades like \"A-\"", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "latePenalty": "Förseningsbestraffning (-{pointsLost})", - "@latePenalty": { - "description": "Text displayed when a late penalty has been applied to the assignment", - "type": "text", - "placeholders_order": [ - "pointsLost" - ], - "placeholders": { - "pointsLost": {} - } - }, - "finalGrade": "Totalt omdöme: {grade}", - "@finalGrade": { - "description": "Text that displays the final grade of an assignment", - "type": "text", - "placeholders_order": [ - "grade" - ], - "placeholders": { - "grade": {} - } - }, - "Alert Settings": "Notisinställningar", - "@Alert Settings": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Alert me when…": "Notifiera mig om...", - "@Alert me when…": { - "description": "Header for the screen where the observer chooses the thresholds that will determine when they receive alerts (e.g. when an assignment is graded below 70%)", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Course grade below": "Kursbetyg under", - "@Course grade below": { - "description": "Label describing the threshold for when the course grade is below a certain percentage", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Course grade above": "Kursbetyg över", - "@Course grade above": { - "description": "Label describing the threshold for when the course grade is above a certain percentage", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Assignment missing": "Tilldelning saknas", - "@Assignment missing": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Assignment grade below": "Uppgiftsbetyg nedan", - "@Assignment grade below": { - "description": "Label describing the threshold for when an assignment is graded below a certain percentage", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Assignment grade above": "Uppgiftsomdöme över", - "@Assignment grade above": { - "description": "Label describing the threshold for when an assignment is graded above a certain percentage", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Course Announcements": "Anslag", - "@Course Announcements": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Institution Announcements": "Meddelande från lärosätet", - "@Institution Announcements": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Never": "Aldrig", - "@Never": { - "description": "Indication that tells the user they will not receive alert notifications of a specific kind", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Grade percentage": "Omdömesprocent", - "@Grade percentage": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading your student's alerts.": "Det gick inte att läsa in din students notiser.", - "@There was an error loading your student's alerts.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Must be below 100": "Måste vara under 100", - "@Must be below 100": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "mustBeBelowN": "Måste vara under {percentage}", - "@mustBeBelowN": { - "description": "Validation error to the user that they must choose a percentage below 'n'", - "type": "text", - "placeholders_order": [ - "percentage" - ], - "placeholders": { - "percentage": { - "example": 5 - } - } - }, - "mustBeAboveN": "Måste vara över {percentage}", - "@mustBeAboveN": { - "description": "Validation error to the user that they must choose a percentage above 'n'", - "type": "text", - "placeholders_order": [ - "percentage" - ], - "placeholders": { - "percentage": { - "example": 5 - } - } - }, - "Select Student Color": "Välj studentfärg", - "@Select Student Color": { - "description": "Title for screen that allows users to assign a color to a specific student", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Electric, blue": "Elektrisk, blå", - "@Electric, blue": { - "description": "Name of the Electric (blue) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Plum, Purple": "Plommon, lila", - "@Plum, Purple": { - "description": "Name of the Plum (purple) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Barney, Fuschia": "Barney, Fuschia", - "@Barney, Fuschia": { - "description": "Name of the Barney (fuschia) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Raspberry, Red": "Hallon, röd", - "@Raspberry, Red": { - "description": "Name of the Raspberry (red) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Fire, Orange": "Eld, orange", - "@Fire, Orange": { - "description": "Name of the Fire (orange) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Shamrock, Green": "Klöver, grön", - "@Shamrock, Green": { - "description": "Name of the Shamrock (green) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "An error occurred while saving your selection. Please try again.": "Ett fel inträffade när ditt val sparades. Försök igen.", - "@An error occurred while saving your selection. Please try again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "changeStudentColorLabel": "Ändra färg för {studentName}", - "@changeStudentColorLabel": { - "description": "Accessibility label for the button that lets users change the color associated with a specific student", - "type": "text", - "placeholders_order": [ - "studentName" - ], - "placeholders": { - "studentName": {} - } - }, - "Teacher": "Lärare", - "@Teacher": { - "description": "Label for the Teacher enrollment type", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Student": "Student", - "@Student": { - "description": "Label for the Student enrollment type", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "TA": "Lärarassistent", - "@TA": { - "description": "Label for the Teaching Assistant enrollment type (also known as Teacher Aid or Education Assistant), reduced to a short acronym/initialism if appropriate.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Observer": "Observatör", - "@Observer": { - "description": "Label for the Observer enrollment type", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Use Camera": "Använd kamera", - "@Use Camera": { - "description": "Label for the action item that lets the user capture a photo using the device camera", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Upload File": "Ladda upp fil", - "@Upload File": { - "description": "Label for the action item that lets the user upload a file from their device", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Choose from Gallery": "Välj från galleri", - "@Choose from Gallery": { - "description": "Label for the action item that lets the user select a photo from their device gallery", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Preparing…": "Förbereder...", - "@Preparing…": { - "description": "Message shown while a file is being prepared to attach to a message", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Add student with…": "Lägg till student med...", - "@Add student with…": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Add Student": "Lägg till student", - "@Add Student": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You are not observing any students.": "Du observerar inga studenter.", - "@You are not observing any students.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading your students.": "Det gick inte att läsa in dina studenter.", - "@There was an error loading your students.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Pairing Code": "Parkopplingskod", - "@Pairing Code": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Students can obtain a pairing code through the Canvas website": "Studenter kan få en parkopplingskod genom att använda Canvas Student-appen i sina mobiler.", - "@Students can obtain a pairing code through the Canvas website": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Enter the student pairing code provided to you. If the pairing code doesn't work, it may have expired": "Ange den studentparkopplingskod du har fått. Om parkopplingskoden inte fungerar kan den ha gått ut", - "@Enter the student pairing code provided to you. If the pairing code doesn't work, it may have expired": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Your code is incorrect or expired.": "Din kod är fel eller har gått ut.", - "@Your code is incorrect or expired.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Something went wrong trying to create your account, please reach out to your school for assistance.": "Något gick fel när ditt konto skulle skapas. Kontakta din skola för hjälp.", - "@Something went wrong trying to create your account, please reach out to your school for assistance.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "QR Code": "QR-kod", - "@QR Code": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Students can create a QR code using the Canvas Student app on their mobile device": "Studenter kan skapa en QR-kod i Canvas Student-appen i sina mobiler.", - "@Students can create a QR code using the Canvas Student app on their mobile device": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Add new student": "Lägg till ny student", - "@Add new student": { - "description": "Semantics label for the FAB on the Manage Students Screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Select": "Välj", - "@Select": { - "description": "Hint text to tell the user to choose one of two options", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I have a Canvas account": "Jag har ett Canvas-konto", - "@I have a Canvas account": { - "description": "Option to select for users that have a canvas account", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I don't have a Canvas account": "Jag har inte ett Canvas-konto", - "@I don't have a Canvas account": { - "description": "Option to select for users that don't have a canvas account", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Create Account": "Skapa konto", - "@Create Account": { - "description": "Button text for account creation confirmation", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Full Name": "Fullständigt namn", - "@Full Name": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Email Address": "E-postadress", - "@Email Address": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Password": "Lösenord", - "@Password": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Full Name…": "Fullständigt namn ...", - "@Full Name…": { - "description": "hint label for inside form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Email…": "E-post …", - "@Email…": { - "description": "hint label for inside form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Password…": "Lösenord ...", - "@Password…": { - "description": "hint label for inside form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Please enter full name": "Ange fullständigt namn", - "@Please enter full name": { - "description": "Error message for form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Please enter an email address": "Ange en e-postadress", - "@Please enter an email address": { - "description": "Error message for form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Please enter a valid email address": "Ange en giltig e-postadress", - "@Please enter a valid email address": { - "description": "Error message for form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Password is required": "Lösenord krävs", - "@Password is required": { - "description": "Error message for form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Password must contain at least 8 characters": "Lösenord måste innehålla minst 8 tecken", - "@Password must contain at least 8 characters": { - "description": "Error message for form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "qrCreateAccountTos": "Genom att trycka på Skapa konto samtycker du till {termsOfService} och {privacyPolicy}", - "@qrCreateAccountTos": { - "description": "The text show on the account creation screen", - "type": "text", - "placeholders_order": [ - "termsOfService", - "privacyPolicy" - ], - "placeholders": { - "termsOfService": {}, - "privacyPolicy": {} - } - }, - "Terms of Service": "Tjänstvillkor", - "@Terms of Service": { - "description": "Label for the Canvas Terms of Service agreement. This will be used in the qrCreateAccountTos text and will be highlighted and clickable", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Privacy Policy": "Sekretesspolicy", - "@Privacy Policy": { - "description": "Label for the Canvas Privacy Policy agreement. This will be used in the qrCreateAccountTos text and will be highlighted and clickable", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "View the Privacy Policy": "Visa sekretesspolicyn", - "@View the Privacy Policy": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Already have an account? ": "Har du redan ett konto? ", - "@Already have an account? ": { - "description": "Part of multiline text span, includes AccountSignIn1-2, in that order", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Sign In": "Logga in", - "@Sign In": { - "description": "Part of multiline text span, includes AccountSignIn1-2, in that order", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Hide Password": "Dölj lösenord", - "@Hide Password": { - "description": "content description for password hide button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Show Password": "Visa lösenord", - "@Show Password": { - "description": "content description for password show button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Terms of Service Link": "Länk till tjänstvillkor", - "@Terms of Service Link": { - "description": "content description for terms of service link", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Privacy Policy Link": "Länk till sekretesspolicy", - "@Privacy Policy Link": { - "description": "content description for privacy policy link", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Event": "Händelse", - "@Event": { - "description": "Title for the event details screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Date": "Datum", - "@Date": { - "description": "Label for the event date", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Location": "Plats", - "@Location": { - "description": "Label for the location information", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Location Specified": "Ingen plats specificerad", - "@No Location Specified": { - "description": "Description for events that do not have a location", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "eventTime": "{startAt}/{endAt}", - "@eventTime": { - "description": "The time the event is happening, example: \"2:00 pm - 4:00 pm\"", - "type": "text", - "placeholders_order": [ - "startAt", - "endAt" - ], - "placeholders": { - "startAt": {}, - "endAt": {} - } - }, - "Set a date and time to be notified of this event.": "Ange ett datum och tid för att få en notis för den här händelsen.", - "@Set a date and time to be notified of this event.": { - "description": "Description for row to set event reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You will be notified about this event on…": "Du kommer att få en notis om den här händelsen den...", - "@You will be notified about this event on…": { - "description": "Description for when an event reminder is set", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Share Your Love for the App": "Dela din kärlek till appen", - "@Share Your Love for the App": { - "description": "Label for option to open the app store", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Tell us about your favorite parts of the app": "Berätta vad du tycker om mest med appen", - "@Tell us about your favorite parts of the app": { - "description": "Description for option to open the app store", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Legal": "Juridik", - "@Legal": { - "description": "Label for legal information option", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Privacy policy, terms of use, open source": "Integritetspolicy, användarvillkor, öppen källkod", - "@Privacy policy, terms of use, open source": { - "description": "Description for legal information option", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Idea for Canvas Parent App [Android]": "Idéer för appen Canvas Parent [Android]", - "@Idea for Canvas Parent App [Android]": { - "description": "The subject for the email to request a feature", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The following information will help us better understand your idea:": "Följande information kommer att hjälpa oss att förstå din idé bättre:", - "@The following information will help us better understand your idea:": { - "description": "The header for the users information that is attached to a feature request", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Domain:": "Domän:", - "@Domain:": { - "description": "The label for the Canvas domain of the logged in user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "User ID:": "Användar-ID:", - "@User ID:": { - "description": "The label for the Canvas user ID of the logged in user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Email:": "E-post:", - "@Email:": { - "description": "The label for the eamil of the logged in user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Locale:": "Plats:", - "@Locale:": { - "description": "The label for the locale of the logged in user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Terms of Use": "Användarvillkor", - "@Terms of Use": { - "description": "Label for the terms of use", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Canvas on GitHub": "Canvas på GitHub", - "@Canvas on GitHub": { - "description": "Label for the button that opens the Canvas project on GitHub's website", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was a problem loading the Terms of Use": "Det gick inte att läsa in användarvillkoren", - "@There was a problem loading the Terms of Use": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Device": "Enhet", - "@Device": { - "description": "Label used for device manufacturer/model in the error report", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "OS Version": "Operativsystemets version", - "@OS Version": { - "description": "Label used for device operating system version in the error report", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Version Number": "Versionsnummer", - "@Version Number": { - "description": "Label used for the app version number in the error report", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Report A Problem": "Rapportera ett problem", - "@Report A Problem": { - "description": "Title used for generic dialog to report problems", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Subject": "Ämne", - "@Subject": { - "description": "Label used for Subject text field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "A subject is required.": "Ämne är obligatoriskt.", - "@A subject is required.": { - "description": "Error shown when the subject field is empty", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "An email address is required.": "E-postadressen är obligatorisk.", - "@An email address is required.": { - "description": "Error shown when the email field is empty", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Description": "Beskrivning", - "@Description": { - "description": "Label used for Description text field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "A description is required.": "Beskrivning är obligatorisk.", - "@A description is required.": { - "description": "Error shown when the description field is empty", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "How is this affecting you?": "Hur påverkar detta dig?", - "@How is this affecting you?": { - "description": "Label used for the dropdown to select how severe the issue is", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "send": "skicka", - "@send": { - "description": "Label used for send button when reporting a problem", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Just a casual question, comment, idea, suggestion…": "Bara en vanlig fråga, kommentar, idé, förslag ...", - "@Just a casual question, comment, idea, suggestion…": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I need some help but it's not urgent.": "Jag behöver hjälp men det är inte bråttom.", - "@I need some help but it's not urgent.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Something's broken but I can work around it to get what I need done.": "Det är något som inte fungerar men jag kan göra det jag ska ändå.", - "@Something's broken but I can work around it to get what I need done.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I can't get things done until I hear back from you.": "Jag kan inte göra något tills jag hör ifrån er.", - "@I can't get things done until I hear back from you.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "EXTREME CRITICAL EMERGENCY!!": "EXTREMT KRITISKT NÖDFALL!!", - "@EXTREME CRITICAL EMERGENCY!!": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Not Graded": "Ej bedömd", - "@Not Graded": { - "description": "Description for an assignment has not been graded.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Login flow: Normal": "Inloggningsflöde: Normal", - "@Login flow: Normal": { - "description": "Description for the normal login flow", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Login flow: Canvas": "Inloggningsflöde: Canvas", - "@Login flow: Canvas": { - "description": "Description for the Canvas login flow", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Login flow: Site Admin": "Inloggningsflöde: Webbplatsadministratör", - "@Login flow: Site Admin": { - "description": "Description for the Site Admin login flow", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Login flow: Skip mobile verify": "Inloggningsflöde: Hoppa över mobilverifiering", - "@Login flow: Skip mobile verify": { - "description": "Description for the login flow that skips domain verification for mobile", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Act As User": "Agera som användare", - "@Act As User": { - "description": "Label for the button that allows the user to act (masquerade) as another user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Stop Acting as User": "Sluta att agera som en användare", - "@Stop Acting as User": { - "description": "Label for the button that allows the user to stop acting (masquerading) as another user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "actingAsUser": "Du agerar som {userName}", - "@actingAsUser": { - "description": "Message shown while acting (masquerading) as another user", - "type": "text", - "placeholders_order": [ - "userName" - ], - "placeholders": { - "userName": {} - } - }, - "\"Act as\" is essentially logging in as this user without a password. You will be able to take any action as if you were this user, and from other users' points of views, it will be as if this user performed them. However, audit logs record that you were the one who performed the actions on behalf of this user.": "\"Att uppträda som\", loggar huvudsakligen in som den här användaren utan lösenord. Du kommer att kunna vidta åtgärder som om du var den här användaren, och från andra användares synpunkter kommer det att upplevas som om den här användaren utförde dem. I historik-loggar registreras dock att du var den som utförde åtgärderna på den här användarens vägnar.", - "@\"Act as\" is essentially logging in as this user without a password. You will be able to take any action as if you were this user, and from other users' points of views, it will be as if this user performed them. However, audit logs record that you were the one who performed the actions on behalf of this user.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Domain": "Domän", - "@Domain": { - "description": "Text field hint for domain url input", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You must enter a valid domain": "Du måste ange en giltig domän", - "@You must enter a valid domain": { - "description": "Message displayed for domain input error", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "User ID": "Användar-ID", - "@User ID": { - "description": "Text field hint for user ID input", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You must enter a user id": "Du måste ange ett giltigt användar-ID", - "@You must enter a user id": { - "description": "Message displayed for user Id input error", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error trying to act as this user. Please check the Domain and User ID and try again.": "Ett fel inträffade under Agera som den här användaren. Kontrollera domänen och användar-ID:t och försök igen.", - "@There was an error trying to act as this user. Please check the Domain and User ID and try again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "endMasqueradeMessage": "Du kommer att sluta agera som {userName} och återgå till ditt ursprungliga konto.", - "@endMasqueradeMessage": { - "description": "Confirmation message displayed when the user wants to stop acting (masquerading) as another user", - "type": "text", - "placeholders_order": [ - "userName" - ], - "placeholders": { - "userName": {} - } - }, - "endMasqueradeLogoutMessage": "Du kommer att sluta agera som {userName} och loggas ut.", - "@endMasqueradeLogoutMessage": { - "description": "Confirmation message displayed when the user wants to stop acting (masquerading) as another user and will be logged out.", - "type": "text", - "placeholders_order": [ - "userName" - ], - "placeholders": { - "userName": {} - } - }, - "How are we doing?": "Hur går det för oss?", - "@How are we doing?": { - "description": "Title for dialog asking user to rate the app out of 5 stars.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Don't show again": "Visa inte igen", - "@Don't show again": { - "description": "Button to prevent the rating dialog from showing again.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "What can we do better?": "Vad kan vi förbättra?", - "@What can we do better?": { - "description": "Hint text for providing a comment with the rating.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Send Feedback": "Skicka feedback", - "@Send Feedback": { - "description": "Button to send rating with feedback", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "ratingDialogEmailSubject": "Förslag för Android – Canvas Parent {version}", - "@ratingDialogEmailSubject": { - "description": "The subject for an email to provide feedback for CanvasParent.", - "type": "text", - "placeholders_order": [ - "version" - ], - "placeholders": { - "version": {} - } - }, - "starRating": "{position,plural, =1{{position} stjärna}other{{position} stjärnor}}", - "@starRating": { - "description": "Accessibility label for the 1 stars to 5 stars rating", - "type": "text", - "placeholders_order": [ - "position" - ], - "placeholders": { - "position": { - "example": 1 - } - } - }, - "Student Pairing": "Student-parkoppling", - "@Student Pairing": { - "description": "Title for the screen where users can pair to students using a QR code", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Open Canvas Student": "Öppna Canvas Student", - "@Open Canvas Student": { - "description": "Title for QR pairing tutorial screen instructing users to open the Canvas Student app", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You'll need to open your student's Canvas Student app to continue. Go into Main Menu > Settings > Pair with Observer and scan the QR code you see there.": "Du måste öppna din students Canvas Student-app för att fortsätta. Gå till Huvudmenyn > Inställningar > Parkoppla med observatör och skanna QR-koden du ser där.", - "@You'll need to open your student's Canvas Student app to continue. Go into Main Menu > Settings > Pair with Observer and scan the QR code you see there.": { - "description": "Message explaining how QR code pairing works", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Screenshot showing location of pairing QR code generation in the Canvas Student app": "Skärmbild som visar var QR-kodens parkopplingsgenerering görs i Canvas Student-appen", - "@Screenshot showing location of pairing QR code generation in the Canvas Student app": { - "description": "Content Description for qr pairing tutorial screenshot", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Expired QR Code": "Utgången QR-kod", - "@Expired QR Code": { - "description": "Error title shown when the users scans a QR code that has expired", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The QR code you scanned may have expired. Refresh the code on the student's device and try again.": "QR-koden du skannade kan har gått ut. Uppdatera koden på studentens enhet och försök igen.", - "@The QR code you scanned may have expired. Refresh the code on the student's device and try again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "A network error occurred when adding this student. Check your connection and try again.": "Ett nätverksfel inträffade när du lade till den här studenten. Kontrollera din anslutning och försök igen.", - "@A network error occurred when adding this student. Check your connection and try again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Invalid QR Code": "Ogiltig QR-kod", - "@Invalid QR Code": { - "description": "Error title shown when the user scans an invalid QR code", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Incorrect Domain": "Felaktig domän", - "@Incorrect Domain": { - "description": "Error title shown when the users scane a QR code for a student that belongs to a different domain", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The student you are trying to add belongs to a different school. Log in or create an account with that school to scan this code.": "Studenten du försöker lägga tillhör en annan skola. Logga in eller skapa ett konto med den skolans för att skanna den här koden.", - "@The student you are trying to add belongs to a different school. Log in or create an account with that school to scan this code.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Camera Permission": "Kamerabehörighet", - "@Camera Permission": { - "description": "Error title shown when the user wans to scan a QR code but has denied the camera permission", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "This will unpair and remove all enrollments for this student from your account.": "Detta kommer att koppla från och ta bort alla registreringar för den här studenten från ditt konto.", - "@This will unpair and remove all enrollments for this student from your account.": { - "description": "Confirmation message shown when the user tries to delete a student from their account", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was a problem removing this student from your account. Please check your connection and try again.": "Det gick inte att ta bort studenten från ditt konto. Kontrollera din anslutning och försök igen.", - "@There was a problem removing this student from your account. Please check your connection and try again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Cancel": "Avbryt", - "@Cancel": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "next": "Nästa", - "@next": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "ok": "OK", - "@ok": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Yes": "Ja", - "@Yes": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No": "Nej", - "@No": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Retry": "Försök igen", - "@Retry": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Delete": "Radera", - "@Delete": { - "description": "Label used for general delete/remove actions", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Done": "Klar", - "@Done": { - "description": "Label for general done/finished actions", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Refresh": "Uppdatera", - "@Refresh": { - "description": "Label for button to refresh data from the web", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "View Description": "Visa beskrivning", - "@View Description": { - "description": "Button to view the description for an event or assignment", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "expanded": "expanderad", - "@expanded": { - "description": "Description for the accessibility reader for list groups that are expanded", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "collapsed": "minimerad", - "@collapsed": { - "description": "Description for the accessibility reader for list groups that are expanded", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "An unexpected error occurred": "Ett oväntat fel inträffade", - "@An unexpected error occurred": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No description": "Ingen beskrivning", - "@No description": { - "description": "Message used when the assignment has no description", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Launch External Tool": "Starta externt verktyg", - "@Launch External Tool": { - "description": "Button text added to webviews to let users open external tools in their browser", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Interactions on this page are limited by your institution.": "Interaktioner på den här sidan har begränsats av ditt lärosäte.", - "@Interactions on this page are limited by your institution.": { - "description": "Message describing how the webview has limited access due to an instution setting", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "dateAtTime": "{date} kl. {time}", - "@dateAtTime": { - "description": "The string to format dates", - "type": "text", - "placeholders_order": [ - "date", - "time" - ], - "placeholders": { - "date": {}, - "time": {} - } - }, - "dueDateAtTime": "Ska lämnas in {date} klockan {time}", - "@dueDateAtTime": { - "description": "The string to format due dates", - "type": "text", - "placeholders_order": [ - "date", - "time" - ], - "placeholders": { - "date": {}, - "time": {} - } - }, - "No Due Date": "Inget inlämningsdatum", - "@No Due Date": { - "description": "Label for assignments that do not have a due date", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Filter": "Filtrera", - "@Filter": { - "description": "Label for buttons to filter what items are visible", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "unread": "olästa", - "@unread": { - "description": "Label for things that are marked as unread", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "unreadCount": "{count} olästa", - "@unreadCount": { - "description": "Formatted string for when there are a number of unread items", - "type": "text", - "placeholders_order": [ - "count" - ], - "placeholders": { - "count": {} - } - }, - "badgeNumberPlus": "{count}+", - "@badgeNumberPlus": { - "description": "Formatted string for when too many items are being notified in a badge, generally something like: 99+", - "type": "text", - "placeholders_order": [ - "count" - ], - "placeholders": { - "count": {} - } - }, - "There was an error loading this announcement": "Det gick inte att läsa in den här annonsen", - "@There was an error loading this announcement": { - "description": "Message shown when an announcement detail screen fails to load", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Network error": "Nätverksfel", - "@Network error": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Under Construction": "Under uppbyggnad", - "@Under Construction": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "We are currently building this feature for your viewing pleasure.": "Vi bygger den här funktionen för dig.", - "@We are currently building this feature for your viewing pleasure.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Request Login Help Button": "Hjälpknapp för inloggningsförfrågningar", - "@Request Login Help Button": { - "description": "Accessibility hint for button that opens help dialog for a login help request", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Request Login Help": "Begär hjälp med inloggning", - "@Request Login Help": { - "description": "Title of help dialog for a login help request", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I'm having trouble logging in": "Jag kan inte logga in", - "@I'm having trouble logging in": { - "description": "Subject of help dialog for a login help request", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "An error occurred when trying to display this link": "Ett fel uppstod när länken skulle visas", - "@An error occurred when trying to display this link": { - "description": "Error message shown when a link can't be opened", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "We are unable to display this link, it may belong to an institution you currently aren't logged in to.": "Det går inte att visa den här länken. Den kan tillhöra ett lärosäte du för närvarande inte är inloggad på.", - "@We are unable to display this link, it may belong to an institution you currently aren't logged in to.": { - "description": "Description for error page shown when clicking a link", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Link Error": "Länkfel", - "@Link Error": { - "description": "Title for error page shown when clicking a link", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Open In Browser": "Öppna i webbläsare", - "@Open In Browser": { - "description": "Text for button to open a link in the browswer", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You'll find the QR code on the web in your account profile. Click 'QR for Mobile Login' in the list.": "Du hittar QR-koden på webben i din kontoprofil. Klicka på \"QR för mobil inloggning\" i listan.", - "@You'll find the QR code on the web in your account profile. Click 'QR for Mobile Login' in the list.": { - "description": "Text for qr login tutorial screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Locate QR Code": "Lokalisera QR-kod", - "@Locate QR Code": { - "description": "Text for qr login button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Please scan a QR code generated by Canvas": "Skanna en QR-kod som genererats i Canvas.", - "@Please scan a QR code generated by Canvas": { - "description": "Text for qr login error with incorrect qr code", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error logging in. Please generate another QR Code and try again.": "Det gick inte att logga in. Generera en annan QR-kod och försök igen.", - "@There was an error logging in. Please generate another QR Code and try again.": { - "description": "Text for qr login error", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Screenshot showing location of QR code generation in browser": "Skärmdumpen visar platsen för QR-kodgenerering i webbläsaren", - "@Screenshot showing location of QR code generation in browser": { - "description": "Content Description for qr login tutorial screenshot", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "QR scanning requires camera access": "QR-skanning kräver kameraåtkomst", - "@QR scanning requires camera access": { - "description": "placeholder for camera error for QR code scan", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The linked item is no longer available": "Det länkade objektet är inte längre tillgängligt", - "@The linked item is no longer available": { - "description": "error message when the alert could no be opened", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Message sent": "Meddelandet har skickats", - "@Message sent": { - "description": "confirmation message on the screen when the user succesfully sends a message", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Acceptable Use Policy": "Policy för godkänd användning", - "@Acceptable Use Policy": { - "description": "title for the acceptable use policy screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Submit": "Lämna in", - "@Submit": { - "description": "submit button title for acceptable use policy screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Either you're a new user or the Acceptable Use Policy has changed since you last agreed to it. Please agree to the Acceptable Use Policy before you continue.": "Antingen är du en ny användare eller så har policyn för godkänd användning ändrats sedan du senast godkände den. Godkänn policyn för godkänd användning innan du fortsätter.", - "@Either you're a new user or the Acceptable Use Policy has changed since you last agreed to it. Please agree to the Acceptable Use Policy before you continue.": { - "description": "acceptable use policy screen description", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I agree to the Acceptable Use Policy.": "Jag godkänner policyn för godkänd användning.", - "@I agree to the Acceptable Use Policy.": { - "description": "acceptable use policy switch title", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "About": "Om", - "@About": { - "description": "Title for about menu item in settings", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "App": "App", - "@App": { - "description": "Title for App field on about page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Login ID": "Inloggnings-ID", - "@Login ID": { - "description": "Title for Login ID field on about page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Email": "E-post", - "@Email": { - "description": "Title for Email field on about page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Version": "Version", - "@Version": { - "description": "Title for Version field on about page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Instructure logo": "Instructure-logotyp", - "@Instructure logo": { - "description": "Semantics label for the Instructure logo on the about page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - } -} \ No newline at end of file diff --git a/apps/flutter_parent/lib/l10n/res/intl_sv_instk12.arb b/apps/flutter_parent/lib/l10n/res/intl_sv_instk12.arb deleted file mode 100644 index 33bd40ccb6..0000000000 --- a/apps/flutter_parent/lib/l10n/res/intl_sv_instk12.arb +++ /dev/null @@ -1,2753 +0,0 @@ -{ - "@@last_modified": "2023-08-25T11:04:20.901151", - "alertsLabel": "Notiser", - "@alertsLabel": { - "description": "The label for the Alerts tab", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "calendarLabel": "Kalender", - "@calendarLabel": { - "description": "The label for the Calendar tab", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "coursesLabel": "Kurser", - "@coursesLabel": { - "description": "The label for the Courses tab", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Students": "Inga elever", - "@No Students": { - "description": "Text for when an observer has no students they are observing", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Tap to show student selector": "Tryck för att visa elevväljare", - "@Tap to show student selector": { - "description": "Semantics label for the area that will show the student selector when tapped", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Tap to pair with a new student": "Tryck för att koppla samman med en ny elev", - "@Tap to pair with a new student": { - "description": "Semantics label for the add student button in the student selector", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Tap to select this student": "Tryck för att välja den här eleven", - "@Tap to select this student": { - "description": "Semantics label on individual students in the student switcher", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Manage Students": "Hantera elever", - "@Manage Students": { - "description": "Label text for the Manage Students nav drawer button as well as the title for the Manage Students screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Help": "Hjälp", - "@Help": { - "description": "Label text for the help nav drawer button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Log Out": "Logga ut", - "@Log Out": { - "description": "Label text for the Log Out nav drawer button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Switch Users": "Växla användare", - "@Switch Users": { - "description": "Label text for the Switch Users nav drawer button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "appVersion": "v. {version}", - "@appVersion": { - "description": "App version shown in the navigation drawer", - "type": "text", - "placeholders_order": [ - "version" - ], - "placeholders": { - "version": {} - } - }, - "Are you sure you want to log out?": "Vill du logga ut?", - "@Are you sure you want to log out?": { - "description": "Confirmation message displayed when the user tries to log out", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Calendars": "Kalendrar", - "@Calendars": { - "description": "Label for button that lets users select which calendars to display", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "nextMonth": "Nästa månad: {month}", - "@nextMonth": { - "description": "Label for the button that switches the calendar to the next month", - "type": "text", - "placeholders_order": [ - "month" - ], - "placeholders": { - "month": {} - } - }, - "previousMonth": "Föregående månad: {month}", - "@previousMonth": { - "description": "Label for the button that switches the calendar to the previous month", - "type": "text", - "placeholders_order": [ - "month" - ], - "placeholders": { - "month": {} - } - }, - "nextWeek": "Nästa vecka börjar {date}", - "@nextWeek": { - "description": "Label for the button that switches the calendar to the next week", - "type": "text", - "placeholders_order": [ - "date" - ], - "placeholders": { - "date": {} - } - }, - "previousWeek": "Föregående vecka startade {date}", - "@previousWeek": { - "description": "Label for the button that switches the calendar to the previous week", - "type": "text", - "placeholders_order": [ - "date" - ], - "placeholders": { - "date": {} - } - }, - "selectedMonthLabel": "Månaden {month}", - "@selectedMonthLabel": { - "description": "Accessibility label for the button that expands/collapses the month view", - "type": "text", - "placeholders_order": [ - "month" - ], - "placeholders": { - "month": {} - } - }, - "expand": "visa", - "@expand": { - "description": "Accessibility label for the on-tap hint for the button that expands/collapses the month view", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "collapse": "dölj", - "@collapse": { - "description": "Accessibility label for the on-tap hint for the button that expands/collapses the month view", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "pointsPossible": "{points} möjliga poäng", - "@pointsPossible": { - "description": "Screen reader label used for the points possible for an assignment, quiz, etc.", - "type": "text", - "placeholders_order": [ - "points" - ], - "placeholders": { - "points": {} - } - }, - "calendarDaySemanticsLabel": "{eventCount,plural, =1{{date}, {eventCount} händelse}other{{date}, {eventCount} händelser}}", - "@calendarDaySemanticsLabel": { - "description": "Screen reader label used for calendar day, reads the date and count of events", - "type": "text", - "placeholders_order": [ - "date", - "eventCount" - ], - "placeholders": { - "date": {}, - "eventCount": {} - } - }, - "No Events Today!": "Inga händelser idag!", - "@No Events Today!": { - "description": "Title displayed when there are no calendar events for the current day", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "It looks like a great day to rest, relax, and recharge.": "Det verkar vara en bra dag för vila, avslappning och omladdning.", - "@It looks like a great day to rest, relax, and recharge.": { - "description": "Message displayed when there are no calendar events for the current day", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading your student's calendar": "Det gick inte att läsa in din elevkalender.", - "@There was an error loading your student's calendar": { - "description": "Message displayed when calendar events could not be loaded for the current student", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Tap to favorite the courses you want to see on the Calendar. Select up to 10.": "Tryck för att favoritmarkera de kurser du vill se i kalendern. Välj upp till 10.", - "@Tap to favorite the courses you want to see on the Calendar. Select up to 10.": { - "description": "Description text on calendar filter screen.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You may only choose 10 calendars to display": "Du kan endast välja 10 kalendrar att visa", - "@You may only choose 10 calendars to display": { - "description": "Error text when trying to select more than 10 calendars", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You must select at least one calendar to display": "Du måste välja minst en kalender att visa", - "@You must select at least one calendar to display": { - "description": "Error text when trying to de-select all calendars", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Planner Note": "Planner-anteckning", - "@Planner Note": { - "description": "Label used for notes in the planner", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Go to today": "Gå till i dag", - "@Go to today": { - "description": "Accessibility label used for the today button in the planner", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Previous Logins": "Tidigare inloggningar", - "@Previous Logins": { - "description": "Label for the list of previous user logins", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "canvasLogoLabel": "Canvas-logotyp", - "@canvasLogoLabel": { - "description": "The semantics label for the Canvas logo", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "findSchool": "Sök skola", - "@findSchool": { - "description": "Text for the find-my-school button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "findAnotherSchool": "Hitta en annan skola", - "@findAnotherSchool": { - "description": "Text for the find-another-school button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "domainSearchInputHint": "Ange skolans namn eller distrikt...", - "@domainSearchInputHint": { - "description": "Input hint for the text box on the domain search screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "noDomainResults": "Det gick inte att hitta skolar som matchar \"{query}\"", - "@noDomainResults": { - "description": "Message shown to users when the domain search query did not return any results", - "type": "text", - "placeholders_order": [ - "query" - ], - "placeholders": { - "query": {} - } - }, - "domainSearchHelpLabel": "Hur hittar jag min skola eller distrikt?", - "@domainSearchHelpLabel": { - "description": "Label for the help button on the domain search screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "canvasGuides": "Canvas-guider", - "@canvasGuides": { - "description": "Proper name for the Canvas Guides. This will be used in the domainSearchHelpBody text and will be highlighted and clickable", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "canvasSupport": "Canvas Support", - "@canvasSupport": { - "description": "Proper name for Canvas Support. This will be used in the domainSearchHelpBody text and will be highlighted and clickable", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "domainSearchHelpBody": "Försök med att söka efter namnet på skolan eller distrikten du vill ansluta till, t.ex. “Allmänna skolan” eller “Skolor i Skåne”. Du kan även ange en Canvas-domän direkt, t.ex. “smith.instructure.com.”\n\nMer information om hur du kan hitta din institutions Canvas-konto finns på {canvasGuides} eller kontakta {canvasSupport} eller din skola för att få hjälp.", - "@domainSearchHelpBody": { - "description": "The body text shown in the help dialog on the domain search screen", - "type": "text", - "placeholders_order": [ - "canvasGuides", - "canvasSupport" - ], - "placeholders": { - "canvasGuides": {}, - "canvasSupport": {} - } - }, - "Uh oh!": "Oj då!", - "@Uh oh!": { - "description": "Title of the screen that shows when a crash has occurred", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "We’re not sure what happened, but it wasn’t good. Contact us if this keeps happening.": "Vi vet inte vad som hände, men det fungerar inte. Kontakta oss om detta fortsätter att inträffa.", - "@We’re not sure what happened, but it wasn’t good. Contact us if this keeps happening.": { - "description": "Message shown when a crash has occurred", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Contact Support": "Kontakta support", - "@Contact Support": { - "description": "Label for the button that allows users to contact support after a crash has occurred", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "View error details": "Visa felinformation", - "@View error details": { - "description": "Label for the button that allowed users to view crash details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Restart app": "Starta om appen", - "@Restart app": { - "description": "Label for the button that will restart the entire application", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Application version": "Programversion", - "@Application version": { - "description": "Label for the application version displayed in the crash details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Device model": "Enhetsmodell", - "@Device model": { - "description": "Label for the device model displayed in the crash details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Android OS version": "Android AS-version", - "@Android OS version": { - "description": "Label for the Android operating system version displayed in the crash details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Full error message": "Fullständigt felmeddelande", - "@Full error message": { - "description": "Label for the full error message displayed in the crash details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Inbox": "Inkorg", - "@Inbox": { - "description": "Title for the Inbox screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading your inbox messages.": "Det gick inte att läsa in dina meddelanden i inkorgen.", - "@There was an error loading your inbox messages.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Subject": "Inget ämne", - "@No Subject": { - "description": "Title used for inbox messages that have no subject", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unable to fetch courses. Please check your connection and try again.": "Det gick inte att hämta kurser. Kontrollera din anslutning och försök igen.", - "@Unable to fetch courses. Please check your connection and try again.": { - "description": "Message shown when an error occured while loading courses", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Choose a course to message": "Välj en kurs att skicka meddelande till", - "@Choose a course to message": { - "description": "Header in the course list shown when the user is choosing which course to associate with a new message", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Inbox Zero": "Inkorg noll", - "@Inbox Zero": { - "description": "Title of the message shown when there are no inbox messages", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You’re all caught up!": "Du är helt i kapp!", - "@You’re all caught up!": { - "description": "Subtitle of the message shown when there are no inbox messages", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading recipients for this course": "Det gick inte att läsa in mottagare för den här kursen", - "@There was an error loading recipients for this course": { - "description": "Message shown when attempting to create a new message but the recipients list failed to load", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unable to send message. Check your connection and try again.": "Det gick inte att skicka meddelandet. Kontrollera din anslutning och försök igen.", - "@Unable to send message. Check your connection and try again.": { - "description": "Message show when there was an error creating or sending a new message", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unsaved changes": "Osparade ändringar", - "@Unsaved changes": { - "description": "Title of the dialog shown when the user tries to leave with unsaved changes", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Are you sure you wish to close this page? Your unsent message will be lost.": "Är du säker på att du vill stänga den här sidan? Ditt meddelande du ännu inte skickat kommer att tas bort.", - "@Are you sure you wish to close this page? Your unsent message will be lost.": { - "description": "Body text of the dialog shown when the user tries leave with unsaved changes", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "New message": "Nytt meddelande", - "@New message": { - "description": "Title of the new-message screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Add attachment": "Lägg till bilaga", - "@Add attachment": { - "description": "Tooltip for the add-attachment button in the new-message screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Send message": "Skicka meddelandet", - "@Send message": { - "description": "Tooltip for the send-message button in the new-message screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Select recipients": "Välj mottagare", - "@Select recipients": { - "description": "Tooltip for the button that allows users to select message recipients", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No recipients selected": "Inga mottagare har valts", - "@No recipients selected": { - "description": "Hint displayed when the user has not selected any message recipients", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Message subject": "Meddelandeämne", - "@Message subject": { - "description": "Hint text displayed in the input field for the message subject", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Message": "Meddelande", - "@Message": { - "description": "Hint text displayed in the input field for the message body", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Recipients": "Mottagare", - "@Recipients": { - "description": "Label for message recipients", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "plusRecipientCount": "+{count}", - "@plusRecipientCount": { - "description": "Shows the number of recipients that are selected but not displayed on screen.", - "type": "text", - "placeholders_order": [ - "count" - ], - "placeholders": { - "count": { - "example": 5 - } - } - }, - "Failed. Tap for options.": "Misslyckades. Tryck för alternativ.", - "@Failed. Tap for options.": { - "description": "Short message shown on a message attachment when uploading has failed", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "courseForWhom": "för {studentShortName}", - "@courseForWhom": { - "description": "Describes for whom a course is for (i.e. for Bill)", - "type": "text", - "placeholders_order": [ - "studentShortName" - ], - "placeholders": { - "studentShortName": {} - } - }, - "messageLinkPostscript": "Angående : {studentName}, {linkUrl}", - "@messageLinkPostscript": { - "description": "A postscript appended to new messages that clarifies which student is the subject of the message and also includes a URL for the related Canvas component (course, assignment, event, etc).", - "type": "text", - "placeholders_order": [ - "studentName", - "linkUrl" - ], - "placeholders": { - "studentName": {}, - "linkUrl": {} - } - }, - "There was an error loading this conversation": "Det gick inte att läsa in den här konversationen", - "@There was an error loading this conversation": { - "description": "Message shown when a conversation fails to load", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Reply": "Svara", - "@Reply": { - "description": "Button label for replying to a conversation", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Reply All": "Svara alla", - "@Reply All": { - "description": "Button label for replying to all conversation participants", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unknown User": "Okänd användare", - "@Unknown User": { - "description": "Label used where the user name is not known", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "me": "jag", - "@me": { - "description": "First-person pronoun (i.e. 'me') that will be used in message author info, e.g. 'Me to 4 others' or 'Jon Snow to me'", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "authorToRecipient": "{authorName} till {recipientName}", - "@authorToRecipient": { - "description": "Author info for a single-recipient message; includes both the author name and the recipient name.", - "type": "text", - "placeholders_order": [ - "authorName", - "recipientName" - ], - "placeholders": { - "authorName": {}, - "recipientName": {} - } - }, - "authorToNOthers": "{howMany,plural, =1{{authorName} till 1 annan}other{{authorName} till {howMany} andra}}", - "@authorToNOthers": { - "description": "Author info for a mutli-recipient message; includes the author name and the number of recipients", - "type": "text", - "placeholders_order": [ - "authorName", - "howMany" - ], - "placeholders": { - "authorName": {}, - "howMany": {} - } - }, - "authorToRecipientAndNOthers": "{howMany,plural, =1{{authorName} till {recipientName} och 1 annan}other{{authorName} till {recipientName} och {howMany} andra}}", - "@authorToRecipientAndNOthers": { - "description": "Author info for a multi-recipient message; includes the author name, one recipient name, and the number of other recipients", - "type": "text", - "placeholders_order": [ - "authorName", - "recipientName", - "howMany" - ], - "placeholders": { - "authorName": {}, - "recipientName": {}, - "howMany": {} - } - }, - "Download": "Ladda ner", - "@Download": { - "description": "Label for the button that will begin downloading a file", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Open with another app": "Öppna med en annan app", - "@Open with another app": { - "description": "Label for the button that will allow users to open a file with another app", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There are no installed applications that can open this file": "Det finns inga installerade program som kan öppna den här filen", - "@There are no installed applications that can open this file": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unsupported File": "Filtyp som inte stöds", - "@Unsupported File": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "This file is unsupported and can’t be viewed through the app": "Den här filen stöds inte och kan inte visas i appen", - "@This file is unsupported and can’t be viewed through the app": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unable to play this media file": "Det går inte att spela upp den här mediefilen", - "@Unable to play this media file": { - "description": "Message shown when audio or video media could not be played", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unable to load this image": "Det går inte att läsa in den här bilden", - "@Unable to load this image": { - "description": "Message shown when an image file could not be loaded or displayed", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading this file": "Det gick inte att läsa in den här filen", - "@There was an error loading this file": { - "description": "Message shown when a file could not be loaded or displayed", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Courses": "Inga kurser", - "@No Courses": { - "description": "Title for having no courses", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Your student’s courses might not be published yet.": "Dina elevkurser kanske inte publicerats än.", - "@Your student’s courses might not be published yet.": { - "description": "Message for having no courses", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading your student’s courses.": "Det gick inte att läsa in din elevs kurser.", - "@There was an error loading your student’s courses.": { - "description": "Message displayed when the list of student courses could not be loaded", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Grade": "Ingen bedömning", - "@No Grade": { - "description": "Message shown when there is currently no grade available for a course", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Filter by": "Filtrera efter", - "@Filter by": { - "description": "Title for list of terms to filter grades by", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Grades": "Bedömningar", - "@Grades": { - "description": "Label for the \"Grades\" tab in course details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Syllabus": "Kursöversikt", - "@Syllabus": { - "description": "Label for the \"Syllabus\" tab in course details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Front Page": "Framsida", - "@Front Page": { - "description": "Label for the \"Front Page\" tab in course details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Summary": "Sammanfattning", - "@Summary": { - "description": "Label for the \"Summary\" tab in course details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Send a message about this course": "Skicka ett meddelande om den här kursen", - "@Send a message about this course": { - "description": "Accessibility hint for the course messaage floating action button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Total Grade": "Totalt bedömning", - "@Total Grade": { - "description": "Label for the total grade in the course", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Graded": "Har bedömts", - "@Graded": { - "description": "Label for assignments that have been graded", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Submitted": "Inskickad", - "@Submitted": { - "description": "Label for assignments that have been submitted", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Not Submitted": "Inte inlämnad", - "@Not Submitted": { - "description": "Label for assignments that have not been submitted", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Late": "Sen", - "@Late": { - "description": "Label for assignments that have been marked late or submitted late", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Missing": "Saknad", - "@Missing": { - "description": "Label for assignments that have been marked missing or are not submitted and past the due date", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "-": "-", - "@-": { - "description": "Value representing no score for student submission", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "All Grading Periods": "Alla bedömningsperioder", - "@All Grading Periods": { - "description": "Label for selecting all grading periods", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Assignments": "Inga uppgifter", - "@No Assignments": { - "description": "Title for the no assignments message", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "It looks like assignments haven't been created in this space yet.": "Det verkar som om inga uppgifter har skapats för den här platsen än.", - "@It looks like assignments haven't been created in this space yet.": { - "description": "Message for no assignments", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading the summary details for this course.": "Det gick inte att läsa in sammanfattningsinformationen för den här kursen.", - "@There was an error loading the summary details for this course.": { - "description": "Message shown when the course summary could not be loaded", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Summary": "Ingen sammanfattning", - "@No Summary": { - "description": "Title displayed when there are no items in the course summary", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "This course does not have any assignments or calendar events yet.": "Den här kursen har inga uppgifter eller kalenderhändelser än.", - "@This course does not have any assignments or calendar events yet.": { - "description": "Message displayed when there are no items in the course summary", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "gradeFormatScoreOutOfPointsPossible": "{score} / {pointsPossible}", - "@gradeFormatScoreOutOfPointsPossible": { - "description": "Formatted string for a student score out of the points possible", - "type": "text", - "placeholders_order": [ - "score", - "pointsPossible" - ], - "placeholders": { - "score": {}, - "pointsPossible": {} - } - }, - "contentDescriptionScoreOutOfPointsPossible": "{score} av {pointsPossible} poäng", - "@contentDescriptionScoreOutOfPointsPossible": { - "description": "Formatted string for a student score out of the points possible", - "type": "text", - "placeholders_order": [ - "score", - "pointsPossible" - ], - "placeholders": { - "score": {}, - "pointsPossible": {} - } - }, - "gradesSubjectMessage": "Angående : {studentName}, bedömningar", - "@gradesSubjectMessage": { - "description": "The subject line for a message to a teacher regarding a student's grades", - "type": "text", - "placeholders_order": [ - "studentName" - ], - "placeholders": { - "studentName": {} - } - }, - "syllabusSubjectMessage": "Angående : {studentName}, kursöversikt", - "@syllabusSubjectMessage": { - "description": "The subject line for a message to a teacher regarding a course syllabus", - "type": "text", - "placeholders_order": [ - "studentName" - ], - "placeholders": { - "studentName": {} - } - }, - "frontPageSubjectMessage": "Angående : {studentName}, framsida", - "@frontPageSubjectMessage": { - "description": "The subject line for a message to a teacher regarding a course front page", - "type": "text", - "placeholders_order": [ - "studentName" - ], - "placeholders": { - "studentName": {} - } - }, - "assignmentSubjectMessage": "Angående : {studentName}, uppgift – {assignmentName}", - "@assignmentSubjectMessage": { - "description": "The subject line for a message to a teacher regarding a student's assignment", - "type": "text", - "placeholders_order": [ - "studentName", - "assignmentName" - ], - "placeholders": { - "studentName": {}, - "assignmentName": {} - } - }, - "eventSubjectMessage": "Angående : {studentName}, händelse – {eventTitle}", - "@eventSubjectMessage": { - "description": "The subject line for a message to a teacher regarding a calendar event", - "type": "text", - "placeholders_order": [ - "studentName", - "eventTitle" - ], - "placeholders": { - "studentName": {}, - "eventTitle": {} - } - }, - "There is no page information available.": "Det finns ingen sidinformation tillgänglig.", - "@There is no page information available.": { - "description": "Description for when no page information is available", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Assignment Details": "Uppgiftens detaljer", - "@Assignment Details": { - "description": "Title for the page that shows details for an assignment", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "assignmentTotalPoints": "{points} poäng", - "@assignmentTotalPoints": { - "description": "Label used for the total points the assignment is worth", - "type": "text", - "placeholders_order": [ - "points" - ], - "placeholders": { - "points": {} - } - }, - "assignmentTotalPointsAccessible": "{points} poäng", - "@assignmentTotalPointsAccessible": { - "description": "Screen reader label used for the total points the assignment is worth", - "type": "text", - "placeholders_order": [ - "points" - ], - "placeholders": { - "points": {} - } - }, - "Due": "Inlämningsdatum", - "@Due": { - "description": "Label for an assignment due date", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Grade": "Bedömning", - "@Grade": { - "description": "Label for the section that displays an assignment's grade", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Locked": "Låst", - "@Locked": { - "description": "Label for when an assignment is locked", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "assignmentLockedModule": "Den här uppgiften har låsts av modulen \"{moduleName}\".", - "@assignmentLockedModule": { - "description": "The locked description when an assignment is locked by a module", - "type": "text", - "placeholders_order": [ - "moduleName" - ], - "placeholders": { - "moduleName": {} - } - }, - "Remind Me": "Påminn mig", - "@Remind Me": { - "description": "Label for the row to set reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Set a date and time to be notified of this specific assignment.": "Ange ett datum och tid för att få en notis för den här specifika uppgiften.", - "@Set a date and time to be notified of this specific assignment.": { - "description": "Description for row to set reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You will be notified about this assignment on…": "Du kommer att få en notis om den här uppgiften på...", - "@You will be notified about this assignment on…": { - "description": "Description for when a reminder is set", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Instructions": "Instruktioner", - "@Instructions": { - "description": "Label for the description of the assignment when it has quiz instructions", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Send a message about this assignment": "Skicka ett meddelande om den här kursen", - "@Send a message about this assignment": { - "description": "Accessibility hint for the assignment messaage floating action button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "This app is not authorized for use.": "Den här appen har inte auktoriserats för användning.", - "@This app is not authorized for use.": { - "description": "The error shown when the app being used is not verified by Canvas", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The server you entered is not authorized for this app.": "Den server du har angett har inte auktoriserats för den här appen.", - "@The server you entered is not authorized for this app.": { - "description": "The error shown when the desired login domain is not verified by Canvas", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The user agent for this app is not authorized.": "Användaragenten för den här appen är inte auktoriserad.", - "@The user agent for this app is not authorized.": { - "description": "The error shown when the user agent during verification is not verified by Canvas", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "We were unable to verify the server for use with this app.": "Vi kunde inte verifiera servern för användning med den här appen.", - "@We were unable to verify the server for use with this app.": { - "description": "The generic error shown when we are unable to verify with Canvas", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Reminders": "Påminnelser", - "@Reminders": { - "description": "Name of the system notification channel for assignment and event reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Notifications for reminders about assignments and calendar events": "Påminnelsenotiser om uppgifter och kalenderhändelser", - "@Notifications for reminders about assignments and calendar events": { - "description": "Description of the system notification channel for assignment and event reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Reminders have changed!": "Påminnelser har ändrats!", - "@Reminders have changed!": { - "description": "Title of the dialog shown when the user needs to update their reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "In order to provide you with a better experience, we have updated how reminders work. You can add new reminders by viewing an assignment or calendar event and tapping the switch under the \"Remind Me\" section.\n\nBe aware that any reminders created with older versions of this app will not be compatible with the new changes and you will need to create them again.": "För att tillhandahålla dig en förbättrad upplevelse har vi uppdaterat påminnelsefunktionen. Du kan lägga till nya påminnelser genom att visa en uppgift eller en kalenderhändelse och trycka på reglaget under avsnittet \"Påminn mig\".\n\nTänk på att påminnelser som skapats i äldre versionen av den här appen inte är kompatibla med de nya ändringarna och måste därför skapas om igen.", - "@In order to provide you with a better experience, we have updated how reminders work. You can add new reminders by viewing an assignment or calendar event and tapping the switch under the \"Remind Me\" section.\n\nBe aware that any reminders created with older versions of this app will not be compatible with the new changes and you will need to create them again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Not a parent?": "Är du inte vårdnadshavare?", - "@Not a parent?": { - "description": "Title for the screen that shows when the user is not observing any students", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "We couldn't find any students associated with this account": "Det gick inte att hitta elever kopplade till det här kontot", - "@We couldn't find any students associated with this account": { - "description": "Subtitle for the screen that shows when the user is not observing any students", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Are you a student or teacher?": "Är du elev eller lärare?", - "@Are you a student or teacher?": { - "description": "Label for button that will show users the option to view other Canvas apps in the Play Store", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "One of our other apps might be a better fit. Tap one to visit the Play Store.": "Någon av våra andra appar kan vara bättre lämpade. Tryck på en för att besöka Play Store.", - "@One of our other apps might be a better fit. Tap one to visit the Play Store.": { - "description": "Description of options to view other Canvas apps in the Play Store", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Return to Login": "Gå tillbaka till inloggning", - "@Return to Login": { - "description": "Label for the button that returns the user to the login screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "STUDENT": "ELEV", - "@STUDENT": { - "description": "The \"student\" portion of the \"Canvas Student\" app name, in all caps. \"Canvas\" is excluded in this context as it will be displayed to the user as a wordmark image", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "TEACHER": "LÄRARE", - "@TEACHER": { - "description": "The \"teacher\" portion of the \"Canvas Teacher\" app name, in all caps. \"Canvas\" is excluded in this context as it will be displayed to the user as a wordmark image", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Canvas Student": "Canvas-elev", - "@Canvas Student": { - "description": "The name of the Canvas Student app. Only \"Student\" should be translated as \"Canvas\" is a brand name in this context and should not be translated.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Canvas Teacher": "Canvas-lärare", - "@Canvas Teacher": { - "description": "The name of the Canvas Teacher app. Only \"Teacher\" should be translated as \"Canvas\" is a brand name in this context and should not be translated.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Alerts": "Inga notiser", - "@No Alerts": { - "description": "The title for the empty message to show to users when there are no alerts for the student.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There’s nothing to be notified of yet.": "Det finns inget att avisera om än.", - "@There’s nothing to be notified of yet.": { - "description": "The empty message to show to users when there are no alerts for the student.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "dismissAlertLabel": "Avvisa {alertTitle}", - "@dismissAlertLabel": { - "description": "Accessibility label to dismiss an alert", - "type": "text", - "placeholders_order": [ - "alertTitle" - ], - "placeholders": { - "alertTitle": {} - } - }, - "Course Announcement": "Kursmeddelande", - "@Course Announcement": { - "description": "Title for alerts when there is a course announcement", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Institution Announcement": "Institutionsmeddelande", - "@Institution Announcement": { - "description": "Title for alerts when there is an institution announcement", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "assignmentGradeAboveThreshold": "Uppgiftsbedömning över {threshold}", - "@assignmentGradeAboveThreshold": { - "description": "Title for alerts when an assignment grade is above the threshold value", - "type": "text", - "placeholders_order": [ - "threshold" - ], - "placeholders": { - "threshold": {} - } - }, - "assignmentGradeBelowThreshold": "Uppgiftsbedömning under {threshold}", - "@assignmentGradeBelowThreshold": { - "description": "Title for alerts when an assignment grade is below the threshold value", - "type": "text", - "placeholders_order": [ - "threshold" - ], - "placeholders": { - "threshold": {} - } - }, - "courseGradeAboveThreshold": "Kursbedömning över {threshold}", - "@courseGradeAboveThreshold": { - "description": "Title for alerts when a course grade is above the threshold value", - "type": "text", - "placeholders_order": [ - "threshold" - ], - "placeholders": { - "threshold": {} - } - }, - "courseGradeBelowThreshold": "Kursbedömning under {threshold}", - "@courseGradeBelowThreshold": { - "description": "Title for alerts when a course grade is below the threshold value", - "type": "text", - "placeholders_order": [ - "threshold" - ], - "placeholders": { - "threshold": {} - } - }, - "Settings": "Inställningar", - "@Settings": { - "description": "Title for the settings screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Theme": "Tema", - "@Theme": { - "description": "Label for the light/dark theme section in the settings page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Dark Mode": "Mörkt läge", - "@Dark Mode": { - "description": "Label for the button that enables dark mode", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Light Mode": "Ljust läge", - "@Light Mode": { - "description": "Label for the button that enables light mode", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "High Contrast Mode": "Högt kontrastläge", - "@High Contrast Mode": { - "description": "Label for the switch that toggles high contrast mode", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Use Dark Theme in Web Content": "Använd mörkt tema i webbinnehållet", - "@Use Dark Theme in Web Content": { - "description": "Label for the switch that toggles dark mode for webviews", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Appearance": "Utseende", - "@Appearance": { - "description": "Label for the appearance section in the settings page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Successfully submitted!": "Uppgiften har skickats in!", - "@Successfully submitted!": { - "description": "Title displayed in the grade cell for an assignment that has been submitted", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "submissionStatusSuccessSubtitle": "Uppgiften lämnades in {date} kl. {time} och väntar på bedömning", - "@submissionStatusSuccessSubtitle": { - "description": "Subtitle displayed in the grade cell for an assignment that has been submitted and is awaiting a grade", - "type": "text", - "placeholders_order": [ - "date", - "time" - ], - "placeholders": { - "date": {}, - "time": {} - } - }, - "outOfPoints": "{howMany,plural, =1{En av 1 poäng}other{En av {points} poäng}}", - "@outOfPoints": { - "description": "Description for an assignment grade that has points without a current scoroe", - "type": "text", - "placeholders_order": [ - "points", - "howMany" - ], - "placeholders": { - "points": {}, - "howMany": {} - } - }, - "Excused": "Ursäktad", - "@Excused": { - "description": "Grading status for an assignment marked as excused", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Complete": "Fullgjord", - "@Complete": { - "description": "Grading status for an assignment marked as complete", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Incomplete": "Ej fullständig", - "@Incomplete": { - "description": "Grading status for an assignment marked as incomplete", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "minus": "minus", - "@minus": { - "description": "Screen reader-friendly replacement for the \"-\" character in letter grades like \"A-\"", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "latePenalty": "Förseningsbestraffning (-{pointsLost})", - "@latePenalty": { - "description": "Text displayed when a late penalty has been applied to the assignment", - "type": "text", - "placeholders_order": [ - "pointsLost" - ], - "placeholders": { - "pointsLost": {} - } - }, - "finalGrade": "Slutbedömning: {grade}", - "@finalGrade": { - "description": "Text that displays the final grade of an assignment", - "type": "text", - "placeholders_order": [ - "grade" - ], - "placeholders": { - "grade": {} - } - }, - "Alert Settings": "Notisinställningar", - "@Alert Settings": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Alert me when…": "Notifiera mig om...", - "@Alert me when…": { - "description": "Header for the screen where the observer chooses the thresholds that will determine when they receive alerts (e.g. when an assignment is graded below 70%)", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Course grade below": "Kursbedömning under", - "@Course grade below": { - "description": "Label describing the threshold for when the course grade is below a certain percentage", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Course grade above": "Kursbedömning över", - "@Course grade above": { - "description": "Label describing the threshold for when the course grade is above a certain percentage", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Assignment missing": "Uppgift saknas", - "@Assignment missing": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Assignment grade below": "Uppgiftsbedömning under", - "@Assignment grade below": { - "description": "Label describing the threshold for when an assignment is graded below a certain percentage", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Assignment grade above": "Uppgiftsbedömning över", - "@Assignment grade above": { - "description": "Label describing the threshold for when an assignment is graded above a certain percentage", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Course Announcements": "Kursmeddelande", - "@Course Announcements": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Institution Announcements": "Institutionsmeddelande", - "@Institution Announcements": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Never": "Aldrig", - "@Never": { - "description": "Indication that tells the user they will not receive alert notifications of a specific kind", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Grade percentage": "Bedömningsprocent", - "@Grade percentage": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading your student's alerts.": "Det gick inte att läsa in din elevs notiser.", - "@There was an error loading your student's alerts.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Must be below 100": "Måste vara under 100", - "@Must be below 100": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "mustBeBelowN": "Måste vara under {percentage}", - "@mustBeBelowN": { - "description": "Validation error to the user that they must choose a percentage below 'n'", - "type": "text", - "placeholders_order": [ - "percentage" - ], - "placeholders": { - "percentage": { - "example": 5 - } - } - }, - "mustBeAboveN": "Måste vara över {percentage}", - "@mustBeAboveN": { - "description": "Validation error to the user that they must choose a percentage above 'n'", - "type": "text", - "placeholders_order": [ - "percentage" - ], - "placeholders": { - "percentage": { - "example": 5 - } - } - }, - "Select Student Color": "Välj elevfärg", - "@Select Student Color": { - "description": "Title for screen that allows users to assign a color to a specific student", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Electric, blue": "Elektrisk, blå", - "@Electric, blue": { - "description": "Name of the Electric (blue) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Plum, Purple": "Plommon, lila", - "@Plum, Purple": { - "description": "Name of the Plum (purple) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Barney, Fuschia": "Barney, Fuschia", - "@Barney, Fuschia": { - "description": "Name of the Barney (fuschia) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Raspberry, Red": "Hallon, röd", - "@Raspberry, Red": { - "description": "Name of the Raspberry (red) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Fire, Orange": "Eld, orange", - "@Fire, Orange": { - "description": "Name of the Fire (orange) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Shamrock, Green": "Klöver, grön", - "@Shamrock, Green": { - "description": "Name of the Shamrock (green) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "An error occurred while saving your selection. Please try again.": "Ett fel inträffade när ditt val sparades. Försök igen.", - "@An error occurred while saving your selection. Please try again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "changeStudentColorLabel": "Ändra färg för {studentName}", - "@changeStudentColorLabel": { - "description": "Accessibility label for the button that lets users change the color associated with a specific student", - "type": "text", - "placeholders_order": [ - "studentName" - ], - "placeholders": { - "studentName": {} - } - }, - "Teacher": "Lärare", - "@Teacher": { - "description": "Label for the Teacher enrollment type", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Student": "Elev", - "@Student": { - "description": "Label for the Student enrollment type", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "TA": "Lärarassistent", - "@TA": { - "description": "Label for the Teaching Assistant enrollment type (also known as Teacher Aid or Education Assistant), reduced to a short acronym/initialism if appropriate.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Observer": "Observatör", - "@Observer": { - "description": "Label for the Observer enrollment type", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Use Camera": "Använd kamera", - "@Use Camera": { - "description": "Label for the action item that lets the user capture a photo using the device camera", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Upload File": "Ladda upp fil", - "@Upload File": { - "description": "Label for the action item that lets the user upload a file from their device", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Choose from Gallery": "Välj från galleri", - "@Choose from Gallery": { - "description": "Label for the action item that lets the user select a photo from their device gallery", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Preparing…": "Förbereder...", - "@Preparing…": { - "description": "Message shown while a file is being prepared to attach to a message", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Add student with…": "Lägg till elev med...", - "@Add student with…": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Add Student": "Lägg till elev", - "@Add Student": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You are not observing any students.": "Du observerar inga elever.", - "@You are not observing any students.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading your students.": "Det gick inte att läsa in dina elever.", - "@There was an error loading your students.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Pairing Code": "Parkopplingskod", - "@Pairing Code": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Students can obtain a pairing code through the Canvas website": "Elever kan få en parkopplingskod genom att använda Canvas Elev-appen i sina mobiler.", - "@Students can obtain a pairing code through the Canvas website": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Enter the student pairing code provided to you. If the pairing code doesn't work, it may have expired": "Ange den elevparkopplingskod du har fått. Om parkopplingskoden inte fungerar kan den ha gått ut", - "@Enter the student pairing code provided to you. If the pairing code doesn't work, it may have expired": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Your code is incorrect or expired.": "Din kod är fel eller har gått ut.", - "@Your code is incorrect or expired.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Something went wrong trying to create your account, please reach out to your school for assistance.": "Något gick fel när ditt konto skulle skapas. Kontakta din skola för hjälp.", - "@Something went wrong trying to create your account, please reach out to your school for assistance.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "QR Code": "QR-kod", - "@QR Code": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Students can create a QR code using the Canvas Student app on their mobile device": "Elever kan skapa en QR-kod i Canvas Elev-appen i sina mobiler.", - "@Students can create a QR code using the Canvas Student app on their mobile device": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Add new student": "Lägg till ny elev", - "@Add new student": { - "description": "Semantics label for the FAB on the Manage Students Screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Select": "Välj", - "@Select": { - "description": "Hint text to tell the user to choose one of two options", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I have a Canvas account": "Jag har ett Canvas-konto", - "@I have a Canvas account": { - "description": "Option to select for users that have a canvas account", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I don't have a Canvas account": "Jag har inte ett Canvas-konto", - "@I don't have a Canvas account": { - "description": "Option to select for users that don't have a canvas account", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Create Account": "Skapa konto", - "@Create Account": { - "description": "Button text for account creation confirmation", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Full Name": "Fullständigt namn", - "@Full Name": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Email Address": "E-postadress", - "@Email Address": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Password": "Lösenord", - "@Password": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Full Name…": "Fullständigt namn ...", - "@Full Name…": { - "description": "hint label for inside form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Email…": "E-post …", - "@Email…": { - "description": "hint label for inside form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Password…": "Lösenord ...", - "@Password…": { - "description": "hint label for inside form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Please enter full name": "Ange fullständigt namn", - "@Please enter full name": { - "description": "Error message for form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Please enter an email address": "Ange en e-postadress", - "@Please enter an email address": { - "description": "Error message for form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Please enter a valid email address": "Ange en giltig e-postadress", - "@Please enter a valid email address": { - "description": "Error message for form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Password is required": "Lösenord krävs", - "@Password is required": { - "description": "Error message for form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Password must contain at least 8 characters": "Lösenord måste innehålla minst 8 tecken", - "@Password must contain at least 8 characters": { - "description": "Error message for form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "qrCreateAccountTos": "Genom att trycka på Skapa konto samtycker du till {termsOfService} och {privacyPolicy}", - "@qrCreateAccountTos": { - "description": "The text show on the account creation screen", - "type": "text", - "placeholders_order": [ - "termsOfService", - "privacyPolicy" - ], - "placeholders": { - "termsOfService": {}, - "privacyPolicy": {} - } - }, - "Terms of Service": "Tjänstvillkor", - "@Terms of Service": { - "description": "Label for the Canvas Terms of Service agreement. This will be used in the qrCreateAccountTos text and will be highlighted and clickable", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Privacy Policy": "Integritetspolicy", - "@Privacy Policy": { - "description": "Label for the Canvas Privacy Policy agreement. This will be used in the qrCreateAccountTos text and will be highlighted and clickable", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "View the Privacy Policy": "Visa sekretesspolicyn", - "@View the Privacy Policy": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Already have an account? ": "Har du redan ett konto? ", - "@Already have an account? ": { - "description": "Part of multiline text span, includes AccountSignIn1-2, in that order", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Sign In": "Logga in", - "@Sign In": { - "description": "Part of multiline text span, includes AccountSignIn1-2, in that order", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Hide Password": "Dölj lösenord", - "@Hide Password": { - "description": "content description for password hide button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Show Password": "Visa lösenord", - "@Show Password": { - "description": "content description for password show button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Terms of Service Link": "Länk till tjänstvillkor", - "@Terms of Service Link": { - "description": "content description for terms of service link", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Privacy Policy Link": "Länk till sekretesspolicy", - "@Privacy Policy Link": { - "description": "content description for privacy policy link", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Event": "Händelse", - "@Event": { - "description": "Title for the event details screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Date": "Datum", - "@Date": { - "description": "Label for the event date", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Location": "Plats", - "@Location": { - "description": "Label for the location information", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Location Specified": "Ingen plats specificerad", - "@No Location Specified": { - "description": "Description for events that do not have a location", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "eventTime": "{startAt}/{endAt}", - "@eventTime": { - "description": "The time the event is happening, example: \"2:00 pm - 4:00 pm\"", - "type": "text", - "placeholders_order": [ - "startAt", - "endAt" - ], - "placeholders": { - "startAt": {}, - "endAt": {} - } - }, - "Set a date and time to be notified of this event.": "Ange ett datum och tid för att få en notis för den här händelsen.", - "@Set a date and time to be notified of this event.": { - "description": "Description for row to set event reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You will be notified about this event on…": "Du kommer att få en notis om den här händelsen den...", - "@You will be notified about this event on…": { - "description": "Description for when an event reminder is set", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Share Your Love for the App": "Dela din kärlek till appen", - "@Share Your Love for the App": { - "description": "Label for option to open the app store", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Tell us about your favorite parts of the app": "Berätta vad du tycker om mest med appen", - "@Tell us about your favorite parts of the app": { - "description": "Description for option to open the app store", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Legal": "Juridik", - "@Legal": { - "description": "Label for legal information option", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Privacy policy, terms of use, open source": "Integritetspolicy, användarvillkor, öppen källkod", - "@Privacy policy, terms of use, open source": { - "description": "Description for legal information option", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Idea for Canvas Parent App [Android]": "Idéer för appen Canvas Parent [Android]", - "@Idea for Canvas Parent App [Android]": { - "description": "The subject for the email to request a feature", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The following information will help us better understand your idea:": "Följande information kommer att hjälpa oss att förstå din idé bättre:", - "@The following information will help us better understand your idea:": { - "description": "The header for the users information that is attached to a feature request", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Domain:": "Domän:", - "@Domain:": { - "description": "The label for the Canvas domain of the logged in user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "User ID:": "Användar-ID:", - "@User ID:": { - "description": "The label for the Canvas user ID of the logged in user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Email:": "E-post:", - "@Email:": { - "description": "The label for the eamil of the logged in user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Locale:": "Plats:", - "@Locale:": { - "description": "The label for the locale of the logged in user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Terms of Use": "Användningsvillkor", - "@Terms of Use": { - "description": "Label for the terms of use", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Canvas on GitHub": "Canvas på GitHub", - "@Canvas on GitHub": { - "description": "Label for the button that opens the Canvas project on GitHub's website", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was a problem loading the Terms of Use": "Det gick inte att läsa in användarvillkoren", - "@There was a problem loading the Terms of Use": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Device": "Enhet", - "@Device": { - "description": "Label used for device manufacturer/model in the error report", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "OS Version": "Operativsystemets version", - "@OS Version": { - "description": "Label used for device operating system version in the error report", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Version Number": "Versionsnummer", - "@Version Number": { - "description": "Label used for the app version number in the error report", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Report A Problem": "Rapportera ett problem", - "@Report A Problem": { - "description": "Title used for generic dialog to report problems", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Subject": "Ämne", - "@Subject": { - "description": "Label used for Subject text field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "A subject is required.": "Ämne är obligatoriskt.", - "@A subject is required.": { - "description": "Error shown when the subject field is empty", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "An email address is required.": "E-postadressen är obligatorisk.", - "@An email address is required.": { - "description": "Error shown when the email field is empty", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Description": "Beskrivning", - "@Description": { - "description": "Label used for Description text field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "A description is required.": "Beskrivning är obligatorisk.", - "@A description is required.": { - "description": "Error shown when the description field is empty", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "How is this affecting you?": "Hur påverkar detta dig?", - "@How is this affecting you?": { - "description": "Label used for the dropdown to select how severe the issue is", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "send": "skicka", - "@send": { - "description": "Label used for send button when reporting a problem", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Just a casual question, comment, idea, suggestion…": "Bara en vanlig fråga, kommentar, idé, förslag ...", - "@Just a casual question, comment, idea, suggestion…": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I need some help but it's not urgent.": "Jag behöver hjälp men det är inte bråttom.", - "@I need some help but it's not urgent.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Something's broken but I can work around it to get what I need done.": "Det är något som inte fungerar men jag kan göra det jag ska ändå.", - "@Something's broken but I can work around it to get what I need done.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I can't get things done until I hear back from you.": "Jag kan inte göra något tills jag hör ifrån er.", - "@I can't get things done until I hear back from you.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "EXTREME CRITICAL EMERGENCY!!": "EXTREMT KRITISKT NÖDFALL!!", - "@EXTREME CRITICAL EMERGENCY!!": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Not Graded": "Inte bedömd", - "@Not Graded": { - "description": "Description for an assignment has not been graded.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Login flow: Normal": "Inloggningsflöde: Normal", - "@Login flow: Normal": { - "description": "Description for the normal login flow", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Login flow: Canvas": "Inloggningsflöde: Canvas", - "@Login flow: Canvas": { - "description": "Description for the Canvas login flow", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Login flow: Site Admin": "Inloggningsflöde: Webbplatsadmin", - "@Login flow: Site Admin": { - "description": "Description for the Site Admin login flow", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Login flow: Skip mobile verify": "Inloggningsflöde: Hoppa över mobilverifiering", - "@Login flow: Skip mobile verify": { - "description": "Description for the login flow that skips domain verification for mobile", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Act As User": "Agera som användare", - "@Act As User": { - "description": "Label for the button that allows the user to act (masquerade) as another user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Stop Acting as User": "Sluta att agera som en användare", - "@Stop Acting as User": { - "description": "Label for the button that allows the user to stop acting (masquerading) as another user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "actingAsUser": "Du agerar som {userName}", - "@actingAsUser": { - "description": "Message shown while acting (masquerading) as another user", - "type": "text", - "placeholders_order": [ - "userName" - ], - "placeholders": { - "userName": {} - } - }, - "\"Act as\" is essentially logging in as this user without a password. You will be able to take any action as if you were this user, and from other users' points of views, it will be as if this user performed them. However, audit logs record that you were the one who performed the actions on behalf of this user.": "\"Att uppträda som\", loggar huvudsakligen in som den här användaren utan lösenord. Du kommer att kunna vidta åtgärder som om du var den här användaren, och från andra användares synpunkter kommer det att upplevas som om den här användaren utförde dem. I revisionsloggar registreras dock att du var den som utförde åtgärderna på den här användarens vägnar.", - "@\"Act as\" is essentially logging in as this user without a password. You will be able to take any action as if you were this user, and from other users' points of views, it will be as if this user performed them. However, audit logs record that you were the one who performed the actions on behalf of this user.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Domain": "Domän", - "@Domain": { - "description": "Text field hint for domain url input", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You must enter a valid domain": "Du måste ange en giltig domän", - "@You must enter a valid domain": { - "description": "Message displayed for domain input error", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "User ID": "Användar-ID", - "@User ID": { - "description": "Text field hint for user ID input", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You must enter a user id": "Du måste ange ett giltigt användar-ID", - "@You must enter a user id": { - "description": "Message displayed for user Id input error", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error trying to act as this user. Please check the Domain and User ID and try again.": "Ett fel inträffade under Agera som den här användaren. Kontrollera domänen och användar-ID:t och försök igen.", - "@There was an error trying to act as this user. Please check the Domain and User ID and try again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "endMasqueradeMessage": "Du kommer att sluta agera som {userName} och återgå till ditt ursprungliga konto.", - "@endMasqueradeMessage": { - "description": "Confirmation message displayed when the user wants to stop acting (masquerading) as another user", - "type": "text", - "placeholders_order": [ - "userName" - ], - "placeholders": { - "userName": {} - } - }, - "endMasqueradeLogoutMessage": "Du kommer att sluta agera som {userName} och loggas ut.", - "@endMasqueradeLogoutMessage": { - "description": "Confirmation message displayed when the user wants to stop acting (masquerading) as another user and will be logged out.", - "type": "text", - "placeholders_order": [ - "userName" - ], - "placeholders": { - "userName": {} - } - }, - "How are we doing?": "Hur går det för oss?", - "@How are we doing?": { - "description": "Title for dialog asking user to rate the app out of 5 stars.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Don't show again": "Visa inte igen", - "@Don't show again": { - "description": "Button to prevent the rating dialog from showing again.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "What can we do better?": "Vad kan vi förbättra?", - "@What can we do better?": { - "description": "Hint text for providing a comment with the rating.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Send Feedback": "Skicka återkoppling", - "@Send Feedback": { - "description": "Button to send rating with feedback", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "ratingDialogEmailSubject": "Förslag för Android – Canvas Parent {version}", - "@ratingDialogEmailSubject": { - "description": "The subject for an email to provide feedback for CanvasParent.", - "type": "text", - "placeholders_order": [ - "version" - ], - "placeholders": { - "version": {} - } - }, - "starRating": "{position,plural, =1{{position} stjärna}other{{position} stjärnor}}", - "@starRating": { - "description": "Accessibility label for the 1 stars to 5 stars rating", - "type": "text", - "placeholders_order": [ - "position" - ], - "placeholders": { - "position": { - "example": 1 - } - } - }, - "Student Pairing": "Elev-parkoppling", - "@Student Pairing": { - "description": "Title for the screen where users can pair to students using a QR code", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Open Canvas Student": "Öppna Canvas Elev", - "@Open Canvas Student": { - "description": "Title for QR pairing tutorial screen instructing users to open the Canvas Student app", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You'll need to open your student's Canvas Student app to continue. Go into Main Menu > Settings > Pair with Observer and scan the QR code you see there.": "Du måste öppna din Elevs Canvas Elev-app för att fortsätta. Gå till Huvudmenyn > Inställningar > Parkoppla med observatör och skanna QR-koden du ser där.", - "@You'll need to open your student's Canvas Student app to continue. Go into Main Menu > Settings > Pair with Observer and scan the QR code you see there.": { - "description": "Message explaining how QR code pairing works", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Screenshot showing location of pairing QR code generation in the Canvas Student app": "Skärmbild som visar var QR-kodens parkopplingsgenerering görs i Canvas Elev-appen", - "@Screenshot showing location of pairing QR code generation in the Canvas Student app": { - "description": "Content Description for qr pairing tutorial screenshot", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Expired QR Code": "Utgången QR-kod", - "@Expired QR Code": { - "description": "Error title shown when the users scans a QR code that has expired", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The QR code you scanned may have expired. Refresh the code on the student's device and try again.": "QR-koden du skannade kan har gått ut. Uppdatera koden på elevens enhet och försök igen.", - "@The QR code you scanned may have expired. Refresh the code on the student's device and try again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "A network error occurred when adding this student. Check your connection and try again.": "Ett nätverksfel inträffade när du lade till den här eleven. Kontrollera din anslutning och försök igen.", - "@A network error occurred when adding this student. Check your connection and try again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Invalid QR Code": "Ogiltig QR-kod", - "@Invalid QR Code": { - "description": "Error title shown when the user scans an invalid QR code", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Incorrect Domain": "Felaktig domän", - "@Incorrect Domain": { - "description": "Error title shown when the users scane a QR code for a student that belongs to a different domain", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The student you are trying to add belongs to a different school. Log in or create an account with that school to scan this code.": "Eleven du försöker lägga tillhör en annan skola. Logga in eller skapa ett konto med den skolans för att skanna den här koden.", - "@The student you are trying to add belongs to a different school. Log in or create an account with that school to scan this code.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Camera Permission": "Kamerabehörighet", - "@Camera Permission": { - "description": "Error title shown when the user wans to scan a QR code but has denied the camera permission", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "This will unpair and remove all enrollments for this student from your account.": "Detta kommer att koppla från och ta bort alla registreringar för den här Eleven från ditt konto.", - "@This will unpair and remove all enrollments for this student from your account.": { - "description": "Confirmation message shown when the user tries to delete a student from their account", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was a problem removing this student from your account. Please check your connection and try again.": "Det gick inte att ta bort eleven från ditt konto. Kontrollera din anslutning och försök igen.", - "@There was a problem removing this student from your account. Please check your connection and try again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Cancel": "Avbryt", - "@Cancel": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "next": "Nästa", - "@next": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "ok": "OK", - "@ok": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Yes": "Ja", - "@Yes": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No": "Nej", - "@No": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Retry": "Försök igen", - "@Retry": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Delete": "Ta bort", - "@Delete": { - "description": "Label used for general delete/remove actions", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Done": "Klar", - "@Done": { - "description": "Label for general done/finished actions", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Refresh": "Uppdatera", - "@Refresh": { - "description": "Label for button to refresh data from the web", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "View Description": "Visa beskrivning", - "@View Description": { - "description": "Button to view the description for an event or assignment", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "expanded": "expanderad", - "@expanded": { - "description": "Description for the accessibility reader for list groups that are expanded", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "collapsed": "minimerad", - "@collapsed": { - "description": "Description for the accessibility reader for list groups that are expanded", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "An unexpected error occurred": "Ett oväntat fel inträffade", - "@An unexpected error occurred": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No description": "Ingen beskrivning", - "@No description": { - "description": "Message used when the assignment has no description", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Launch External Tool": "Starta externt verktyg", - "@Launch External Tool": { - "description": "Button text added to webviews to let users open external tools in their browser", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Interactions on this page are limited by your institution.": "Interaktioner på den här sidan har begränsats av din institution.", - "@Interactions on this page are limited by your institution.": { - "description": "Message describing how the webview has limited access due to an instution setting", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "dateAtTime": "{date} kl. {time}", - "@dateAtTime": { - "description": "The string to format dates", - "type": "text", - "placeholders_order": [ - "date", - "time" - ], - "placeholders": { - "date": {}, - "time": {} - } - }, - "dueDateAtTime": "Ska lämnas in {date} klockan {time}", - "@dueDateAtTime": { - "description": "The string to format due dates", - "type": "text", - "placeholders_order": [ - "date", - "time" - ], - "placeholders": { - "date": {}, - "time": {} - } - }, - "No Due Date": "Inget inlämningsdatum", - "@No Due Date": { - "description": "Label for assignments that do not have a due date", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Filter": "Filtrera", - "@Filter": { - "description": "Label for buttons to filter what items are visible", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "unread": "olästa", - "@unread": { - "description": "Label for things that are marked as unread", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "unreadCount": "{count} olästa", - "@unreadCount": { - "description": "Formatted string for when there are a number of unread items", - "type": "text", - "placeholders_order": [ - "count" - ], - "placeholders": { - "count": {} - } - }, - "badgeNumberPlus": "{count}+", - "@badgeNumberPlus": { - "description": "Formatted string for when too many items are being notified in a badge, generally something like: 99+", - "type": "text", - "placeholders_order": [ - "count" - ], - "placeholders": { - "count": {} - } - }, - "There was an error loading this announcement": "Det gick inte att läsa in det här meddelandet", - "@There was an error loading this announcement": { - "description": "Message shown when an announcement detail screen fails to load", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Network error": "Nätverksfel", - "@Network error": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Under Construction": "Under uppbyggnad", - "@Under Construction": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "We are currently building this feature for your viewing pleasure.": "Vi bygger den här funktionen för dig.", - "@We are currently building this feature for your viewing pleasure.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Request Login Help Button": "Hjälpknapp för inloggningsförfrågningar", - "@Request Login Help Button": { - "description": "Accessibility hint for button that opens help dialog for a login help request", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Request Login Help": "Begär hjälp med inloggning", - "@Request Login Help": { - "description": "Title of help dialog for a login help request", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I'm having trouble logging in": "Jag kan inte logga in", - "@I'm having trouble logging in": { - "description": "Subject of help dialog for a login help request", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "An error occurred when trying to display this link": "Ett fel uppstod när länken skulle visas", - "@An error occurred when trying to display this link": { - "description": "Error message shown when a link can't be opened", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "We are unable to display this link, it may belong to an institution you currently aren't logged in to.": "Det går inte att visa den här länken. Den kan tillhöra en institution du för närvarande inte är inloggad på.", - "@We are unable to display this link, it may belong to an institution you currently aren't logged in to.": { - "description": "Description for error page shown when clicking a link", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Link Error": "Länkfel", - "@Link Error": { - "description": "Title for error page shown when clicking a link", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Open In Browser": "Öppna i webbläsare", - "@Open In Browser": { - "description": "Text for button to open a link in the browswer", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You'll find the QR code on the web in your account profile. Click 'QR for Mobile Login' in the list.": "Du hittar QR-koden på webben i din kontoprofil. Klicka på \"QR för mobil inloggning\" i listan.", - "@You'll find the QR code on the web in your account profile. Click 'QR for Mobile Login' in the list.": { - "description": "Text for qr login tutorial screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Locate QR Code": "Lokalisera QR-kod", - "@Locate QR Code": { - "description": "Text for qr login button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Please scan a QR code generated by Canvas": "Skanna en QR-kod som genererats i Canvas.", - "@Please scan a QR code generated by Canvas": { - "description": "Text for qr login error with incorrect qr code", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error logging in. Please generate another QR Code and try again.": "Det gick inte att logga in. Generera en annan QR-kod och försök igen.", - "@There was an error logging in. Please generate another QR Code and try again.": { - "description": "Text for qr login error", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Screenshot showing location of QR code generation in browser": "Skärmdumpen visar platsen för QR-kodgenerering i webbläsaren", - "@Screenshot showing location of QR code generation in browser": { - "description": "Content Description for qr login tutorial screenshot", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "QR scanning requires camera access": "QR-skanning kräver kameraåtkomst", - "@QR scanning requires camera access": { - "description": "placeholder for camera error for QR code scan", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The linked item is no longer available": "Det länkade objektet är inte längre tillgängligt", - "@The linked item is no longer available": { - "description": "error message when the alert could no be opened", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Message sent": "Meddelandet har skickats", - "@Message sent": { - "description": "confirmation message on the screen when the user succesfully sends a message", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Acceptable Use Policy": "Acceptable Use Policy (Policy för godkänd användning)", - "@Acceptable Use Policy": { - "description": "title for the acceptable use policy screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Submit": "Spara", - "@Submit": { - "description": "submit button title for acceptable use policy screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Either you're a new user or the Acceptable Use Policy has changed since you last agreed to it. Please agree to the Acceptable Use Policy before you continue.": "Antingen är du en ny användare eller så har policyn för godkänd användning ändrats sedan du senast godkände den. Godkänn policyn för godkänd användning innan du fortsätter.", - "@Either you're a new user or the Acceptable Use Policy has changed since you last agreed to it. Please agree to the Acceptable Use Policy before you continue.": { - "description": "acceptable use policy screen description", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I agree to the Acceptable Use Policy.": "Jag godkänner policyn för godkänd användning.", - "@I agree to the Acceptable Use Policy.": { - "description": "acceptable use policy switch title", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "About": "Om", - "@About": { - "description": "Title for about menu item in settings", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "App": "App", - "@App": { - "description": "Title for App field on about page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Login ID": "Inloggnings-ID", - "@Login ID": { - "description": "Title for Login ID field on about page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Email": "E-post", - "@Email": { - "description": "Title for Email field on about page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Version": "Version", - "@Version": { - "description": "Title for Version field on about page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Instructure logo": "Instructure-logotyp", - "@Instructure logo": { - "description": "Semantics label for the Instructure logo on the about page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - } -} \ No newline at end of file diff --git a/apps/flutter_parent/lib/l10n/res/intl_th.arb b/apps/flutter_parent/lib/l10n/res/intl_th.arb deleted file mode 100644 index e83fce0a50..0000000000 --- a/apps/flutter_parent/lib/l10n/res/intl_th.arb +++ /dev/null @@ -1,2753 +0,0 @@ -{ - "@@last_modified": "2023-08-25T11:04:20.901151", - "alertsLabel": "แจ้งเตือน", - "@alertsLabel": { - "description": "The label for the Alerts tab", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "calendarLabel": "ปฏิทิน", - "@calendarLabel": { - "description": "The label for the Calendar tab", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "coursesLabel": "บทเรียน", - "@coursesLabel": { - "description": "The label for the Courses tab", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Students": "ไม่มีผู้เรียน", - "@No Students": { - "description": "Text for when an observer has no students they are observing", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Tap to show student selector": "กดเพื่อแสดงตัวเลือกผู้เรียน", - "@Tap to show student selector": { - "description": "Semantics label for the area that will show the student selector when tapped", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Tap to pair with a new student": "กดเพื่อเข้าคู่กับผู้เรียนใหม่", - "@Tap to pair with a new student": { - "description": "Semantics label for the add student button in the student selector", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Tap to select this student": "กดเพื่อเลือกผู้เรียนนี้", - "@Tap to select this student": { - "description": "Semantics label on individual students in the student switcher", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Manage Students": "จัดการผู้เรียน", - "@Manage Students": { - "description": "Label text for the Manage Students nav drawer button as well as the title for the Manage Students screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Help": "ความช่วยเหลือ", - "@Help": { - "description": "Label text for the help nav drawer button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Log Out": "ล็อกเอาท์", - "@Log Out": { - "description": "Label text for the Log Out nav drawer button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Switch Users": "สลับผู้ใช้", - "@Switch Users": { - "description": "Label text for the Switch Users nav drawer button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "appVersion": "v. {version}", - "@appVersion": { - "description": "App version shown in the navigation drawer", - "type": "text", - "placeholders_order": [ - "version" - ], - "placeholders": { - "version": {} - } - }, - "Are you sure you want to log out?": "แน่ใจว่าต้องการล็อกเอาท์หรือไม่", - "@Are you sure you want to log out?": { - "description": "Confirmation message displayed when the user tries to log out", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Calendars": "ปฏิทิน", - "@Calendars": { - "description": "Label for button that lets users select which calendars to display", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "nextMonth": "เดือนถัดไป: {month}", - "@nextMonth": { - "description": "Label for the button that switches the calendar to the next month", - "type": "text", - "placeholders_order": [ - "month" - ], - "placeholders": { - "month": {} - } - }, - "previousMonth": "เดือนก่อนหน้า: {month}", - "@previousMonth": { - "description": "Label for the button that switches the calendar to the previous month", - "type": "text", - "placeholders_order": [ - "month" - ], - "placeholders": { - "month": {} - } - }, - "nextWeek": "สัปดาห์ถัดไป เริ่มต้น {date}", - "@nextWeek": { - "description": "Label for the button that switches the calendar to the next week", - "type": "text", - "placeholders_order": [ - "date" - ], - "placeholders": { - "date": {} - } - }, - "previousWeek": "สัปดาห์ก่อนหน้า เริ่มต้น {date}", - "@previousWeek": { - "description": "Label for the button that switches the calendar to the previous week", - "type": "text", - "placeholders_order": [ - "date" - ], - "placeholders": { - "date": {} - } - }, - "selectedMonthLabel": "เดือน {month}", - "@selectedMonthLabel": { - "description": "Accessibility label for the button that expands/collapses the month view", - "type": "text", - "placeholders_order": [ - "month" - ], - "placeholders": { - "month": {} - } - }, - "expand": "ขยาย", - "@expand": { - "description": "Accessibility label for the on-tap hint for the button that expands/collapses the month view", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "collapse": "ย่อ", - "@collapse": { - "description": "Accessibility label for the on-tap hint for the button that expands/collapses the month view", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "pointsPossible": "{points} คะแนนที่เป็นไปได้", - "@pointsPossible": { - "description": "Screen reader label used for the points possible for an assignment, quiz, etc.", - "type": "text", - "placeholders_order": [ - "points" - ], - "placeholders": { - "points": {} - } - }, - "calendarDaySemanticsLabel": "{eventCount,plural, =1{{date}, {eventCount} กิจกรรม}other{{date}, {eventCount} กิจกรรม}}", - "@calendarDaySemanticsLabel": { - "description": "Screen reader label used for calendar day, reads the date and count of events", - "type": "text", - "placeholders_order": [ - "date", - "eventCount" - ], - "placeholders": { - "date": {}, - "eventCount": {} - } - }, - "No Events Today!": "ไม่มีกิจกรรมในวันนี้!", - "@No Events Today!": { - "description": "Title displayed when there are no calendar events for the current day", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "It looks like a great day to rest, relax, and recharge.": "ดูเหมือนนี่จะเป็นวันที่เหมาะสำหรับพัก ผ่อนคลายและเติมพลัง", - "@It looks like a great day to rest, relax, and recharge.": { - "description": "Message displayed when there are no calendar events for the current day", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading your student's calendar": "มีข้อผิดพลาดในการโหลดปฏิทินผู้เรียนของคุณ", - "@There was an error loading your student's calendar": { - "description": "Message displayed when calendar events could not be loaded for the current student", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Tap to favorite the courses you want to see on the Calendar. Select up to 10.": "กดเลือกเพื่อกำหนดรายการบทเรียนโปรดที่คุณต้องการดูในปฏิทิน เลือกได้สูงสุด 10 รายการ", - "@Tap to favorite the courses you want to see on the Calendar. Select up to 10.": { - "description": "Description text on calendar filter screen.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You may only choose 10 calendars to display": "คุณสามารถเลือกปฏิทินได้เพียง 10 รายการที่จะจัดแสดง", - "@You may only choose 10 calendars to display": { - "description": "Error text when trying to select more than 10 calendars", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You must select at least one calendar to display": "คุณจะต้องเลือกปฏิทินอย่างน้อยหนึ่งรายการที่จะจัดแสดง", - "@You must select at least one calendar to display": { - "description": "Error text when trying to de-select all calendars", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Planner Note": "หมายเหตุสำหรับแผนงาน", - "@Planner Note": { - "description": "Label used for notes in the planner", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Go to today": "ไปที่วันนี้", - "@Go to today": { - "description": "Accessibility label used for the today button in the planner", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Previous Logins": "การล็อกอินก่อนหน้า", - "@Previous Logins": { - "description": "Label for the list of previous user logins", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "canvasLogoLabel": "โลโก้ Canvas", - "@canvasLogoLabel": { - "description": "The semantics label for the Canvas logo", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "findSchool": "ค้นหาสถานศึกษา", - "@findSchool": { - "description": "Text for the find-my-school button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "findAnotherSchool": "ค้นหาสถานศึกษาอื่น", - "@findAnotherSchool": { - "description": "Text for the find-another-school button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "domainSearchInputHint": "กรอกชื่อสถานศึกษาหรือเขตพื้นที่...", - "@domainSearchInputHint": { - "description": "Input hint for the text box on the domain search screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "noDomainResults": "ไม่พบสถานศึกษาที่ตรงกับ “{query}”", - "@noDomainResults": { - "description": "Message shown to users when the domain search query did not return any results", - "type": "text", - "placeholders_order": [ - "query" - ], - "placeholders": { - "query": {} - } - }, - "domainSearchHelpLabel": "จะค้นหาสถานศึกษาหรือเขตพื้นที่ของฉันได้อย่างไร", - "@domainSearchHelpLabel": { - "description": "Label for the help button on the domain search screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "canvasGuides": "คู่มือ Canvas", - "@canvasGuides": { - "description": "Proper name for the Canvas Guides. This will be used in the domainSearchHelpBody text and will be highlighted and clickable", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "canvasSupport": "บริการจาก Canvas", - "@canvasSupport": { - "description": "Proper name for Canvas Support. This will be used in the domainSearchHelpBody text and will be highlighted and clickable", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "domainSearchHelpBody": "ลองค้นหาชื่อสถานศึกษาหรือเขตพื้นที่ที่คุณพยายามสืบค้น เช่น “Smith Private School” หรือ “Smith County Schools” นอกจากนี้คุณยังสามารถกรอกโดเมน Canvas ได้โดยตรง เช่น “smith.instructure.com.”\n\nดูรายละเอียดเพิ่มเติมในการค้นหาบัญชี Canvas สำหรับสถาบันของคุณโดยเข้าไปที่ {canvasGuides} ติดต่อ {canvasSupport} หรือติดต่อสถานศึกษาของคุณเพื่อขอความช่วยเหลือ", - "@domainSearchHelpBody": { - "description": "The body text shown in the help dialog on the domain search screen", - "type": "text", - "placeholders_order": [ - "canvasGuides", - "canvasSupport" - ], - "placeholders": { - "canvasGuides": {}, - "canvasSupport": {} - } - }, - "Uh oh!": "โอ๊ะ โอ!", - "@Uh oh!": { - "description": "Title of the screen that shows when a crash has occurred", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "We’re not sure what happened, but it wasn’t good. Contact us if this keeps happening.": "เราไม่แน่ใจว่าเกิดอะไรขึ้น แต่เชื่อว่าไม่ดี ติดต่อเราหากยังเกิดปัญหานี้อยู่", - "@We’re not sure what happened, but it wasn’t good. Contact us if this keeps happening.": { - "description": "Message shown when a crash has occurred", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Contact Support": "บริการสำหรับการติดต่อ", - "@Contact Support": { - "description": "Label for the button that allows users to contact support after a crash has occurred", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "View error details": "ดูรายละเอียดข้อผิดพลาด", - "@View error details": { - "description": "Label for the button that allowed users to view crash details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Restart app": "รีสตาร์ทแอพ", - "@Restart app": { - "description": "Label for the button that will restart the entire application", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Application version": "เวอร์ชั่นแอพพลิเคชั่น", - "@Application version": { - "description": "Label for the application version displayed in the crash details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Device model": "รุ่นอุปกรณ์", - "@Device model": { - "description": "Label for the device model displayed in the crash details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Android OS version": "เวอร์ชั่น Android OS", - "@Android OS version": { - "description": "Label for the Android operating system version displayed in the crash details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Full error message": "ข้อความแจ้งข้อผิดพลาดเต็ม", - "@Full error message": { - "description": "Label for the full error message displayed in the crash details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Inbox": "กล่องจดหมาย", - "@Inbox": { - "description": "Title for the Inbox screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading your inbox messages.": "มีข้อผิดพลาดในการโหลดข้อความในกล่องจดหมายของคุณ", - "@There was an error loading your inbox messages.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Subject": "ไม่มีหัวเรื่อง", - "@No Subject": { - "description": "Title used for inbox messages that have no subject", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unable to fetch courses. Please check your connection and try again.": "ไม่สามารถสืบค้นบทเรียนได้ กรุณาตรวจสอบการเชื่อมต่อของคุณและลองใหม่อีกครั้ง", - "@Unable to fetch courses. Please check your connection and try again.": { - "description": "Message shown when an error occured while loading courses", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Choose a course to message": "เลือกบทเรียนที่จะส่งข้อความ", - "@Choose a course to message": { - "description": "Header in the course list shown when the user is choosing which course to associate with a new message", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Inbox Zero": "Inbox Zero", - "@Inbox Zero": { - "description": "Title of the message shown when there are no inbox messages", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You’re all caught up!": "แย่แล้ว!", - "@You’re all caught up!": { - "description": "Subtitle of the message shown when there are no inbox messages", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading recipients for this course": "มีข้อผิดพลาดในการโหลดผู้รับสำหรับบทเรียนนี้", - "@There was an error loading recipients for this course": { - "description": "Message shown when attempting to create a new message but the recipients list failed to load", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unable to send message. Check your connection and try again.": "ไม่สามารถส่งข้อความได้ ตรวจสอบการเชื่อมต่อและลองใหม่อีกครั้ง", - "@Unable to send message. Check your connection and try again.": { - "description": "Message show when there was an error creating or sending a new message", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unsaved changes": "การเปลี่ยนแปลงที่ไม่ได้บันทึก", - "@Unsaved changes": { - "description": "Title of the dialog shown when the user tries to leave with unsaved changes", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Are you sure you wish to close this page? Your unsent message will be lost.": "แน่ใจว่าต้องการปิดหน้าเพจนี้หรือไม่ ข้อความที่ไม่ได้ส่งของคุณจะหายไป", - "@Are you sure you wish to close this page? Your unsent message will be lost.": { - "description": "Body text of the dialog shown when the user tries leave with unsaved changes", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "New message": "ข้อความใหม่", - "@New message": { - "description": "Title of the new-message screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Add attachment": "เพิ่มเอกสารแนบ", - "@Add attachment": { - "description": "Tooltip for the add-attachment button in the new-message screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Send message": "ส่งข้อความ", - "@Send message": { - "description": "Tooltip for the send-message button in the new-message screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Select recipients": "เลือกผู้รับ", - "@Select recipients": { - "description": "Tooltip for the button that allows users to select message recipients", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No recipients selected": "ไม่ได้เลือกผู้รับ", - "@No recipients selected": { - "description": "Hint displayed when the user has not selected any message recipients", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Message subject": "หัวเรื่องข้อความ", - "@Message subject": { - "description": "Hint text displayed in the input field for the message subject", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Message": "ข้อความ", - "@Message": { - "description": "Hint text displayed in the input field for the message body", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Recipients": "ผู้รับ", - "@Recipients": { - "description": "Label for message recipients", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "plusRecipientCount": "+{count}", - "@plusRecipientCount": { - "description": "Shows the number of recipients that are selected but not displayed on screen.", - "type": "text", - "placeholders_order": [ - "count" - ], - "placeholders": { - "count": { - "example": 5 - } - } - }, - "Failed. Tap for options.": "ล้มเหลว กดเพื่อดูตัวเลือก", - "@Failed. Tap for options.": { - "description": "Short message shown on a message attachment when uploading has failed", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "courseForWhom": "สำหรับ {studentShortName}", - "@courseForWhom": { - "description": "Describes for whom a course is for (i.e. for Bill)", - "type": "text", - "placeholders_order": [ - "studentShortName" - ], - "placeholders": { - "studentShortName": {} - } - }, - "messageLinkPostscript": "เกี่ยวกับ: {studentName}, {linkUrl}", - "@messageLinkPostscript": { - "description": "A postscript appended to new messages that clarifies which student is the subject of the message and also includes a URL for the related Canvas component (course, assignment, event, etc).", - "type": "text", - "placeholders_order": [ - "studentName", - "linkUrl" - ], - "placeholders": { - "studentName": {}, - "linkUrl": {} - } - }, - "There was an error loading this conversation": "มีข้อผิดพลาดในการโหลดการพูดคุยนี้", - "@There was an error loading this conversation": { - "description": "Message shown when a conversation fails to load", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Reply": "ตอบกลับ", - "@Reply": { - "description": "Button label for replying to a conversation", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Reply All": "ตอบกลับทั้งหมด", - "@Reply All": { - "description": "Button label for replying to all conversation participants", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unknown User": "ผู้ใช้ที่ไม่รู้จัก", - "@Unknown User": { - "description": "Label used where the user name is not known", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "me": "ฉัน", - "@me": { - "description": "First-person pronoun (i.e. 'me') that will be used in message author info, e.g. 'Me to 4 others' or 'Jon Snow to me'", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "authorToRecipient": "{authorName} ถึง {recipientName}", - "@authorToRecipient": { - "description": "Author info for a single-recipient message; includes both the author name and the recipient name.", - "type": "text", - "placeholders_order": [ - "authorName", - "recipientName" - ], - "placeholders": { - "authorName": {}, - "recipientName": {} - } - }, - "authorToNOthers": "{howMany,plural, =1{{authorName} ถึงคนอื่นอีก 1 ราย}other{{authorName} กับคนอื่นอีก {howMany} ราย}}", - "@authorToNOthers": { - "description": "Author info for a mutli-recipient message; includes the author name and the number of recipients", - "type": "text", - "placeholders_order": [ - "authorName", - "howMany" - ], - "placeholders": { - "authorName": {}, - "howMany": {} - } - }, - "authorToRecipientAndNOthers": "{howMany,plural, =1{{authorName} กับ {recipientName} และคนอื่นอีก 1 ราย}other{{authorName} กับ {recipientName} และคนอื่นอีก {howMany} ราย}}", - "@authorToRecipientAndNOthers": { - "description": "Author info for a multi-recipient message; includes the author name, one recipient name, and the number of other recipients", - "type": "text", - "placeholders_order": [ - "authorName", - "recipientName", - "howMany" - ], - "placeholders": { - "authorName": {}, - "recipientName": {}, - "howMany": {} - } - }, - "Download": "ดาวน์โหลด", - "@Download": { - "description": "Label for the button that will begin downloading a file", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Open with another app": "เปิดโดยใช้แอพอื่น", - "@Open with another app": { - "description": "Label for the button that will allow users to open a file with another app", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There are no installed applications that can open this file": "ไม่มีแอพพลิเคชั่นติดตั้งที่เปิดไฟล์นี้ได้", - "@There are no installed applications that can open this file": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unsupported File": "ไฟล์ไม่รองรับ", - "@Unsupported File": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "This file is unsupported and can’t be viewed through the app": "ไม่รองรับไฟล์นี้และไม่สามารถเปิดดูได้ผ่านแอพนี้", - "@This file is unsupported and can’t be viewed through the app": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unable to play this media file": "ไม่สามารถเปิดเล่นไฟล์สื่อนี้", - "@Unable to play this media file": { - "description": "Message shown when audio or video media could not be played", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unable to load this image": "ไม่สามารถโหลดภาพนี้", - "@Unable to load this image": { - "description": "Message shown when an image file could not be loaded or displayed", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading this file": "มีข้อผิดพลาดในการโหลดไฟล์นี้", - "@There was an error loading this file": { - "description": "Message shown when a file could not be loaded or displayed", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Courses": "ไม่มีบทเรียน", - "@No Courses": { - "description": "Title for having no courses", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Your student’s courses might not be published yet.": "บทเรียนสำหรับผู้เรียนของคุณอาจยังไม่ได้เผยแพร่", - "@Your student’s courses might not be published yet.": { - "description": "Message for having no courses", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading your student’s courses.": "มีข้อผิดพลาดในการโหลดบทเรียนสำหรับผู้เรียน", - "@There was an error loading your student’s courses.": { - "description": "Message displayed when the list of student courses could not be loaded", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Grade": "ไม่มีเกรด", - "@No Grade": { - "description": "Message shown when there is currently no grade available for a course", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Filter by": "กรองจาก", - "@Filter by": { - "description": "Title for list of terms to filter grades by", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Grades": "เกรด", - "@Grades": { - "description": "Label for the \"Grades\" tab in course details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Syllabus": "หลักสูตร", - "@Syllabus": { - "description": "Label for the \"Syllabus\" tab in course details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Front Page": "หน้าแรก", - "@Front Page": { - "description": "Label for the \"Front Page\" tab in course details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Summary": "สรุป", - "@Summary": { - "description": "Label for the \"Summary\" tab in course details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Send a message about this course": "ส่งข้อความเกี่ยวกับบทเรียนนี้", - "@Send a message about this course": { - "description": "Accessibility hint for the course messaage floating action button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Total Grade": "เกรดรวม", - "@Total Grade": { - "description": "Label for the total grade in the course", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Graded": "ให้เกรดแล้ว", - "@Graded": { - "description": "Label for assignments that have been graded", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Submitted": "จัดส่งแล้ว", - "@Submitted": { - "description": "Label for assignments that have been submitted", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Not Submitted": "ไม่ได้จัดส่ง", - "@Not Submitted": { - "description": "Label for assignments that have not been submitted", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Late": "ล่าช้า", - "@Late": { - "description": "Label for assignments that have been marked late or submitted late", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Missing": "ขาดหาย", - "@Missing": { - "description": "Label for assignments that have been marked missing or are not submitted and past the due date", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "-": "-", - "@-": { - "description": "Value representing no score for student submission", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "All Grading Periods": "ระยะเวลาการให้เกรดทั้งหมด", - "@All Grading Periods": { - "description": "Label for selecting all grading periods", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Assignments": "ไม่มีภารกิจ", - "@No Assignments": { - "description": "Title for the no assignments message", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "It looks like assignments haven't been created in this space yet.": "ดูเหมือนจะยังไม่ได้จัดทำภารกิจในพื้นที่นี้", - "@It looks like assignments haven't been created in this space yet.": { - "description": "Message for no assignments", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading the summary details for this course.": "มีข้อผิดพลาดในการโหลดรายละเอียดสรุปสำหรับบทเรียนนี้", - "@There was an error loading the summary details for this course.": { - "description": "Message shown when the course summary could not be loaded", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Summary": "ไม่มีข้อมูลสรุป", - "@No Summary": { - "description": "Title displayed when there are no items in the course summary", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "This course does not have any assignments or calendar events yet.": "บทเรียนนี้ไม่มีภารกิจหรือกิจกรรมในปฏิทินในตอนนี้", - "@This course does not have any assignments or calendar events yet.": { - "description": "Message displayed when there are no items in the course summary", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "gradeFormatScoreOutOfPointsPossible": "{score} / {pointsPossible}", - "@gradeFormatScoreOutOfPointsPossible": { - "description": "Formatted string for a student score out of the points possible", - "type": "text", - "placeholders_order": [ - "score", - "pointsPossible" - ], - "placeholders": { - "score": {}, - "pointsPossible": {} - } - }, - "contentDescriptionScoreOutOfPointsPossible": "{score} จา {pointsPossible} คะแนน", - "@contentDescriptionScoreOutOfPointsPossible": { - "description": "Formatted string for a student score out of the points possible", - "type": "text", - "placeholders_order": [ - "score", - "pointsPossible" - ], - "placeholders": { - "score": {}, - "pointsPossible": {} - } - }, - "gradesSubjectMessage": "เกี่ยวกับ: {studentName}, เกรด", - "@gradesSubjectMessage": { - "description": "The subject line for a message to a teacher regarding a student's grades", - "type": "text", - "placeholders_order": [ - "studentName" - ], - "placeholders": { - "studentName": {} - } - }, - "syllabusSubjectMessage": "เกี่ยวกับ: {studentName}, หลักสูตร", - "@syllabusSubjectMessage": { - "description": "The subject line for a message to a teacher regarding a course syllabus", - "type": "text", - "placeholders_order": [ - "studentName" - ], - "placeholders": { - "studentName": {} - } - }, - "frontPageSubjectMessage": "เกี่ยวกับ: {studentName}, หน้าแรก", - "@frontPageSubjectMessage": { - "description": "The subject line for a message to a teacher regarding a course front page", - "type": "text", - "placeholders_order": [ - "studentName" - ], - "placeholders": { - "studentName": {} - } - }, - "assignmentSubjectMessage": "เกี่ยวกับ: {studentName}, ภารกิจ - {assignmentName}", - "@assignmentSubjectMessage": { - "description": "The subject line for a message to a teacher regarding a student's assignment", - "type": "text", - "placeholders_order": [ - "studentName", - "assignmentName" - ], - "placeholders": { - "studentName": {}, - "assignmentName": {} - } - }, - "eventSubjectMessage": "เกี่ยวกับ: {studentName}, กิจกรรม - {eventTitle}", - "@eventSubjectMessage": { - "description": "The subject line for a message to a teacher regarding a calendar event", - "type": "text", - "placeholders_order": [ - "studentName", - "eventTitle" - ], - "placeholders": { - "studentName": {}, - "eventTitle": {} - } - }, - "There is no page information available.": "ไม่มีข้อมูลเพจ", - "@There is no page information available.": { - "description": "Description for when no page information is available", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Assignment Details": "รายละเอียดภารกิจ", - "@Assignment Details": { - "description": "Title for the page that shows details for an assignment", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "assignmentTotalPoints": "{points} คะแนน", - "@assignmentTotalPoints": { - "description": "Label used for the total points the assignment is worth", - "type": "text", - "placeholders_order": [ - "points" - ], - "placeholders": { - "points": {} - } - }, - "assignmentTotalPointsAccessible": "{points} คะแนน", - "@assignmentTotalPointsAccessible": { - "description": "Screen reader label used for the total points the assignment is worth", - "type": "text", - "placeholders_order": [ - "points" - ], - "placeholders": { - "points": {} - } - }, - "Due": "ครบกำหนด", - "@Due": { - "description": "Label for an assignment due date", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Grade": "เกรด", - "@Grade": { - "description": "Label for the section that displays an assignment's grade", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Locked": "ล็อคแล้ว", - "@Locked": { - "description": "Label for when an assignment is locked", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "assignmentLockedModule": "ภารกิจนี้ถูกล็อคโดยหน่วยการเรียน “{moduleName}”", - "@assignmentLockedModule": { - "description": "The locked description when an assignment is locked by a module", - "type": "text", - "placeholders_order": [ - "moduleName" - ], - "placeholders": { - "moduleName": {} - } - }, - "Remind Me": "เตือนฉัน", - "@Remind Me": { - "description": "Label for the row to set reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Set a date and time to be notified of this specific assignment.": "กำหนดวันที่และเวลาที่จะรับการแจ้งเตือนสำหรับภารกิจเฉพาะนี้", - "@Set a date and time to be notified of this specific assignment.": { - "description": "Description for row to set reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You will be notified about this assignment on…": "คุณจะได้รับแจ้งเกี่ยวกับภารกิจใน....", - "@You will be notified about this assignment on…": { - "description": "Description for when a reminder is set", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Instructions": "คำแนะนำ", - "@Instructions": { - "description": "Label for the description of the assignment when it has quiz instructions", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Send a message about this assignment": "ส่งข้อความเกี่ยวกับภารกิจนี้", - "@Send a message about this assignment": { - "description": "Accessibility hint for the assignment messaage floating action button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "This app is not authorized for use.": "แอพนี้ไม่ได้รับอนุญาตให้ใช้งาน", - "@This app is not authorized for use.": { - "description": "The error shown when the app being used is not verified by Canvas", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The server you entered is not authorized for this app.": "เซิร์ฟเวอร์ที่คุณกรอกไม่ได้รับอนุญาตสำหรับแอพนี้", - "@The server you entered is not authorized for this app.": { - "description": "The error shown when the desired login domain is not verified by Canvas", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The user agent for this app is not authorized.": "ระบบตัวแทนของผู้ใช้สำหรับแอพนี้ไม่ได้รับอนุญาต", - "@The user agent for this app is not authorized.": { - "description": "The error shown when the user agent during verification is not verified by Canvas", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "We were unable to verify the server for use with this app.": "เราไม่สามารถยืนยันเซิร์ฟเวอร์สำหรับใช้กับแอพนี้", - "@We were unable to verify the server for use with this app.": { - "description": "The generic error shown when we are unable to verify with Canvas", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Reminders": "การแจ้งเตือน", - "@Reminders": { - "description": "Name of the system notification channel for assignment and event reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Notifications for reminders about assignments and calendar events": "การแจ้งข้อมูลสำหรับการแจ้งเตือนเกี่ยวกับภารกิจและกิจกรรมในปฏิทิน", - "@Notifications for reminders about assignments and calendar events": { - "description": "Description of the system notification channel for assignment and event reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Reminders have changed!": "การแจ้งเตือนเปลี่ยนแปลงแล้ว!", - "@Reminders have changed!": { - "description": "Title of the dialog shown when the user needs to update their reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "In order to provide you with a better experience, we have updated how reminders work. You can add new reminders by viewing an assignment or calendar event and tapping the switch under the \"Remind Me\" section.\n\nBe aware that any reminders created with older versions of this app will not be compatible with the new changes and you will need to create them again.": "เพื่อให้คุณใช้งานได้สะดวกมากขึ้น เราได้มีการอัพเดตระบบแจ้งเตือนใหม่ คุณสามารถเพิ่มการแจ้งเตือนใหม่โดยดูภารกิจหรือกิจกรรมในปฏิทินและกดเลือกสลับการใช้งานได้จากหัวข้อ “เตือนฉัน”\n\nการแจ้งเตือนใด ๆ ที่จัดทำผ่านแอพนี้ในเวอร์ชั่นเก่าจะไม่รองรับการเปลี่ยนแปลงใหม่นี้และคุณจะต้องจัดทำชุดข้อมูลใหม่อีกครั้ง", - "@In order to provide you with a better experience, we have updated how reminders work. You can add new reminders by viewing an assignment or calendar event and tapping the switch under the \"Remind Me\" section.\n\nBe aware that any reminders created with older versions of this app will not be compatible with the new changes and you will need to create them again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Not a parent?": "ไม่ใช่พ่อแม่ผู้ปกครองใช่หรือไม่", - "@Not a parent?": { - "description": "Title for the screen that shows when the user is not observing any students", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "We couldn't find any students associated with this account": "เราไม่พบผู้เรียนที่เชื่อมโยงกับบัญชีนี้", - "@We couldn't find any students associated with this account": { - "description": "Subtitle for the screen that shows when the user is not observing any students", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Are you a student or teacher?": "คุณเป็นผู้เรียนหรือผู้สอน", - "@Are you a student or teacher?": { - "description": "Label for button that will show users the option to view other Canvas apps in the Play Store", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "One of our other apps might be a better fit. Tap one to visit the Play Store.": "แอพอื่น ๆ บางส่วนของเราอาจเหมาะสมมากกว่า กดเลือกหนึ่งรายการเพื่อไปยัง Play Store", - "@One of our other apps might be a better fit. Tap one to visit the Play Store.": { - "description": "Description of options to view other Canvas apps in the Play Store", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Return to Login": "กลับไปที่ล็อกอิน", - "@Return to Login": { - "description": "Label for the button that returns the user to the login screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "STUDENT": "ผู้เรียน", - "@STUDENT": { - "description": "The \"student\" portion of the \"Canvas Student\" app name, in all caps. \"Canvas\" is excluded in this context as it will be displayed to the user as a wordmark image", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "TEACHER": "ผู้สอน", - "@TEACHER": { - "description": "The \"teacher\" portion of the \"Canvas Teacher\" app name, in all caps. \"Canvas\" is excluded in this context as it will be displayed to the user as a wordmark image", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Canvas Student": "Canvas Student", - "@Canvas Student": { - "description": "The name of the Canvas Student app. Only \"Student\" should be translated as \"Canvas\" is a brand name in this context and should not be translated.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Canvas Teacher": "Canvas Teacher", - "@Canvas Teacher": { - "description": "The name of the Canvas Teacher app. Only \"Teacher\" should be translated as \"Canvas\" is a brand name in this context and should not be translated.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Alerts": "ไม่มีการแจ้งเตือน", - "@No Alerts": { - "description": "The title for the empty message to show to users when there are no alerts for the student.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There’s nothing to be notified of yet.": "ไม่มีข้อมูลที่จะแจ้งในตอนนี้", - "@There’s nothing to be notified of yet.": { - "description": "The empty message to show to users when there are no alerts for the student.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "dismissAlertLabel": "ล้มเลิก {alertTitle}", - "@dismissAlertLabel": { - "description": "Accessibility label to dismiss an alert", - "type": "text", - "placeholders_order": [ - "alertTitle" - ], - "placeholders": { - "alertTitle": {} - } - }, - "Course Announcement": "ประกาศแจ้งสำหรับบทเรียน", - "@Course Announcement": { - "description": "Title for alerts when there is a course announcement", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Institution Announcement": "ประกาศของสถาบัน", - "@Institution Announcement": { - "description": "Title for alerts when there is an institution announcement", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "assignmentGradeAboveThreshold": "เกรดภารกิจมากกว่า {threshold}", - "@assignmentGradeAboveThreshold": { - "description": "Title for alerts when an assignment grade is above the threshold value", - "type": "text", - "placeholders_order": [ - "threshold" - ], - "placeholders": { - "threshold": {} - } - }, - "assignmentGradeBelowThreshold": "เกรดภารกิจต่ำกว่า {threshold}", - "@assignmentGradeBelowThreshold": { - "description": "Title for alerts when an assignment grade is below the threshold value", - "type": "text", - "placeholders_order": [ - "threshold" - ], - "placeholders": { - "threshold": {} - } - }, - "courseGradeAboveThreshold": "เกรดบทเรียนมากกว่า {threshold}", - "@courseGradeAboveThreshold": { - "description": "Title for alerts when a course grade is above the threshold value", - "type": "text", - "placeholders_order": [ - "threshold" - ], - "placeholders": { - "threshold": {} - } - }, - "courseGradeBelowThreshold": "เกรดบทเรียนน้อยกว่า {threshold}", - "@courseGradeBelowThreshold": { - "description": "Title for alerts when a course grade is below the threshold value", - "type": "text", - "placeholders_order": [ - "threshold" - ], - "placeholders": { - "threshold": {} - } - }, - "Settings": "ค่าปรับตั้ง", - "@Settings": { - "description": "Title for the settings screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Theme": "ธีม", - "@Theme": { - "description": "Label for the light/dark theme section in the settings page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Dark Mode": "โหมดมืด", - "@Dark Mode": { - "description": "Label for the button that enables dark mode", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Light Mode": "โหมดสว่าง", - "@Light Mode": { - "description": "Label for the button that enables light mode", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "High Contrast Mode": "โหมดคอนทราสต์สูง", - "@High Contrast Mode": { - "description": "Label for the switch that toggles high contrast mode", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Use Dark Theme in Web Content": "ใช้ธีมมืดในเนื้อหาบนเว็บ", - "@Use Dark Theme in Web Content": { - "description": "Label for the switch that toggles dark mode for webviews", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Appearance": "ลักษณะภายนอก", - "@Appearance": { - "description": "Label for the appearance section in the settings page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Successfully submitted!": "ส่งเสร็จสิ้น!", - "@Successfully submitted!": { - "description": "Title displayed in the grade cell for an assignment that has been submitted", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "submissionStatusSuccessSubtitle": "ภารกิจนี้ถูกจัดส่งแล้วเมื่อ {date} เวลา {time} และกำลังรอการให้เกรด", - "@submissionStatusSuccessSubtitle": { - "description": "Subtitle displayed in the grade cell for an assignment that has been submitted and is awaiting a grade", - "type": "text", - "placeholders_order": [ - "date", - "time" - ], - "placeholders": { - "date": {}, - "time": {} - } - }, - "outOfPoints": "{howMany,plural, =1{จาก 1 คะแนน}other{จาก {points} คะแนน}}", - "@outOfPoints": { - "description": "Description for an assignment grade that has points without a current scoroe", - "type": "text", - "placeholders_order": [ - "points", - "howMany" - ], - "placeholders": { - "points": {}, - "howMany": {} - } - }, - "Excused": "ได้รับการยกเว้น", - "@Excused": { - "description": "Grading status for an assignment marked as excused", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Complete": "เสร็จสิ้น", - "@Complete": { - "description": "Grading status for an assignment marked as complete", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Incomplete": "ไม่เสร็จสิ้น", - "@Incomplete": { - "description": "Grading status for an assignment marked as incomplete", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "minus": "ลบ", - "@minus": { - "description": "Screen reader-friendly replacement for the \"-\" character in letter grades like \"A-\"", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "latePenalty": "โทษปรับล่าช้า (-{pointsLost})", - "@latePenalty": { - "description": "Text displayed when a late penalty has been applied to the assignment", - "type": "text", - "placeholders_order": [ - "pointsLost" - ], - "placeholders": { - "pointsLost": {} - } - }, - "finalGrade": "เกรดสรุป: {grade}", - "@finalGrade": { - "description": "Text that displays the final grade of an assignment", - "type": "text", - "placeholders_order": [ - "grade" - ], - "placeholders": { - "grade": {} - } - }, - "Alert Settings": "ค่าการแจ้งเตือน", - "@Alert Settings": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Alert me when…": "แจ้งเตือนฉันเมื่อ...", - "@Alert me when…": { - "description": "Header for the screen where the observer chooses the thresholds that will determine when they receive alerts (e.g. when an assignment is graded below 70%)", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Course grade below": "บทเรียน เกรดน้อยกว่า", - "@Course grade below": { - "description": "Label describing the threshold for when the course grade is below a certain percentage", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Course grade above": "บทเรียน เกรดมากกว่า", - "@Course grade above": { - "description": "Label describing the threshold for when the course grade is above a certain percentage", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Assignment missing": "ไม่มีภารกิจ", - "@Assignment missing": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Assignment grade below": "เกรดภารกิจน้อยกว่า", - "@Assignment grade below": { - "description": "Label describing the threshold for when an assignment is graded below a certain percentage", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Assignment grade above": "เกรดภารกิจมากกว่า", - "@Assignment grade above": { - "description": "Label describing the threshold for when an assignment is graded above a certain percentage", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Course Announcements": "ประกาศเกี่ยวกับบทเรียน", - "@Course Announcements": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Institution Announcements": "ประกาศของสถาบัน", - "@Institution Announcements": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Never": "ไม่เลย", - "@Never": { - "description": "Indication that tells the user they will not receive alert notifications of a specific kind", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Grade percentage": "เปอร์เซ็นต์เกรด", - "@Grade percentage": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading your student's alerts.": "มีข้อผิดพลาดในการโหลดการแจ้งเตือนสำหรับผู้เรียนของคุณ", - "@There was an error loading your student's alerts.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Must be below 100": "จะต้องต่ำกว่า 100", - "@Must be below 100": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "mustBeBelowN": "จะต้องต่ำกว่า {percentage}", - "@mustBeBelowN": { - "description": "Validation error to the user that they must choose a percentage below 'n'", - "type": "text", - "placeholders_order": [ - "percentage" - ], - "placeholders": { - "percentage": { - "example": 5 - } - } - }, - "mustBeAboveN": "จะต้องมากกว่า {percentage}", - "@mustBeAboveN": { - "description": "Validation error to the user that they must choose a percentage above 'n'", - "type": "text", - "placeholders_order": [ - "percentage" - ], - "placeholders": { - "percentage": { - "example": 5 - } - } - }, - "Select Student Color": "เลือกสีของผู้เรียน", - "@Select Student Color": { - "description": "Title for screen that allows users to assign a color to a specific student", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Electric, blue": "อิเล็คทริค, น้ำเงิน", - "@Electric, blue": { - "description": "Name of the Electric (blue) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Plum, Purple": "พลัม, ม่วง", - "@Plum, Purple": { - "description": "Name of the Plum (purple) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Barney, Fuschia": "บาร์นีย์, ฟูเชีย", - "@Barney, Fuschia": { - "description": "Name of the Barney (fuschia) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Raspberry, Red": "ราสเบอร์รี่, แดง", - "@Raspberry, Red": { - "description": "Name of the Raspberry (red) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Fire, Orange": "ไฟเออร์, ส้ม", - "@Fire, Orange": { - "description": "Name of the Fire (orange) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Shamrock, Green": "ชัมร็อค, เขียว", - "@Shamrock, Green": { - "description": "Name of the Shamrock (green) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "An error occurred while saving your selection. Please try again.": "เกิดข้อผิดพลาดขณะบันทึกรายการที่คุณเลือก กรุณาลองใหม่อีกครั้งในภายหลัง", - "@An error occurred while saving your selection. Please try again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "changeStudentColorLabel": "เปลี่ยนสีสำหรับ {studentName}", - "@changeStudentColorLabel": { - "description": "Accessibility label for the button that lets users change the color associated with a specific student", - "type": "text", - "placeholders_order": [ - "studentName" - ], - "placeholders": { - "studentName": {} - } - }, - "Teacher": "ผู้สอน", - "@Teacher": { - "description": "Label for the Teacher enrollment type", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Student": "ผู้เรียน", - "@Student": { - "description": "Label for the Student enrollment type", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "TA": "TA", - "@TA": { - "description": "Label for the Teaching Assistant enrollment type (also known as Teacher Aid or Education Assistant), reduced to a short acronym/initialism if appropriate.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Observer": "ผู้สังเกตการณ์", - "@Observer": { - "description": "Label for the Observer enrollment type", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Use Camera": "ใช้กล้อง", - "@Use Camera": { - "description": "Label for the action item that lets the user capture a photo using the device camera", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Upload File": "อัพโหลดไฟล์", - "@Upload File": { - "description": "Label for the action item that lets the user upload a file from their device", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Choose from Gallery": "เลือกจากแกลเลอรี่", - "@Choose from Gallery": { - "description": "Label for the action item that lets the user select a photo from their device gallery", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Preparing…": "กำลังจัดเตรียม...", - "@Preparing…": { - "description": "Message shown while a file is being prepared to attach to a message", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Add student with…": "เพิ่มผู้เรียนกับ...", - "@Add student with…": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Add Student": "เพิ่มผู้เรียน", - "@Add Student": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You are not observing any students.": "คุณไม่ได้สังเกตการณ์ผู้เรียนรายใด", - "@You are not observing any students.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading your students.": "มีข้อผิดพลาดในการโหลดผู้เรียนของคุณ", - "@There was an error loading your students.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Pairing Code": "รหัสเข้าคู่", - "@Pairing Code": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Students can obtain a pairing code through the Canvas website": "ผู้เรียนสามารถขอรหัสเข้าคู่ได้จากเว็บไซต์ Canvas", - "@Students can obtain a pairing code through the Canvas website": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Enter the student pairing code provided to you. If the pairing code doesn't work, it may have expired": "กรอกรหัสเข้าคู่ของผู้เรียนที่แจ้งไว้กับคุณ หากรหัสเข้าคู่ไม่สามารถใช้ได้ แสดงว่าหมดอายุแล้ว", - "@Enter the student pairing code provided to you. If the pairing code doesn't work, it may have expired": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Your code is incorrect or expired.": "รหัสของคุณไม่ถูกต้องหรือหมดอายุแล้ว", - "@Your code is incorrect or expired.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Something went wrong trying to create your account, please reach out to your school for assistance.": "มีบางอย่างผิดพลาดขณะพยายามจัดทำบัญชีผู้ใช้ของคุณ กรุณาติดต่อสถานศึกษาของคุณเพื่อขอความช่วยเหลือ", - "@Something went wrong trying to create your account, please reach out to your school for assistance.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "QR Code": "รหัส QR", - "@QR Code": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Students can create a QR code using the Canvas Student app on their mobile device": "ผู้เรียนสามารถจัดทำรหัส QR โดยใช้แอพ Canvas Student ผ่านอุปกรณ์พกพาของตน", - "@Students can create a QR code using the Canvas Student app on their mobile device": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Add new student": "เพิ่มผู้เรียนใหม่", - "@Add new student": { - "description": "Semantics label for the FAB on the Manage Students Screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Select": "เลือก", - "@Select": { - "description": "Hint text to tell the user to choose one of two options", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I have a Canvas account": "ฉันมีบัญชี Canvas", - "@I have a Canvas account": { - "description": "Option to select for users that have a canvas account", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I don't have a Canvas account": "ฉันไม่มีบัญชี Canvas", - "@I don't have a Canvas account": { - "description": "Option to select for users that don't have a canvas account", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Create Account": "จัดทำบัญชีผู้ใช้", - "@Create Account": { - "description": "Button text for account creation confirmation", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Full Name": "ชื่อนามสกุล", - "@Full Name": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Email Address": "อีเมลแอดเดรส", - "@Email Address": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Password": "รหัสผ่าน", - "@Password": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Full Name…": "ชื่อนามสกุล...", - "@Full Name…": { - "description": "hint label for inside form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Email…": "อีเมล...", - "@Email…": { - "description": "hint label for inside form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Password…": "รหัสผ่าน...", - "@Password…": { - "description": "hint label for inside form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Please enter full name": "กรุณาระบุชื่อและนามสกุล", - "@Please enter full name": { - "description": "Error message for form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Please enter an email address": "กรุณากรอกอีเมลแอดเดรส", - "@Please enter an email address": { - "description": "Error message for form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Please enter a valid email address": "กรุณากรอกอีเมลแอดเดรสที่ถูกต้อง", - "@Please enter a valid email address": { - "description": "Error message for form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Password is required": "ต้องระบุรหัสผ่าน", - "@Password is required": { - "description": "Error message for form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Password must contain at least 8 characters": "รหัสผ่านต้องยาวอย่างน้อย 8 ตัวอักษร", - "@Password must contain at least 8 characters": { - "description": "Error message for form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "qrCreateAccountTos": "หลังจากกดเลือก “จัดทำบัญชีผู้ใช้” คุณยินยอมภายใต้ {termsOfService} และรับทราบเกี่ยวกับ {privacyPolicy}", - "@qrCreateAccountTos": { - "description": "The text show on the account creation screen", - "type": "text", - "placeholders_order": [ - "termsOfService", - "privacyPolicy" - ], - "placeholders": { - "termsOfService": {}, - "privacyPolicy": {} - } - }, - "Terms of Service": "เงื่อนไขการให้บริการ", - "@Terms of Service": { - "description": "Label for the Canvas Terms of Service agreement. This will be used in the qrCreateAccountTos text and will be highlighted and clickable", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Privacy Policy": "นโยบายความเป็นส่วนตัว", - "@Privacy Policy": { - "description": "Label for the Canvas Privacy Policy agreement. This will be used in the qrCreateAccountTos text and will be highlighted and clickable", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "View the Privacy Policy": "ดูนโยบายความเป็นส่วนตัว", - "@View the Privacy Policy": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Already have an account? ": "มีบัญชีอยู่แล้วหรือไม่ ", - "@Already have an account? ": { - "description": "Part of multiline text span, includes AccountSignIn1-2, in that order", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Sign In": "ลงชื่อเข้าใช้", - "@Sign In": { - "description": "Part of multiline text span, includes AccountSignIn1-2, in that order", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Hide Password": "ซ่อนรหัสผ่าน", - "@Hide Password": { - "description": "content description for password hide button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Show Password": "แสดงรหัสผ่าน", - "@Show Password": { - "description": "content description for password show button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Terms of Service Link": "ลิงค์เงื่อนไขการให้บริการ", - "@Terms of Service Link": { - "description": "content description for terms of service link", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Privacy Policy Link": "ลิงค์นโยบายความเป็นส่วนตัว", - "@Privacy Policy Link": { - "description": "content description for privacy policy link", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Event": "กิจกรรม", - "@Event": { - "description": "Title for the event details screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Date": "วันที่", - "@Date": { - "description": "Label for the event date", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Location": "ตำแหน่ง", - "@Location": { - "description": "Label for the location information", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Location Specified": "ไม่ได้ระบุตำแหน่ง", - "@No Location Specified": { - "description": "Description for events that do not have a location", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "eventTime": "{startAt} - {endAt}", - "@eventTime": { - "description": "The time the event is happening, example: \"2:00 pm - 4:00 pm\"", - "type": "text", - "placeholders_order": [ - "startAt", - "endAt" - ], - "placeholders": { - "startAt": {}, - "endAt": {} - } - }, - "Set a date and time to be notified of this event.": "กำหนดวันที่และเวลาที่จะแจ้งเกี่ยวกับกิจกรรมนี้", - "@Set a date and time to be notified of this event.": { - "description": "Description for row to set event reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You will be notified about this event on…": "คุณจะได้รรับแจ้งเกี่ยวกับกิจกรรมนี้เมื่อ...", - "@You will be notified about this event on…": { - "description": "Description for when an event reminder is set", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Share Your Love for the App": "แบ่งปันความชื่นชอบที่คุณมีเกี่ยวกับแอพ", - "@Share Your Love for the App": { - "description": "Label for option to open the app store", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Tell us about your favorite parts of the app": "บอกให้เราทราบเกี่ยวกับส่วนที่คุณชอบมากที่สุดเกี่ยวกับแอพ", - "@Tell us about your favorite parts of the app": { - "description": "Description for option to open the app store", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Legal": "ประเด็นทางกฎหมาย", - "@Legal": { - "description": "Label for legal information option", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Privacy policy, terms of use, open source": "นโยบายความเป็นส่วนตัว, เงื่อนไขการใช้งาน, สาธารณะ", - "@Privacy policy, terms of use, open source": { - "description": "Description for legal information option", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Idea for Canvas Parent App [Android]": "แนวคิดสำหรับแอพ Canvas Parent [Android]", - "@Idea for Canvas Parent App [Android]": { - "description": "The subject for the email to request a feature", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The following information will help us better understand your idea:": "ข้อมูลต่อไปนี้จะช่วยให้เราเข้าใจเกี่ยวกับแนวคิดของคุณได้ดียิ่งขึ้น:", - "@The following information will help us better understand your idea:": { - "description": "The header for the users information that is attached to a feature request", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Domain:": "โดเมน:", - "@Domain:": { - "description": "The label for the Canvas domain of the logged in user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "User ID:": "ID ผู้ใช้:", - "@User ID:": { - "description": "The label for the Canvas user ID of the logged in user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Email:": "อีเมล:", - "@Email:": { - "description": "The label for the eamil of the logged in user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Locale:": "พื้นที่:", - "@Locale:": { - "description": "The label for the locale of the logged in user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Terms of Use": "เงื่อนไขการใช้งาน", - "@Terms of Use": { - "description": "Label for the terms of use", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Canvas on GitHub": "Canvas on GitHub", - "@Canvas on GitHub": { - "description": "Label for the button that opens the Canvas project on GitHub's website", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was a problem loading the Terms of Use": "มีปัญหาในการโหลดเงื่อนไขการใช้งาน", - "@There was a problem loading the Terms of Use": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Device": "อุปกรณ์", - "@Device": { - "description": "Label used for device manufacturer/model in the error report", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "OS Version": "เวอร์ชั่น OS", - "@OS Version": { - "description": "Label used for device operating system version in the error report", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Version Number": "เลขเวอร์ชั่น", - "@Version Number": { - "description": "Label used for the app version number in the error report", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Report A Problem": "แจ้งปัญหา", - "@Report A Problem": { - "description": "Title used for generic dialog to report problems", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Subject": "หัวเรื่อง", - "@Subject": { - "description": "Label used for Subject text field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "A subject is required.": "ต้องระบุหัวเรื่อง", - "@A subject is required.": { - "description": "Error shown when the subject field is empty", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "An email address is required.": "ต้องระบุอีเมลแอดเดรส", - "@An email address is required.": { - "description": "Error shown when the email field is empty", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Description": "รายละเอียด", - "@Description": { - "description": "Label used for Description text field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "A description is required.": "ต้องระบุรายละเอียด", - "@A description is required.": { - "description": "Error shown when the description field is empty", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "How is this affecting you?": "สิ่งนี้มีผลกับคุณอย่างไร", - "@How is this affecting you?": { - "description": "Label used for the dropdown to select how severe the issue is", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "send": "ส่ง", - "@send": { - "description": "Label used for send button when reporting a problem", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Just a casual question, comment, idea, suggestion…": "แค่คำถาม ความเห็น แนวคิดหรือข้อเสนอแนะทั่ว ๆ ไป...", - "@Just a casual question, comment, idea, suggestion…": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I need some help but it's not urgent.": "ฉันต้องการความช่วยเหลือ แต่ไม่เร่งด่วนอะไร", - "@I need some help but it's not urgent.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Something's broken but I can work around it to get what I need done.": "มีบางอย่างไม่ถูกต้อง แต่ฉันสามารถแก้ไขได้", - "@Something's broken but I can work around it to get what I need done.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I can't get things done until I hear back from you.": "ฉันไม่สามารถดำเนินการใด ๆ ได้จนกว่าจะได้รับการติดต่อกลับจากคุณ", - "@I can't get things done until I hear back from you.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "EXTREME CRITICAL EMERGENCY!!": "กรณีฉุกเฉินอย่างยิ่ง!!", - "@EXTREME CRITICAL EMERGENCY!!": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Not Graded": "ไม่ได้ลงเกรด", - "@Not Graded": { - "description": "Description for an assignment has not been graded.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Login flow: Normal": "โครงสร้างการล็อกอิน: ปกติ", - "@Login flow: Normal": { - "description": "Description for the normal login flow", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Login flow: Canvas": "โครงสร้างการล็อกอิน: Canvas", - "@Login flow: Canvas": { - "description": "Description for the Canvas login flow", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Login flow: Site Admin": "โครงสร้างการล็อกอิน: ผู้ดูแลไซต์", - "@Login flow: Site Admin": { - "description": "Description for the Site Admin login flow", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Login flow: Skip mobile verify": "โครงสร้างการล็อกอิน: ข้ามการยืนยันผ่านอุปกรณ์พกพา", - "@Login flow: Skip mobile verify": { - "description": "Description for the login flow that skips domain verification for mobile", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Act As User": "ดำเนินการในฐานะผู้ใช้", - "@Act As User": { - "description": "Label for the button that allows the user to act (masquerade) as another user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Stop Acting as User": "หยุดดำเนินการในฐานะผู้ใช้", - "@Stop Acting as User": { - "description": "Label for the button that allows the user to stop acting (masquerading) as another user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "actingAsUser": "กำลังกำลังดำเนินการในฐานะ {userName}", - "@actingAsUser": { - "description": "Message shown while acting (masquerading) as another user", - "type": "text", - "placeholders_order": [ - "userName" - ], - "placeholders": { - "userName": {} - } - }, - "\"Act as\" is essentially logging in as this user without a password. You will be able to take any action as if you were this user, and from other users' points of views, it will be as if this user performed them. However, audit logs record that you were the one who performed the actions on behalf of this user.": "“ดำเนินการในฐานะ” เป็นการล็อกอินเป็นผู้ใช้รายนี้โดยไม่มีรหัสผ่าน คุณสามารถดำเนินการใด ๆ ก็ได้เสมือนเป็นผู้ใช้รายนี้ และผู้ใช้อื่น ๆ จะเข้าใจว่าผู้ใช้รายนี้เป็นผู้ดำเนินการ อย่างไรก็ตาม บันทึกประวัติจะมีจัดทำไว้เพื่อแจ้งว่าคุณเป็นบุคคลที่ดำเนินการในนามของผู้ใช้รายนี้", - "@\"Act as\" is essentially logging in as this user without a password. You will be able to take any action as if you were this user, and from other users' points of views, it will be as if this user performed them. However, audit logs record that you were the one who performed the actions on behalf of this user.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Domain": "โดเมน", - "@Domain": { - "description": "Text field hint for domain url input", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You must enter a valid domain": "คุณจะต้องกรอกโดเมนที่ถูกต้อง", - "@You must enter a valid domain": { - "description": "Message displayed for domain input error", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "User ID": "ID ผู้ใช้", - "@User ID": { - "description": "Text field hint for user ID input", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You must enter a user id": "คุณจะต้องกรอก id ผู้ใช้", - "@You must enter a user id": { - "description": "Message displayed for user Id input error", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error trying to act as this user. Please check the Domain and User ID and try again.": "มีข้อผิดพลาดในการดำเนินการในฐานะผู้ใช้รายนี้ กรุณาตรวจสอบโดเมนและ ID ผู้ใช้ และลองใหม่อีกครั้ง", - "@There was an error trying to act as this user. Please check the Domain and User ID and try again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "endMasqueradeMessage": "คุณจะหยุดดำเนินการในฐานะ {userName} และกลับไปที่บัญชีเดิมของคุณ", - "@endMasqueradeMessage": { - "description": "Confirmation message displayed when the user wants to stop acting (masquerading) as another user", - "type": "text", - "placeholders_order": [ - "userName" - ], - "placeholders": { - "userName": {} - } - }, - "endMasqueradeLogoutMessage": "คุณจะหยุดดำเนินการในฐานะ {userName} และออกจากระบบ", - "@endMasqueradeLogoutMessage": { - "description": "Confirmation message displayed when the user wants to stop acting (masquerading) as another user and will be logged out.", - "type": "text", - "placeholders_order": [ - "userName" - ], - "placeholders": { - "userName": {} - } - }, - "How are we doing?": "เราเป็นอย่างไรบ้าง", - "@How are we doing?": { - "description": "Title for dialog asking user to rate the app out of 5 stars.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Don't show again": "ไม่ต้องแสดงอีก", - "@Don't show again": { - "description": "Button to prevent the rating dialog from showing again.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "What can we do better?": "เราสามารถทำอะไรให้ดีกว่านี้", - "@What can we do better?": { - "description": "Hint text for providing a comment with the rating.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Send Feedback": "ส่งความเห็น", - "@Send Feedback": { - "description": "Button to send rating with feedback", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "ratingDialogEmailSubject": "ข้อเสนอแนะสำหรับ Android - Canvas Parent {version}", - "@ratingDialogEmailSubject": { - "description": "The subject for an email to provide feedback for CanvasParent.", - "type": "text", - "placeholders_order": [ - "version" - ], - "placeholders": { - "version": {} - } - }, - "starRating": "{position,plural, =1{{position} ดาว}other{{position} ดาว}}", - "@starRating": { - "description": "Accessibility label for the 1 stars to 5 stars rating", - "type": "text", - "placeholders_order": [ - "position" - ], - "placeholders": { - "position": { - "example": 1 - } - } - }, - "Student Pairing": "การเข้าคู่ผู้เรียน", - "@Student Pairing": { - "description": "Title for the screen where users can pair to students using a QR code", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Open Canvas Student": "เปิด Canvas Student", - "@Open Canvas Student": { - "description": "Title for QR pairing tutorial screen instructing users to open the Canvas Student app", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You'll need to open your student's Canvas Student app to continue. Go into Main Menu > Settings > Pair with Observer and scan the QR code you see there.": "คุณจะต้องเปิดแอพ Canvas Student ของผู้เรียนเพื่อดำเนินการต่อ ไปที่เมนูหลัก > ค่าปรับตั้ง > เข้าคู่กับผู้สังเกตการณ์ และสแกนรหัส QR ที่ปรากฏขึ้น", - "@You'll need to open your student's Canvas Student app to continue. Go into Main Menu > Settings > Pair with Observer and scan the QR code you see there.": { - "description": "Message explaining how QR code pairing works", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Screenshot showing location of pairing QR code generation in the Canvas Student app": "ภาพหน้าจอแสดงตำแหน่งการจัดทำรหัส QR สำหรับเข้าคู่ในแอพ Canvas Student", - "@Screenshot showing location of pairing QR code generation in the Canvas Student app": { - "description": "Content Description for qr pairing tutorial screenshot", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Expired QR Code": "รหัส QR หมดอายุ", - "@Expired QR Code": { - "description": "Error title shown when the users scans a QR code that has expired", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The QR code you scanned may have expired. Refresh the code on the student's device and try again.": "รหัส QR ที่คุณสแกนอาจหมดอายุแล้ว รีเฟรชรหัสจากอุปกรณ์ของผู้เรียนแล้วลองใหม่อีกครั้ง", - "@The QR code you scanned may have expired. Refresh the code on the student's device and try again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "A network error occurred when adding this student. Check your connection and try again.": "เกิดข้อผิดพลาดทางเครือข่ายขณะเพิ่มผู้เรียนนี้ ตรวจสอบการเชื่อมต่อและลองใหม่อีกครั้ง", - "@A network error occurred when adding this student. Check your connection and try again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Invalid QR Code": "รหัส QR ไม่ถูกต้อง", - "@Invalid QR Code": { - "description": "Error title shown when the user scans an invalid QR code", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Incorrect Domain": "โดเมนไม่ถูกต้อง", - "@Incorrect Domain": { - "description": "Error title shown when the users scane a QR code for a student that belongs to a different domain", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The student you are trying to add belongs to a different school. Log in or create an account with that school to scan this code.": "ผู้เรียนที่คุณพยายามเพิ่มเป็นของสถานศึกษาอื่น ล็อกอินหรือจัดทำบัญชีผู้ใช้กับทางสถานศึกษาดังกล่าวเพื่อสแกนรหัสนี้", - "@The student you are trying to add belongs to a different school. Log in or create an account with that school to scan this code.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Camera Permission": "สิทธิ์ใช้งานกล้อง", - "@Camera Permission": { - "description": "Error title shown when the user wans to scan a QR code but has denied the camera permission", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "This will unpair and remove all enrollments for this student from your account.": "นี่เป็นการเลิกการเข้าคู่และลบการลงทะเบียนทั้งหมดสำหรับผู้เรียนนี้จากบัญชีของคุณ", - "@This will unpair and remove all enrollments for this student from your account.": { - "description": "Confirmation message shown when the user tries to delete a student from their account", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was a problem removing this student from your account. Please check your connection and try again.": "มีปัญหาในการลบผู้เรียนนี้จากบัญชีของคุณ กรุณาตรวจสอบการเชื่อมต่อของคุณและลองใหม่อีกครั้ง", - "@There was a problem removing this student from your account. Please check your connection and try again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Cancel": "ยกเลิก", - "@Cancel": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "next": "ถัดไป", - "@next": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "ok": "OK", - "@ok": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Yes": "ใช่", - "@Yes": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No": "ไม่", - "@No": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Retry": "ลองใหม่", - "@Retry": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Delete": "ลบ", - "@Delete": { - "description": "Label used for general delete/remove actions", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Done": "เสร็จสิ้น", - "@Done": { - "description": "Label for general done/finished actions", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Refresh": "รีเฟรช", - "@Refresh": { - "description": "Label for button to refresh data from the web", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "View Description": "ดูรายละเอียด", - "@View Description": { - "description": "Button to view the description for an event or assignment", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "expanded": "ขยายแล้ว", - "@expanded": { - "description": "Description for the accessibility reader for list groups that are expanded", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "collapsed": "ย่อแล้ว", - "@collapsed": { - "description": "Description for the accessibility reader for list groups that are expanded", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "An unexpected error occurred": "เกิดข้อผิดพลาดที่ไม่คาดคิด", - "@An unexpected error occurred": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No description": "ไม่มีรายละเอียด", - "@No description": { - "description": "Message used when the assignment has no description", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Launch External Tool": "เรียกใช้ชุดเครื่องมือจากภายนอก", - "@Launch External Tool": { - "description": "Button text added to webviews to let users open external tools in their browser", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Interactions on this page are limited by your institution.": "การโต้ตอบในหน้าเพจนี้จำกัดไว้สำหรับสถาบันของคุณเท่านั้น", - "@Interactions on this page are limited by your institution.": { - "description": "Message describing how the webview has limited access due to an instution setting", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "dateAtTime": "{date} ที่ {time}", - "@dateAtTime": { - "description": "The string to format dates", - "type": "text", - "placeholders_order": [ - "date", - "time" - ], - "placeholders": { - "date": {}, - "time": {} - } - }, - "dueDateAtTime": "ครบกำหนด {date} เมื่อ {time}", - "@dueDateAtTime": { - "description": "The string to format due dates", - "type": "text", - "placeholders_order": [ - "date", - "time" - ], - "placeholders": { - "date": {}, - "time": {} - } - }, - "No Due Date": "ไม่มีวันครบกำหนด", - "@No Due Date": { - "description": "Label for assignments that do not have a due date", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Filter": "ตัวกรอง", - "@Filter": { - "description": "Label for buttons to filter what items are visible", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "unread": "ไม่ได้อ่าน", - "@unread": { - "description": "Label for things that are marked as unread", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "unreadCount": "{count} ที่ไม่ได้อ่าน", - "@unreadCount": { - "description": "Formatted string for when there are a number of unread items", - "type": "text", - "placeholders_order": [ - "count" - ], - "placeholders": { - "count": {} - } - }, - "badgeNumberPlus": "{count}+", - "@badgeNumberPlus": { - "description": "Formatted string for when too many items are being notified in a badge, generally something like: 99+", - "type": "text", - "placeholders_order": [ - "count" - ], - "placeholders": { - "count": {} - } - }, - "There was an error loading this announcement": "มีข้อผิดพลาดในการโหลดประกาศนี้", - "@There was an error loading this announcement": { - "description": "Message shown when an announcement detail screen fails to load", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Network error": "ข้อผิดพลาดเครือข่าย", - "@Network error": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Under Construction": "อยู่ระหว่างจัดทำ", - "@Under Construction": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "We are currently building this feature for your viewing pleasure.": "เรากำลังจัดทำคุณสมบัตินี้เพื่อให้คุณรับชมได้อย่างสะดวก", - "@We are currently building this feature for your viewing pleasure.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Request Login Help Button": "ปุ่มขอความช่วยเหลือในการล็อกอิน", - "@Request Login Help Button": { - "description": "Accessibility hint for button that opens help dialog for a login help request", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Request Login Help": "ขอความช่วยเหลือในการล็อกอิน", - "@Request Login Help": { - "description": "Title of help dialog for a login help request", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I'm having trouble logging in": "ฉันมีปัญหาในการล็อกอิน", - "@I'm having trouble logging in": { - "description": "Subject of help dialog for a login help request", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "An error occurred when trying to display this link": "เกิดข้อผิดพลาดขณะพยายามแสดงลิงค์นี้", - "@An error occurred when trying to display this link": { - "description": "Error message shown when a link can't be opened", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "We are unable to display this link, it may belong to an institution you currently aren't logged in to.": "เราไม่สามารถแสดงลิงค์นี้ เนื่องจากอาจเป็นของสถาบันที่คุณไม่ได้ล็อกอินอยู่ในปัจจุบัน", - "@We are unable to display this link, it may belong to an institution you currently aren't logged in to.": { - "description": "Description for error page shown when clicking a link", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Link Error": "ข้อผิดพลาดลิงค์", - "@Link Error": { - "description": "Title for error page shown when clicking a link", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Open In Browser": "เปิดในเบราเซอร์", - "@Open In Browser": { - "description": "Text for button to open a link in the browswer", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You'll find the QR code on the web in your account profile. Click 'QR for Mobile Login' in the list.": "คุณจะพบรหัส QR ในเว็บจากโพรไฟล์บัญชีของคุณ คลิกที่ “QR สำหรับล็อกอินผ่านอุปกรณ์พกพา” จากรายการ", - "@You'll find the QR code on the web in your account profile. Click 'QR for Mobile Login' in the list.": { - "description": "Text for qr login tutorial screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Locate QR Code": "ระบุตำแหน่งรหัส QR", - "@Locate QR Code": { - "description": "Text for qr login button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Please scan a QR code generated by Canvas": "กรุณาสแกนรหัส QR ที่จัดทำโดย Canvas", - "@Please scan a QR code generated by Canvas": { - "description": "Text for qr login error with incorrect qr code", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error logging in. Please generate another QR Code and try again.": "มีข้อผิดพลาดในการล็อกอิน กรุณาจัดทำรหัส QR อื่นและลองใหม่อีกครั้ง", - "@There was an error logging in. Please generate another QR Code and try again.": { - "description": "Text for qr login error", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Screenshot showing location of QR code generation in browser": "ภาพหน้าจอแสดงตำแหน่งการจัดทำรหัส QR ในเบราเซอร์", - "@Screenshot showing location of QR code generation in browser": { - "description": "Content Description for qr login tutorial screenshot", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "QR scanning requires camera access": "การสแกน QR จะต้องใช้กล้อง", - "@QR scanning requires camera access": { - "description": "placeholder for camera error for QR code scan", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The linked item is no longer available": "รายการที่เชื่อมโยงไม่พร้อมใช้งานอีกต่อไป", - "@The linked item is no longer available": { - "description": "error message when the alert could no be opened", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Message sent": "ส่งข้อความแล้ว", - "@Message sent": { - "description": "confirmation message on the screen when the user succesfully sends a message", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Acceptable Use Policy": "นโยบายการใช้งานที่ยอมรับได้", - "@Acceptable Use Policy": { - "description": "title for the acceptable use policy screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Submit": "ส่ง", - "@Submit": { - "description": "submit button title for acceptable use policy screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Either you're a new user or the Acceptable Use Policy has changed since you last agreed to it. Please agree to the Acceptable Use Policy before you continue.": "คุณเป็นผู้ใช้ใหม่หรือนโยบายการใช้งานที่ยอมรับได้ที่คุณตอบรับไว้ล่าสุดมีการเปลี่ยนแปลง กรุณาตอบรับนโยบายการใช้งานที่ยอมรับได้ก่อนดำเนินการต่อ", - "@Either you're a new user or the Acceptable Use Policy has changed since you last agreed to it. Please agree to the Acceptable Use Policy before you continue.": { - "description": "acceptable use policy screen description", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I agree to the Acceptable Use Policy.": "ฉันยอมรับนโยบายการใช้งานที่ยอมรับได้", - "@I agree to the Acceptable Use Policy.": { - "description": "acceptable use policy switch title", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "About": "เกี่ยวกับ", - "@About": { - "description": "Title for about menu item in settings", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "App": "แอพ", - "@App": { - "description": "Title for App field on about page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Login ID": "ID ล็อกอิน", - "@Login ID": { - "description": "Title for Login ID field on about page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Email": "อีเมล", - "@Email": { - "description": "Title for Email field on about page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Version": "เวอร์ชั่น", - "@Version": { - "description": "Title for Version field on about page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Instructure logo": "โลโก้ Instructure", - "@Instructure logo": { - "description": "Semantics label for the Instructure logo on the about page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - } -} \ No newline at end of file diff --git a/apps/flutter_parent/lib/l10n/res/intl_vi.arb b/apps/flutter_parent/lib/l10n/res/intl_vi.arb deleted file mode 100644 index 13ce5f0ccf..0000000000 --- a/apps/flutter_parent/lib/l10n/res/intl_vi.arb +++ /dev/null @@ -1,2753 +0,0 @@ -{ - "@@last_modified": "2023-08-25T11:04:20.901151", - "alertsLabel": "Cảnh Báo", - "@alertsLabel": { - "description": "The label for the Alerts tab", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "calendarLabel": "Lịch", - "@calendarLabel": { - "description": "The label for the Calendar tab", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "coursesLabel": "Khóa Học", - "@coursesLabel": { - "description": "The label for the Courses tab", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Students": "Không Có Sinh Viên", - "@No Students": { - "description": "Text for when an observer has no students they are observing", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Tap to show student selector": "Nhấn vào để hiển thị bộ chọn sinh viên", - "@Tap to show student selector": { - "description": "Semantics label for the area that will show the student selector when tapped", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Tap to pair with a new student": "Nhấn vào để ghép cặp với sinh viên mới", - "@Tap to pair with a new student": { - "description": "Semantics label for the add student button in the student selector", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Tap to select this student": "Nhấn vào để chọn sinh viên này", - "@Tap to select this student": { - "description": "Semantics label on individual students in the student switcher", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Manage Students": "Quản Lý Sinh Viên", - "@Manage Students": { - "description": "Label text for the Manage Students nav drawer button as well as the title for the Manage Students screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Help": "Trợ Giúp", - "@Help": { - "description": "Label text for the help nav drawer button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Log Out": "Đăng Xuất", - "@Log Out": { - "description": "Label text for the Log Out nav drawer button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Switch Users": "Chuyển Người Dùng", - "@Switch Users": { - "description": "Label text for the Switch Users nav drawer button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "appVersion": "v. {version}", - "@appVersion": { - "description": "App version shown in the navigation drawer", - "type": "text", - "placeholders_order": [ - "version" - ], - "placeholders": { - "version": {} - } - }, - "Are you sure you want to log out?": "Bạn có chắc chắn muốn đăng xuất không?", - "@Are you sure you want to log out?": { - "description": "Confirmation message displayed when the user tries to log out", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Calendars": "Lịch", - "@Calendars": { - "description": "Label for button that lets users select which calendars to display", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "nextMonth": "Tháng tiếp theo: {month}", - "@nextMonth": { - "description": "Label for the button that switches the calendar to the next month", - "type": "text", - "placeholders_order": [ - "month" - ], - "placeholders": { - "month": {} - } - }, - "previousMonth": "Tháng trước: {month}", - "@previousMonth": { - "description": "Label for the button that switches the calendar to the previous month", - "type": "text", - "placeholders_order": [ - "month" - ], - "placeholders": { - "month": {} - } - }, - "nextWeek": "Tuần tiếp theo bắt đầu {date}", - "@nextWeek": { - "description": "Label for the button that switches the calendar to the next week", - "type": "text", - "placeholders_order": [ - "date" - ], - "placeholders": { - "date": {} - } - }, - "previousWeek": "Tuần trước bắt đầu {date}", - "@previousWeek": { - "description": "Label for the button that switches the calendar to the previous week", - "type": "text", - "placeholders_order": [ - "date" - ], - "placeholders": { - "date": {} - } - }, - "selectedMonthLabel": "Tháng {month}", - "@selectedMonthLabel": { - "description": "Accessibility label for the button that expands/collapses the month view", - "type": "text", - "placeholders_order": [ - "month" - ], - "placeholders": { - "month": {} - } - }, - "expand": "mở rộng", - "@expand": { - "description": "Accessibility label for the on-tap hint for the button that expands/collapses the month view", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "collapse": "thu gọn", - "@collapse": { - "description": "Accessibility label for the on-tap hint for the button that expands/collapses the month view", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "pointsPossible": "{points} điểm có thể đạt", - "@pointsPossible": { - "description": "Screen reader label used for the points possible for an assignment, quiz, etc.", - "type": "text", - "placeholders_order": [ - "points" - ], - "placeholders": { - "points": {} - } - }, - "calendarDaySemanticsLabel": "{eventCount,plural, =1{{date}, {eventCount} sự kiện}other{{date}, {eventCount} sự kiện}}", - "@calendarDaySemanticsLabel": { - "description": "Screen reader label used for calendar day, reads the date and count of events", - "type": "text", - "placeholders_order": [ - "date", - "eventCount" - ], - "placeholders": { - "date": {}, - "eventCount": {} - } - }, - "No Events Today!": "Không Có Sự Kiện Hôm Nay!", - "@No Events Today!": { - "description": "Title displayed when there are no calendar events for the current day", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "It looks like a great day to rest, relax, and recharge.": "Có vẻ là một ngày tuyệt vời để nghỉ ngơi, thư giãn và hồi sức.", - "@It looks like a great day to rest, relax, and recharge.": { - "description": "Message displayed when there are no calendar events for the current day", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading your student's calendar": "Đã xảy ra lỗi khi tải lịch của sinh viên của bạn", - "@There was an error loading your student's calendar": { - "description": "Message displayed when calendar events could not be loaded for the current student", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Tap to favorite the courses you want to see on the Calendar. Select up to 10.": "Hãy nhấn vào để cài đặt khóa học bạn muốn thấy trên Lịch làm mục ưa thích. Chọn tối đa 10.", - "@Tap to favorite the courses you want to see on the Calendar. Select up to 10.": { - "description": "Description text on calendar filter screen.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You may only choose 10 calendars to display": "Bạn chỉ được chọn 10 bộ lịch để hiển thị", - "@You may only choose 10 calendars to display": { - "description": "Error text when trying to select more than 10 calendars", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You must select at least one calendar to display": "Bạn phải chọn ít nhất một bộ lịch để hiển thị", - "@You must select at least one calendar to display": { - "description": "Error text when trying to de-select all calendars", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Planner Note": "Ghi Chú Trình Hoạch Định", - "@Planner Note": { - "description": "Label used for notes in the planner", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Go to today": "Đi đến hôm nay", - "@Go to today": { - "description": "Accessibility label used for the today button in the planner", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Previous Logins": "Lần Đăng Nhập Trước", - "@Previous Logins": { - "description": "Label for the list of previous user logins", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "canvasLogoLabel": "Biểu trưng Canvas", - "@canvasLogoLabel": { - "description": "The semantics label for the Canvas logo", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "findSchool": "Tìm Trường", - "@findSchool": { - "description": "Text for the find-my-school button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "findAnotherSchool": "Tìm trường khác", - "@findAnotherSchool": { - "description": "Text for the find-another-school button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "domainSearchInputHint": "Nhập tên trường hoặc học khu...", - "@domainSearchInputHint": { - "description": "Input hint for the text box on the domain search screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "noDomainResults": "Không tìm thấy trường khớp với \"{query}\"", - "@noDomainResults": { - "description": "Message shown to users when the domain search query did not return any results", - "type": "text", - "placeholders_order": [ - "query" - ], - "placeholders": { - "query": {} - } - }, - "domainSearchHelpLabel": "Làm thế nào để tìm trường hoặc học khu của tôi?", - "@domainSearchHelpLabel": { - "description": "Label for the help button on the domain search screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "canvasGuides": "Hướng Dẫn Canvas", - "@canvasGuides": { - "description": "Proper name for the Canvas Guides. This will be used in the domainSearchHelpBody text and will be highlighted and clickable", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "canvasSupport": "Bộ phận Hỗ Trợ của Canvas", - "@canvasSupport": { - "description": "Proper name for Canvas Support. This will be used in the domainSearchHelpBody text and will be highlighted and clickable", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "domainSearchHelpBody": "Hãy thử tìm tên trường hoặc học khu bạn đang muốn truy cập, ví dụ như “Smith Private School” hoặc “Smith County Schools.” Bạn cũng có thể nhập trực tiếp tên miền Canvas, ví dụ như “smith.instructure.com.”\n\nĐể biết thêm thông tin về cách tìm tài khoản Canvas của tổ chức của bạn, bạn cũng có thể truy cập {canvasGuides}, liên hệ {canvasSupport}, hoặc liên hệ trường của bạn để được hỗ trợ.", - "@domainSearchHelpBody": { - "description": "The body text shown in the help dialog on the domain search screen", - "type": "text", - "placeholders_order": [ - "canvasGuides", - "canvasSupport" - ], - "placeholders": { - "canvasGuides": {}, - "canvasSupport": {} - } - }, - "Uh oh!": "Rất tiếc!", - "@Uh oh!": { - "description": "Title of the screen that shows when a crash has occurred", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "We’re not sure what happened, but it wasn’t good. Contact us if this keeps happening.": "Chúng tôi không chắc đã xảy ra vấn đề gì nhưng chắc chắn là không ổn. Hãy liên hệ chúng tôi nếu tình trạng này vẫn tiếp diễn.", - "@We’re not sure what happened, but it wasn’t good. Contact us if this keeps happening.": { - "description": "Message shown when a crash has occurred", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Contact Support": "Liên Hệ Hỗ Trợ", - "@Contact Support": { - "description": "Label for the button that allows users to contact support after a crash has occurred", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "View error details": "Xem chi tiết lỗi", - "@View error details": { - "description": "Label for the button that allowed users to view crash details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Restart app": "Khởi động lại ứng dụng", - "@Restart app": { - "description": "Label for the button that will restart the entire application", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Application version": "Phiên bản ứng dụng", - "@Application version": { - "description": "Label for the application version displayed in the crash details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Device model": "Model thiết bị", - "@Device model": { - "description": "Label for the device model displayed in the crash details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Android OS version": "Phiên bản HĐH Android", - "@Android OS version": { - "description": "Label for the Android operating system version displayed in the crash details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Full error message": "Thông báo lỗi đầy đủ", - "@Full error message": { - "description": "Label for the full error message displayed in the crash details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Inbox": "Hộp Thư Đến", - "@Inbox": { - "description": "Title for the Inbox screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading your inbox messages.": "Đã xảy ra lỗi khi tải tin nhắn trong hộp thư đến của bạn.", - "@There was an error loading your inbox messages.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Subject": "Không Có Tiêu Đề", - "@No Subject": { - "description": "Title used for inbox messages that have no subject", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unable to fetch courses. Please check your connection and try again.": "Không thể tìm nạp khóa học. Vui lòng kiểm tra kết nối của bạn rồi thử lại.", - "@Unable to fetch courses. Please check your connection and try again.": { - "description": "Message shown when an error occured while loading courses", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Choose a course to message": "Chọn khóa học để nhắn tin", - "@Choose a course to message": { - "description": "Header in the course list shown when the user is choosing which course to associate with a new message", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Inbox Zero": "Hộp Thư Đến Zero", - "@Inbox Zero": { - "description": "Title of the message shown when there are no inbox messages", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You’re all caught up!": "Bạn đã bắt kịp mọi thứ!", - "@You’re all caught up!": { - "description": "Subtitle of the message shown when there are no inbox messages", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading recipients for this course": "Đã xảy ra lỗi khi tải người nhận cho khóa học này", - "@There was an error loading recipients for this course": { - "description": "Message shown when attempting to create a new message but the recipients list failed to load", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unable to send message. Check your connection and try again.": "Không thể gửi tin nhắn. Hãy kiểm tra kết nối của bạn rồi thử lại.", - "@Unable to send message. Check your connection and try again.": { - "description": "Message show when there was an error creating or sending a new message", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unsaved changes": "Thay đổi chưa lưu", - "@Unsaved changes": { - "description": "Title of the dialog shown when the user tries to leave with unsaved changes", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Are you sure you wish to close this page? Your unsent message will be lost.": "Bạn có chắc chắn muốn đóng trang này không? Tin nhắn chưa gửi của bạn sẽ bị mất.", - "@Are you sure you wish to close this page? Your unsent message will be lost.": { - "description": "Body text of the dialog shown when the user tries leave with unsaved changes", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "New message": "Tin nhắn mới", - "@New message": { - "description": "Title of the new-message screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Add attachment": "Thêm tập tin đính kèm", - "@Add attachment": { - "description": "Tooltip for the add-attachment button in the new-message screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Send message": "Gửi tin nhắn", - "@Send message": { - "description": "Tooltip for the send-message button in the new-message screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Select recipients": "Chọn người nhận", - "@Select recipients": { - "description": "Tooltip for the button that allows users to select message recipients", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No recipients selected": "Chưa chọn người nhận", - "@No recipients selected": { - "description": "Hint displayed when the user has not selected any message recipients", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Message subject": "Tiêu đề tin nhắn", - "@Message subject": { - "description": "Hint text displayed in the input field for the message subject", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Message": "Tin Nhắn", - "@Message": { - "description": "Hint text displayed in the input field for the message body", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Recipients": "Người Nhận", - "@Recipients": { - "description": "Label for message recipients", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "plusRecipientCount": "+{count}", - "@plusRecipientCount": { - "description": "Shows the number of recipients that are selected but not displayed on screen.", - "type": "text", - "placeholders_order": [ - "count" - ], - "placeholders": { - "count": { - "example": 5 - } - } - }, - "Failed. Tap for options.": "Thất bại. Nhấn vào để xem tùy chọn.", - "@Failed. Tap for options.": { - "description": "Short message shown on a message attachment when uploading has failed", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "courseForWhom": "cho {studentShortName}", - "@courseForWhom": { - "description": "Describes for whom a course is for (i.e. for Bill)", - "type": "text", - "placeholders_order": [ - "studentShortName" - ], - "placeholders": { - "studentShortName": {} - } - }, - "messageLinkPostscript": "Về việc: {studentName}, {linkUrl}", - "@messageLinkPostscript": { - "description": "A postscript appended to new messages that clarifies which student is the subject of the message and also includes a URL for the related Canvas component (course, assignment, event, etc).", - "type": "text", - "placeholders_order": [ - "studentName", - "linkUrl" - ], - "placeholders": { - "studentName": {}, - "linkUrl": {} - } - }, - "There was an error loading this conversation": "Đã xảy ra lỗi khi tải cuộc trò chuyện này", - "@There was an error loading this conversation": { - "description": "Message shown when a conversation fails to load", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Reply": "Câu Trả Lời", - "@Reply": { - "description": "Button label for replying to a conversation", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Reply All": "Trả Lời Tất Cả", - "@Reply All": { - "description": "Button label for replying to all conversation participants", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unknown User": "Người dùng không xác định", - "@Unknown User": { - "description": "Label used where the user name is not known", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "me": "tôi", - "@me": { - "description": "First-person pronoun (i.e. 'me') that will be used in message author info, e.g. 'Me to 4 others' or 'Jon Snow to me'", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "authorToRecipient": "{authorName} đến {recipientName}", - "@authorToRecipient": { - "description": "Author info for a single-recipient message; includes both the author name and the recipient name.", - "type": "text", - "placeholders_order": [ - "authorName", - "recipientName" - ], - "placeholders": { - "authorName": {}, - "recipientName": {} - } - }, - "authorToNOthers": "{howMany,plural, =1{{authorName} đến 1 người khác}other{{authorName} đến {howMany} người khác}}", - "@authorToNOthers": { - "description": "Author info for a mutli-recipient message; includes the author name and the number of recipients", - "type": "text", - "placeholders_order": [ - "authorName", - "howMany" - ], - "placeholders": { - "authorName": {}, - "howMany": {} - } - }, - "authorToRecipientAndNOthers": "{howMany,plural, =1{{authorName} đến {recipientName} & 1 người khác}other{{authorName} đến {recipientName} & {howMany} người khác}}", - "@authorToRecipientAndNOthers": { - "description": "Author info for a multi-recipient message; includes the author name, one recipient name, and the number of other recipients", - "type": "text", - "placeholders_order": [ - "authorName", - "recipientName", - "howMany" - ], - "placeholders": { - "authorName": {}, - "recipientName": {}, - "howMany": {} - } - }, - "Download": "Tải Xuống", - "@Download": { - "description": "Label for the button that will begin downloading a file", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Open with another app": "Mở bằng ứng dụng khác", - "@Open with another app": { - "description": "Label for the button that will allow users to open a file with another app", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There are no installed applications that can open this file": "Không có ứng dụng được cài đặt nào có thể mở tập tin này", - "@There are no installed applications that can open this file": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unsupported File": "Tập Tin Không Được Hỗ Trợ", - "@Unsupported File": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "This file is unsupported and can’t be viewed through the app": "Tập tin này không được hỗ trợ và không thể xem bằng ứng dụng", - "@This file is unsupported and can’t be viewed through the app": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unable to play this media file": "Không thể phát tập tin phương tiện này", - "@Unable to play this media file": { - "description": "Message shown when audio or video media could not be played", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unable to load this image": "Không thể tải hình ảnh này", - "@Unable to load this image": { - "description": "Message shown when an image file could not be loaded or displayed", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading this file": "Đã xảy ra lỗi khi tải tập tin này", - "@There was an error loading this file": { - "description": "Message shown when a file could not be loaded or displayed", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Courses": "Không Có Khóa Học", - "@No Courses": { - "description": "Title for having no courses", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Your student’s courses might not be published yet.": "Khóa học của bạn có thể chưa được phát hành.", - "@Your student’s courses might not be published yet.": { - "description": "Message for having no courses", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading your student’s courses.": "Đã xảy ra lỗi khi tải khóa học của sinh viên.", - "@There was an error loading your student’s courses.": { - "description": "Message displayed when the list of student courses could not be loaded", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Grade": "Không Có Lớp", - "@No Grade": { - "description": "Message shown when there is currently no grade available for a course", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Filter by": "Lọc theo", - "@Filter by": { - "description": "Title for list of terms to filter grades by", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Grades": "Điểm", - "@Grades": { - "description": "Label for the \"Grades\" tab in course details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Syllabus": "Chương Trình Học", - "@Syllabus": { - "description": "Label for the \"Syllabus\" tab in course details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Front Page": "Trang Đầu", - "@Front Page": { - "description": "Label for the \"Front Page\" tab in course details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Summary": "Tóm Tắt", - "@Summary": { - "description": "Label for the \"Summary\" tab in course details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Send a message about this course": "Gửi tin nhắn về khóa học này", - "@Send a message about this course": { - "description": "Accessibility hint for the course messaage floating action button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Total Grade": "Tổng Điểm", - "@Total Grade": { - "description": "Label for the total grade in the course", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Graded": "Đã Chấm Điểm", - "@Graded": { - "description": "Label for assignments that have been graded", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Submitted": "Đã Nộp", - "@Submitted": { - "description": "Label for assignments that have been submitted", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Not Submitted": "Chưa Nộp", - "@Not Submitted": { - "description": "Label for assignments that have not been submitted", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Late": "Trễ", - "@Late": { - "description": "Label for assignments that have been marked late or submitted late", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Missing": "Bị Thiếu", - "@Missing": { - "description": "Label for assignments that have been marked missing or are not submitted and past the due date", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "-": "-", - "@-": { - "description": "Value representing no score for student submission", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "All Grading Periods": "Tất Cả Thời Gian Phân Loại Điểm", - "@All Grading Periods": { - "description": "Label for selecting all grading periods", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Assignments": "Không Có Bài Tập", - "@No Assignments": { - "description": "Title for the no assignments message", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "It looks like assignments haven't been created in this space yet.": "Có vẻ bài tập chưa được tạo trong không gian này.", - "@It looks like assignments haven't been created in this space yet.": { - "description": "Message for no assignments", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading the summary details for this course.": "Đã xảy ra lỗi khi tải chi tiết tóm tắt cho khóa học này.", - "@There was an error loading the summary details for this course.": { - "description": "Message shown when the course summary could not be loaded", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Summary": "Không Có Tóm Tắt", - "@No Summary": { - "description": "Title displayed when there are no items in the course summary", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "This course does not have any assignments or calendar events yet.": "Khóa học này chưa có bất kỳ bài tập hoặc sự kiện lịch nào.", - "@This course does not have any assignments or calendar events yet.": { - "description": "Message displayed when there are no items in the course summary", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "gradeFormatScoreOutOfPointsPossible": "{score} / {pointsPossible}", - "@gradeFormatScoreOutOfPointsPossible": { - "description": "Formatted string for a student score out of the points possible", - "type": "text", - "placeholders_order": [ - "score", - "pointsPossible" - ], - "placeholders": { - "score": {}, - "pointsPossible": {} - } - }, - "contentDescriptionScoreOutOfPointsPossible": "{score} trên tổng số {pointsPossible} điểm thành phần", - "@contentDescriptionScoreOutOfPointsPossible": { - "description": "Formatted string for a student score out of the points possible", - "type": "text", - "placeholders_order": [ - "score", - "pointsPossible" - ], - "placeholders": { - "score": {}, - "pointsPossible": {} - } - }, - "gradesSubjectMessage": "Về việc: {studentName}, Điểm", - "@gradesSubjectMessage": { - "description": "The subject line for a message to a teacher regarding a student's grades", - "type": "text", - "placeholders_order": [ - "studentName" - ], - "placeholders": { - "studentName": {} - } - }, - "syllabusSubjectMessage": "Về việc: {studentName}, Chương Trình Học", - "@syllabusSubjectMessage": { - "description": "The subject line for a message to a teacher regarding a course syllabus", - "type": "text", - "placeholders_order": [ - "studentName" - ], - "placeholders": { - "studentName": {} - } - }, - "frontPageSubjectMessage": "Về việc: {studentName}, Trang Đầu", - "@frontPageSubjectMessage": { - "description": "The subject line for a message to a teacher regarding a course front page", - "type": "text", - "placeholders_order": [ - "studentName" - ], - "placeholders": { - "studentName": {} - } - }, - "assignmentSubjectMessage": "Về việc: {studentName}, Bài Tập - {assignmentName}", - "@assignmentSubjectMessage": { - "description": "The subject line for a message to a teacher regarding a student's assignment", - "type": "text", - "placeholders_order": [ - "studentName", - "assignmentName" - ], - "placeholders": { - "studentName": {}, - "assignmentName": {} - } - }, - "eventSubjectMessage": "Về việc: {studentName}, Sự Kiện - {eventTitle}", - "@eventSubjectMessage": { - "description": "The subject line for a message to a teacher regarding a calendar event", - "type": "text", - "placeholders_order": [ - "studentName", - "eventTitle" - ], - "placeholders": { - "studentName": {}, - "eventTitle": {} - } - }, - "There is no page information available.": "Không có thông tin trang nào có thể sử dụng.", - "@There is no page information available.": { - "description": "Description for when no page information is available", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Assignment Details": "Chi Tiết Bài Tập", - "@Assignment Details": { - "description": "Title for the page that shows details for an assignment", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "assignmentTotalPoints": "{points} điểm", - "@assignmentTotalPoints": { - "description": "Label used for the total points the assignment is worth", - "type": "text", - "placeholders_order": [ - "points" - ], - "placeholders": { - "points": {} - } - }, - "assignmentTotalPointsAccessible": "{points} điểm", - "@assignmentTotalPointsAccessible": { - "description": "Screen reader label used for the total points the assignment is worth", - "type": "text", - "placeholders_order": [ - "points" - ], - "placeholders": { - "points": {} - } - }, - "Due": "Hạn", - "@Due": { - "description": "Label for an assignment due date", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Grade": "Lớp", - "@Grade": { - "description": "Label for the section that displays an assignment's grade", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Locked": "Bị Khóa", - "@Locked": { - "description": "Label for when an assignment is locked", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "assignmentLockedModule": "Bài tập này bị khóa bởi học phần \"{moduleName}\".", - "@assignmentLockedModule": { - "description": "The locked description when an assignment is locked by a module", - "type": "text", - "placeholders_order": [ - "moduleName" - ], - "placeholders": { - "moduleName": {} - } - }, - "Remind Me": "Nhắc Tôi", - "@Remind Me": { - "description": "Label for the row to set reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Set a date and time to be notified of this specific assignment.": "Cài đặt ngày và giờ để được thông báo về bài tập cụ thể này.", - "@Set a date and time to be notified of this specific assignment.": { - "description": "Description for row to set reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You will be notified about this assignment on…": "Bạn sẽ được thông báo về bài tập này vào...", - "@You will be notified about this assignment on…": { - "description": "Description for when a reminder is set", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Instructions": "Chỉ Dẫn", - "@Instructions": { - "description": "Label for the description of the assignment when it has quiz instructions", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Send a message about this assignment": "Gửi tin nhắn về bài tập này", - "@Send a message about this assignment": { - "description": "Accessibility hint for the assignment messaage floating action button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "This app is not authorized for use.": "Ứng dụng này chưa được cấp phép sử dụng.", - "@This app is not authorized for use.": { - "description": "The error shown when the app being used is not verified by Canvas", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The server you entered is not authorized for this app.": "Máy chủ bạn đã nhập chưa được cấp phép sử dụng cho ứng dụng này.", - "@The server you entered is not authorized for this app.": { - "description": "The error shown when the desired login domain is not verified by Canvas", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The user agent for this app is not authorized.": "Tác nhân người dùng cho ứng dụng này chưa được cấp phép.", - "@The user agent for this app is not authorized.": { - "description": "The error shown when the user agent during verification is not verified by Canvas", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "We were unable to verify the server for use with this app.": "Chúng tôi không thể xác minh máy chủ để sử dụng với ứng dụng này.", - "@We were unable to verify the server for use with this app.": { - "description": "The generic error shown when we are unable to verify with Canvas", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Reminders": "Lời Nhắc Nhở", - "@Reminders": { - "description": "Name of the system notification channel for assignment and event reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Notifications for reminders about assignments and calendar events": "Thông báo cho lời nhắc nhở về bài tập và sự kiện lịch", - "@Notifications for reminders about assignments and calendar events": { - "description": "Description of the system notification channel for assignment and event reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Reminders have changed!": "Lời nhắc nhở đã thay đổi!", - "@Reminders have changed!": { - "description": "Title of the dialog shown when the user needs to update their reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "In order to provide you with a better experience, we have updated how reminders work. You can add new reminders by viewing an assignment or calendar event and tapping the switch under the \"Remind Me\" section.\n\nBe aware that any reminders created with older versions of this app will not be compatible with the new changes and you will need to create them again.": "Để đem đến cho bạn trải nghiệm tốt hơn, chúng tôi đã cập nhật cách thức hoạt động của lời nhắc nhở. Bạn có thể thêm lời nhắc nhở mới bằng cách xem bài tập hoặc sự kiện lịch rồi nhấn vào công tắc bên dưới phần \"Nhắc Tôi\" section.\n\nHãy lưu ý rằng mọi lời nhắc nhở được tạo bằng các phiên bản cũ hơn của ứng dụng này sẽ không tương thích với các thay đổi mới và bạn sẽ cần tạo lại các lời nhắc nhở đó.", - "@In order to provide you with a better experience, we have updated how reminders work. You can add new reminders by viewing an assignment or calendar event and tapping the switch under the \"Remind Me\" section.\n\nBe aware that any reminders created with older versions of this app will not be compatible with the new changes and you will need to create them again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Not a parent?": "Không phải phụ huynh?", - "@Not a parent?": { - "description": "Title for the screen that shows when the user is not observing any students", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "We couldn't find any students associated with this account": "Chúng tôi không tìm thấy bất kỳ sinh viên nào liên quan đến tài khoản này", - "@We couldn't find any students associated with this account": { - "description": "Subtitle for the screen that shows when the user is not observing any students", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Are you a student or teacher?": "Bạn là sinh viên hay giáo viên?", - "@Are you a student or teacher?": { - "description": "Label for button that will show users the option to view other Canvas apps in the Play Store", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "One of our other apps might be a better fit. Tap one to visit the Play Store.": "Một trong các ứng dụng khác có thể thích hợp hơn. Nhấn vào một để truy cập Play Store.", - "@One of our other apps might be a better fit. Tap one to visit the Play Store.": { - "description": "Description of options to view other Canvas apps in the Play Store", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Return to Login": "Quay lại Đăng Nhập", - "@Return to Login": { - "description": "Label for the button that returns the user to the login screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "STUDENT": "SINH VIÊN", - "@STUDENT": { - "description": "The \"student\" portion of the \"Canvas Student\" app name, in all caps. \"Canvas\" is excluded in this context as it will be displayed to the user as a wordmark image", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "TEACHER": "GIÁO VIÊN", - "@TEACHER": { - "description": "The \"teacher\" portion of the \"Canvas Teacher\" app name, in all caps. \"Canvas\" is excluded in this context as it will be displayed to the user as a wordmark image", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Canvas Student": "Canvas Student", - "@Canvas Student": { - "description": "The name of the Canvas Student app. Only \"Student\" should be translated as \"Canvas\" is a brand name in this context and should not be translated.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Canvas Teacher": "Canvas Teacher", - "@Canvas Teacher": { - "description": "The name of the Canvas Teacher app. Only \"Teacher\" should be translated as \"Canvas\" is a brand name in this context and should not be translated.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Alerts": "Không Có Cảnh Báo", - "@No Alerts": { - "description": "The title for the empty message to show to users when there are no alerts for the student.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There’s nothing to be notified of yet.": "Chưa có gì để được thông báo.", - "@There’s nothing to be notified of yet.": { - "description": "The empty message to show to users when there are no alerts for the student.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "dismissAlertLabel": "Bỏ {alertTitle}", - "@dismissAlertLabel": { - "description": "Accessibility label to dismiss an alert", - "type": "text", - "placeholders_order": [ - "alertTitle" - ], - "placeholders": { - "alertTitle": {} - } - }, - "Course Announcement": "Thông Báo Khóa Học", - "@Course Announcement": { - "description": "Title for alerts when there is a course announcement", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Institution Announcement": "Thông Báo Tổ Chức", - "@Institution Announcement": { - "description": "Title for alerts when there is an institution announcement", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "assignmentGradeAboveThreshold": "Điểm Bài Tập Trên {threshold}", - "@assignmentGradeAboveThreshold": { - "description": "Title for alerts when an assignment grade is above the threshold value", - "type": "text", - "placeholders_order": [ - "threshold" - ], - "placeholders": { - "threshold": {} - } - }, - "assignmentGradeBelowThreshold": "Điểm Bài Tập Dưới {threshold}", - "@assignmentGradeBelowThreshold": { - "description": "Title for alerts when an assignment grade is below the threshold value", - "type": "text", - "placeholders_order": [ - "threshold" - ], - "placeholders": { - "threshold": {} - } - }, - "courseGradeAboveThreshold": "Điểm Khóa Học Trên {threshold}", - "@courseGradeAboveThreshold": { - "description": "Title for alerts when a course grade is above the threshold value", - "type": "text", - "placeholders_order": [ - "threshold" - ], - "placeholders": { - "threshold": {} - } - }, - "courseGradeBelowThreshold": "Điểm Khóa Học Dưới {threshold}", - "@courseGradeBelowThreshold": { - "description": "Title for alerts when a course grade is below the threshold value", - "type": "text", - "placeholders_order": [ - "threshold" - ], - "placeholders": { - "threshold": {} - } - }, - "Settings": "Cài Đặt", - "@Settings": { - "description": "Title for the settings screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Theme": "Chủ Đề", - "@Theme": { - "description": "Label for the light/dark theme section in the settings page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Dark Mode": "Chế Độ Tối", - "@Dark Mode": { - "description": "Label for the button that enables dark mode", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Light Mode": "Chế Độ Sáng", - "@Light Mode": { - "description": "Label for the button that enables light mode", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "High Contrast Mode": "Chế Độ Độ Tương Phản Cao", - "@High Contrast Mode": { - "description": "Label for the switch that toggles high contrast mode", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Use Dark Theme in Web Content": "Sử Dụng Chủ Đề Tối Trong Nội Dung Web", - "@Use Dark Theme in Web Content": { - "description": "Label for the switch that toggles dark mode for webviews", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Appearance": "Ngoại Hình", - "@Appearance": { - "description": "Label for the appearance section in the settings page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Successfully submitted!": "Đã nộp thành công!", - "@Successfully submitted!": { - "description": "Title displayed in the grade cell for an assignment that has been submitted", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "submissionStatusSuccessSubtitle": "Bài tập này đã được nộp vào {date} lúc {time} và đang chờ chấm điểm", - "@submissionStatusSuccessSubtitle": { - "description": "Subtitle displayed in the grade cell for an assignment that has been submitted and is awaiting a grade", - "type": "text", - "placeholders_order": [ - "date", - "time" - ], - "placeholders": { - "date": {}, - "time": {} - } - }, - "outOfPoints": "{howMany,plural, =1{Trên tổng số 1 điểm}other{Trên tổng số {points} điểm}}", - "@outOfPoints": { - "description": "Description for an assignment grade that has points without a current scoroe", - "type": "text", - "placeholders_order": [ - "points", - "howMany" - ], - "placeholders": { - "points": {}, - "howMany": {} - } - }, - "Excused": "Đã Xin Phép", - "@Excused": { - "description": "Grading status for an assignment marked as excused", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Complete": "Hoàn thành", - "@Complete": { - "description": "Grading status for an assignment marked as complete", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Incomplete": "Chưa hoàn thành", - "@Incomplete": { - "description": "Grading status for an assignment marked as incomplete", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "minus": "trừ", - "@minus": { - "description": "Screen reader-friendly replacement for the \"-\" character in letter grades like \"A-\"", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "latePenalty": "Hình phạt trễ (-{pointsLost})", - "@latePenalty": { - "description": "Text displayed when a late penalty has been applied to the assignment", - "type": "text", - "placeholders_order": [ - "pointsLost" - ], - "placeholders": { - "pointsLost": {} - } - }, - "finalGrade": "Điểm Cuối Cùng: {grade}", - "@finalGrade": { - "description": "Text that displays the final grade of an assignment", - "type": "text", - "placeholders_order": [ - "grade" - ], - "placeholders": { - "grade": {} - } - }, - "Alert Settings": "Cài Đặt Cảnh Báo", - "@Alert Settings": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Alert me when…": "Cảnh báo tôi khi...", - "@Alert me when…": { - "description": "Header for the screen where the observer chooses the thresholds that will determine when they receive alerts (e.g. when an assignment is graded below 70%)", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Course grade below": "Điểm khóa học dưới", - "@Course grade below": { - "description": "Label describing the threshold for when the course grade is below a certain percentage", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Course grade above": "Điểm khóa học trên", - "@Course grade above": { - "description": "Label describing the threshold for when the course grade is above a certain percentage", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Assignment missing": "Bài tập bị thiếu", - "@Assignment missing": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Assignment grade below": "Điểm bài tập dưới", - "@Assignment grade below": { - "description": "Label describing the threshold for when an assignment is graded below a certain percentage", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Assignment grade above": "Điểm bài tập trên", - "@Assignment grade above": { - "description": "Label describing the threshold for when an assignment is graded above a certain percentage", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Course Announcements": "Thông Báo Chung Khóa Học", - "@Course Announcements": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Institution Announcements": "Thông Báo Chung Tổ Chức", - "@Institution Announcements": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Never": "Không Bao Giờ", - "@Never": { - "description": "Indication that tells the user they will not receive alert notifications of a specific kind", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Grade percentage": "Điểm dạng phần trăm", - "@Grade percentage": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading your student's alerts.": "Đã xảy ra lỗi khi tải cảnh báo sinh viên của bạn.", - "@There was an error loading your student's alerts.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Must be below 100": "Phải dưới 100", - "@Must be below 100": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "mustBeBelowN": "Phải dưới {percentage}", - "@mustBeBelowN": { - "description": "Validation error to the user that they must choose a percentage below 'n'", - "type": "text", - "placeholders_order": [ - "percentage" - ], - "placeholders": { - "percentage": { - "example": 5 - } - } - }, - "mustBeAboveN": "Phải trên {percentage}", - "@mustBeAboveN": { - "description": "Validation error to the user that they must choose a percentage above 'n'", - "type": "text", - "placeholders_order": [ - "percentage" - ], - "placeholders": { - "percentage": { - "example": 5 - } - } - }, - "Select Student Color": "Chọn Màu Sinh Viên", - "@Select Student Color": { - "description": "Title for screen that allows users to assign a color to a specific student", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Electric, blue": "Xanh Dương Tia Lửa Điện", - "@Electric, blue": { - "description": "Name of the Electric (blue) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Plum, Purple": "Tía Mận", - "@Plum, Purple": { - "description": "Name of the Plum (purple) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Barney, Fuschia": "Hồng Vân Anh Barney", - "@Barney, Fuschia": { - "description": "Name of the Barney (fuschia) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Raspberry, Red": "Đỏ Mâm Xôi", - "@Raspberry, Red": { - "description": "Name of the Raspberry (red) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Fire, Orange": "Cam Đỏ Lửa", - "@Fire, Orange": { - "description": "Name of the Fire (orange) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Shamrock, Green": "Xanh Lá Cây", - "@Shamrock, Green": { - "description": "Name of the Shamrock (green) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "An error occurred while saving your selection. Please try again.": "Đã xảy ra lỗi khi lưu lựa chọn của bạn. Vui lòng thử lại.", - "@An error occurred while saving your selection. Please try again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "changeStudentColorLabel": "Thay đổi màu cho {studentName}", - "@changeStudentColorLabel": { - "description": "Accessibility label for the button that lets users change the color associated with a specific student", - "type": "text", - "placeholders_order": [ - "studentName" - ], - "placeholders": { - "studentName": {} - } - }, - "Teacher": "Giáo Viên", - "@Teacher": { - "description": "Label for the Teacher enrollment type", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Student": "Sinh Viên", - "@Student": { - "description": "Label for the Student enrollment type", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "TA": "Trợ Giảng", - "@TA": { - "description": "Label for the Teaching Assistant enrollment type (also known as Teacher Aid or Education Assistant), reduced to a short acronym/initialism if appropriate.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Observer": "Người Quan Sát", - "@Observer": { - "description": "Label for the Observer enrollment type", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Use Camera": "Sử Dụng Camera", - "@Use Camera": { - "description": "Label for the action item that lets the user capture a photo using the device camera", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Upload File": "Tải Lên Tập Tin", - "@Upload File": { - "description": "Label for the action item that lets the user upload a file from their device", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Choose from Gallery": "Chọn Từ Thư Viện", - "@Choose from Gallery": { - "description": "Label for the action item that lets the user select a photo from their device gallery", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Preparing…": "Đang chuẩn bị…", - "@Preparing…": { - "description": "Message shown while a file is being prepared to attach to a message", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Add student with…": "Thêm sinh viên với...", - "@Add student with…": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Add Student": "Thêm Sinh Viên", - "@Add Student": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You are not observing any students.": "Bạn đang không quan sát bất kỳ sinh viên nào.", - "@You are not observing any students.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading your students.": "Đã xảy ra lỗi khi tải sinh viên của bạn.", - "@There was an error loading your students.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Pairing Code": "Mã Ghép Cặp", - "@Pairing Code": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Students can obtain a pairing code through the Canvas website": "Sinh viên có thể nhận mã ghép cặp thông qua trang web Canvas", - "@Students can obtain a pairing code through the Canvas website": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Enter the student pairing code provided to you. If the pairing code doesn't work, it may have expired": "Nhập mã ghép cặp sinh viên được cung cấp cho bạn. Nếu mã ghép cặp không hoạt động thì có thể mã đó đã hết hạn", - "@Enter the student pairing code provided to you. If the pairing code doesn't work, it may have expired": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Your code is incorrect or expired.": "Mã của bạn không đúng hoặc đã hết hạn.", - "@Your code is incorrect or expired.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Something went wrong trying to create your account, please reach out to your school for assistance.": "Đã xảy ra vấn đề khi cố tạo tài khoản của bạn, vui lòng liên hệ trường của bạn để được hỗ trợ.", - "@Something went wrong trying to create your account, please reach out to your school for assistance.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "QR Code": "Mã QR", - "@QR Code": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Students can create a QR code using the Canvas Student app on their mobile device": "Sinh viên có thể quét mã QR bằng cách sử dụng ứng dụng Canvas Student trên thiết bị di động của họ", - "@Students can create a QR code using the Canvas Student app on their mobile device": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Add new student": "Thêm sinh viên mới", - "@Add new student": { - "description": "Semantics label for the FAB on the Manage Students Screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Select": "Chọn", - "@Select": { - "description": "Hint text to tell the user to choose one of two options", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I have a Canvas account": "Tôi có tài khoản Canvas", - "@I have a Canvas account": { - "description": "Option to select for users that have a canvas account", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I don't have a Canvas account": "Tôi không có tài khoản Canvas", - "@I don't have a Canvas account": { - "description": "Option to select for users that don't have a canvas account", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Create Account": "Tạo Tài Khoản", - "@Create Account": { - "description": "Button text for account creation confirmation", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Full Name": "Tên Đầy Đủ", - "@Full Name": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Email Address": "Địa Chỉ Email", - "@Email Address": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Password": "Mật khẩu", - "@Password": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Full Name…": "Tên Đầy Đủ...", - "@Full Name…": { - "description": "hint label for inside form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Email…": "Email…", - "@Email…": { - "description": "hint label for inside form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Password…": "Mật khẩu...", - "@Password…": { - "description": "hint label for inside form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Please enter full name": "Vui lòng nhập tên đầy đủ", - "@Please enter full name": { - "description": "Error message for form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Please enter an email address": "Vui lòng nhập địa chỉ email", - "@Please enter an email address": { - "description": "Error message for form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Please enter a valid email address": "Vui lòng nhập địa chỉ email hợp lệ", - "@Please enter a valid email address": { - "description": "Error message for form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Password is required": "Bắt buộc phải có mật khẩu", - "@Password is required": { - "description": "Error message for form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Password must contain at least 8 characters": "Mật khẩu phải có ít nhất 8 ký tự", - "@Password must contain at least 8 characters": { - "description": "Error message for form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "qrCreateAccountTos": "Nhấn vào \"Tạo Tài Khoản\" đồng nghĩa với việc bạn đồng ý với {termsOfService} và chấp nhận {privacyPolicy}", - "@qrCreateAccountTos": { - "description": "The text show on the account creation screen", - "type": "text", - "placeholders_order": [ - "termsOfService", - "privacyPolicy" - ], - "placeholders": { - "termsOfService": {}, - "privacyPolicy": {} - } - }, - "Terms of Service": "Điều Khoản Dịch Vụ", - "@Terms of Service": { - "description": "Label for the Canvas Terms of Service agreement. This will be used in the qrCreateAccountTos text and will be highlighted and clickable", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Privacy Policy": "Chính Sách Quyền Riêng Tư", - "@Privacy Policy": { - "description": "Label for the Canvas Privacy Policy agreement. This will be used in the qrCreateAccountTos text and will be highlighted and clickable", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "View the Privacy Policy": "Xem Chính Sách Quyền Riêng Tư", - "@View the Privacy Policy": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Already have an account? ": "Bạn đã có sẵn tài khoản? ", - "@Already have an account? ": { - "description": "Part of multiline text span, includes AccountSignIn1-2, in that order", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Sign In": "Đăng Nhập", - "@Sign In": { - "description": "Part of multiline text span, includes AccountSignIn1-2, in that order", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Hide Password": "Ẩn Mật Khẩu", - "@Hide Password": { - "description": "content description for password hide button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Show Password": "Hiện Mật Khẩu", - "@Show Password": { - "description": "content description for password show button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Terms of Service Link": "Liên Kết Điều Khoản Dịch Vụ", - "@Terms of Service Link": { - "description": "content description for terms of service link", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Privacy Policy Link": "Liên Kết Chính Sách Quyền Riêng Tư", - "@Privacy Policy Link": { - "description": "content description for privacy policy link", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Event": "Sự Kiện", - "@Event": { - "description": "Title for the event details screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Date": "Ngày", - "@Date": { - "description": "Label for the event date", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Location": "Địa Điểm", - "@Location": { - "description": "Label for the location information", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Location Specified": "Không Có Địa Điểm Được Xác Định", - "@No Location Specified": { - "description": "Description for events that do not have a location", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "eventTime": "{startAt} - {endAt}", - "@eventTime": { - "description": "The time the event is happening, example: \"2:00 pm - 4:00 pm\"", - "type": "text", - "placeholders_order": [ - "startAt", - "endAt" - ], - "placeholders": { - "startAt": {}, - "endAt": {} - } - }, - "Set a date and time to be notified of this event.": "Cài đặt ngày và giờ để được thông báo về sự kiện này.", - "@Set a date and time to be notified of this event.": { - "description": "Description for row to set event reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You will be notified about this event on…": "Bạn sẽ được thông báo về sự kiện này vào...", - "@You will be notified about this event on…": { - "description": "Description for when an event reminder is set", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Share Your Love for the App": "Chia Sẻ Tình Yêu Của Bạn Đối Với Ứng Dụng", - "@Share Your Love for the App": { - "description": "Label for option to open the app store", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Tell us about your favorite parts of the app": "Hãy cho chúng tôi biết bạn thích phần nào của ứng dụng", - "@Tell us about your favorite parts of the app": { - "description": "Description for option to open the app store", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Legal": "Pháp Lý", - "@Legal": { - "description": "Label for legal information option", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Privacy policy, terms of use, open source": "Chính sách quyền riêng tư, điều khoản sử dụng và mã nguồn mở", - "@Privacy policy, terms of use, open source": { - "description": "Description for legal information option", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Idea for Canvas Parent App [Android]": "Ý Tưởng Cho Ứng Dụng Canvas Parent [Android]", - "@Idea for Canvas Parent App [Android]": { - "description": "The subject for the email to request a feature", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The following information will help us better understand your idea:": "Thông tin sau sẽ giúp chúng tôi hiểu hơn về ý tưởng của bạn:", - "@The following information will help us better understand your idea:": { - "description": "The header for the users information that is attached to a feature request", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Domain:": "Tên Miền:", - "@Domain:": { - "description": "The label for the Canvas domain of the logged in user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "User ID:": "ID Người Dùng:", - "@User ID:": { - "description": "The label for the Canvas user ID of the logged in user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Email:": "Email:", - "@Email:": { - "description": "The label for the eamil of the logged in user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Locale:": "Địa Điểm:", - "@Locale:": { - "description": "The label for the locale of the logged in user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Terms of Use": "Điều Khoản Sử Dụng", - "@Terms of Use": { - "description": "Label for the terms of use", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Canvas on GitHub": "Canvas Trên GitHub", - "@Canvas on GitHub": { - "description": "Label for the button that opens the Canvas project on GitHub's website", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was a problem loading the Terms of Use": "Đã xảy ra vấn đề khi tải Điều Khoản Sử Dụng", - "@There was a problem loading the Terms of Use": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Device": "Thiết Bị", - "@Device": { - "description": "Label used for device manufacturer/model in the error report", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "OS Version": "Phiên Bản HĐH", - "@OS Version": { - "description": "Label used for device operating system version in the error report", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Version Number": "Số Phiên Bản", - "@Version Number": { - "description": "Label used for the app version number in the error report", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Report A Problem": "Báo Cáo Vấn Đề", - "@Report A Problem": { - "description": "Title used for generic dialog to report problems", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Subject": "Tiêu Đề", - "@Subject": { - "description": "Label used for Subject text field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "A subject is required.": "Bắt buộc phải có tiêu đề.", - "@A subject is required.": { - "description": "Error shown when the subject field is empty", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "An email address is required.": "Bắt buộc phải có địa chỉ email.", - "@An email address is required.": { - "description": "Error shown when the email field is empty", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Description": "Mô Tả", - "@Description": { - "description": "Label used for Description text field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "A description is required.": "Bắt buộc phải có mô tả.", - "@A description is required.": { - "description": "Error shown when the description field is empty", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "How is this affecting you?": "Điều này ảnh hưởng đến bạn như thế nào?", - "@How is this affecting you?": { - "description": "Label used for the dropdown to select how severe the issue is", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "send": "gửi", - "@send": { - "description": "Label used for send button when reporting a problem", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Just a casual question, comment, idea, suggestion…": "Chỉ là câu hỏi, bình luận, ý tưởng, đề xuất bình thường...", - "@Just a casual question, comment, idea, suggestion…": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I need some help but it's not urgent.": "Tôi cần trợ giúp một chút nhưng không gấp.", - "@I need some help but it's not urgent.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Something's broken but I can work around it to get what I need done.": "Đã có vấn đề xảy ra nhưng tôi không tìm được cách khắc phục tạm thời để lấy thứ tôi cần.", - "@Something's broken but I can work around it to get what I need done.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I can't get things done until I hear back from you.": "Tôi không làm được gì cho đến khi được nghe phản hồi từ bạn.", - "@I can't get things done until I hear back from you.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "EXTREME CRITICAL EMERGENCY!!": "TRƯỜNG HỢP KHẨN CẤP, CỰC KỲ QUAN TRỌNG!!", - "@EXTREME CRITICAL EMERGENCY!!": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Not Graded": "Chưa Được Chấm Điểm", - "@Not Graded": { - "description": "Description for an assignment has not been graded.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Login flow: Normal": "Quy trình đăng nhập: Thường", - "@Login flow: Normal": { - "description": "Description for the normal login flow", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Login flow: Canvas": "Quy trình đăng nhập: Canvas", - "@Login flow: Canvas": { - "description": "Description for the Canvas login flow", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Login flow: Site Admin": "Quy trình đăng nhập: Quản Trị Viên Trang:", - "@Login flow: Site Admin": { - "description": "Description for the Site Admin login flow", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Login flow: Skip mobile verify": "Quy trình đăng nhập: Bỏ qua phần xác minh trên di động", - "@Login flow: Skip mobile verify": { - "description": "Description for the login flow that skips domain verification for mobile", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Act As User": "Đóng Vai Trò Người Dùng", - "@Act As User": { - "description": "Label for the button that allows the user to act (masquerade) as another user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Stop Acting as User": "Dừng Đóng Vai Trò Người Dùng", - "@Stop Acting as User": { - "description": "Label for the button that allows the user to stop acting (masquerading) as another user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "actingAsUser": "Bạn đang đóng vai trò {userName}", - "@actingAsUser": { - "description": "Message shown while acting (masquerading) as another user", - "type": "text", - "placeholders_order": [ - "userName" - ], - "placeholders": { - "userName": {} - } - }, - "\"Act as\" is essentially logging in as this user without a password. You will be able to take any action as if you were this user, and from other users' points of views, it will be as if this user performed them. However, audit logs record that you were the one who performed the actions on behalf of this user.": "\"Đóng vai trò\" về cơ bản là đăng nhập dưới danh nghĩa người dùng này mà không sử dụng mật khẩu. Bạn sẽ có thể thực hiện mọi thao tác như thể bạn chính là người dùng này và từ góc nhìn của người dùng khác, mọi thứ sẽ như thể chính là người dùng này thực hiện các thao tác đó. Tuy nhiên, nhật ký đánh giá sẽ ghi nhận lại rằng bạn chính là người đã thực hiện thao tác thay mặt cho người dùng này.", - "@\"Act as\" is essentially logging in as this user without a password. You will be able to take any action as if you were this user, and from other users' points of views, it will be as if this user performed them. However, audit logs record that you were the one who performed the actions on behalf of this user.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Domain": "Tên Miền", - "@Domain": { - "description": "Text field hint for domain url input", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You must enter a valid domain": "Bạn phải nhập tên miền hợp lệ", - "@You must enter a valid domain": { - "description": "Message displayed for domain input error", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "User ID": "ID Người Dùng", - "@User ID": { - "description": "Text field hint for user ID input", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You must enter a user id": "Bạn phải nhập id người dùng", - "@You must enter a user id": { - "description": "Message displayed for user Id input error", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error trying to act as this user. Please check the Domain and User ID and try again.": "Đã xảy ra lỗi khi cố đóng vai trò người dùng này. Vui lòng kiểm tra Tên Miền và ID Người Dùng rồi thử lại.", - "@There was an error trying to act as this user. Please check the Domain and User ID and try again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "endMasqueradeMessage": "Bạn sẽ dừng đóng vai {userName} và trở về tài khoản của bạn.", - "@endMasqueradeMessage": { - "description": "Confirmation message displayed when the user wants to stop acting (masquerading) as another user", - "type": "text", - "placeholders_order": [ - "userName" - ], - "placeholders": { - "userName": {} - } - }, - "endMasqueradeLogoutMessage": "Bạn sẽ dừng đóng vai trò {userName} và được đăng xuất.", - "@endMasqueradeLogoutMessage": { - "description": "Confirmation message displayed when the user wants to stop acting (masquerading) as another user and will be logged out.", - "type": "text", - "placeholders_order": [ - "userName" - ], - "placeholders": { - "userName": {} - } - }, - "How are we doing?": "Mọi thứ đang làm thế nào rồi?", - "@How are we doing?": { - "description": "Title for dialog asking user to rate the app out of 5 stars.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Don't show again": "Không hiển thị lại", - "@Don't show again": { - "description": "Button to prevent the rating dialog from showing again.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "What can we do better?": "Chúng ta có thể làm tốt hơn chỗ nào?", - "@What can we do better?": { - "description": "Hint text for providing a comment with the rating.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Send Feedback": "Gửi Ý Kiến Phản Hồi", - "@Send Feedback": { - "description": "Button to send rating with feedback", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "ratingDialogEmailSubject": "Đề Xuất Cho Android - Canvas Parent {version}", - "@ratingDialogEmailSubject": { - "description": "The subject for an email to provide feedback for CanvasParent.", - "type": "text", - "placeholders_order": [ - "version" - ], - "placeholders": { - "version": {} - } - }, - "starRating": "{position,plural, =1{{position} sao}other{{position} sao}}", - "@starRating": { - "description": "Accessibility label for the 1 stars to 5 stars rating", - "type": "text", - "placeholders_order": [ - "position" - ], - "placeholders": { - "position": { - "example": 1 - } - } - }, - "Student Pairing": "Ghép Cặp Sinh Viên", - "@Student Pairing": { - "description": "Title for the screen where users can pair to students using a QR code", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Open Canvas Student": "Mở Canvas Student", - "@Open Canvas Student": { - "description": "Title for QR pairing tutorial screen instructing users to open the Canvas Student app", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You'll need to open your student's Canvas Student app to continue. Go into Main Menu > Settings > Pair with Observer and scan the QR code you see there.": "Bạn cần mở ứng dụng Canvas Student của bạn để tiếp tục. Đi đến Menu Chính > Cài Đặt > Ghép Cặp Với Người Quan Sát rồi quét mã QR bạn thấy ở đó.", - "@You'll need to open your student's Canvas Student app to continue. Go into Main Menu > Settings > Pair with Observer and scan the QR code you see there.": { - "description": "Message explaining how QR code pairing works", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Screenshot showing location of pairing QR code generation in the Canvas Student app": "Chụp ảnh chụp màn hình cho thấy vị trí tạo mã QR ghép cặp trong ứng dụng Canvas Student", - "@Screenshot showing location of pairing QR code generation in the Canvas Student app": { - "description": "Content Description for qr pairing tutorial screenshot", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Expired QR Code": "QR Code Đã Hết Hạn", - "@Expired QR Code": { - "description": "Error title shown when the users scans a QR code that has expired", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The QR code you scanned may have expired. Refresh the code on the student's device and try again.": "Mã QR bạn quét có thể đã hết hạn. Hãy làm mới mã trên thiết bị của sinh viên rồi thử lại.", - "@The QR code you scanned may have expired. Refresh the code on the student's device and try again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "A network error occurred when adding this student. Check your connection and try again.": "Đã xảy ra lỗi mạng khi thêm sinh viên này. Hãy kiểm tra kết nối của bạn rồi thử lại.", - "@A network error occurred when adding this student. Check your connection and try again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Invalid QR Code": "Mã QR Không Hợp Lệ", - "@Invalid QR Code": { - "description": "Error title shown when the user scans an invalid QR code", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Incorrect Domain": "Tên Miền Không Đúng", - "@Incorrect Domain": { - "description": "Error title shown when the users scane a QR code for a student that belongs to a different domain", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The student you are trying to add belongs to a different school. Log in or create an account with that school to scan this code.": "Sinh viên bạn đang cố thêm vào thuộc về trường khác. Hãy đăng nhập hoặc tạo tài khoản với trường đó để quét mã này.", - "@The student you are trying to add belongs to a different school. Log in or create an account with that school to scan this code.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Camera Permission": "Cho Phép Camera", - "@Camera Permission": { - "description": "Error title shown when the user wans to scan a QR code but has denied the camera permission", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "This will unpair and remove all enrollments for this student from your account.": "Thao tác này sẽ bỏ ghép cặp và gỡ toàn bộ lượt ghi danh của sinh viên này ra khỏi tài khoản của bạn.", - "@This will unpair and remove all enrollments for this student from your account.": { - "description": "Confirmation message shown when the user tries to delete a student from their account", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was a problem removing this student from your account. Please check your connection and try again.": "Đã xảy ra vấn đề khi gỡ sinh viên này khỏi tài khoản của bạn. Vui lòng kiểm tra kết nối của bạn rồi thử lại.", - "@There was a problem removing this student from your account. Please check your connection and try again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Cancel": "Hủy", - "@Cancel": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "next": "Tiếp", - "@next": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "ok": "OK", - "@ok": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Yes": "Có", - "@Yes": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No": "Không", - "@No": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Retry": "Thử Lại", - "@Retry": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Delete": "Xóa", - "@Delete": { - "description": "Label used for general delete/remove actions", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Done": "Đã xong", - "@Done": { - "description": "Label for general done/finished actions", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Refresh": "Làm Mới", - "@Refresh": { - "description": "Label for button to refresh data from the web", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "View Description": "Xem Mô Tả", - "@View Description": { - "description": "Button to view the description for an event or assignment", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "expanded": "đã mở rộng", - "@expanded": { - "description": "Description for the accessibility reader for list groups that are expanded", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "collapsed": "đã thu gọn", - "@collapsed": { - "description": "Description for the accessibility reader for list groups that are expanded", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "An unexpected error occurred": "Đã xảy ra lỗi không lường trước", - "@An unexpected error occurred": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No description": "Không có mô tả", - "@No description": { - "description": "Message used when the assignment has no description", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Launch External Tool": "Khởi Chạy Công Cụ Ngoài", - "@Launch External Tool": { - "description": "Button text added to webviews to let users open external tools in their browser", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Interactions on this page are limited by your institution.": "Tương tác trên trang này bị giới hạn bởi tổ chức của bạn.", - "@Interactions on this page are limited by your institution.": { - "description": "Message describing how the webview has limited access due to an instution setting", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "dateAtTime": "{date} vào {time}", - "@dateAtTime": { - "description": "The string to format dates", - "type": "text", - "placeholders_order": [ - "date", - "time" - ], - "placeholders": { - "date": {}, - "time": {} - } - }, - "dueDateAtTime": "Đến hạn {date} vào {time}", - "@dueDateAtTime": { - "description": "The string to format due dates", - "type": "text", - "placeholders_order": [ - "date", - "time" - ], - "placeholders": { - "date": {}, - "time": {} - } - }, - "No Due Date": "Không Có Ngày Đến Hạn", - "@No Due Date": { - "description": "Label for assignments that do not have a due date", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Filter": "Lọc", - "@Filter": { - "description": "Label for buttons to filter what items are visible", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "unread": "chưa đọc", - "@unread": { - "description": "Label for things that are marked as unread", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "unreadCount": "{count} chưa đọc", - "@unreadCount": { - "description": "Formatted string for when there are a number of unread items", - "type": "text", - "placeholders_order": [ - "count" - ], - "placeholders": { - "count": {} - } - }, - "badgeNumberPlus": "{count}+", - "@badgeNumberPlus": { - "description": "Formatted string for when too many items are being notified in a badge, generally something like: 99+", - "type": "text", - "placeholders_order": [ - "count" - ], - "placeholders": { - "count": {} - } - }, - "There was an error loading this announcement": "Đã xảy ra lỗi khi tải thông báo này", - "@There was an error loading this announcement": { - "description": "Message shown when an announcement detail screen fails to load", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Network error": "Lỗi mạng", - "@Network error": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Under Construction": "Đang Xây Dựng", - "@Under Construction": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "We are currently building this feature for your viewing pleasure.": "Chúng tôi hiện đang xây dựng tính năng này để giúp bạn xem được thoải mái hơn.", - "@We are currently building this feature for your viewing pleasure.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Request Login Help Button": "Nút Yêu Cầu Trợ Giúp Đăng Nhập", - "@Request Login Help Button": { - "description": "Accessibility hint for button that opens help dialog for a login help request", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Request Login Help": "Yêu Cầu Trợ Giúp Đăng Nhập", - "@Request Login Help": { - "description": "Title of help dialog for a login help request", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I'm having trouble logging in": "Tôi đang gặp vấn đề đăng nhập", - "@I'm having trouble logging in": { - "description": "Subject of help dialog for a login help request", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "An error occurred when trying to display this link": "Đã xảy ra lỗi khi cố gắng hiển thị liên kết này", - "@An error occurred when trying to display this link": { - "description": "Error message shown when a link can't be opened", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "We are unable to display this link, it may belong to an institution you currently aren't logged in to.": "Chúng tôi không thể hiển thị liên kết này, có thể liên kết này thuộc về tổ chức bạn hiện đang không đăng nhập.", - "@We are unable to display this link, it may belong to an institution you currently aren't logged in to.": { - "description": "Description for error page shown when clicking a link", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Link Error": "Lỗi Liên Kết", - "@Link Error": { - "description": "Title for error page shown when clicking a link", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Open In Browser": "Mở Trong Trình Duyệt", - "@Open In Browser": { - "description": "Text for button to open a link in the browswer", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You'll find the QR code on the web in your account profile. Click 'QR for Mobile Login' in the list.": "Bạn sẽ thấy mã QR trên trang web trong hồ sơ tài khoản của bạn. Hãy nhấp vào \"Mã QR Để Đăng Nhập Trên Di Động\" trong danh sách.", - "@You'll find the QR code on the web in your account profile. Click 'QR for Mobile Login' in the list.": { - "description": "Text for qr login tutorial screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Locate QR Code": "Tìm Mã QR", - "@Locate QR Code": { - "description": "Text for qr login button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Please scan a QR code generated by Canvas": "Vui lòng quét mã QR do Canvas tạo", - "@Please scan a QR code generated by Canvas": { - "description": "Text for qr login error with incorrect qr code", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error logging in. Please generate another QR Code and try again.": "Đã xảy ra lỗi khi đăng nhập. Vui lòng tạo Mã QR khác rồi thử lại.", - "@There was an error logging in. Please generate another QR Code and try again.": { - "description": "Text for qr login error", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Screenshot showing location of QR code generation in browser": "Ảnh chụp màn hình cho thấy vị trí tạo mã QR trong trình duyệt", - "@Screenshot showing location of QR code generation in browser": { - "description": "Content Description for qr login tutorial screenshot", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "QR scanning requires camera access": "Việc quét mã QR yêu cầu phải có quyền truy cập camera", - "@QR scanning requires camera access": { - "description": "placeholder for camera error for QR code scan", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The linked item is no longer available": "Mục được liên kết không còn khả dụng", - "@The linked item is no longer available": { - "description": "error message when the alert could no be opened", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Message sent": "Đã gửi tin nhắn", - "@Message sent": { - "description": "confirmation message on the screen when the user succesfully sends a message", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Acceptable Use Policy": "Chính Sách Sử Dụng Có Thể Chấp Nhận Được", - "@Acceptable Use Policy": { - "description": "title for the acceptable use policy screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Submit": "Nộp", - "@Submit": { - "description": "submit button title for acceptable use policy screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Either you're a new user or the Acceptable Use Policy has changed since you last agreed to it. Please agree to the Acceptable Use Policy before you continue.": "Bạn là người dùng mới hoặc Chính Sách Sử Dụng Có Thể Chấp Nhận Được đã thay đổi kể từ lần gần nhất bạn đồng ý. Vui lòng đồng ý với Chính Sách Sử Dụng Có Thể Chấp Nhận Được trước khi bạn tiếp tục.", - "@Either you're a new user or the Acceptable Use Policy has changed since you last agreed to it. Please agree to the Acceptable Use Policy before you continue.": { - "description": "acceptable use policy screen description", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I agree to the Acceptable Use Policy.": "Tôi đồng ý với Chính Sách Sử Dụng Có Thể Chấp Nhận Được.", - "@I agree to the Acceptable Use Policy.": { - "description": "acceptable use policy switch title", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "About": "Giới Thiệu", - "@About": { - "description": "Title for about menu item in settings", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "App": "Ứng Dụng", - "@App": { - "description": "Title for App field on about page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Login ID": "ID Đăng Nhập", - "@Login ID": { - "description": "Title for Login ID field on about page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Email": "Email", - "@Email": { - "description": "Title for Email field on about page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Version": "Phiên bản", - "@Version": { - "description": "Title for Version field on about page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Instructure logo": "Logo Instructure", - "@Instructure logo": { - "description": "Semantics label for the Instructure logo on the about page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - } -} \ No newline at end of file diff --git a/apps/flutter_parent/lib/l10n/res/intl_zh.arb b/apps/flutter_parent/lib/l10n/res/intl_zh.arb deleted file mode 100644 index ccf2a3c7c1..0000000000 --- a/apps/flutter_parent/lib/l10n/res/intl_zh.arb +++ /dev/null @@ -1,2753 +0,0 @@ -{ - "@@last_modified": "2023-08-25T11:04:20.901151", - "alertsLabel": "警告", - "@alertsLabel": { - "description": "The label for the Alerts tab", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "calendarLabel": "日历", - "@calendarLabel": { - "description": "The label for the Calendar tab", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "coursesLabel": "课程", - "@coursesLabel": { - "description": "The label for the Courses tab", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Students": "没有学生", - "@No Students": { - "description": "Text for when an observer has no students they are observing", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Tap to show student selector": "点击以显示学生选择器", - "@Tap to show student selector": { - "description": "Semantics label for the area that will show the student selector when tapped", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Tap to pair with a new student": "点击以与新生配对", - "@Tap to pair with a new student": { - "description": "Semantics label for the add student button in the student selector", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Tap to select this student": "点击以选择此学生", - "@Tap to select this student": { - "description": "Semantics label on individual students in the student switcher", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Manage Students": "管理学生", - "@Manage Students": { - "description": "Label text for the Manage Students nav drawer button as well as the title for the Manage Students screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Help": "帮助", - "@Help": { - "description": "Label text for the help nav drawer button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Log Out": "注销", - "@Log Out": { - "description": "Label text for the Log Out nav drawer button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Switch Users": "转换用户", - "@Switch Users": { - "description": "Label text for the Switch Users nav drawer button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "appVersion": "v. {version}", - "@appVersion": { - "description": "App version shown in the navigation drawer", - "type": "text", - "placeholders_order": [ - "version" - ], - "placeholders": { - "version": {} - } - }, - "Are you sure you want to log out?": "是否确定要登出?", - "@Are you sure you want to log out?": { - "description": "Confirmation message displayed when the user tries to log out", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Calendars": "日历", - "@Calendars": { - "description": "Label for button that lets users select which calendars to display", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "nextMonth": "下个月:{month}", - "@nextMonth": { - "description": "Label for the button that switches the calendar to the next month", - "type": "text", - "placeholders_order": [ - "month" - ], - "placeholders": { - "month": {} - } - }, - "previousMonth": "上个月:{month}", - "@previousMonth": { - "description": "Label for the button that switches the calendar to the previous month", - "type": "text", - "placeholders_order": [ - "month" - ], - "placeholders": { - "month": {} - } - }, - "nextWeek": "下周,从{date}开始", - "@nextWeek": { - "description": "Label for the button that switches the calendar to the next week", - "type": "text", - "placeholders_order": [ - "date" - ], - "placeholders": { - "date": {} - } - }, - "previousWeek": "上周,从{date}开始", - "@previousWeek": { - "description": "Label for the button that switches the calendar to the previous week", - "type": "text", - "placeholders_order": [ - "date" - ], - "placeholders": { - "date": {} - } - }, - "selectedMonthLabel": "{month}月", - "@selectedMonthLabel": { - "description": "Accessibility label for the button that expands/collapses the month view", - "type": "text", - "placeholders_order": [ - "month" - ], - "placeholders": { - "month": {} - } - }, - "expand": "展开", - "@expand": { - "description": "Accessibility label for the on-tap hint for the button that expands/collapses the month view", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "collapse": "折叠", - "@collapse": { - "description": "Accessibility label for the on-tap hint for the button that expands/collapses the month view", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "pointsPossible": "满分 {points}", - "@pointsPossible": { - "description": "Screen reader label used for the points possible for an assignment, quiz, etc.", - "type": "text", - "placeholders_order": [ - "points" - ], - "placeholders": { - "points": {} - } - }, - "calendarDaySemanticsLabel": "{eventCount,plural, =1{{date}、{eventCount} 个事件}other{{date}、{eventCount} 个事件}}", - "@calendarDaySemanticsLabel": { - "description": "Screen reader label used for calendar day, reads the date and count of events", - "type": "text", - "placeholders_order": [ - "date", - "eventCount" - ], - "placeholders": { - "date": {}, - "eventCount": {} - } - }, - "No Events Today!": "今天没有事件!", - "@No Events Today!": { - "description": "Title displayed when there are no calendar events for the current day", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "It looks like a great day to rest, relax, and recharge.": "今天是休息放松的一天。", - "@It looks like a great day to rest, relax, and recharge.": { - "description": "Message displayed when there are no calendar events for the current day", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading your student's calendar": "加载学生的日历时发生错误", - "@There was an error loading your student's calendar": { - "description": "Message displayed when calendar events could not be loaded for the current student", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Tap to favorite the courses you want to see on the Calendar. Select up to 10.": "点击以收藏您希望在日历中看到的课程。选择最多 10 个。", - "@Tap to favorite the courses you want to see on the Calendar. Select up to 10.": { - "description": "Description text on calendar filter screen.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You may only choose 10 calendars to display": "只能选择 10 个要显示的日历", - "@You may only choose 10 calendars to display": { - "description": "Error text when trying to select more than 10 calendars", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You must select at least one calendar to display": "必须选择至少 1 个要显示的日历", - "@You must select at least one calendar to display": { - "description": "Error text when trying to de-select all calendars", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Planner Note": "计划程序注释", - "@Planner Note": { - "description": "Label used for notes in the planner", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Go to today": "转至今天", - "@Go to today": { - "description": "Accessibility label used for the today button in the planner", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Previous Logins": "历史登录记录", - "@Previous Logins": { - "description": "Label for the list of previous user logins", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "canvasLogoLabel": "Canvas徽标", - "@canvasLogoLabel": { - "description": "The semantics label for the Canvas logo", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "findSchool": "查找学校", - "@findSchool": { - "description": "Text for the find-my-school button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "findAnotherSchool": "查找其他学校", - "@findAnotherSchool": { - "description": "Text for the find-another-school button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "domainSearchInputHint": "输入学校名称或校区...", - "@domainSearchInputHint": { - "description": "Input hint for the text box on the domain search screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "noDomainResults": "找不到与“{query}”匹配的学校", - "@noDomainResults": { - "description": "Message shown to users when the domain search query did not return any results", - "type": "text", - "placeholders_order": [ - "query" - ], - "placeholders": { - "query": {} - } - }, - "domainSearchHelpLabel": "如何查找我的学校或校区?", - "@domainSearchHelpLabel": { - "description": "Label for the help button on the domain search screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "canvasGuides": "Canvas指南", - "@canvasGuides": { - "description": "Proper name for the Canvas Guides. This will be used in the domainSearchHelpBody text and will be highlighted and clickable", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "canvasSupport": "Canvas支持", - "@canvasSupport": { - "description": "Proper name for Canvas Support. This will be used in the domainSearchHelpBody text and will be highlighted and clickable", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "domainSearchHelpBody": "尝试搜索您要访问的学校或校区的名称,例如“Smith Private School”或“Smith County Schools”。也可以直接输入Canvas域,例如“smith.instructure.com”。\n\n有关查找机构Canvas账户的更多信息,可访问{canvasGuides}、联系{canvasSupport}或您的学校寻求帮助。", - "@domainSearchHelpBody": { - "description": "The body text shown in the help dialog on the domain search screen", - "type": "text", - "placeholders_order": [ - "canvasGuides", - "canvasSupport" - ], - "placeholders": { - "canvasGuides": {}, - "canvasSupport": {} - } - }, - "Uh oh!": "嗳哟!", - "@Uh oh!": { - "description": "Title of the screen that shows when a crash has occurred", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "We’re not sure what happened, but it wasn’t good. Contact us if this keeps happening.": "不知道发生了什么事情,但似乎不太妙。如果问题持续,请联系我们。", - "@We’re not sure what happened, but it wasn’t good. Contact us if this keeps happening.": { - "description": "Message shown when a crash has occurred", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Contact Support": "联系支持", - "@Contact Support": { - "description": "Label for the button that allows users to contact support after a crash has occurred", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "View error details": "查看错误详细信息", - "@View error details": { - "description": "Label for the button that allowed users to view crash details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Restart app": "重启应用程序", - "@Restart app": { - "description": "Label for the button that will restart the entire application", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Application version": "应用程序版本", - "@Application version": { - "description": "Label for the application version displayed in the crash details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Device model": "设备型号", - "@Device model": { - "description": "Label for the device model displayed in the crash details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Android OS version": "Android操作系统版本", - "@Android OS version": { - "description": "Label for the Android operating system version displayed in the crash details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Full error message": "完整的错误消息", - "@Full error message": { - "description": "Label for the full error message displayed in the crash details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Inbox": "收件箱", - "@Inbox": { - "description": "Title for the Inbox screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading your inbox messages.": "加载收件箱消息时发生错误。", - "@There was an error loading your inbox messages.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Subject": "无主题", - "@No Subject": { - "description": "Title used for inbox messages that have no subject", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unable to fetch courses. Please check your connection and try again.": "无法获取课程。请检查您的连接,然后再试一次。", - "@Unable to fetch courses. Please check your connection and try again.": { - "description": "Message shown when an error occured while loading courses", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Choose a course to message": "选择一个课程来发送讯息", - "@Choose a course to message": { - "description": "Header in the course list shown when the user is choosing which course to associate with a new message", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Inbox Zero": "收件箱为零", - "@Inbox Zero": { - "description": "Title of the message shown when there are no inbox messages", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You’re all caught up!": "您全部跟上了!", - "@You’re all caught up!": { - "description": "Subtitle of the message shown when there are no inbox messages", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading recipients for this course": "加载此课程的收件人时发生错误。", - "@There was an error loading recipients for this course": { - "description": "Message shown when attempting to create a new message but the recipients list failed to load", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unable to send message. Check your connection and try again.": "无法发送消息。请检查您的网络连接并重试。", - "@Unable to send message. Check your connection and try again.": { - "description": "Message show when there was an error creating or sending a new message", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unsaved changes": "无法保存更改", - "@Unsaved changes": { - "description": "Title of the dialog shown when the user tries to leave with unsaved changes", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Are you sure you wish to close this page? Your unsent message will be lost.": "是否确定要关闭此页面?未发送的消息将会丢失。", - "@Are you sure you wish to close this page? Your unsent message will be lost.": { - "description": "Body text of the dialog shown when the user tries leave with unsaved changes", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "New message": "新建消息", - "@New message": { - "description": "Title of the new-message screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Add attachment": "添加附件", - "@Add attachment": { - "description": "Tooltip for the add-attachment button in the new-message screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Send message": "发送消息", - "@Send message": { - "description": "Tooltip for the send-message button in the new-message screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Select recipients": "选择收件人", - "@Select recipients": { - "description": "Tooltip for the button that allows users to select message recipients", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No recipients selected": "未选择收件人", - "@No recipients selected": { - "description": "Hint displayed when the user has not selected any message recipients", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Message subject": "消息主题", - "@Message subject": { - "description": "Hint text displayed in the input field for the message subject", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Message": "消息", - "@Message": { - "description": "Hint text displayed in the input field for the message body", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Recipients": "收件人", - "@Recipients": { - "description": "Label for message recipients", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "plusRecipientCount": "+{count}", - "@plusRecipientCount": { - "description": "Shows the number of recipients that are selected but not displayed on screen.", - "type": "text", - "placeholders_order": [ - "count" - ], - "placeholders": { - "count": { - "example": 5 - } - } - }, - "Failed. Tap for options.": "失败。点击以获取选项。", - "@Failed. Tap for options.": { - "description": "Short message shown on a message attachment when uploading has failed", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "courseForWhom": "适用于{studentShortName}", - "@courseForWhom": { - "description": "Describes for whom a course is for (i.e. for Bill)", - "type": "text", - "placeholders_order": [ - "studentShortName" - ], - "placeholders": { - "studentShortName": {} - } - }, - "messageLinkPostscript": "事由:{studentName},{linkUrl}", - "@messageLinkPostscript": { - "description": "A postscript appended to new messages that clarifies which student is the subject of the message and also includes a URL for the related Canvas component (course, assignment, event, etc).", - "type": "text", - "placeholders_order": [ - "studentName", - "linkUrl" - ], - "placeholders": { - "studentName": {}, - "linkUrl": {} - } - }, - "There was an error loading this conversation": "加载此会话时发生错误", - "@There was an error loading this conversation": { - "description": "Message shown when a conversation fails to load", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Reply": "回复", - "@Reply": { - "description": "Button label for replying to a conversation", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Reply All": "回复所有人", - "@Reply All": { - "description": "Button label for replying to all conversation participants", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unknown User": "未知用户", - "@Unknown User": { - "description": "Label used where the user name is not known", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "me": "本人", - "@me": { - "description": "First-person pronoun (i.e. 'me') that will be used in message author info, e.g. 'Me to 4 others' or 'Jon Snow to me'", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "authorToRecipient": "{authorName} 至 {recipientName}", - "@authorToRecipient": { - "description": "Author info for a single-recipient message; includes both the author name and the recipient name.", - "type": "text", - "placeholders_order": [ - "authorName", - "recipientName" - ], - "placeholders": { - "authorName": {}, - "recipientName": {} - } - }, - "authorToNOthers": "{howMany,plural, =1{{authorName}至另外1个}other{{authorName}至另外{howMany}个}}", - "@authorToNOthers": { - "description": "Author info for a mutli-recipient message; includes the author name and the number of recipients", - "type": "text", - "placeholders_order": [ - "authorName", - "howMany" - ], - "placeholders": { - "authorName": {}, - "howMany": {} - } - }, - "authorToRecipientAndNOthers": "{howMany,plural, =1{{authorName}至{recipientName}和另外1个}other{{authorName}至{recipientName}和另外{howMany}个}}", - "@authorToRecipientAndNOthers": { - "description": "Author info for a multi-recipient message; includes the author name, one recipient name, and the number of other recipients", - "type": "text", - "placeholders_order": [ - "authorName", - "recipientName", - "howMany" - ], - "placeholders": { - "authorName": {}, - "recipientName": {}, - "howMany": {} - } - }, - "Download": "下载", - "@Download": { - "description": "Label for the button that will begin downloading a file", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Open with another app": "使用其他应用程序打开", - "@Open with another app": { - "description": "Label for the button that will allow users to open a file with another app", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There are no installed applications that can open this file": "未安装可以打开此文件的应用程序", - "@There are no installed applications that can open this file": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unsupported File": "不受支持的文件", - "@Unsupported File": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "This file is unsupported and can’t be viewed through the app": "此文件不受支持,无法通过应用程序查看", - "@This file is unsupported and can’t be viewed through the app": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unable to play this media file": "无法播放此媒体文件", - "@Unable to play this media file": { - "description": "Message shown when audio or video media could not be played", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unable to load this image": "无法加载此图片", - "@Unable to load this image": { - "description": "Message shown when an image file could not be loaded or displayed", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading this file": "加载此文件时发生错误", - "@There was an error loading this file": { - "description": "Message shown when a file could not be loaded or displayed", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Courses": "没有课程", - "@No Courses": { - "description": "Title for having no courses", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Your student’s courses might not be published yet.": "学生的课程可能尚未发布。", - "@Your student’s courses might not be published yet.": { - "description": "Message for having no courses", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading your student’s courses.": "加载学生的课程时发生错误。", - "@There was an error loading your student’s courses.": { - "description": "Message displayed when the list of student courses could not be loaded", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Grade": "没有评分", - "@No Grade": { - "description": "Message shown when there is currently no grade available for a course", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Filter by": "筛选条件", - "@Filter by": { - "description": "Title for list of terms to filter grades by", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Grades": "评分", - "@Grades": { - "description": "Label for the \"Grades\" tab in course details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Syllabus": "教学大纲", - "@Syllabus": { - "description": "Label for the \"Syllabus\" tab in course details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Front Page": "首页", - "@Front Page": { - "description": "Label for the \"Front Page\" tab in course details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Summary": "摘要", - "@Summary": { - "description": "Label for the \"Summary\" tab in course details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Send a message about this course": "发送有关此课程的消息", - "@Send a message about this course": { - "description": "Accessibility hint for the course messaage floating action button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Total Grade": "总分", - "@Total Grade": { - "description": "Label for the total grade in the course", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Graded": "已评分", - "@Graded": { - "description": "Label for assignments that have been graded", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Submitted": "已提交", - "@Submitted": { - "description": "Label for assignments that have been submitted", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Not Submitted": "未提交", - "@Not Submitted": { - "description": "Label for assignments that have not been submitted", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Late": "迟交", - "@Late": { - "description": "Label for assignments that have been marked late or submitted late", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Missing": "未交", - "@Missing": { - "description": "Label for assignments that have been marked missing or are not submitted and past the due date", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "-": "-", - "@-": { - "description": "Value representing no score for student submission", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "All Grading Periods": "所有评分周期", - "@All Grading Periods": { - "description": "Label for selecting all grading periods", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Assignments": "无作业", - "@No Assignments": { - "description": "Title for the no assignments message", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "It looks like assignments haven't been created in this space yet.": "似乎尚未在此区域创建作业。", - "@It looks like assignments haven't been created in this space yet.": { - "description": "Message for no assignments", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading the summary details for this course.": "加载此课程的摘要详情时发生错误。", - "@There was an error loading the summary details for this course.": { - "description": "Message shown when the course summary could not be loaded", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Summary": "无摘要", - "@No Summary": { - "description": "Title displayed when there are no items in the course summary", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "This course does not have any assignments or calendar events yet.": "此课程暂时没有任何作业或日历活动。", - "@This course does not have any assignments or calendar events yet.": { - "description": "Message displayed when there are no items in the course summary", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "gradeFormatScoreOutOfPointsPossible": "{score}/{pointsPossible}", - "@gradeFormatScoreOutOfPointsPossible": { - "description": "Formatted string for a student score out of the points possible", - "type": "text", - "placeholders_order": [ - "score", - "pointsPossible" - ], - "placeholders": { - "score": {}, - "pointsPossible": {} - } - }, - "contentDescriptionScoreOutOfPointsPossible": "得分 {score},总分 {pointsPossible}", - "@contentDescriptionScoreOutOfPointsPossible": { - "description": "Formatted string for a student score out of the points possible", - "type": "text", - "placeholders_order": [ - "score", - "pointsPossible" - ], - "placeholders": { - "score": {}, - "pointsPossible": {} - } - }, - "gradesSubjectMessage": "事由:{studentName},评分", - "@gradesSubjectMessage": { - "description": "The subject line for a message to a teacher regarding a student's grades", - "type": "text", - "placeholders_order": [ - "studentName" - ], - "placeholders": { - "studentName": {} - } - }, - "syllabusSubjectMessage": "事由:{studentName},教学大纲", - "@syllabusSubjectMessage": { - "description": "The subject line for a message to a teacher regarding a course syllabus", - "type": "text", - "placeholders_order": [ - "studentName" - ], - "placeholders": { - "studentName": {} - } - }, - "frontPageSubjectMessage": "事由:{studentName},首页", - "@frontPageSubjectMessage": { - "description": "The subject line for a message to a teacher regarding a course front page", - "type": "text", - "placeholders_order": [ - "studentName" - ], - "placeholders": { - "studentName": {} - } - }, - "assignmentSubjectMessage": "事由:{studentName},作业 - {assignmentName}", - "@assignmentSubjectMessage": { - "description": "The subject line for a message to a teacher regarding a student's assignment", - "type": "text", - "placeholders_order": [ - "studentName", - "assignmentName" - ], - "placeholders": { - "studentName": {}, - "assignmentName": {} - } - }, - "eventSubjectMessage": "事由:{studentName},活动 - {eventTitle}", - "@eventSubjectMessage": { - "description": "The subject line for a message to a teacher regarding a calendar event", - "type": "text", - "placeholders_order": [ - "studentName", - "eventTitle" - ], - "placeholders": { - "studentName": {}, - "eventTitle": {} - } - }, - "There is no page information available.": "没有可用的页面信息。", - "@There is no page information available.": { - "description": "Description for when no page information is available", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Assignment Details": "作业详情", - "@Assignment Details": { - "description": "Title for the page that shows details for an assignment", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "assignmentTotalPoints": "{points} 分", - "@assignmentTotalPoints": { - "description": "Label used for the total points the assignment is worth", - "type": "text", - "placeholders_order": [ - "points" - ], - "placeholders": { - "points": {} - } - }, - "assignmentTotalPointsAccessible": "{points} 分", - "@assignmentTotalPointsAccessible": { - "description": "Screen reader label used for the total points the assignment is worth", - "type": "text", - "placeholders_order": [ - "points" - ], - "placeholders": { - "points": {} - } - }, - "Due": "截止", - "@Due": { - "description": "Label for an assignment due date", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Grade": "评分", - "@Grade": { - "description": "Label for the section that displays an assignment's grade", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Locked": "已锁定", - "@Locked": { - "description": "Label for when an assignment is locked", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "assignmentLockedModule": "此作业已被模块“{moduleName}”锁定。", - "@assignmentLockedModule": { - "description": "The locked description when an assignment is locked by a module", - "type": "text", - "placeholders_order": [ - "moduleName" - ], - "placeholders": { - "moduleName": {} - } - }, - "Remind Me": "提醒我", - "@Remind Me": { - "description": "Label for the row to set reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Set a date and time to be notified of this specific assignment.": "设定通知此特定作业的日期和时间。", - "@Set a date and time to be notified of this specific assignment.": { - "description": "Description for row to set reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You will be notified about this assignment on…": "您将在...收到有关此作业的通知", - "@You will be notified about this assignment on…": { - "description": "Description for when a reminder is set", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Instructions": "说明", - "@Instructions": { - "description": "Label for the description of the assignment when it has quiz instructions", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Send a message about this assignment": "发送有关此作业的消息", - "@Send a message about this assignment": { - "description": "Accessibility hint for the assignment messaage floating action button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "This app is not authorized for use.": "此程序没有被授权使用。", - "@This app is not authorized for use.": { - "description": "The error shown when the app being used is not verified by Canvas", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The server you entered is not authorized for this app.": "您输入的服务器没有授权此应用程序。", - "@The server you entered is not authorized for this app.": { - "description": "The error shown when the desired login domain is not verified by Canvas", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The user agent for this app is not authorized.": "此应用程序的用户代理未获得授权。", - "@The user agent for this app is not authorized.": { - "description": "The error shown when the user agent during verification is not verified by Canvas", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "We were unable to verify the server for use with this app.": "我们无法验证此应用程序使用的服务器。", - "@We were unable to verify the server for use with this app.": { - "description": "The generic error shown when we are unable to verify with Canvas", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Reminders": "提醒", - "@Reminders": { - "description": "Name of the system notification channel for assignment and event reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Notifications for reminders about assignments and calendar events": "有关作业和日历活动的提醒通知", - "@Notifications for reminders about assignments and calendar events": { - "description": "Description of the system notification channel for assignment and event reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Reminders have changed!": "提醒已更改!", - "@Reminders have changed!": { - "description": "Title of the dialog shown when the user needs to update their reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "In order to provide you with a better experience, we have updated how reminders work. You can add new reminders by viewing an assignment or calendar event and tapping the switch under the \"Remind Me\" section.\n\nBe aware that any reminders created with older versions of this app will not be compatible with the new changes and you will need to create them again.": "为了让您获得更好的体验,我们更新了提醒的工作模式。通过查看作业或日历事件然后点击“提醒我”部分下面的切换按钮,可以添加新提醒。\n\n请注意,使用原来的应用程序版本创建的任何提醒均无法在更改后的新版本中使用,因此需重新创建。", - "@In order to provide you with a better experience, we have updated how reminders work. You can add new reminders by viewing an assignment or calendar event and tapping the switch under the \"Remind Me\" section.\n\nBe aware that any reminders created with older versions of this app will not be compatible with the new changes and you will need to create them again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Not a parent?": "不是家长?", - "@Not a parent?": { - "description": "Title for the screen that shows when the user is not observing any students", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "We couldn't find any students associated with this account": "我们找不到任何与该账户关联的学生", - "@We couldn't find any students associated with this account": { - "description": "Subtitle for the screen that shows when the user is not observing any students", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Are you a student or teacher?": "您是学生还是教师?", - "@Are you a student or teacher?": { - "description": "Label for button that will show users the option to view other Canvas apps in the Play Store", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "One of our other apps might be a better fit. Tap one to visit the Play Store.": "我们的其他应用可能更合适。单击可访问 Play Store。", - "@One of our other apps might be a better fit. Tap one to visit the Play Store.": { - "description": "Description of options to view other Canvas apps in the Play Store", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Return to Login": "返回登录", - "@Return to Login": { - "description": "Label for the button that returns the user to the login screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "STUDENT": "学生", - "@STUDENT": { - "description": "The \"student\" portion of the \"Canvas Student\" app name, in all caps. \"Canvas\" is excluded in this context as it will be displayed to the user as a wordmark image", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "TEACHER": "教师", - "@TEACHER": { - "description": "The \"teacher\" portion of the \"Canvas Teacher\" app name, in all caps. \"Canvas\" is excluded in this context as it will be displayed to the user as a wordmark image", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Canvas Student": "Canvas 学生", - "@Canvas Student": { - "description": "The name of the Canvas Student app. Only \"Student\" should be translated as \"Canvas\" is a brand name in this context and should not be translated.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Canvas Teacher": "Canvas 教师", - "@Canvas Teacher": { - "description": "The name of the Canvas Teacher app. Only \"Teacher\" should be translated as \"Canvas\" is a brand name in this context and should not be translated.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Alerts": "无警告", - "@No Alerts": { - "description": "The title for the empty message to show to users when there are no alerts for the student.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There’s nothing to be notified of yet.": "暂时没有任何通知。", - "@There’s nothing to be notified of yet.": { - "description": "The empty message to show to users when there are no alerts for the student.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "dismissAlertLabel": "拒绝 {alertTitle}", - "@dismissAlertLabel": { - "description": "Accessibility label to dismiss an alert", - "type": "text", - "placeholders_order": [ - "alertTitle" - ], - "placeholders": { - "alertTitle": {} - } - }, - "Course Announcement": "课程公告", - "@Course Announcement": { - "description": "Title for alerts when there is a course announcement", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Institution Announcement": "机构公告", - "@Institution Announcement": { - "description": "Title for alerts when there is an institution announcement", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "assignmentGradeAboveThreshold": "作业评分高于{threshold}", - "@assignmentGradeAboveThreshold": { - "description": "Title for alerts when an assignment grade is above the threshold value", - "type": "text", - "placeholders_order": [ - "threshold" - ], - "placeholders": { - "threshold": {} - } - }, - "assignmentGradeBelowThreshold": "作业评分低于{threshold}", - "@assignmentGradeBelowThreshold": { - "description": "Title for alerts when an assignment grade is below the threshold value", - "type": "text", - "placeholders_order": [ - "threshold" - ], - "placeholders": { - "threshold": {} - } - }, - "courseGradeAboveThreshold": "课程评分高于{threshold}", - "@courseGradeAboveThreshold": { - "description": "Title for alerts when a course grade is above the threshold value", - "type": "text", - "placeholders_order": [ - "threshold" - ], - "placeholders": { - "threshold": {} - } - }, - "courseGradeBelowThreshold": "课程评分低于{threshold}", - "@courseGradeBelowThreshold": { - "description": "Title for alerts when a course grade is below the threshold value", - "type": "text", - "placeholders_order": [ - "threshold" - ], - "placeholders": { - "threshold": {} - } - }, - "Settings": "设置", - "@Settings": { - "description": "Title for the settings screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Theme": "主题、话题", - "@Theme": { - "description": "Label for the light/dark theme section in the settings page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Dark Mode": "暗模式", - "@Dark Mode": { - "description": "Label for the button that enables dark mode", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Light Mode": "亮模式", - "@Light Mode": { - "description": "Label for the button that enables light mode", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "High Contrast Mode": "高对比度模式", - "@High Contrast Mode": { - "description": "Label for the switch that toggles high contrast mode", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Use Dark Theme in Web Content": "在 Web 内容中使用深色主题", - "@Use Dark Theme in Web Content": { - "description": "Label for the switch that toggles dark mode for webviews", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Appearance": "外观", - "@Appearance": { - "description": "Label for the appearance section in the settings page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Successfully submitted!": "已成功提交。", - "@Successfully submitted!": { - "description": "Title displayed in the grade cell for an assignment that has been submitted", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "submissionStatusSuccessSubtitle": "此作业提交时间为{date},{time},正在等待评分", - "@submissionStatusSuccessSubtitle": { - "description": "Subtitle displayed in the grade cell for an assignment that has been submitted and is awaiting a grade", - "type": "text", - "placeholders_order": [ - "date", - "time" - ], - "placeholders": { - "date": {}, - "time": {} - } - }, - "outOfPoints": "{howMany,plural, =1{共1分}other{共{points}分}}", - "@outOfPoints": { - "description": "Description for an assignment grade that has points without a current scoroe", - "type": "text", - "placeholders_order": [ - "points", - "howMany" - ], - "placeholders": { - "points": {}, - "howMany": {} - } - }, - "Excused": "已免除", - "@Excused": { - "description": "Grading status for an assignment marked as excused", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Complete": "完成", - "@Complete": { - "description": "Grading status for an assignment marked as complete", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Incomplete": "未完成", - "@Incomplete": { - "description": "Grading status for an assignment marked as incomplete", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "minus": "负分", - "@minus": { - "description": "Screen reader-friendly replacement for the \"-\" character in letter grades like \"A-\"", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "latePenalty": "迟交罚分 (-{pointsLost})", - "@latePenalty": { - "description": "Text displayed when a late penalty has been applied to the assignment", - "type": "text", - "placeholders_order": [ - "pointsLost" - ], - "placeholders": { - "pointsLost": {} - } - }, - "finalGrade": "最终评分:{grade}", - "@finalGrade": { - "description": "Text that displays the final grade of an assignment", - "type": "text", - "placeholders_order": [ - "grade" - ], - "placeholders": { - "grade": {} - } - }, - "Alert Settings": "警告设置", - "@Alert Settings": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Alert me when…": "当...时警告我", - "@Alert me when…": { - "description": "Header for the screen where the observer chooses the thresholds that will determine when they receive alerts (e.g. when an assignment is graded below 70%)", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Course grade below": "课程评分低于", - "@Course grade below": { - "description": "Label describing the threshold for when the course grade is below a certain percentage", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Course grade above": "课程评分高于", - "@Course grade above": { - "description": "Label describing the threshold for when the course grade is above a certain percentage", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Assignment missing": "缺少作业", - "@Assignment missing": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Assignment grade below": "作业评分低于", - "@Assignment grade below": { - "description": "Label describing the threshold for when an assignment is graded below a certain percentage", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Assignment grade above": "作业评分高于", - "@Assignment grade above": { - "description": "Label describing the threshold for when an assignment is graded above a certain percentage", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Course Announcements": "课程公告", - "@Course Announcements": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Institution Announcements": "机构通告", - "@Institution Announcements": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Never": "从不", - "@Never": { - "description": "Indication that tells the user they will not receive alert notifications of a specific kind", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Grade percentage": "评分百分数", - "@Grade percentage": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading your student's alerts.": "加载学生的警告时发生错误。", - "@There was an error loading your student's alerts.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Must be below 100": "必须低于100", - "@Must be below 100": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "mustBeBelowN": "必须低于{percentage}", - "@mustBeBelowN": { - "description": "Validation error to the user that they must choose a percentage below 'n'", - "type": "text", - "placeholders_order": [ - "percentage" - ], - "placeholders": { - "percentage": { - "example": 5 - } - } - }, - "mustBeAboveN": "必须高于{percentage}", - "@mustBeAboveN": { - "description": "Validation error to the user that they must choose a percentage above 'n'", - "type": "text", - "placeholders_order": [ - "percentage" - ], - "placeholders": { - "percentage": { - "example": 5 - } - } - }, - "Select Student Color": "选择学生颜色", - "@Select Student Color": { - "description": "Title for screen that allows users to assign a color to a specific student", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Electric, blue": "蓝色", - "@Electric, blue": { - "description": "Name of the Electric (blue) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Plum, Purple": "紫色", - "@Plum, Purple": { - "description": "Name of the Plum (purple) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Barney, Fuschia": "粉红", - "@Barney, Fuschia": { - "description": "Name of the Barney (fuschia) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Raspberry, Red": "红色", - "@Raspberry, Red": { - "description": "Name of the Raspberry (red) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Fire, Orange": "橙色", - "@Fire, Orange": { - "description": "Name of the Fire (orange) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Shamrock, Green": "绿色", - "@Shamrock, Green": { - "description": "Name of the Shamrock (green) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "An error occurred while saving your selection. Please try again.": "保存选择时发生错误。请重试。", - "@An error occurred while saving your selection. Please try again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "changeStudentColorLabel": "更改 {studentName} 的颜色", - "@changeStudentColorLabel": { - "description": "Accessibility label for the button that lets users change the color associated with a specific student", - "type": "text", - "placeholders_order": [ - "studentName" - ], - "placeholders": { - "studentName": {} - } - }, - "Teacher": "教师", - "@Teacher": { - "description": "Label for the Teacher enrollment type", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Student": "学生", - "@Student": { - "description": "Label for the Student enrollment type", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "TA": "助教", - "@TA": { - "description": "Label for the Teaching Assistant enrollment type (also known as Teacher Aid or Education Assistant), reduced to a short acronym/initialism if appropriate.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Observer": "观察员", - "@Observer": { - "description": "Label for the Observer enrollment type", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Use Camera": "使用相机", - "@Use Camera": { - "description": "Label for the action item that lets the user capture a photo using the device camera", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Upload File": "上传文件", - "@Upload File": { - "description": "Label for the action item that lets the user upload a file from their device", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Choose from Gallery": "从图库中选择", - "@Choose from Gallery": { - "description": "Label for the action item that lets the user select a photo from their device gallery", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Preparing…": "正在准备...", - "@Preparing…": { - "description": "Message shown while a file is being prepared to attach to a message", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Add student with…": "使用...添加学生", - "@Add student with…": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Add Student": "添加学生", - "@Add Student": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You are not observing any students.": "您未观察任何学生。", - "@You are not observing any students.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading your students.": "加载学生时发生错误。", - "@There was an error loading your students.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Pairing Code": "配对码", - "@Pairing Code": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Students can obtain a pairing code through the Canvas website": "学生可以通过 Canvas 网站获得配对码", - "@Students can obtain a pairing code through the Canvas website": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Enter the student pairing code provided to you. If the pairing code doesn't work, it may have expired": "输入提供给您的学生配对代码。如果配对代码无法使用,可能已过期", - "@Enter the student pairing code provided to you. If the pairing code doesn't work, it may have expired": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Your code is incorrect or expired.": "您的代码错误或已过期。", - "@Your code is incorrect or expired.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Something went wrong trying to create your account, please reach out to your school for assistance.": "尝试创建帐户时遇到错误,请联系您的学校寻求帮助。", - "@Something went wrong trying to create your account, please reach out to your school for assistance.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "QR Code": "二维码", - "@QR Code": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Students can create a QR code using the Canvas Student app on their mobile device": "学生可以使用移动设备上的 Canvas 学生版应用程序创建二维码", - "@Students can create a QR code using the Canvas Student app on their mobile device": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Add new student": "添加新学生", - "@Add new student": { - "description": "Semantics label for the FAB on the Manage Students Screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Select": "选择", - "@Select": { - "description": "Hint text to tell the user to choose one of two options", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I have a Canvas account": "我有 Canvas 帐户", - "@I have a Canvas account": { - "description": "Option to select for users that have a canvas account", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I don't have a Canvas account": "我没有 Canvas 帐户", - "@I don't have a Canvas account": { - "description": "Option to select for users that don't have a canvas account", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Create Account": "创建帐户", - "@Create Account": { - "description": "Button text for account creation confirmation", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Full Name": "全名", - "@Full Name": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Email Address": "电子邮件地址", - "@Email Address": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Password": "密码", - "@Password": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Full Name…": "全名...", - "@Full Name…": { - "description": "hint label for inside form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Email…": "电子邮件...", - "@Email…": { - "description": "hint label for inside form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Password…": "密码...", - "@Password…": { - "description": "hint label for inside form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Please enter full name": "请输入全名", - "@Please enter full name": { - "description": "Error message for form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Please enter an email address": "请输入电子邮件地址", - "@Please enter an email address": { - "description": "Error message for form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Please enter a valid email address": "请输入有效的电子邮件地址", - "@Please enter a valid email address": { - "description": "Error message for form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Password is required": "必须填写密码", - "@Password is required": { - "description": "Error message for form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Password must contain at least 8 characters": "密码必须包含至少 8 个字符", - "@Password must contain at least 8 characters": { - "description": "Error message for form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "qrCreateAccountTos": "点击“创建帐户”即表示,您同意{termsOfService}并确认{privacyPolicy}", - "@qrCreateAccountTos": { - "description": "The text show on the account creation screen", - "type": "text", - "placeholders_order": [ - "termsOfService", - "privacyPolicy" - ], - "placeholders": { - "termsOfService": {}, - "privacyPolicy": {} - } - }, - "Terms of Service": "服务条款", - "@Terms of Service": { - "description": "Label for the Canvas Terms of Service agreement. This will be used in the qrCreateAccountTos text and will be highlighted and clickable", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Privacy Policy": "隐私政策", - "@Privacy Policy": { - "description": "Label for the Canvas Privacy Policy agreement. This will be used in the qrCreateAccountTos text and will be highlighted and clickable", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "View the Privacy Policy": "查看隐私政策", - "@View the Privacy Policy": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Already have an account? ": "已经有一个帐户吗? ", - "@Already have an account? ": { - "description": "Part of multiline text span, includes AccountSignIn1-2, in that order", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Sign In": "登录", - "@Sign In": { - "description": "Part of multiline text span, includes AccountSignIn1-2, in that order", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Hide Password": "隐藏密码", - "@Hide Password": { - "description": "content description for password hide button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Show Password": "显示密码", - "@Show Password": { - "description": "content description for password show button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Terms of Service Link": "服务条款链接", - "@Terms of Service Link": { - "description": "content description for terms of service link", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Privacy Policy Link": "隐私政策链接", - "@Privacy Policy Link": { - "description": "content description for privacy policy link", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Event": "活动", - "@Event": { - "description": "Title for the event details screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Date": "日期", - "@Date": { - "description": "Label for the event date", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Location": "位置", - "@Location": { - "description": "Label for the location information", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Location Specified": "没有具体的位置", - "@No Location Specified": { - "description": "Description for events that do not have a location", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "eventTime": "{startAt} - {endAt}", - "@eventTime": { - "description": "The time the event is happening, example: \"2:00 pm - 4:00 pm\"", - "type": "text", - "placeholders_order": [ - "startAt", - "endAt" - ], - "placeholders": { - "startAt": {}, - "endAt": {} - } - }, - "Set a date and time to be notified of this event.": "设定通知此活动的日期和时间。", - "@Set a date and time to be notified of this event.": { - "description": "Description for row to set event reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You will be notified about this event on…": "您将在...收到有关此活动的通知", - "@You will be notified about this event on…": { - "description": "Description for when an event reminder is set", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Share Your Love for the App": "分享您所喜爱的应用程序", - "@Share Your Love for the App": { - "description": "Label for option to open the app store", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Tell us about your favorite parts of the app": "告诉我们您最喜欢应用程序的部分", - "@Tell us about your favorite parts of the app": { - "description": "Description for option to open the app store", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Legal": "法律", - "@Legal": { - "description": "Label for legal information option", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Privacy policy, terms of use, open source": "隐私政策、使用条款、开放源", - "@Privacy policy, terms of use, open source": { - "description": "Description for legal information option", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Idea for Canvas Parent App [Android]": "构想 Canvas 的[安卓版本]", - "@Idea for Canvas Parent App [Android]": { - "description": "The subject for the email to request a feature", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The following information will help us better understand your idea:": "下面的信息将帮助我们更好地了解您的想法:", - "@The following information will help us better understand your idea:": { - "description": "The header for the users information that is attached to a feature request", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Domain:": "域:", - "@Domain:": { - "description": "The label for the Canvas domain of the logged in user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "User ID:": "用户 ID:", - "@User ID:": { - "description": "The label for the Canvas user ID of the logged in user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Email:": "电子邮箱:", - "@Email:": { - "description": "The label for the eamil of the logged in user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Locale:": "区域设置:", - "@Locale:": { - "description": "The label for the locale of the logged in user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Terms of Use": "使用条款", - "@Terms of Use": { - "description": "Label for the terms of use", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Canvas on GitHub": "GitHub上的Canvas", - "@Canvas on GitHub": { - "description": "Label for the button that opens the Canvas project on GitHub's website", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was a problem loading the Terms of Use": "加载使用条款时发生错误", - "@There was a problem loading the Terms of Use": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Device": "设备", - "@Device": { - "description": "Label used for device manufacturer/model in the error report", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "OS Version": "操作系统版本", - "@OS Version": { - "description": "Label used for device operating system version in the error report", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Version Number": "版本号", - "@Version Number": { - "description": "Label used for the app version number in the error report", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Report A Problem": "报告一个问题", - "@Report A Problem": { - "description": "Title used for generic dialog to report problems", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Subject": "主题", - "@Subject": { - "description": "Label used for Subject text field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "A subject is required.": "必须填写主题。", - "@A subject is required.": { - "description": "Error shown when the subject field is empty", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "An email address is required.": "必须填写电子邮件地址。", - "@An email address is required.": { - "description": "Error shown when the email field is empty", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Description": "说明", - "@Description": { - "description": "Label used for Description text field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "A description is required.": "必须填写描述。", - "@A description is required.": { - "description": "Error shown when the description field is empty", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "How is this affecting you?": "这对您有什么影响?", - "@How is this affecting you?": { - "description": "Label used for the dropdown to select how severe the issue is", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "send": "发送", - "@send": { - "description": "Label used for send button when reporting a problem", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Just a casual question, comment, idea, suggestion…": "只是一个偶然问题、意见、想法、建议...", - "@Just a casual question, comment, idea, suggestion…": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I need some help but it's not urgent.": "我需要一些帮助,但不是迫切的。", - "@I need some help but it's not urgent.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Something's broken but I can work around it to get what I need done.": "系统出错了,但我可以解决它,并完成我所需要做的事。", - "@Something's broken but I can work around it to get what I need done.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I can't get things done until I hear back from you.": "我无法把事情做好,直到我听到您回来。", - "@I can't get things done until I hear back from you.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "EXTREME CRITICAL EMERGENCY!!": "非常紧急!", - "@EXTREME CRITICAL EMERGENCY!!": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Not Graded": "未评分", - "@Not Graded": { - "description": "Description for an assignment has not been graded.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Login flow: Normal": "登录流程:正常", - "@Login flow: Normal": { - "description": "Description for the normal login flow", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Login flow: Canvas": "登录流程:Canvas", - "@Login flow: Canvas": { - "description": "Description for the Canvas login flow", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Login flow: Site Admin": "登录流程:网站管理员", - "@Login flow: Site Admin": { - "description": "Description for the Site Admin login flow", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Login flow: Skip mobile verify": "登录流程:跳过移动设备验证", - "@Login flow: Skip mobile verify": { - "description": "Description for the login flow that skips domain verification for mobile", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Act As User": "临时代理用户", - "@Act As User": { - "description": "Label for the button that allows the user to act (masquerade) as another user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Stop Acting as User": "停止临时代理用户", - "@Stop Acting as User": { - "description": "Label for the button that allows the user to stop acting (masquerading) as another user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "actingAsUser": "您正在临时代理{userName}", - "@actingAsUser": { - "description": "Message shown while acting (masquerading) as another user", - "type": "text", - "placeholders_order": [ - "userName" - ], - "placeholders": { - "userName": {} - } - }, - "\"Act as\" is essentially logging in as this user without a password. You will be able to take any action as if you were this user, and from other users' points of views, it will be as if this user performed them. However, audit logs record that you were the one who performed the actions on behalf of this user.": "“临时代理”实际上已经登录,因为该用户没有密码。您能够像此用户一样执行任何操作,从另一位用户的角度来讲,这将视同由此用户执行这些操作。但是,审计日志记录您是代表该用户执行操作的人。", - "@\"Act as\" is essentially logging in as this user without a password. You will be able to take any action as if you were this user, and from other users' points of views, it will be as if this user performed them. However, audit logs record that you were the one who performed the actions on behalf of this user.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Domain": "域", - "@Domain": { - "description": "Text field hint for domain url input", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You must enter a valid domain": "必须输入有效的域", - "@You must enter a valid domain": { - "description": "Message displayed for domain input error", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "User ID": "用户 ID", - "@User ID": { - "description": "Text field hint for user ID input", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You must enter a user id": "必须输入用户 ID", - "@You must enter a user id": { - "description": "Message displayed for user Id input error", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error trying to act as this user. Please check the Domain and User ID and try again.": "尝试临时代理用户时发生错误。请检查域和用户 ID,然后再试一次。", - "@There was an error trying to act as this user. Please check the Domain and User ID and try again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "endMasqueradeMessage": "您将停止临时代理用户 {userName} 并返回您的原始帐户。", - "@endMasqueradeMessage": { - "description": "Confirmation message displayed when the user wants to stop acting (masquerading) as another user", - "type": "text", - "placeholders_order": [ - "userName" - ], - "placeholders": { - "userName": {} - } - }, - "endMasqueradeLogoutMessage": "您将停止临时代理用户 {userName} 并注销。", - "@endMasqueradeLogoutMessage": { - "description": "Confirmation message displayed when the user wants to stop acting (masquerading) as another user and will be logged out.", - "type": "text", - "placeholders_order": [ - "userName" - ], - "placeholders": { - "userName": {} - } - }, - "How are we doing?": "我们做得怎样?", - "@How are we doing?": { - "description": "Title for dialog asking user to rate the app out of 5 stars.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Don't show again": "不再显示", - "@Don't show again": { - "description": "Button to prevent the rating dialog from showing again.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "What can we do better?": "我们如何能做得更好?", - "@What can we do better?": { - "description": "Hint text for providing a comment with the rating.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Send Feedback": "发送反馈", - "@Send Feedback": { - "description": "Button to send rating with feedback", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "ratingDialogEmailSubject": "Android 版本建议 - Canvas Parent {version}", - "@ratingDialogEmailSubject": { - "description": "The subject for an email to provide feedback for CanvasParent.", - "type": "text", - "placeholders_order": [ - "version" - ], - "placeholders": { - "version": {} - } - }, - "starRating": "{position,plural, =1{{position} 星}other{{position} 星}}", - "@starRating": { - "description": "Accessibility label for the 1 stars to 5 stars rating", - "type": "text", - "placeholders_order": [ - "position" - ], - "placeholders": { - "position": { - "example": 1 - } - } - }, - "Student Pairing": "学生配对", - "@Student Pairing": { - "description": "Title for the screen where users can pair to students using a QR code", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Open Canvas Student": "打开 Canvas 学生版", - "@Open Canvas Student": { - "description": "Title for QR pairing tutorial screen instructing users to open the Canvas Student app", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You'll need to open your student's Canvas Student app to continue. Go into Main Menu > Settings > Pair with Observer and scan the QR code you see there.": "您需打开学生的 Canvas 学生版应用程序才能继续。转到“主菜单 > 设置 > 与旁听者配对”,扫描在其中看到的二维码。", - "@You'll need to open your student's Canvas Student app to continue. Go into Main Menu > Settings > Pair with Observer and scan the QR code you see there.": { - "description": "Message explaining how QR code pairing works", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Screenshot showing location of pairing QR code generation in the Canvas Student app": "截图显示在 Canvas 学生版应用程序中生成配对二维码的位置", - "@Screenshot showing location of pairing QR code generation in the Canvas Student app": { - "description": "Content Description for qr pairing tutorial screenshot", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Expired QR Code": "失效的二维码", - "@Expired QR Code": { - "description": "Error title shown when the users scans a QR code that has expired", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The QR code you scanned may have expired. Refresh the code on the student's device and try again.": "您扫描的二维码已失效。刷新学生设备上的二维码并重试。", - "@The QR code you scanned may have expired. Refresh the code on the student's device and try again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "A network error occurred when adding this student. Check your connection and try again.": "添加此学生时发生网络错误。请检查您的网络连接并重试。", - "@A network error occurred when adding this student. Check your connection and try again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Invalid QR Code": "无效的二维码", - "@Invalid QR Code": { - "description": "Error title shown when the user scans an invalid QR code", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Incorrect Domain": "错误的域", - "@Incorrect Domain": { - "description": "Error title shown when the users scane a QR code for a student that belongs to a different domain", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The student you are trying to add belongs to a different school. Log in or create an account with that school to scan this code.": "您尝试添加的学生属于不同的学校。使用该学校的帐户登录或创建帐户以扫描此二维码。", - "@The student you are trying to add belongs to a different school. Log in or create an account with that school to scan this code.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Camera Permission": "相机权限", - "@Camera Permission": { - "description": "Error title shown when the user wans to scan a QR code but has denied the camera permission", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "This will unpair and remove all enrollments for this student from your account.": "这样做将取消配对并从您的帐户中移除该学生的所有注册。", - "@This will unpair and remove all enrollments for this student from your account.": { - "description": "Confirmation message shown when the user tries to delete a student from their account", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was a problem removing this student from your account. Please check your connection and try again.": "从帐户中移除该学生时发生错误。请检查您的连接,然后再试一次。", - "@There was a problem removing this student from your account. Please check your connection and try again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Cancel": "取消", - "@Cancel": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "next": "下一步", - "@next": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "ok": "确定", - "@ok": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Yes": "是", - "@Yes": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No": "否", - "@No": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Retry": "重试", - "@Retry": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Delete": "删除", - "@Delete": { - "description": "Label used for general delete/remove actions", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Done": "完成", - "@Done": { - "description": "Label for general done/finished actions", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Refresh": "刷新", - "@Refresh": { - "description": "Label for button to refresh data from the web", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "View Description": "查看说明", - "@View Description": { - "description": "Button to view the description for an event or assignment", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "expanded": "展开", - "@expanded": { - "description": "Description for the accessibility reader for list groups that are expanded", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "collapsed": "折叠", - "@collapsed": { - "description": "Description for the accessibility reader for list groups that are expanded", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "An unexpected error occurred": "一个意料之外的错误发生了。", - "@An unexpected error occurred": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No description": "无描述", - "@No description": { - "description": "Message used when the assignment has no description", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Launch External Tool": "启动外部工具", - "@Launch External Tool": { - "description": "Button text added to webviews to let users open external tools in their browser", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Interactions on this page are limited by your institution.": "在此页面上的互动被您的机构限制。", - "@Interactions on this page are limited by your institution.": { - "description": "Message describing how the webview has limited access due to an instution setting", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "dateAtTime": "{date},时间 {time}", - "@dateAtTime": { - "description": "The string to format dates", - "type": "text", - "placeholders_order": [ - "date", - "time" - ], - "placeholders": { - "date": {}, - "time": {} - } - }, - "dueDateAtTime": "截止于 {date},{time}", - "@dueDateAtTime": { - "description": "The string to format due dates", - "type": "text", - "placeholders_order": [ - "date", - "time" - ], - "placeholders": { - "date": {}, - "time": {} - } - }, - "No Due Date": "无截止日期", - "@No Due Date": { - "description": "Label for assignments that do not have a due date", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Filter": "筛选器", - "@Filter": { - "description": "Label for buttons to filter what items are visible", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "unread": "未读", - "@unread": { - "description": "Label for things that are marked as unread", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "unreadCount": "{count}未读", - "@unreadCount": { - "description": "Formatted string for when there are a number of unread items", - "type": "text", - "placeholders_order": [ - "count" - ], - "placeholders": { - "count": {} - } - }, - "badgeNumberPlus": "{count}+", - "@badgeNumberPlus": { - "description": "Formatted string for when too many items are being notified in a badge, generally something like: 99+", - "type": "text", - "placeholders_order": [ - "count" - ], - "placeholders": { - "count": {} - } - }, - "There was an error loading this announcement": "加载此公告时发生错误", - "@There was an error loading this announcement": { - "description": "Message shown when an announcement detail screen fails to load", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Network error": "网络错误", - "@Network error": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Under Construction": "正在建设中", - "@Under Construction": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "We are currently building this feature for your viewing pleasure.": "我们目前在构建此功能,以便为您提供愉悦的浏览体验。", - "@We are currently building this feature for your viewing pleasure.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Request Login Help Button": "请求登录帮助按钮", - "@Request Login Help Button": { - "description": "Accessibility hint for button that opens help dialog for a login help request", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Request Login Help": "请求登录帮助", - "@Request Login Help": { - "description": "Title of help dialog for a login help request", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I'm having trouble logging in": "我在登录时遇到问题", - "@I'm having trouble logging in": { - "description": "Subject of help dialog for a login help request", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "An error occurred when trying to display this link": "尝试显示此链接时发生错误", - "@An error occurred when trying to display this link": { - "description": "Error message shown when a link can't be opened", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "We are unable to display this link, it may belong to an institution you currently aren't logged in to.": "无法显示此链接,可能属于您目前未登录的机构。", - "@We are unable to display this link, it may belong to an institution you currently aren't logged in to.": { - "description": "Description for error page shown when clicking a link", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Link Error": "链接错误", - "@Link Error": { - "description": "Title for error page shown when clicking a link", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Open In Browser": "在浏览器里打开", - "@Open In Browser": { - "description": "Text for button to open a link in the browswer", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You'll find the QR code on the web in your account profile. Click 'QR for Mobile Login' in the list.": "在 Web 的帐户个人资料中可以找到二维码。点击列表中的“用于移动设备登录的二维码”。", - "@You'll find the QR code on the web in your account profile. Click 'QR for Mobile Login' in the list.": { - "description": "Text for qr login tutorial screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Locate QR Code": "查找二维码", - "@Locate QR Code": { - "description": "Text for qr login button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Please scan a QR code generated by Canvas": "请扫描 Canvas 生成的二维码", - "@Please scan a QR code generated by Canvas": { - "description": "Text for qr login error with incorrect qr code", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error logging in. Please generate another QR Code and try again.": "登录时发生错误。请生成新的二维码并重试。", - "@There was an error logging in. Please generate another QR Code and try again.": { - "description": "Text for qr login error", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Screenshot showing location of QR code generation in browser": "在浏览器中显示二维码生成位置的截图", - "@Screenshot showing location of QR code generation in browser": { - "description": "Content Description for qr login tutorial screenshot", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "QR scanning requires camera access": "扫描二维码要求具有相机访问权限", - "@QR scanning requires camera access": { - "description": "placeholder for camera error for QR code scan", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The linked item is no longer available": "链接项目不再可用", - "@The linked item is no longer available": { - "description": "error message when the alert could no be opened", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Message sent": "消息已发送", - "@Message sent": { - "description": "confirmation message on the screen when the user succesfully sends a message", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Acceptable Use Policy": "可接受的使用政策", - "@Acceptable Use Policy": { - "description": "title for the acceptable use policy screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Submit": "提交", - "@Submit": { - "description": "submit button title for acceptable use policy screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Either you're a new user or the Acceptable Use Policy has changed since you last agreed to it. Please agree to the Acceptable Use Policy before you continue.": "您是新用户,或者自您上次同意可接受的使用政策后,该政策已更改。请同意“可接受的使用政策”后再继续。", - "@Either you're a new user or the Acceptable Use Policy has changed since you last agreed to it. Please agree to the Acceptable Use Policy before you continue.": { - "description": "acceptable use policy screen description", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I agree to the Acceptable Use Policy.": "我同意“可接受的使用政策”。", - "@I agree to the Acceptable Use Policy.": { - "description": "acceptable use policy switch title", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "About": "关于", - "@About": { - "description": "Title for about menu item in settings", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "App": "应用程序", - "@App": { - "description": "Title for App field on about page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Login ID": "登录 ID", - "@Login ID": { - "description": "Title for Login ID field on about page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Email": "电子邮件", - "@Email": { - "description": "Title for Email field on about page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Version": "版本", - "@Version": { - "description": "Title for Version field on about page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Instructure logo": "Instructure 徽标", - "@Instructure logo": { - "description": "Semantics label for the Instructure logo on the about page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - } -} \ No newline at end of file diff --git a/apps/flutter_parent/lib/l10n/res/intl_zh_HK.arb b/apps/flutter_parent/lib/l10n/res/intl_zh_HK.arb deleted file mode 100644 index 3cb50f9e11..0000000000 --- a/apps/flutter_parent/lib/l10n/res/intl_zh_HK.arb +++ /dev/null @@ -1,2753 +0,0 @@ -{ - "@@last_modified": "2023-08-25T11:04:20.901151", - "alertsLabel": "提醒", - "@alertsLabel": { - "description": "The label for the Alerts tab", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "calendarLabel": "行事曆", - "@calendarLabel": { - "description": "The label for the Calendar tab", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "coursesLabel": "課程", - "@coursesLabel": { - "description": "The label for the Courses tab", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Students": "無學生", - "@No Students": { - "description": "Text for when an observer has no students they are observing", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Tap to show student selector": "點選以顯示學生選擇器", - "@Tap to show student selector": { - "description": "Semantics label for the area that will show the student selector when tapped", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Tap to pair with a new student": "點選以和新學生配對", - "@Tap to pair with a new student": { - "description": "Semantics label for the add student button in the student selector", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Tap to select this student": "點選以選擇此學生", - "@Tap to select this student": { - "description": "Semantics label on individual students in the student switcher", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Manage Students": "管理學生", - "@Manage Students": { - "description": "Label text for the Manage Students nav drawer button as well as the title for the Manage Students screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Help": "支援", - "@Help": { - "description": "Label text for the help nav drawer button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Log Out": "登出", - "@Log Out": { - "description": "Label text for the Log Out nav drawer button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Switch Users": "切換使用者", - "@Switch Users": { - "description": "Label text for the Switch Users nav drawer button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "appVersion": "v. {version}", - "@appVersion": { - "description": "App version shown in the navigation drawer", - "type": "text", - "placeholders_order": [ - "version" - ], - "placeholders": { - "version": {} - } - }, - "Are you sure you want to log out?": "是否確定登出?", - "@Are you sure you want to log out?": { - "description": "Confirmation message displayed when the user tries to log out", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Calendars": "行事曆", - "@Calendars": { - "description": "Label for button that lets users select which calendars to display", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "nextMonth": "下個月:{month}", - "@nextMonth": { - "description": "Label for the button that switches the calendar to the next month", - "type": "text", - "placeholders_order": [ - "month" - ], - "placeholders": { - "month": {} - } - }, - "previousMonth": "上個月:{month}", - "@previousMonth": { - "description": "Label for the button that switches the calendar to the previous month", - "type": "text", - "placeholders_order": [ - "month" - ], - "placeholders": { - "month": {} - } - }, - "nextWeek": "下一週開始 {date}", - "@nextWeek": { - "description": "Label for the button that switches the calendar to the next week", - "type": "text", - "placeholders_order": [ - "date" - ], - "placeholders": { - "date": {} - } - }, - "previousWeek": "上一週開始 {date}", - "@previousWeek": { - "description": "Label for the button that switches the calendar to the previous week", - "type": "text", - "placeholders_order": [ - "date" - ], - "placeholders": { - "date": {} - } - }, - "selectedMonthLabel": "{month} 的月份", - "@selectedMonthLabel": { - "description": "Accessibility label for the button that expands/collapses the month view", - "type": "text", - "placeholders_order": [ - "month" - ], - "placeholders": { - "month": {} - } - }, - "expand": "展開", - "@expand": { - "description": "Accessibility label for the on-tap hint for the button that expands/collapses the month view", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "collapse": "收起", - "@collapse": { - "description": "Accessibility label for the on-tap hint for the button that expands/collapses the month view", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "pointsPossible": "可能 {points} 分", - "@pointsPossible": { - "description": "Screen reader label used for the points possible for an assignment, quiz, etc.", - "type": "text", - "placeholders_order": [ - "points" - ], - "placeholders": { - "points": {} - } - }, - "calendarDaySemanticsLabel": "{eventCount,plural, =1{{date}、{eventCount} 活動}other{{date}、{eventCount} 活動}}", - "@calendarDaySemanticsLabel": { - "description": "Screen reader label used for calendar day, reads the date and count of events", - "type": "text", - "placeholders_order": [ - "date", - "eventCount" - ], - "placeholders": { - "date": {}, - "eventCount": {} - } - }, - "No Events Today!": "今天並無活動!", - "@No Events Today!": { - "description": "Title displayed when there are no calendar events for the current day", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "It looks like a great day to rest, relax, and recharge.": "看來是適合休息、放鬆和充電的一天。", - "@It looks like a great day to rest, relax, and recharge.": { - "description": "Message displayed when there are no calendar events for the current day", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading your student's calendar": "載入您的學生的行事曆時發生錯誤", - "@There was an error loading your student's calendar": { - "description": "Message displayed when calendar events could not be loaded for the current student", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Tap to favorite the courses you want to see on the Calendar. Select up to 10.": "點選以選擇您要在行事曆上看到的最愛課程。選擇最多 10 個。", - "@Tap to favorite the courses you want to see on the Calendar. Select up to 10.": { - "description": "Description text on calendar filter screen.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You may only choose 10 calendars to display": "您只能選擇顯示 10 個行事曆", - "@You may only choose 10 calendars to display": { - "description": "Error text when trying to select more than 10 calendars", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You must select at least one calendar to display": "必須選擇最少顯示一個行事曆", - "@You must select at least one calendar to display": { - "description": "Error text when trying to de-select all calendars", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Planner Note": "規劃注釋", - "@Planner Note": { - "description": "Label used for notes in the planner", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Go to today": "前往今天", - "@Go to today": { - "description": "Accessibility label used for the today button in the planner", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Previous Logins": "先前登入", - "@Previous Logins": { - "description": "Label for the list of previous user logins", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "canvasLogoLabel": "Canvas 標誌", - "@canvasLogoLabel": { - "description": "The semantics label for the Canvas logo", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "findSchool": "尋找學校", - "@findSchool": { - "description": "Text for the find-my-school button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "findAnotherSchool": "尋找其他學校", - "@findAnotherSchool": { - "description": "Text for the find-another-school button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "domainSearchInputHint": "輸入學校名稱或地區…", - "@domainSearchInputHint": { - "description": "Input hint for the text box on the domain search screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "noDomainResults": "找不到符合 \"{query}\" 的學校", - "@noDomainResults": { - "description": "Message shown to users when the domain search query did not return any results", - "type": "text", - "placeholders_order": [ - "query" - ], - "placeholders": { - "query": {} - } - }, - "domainSearchHelpLabel": "如何找到我的學校?", - "@domainSearchHelpLabel": { - "description": "Label for the help button on the domain search screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "canvasGuides": "Canvas 指南", - "@canvasGuides": { - "description": "Proper name for the Canvas Guides. This will be used in the domainSearchHelpBody text and will be highlighted and clickable", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "canvasSupport": "Canvas 支援", - "@canvasSupport": { - "description": "Proper name for Canvas Support. This will be used in the domainSearchHelpBody text and will be highlighted and clickable", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "domainSearchHelpBody": "嘗試搜尋您試著存取的學校或地區的名稱,例如“Smith Private School”或“Smith County Schools”。您也可以直接輸入 Canvas 網域,例如“smith.instructure.com”。\n\n如需更多有關尋找您的機構的 Canvas 帳戶的資訊,您可以瀏覽 {canvasGuides}、連線到 {canvasSupport} 或聯絡您的學校尋求協助。", - "@domainSearchHelpBody": { - "description": "The body text shown in the help dialog on the domain search screen", - "type": "text", - "placeholders_order": [ - "canvasGuides", - "canvasSupport" - ], - "placeholders": { - "canvasGuides": {}, - "canvasSupport": {} - } - }, - "Uh oh!": "噢!", - "@Uh oh!": { - "description": "Title of the screen that shows when a crash has occurred", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "We’re not sure what happened, but it wasn’t good. Contact us if this keeps happening.": "不確定發生什麼事,但不是好事。如果持續發生,請聯絡我們。", - "@We’re not sure what happened, but it wasn’t good. Contact us if this keeps happening.": { - "description": "Message shown when a crash has occurred", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Contact Support": "聯絡支援", - "@Contact Support": { - "description": "Label for the button that allows users to contact support after a crash has occurred", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "View error details": "檢視錯誤詳細資料", - "@View error details": { - "description": "Label for the button that allowed users to view crash details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Restart app": "重新啟動應用程式", - "@Restart app": { - "description": "Label for the button that will restart the entire application", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Application version": "應用程式版本", - "@Application version": { - "description": "Label for the application version displayed in the crash details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Device model": "裝置機型", - "@Device model": { - "description": "Label for the device model displayed in the crash details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Android OS version": "Android 作業系統版本", - "@Android OS version": { - "description": "Label for the Android operating system version displayed in the crash details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Full error message": "完整錯誤訊息", - "@Full error message": { - "description": "Label for the full error message displayed in the crash details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Inbox": "收件匣", - "@Inbox": { - "description": "Title for the Inbox screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading your inbox messages.": "載入您的收件匣訊息時發生錯誤。", - "@There was an error loading your inbox messages.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Subject": "無主題", - "@No Subject": { - "description": "Title used for inbox messages that have no subject", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unable to fetch courses. Please check your connection and try again.": "無法取得課程。請檢查您的連接然後重試。", - "@Unable to fetch courses. Please check your connection and try again.": { - "description": "Message shown when an error occured while loading courses", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Choose a course to message": "選擇課程以傳送訊息", - "@Choose a course to message": { - "description": "Header in the course list shown when the user is choosing which course to associate with a new message", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Inbox Zero": "收件匣無訊息", - "@Inbox Zero": { - "description": "Title of the message shown when there are no inbox messages", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You’re all caught up!": "您已讀完所有新訊息!", - "@You’re all caught up!": { - "description": "Subtitle of the message shown when there are no inbox messages", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading recipients for this course": "載入此課程的收件人時發生錯誤", - "@There was an error loading recipients for this course": { - "description": "Message shown when attempting to create a new message but the recipients list failed to load", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unable to send message. Check your connection and try again.": "無法傳送訊息。請檢查您的連線,然後再試一次。", - "@Unable to send message. Check your connection and try again.": { - "description": "Message show when there was an error creating or sending a new message", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unsaved changes": "未儲存的變更", - "@Unsaved changes": { - "description": "Title of the dialog shown when the user tries to leave with unsaved changes", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Are you sure you wish to close this page? Your unsent message will be lost.": "是否確定要關閉此頁面?將遺失未傳送的訊息。", - "@Are you sure you wish to close this page? Your unsent message will be lost.": { - "description": "Body text of the dialog shown when the user tries leave with unsaved changes", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "New message": "新訊息", - "@New message": { - "description": "Title of the new-message screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Add attachment": "添加附件", - "@Add attachment": { - "description": "Tooltip for the add-attachment button in the new-message screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Send message": "傳送訊息", - "@Send message": { - "description": "Tooltip for the send-message button in the new-message screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Select recipients": "選擇收件人", - "@Select recipients": { - "description": "Tooltip for the button that allows users to select message recipients", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No recipients selected": "未選擇收件人", - "@No recipients selected": { - "description": "Hint displayed when the user has not selected any message recipients", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Message subject": "訊息主題", - "@Message subject": { - "description": "Hint text displayed in the input field for the message subject", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Message": "訊息", - "@Message": { - "description": "Hint text displayed in the input field for the message body", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Recipients": "收件人", - "@Recipients": { - "description": "Label for message recipients", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "plusRecipientCount": "+{count}", - "@plusRecipientCount": { - "description": "Shows the number of recipients that are selected but not displayed on screen.", - "type": "text", - "placeholders_order": [ - "count" - ], - "placeholders": { - "count": { - "example": 5 - } - } - }, - "Failed. Tap for options.": "失敗。點選選項。", - "@Failed. Tap for options.": { - "description": "Short message shown on a message attachment when uploading has failed", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "courseForWhom": "針對 {studentShortName}", - "@courseForWhom": { - "description": "Describes for whom a course is for (i.e. for Bill)", - "type": "text", - "placeholders_order": [ - "studentShortName" - ], - "placeholders": { - "studentShortName": {} - } - }, - "messageLinkPostscript": "關於:{studentName},{linkUrl}", - "@messageLinkPostscript": { - "description": "A postscript appended to new messages that clarifies which student is the subject of the message and also includes a URL for the related Canvas component (course, assignment, event, etc).", - "type": "text", - "placeholders_order": [ - "studentName", - "linkUrl" - ], - "placeholders": { - "studentName": {}, - "linkUrl": {} - } - }, - "There was an error loading this conversation": "載入此交談時發生錯誤", - "@There was an error loading this conversation": { - "description": "Message shown when a conversation fails to load", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Reply": "回覆", - "@Reply": { - "description": "Button label for replying to a conversation", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Reply All": "全部回覆", - "@Reply All": { - "description": "Button label for replying to all conversation participants", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unknown User": "未知使用者", - "@Unknown User": { - "description": "Label used where the user name is not known", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "me": "我", - "@me": { - "description": "First-person pronoun (i.e. 'me') that will be used in message author info, e.g. 'Me to 4 others' or 'Jon Snow to me'", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "authorToRecipient": "{authorName} 至 {recipientName}", - "@authorToRecipient": { - "description": "Author info for a single-recipient message; includes both the author name and the recipient name.", - "type": "text", - "placeholders_order": [ - "authorName", - "recipientName" - ], - "placeholders": { - "authorName": {}, - "recipientName": {} - } - }, - "authorToNOthers": "{howMany,plural, =1{{authorName} 到 1 個其他}other{{authorName} 到 {howMany} 其他}}", - "@authorToNOthers": { - "description": "Author info for a mutli-recipient message; includes the author name and the number of recipients", - "type": "text", - "placeholders_order": [ - "authorName", - "howMany" - ], - "placeholders": { - "authorName": {}, - "howMany": {} - } - }, - "authorToRecipientAndNOthers": "{howMany,plural, =1{{authorName} 到 {recipientName} 和 1 個其他}other{{authorName} 到 {recipientName} 和 {howMany} 其他}}", - "@authorToRecipientAndNOthers": { - "description": "Author info for a multi-recipient message; includes the author name, one recipient name, and the number of other recipients", - "type": "text", - "placeholders_order": [ - "authorName", - "recipientName", - "howMany" - ], - "placeholders": { - "authorName": {}, - "recipientName": {}, - "howMany": {} - } - }, - "Download": "下載", - "@Download": { - "description": "Label for the button that will begin downloading a file", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Open with another app": "使用其他應用程式開啟", - "@Open with another app": { - "description": "Label for the button that will allow users to open a file with another app", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There are no installed applications that can open this file": "未安裝可開啟此檔案的應用程式", - "@There are no installed applications that can open this file": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unsupported File": "不支援的檔案", - "@Unsupported File": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "This file is unsupported and can’t be viewed through the app": "不支援此檔案,而且無法透過應用程式檢視", - "@This file is unsupported and can’t be viewed through the app": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unable to play this media file": "無法播放此媒體檔案", - "@Unable to play this media file": { - "description": "Message shown when audio or video media could not be played", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unable to load this image": "無法載入此影像", - "@Unable to load this image": { - "description": "Message shown when an image file could not be loaded or displayed", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading this file": "載入此檔案時發生錯誤", - "@There was an error loading this file": { - "description": "Message shown when a file could not be loaded or displayed", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Courses": "無課程", - "@No Courses": { - "description": "Title for having no courses", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Your student’s courses might not be published yet.": "您的學生的課程可能尚未發佈。", - "@Your student’s courses might not be published yet.": { - "description": "Message for having no courses", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading your student’s courses.": "載入您的學生的課程時發生錯誤。", - "@There was an error loading your student’s courses.": { - "description": "Message displayed when the list of student courses could not be loaded", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Grade": "無評分", - "@No Grade": { - "description": "Message shown when there is currently no grade available for a course", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Filter by": "篩選條件", - "@Filter by": { - "description": "Title for list of terms to filter grades by", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Grades": "成績", - "@Grades": { - "description": "Label for the \"Grades\" tab in course details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Syllabus": "課程大綱", - "@Syllabus": { - "description": "Label for the \"Syllabus\" tab in course details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Front Page": "首頁", - "@Front Page": { - "description": "Label for the \"Front Page\" tab in course details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Summary": "摘要", - "@Summary": { - "description": "Label for the \"Summary\" tab in course details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Send a message about this course": "傳送與此學生有關的訊息", - "@Send a message about this course": { - "description": "Accessibility hint for the course messaage floating action button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Total Grade": "總評級", - "@Total Grade": { - "description": "Label for the total grade in the course", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Graded": "已評分", - "@Graded": { - "description": "Label for assignments that have been graded", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Submitted": "已提交", - "@Submitted": { - "description": "Label for assignments that have been submitted", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Not Submitted": "未提交", - "@Not Submitted": { - "description": "Label for assignments that have not been submitted", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Late": "逾期", - "@Late": { - "description": "Label for assignments that have been marked late or submitted late", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Missing": "缺少", - "@Missing": { - "description": "Label for assignments that have been marked missing or are not submitted and past the due date", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "-": "-", - "@-": { - "description": "Value representing no score for student submission", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "All Grading Periods": "所有評分期", - "@All Grading Periods": { - "description": "Label for selecting all grading periods", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Assignments": "無作業", - "@No Assignments": { - "description": "Title for the no assignments message", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "It looks like assignments haven't been created in this space yet.": "此空間中尚未建立任何作業。", - "@It looks like assignments haven't been created in this space yet.": { - "description": "Message for no assignments", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading the summary details for this course.": "載入此課程的摘要詳細資料時發生錯誤。", - "@There was an error loading the summary details for this course.": { - "description": "Message shown when the course summary could not be loaded", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Summary": "無摘要", - "@No Summary": { - "description": "Title displayed when there are no items in the course summary", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "This course does not have any assignments or calendar events yet.": "此課程還沒有任何作業列表或行事曆。", - "@This course does not have any assignments or calendar events yet.": { - "description": "Message displayed when there are no items in the course summary", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "gradeFormatScoreOutOfPointsPossible": "{score} / {pointsPossible}", - "@gradeFormatScoreOutOfPointsPossible": { - "description": "Formatted string for a student score out of the points possible", - "type": "text", - "placeholders_order": [ - "score", - "pointsPossible" - ], - "placeholders": { - "score": {}, - "pointsPossible": {} - } - }, - "contentDescriptionScoreOutOfPointsPossible": "得分為 {score},滿分為 {pointsPossible}", - "@contentDescriptionScoreOutOfPointsPossible": { - "description": "Formatted string for a student score out of the points possible", - "type": "text", - "placeholders_order": [ - "score", - "pointsPossible" - ], - "placeholders": { - "score": {}, - "pointsPossible": {} - } - }, - "gradesSubjectMessage": "關於:{studentName},成績", - "@gradesSubjectMessage": { - "description": "The subject line for a message to a teacher regarding a student's grades", - "type": "text", - "placeholders_order": [ - "studentName" - ], - "placeholders": { - "studentName": {} - } - }, - "syllabusSubjectMessage": "關於:{studentName},課程大綱", - "@syllabusSubjectMessage": { - "description": "The subject line for a message to a teacher regarding a course syllabus", - "type": "text", - "placeholders_order": [ - "studentName" - ], - "placeholders": { - "studentName": {} - } - }, - "frontPageSubjectMessage": "關於:{studentName},封面頁", - "@frontPageSubjectMessage": { - "description": "The subject line for a message to a teacher regarding a course front page", - "type": "text", - "placeholders_order": [ - "studentName" - ], - "placeholders": { - "studentName": {} - } - }, - "assignmentSubjectMessage": "關於:{studentName},作業 - {assignmentName}", - "@assignmentSubjectMessage": { - "description": "The subject line for a message to a teacher regarding a student's assignment", - "type": "text", - "placeholders_order": [ - "studentName", - "assignmentName" - ], - "placeholders": { - "studentName": {}, - "assignmentName": {} - } - }, - "eventSubjectMessage": "關於:{studentName},活動 - {eventTitle}", - "@eventSubjectMessage": { - "description": "The subject line for a message to a teacher regarding a calendar event", - "type": "text", - "placeholders_order": [ - "studentName", - "eventTitle" - ], - "placeholders": { - "studentName": {}, - "eventTitle": {} - } - }, - "There is no page information available.": "沒有可用的頁面資訊。", - "@There is no page information available.": { - "description": "Description for when no page information is available", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Assignment Details": "作業詳細資料", - "@Assignment Details": { - "description": "Title for the page that shows details for an assignment", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "assignmentTotalPoints": "{points} 分", - "@assignmentTotalPoints": { - "description": "Label used for the total points the assignment is worth", - "type": "text", - "placeholders_order": [ - "points" - ], - "placeholders": { - "points": {} - } - }, - "assignmentTotalPointsAccessible": "{points} 分", - "@assignmentTotalPointsAccessible": { - "description": "Screen reader label used for the total points the assignment is worth", - "type": "text", - "placeholders_order": [ - "points" - ], - "placeholders": { - "points": {} - } - }, - "Due": "截止", - "@Due": { - "description": "Label for an assignment due date", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Grade": "評分", - "@Grade": { - "description": "Label for the section that displays an assignment's grade", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Locked": "已鎖定", - "@Locked": { - "description": "Label for when an assignment is locked", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "assignmentLockedModule": "此作業由單元 \"{moduleName}\" 鎖定。", - "@assignmentLockedModule": { - "description": "The locked description when an assignment is locked by a module", - "type": "text", - "placeholders_order": [ - "moduleName" - ], - "placeholders": { - "moduleName": {} - } - }, - "Remind Me": "提醒我", - "@Remind Me": { - "description": "Label for the row to set reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Set a date and time to be notified of this specific assignment.": "設定通知此指定作業的日期和時間。", - "@Set a date and time to be notified of this specific assignment.": { - "description": "Description for row to set reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You will be notified about this assignment on…": "將在以下時間通知您關於此作業…", - "@You will be notified about this assignment on…": { - "description": "Description for when a reminder is set", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Instructions": "教學", - "@Instructions": { - "description": "Label for the description of the assignment when it has quiz instructions", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Send a message about this assignment": "傳送與此作業有關的訊息", - "@Send a message about this assignment": { - "description": "Accessibility hint for the assignment messaage floating action button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "This app is not authorized for use.": "該 app 程式未獲得使用權限。", - "@This app is not authorized for use.": { - "description": "The error shown when the app being used is not verified by Canvas", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The server you entered is not authorized for this app.": "您輸入的伺服器未獲得使用該應用程式的授權。", - "@The server you entered is not authorized for this app.": { - "description": "The error shown when the desired login domain is not verified by Canvas", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The user agent for this app is not authorized.": "該應用程式的使用者代理未獲得授權。", - "@The user agent for this app is not authorized.": { - "description": "The error shown when the user agent during verification is not verified by Canvas", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "We were unable to verify the server for use with this app.": "無法確認此應用程式使用的伺服器。", - "@We were unable to verify the server for use with this app.": { - "description": "The generic error shown when we are unable to verify with Canvas", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Reminders": "提醒", - "@Reminders": { - "description": "Name of the system notification channel for assignment and event reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Notifications for reminders about assignments and calendar events": "與作業和行事曆活動有關的提醒通知", - "@Notifications for reminders about assignments and calendar events": { - "description": "Description of the system notification channel for assignment and event reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Reminders have changed!": "提醒功能已改變!", - "@Reminders have changed!": { - "description": "Title of the dialog shown when the user needs to update their reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "In order to provide you with a better experience, we have updated how reminders work. You can add new reminders by viewing an assignment or calendar event and tapping the switch under the \"Remind Me\" section.\n\nBe aware that any reminders created with older versions of this app will not be compatible with the new changes and you will need to create them again.": "為向您提供更佳體驗,我們更新了提醒功能的運作方式。您可以在檢視作業或行事曆活動時,點擊「提醒我」部分下方的切換按鈕,以新增提醒。\n\n請注意,任何透過較舊版本應用程式創建的提醒將不能與新功能相容,您需要再次創建提醒。", - "@In order to provide you with a better experience, we have updated how reminders work. You can add new reminders by viewing an assignment or calendar event and tapping the switch under the \"Remind Me\" section.\n\nBe aware that any reminders created with older versions of this app will not be compatible with the new changes and you will need to create them again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Not a parent?": "不是父母?", - "@Not a parent?": { - "description": "Title for the screen that shows when the user is not observing any students", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "We couldn't find any students associated with this account": "我們找不到與此帳戶有關的任何學生", - "@We couldn't find any students associated with this account": { - "description": "Subtitle for the screen that shows when the user is not observing any students", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Are you a student or teacher?": "您是學生或教師?", - "@Are you a student or teacher?": { - "description": "Label for button that will show users the option to view other Canvas apps in the Play Store", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "One of our other apps might be a better fit. Tap one to visit the Play Store.": "我們其他應用程式可能更適合您。按一查看 Play Store。", - "@One of our other apps might be a better fit. Tap one to visit the Play Store.": { - "description": "Description of options to view other Canvas apps in the Play Store", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Return to Login": "返回登入頁面", - "@Return to Login": { - "description": "Label for the button that returns the user to the login screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "STUDENT": "學生", - "@STUDENT": { - "description": "The \"student\" portion of the \"Canvas Student\" app name, in all caps. \"Canvas\" is excluded in this context as it will be displayed to the user as a wordmark image", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "TEACHER": "教師", - "@TEACHER": { - "description": "The \"teacher\" portion of the \"Canvas Teacher\" app name, in all caps. \"Canvas\" is excluded in this context as it will be displayed to the user as a wordmark image", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Canvas Student": "Canvas Student", - "@Canvas Student": { - "description": "The name of the Canvas Student app. Only \"Student\" should be translated as \"Canvas\" is a brand name in this context and should not be translated.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Canvas Teacher": "Canvas Teacher", - "@Canvas Teacher": { - "description": "The name of the Canvas Teacher app. Only \"Teacher\" should be translated as \"Canvas\" is a brand name in this context and should not be translated.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Alerts": "無提醒", - "@No Alerts": { - "description": "The title for the empty message to show to users when there are no alerts for the student.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There’s nothing to be notified of yet.": "尚未有任何通知。尚未有任何通知。", - "@There’s nothing to be notified of yet.": { - "description": "The empty message to show to users when there are no alerts for the student.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "dismissAlertLabel": "忽略 {alertTitle}", - "@dismissAlertLabel": { - "description": "Accessibility label to dismiss an alert", - "type": "text", - "placeholders_order": [ - "alertTitle" - ], - "placeholders": { - "alertTitle": {} - } - }, - "Course Announcement": "課程通告", - "@Course Announcement": { - "description": "Title for alerts when there is a course announcement", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Institution Announcement": "機構通告", - "@Institution Announcement": { - "description": "Title for alerts when there is an institution announcement", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "assignmentGradeAboveThreshold": "作業評分高於 {threshold}", - "@assignmentGradeAboveThreshold": { - "description": "Title for alerts when an assignment grade is above the threshold value", - "type": "text", - "placeholders_order": [ - "threshold" - ], - "placeholders": { - "threshold": {} - } - }, - "assignmentGradeBelowThreshold": "作業評分低於 {threshold}", - "@assignmentGradeBelowThreshold": { - "description": "Title for alerts when an assignment grade is below the threshold value", - "type": "text", - "placeholders_order": [ - "threshold" - ], - "placeholders": { - "threshold": {} - } - }, - "courseGradeAboveThreshold": "課程評分高於 {threshold}", - "@courseGradeAboveThreshold": { - "description": "Title for alerts when a course grade is above the threshold value", - "type": "text", - "placeholders_order": [ - "threshold" - ], - "placeholders": { - "threshold": {} - } - }, - "courseGradeBelowThreshold": "課程評分低於 {threshold}", - "@courseGradeBelowThreshold": { - "description": "Title for alerts when a course grade is below the threshold value", - "type": "text", - "placeholders_order": [ - "threshold" - ], - "placeholders": { - "threshold": {} - } - }, - "Settings": "設定", - "@Settings": { - "description": "Title for the settings screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Theme": "主題", - "@Theme": { - "description": "Label for the light/dark theme section in the settings page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Dark Mode": "暗色模式", - "@Dark Mode": { - "description": "Label for the button that enables dark mode", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Light Mode": "淡色模式", - "@Light Mode": { - "description": "Label for the button that enables light mode", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "High Contrast Mode": "高對比模式", - "@High Contrast Mode": { - "description": "Label for the switch that toggles high contrast mode", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Use Dark Theme in Web Content": "在網頁內容使用暗色外觀主題", - "@Use Dark Theme in Web Content": { - "description": "Label for the switch that toggles dark mode for webviews", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Appearance": "外觀", - "@Appearance": { - "description": "Label for the appearance section in the settings page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Successfully submitted!": "成功提交!", - "@Successfully submitted!": { - "description": "Title displayed in the grade cell for an assignment that has been submitted", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "submissionStatusSuccessSubtitle": "此作業在 {date} 的 {time} 上已提交,並且正在等待評分", - "@submissionStatusSuccessSubtitle": { - "description": "Subtitle displayed in the grade cell for an assignment that has been submitted and is awaiting a grade", - "type": "text", - "placeholders_order": [ - "date", - "time" - ], - "placeholders": { - "date": {}, - "time": {} - } - }, - "outOfPoints": "{howMany,plural, =1{滿分為 1 分}other{滿分為 {points} 分}}", - "@outOfPoints": { - "description": "Description for an assignment grade that has points without a current scoroe", - "type": "text", - "placeholders_order": [ - "points", - "howMany" - ], - "placeholders": { - "points": {}, - "howMany": {} - } - }, - "Excused": "已免除", - "@Excused": { - "description": "Grading status for an assignment marked as excused", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Complete": "完成", - "@Complete": { - "description": "Grading status for an assignment marked as complete", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Incomplete": "未完成", - "@Incomplete": { - "description": "Grading status for an assignment marked as incomplete", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "minus": "減", - "@minus": { - "description": "Screen reader-friendly replacement for the \"-\" character in letter grades like \"A-\"", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "latePenalty": "逾期懲罰 (-{pointsLost})", - "@latePenalty": { - "description": "Text displayed when a late penalty has been applied to the assignment", - "type": "text", - "placeholders_order": [ - "pointsLost" - ], - "placeholders": { - "pointsLost": {} - } - }, - "finalGrade": "最終評分:{grade}", - "@finalGrade": { - "description": "Text that displays the final grade of an assignment", - "type": "text", - "placeholders_order": [ - "grade" - ], - "placeholders": { - "grade": {} - } - }, - "Alert Settings": "提醒設定", - "@Alert Settings": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Alert me when…": "在下列情形時提醒我...", - "@Alert me when…": { - "description": "Header for the screen where the observer chooses the thresholds that will determine when they receive alerts (e.g. when an assignment is graded below 70%)", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Course grade below": "課程評分低於", - "@Course grade below": { - "description": "Label describing the threshold for when the course grade is below a certain percentage", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Course grade above": "課程評分高於", - "@Course grade above": { - "description": "Label describing the threshold for when the course grade is above a certain percentage", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Assignment missing": "缺少作業", - "@Assignment missing": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Assignment grade below": "作業評分低於", - "@Assignment grade below": { - "description": "Label describing the threshold for when an assignment is graded below a certain percentage", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Assignment grade above": "作業評分高於", - "@Assignment grade above": { - "description": "Label describing the threshold for when an assignment is graded above a certain percentage", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Course Announcements": "課程通告", - "@Course Announcements": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Institution Announcements": "機構的告", - "@Institution Announcements": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Never": "永不", - "@Never": { - "description": "Indication that tells the user they will not receive alert notifications of a specific kind", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Grade percentage": "評分百分比", - "@Grade percentage": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading your student's alerts.": "載入您的學生的提醒時發生錯誤。", - "@There was an error loading your student's alerts.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Must be below 100": "必須低於 100", - "@Must be below 100": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "mustBeBelowN": "必須低於 {percentage}", - "@mustBeBelowN": { - "description": "Validation error to the user that they must choose a percentage below 'n'", - "type": "text", - "placeholders_order": [ - "percentage" - ], - "placeholders": { - "percentage": { - "example": 5 - } - } - }, - "mustBeAboveN": "必須高於 {percentage}", - "@mustBeAboveN": { - "description": "Validation error to the user that they must choose a percentage above 'n'", - "type": "text", - "placeholders_order": [ - "percentage" - ], - "placeholders": { - "percentage": { - "example": 5 - } - } - }, - "Select Student Color": "選擇學生顏色", - "@Select Student Color": { - "description": "Title for screen that allows users to assign a color to a specific student", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Electric, blue": "電,藍色", - "@Electric, blue": { - "description": "Name of the Electric (blue) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Plum, Purple": "梅子,紫色", - "@Plum, Purple": { - "description": "Name of the Plum (purple) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Barney, Fuschia": "巴尼,紫紅色", - "@Barney, Fuschia": { - "description": "Name of the Barney (fuschia) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Raspberry, Red": "樹莓,紅色", - "@Raspberry, Red": { - "description": "Name of the Raspberry (red) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Fire, Orange": "火,橙色", - "@Fire, Orange": { - "description": "Name of the Fire (orange) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Shamrock, Green": "三葉草,綠色", - "@Shamrock, Green": { - "description": "Name of the Shamrock (green) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "An error occurred while saving your selection. Please try again.": "儲存您的選擇時發生錯誤。請重試。", - "@An error occurred while saving your selection. Please try again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "changeStudentColorLabel": "變更 {studentName} 的顏色", - "@changeStudentColorLabel": { - "description": "Accessibility label for the button that lets users change the color associated with a specific student", - "type": "text", - "placeholders_order": [ - "studentName" - ], - "placeholders": { - "studentName": {} - } - }, - "Teacher": "教師", - "@Teacher": { - "description": "Label for the Teacher enrollment type", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Student": "學生", - "@Student": { - "description": "Label for the Student enrollment type", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "TA": "助教", - "@TA": { - "description": "Label for the Teaching Assistant enrollment type (also known as Teacher Aid or Education Assistant), reduced to a short acronym/initialism if appropriate.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Observer": "觀察者", - "@Observer": { - "description": "Label for the Observer enrollment type", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Use Camera": "使用攝影機", - "@Use Camera": { - "description": "Label for the action item that lets the user capture a photo using the device camera", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Upload File": "上傳檔案", - "@Upload File": { - "description": "Label for the action item that lets the user upload a file from their device", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Choose from Gallery": "從圖片庫中選擇", - "@Choose from Gallery": { - "description": "Label for the action item that lets the user select a photo from their device gallery", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Preparing…": "準備中…", - "@Preparing…": { - "description": "Message shown while a file is being prepared to attach to a message", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Add student with…": "添加學生…", - "@Add student with…": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Add Student": "添加學生", - "@Add Student": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You are not observing any students.": "您未正在觀察任何學生。", - "@You are not observing any students.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading your students.": "載入您的學生時發生錯誤。", - "@There was an error loading your students.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Pairing Code": "配對代碼", - "@Pairing Code": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Students can obtain a pairing code through the Canvas website": "學生可以透過 Canvas 網站獲取配對碼", - "@Students can obtain a pairing code through the Canvas website": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Enter the student pairing code provided to you. If the pairing code doesn't work, it may have expired": "輸入已提供給您的學生配對代碼。如果配對代碼無效,可能是已到期", - "@Enter the student pairing code provided to you. If the pairing code doesn't work, it may have expired": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Your code is incorrect or expired.": "您的代碼錯誤或到期。", - "@Your code is incorrect or expired.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Something went wrong trying to create your account, please reach out to your school for assistance.": "嘗試建立您的錯誤時發生錯誤,請聯絡您的學校尋求協助。", - "@Something went wrong trying to create your account, please reach out to your school for assistance.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "QR Code": "QR 碼", - "@QR Code": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Students can create a QR code using the Canvas Student app on their mobile device": "學生可以使用流動裝置上的 Canvas Student 應用程式創建 QR 碼", - "@Students can create a QR code using the Canvas Student app on their mobile device": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Add new student": "添加新學生", - "@Add new student": { - "description": "Semantics label for the FAB on the Manage Students Screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Select": "選擇", - "@Select": { - "description": "Hint text to tell the user to choose one of two options", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I have a Canvas account": "我有 Canvas 帳戶", - "@I have a Canvas account": { - "description": "Option to select for users that have a canvas account", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I don't have a Canvas account": "我沒有 Canvas 帳戶", - "@I don't have a Canvas account": { - "description": "Option to select for users that don't have a canvas account", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Create Account": "建立帳戶", - "@Create Account": { - "description": "Button text for account creation confirmation", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Full Name": "全名", - "@Full Name": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Email Address": "電郵地址", - "@Email Address": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Password": "密碼", - "@Password": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Full Name…": "全名...", - "@Full Name…": { - "description": "hint label for inside form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Email…": "電郵...", - "@Email…": { - "description": "hint label for inside form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Password…": "密碼...", - "@Password…": { - "description": "hint label for inside form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Please enter full name": "請輸入全名", - "@Please enter full name": { - "description": "Error message for form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Please enter an email address": "請輸入電郵地址", - "@Please enter an email address": { - "description": "Error message for form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Please enter a valid email address": "請輸入有效電郵地址", - "@Please enter a valid email address": { - "description": "Error message for form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Password is required": "需要輸入密碼", - "@Password is required": { - "description": "Error message for form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Password must contain at least 8 characters": "密碼必須最少包含 8 個字符", - "@Password must contain at least 8 characters": { - "description": "Error message for form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "qrCreateAccountTos": "點擊「創建帳戶」,代表您同意{termsOfService},並了解{privacyPolicy}", - "@qrCreateAccountTos": { - "description": "The text show on the account creation screen", - "type": "text", - "placeholders_order": [ - "termsOfService", - "privacyPolicy" - ], - "placeholders": { - "termsOfService": {}, - "privacyPolicy": {} - } - }, - "Terms of Service": "服務條款", - "@Terms of Service": { - "description": "Label for the Canvas Terms of Service agreement. This will be used in the qrCreateAccountTos text and will be highlighted and clickable", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Privacy Policy": "隱私政策", - "@Privacy Policy": { - "description": "Label for the Canvas Privacy Policy agreement. This will be used in the qrCreateAccountTos text and will be highlighted and clickable", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "View the Privacy Policy": "檢視隱私政策", - "@View the Privacy Policy": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Already have an account? ": "已經擁有帳戶? ", - "@Already have an account? ": { - "description": "Part of multiline text span, includes AccountSignIn1-2, in that order", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Sign In": "登入", - "@Sign In": { - "description": "Part of multiline text span, includes AccountSignIn1-2, in that order", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Hide Password": "隱藏密碼", - "@Hide Password": { - "description": "content description for password hide button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Show Password": "顯示密碼", - "@Show Password": { - "description": "content description for password show button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Terms of Service Link": "服務條款連結", - "@Terms of Service Link": { - "description": "content description for terms of service link", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Privacy Policy Link": "隱私政策連結", - "@Privacy Policy Link": { - "description": "content description for privacy policy link", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Event": "活動", - "@Event": { - "description": "Title for the event details screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Date": "日期", - "@Date": { - "description": "Label for the event date", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Location": "位置", - "@Location": { - "description": "Label for the location information", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Location Specified": "無指定的地點", - "@No Location Specified": { - "description": "Description for events that do not have a location", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "eventTime": "{startAt} - {endAt}", - "@eventTime": { - "description": "The time the event is happening, example: \"2:00 pm - 4:00 pm\"", - "type": "text", - "placeholders_order": [ - "startAt", - "endAt" - ], - "placeholders": { - "startAt": {}, - "endAt": {} - } - }, - "Set a date and time to be notified of this event.": "設定通知此活動的日期和時間。", - "@Set a date and time to be notified of this event.": { - "description": "Description for row to set event reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You will be notified about this event on…": "將在以下時間通知您關於此沽動…", - "@You will be notified about this event on…": { - "description": "Description for when an event reminder is set", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Share Your Love for the App": "分享您對於本應用程式的喜愛", - "@Share Your Love for the App": { - "description": "Label for option to open the app store", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Tell us about your favorite parts of the app": "告訴我們本應用程式最讓您滿意之處", - "@Tell us about your favorite parts of the app": { - "description": "Description for option to open the app store", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Legal": "法律事務", - "@Legal": { - "description": "Label for legal information option", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Privacy policy, terms of use, open source": "隱私政策,使用條款,開放源碼", - "@Privacy policy, terms of use, open source": { - "description": "Description for legal information option", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Idea for Canvas Parent App [Android]": "關於 Canvas Parent 程式 [Android] 的想法", - "@Idea for Canvas Parent App [Android]": { - "description": "The subject for the email to request a feature", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The following information will help us better understand your idea:": "下列資訊能幫我們好好理解您的想法:", - "@The following information will help us better understand your idea:": { - "description": "The header for the users information that is attached to a feature request", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Domain:": "網域:", - "@Domain:": { - "description": "The label for the Canvas domain of the logged in user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "User ID:": "使用者 ID:", - "@User ID:": { - "description": "The label for the Canvas user ID of the logged in user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Email:": "電郵地址:", - "@Email:": { - "description": "The label for the eamil of the logged in user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Locale:": "位置:", - "@Locale:": { - "description": "The label for the locale of the logged in user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Terms of Use": "使用條款", - "@Terms of Use": { - "description": "Label for the terms of use", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Canvas on GitHub": "GitHub 上的 Canvas", - "@Canvas on GitHub": { - "description": "Label for the button that opens the Canvas project on GitHub's website", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was a problem loading the Terms of Use": "載入使用條款時出現問題", - "@There was a problem loading the Terms of Use": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Device": "裝置", - "@Device": { - "description": "Label used for device manufacturer/model in the error report", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "OS Version": "OS 版本", - "@OS Version": { - "description": "Label used for device operating system version in the error report", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Version Number": "版本編號", - "@Version Number": { - "description": "Label used for the app version number in the error report", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Report A Problem": "報告問題", - "@Report A Problem": { - "description": "Title used for generic dialog to report problems", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Subject": "主題", - "@Subject": { - "description": "Label used for Subject text field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "A subject is required.": "主題必填。", - "@A subject is required.": { - "description": "Error shown when the subject field is empty", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "An email address is required.": "電郵地址必填。", - "@An email address is required.": { - "description": "Error shown when the email field is empty", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Description": "描述", - "@Description": { - "description": "Label used for Description text field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "A description is required.": "描述必填。", - "@A description is required.": { - "description": "Error shown when the description field is empty", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "How is this affecting you?": "問題對您造成什麼影響?", - "@How is this affecting you?": { - "description": "Label used for the dropdown to select how severe the issue is", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "send": "傳送", - "@send": { - "description": "Label used for send button when reporting a problem", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Just a casual question, comment, idea, suggestion…": "只是隨意提問、評論、想法、建議……", - "@Just a casual question, comment, idea, suggestion…": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I need some help but it's not urgent.": "我需要支援,但並不緊迫。", - "@I need some help but it's not urgent.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Something's broken but I can work around it to get what I need done.": "有些地方出現了問題,但我能繞過問題實現我的目的。", - "@Something's broken but I can work around it to get what I need done.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I can't get things done until I hear back from you.": "在收到您的回覆之前,我無法處理。", - "@I can't get things done until I hear back from you.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "EXTREME CRITICAL EMERGENCY!!": "極其重要的緊急情況!!", - "@EXTREME CRITICAL EMERGENCY!!": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Not Graded": "未評分", - "@Not Graded": { - "description": "Description for an assignment has not been graded.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Login flow: Normal": "登入流態:正常", - "@Login flow: Normal": { - "description": "Description for the normal login flow", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Login flow: Canvas": "登入流態:Canvas", - "@Login flow: Canvas": { - "description": "Description for the Canvas login flow", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Login flow: Site Admin": "登入流態:網站管理員", - "@Login flow: Site Admin": { - "description": "Description for the Site Admin login flow", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Login flow: Skip mobile verify": "登入流態:跳過流動認證", - "@Login flow: Skip mobile verify": { - "description": "Description for the login flow that skips domain verification for mobile", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Act As User": "作為使用者", - "@Act As User": { - "description": "Label for the button that allows the user to act (masquerade) as another user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Stop Acting as User": "停止作為使用者", - "@Stop Acting as User": { - "description": "Label for the button that allows the user to stop acting (masquerading) as another user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "actingAsUser": "您正在作為 {userName}", - "@actingAsUser": { - "description": "Message shown while acting (masquerading) as another user", - "type": "text", - "placeholders_order": [ - "userName" - ], - "placeholders": { - "userName": {} - } - }, - "\"Act as\" is essentially logging in as this user without a password. You will be able to take any action as if you were this user, and from other users' points of views, it will be as if this user performed them. However, audit logs record that you were the one who performed the actions on behalf of this user.": "「作為」本質上是以此使用者身份登錄,沒有密碼。您將能夠進行任何操作,就好像您就是此使用者一樣,並且,其他使用者也會認為是此使用者執行了操作。然而,活動紀錄會記錄事實,即您是代表此使用者執行操作的人。", - "@\"Act as\" is essentially logging in as this user without a password. You will be able to take any action as if you were this user, and from other users' points of views, it will be as if this user performed them. However, audit logs record that you were the one who performed the actions on behalf of this user.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Domain": "網域", - "@Domain": { - "description": "Text field hint for domain url input", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You must enter a valid domain": "您必須輸入有效的網域", - "@You must enter a valid domain": { - "description": "Message displayed for domain input error", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "User ID": "使用者 ID", - "@User ID": { - "description": "Text field hint for user ID input", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You must enter a user id": "您必須輸入使用者 ID", - "@You must enter a user id": { - "description": "Message displayed for user Id input error", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error trying to act as this user. Please check the Domain and User ID and try again.": "嘗試作為此使用者時出現錯誤。請檢查網域及使用者 ID 然後重試。", - "@There was an error trying to act as this user. Please check the Domain and User ID and try again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "endMasqueradeMessage": "您將會停止作為 {userName} 並返回到您的原有帳戶。", - "@endMasqueradeMessage": { - "description": "Confirmation message displayed when the user wants to stop acting (masquerading) as another user", - "type": "text", - "placeholders_order": [ - "userName" - ], - "placeholders": { - "userName": {} - } - }, - "endMasqueradeLogoutMessage": "您將會停止作為 {userName} 並登出。", - "@endMasqueradeLogoutMessage": { - "description": "Confirmation message displayed when the user wants to stop acting (masquerading) as another user and will be logged out.", - "type": "text", - "placeholders_order": [ - "userName" - ], - "placeholders": { - "userName": {} - } - }, - "How are we doing?": "我們表現如何?", - "@How are we doing?": { - "description": "Title for dialog asking user to rate the app out of 5 stars.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Don't show again": "不要再次顯示", - "@Don't show again": { - "description": "Button to prevent the rating dialog from showing again.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "What can we do better?": "我們有何可改進之處?", - "@What can we do better?": { - "description": "Hint text for providing a comment with the rating.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Send Feedback": "發送回饋", - "@Send Feedback": { - "description": "Button to send rating with feedback", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "ratingDialogEmailSubject": "給 Android 的建議 - Canvas Parent {version}", - "@ratingDialogEmailSubject": { - "description": "The subject for an email to provide feedback for CanvasParent.", - "type": "text", - "placeholders_order": [ - "version" - ], - "placeholders": { - "version": {} - } - }, - "starRating": "{position,plural, =1{{position} 顆星}other{{position}顆星}}", - "@starRating": { - "description": "Accessibility label for the 1 stars to 5 stars rating", - "type": "text", - "placeholders_order": [ - "position" - ], - "placeholders": { - "position": { - "example": 1 - } - } - }, - "Student Pairing": "學生配對", - "@Student Pairing": { - "description": "Title for the screen where users can pair to students using a QR code", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Open Canvas Student": "開啟 Canvas Student", - "@Open Canvas Student": { - "description": "Title for QR pairing tutorial screen instructing users to open the Canvas Student app", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You'll need to open your student's Canvas Student app to continue. Go into Main Menu > Settings > Pair with Observer and scan the QR code you see there.": "您需要開啟學生的 Canvas Student 應用程式以繼續操作。前往主選單 > 設定 > 與觀察者配對,然後掃描該處顯示的 QR 碼。", - "@You'll need to open your student's Canvas Student app to continue. Go into Main Menu > Settings > Pair with Observer and scan the QR code you see there.": { - "description": "Message explaining how QR code pairing works", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Screenshot showing location of pairing QR code generation in the Canvas Student app": "螢幕截圖顯示 Canvas Student 應用程式內產生配對 QR 碼的位置", - "@Screenshot showing location of pairing QR code generation in the Canvas Student app": { - "description": "Content Description for qr pairing tutorial screenshot", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Expired QR Code": "已過期 QR 碼", - "@Expired QR Code": { - "description": "Error title shown when the users scans a QR code that has expired", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The QR code you scanned may have expired. Refresh the code on the student's device and try again.": "您所掃描的 QR 碼可能已經過期。請在學生的裝置上重新載入 QR 碼然後重試。", - "@The QR code you scanned may have expired. Refresh the code on the student's device and try again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "A network error occurred when adding this student. Check your connection and try again.": "添加此學生時發生網路錯誤。請檢查您的連線,然後再試一次。", - "@A network error occurred when adding this student. Check your connection and try again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Invalid QR Code": "無效的 QR 碼", - "@Invalid QR Code": { - "description": "Error title shown when the user scans an invalid QR code", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Incorrect Domain": "錯誤網域", - "@Incorrect Domain": { - "description": "Error title shown when the users scane a QR code for a student that belongs to a different domain", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The student you are trying to add belongs to a different school. Log in or create an account with that school to scan this code.": "您嘗試添加的學生屬於另一所學校。請登入至該學校或在該學校創建帳戶以掃描此 QR 碼。", - "@The student you are trying to add belongs to a different school. Log in or create an account with that school to scan this code.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Camera Permission": "攝影機權限", - "@Camera Permission": { - "description": "Error title shown when the user wans to scan a QR code but has denied the camera permission", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "This will unpair and remove all enrollments for this student from your account.": "此操作將取消配對並從您的帳戶中移除所有此學生的註冊資料。", - "@This will unpair and remove all enrollments for this student from your account.": { - "description": "Confirmation message shown when the user tries to delete a student from their account", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was a problem removing this student from your account. Please check your connection and try again.": "從帳戶中移除此學生時發生問題。請檢查您的連接然後重試。", - "@There was a problem removing this student from your account. Please check your connection and try again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Cancel": "取消", - "@Cancel": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "next": "下一個", - "@next": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "ok": "確定", - "@ok": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Yes": "是", - "@Yes": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No": "否", - "@No": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Retry": "重試", - "@Retry": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Delete": "刪除", - "@Delete": { - "description": "Label used for general delete/remove actions", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Done": "已完成", - "@Done": { - "description": "Label for general done/finished actions", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Refresh": "重新整理", - "@Refresh": { - "description": "Label for button to refresh data from the web", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "View Description": "檢視描述", - "@View Description": { - "description": "Button to view the description for an event or assignment", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "expanded": "展開", - "@expanded": { - "description": "Description for the accessibility reader for list groups that are expanded", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "collapsed": "收起", - "@collapsed": { - "description": "Description for the accessibility reader for list groups that are expanded", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "An unexpected error occurred": "出現意外錯誤", - "@An unexpected error occurred": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No description": "沒有說明", - "@No description": { - "description": "Message used when the assignment has no description", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Launch External Tool": "啟動外部工具", - "@Launch External Tool": { - "description": "Button text added to webviews to let users open external tools in their browser", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Interactions on this page are limited by your institution.": "本頁面的互動受您所在機構的限制。", - "@Interactions on this page are limited by your institution.": { - "description": "Message describing how the webview has limited access due to an instution setting", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "dateAtTime": "日期 {date},時間 {time}", - "@dateAtTime": { - "description": "The string to format dates", - "type": "text", - "placeholders_order": [ - "date", - "time" - ], - "placeholders": { - "date": {}, - "time": {} - } - }, - "dueDateAtTime": "截止於 {date} 的 {time}", - "@dueDateAtTime": { - "description": "The string to format due dates", - "type": "text", - "placeholders_order": [ - "date", - "time" - ], - "placeholders": { - "date": {}, - "time": {} - } - }, - "No Due Date": "無截止日期", - "@No Due Date": { - "description": "Label for assignments that do not have a due date", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Filter": "篩選器", - "@Filter": { - "description": "Label for buttons to filter what items are visible", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "unread": "未讀", - "@unread": { - "description": "Label for things that are marked as unread", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "unreadCount": "{count} 則未讀", - "@unreadCount": { - "description": "Formatted string for when there are a number of unread items", - "type": "text", - "placeholders_order": [ - "count" - ], - "placeholders": { - "count": {} - } - }, - "badgeNumberPlus": "{count}+", - "@badgeNumberPlus": { - "description": "Formatted string for when too many items are being notified in a badge, generally something like: 99+", - "type": "text", - "placeholders_order": [ - "count" - ], - "placeholders": { - "count": {} - } - }, - "There was an error loading this announcement": "載入此通告時發生錯誤", - "@There was an error loading this announcement": { - "description": "Message shown when an announcement detail screen fails to load", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Network error": "網路錯誤", - "@Network error": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Under Construction": "建構中", - "@Under Construction": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "We are currently building this feature for your viewing pleasure.": "我們目前正在建立讓您開心檢視的功能。", - "@We are currently building this feature for your viewing pleasure.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Request Login Help Button": "請求登入支援按鈕", - "@Request Login Help Button": { - "description": "Accessibility hint for button that opens help dialog for a login help request", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Request Login Help": "請求登入支援", - "@Request Login Help": { - "description": "Title of help dialog for a login help request", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I'm having trouble logging in": "我登入時發生問題", - "@I'm having trouble logging in": { - "description": "Subject of help dialog for a login help request", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "An error occurred when trying to display this link": "嘗試顯示此連結時出現錯誤", - "@An error occurred when trying to display this link": { - "description": "Error message shown when a link can't be opened", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "We are unable to display this link, it may belong to an institution you currently aren't logged in to.": "我們無法顯示此連結,連結可能屬於您現在尚未登入的機構。", - "@We are unable to display this link, it may belong to an institution you currently aren't logged in to.": { - "description": "Description for error page shown when clicking a link", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Link Error": "連結錯誤", - "@Link Error": { - "description": "Title for error page shown when clicking a link", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Open In Browser": "在瀏覽器中打開", - "@Open In Browser": { - "description": "Text for button to open a link in the browswer", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You'll find the QR code on the web in your account profile. Click 'QR for Mobile Login' in the list.": "您可以在您的網上帳戶個人檔案找到這個 QR 碼。點擊列表內的「流動登入 QR 碼」。", - "@You'll find the QR code on the web in your account profile. Click 'QR for Mobile Login' in the list.": { - "description": "Text for qr login tutorial screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Locate QR Code": "尋找 QR 碼", - "@Locate QR Code": { - "description": "Text for qr login button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Please scan a QR code generated by Canvas": "請掃描由 Canvas 產生的 QR 碼", - "@Please scan a QR code generated by Canvas": { - "description": "Text for qr login error with incorrect qr code", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error logging in. Please generate another QR Code and try again.": "登入時出現錯誤。請產生另一個 QR 碼然後重試。", - "@There was an error logging in. Please generate another QR Code and try again.": { - "description": "Text for qr login error", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Screenshot showing location of QR code generation in browser": "瀏覽器內的螢幕截圖顯示產生 QR 碼的位置", - "@Screenshot showing location of QR code generation in browser": { - "description": "Content Description for qr login tutorial screenshot", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "QR scanning requires camera access": "QR 碼掃描需要攝影機存取權限", - "@QR scanning requires camera access": { - "description": "placeholder for camera error for QR code scan", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The linked item is no longer available": "連結的項目不再可用", - "@The linked item is no longer available": { - "description": "error message when the alert could no be opened", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Message sent": "訊息已發送", - "@Message sent": { - "description": "confirmation message on the screen when the user succesfully sends a message", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Acceptable Use Policy": "可接受使用政策", - "@Acceptable Use Policy": { - "description": "title for the acceptable use policy screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Submit": "提交", - "@Submit": { - "description": "submit button title for acceptable use policy screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Either you're a new user or the Acceptable Use Policy has changed since you last agreed to it. Please agree to the Acceptable Use Policy before you continue.": "無論您是新的使用者,或是自上次同意以來,「可接受使用政策」都已經變更。請在您繼續使用前同意「可接受使用政策」。", - "@Either you're a new user or the Acceptable Use Policy has changed since you last agreed to it. Please agree to the Acceptable Use Policy before you continue.": { - "description": "acceptable use policy screen description", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I agree to the Acceptable Use Policy.": "您必須同意「可接受使用政策」。", - "@I agree to the Acceptable Use Policy.": { - "description": "acceptable use policy switch title", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "About": "關於", - "@About": { - "description": "Title for about menu item in settings", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "App": "應用程式", - "@App": { - "description": "Title for App field on about page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Login ID": "登入 ID", - "@Login ID": { - "description": "Title for Login ID field on about page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Email": "電郵", - "@Email": { - "description": "Title for Email field on about page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Version": "版本", - "@Version": { - "description": "Title for Version field on about page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Instructure logo": "Instructure 標誌", - "@Instructure logo": { - "description": "Semantics label for the Instructure logo on the about page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - } -} \ No newline at end of file diff --git a/apps/flutter_parent/lib/l10n/res/intl_zh_Hans.arb b/apps/flutter_parent/lib/l10n/res/intl_zh_Hans.arb deleted file mode 100644 index bcb61c5d1d..0000000000 --- a/apps/flutter_parent/lib/l10n/res/intl_zh_Hans.arb +++ /dev/null @@ -1,2746 +0,0 @@ -{ - "@@last_modified": "2023-04-14T11:04:46.988317", - "alertsLabel": "警告", - "@alertsLabel": { - "description": "The label for the Alerts tab", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "calendarLabel": "日历", - "@calendarLabel": { - "description": "The label for the Calendar tab", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "coursesLabel": "课程", - "@coursesLabel": { - "description": "The label for the Courses tab", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Students": "没有学生", - "@No Students": { - "description": "Text for when an observer has no students they are observing", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Tap to show student selector": "点击以显示学生选择器", - "@Tap to show student selector": { - "description": "Semantics label for the area that will show the student selector when tapped", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Tap to pair with a new student": "点击以与新生配对", - "@Tap to pair with a new student": { - "description": "Semantics label for the add student button in the student selector", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Tap to select this student": "点击以选择此学生", - "@Tap to select this student": { - "description": "Semantics label on individual students in the student switcher", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Manage Students": "管理学生", - "@Manage Students": { - "description": "Label text for the Manage Students nav drawer button as well as the title for the Manage Students screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Help": "帮助", - "@Help": { - "description": "Label text for the help nav drawer button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Log Out": "注销", - "@Log Out": { - "description": "Label text for the Log Out nav drawer button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Switch Users": "转换用户", - "@Switch Users": { - "description": "Label text for the Switch Users nav drawer button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "appVersion": "v. {version}", - "@appVersion": { - "description": "App version shown in the navigation drawer", - "type": "text", - "placeholders_order": [ - "version" - ], - "placeholders": { - "version": {} - } - }, - "Are you sure you want to log out?": "是否确定要登出?", - "@Are you sure you want to log out?": { - "description": "Confirmation message displayed when the user tries to log out", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Calendars": "日历", - "@Calendars": { - "description": "Label for button that lets users select which calendars to display", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "nextMonth": "下个月:{month}", - "@nextMonth": { - "description": "Label for the button that switches the calendar to the next month", - "type": "text", - "placeholders_order": [ - "month" - ], - "placeholders": { - "month": {} - } - }, - "previousMonth": "上个月:{month}", - "@previousMonth": { - "description": "Label for the button that switches the calendar to the previous month", - "type": "text", - "placeholders_order": [ - "month" - ], - "placeholders": { - "month": {} - } - }, - "nextWeek": "下周,从{date}开始", - "@nextWeek": { - "description": "Label for the button that switches the calendar to the next week", - "type": "text", - "placeholders_order": [ - "date" - ], - "placeholders": { - "date": {} - } - }, - "previousWeek": "上周,从{date}开始", - "@previousWeek": { - "description": "Label for the button that switches the calendar to the previous week", - "type": "text", - "placeholders_order": [ - "date" - ], - "placeholders": { - "date": {} - } - }, - "selectedMonthLabel": "{month}月", - "@selectedMonthLabel": { - "description": "Accessibility label for the button that expands/collapses the month view", - "type": "text", - "placeholders_order": [ - "month" - ], - "placeholders": { - "month": {} - } - }, - "expand": "展开", - "@expand": { - "description": "Accessibility label for the on-tap hint for the button that expands/collapses the month view", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "collapse": "折叠", - "@collapse": { - "description": "Accessibility label for the on-tap hint for the button that expands/collapses the month view", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "pointsPossible": "满分 {points}", - "@pointsPossible": { - "description": "Screen reader label used for the points possible for an assignment, quiz, etc.", - "type": "text", - "placeholders_order": [ - "points" - ], - "placeholders": { - "points": {} - } - }, - "calendarDaySemanticsLabel": "{eventCount,plural, =1{{date}、{eventCount} 个事件}other{{date}、{eventCount} 个事件}}", - "@calendarDaySemanticsLabel": { - "description": "Screen reader label used for calendar day, reads the date and count of events", - "type": "text", - "placeholders_order": [ - "date", - "eventCount" - ], - "placeholders": { - "date": {}, - "eventCount": {} - } - }, - "No Events Today!": "今天没有事件!", - "@No Events Today!": { - "description": "Title displayed when there are no calendar events for the current day", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "It looks like a great day to rest, relax, and recharge.": "今天是休息放松的一天。", - "@It looks like a great day to rest, relax, and recharge.": { - "description": "Message displayed when there are no calendar events for the current day", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading your student's calendar": "加载学生的日历时发生错误", - "@There was an error loading your student's calendar": { - "description": "Message displayed when calendar events could not be loaded for the current student", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Tap to favorite the courses you want to see on the Calendar. Select up to 10.": "点击以收藏您希望在日历中看到的课程。选择最多 10 个。", - "@Tap to favorite the courses you want to see on the Calendar. Select up to 10.": { - "description": "Description text on calendar filter screen.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You may only choose 10 calendars to display": "只能选择 10 个要显示的日历", - "@You may only choose 10 calendars to display": { - "description": "Error text when trying to select more than 10 calendars", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You must select at least one calendar to display": "必须选择至少 1 个要显示的日历", - "@You must select at least one calendar to display": { - "description": "Error text when trying to de-select all calendars", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Planner Note": "计划程序注释", - "@Planner Note": { - "description": "Label used for notes in the planner", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Go to today": "转至今天", - "@Go to today": { - "description": "Accessibility label used for the today button in the planner", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Previous Logins": "历史登录记录", - "@Previous Logins": { - "description": "Label for the list of previous user logins", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "canvasLogoLabel": "Canvas徽标", - "@canvasLogoLabel": { - "description": "The semantics label for the Canvas logo", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "findSchool": "查找学校", - "@findSchool": { - "description": "Text for the find-my-school button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "findAnotherSchool": "查找其他学校", - "@findAnotherSchool": { - "description": "Text for the find-another-school button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "domainSearchInputHint": "输入学校名称或校区...", - "@domainSearchInputHint": { - "description": "Input hint for the text box on the domain search screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "noDomainResults": "找不到与“{query}”匹配的学校", - "@noDomainResults": { - "description": "Message shown to users when the domain search query did not return any results", - "type": "text", - "placeholders_order": [ - "query" - ], - "placeholders": { - "query": {} - } - }, - "domainSearchHelpLabel": "如何查找我的学校或校区?", - "@domainSearchHelpLabel": { - "description": "Label for the help button on the domain search screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "canvasGuides": "Canvas指南", - "@canvasGuides": { - "description": "Proper name for the Canvas Guides. This will be used in the domainSearchHelpBody text and will be highlighted and clickable", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "canvasSupport": "Canvas支持", - "@canvasSupport": { - "description": "Proper name for Canvas Support. This will be used in the domainSearchHelpBody text and will be highlighted and clickable", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "domainSearchHelpBody": "尝试搜索您要访问的学校或校区的名称,例如“Smith Private School”或“Smith County Schools”。也可以直接输入Canvas域,例如“smith.instructure.com”。\n\n有关查找机构Canvas账户的更多信息,可访问{canvasGuides}、联系{canvasSupport}或您的学校寻求帮助。", - "@domainSearchHelpBody": { - "description": "The body text shown in the help dialog on the domain search screen", - "type": "text", - "placeholders_order": [ - "canvasGuides", - "canvasSupport" - ], - "placeholders": { - "canvasGuides": {}, - "canvasSupport": {} - } - }, - "Uh oh!": "嗳哟!", - "@Uh oh!": { - "description": "Title of the screen that shows when a crash has occurred", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "We’re not sure what happened, but it wasn’t good. Contact us if this keeps happening.": "不知道发生了什么事情,但似乎不太妙。如果问题持续,请联系我们。", - "@We’re not sure what happened, but it wasn’t good. Contact us if this keeps happening.": { - "description": "Message shown when a crash has occurred", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Contact Support": "联系支持", - "@Contact Support": { - "description": "Label for the button that allows users to contact support after a crash has occurred", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "View error details": "查看错误详细信息", - "@View error details": { - "description": "Label for the button that allowed users to view crash details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Restart app": "重启应用程序", - "@Restart app": { - "description": "Label for the button that will restart the entire application", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Application version": "应用程序版本", - "@Application version": { - "description": "Label for the application version displayed in the crash details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Device model": "设备型号", - "@Device model": { - "description": "Label for the device model displayed in the crash details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Android OS version": "Android操作系统版本", - "@Android OS version": { - "description": "Label for the Android operating system version displayed in the crash details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Full error message": "完整的错误消息", - "@Full error message": { - "description": "Label for the full error message displayed in the crash details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Inbox": "收件箱", - "@Inbox": { - "description": "Title for the Inbox screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading your inbox messages.": "加载收件箱消息时发生错误。", - "@There was an error loading your inbox messages.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Subject": "无主题", - "@No Subject": { - "description": "Title used for inbox messages that have no subject", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unable to fetch courses. Please check your connection and try again.": "无法获取课程。请检查您的连接,然后再试一次。", - "@Unable to fetch courses. Please check your connection and try again.": { - "description": "Message shown when an error occured while loading courses", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Choose a course to message": "选择一个课程来发送讯息", - "@Choose a course to message": { - "description": "Header in the course list shown when the user is choosing which course to associate with a new message", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Inbox Zero": "收件箱为零", - "@Inbox Zero": { - "description": "Title of the message shown when there are no inbox messages", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You’re all caught up!": "您全部跟上了!", - "@You’re all caught up!": { - "description": "Subtitle of the message shown when there are no inbox messages", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading recipients for this course": "加载此课程的收件人时发生错误。", - "@There was an error loading recipients for this course": { - "description": "Message shown when attempting to create a new message but the recipients list failed to load", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unable to send message. Check your connection and try again.": "无法发送消息。请检查您的网络连接并重试。", - "@Unable to send message. Check your connection and try again.": { - "description": "Message show when there was an error creating or sending a new message", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unsaved changes": "无法保存更改", - "@Unsaved changes": { - "description": "Title of the dialog shown when the user tries to leave with unsaved changes", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Are you sure you wish to close this page? Your unsent message will be lost.": "是否确定要关闭此页面?未发送的消息将会丢失。", - "@Are you sure you wish to close this page? Your unsent message will be lost.": { - "description": "Body text of the dialog shown when the user tries leave with unsaved changes", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "New message": "新建消息", - "@New message": { - "description": "Title of the new-message screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Add attachment": "添加附件", - "@Add attachment": { - "description": "Tooltip for the add-attachment button in the new-message screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Send message": "发送消息", - "@Send message": { - "description": "Tooltip for the send-message button in the new-message screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Select recipients": "选择收件人", - "@Select recipients": { - "description": "Tooltip for the button that allows users to select message recipients", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No recipients selected": "未选择收件人", - "@No recipients selected": { - "description": "Hint displayed when the user has not selected any message recipients", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Message subject": "消息主题", - "@Message subject": { - "description": "Hint text displayed in the input field for the message subject", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Message": "消息", - "@Message": { - "description": "Hint text displayed in the input field for the message body", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Recipients": "收件人", - "@Recipients": { - "description": "Label for message recipients", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "plusRecipientCount": "+{count}", - "@plusRecipientCount": { - "description": "Shows the number of recipients that are selected but not displayed on screen.", - "type": "text", - "placeholders_order": [ - "count" - ], - "placeholders": { - "count": { - "example": 5 - } - } - }, - "Failed. Tap for options.": "失败。点击以获取选项。", - "@Failed. Tap for options.": { - "description": "Short message shown on a message attachment when uploading has failed", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "courseForWhom": "适用于{studentShortName}", - "@courseForWhom": { - "description": "Describes for whom a course is for (i.e. for Bill)", - "type": "text", - "placeholders_order": [ - "studentShortName" - ], - "placeholders": { - "studentShortName": {} - } - }, - "messageLinkPostscript": "事由:{studentName},{linkUrl}", - "@messageLinkPostscript": { - "description": "A postscript appended to new messages that clarifies which student is the subject of the message and also includes a URL for the related Canvas component (course, assignment, event, etc).", - "type": "text", - "placeholders_order": [ - "studentName", - "linkUrl" - ], - "placeholders": { - "studentName": {}, - "linkUrl": {} - } - }, - "There was an error loading this conversation": "加载此会话时发生错误", - "@There was an error loading this conversation": { - "description": "Message shown when a conversation fails to load", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Reply": "回复", - "@Reply": { - "description": "Button label for replying to a conversation", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Reply All": "回复所有人", - "@Reply All": { - "description": "Button label for replying to all conversation participants", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unknown User": "未知用户", - "@Unknown User": { - "description": "Label used where the user name is not known", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "me": "本人", - "@me": { - "description": "First-person pronoun (i.e. 'me') that will be used in message author info, e.g. 'Me to 4 others' or 'Jon Snow to me'", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "authorToRecipient": "{authorName} 至 {recipientName}", - "@authorToRecipient": { - "description": "Author info for a single-recipient message; includes both the author name and the recipient name.", - "type": "text", - "placeholders_order": [ - "authorName", - "recipientName" - ], - "placeholders": { - "authorName": {}, - "recipientName": {} - } - }, - "authorToNOthers": "{howMany,plural, =1{{authorName}至另外1个}other{{authorName}至另外{howMany}个}}", - "@authorToNOthers": { - "description": "Author info for a mutli-recipient message; includes the author name and the number of recipients", - "type": "text", - "placeholders_order": [ - "authorName", - "howMany" - ], - "placeholders": { - "authorName": {}, - "howMany": {} - } - }, - "authorToRecipientAndNOthers": "{howMany,plural, =1{{authorName}至{recipientName}和另外1个}other{{authorName}至{recipientName}和另外{howMany}个}}", - "@authorToRecipientAndNOthers": { - "description": "Author info for a multi-recipient message; includes the author name, one recipient name, and the number of other recipients", - "type": "text", - "placeholders_order": [ - "authorName", - "recipientName", - "howMany" - ], - "placeholders": { - "authorName": {}, - "recipientName": {}, - "howMany": {} - } - }, - "Download": "下载", - "@Download": { - "description": "Label for the button that will begin downloading a file", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Open with another app": "使用其他应用程序打开", - "@Open with another app": { - "description": "Label for the button that will allow users to open a file with another app", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There are no installed applications that can open this file": "未安装可以打开此文件的应用程序", - "@There are no installed applications that can open this file": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unsupported File": "不受支持的文件", - "@Unsupported File": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "This file is unsupported and can’t be viewed through the app": "此文件不受支持,无法通过应用程序查看", - "@This file is unsupported and can’t be viewed through the app": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unable to play this media file": "无法播放此媒体文件", - "@Unable to play this media file": { - "description": "Message shown when audio or video media could not be played", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unable to load this image": "无法加载此图片", - "@Unable to load this image": { - "description": "Message shown when an image file could not be loaded or displayed", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading this file": "加载此文件时发生错误", - "@There was an error loading this file": { - "description": "Message shown when a file could not be loaded or displayed", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Courses": "没有课程", - "@No Courses": { - "description": "Title for having no courses", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Your student’s courses might not be published yet.": "学生的课程可能尚未发布。", - "@Your student’s courses might not be published yet.": { - "description": "Message for having no courses", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading your student’s courses.": "加载学生的课程时发生错误。", - "@There was an error loading your student’s courses.": { - "description": "Message displayed when the list of student courses could not be loaded", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Grade": "没有评分", - "@No Grade": { - "description": "Message shown when there is currently no grade available for a course", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Filter by": "筛选条件", - "@Filter by": { - "description": "Title for list of terms to filter grades by", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Grades": "评分", - "@Grades": { - "description": "Label for the \"Grades\" tab in course details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Syllabus": "教学大纲", - "@Syllabus": { - "description": "Label for the \"Syllabus\" tab in course details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Front Page": "首页", - "@Front Page": { - "description": "Label for the \"Front Page\" tab in course details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Summary": "摘要", - "@Summary": { - "description": "Label for the \"Summary\" tab in course details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Send a message about this course": "发送有关此课程的消息", - "@Send a message about this course": { - "description": "Accessibility hint for the course messaage floating action button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Total Grade": "总分", - "@Total Grade": { - "description": "Label for the total grade in the course", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Graded": "已评分", - "@Graded": { - "description": "Label for assignments that have been graded", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Submitted": "已提交", - "@Submitted": { - "description": "Label for assignments that have been submitted", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Not Submitted": "未提交", - "@Not Submitted": { - "description": "Label for assignments that have not been submitted", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Late": "迟交", - "@Late": { - "description": "Label for assignments that have been marked late or submitted late", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Missing": "未交", - "@Missing": { - "description": "Label for assignments that have been marked missing or are not submitted and past the due date", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "-": "-", - "@-": { - "description": "Value representing no score for student submission", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "All Grading Periods": "所有评分周期", - "@All Grading Periods": { - "description": "Label for selecting all grading periods", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Assignments": "无作业", - "@No Assignments": { - "description": "Title for the no assignments message", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "It looks like assignments haven't been created in this space yet.": "似乎尚未在此区域创建作业。", - "@It looks like assignments haven't been created in this space yet.": { - "description": "Message for no assignments", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading the summary details for this course.": "加载此课程的摘要详情时发生错误。", - "@There was an error loading the summary details for this course.": { - "description": "Message shown when the course summary could not be loaded", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Summary": "无摘要", - "@No Summary": { - "description": "Title displayed when there are no items in the course summary", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "This course does not have any assignments or calendar events yet.": "此课程暂时没有任何作业或日历活动。", - "@This course does not have any assignments or calendar events yet.": { - "description": "Message displayed when there are no items in the course summary", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "gradeFormatScoreOutOfPointsPossible": "{score}/{pointsPossible}", - "@gradeFormatScoreOutOfPointsPossible": { - "description": "Formatted string for a student score out of the points possible", - "type": "text", - "placeholders_order": [ - "score", - "pointsPossible" - ], - "placeholders": { - "score": {}, - "pointsPossible": {} - } - }, - "contentDescriptionScoreOutOfPointsPossible": "得分 {score},总分 {pointsPossible}", - "@contentDescriptionScoreOutOfPointsPossible": { - "description": "Formatted string for a student score out of the points possible", - "type": "text", - "placeholders_order": [ - "score", - "pointsPossible" - ], - "placeholders": { - "score": {}, - "pointsPossible": {} - } - }, - "gradesSubjectMessage": "事由:{studentName},评分", - "@gradesSubjectMessage": { - "description": "The subject line for a message to a teacher regarding a student's grades", - "type": "text", - "placeholders_order": [ - "studentName" - ], - "placeholders": { - "studentName": {} - } - }, - "syllabusSubjectMessage": "事由:{studentName},教学大纲", - "@syllabusSubjectMessage": { - "description": "The subject line for a message to a teacher regarding a course syllabus", - "type": "text", - "placeholders_order": [ - "studentName" - ], - "placeholders": { - "studentName": {} - } - }, - "frontPageSubjectMessage": "事由:{studentName},首页", - "@frontPageSubjectMessage": { - "description": "The subject line for a message to a teacher regarding a course front page", - "type": "text", - "placeholders_order": [ - "studentName" - ], - "placeholders": { - "studentName": {} - } - }, - "assignmentSubjectMessage": "事由:{studentName},作业 - {assignmentName}", - "@assignmentSubjectMessage": { - "description": "The subject line for a message to a teacher regarding a student's assignment", - "type": "text", - "placeholders_order": [ - "studentName", - "assignmentName" - ], - "placeholders": { - "studentName": {}, - "assignmentName": {} - } - }, - "eventSubjectMessage": "事由:{studentName},活动 - {eventTitle}", - "@eventSubjectMessage": { - "description": "The subject line for a message to a teacher regarding a calendar event", - "type": "text", - "placeholders_order": [ - "studentName", - "eventTitle" - ], - "placeholders": { - "studentName": {}, - "eventTitle": {} - } - }, - "There is no page information available.": "没有可用的页面信息。", - "@There is no page information available.": { - "description": "Description for when no page information is available", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Assignment Details": "作业详情", - "@Assignment Details": { - "description": "Title for the page that shows details for an assignment", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "assignmentTotalPoints": "{points} 分", - "@assignmentTotalPoints": { - "description": "Label used for the total points the assignment is worth", - "type": "text", - "placeholders_order": [ - "points" - ], - "placeholders": { - "points": {} - } - }, - "assignmentTotalPointsAccessible": "{points} 分", - "@assignmentTotalPointsAccessible": { - "description": "Screen reader label used for the total points the assignment is worth", - "type": "text", - "placeholders_order": [ - "points" - ], - "placeholders": { - "points": {} - } - }, - "Due": "截止", - "@Due": { - "description": "Label for an assignment due date", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Grade": "评分", - "@Grade": { - "description": "Label for the section that displays an assignment's grade", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Locked": "已锁定", - "@Locked": { - "description": "Label for when an assignment is locked", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "assignmentLockedModule": "此作业已被模块“{moduleName}”锁定。", - "@assignmentLockedModule": { - "description": "The locked description when an assignment is locked by a module", - "type": "text", - "placeholders_order": [ - "moduleName" - ], - "placeholders": { - "moduleName": {} - } - }, - "Remind Me": "提醒我", - "@Remind Me": { - "description": "Label for the row to set reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Set a date and time to be notified of this specific assignment.": "设定通知此特定作业的日期和时间。", - "@Set a date and time to be notified of this specific assignment.": { - "description": "Description for row to set reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You will be notified about this assignment on…": "您将在...收到有关此作业的通知", - "@You will be notified about this assignment on…": { - "description": "Description for when a reminder is set", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Instructions": "说明", - "@Instructions": { - "description": "Label for the description of the assignment when it has quiz instructions", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Send a message about this assignment": "发送有关此作业的消息", - "@Send a message about this assignment": { - "description": "Accessibility hint for the assignment messaage floating action button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "This app is not authorized for use.": "此程序没有被授权使用。", - "@This app is not authorized for use.": { - "description": "The error shown when the app being used is not verified by Canvas", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The server you entered is not authorized for this app.": "您输入的服务器没有授权此应用程序。", - "@The server you entered is not authorized for this app.": { - "description": "The error shown when the desired login domain is not verified by Canvas", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The user agent for this app is not authorized.": "此应用程序的用户代理未获得授权。", - "@The user agent for this app is not authorized.": { - "description": "The error shown when the user agent during verification is not verified by Canvas", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "We were unable to verify the server for use with this app.": "我们无法验证此应用程序使用的服务器。", - "@We were unable to verify the server for use with this app.": { - "description": "The generic error shown when we are unable to verify with Canvas", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Reminders": "提醒", - "@Reminders": { - "description": "Name of the system notification channel for assignment and event reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Notifications for reminders about assignments and calendar events": "有关作业和日历活动的提醒通知", - "@Notifications for reminders about assignments and calendar events": { - "description": "Description of the system notification channel for assignment and event reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Reminders have changed!": "提醒已更改!", - "@Reminders have changed!": { - "description": "Title of the dialog shown when the user needs to update their reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "In order to provide you with a better experience, we have updated how reminders work. You can add new reminders by viewing an assignment or calendar event and tapping the switch under the \"Remind Me\" section.\n\nBe aware that any reminders created with older versions of this app will not be compatible with the new changes and you will need to create them again.": "为了让您获得更好的体验,我们更新了提醒的工作模式。通过查看作业或日历事件然后点击“提醒我”部分下面的切换按钮,可以添加新提醒。\n\n请注意,使用原来的应用程序版本创建的任何提醒均无法在更改后的新版本中使用,因此需重新创建。", - "@In order to provide you with a better experience, we have updated how reminders work. You can add new reminders by viewing an assignment or calendar event and tapping the switch under the \"Remind Me\" section.\n\nBe aware that any reminders created with older versions of this app will not be compatible with the new changes and you will need to create them again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Not a parent?": "不是家长?", - "@Not a parent?": { - "description": "Title for the screen that shows when the user is not observing any students", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "We couldn't find any students associated with this account": "我们找不到任何与该账户关联的学生", - "@We couldn't find any students associated with this account": { - "description": "Subtitle for the screen that shows when the user is not observing any students", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Are you a student or teacher?": "您是学生还是教师?", - "@Are you a student or teacher?": { - "description": "Label for button that will show users the option to view other Canvas apps in the Play Store", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "One of our other apps might be a better fit. Tap one to visit the Play Store.": "我们的其他应用可能更合适。单击可访问 Play Store。", - "@One of our other apps might be a better fit. Tap one to visit the Play Store.": { - "description": "Description of options to view other Canvas apps in the Play Store", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Return to Login": "返回登录", - "@Return to Login": { - "description": "Label for the button that returns the user to the login screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "STUDENT": "学生", - "@STUDENT": { - "description": "The \"student\" portion of the \"Canvas Student\" app name, in all caps. \"Canvas\" is excluded in this context as it will be displayed to the user as a wordmark image", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "TEACHER": "教师", - "@TEACHER": { - "description": "The \"teacher\" portion of the \"Canvas Teacher\" app name, in all caps. \"Canvas\" is excluded in this context as it will be displayed to the user as a wordmark image", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Canvas Student": "Canvas 学生", - "@Canvas Student": { - "description": "The name of the Canvas Student app. Only \"Student\" should be translated as \"Canvas\" is a brand name in this context and should not be translated.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Canvas Teacher": "Canvas 教师", - "@Canvas Teacher": { - "description": "The name of the Canvas Teacher app. Only \"Teacher\" should be translated as \"Canvas\" is a brand name in this context and should not be translated.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Alerts": "无警告", - "@No Alerts": { - "description": "The title for the empty message to show to users when there are no alerts for the student.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There’s nothing to be notified of yet.": "暂时没有任何通知。", - "@There’s nothing to be notified of yet.": { - "description": "The empty message to show to users when there are no alerts for the student.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "dismissAlertLabel": "拒绝 {alertTitle}", - "@dismissAlertLabel": { - "description": "Accessibility label to dismiss an alert", - "type": "text", - "placeholders_order": [ - "alertTitle" - ], - "placeholders": { - "alertTitle": {} - } - }, - "Course Announcement": "课程公告", - "@Course Announcement": { - "description": "Title for alerts when there is a course announcement", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Institution Announcement": "机构公告", - "@Institution Announcement": { - "description": "Title for alerts when there is an institution announcement", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "assignmentGradeAboveThreshold": "作业评分高于{threshold}", - "@assignmentGradeAboveThreshold": { - "description": "Title for alerts when an assignment grade is above the threshold value", - "type": "text", - "placeholders_order": [ - "threshold" - ], - "placeholders": { - "threshold": {} - } - }, - "assignmentGradeBelowThreshold": "作业评分低于{threshold}", - "@assignmentGradeBelowThreshold": { - "description": "Title for alerts when an assignment grade is below the threshold value", - "type": "text", - "placeholders_order": [ - "threshold" - ], - "placeholders": { - "threshold": {} - } - }, - "courseGradeAboveThreshold": "课程评分高于{threshold}", - "@courseGradeAboveThreshold": { - "description": "Title for alerts when a course grade is above the threshold value", - "type": "text", - "placeholders_order": [ - "threshold" - ], - "placeholders": { - "threshold": {} - } - }, - "courseGradeBelowThreshold": "课程评分低于{threshold}", - "@courseGradeBelowThreshold": { - "description": "Title for alerts when a course grade is below the threshold value", - "type": "text", - "placeholders_order": [ - "threshold" - ], - "placeholders": { - "threshold": {} - } - }, - "Settings": "设置", - "@Settings": { - "description": "Title for the settings screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Theme": "主题、话题", - "@Theme": { - "description": "Label for the light/dark theme section in the settings page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Dark Mode": "暗模式", - "@Dark Mode": { - "description": "Label for the button that enables dark mode", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Light Mode": "亮模式", - "@Light Mode": { - "description": "Label for the button that enables light mode", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "High Contrast Mode": "高对比度模式", - "@High Contrast Mode": { - "description": "Label for the switch that toggles high contrast mode", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Use Dark Theme in Web Content": "在 Web 内容中使用深色主题", - "@Use Dark Theme in Web Content": { - "description": "Label for the switch that toggles dark mode for webviews", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Appearance": "外观", - "@Appearance": { - "description": "Label for the appearance section in the settings page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Successfully submitted!": "已成功提交。", - "@Successfully submitted!": { - "description": "Title displayed in the grade cell for an assignment that has been submitted", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "submissionStatusSuccessSubtitle": "此作业提交时间为{date},{time},正在等待评分", - "@submissionStatusSuccessSubtitle": { - "description": "Subtitle displayed in the grade cell for an assignment that has been submitted and is awaiting a grade", - "type": "text", - "placeholders_order": [ - "date", - "time" - ], - "placeholders": { - "date": {}, - "time": {} - } - }, - "outOfPoints": "{howMany,plural, =1{共1分}other{共{points}分}}", - "@outOfPoints": { - "description": "Description for an assignment grade that has points without a current scoroe", - "type": "text", - "placeholders_order": [ - "points", - "howMany" - ], - "placeholders": { - "points": {}, - "howMany": {} - } - }, - "Excused": "已免除", - "@Excused": { - "description": "Grading status for an assignment marked as excused", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Complete": "完成", - "@Complete": { - "description": "Grading status for an assignment marked as complete", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Incomplete": "未完成", - "@Incomplete": { - "description": "Grading status for an assignment marked as incomplete", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "minus": "负分", - "@minus": { - "description": "Screen reader-friendly replacement for the \"-\" character in letter grades like \"A-\"", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "latePenalty": "迟交罚分 (-{pointsLost})", - "@latePenalty": { - "description": "Text displayed when a late penalty has been applied to the assignment", - "type": "text", - "placeholders_order": [ - "pointsLost" - ], - "placeholders": { - "pointsLost": {} - } - }, - "finalGrade": "最终评分:{grade}", - "@finalGrade": { - "description": "Text that displays the final grade of an assignment", - "type": "text", - "placeholders_order": [ - "grade" - ], - "placeholders": { - "grade": {} - } - }, - "Alert Settings": "警告设置", - "@Alert Settings": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Alert me when…": "当...时警告我", - "@Alert me when…": { - "description": "Header for the screen where the observer chooses the thresholds that will determine when they receive alerts (e.g. when an assignment is graded below 70%)", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Course grade below": "课程评分低于", - "@Course grade below": { - "description": "Label describing the threshold for when the course grade is below a certain percentage", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Course grade above": "课程评分高于", - "@Course grade above": { - "description": "Label describing the threshold for when the course grade is above a certain percentage", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Assignment missing": "缺少作业", - "@Assignment missing": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Assignment grade below": "作业评分低于", - "@Assignment grade below": { - "description": "Label describing the threshold for when an assignment is graded below a certain percentage", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Assignment grade above": "作业评分高于", - "@Assignment grade above": { - "description": "Label describing the threshold for when an assignment is graded above a certain percentage", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Course Announcements": "课程公告", - "@Course Announcements": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Institution Announcements": "机构通告", - "@Institution Announcements": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Never": "从不", - "@Never": { - "description": "Indication that tells the user they will not receive alert notifications of a specific kind", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Grade percentage": "评分百分数", - "@Grade percentage": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading your student's alerts.": "加载学生的警告时发生错误。", - "@There was an error loading your student's alerts.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Must be below 100": "必须低于100", - "@Must be below 100": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "mustBeBelowN": "必须低于{percentage}", - "@mustBeBelowN": { - "description": "Validation error to the user that they must choose a percentage below 'n'", - "type": "text", - "placeholders_order": [ - "percentage" - ], - "placeholders": { - "percentage": { - "example": 5 - } - } - }, - "mustBeAboveN": "必须高于{percentage}", - "@mustBeAboveN": { - "description": "Validation error to the user that they must choose a percentage above 'n'", - "type": "text", - "placeholders_order": [ - "percentage" - ], - "placeholders": { - "percentage": { - "example": 5 - } - } - }, - "Select Student Color": "选择学生颜色", - "@Select Student Color": { - "description": "Title for screen that allows users to assign a color to a specific student", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Electric, blue": "蓝色", - "@Electric, blue": { - "description": "Name of the Electric (blue) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Plum, Purple": "紫色", - "@Plum, Purple": { - "description": "Name of the Plum (purple) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Barney, Fuschia": "粉红", - "@Barney, Fuschia": { - "description": "Name of the Barney (fuschia) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Raspberry, Red": "红色", - "@Raspberry, Red": { - "description": "Name of the Raspberry (red) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Fire, Orange": "橙色", - "@Fire, Orange": { - "description": "Name of the Fire (orange) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Shamrock, Green": "绿色", - "@Shamrock, Green": { - "description": "Name of the Shamrock (green) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "An error occurred while saving your selection. Please try again.": "保存选择时发生错误。请重试。", - "@An error occurred while saving your selection. Please try again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "changeStudentColorLabel": "更改 {studentName} 的颜色", - "@changeStudentColorLabel": { - "description": "Accessibility label for the button that lets users change the color associated with a specific student", - "type": "text", - "placeholders_order": [ - "studentName" - ], - "placeholders": { - "studentName": {} - } - }, - "Teacher": "教师", - "@Teacher": { - "description": "Label for the Teacher enrollment type", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Student": "学生", - "@Student": { - "description": "Label for the Student enrollment type", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "TA": "助教", - "@TA": { - "description": "Label for the Teaching Assistant enrollment type (also known as Teacher Aid or Education Assistant), reduced to a short acronym/initialism if appropriate.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Observer": "观察员", - "@Observer": { - "description": "Label for the Observer enrollment type", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Use Camera": "使用相机", - "@Use Camera": { - "description": "Label for the action item that lets the user capture a photo using the device camera", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Upload File": "上传文件", - "@Upload File": { - "description": "Label for the action item that lets the user upload a file from their device", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Choose from Gallery": "从图库中选择", - "@Choose from Gallery": { - "description": "Label for the action item that lets the user select a photo from their device gallery", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Preparing…": "正在准备...", - "@Preparing…": { - "description": "Message shown while a file is being prepared to attach to a message", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Add student with…": "使用...添加学生", - "@Add student with…": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Add Student": "添加学生", - "@Add Student": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You are not observing any students.": "您未观察任何学生。", - "@You are not observing any students.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading your students.": "加载学生时发生错误。", - "@There was an error loading your students.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Pairing Code": "配对码", - "@Pairing Code": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Students can obtain a pairing code through the Canvas website": "学生可以通过 Canvas 网站获得配对码", - "@Students can obtain a pairing code through the Canvas website": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Enter the student pairing code provided to you. If the pairing code doesn't work, it may have expired": "输入提供给您的学生配对代码。如果配对代码无法使用,可能已过期", - "@Enter the student pairing code provided to you. If the pairing code doesn't work, it may have expired": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Your code is incorrect or expired.": "您的代码错误或已过期。", - "@Your code is incorrect or expired.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Something went wrong trying to create your account, please reach out to your school for assistance.": "尝试创建帐户时遇到错误,请联系您的学校寻求帮助。", - "@Something went wrong trying to create your account, please reach out to your school for assistance.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "QR Code": "二维码", - "@QR Code": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Students can create a QR code using the Canvas Student app on their mobile device": "学生可以使用移动设备上的 Canvas 学生版应用程序创建二维码", - "@Students can create a QR code using the Canvas Student app on their mobile device": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Add new student": "添加新学生", - "@Add new student": { - "description": "Semantics label for the FAB on the Manage Students Screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Select": "选择", - "@Select": { - "description": "Hint text to tell the user to choose one of two options", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I have a Canvas account": "我有 Canvas 帐户", - "@I have a Canvas account": { - "description": "Option to select for users that have a canvas account", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I don't have a Canvas account": "我没有 Canvas 帐户", - "@I don't have a Canvas account": { - "description": "Option to select for users that don't have a canvas account", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Create Account": "创建帐户", - "@Create Account": { - "description": "Button text for account creation confirmation", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Full Name": "全名", - "@Full Name": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Email Address": "电子邮件地址", - "@Email Address": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Password": "密码", - "@Password": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Full Name…": "全名...", - "@Full Name…": { - "description": "hint label for inside form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Email…": "电子邮件...", - "@Email…": { - "description": "hint label for inside form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Password…": "密码...", - "@Password…": { - "description": "hint label for inside form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Please enter full name": "请输入全名", - "@Please enter full name": { - "description": "Error message for form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Please enter an email address": "请输入电子邮件地址", - "@Please enter an email address": { - "description": "Error message for form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Please enter a valid email address": "请输入有效的电子邮件地址", - "@Please enter a valid email address": { - "description": "Error message for form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Password is required": "必须填写密码", - "@Password is required": { - "description": "Error message for form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Password must contain at least 8 characters": "密码必须包含至少 8 个字符", - "@Password must contain at least 8 characters": { - "description": "Error message for form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "qrCreateAccountTos": "点击“创建帐户”即表示,您同意{termsOfService}并确认{privacyPolicy}", - "@qrCreateAccountTos": { - "description": "The text show on the account creation screen", - "type": "text", - "placeholders_order": [ - "termsOfService", - "privacyPolicy" - ], - "placeholders": { - "termsOfService": {}, - "privacyPolicy": {} - } - }, - "Terms of Service": "服务条款", - "@Terms of Service": { - "description": "Label for the Canvas Terms of Service agreement. This will be used in the qrCreateAccountTos text and will be highlighted and clickable", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Privacy Policy": "隐私政策", - "@Privacy Policy": { - "description": "Label for the Canvas Privacy Policy agreement. This will be used in the qrCreateAccountTos text and will be highlighted and clickable", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "View the Privacy Policy": "查看隐私政策", - "@View the Privacy Policy": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Already have an account? ": "已经有一个帐户吗? ", - "@Already have an account? ": { - "description": "Part of multiline text span, includes AccountSignIn1-2, in that order", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Sign In": "登录", - "@Sign In": { - "description": "Part of multiline text span, includes AccountSignIn1-2, in that order", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Hide Password": "隐藏密码", - "@Hide Password": { - "description": "content description for password hide button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Show Password": "显示密码", - "@Show Password": { - "description": "content description for password show button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Terms of Service Link": "服务条款链接", - "@Terms of Service Link": { - "description": "content description for terms of service link", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Privacy Policy Link": "隐私政策链接", - "@Privacy Policy Link": { - "description": "content description for privacy policy link", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Event": "活动", - "@Event": { - "description": "Title for the event details screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Date": "日期", - "@Date": { - "description": "Label for the event date", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Location": "位置", - "@Location": { - "description": "Label for the location information", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Location Specified": "没有具体的位置", - "@No Location Specified": { - "description": "Description for events that do not have a location", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "eventTime": "{startAt} - {endAt}", - "@eventTime": { - "description": "The time the event is happening, example: \"2:00 pm - 4:00 pm\"", - "type": "text", - "placeholders_order": [ - "startAt", - "endAt" - ], - "placeholders": { - "startAt": {}, - "endAt": {} - } - }, - "Set a date and time to be notified of this event.": "设定通知此活动的日期和时间。", - "@Set a date and time to be notified of this event.": { - "description": "Description for row to set event reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You will be notified about this event on…": "您将在...收到有关此活动的通知", - "@You will be notified about this event on…": { - "description": "Description for when an event reminder is set", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Share Your Love for the App": "分享您所喜爱的应用程序", - "@Share Your Love for the App": { - "description": "Label for option to open the app store", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Tell us about your favorite parts of the app": "告诉我们您最喜欢应用程序的部分", - "@Tell us about your favorite parts of the app": { - "description": "Description for option to open the app store", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Legal": "法律", - "@Legal": { - "description": "Label for legal information option", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Privacy policy, terms of use, open source": "隐私政策、使用条款、开放源", - "@Privacy policy, terms of use, open source": { - "description": "Description for legal information option", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Idea for Canvas Parent App [Android]": "构想 Canvas 的[安卓版本]", - "@Idea for Canvas Parent App [Android]": { - "description": "The subject for the email to request a feature", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The following information will help us better understand your idea:": "下面的信息将帮助我们更好地了解您的想法:", - "@The following information will help us better understand your idea:": { - "description": "The header for the users information that is attached to a feature request", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Domain:": "域:", - "@Domain:": { - "description": "The label for the Canvas domain of the logged in user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "User ID:": "用户 ID:", - "@User ID:": { - "description": "The label for the Canvas user ID of the logged in user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Email:": "电子邮箱:", - "@Email:": { - "description": "The label for the eamil of the logged in user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Locale:": "区域设置:", - "@Locale:": { - "description": "The label for the locale of the logged in user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Terms of Use": "使用条款", - "@Terms of Use": { - "description": "Label for the terms of use", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Canvas on GitHub": "GitHub上的Canvas", - "@Canvas on GitHub": { - "description": "Label for the button that opens the Canvas project on GitHub's website", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was a problem loading the Terms of Use": "加载使用条款时发生错误", - "@There was a problem loading the Terms of Use": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Device": "设备", - "@Device": { - "description": "Label used for device manufacturer/model in the error report", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "OS Version": "操作系统版本", - "@OS Version": { - "description": "Label used for device operating system version in the error report", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Version Number": "版本号", - "@Version Number": { - "description": "Label used for the app version number in the error report", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Report A Problem": "报告一个问题", - "@Report A Problem": { - "description": "Title used for generic dialog to report problems", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Subject": "主题", - "@Subject": { - "description": "Label used for Subject text field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "A subject is required.": "必须填写主题。", - "@A subject is required.": { - "description": "Error shown when the subject field is empty", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "An email address is required.": "必须填写电子邮件地址。", - "@An email address is required.": { - "description": "Error shown when the email field is empty", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Description": "说明", - "@Description": { - "description": "Label used for Description text field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "A description is required.": "必须填写描述。", - "@A description is required.": { - "description": "Error shown when the description field is empty", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "How is this affecting you?": "这对您有什么影响?", - "@How is this affecting you?": { - "description": "Label used for the dropdown to select how severe the issue is", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "send": "发送", - "@send": { - "description": "Label used for send button when reporting a problem", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Just a casual question, comment, idea, suggestion…": "只是一个偶然问题、意见、想法、建议...", - "@Just a casual question, comment, idea, suggestion…": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I need some help but it's not urgent.": "我需要一些帮助,但不是迫切的。", - "@I need some help but it's not urgent.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Something's broken but I can work around it to get what I need done.": "系统出错了,但我可以解决它,并完成我所需要做的事。", - "@Something's broken but I can work around it to get what I need done.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I can't get things done until I hear back from you.": "我无法把事情做好,直到我听到您回来。", - "@I can't get things done until I hear back from you.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "EXTREME CRITICAL EMERGENCY!!": "非常紧急!", - "@EXTREME CRITICAL EMERGENCY!!": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Not Graded": "未评分", - "@Not Graded": { - "description": "Description for an assignment has not been graded.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Login flow: Normal": "登录流程:正常", - "@Login flow: Normal": { - "description": "Description for the normal login flow", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Login flow: Canvas": "登录流程:Canvas", - "@Login flow: Canvas": { - "description": "Description for the Canvas login flow", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Login flow: Site Admin": "登录流程:网站管理员", - "@Login flow: Site Admin": { - "description": "Description for the Site Admin login flow", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Login flow: Skip mobile verify": "登录流程:跳过移动设备验证", - "@Login flow: Skip mobile verify": { - "description": "Description for the login flow that skips domain verification for mobile", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Act As User": "临时代理用户", - "@Act As User": { - "description": "Label for the button that allows the user to act (masquerade) as another user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Stop Acting as User": "停止临时代理用户", - "@Stop Acting as User": { - "description": "Label for the button that allows the user to stop acting (masquerading) as another user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "actingAsUser": "您正在临时代理{userName}", - "@actingAsUser": { - "description": "Message shown while acting (masquerading) as another user", - "type": "text", - "placeholders_order": [ - "userName" - ], - "placeholders": { - "userName": {} - } - }, - "\"Act as\" is essentially logging in as this user without a password. You will be able to take any action as if you were this user, and from other users' points of views, it will be as if this user performed them. However, audit logs record that you were the one who performed the actions on behalf of this user.": "“临时代理”实际上已经登录,因为该用户没有密码。您能够像此用户一样执行任何操作,从另一位用户的角度来讲,这将视同由此用户执行这些操作。但是,审计日志记录您是代表该用户执行操作的人。", - "@\"Act as\" is essentially logging in as this user without a password. You will be able to take any action as if you were this user, and from other users' points of views, it will be as if this user performed them. However, audit logs record that you were the one who performed the actions on behalf of this user.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Domain": "域", - "@Domain": { - "description": "Text field hint for domain url input", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You must enter a valid domain": "必须输入有效的域", - "@You must enter a valid domain": { - "description": "Message displayed for domain input error", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "User ID": "用户 ID", - "@User ID": { - "description": "Text field hint for user ID input", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You must enter a user id": "必须输入用户 ID", - "@You must enter a user id": { - "description": "Message displayed for user Id input error", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error trying to act as this user. Please check the Domain and User ID and try again.": "尝试临时代理用户时发生错误。请检查域和用户 ID,然后再试一次。", - "@There was an error trying to act as this user. Please check the Domain and User ID and try again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "endMasqueradeMessage": "您将停止临时代理用户 {userName} 并返回您的原始帐户。", - "@endMasqueradeMessage": { - "description": "Confirmation message displayed when the user wants to stop acting (masquerading) as another user", - "type": "text", - "placeholders_order": [ - "userName" - ], - "placeholders": { - "userName": {} - } - }, - "endMasqueradeLogoutMessage": "您将停止临时代理用户 {userName} 并注销。", - "@endMasqueradeLogoutMessage": { - "description": "Confirmation message displayed when the user wants to stop acting (masquerading) as another user and will be logged out.", - "type": "text", - "placeholders_order": [ - "userName" - ], - "placeholders": { - "userName": {} - } - }, - "How are we doing?": "我们做得怎样?", - "@How are we doing?": { - "description": "Title for dialog asking user to rate the app out of 5 stars.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Don't show again": "不再显示", - "@Don't show again": { - "description": "Button to prevent the rating dialog from showing again.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "What can we do better?": "我们如何能做得更好?", - "@What can we do better?": { - "description": "Hint text for providing a comment with the rating.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Send Feedback": "发送反馈", - "@Send Feedback": { - "description": "Button to send rating with feedback", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "ratingDialogEmailSubject": "Android 版本建议 - Canvas Parent {version}", - "@ratingDialogEmailSubject": { - "description": "The subject for an email to provide feedback for CanvasParent.", - "type": "text", - "placeholders_order": [ - "version" - ], - "placeholders": { - "version": {} - } - }, - "starRating": "{position,plural, =1{{position} 星}other{{position} 星}}", - "@starRating": { - "description": "Accessibility label for the 1 stars to 5 stars rating", - "type": "text", - "placeholders_order": [ - "position" - ], - "placeholders": { - "position": { - "example": 1 - } - } - }, - "Student Pairing": "学生配对", - "@Student Pairing": { - "description": "Title for the screen where users can pair to students using a QR code", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Open Canvas Student": "打开 Canvas 学生版", - "@Open Canvas Student": { - "description": "Title for QR pairing tutorial screen instructing users to open the Canvas Student app", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You'll need to open your student's Canvas Student app to continue. Go into Main Menu > Settings > Pair with Observer and scan the QR code you see there.": "您需打开学生的 Canvas 学生版应用程序才能继续。转到“主菜单 > 设置 > 与旁听者配对”,扫描在其中看到的二维码。", - "@You'll need to open your student's Canvas Student app to continue. Go into Main Menu > Settings > Pair with Observer and scan the QR code you see there.": { - "description": "Message explaining how QR code pairing works", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Screenshot showing location of pairing QR code generation in the Canvas Student app": "截图显示在 Canvas 学生版应用程序中生成配对二维码的位置", - "@Screenshot showing location of pairing QR code generation in the Canvas Student app": { - "description": "Content Description for qr pairing tutorial screenshot", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Expired QR Code": "失效的二维码", - "@Expired QR Code": { - "description": "Error title shown when the users scans a QR code that has expired", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The QR code you scanned may have expired. Refresh the code on the student's device and try again.": "您扫描的二维码已失效。刷新学生设备上的二维码并重试。", - "@The QR code you scanned may have expired. Refresh the code on the student's device and try again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "A network error occurred when adding this student. Check your connection and try again.": "添加此学生时发生网络错误。请检查您的网络连接并重试。", - "@A network error occurred when adding this student. Check your connection and try again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Invalid QR Code": "无效的二维码", - "@Invalid QR Code": { - "description": "Error title shown when the user scans an invalid QR code", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Incorrect Domain": "错误的域", - "@Incorrect Domain": { - "description": "Error title shown when the users scane a QR code for a student that belongs to a different domain", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The student you are trying to add belongs to a different school. Log in or create an account with that school to scan this code.": "您尝试添加的学生属于不同的学校。使用该学校的帐户登录或创建帐户以扫描此二维码。", - "@The student you are trying to add belongs to a different school. Log in or create an account with that school to scan this code.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Camera Permission": "相机权限", - "@Camera Permission": { - "description": "Error title shown when the user wans to scan a QR code but has denied the camera permission", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "This will unpair and remove all enrollments for this student from your account.": "这样做将取消配对并从您的帐户中移除该学生的所有注册。", - "@This will unpair and remove all enrollments for this student from your account.": { - "description": "Confirmation message shown when the user tries to delete a student from their account", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was a problem removing this student from your account. Please check your connection and try again.": "从帐户中移除该学生时发生错误。请检查您的连接,然后再试一次。", - "@There was a problem removing this student from your account. Please check your connection and try again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Cancel": "取消", - "@Cancel": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "next": "下一步", - "@next": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "ok": "确定", - "@ok": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Yes": "是", - "@Yes": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No": "否", - "@No": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Retry": "重试", - "@Retry": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Delete": "删除", - "@Delete": { - "description": "Label used for general delete/remove actions", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Done": "完成", - "@Done": { - "description": "Label for general done/finished actions", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Refresh": "刷新", - "@Refresh": { - "description": "Label for button to refresh data from the web", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "View Description": "查看说明", - "@View Description": { - "description": "Button to view the description for an event or assignment", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "expanded": "展开", - "@expanded": { - "description": "Description for the accessibility reader for list groups that are expanded", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "collapsed": "折叠", - "@collapsed": { - "description": "Description for the accessibility reader for list groups that are expanded", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "An unexpected error occurred": "一个意料之外的错误发生了。", - "@An unexpected error occurred": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No description": "无描述", - "@No description": { - "description": "Message used when the assignment has no description", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Launch External Tool": "启动外部工具", - "@Launch External Tool": { - "description": "Button text added to webviews to let users open external tools in their browser", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Interactions on this page are limited by your institution.": "在此页面上的互动被您的机构限制。", - "@Interactions on this page are limited by your institution.": { - "description": "Message describing how the webview has limited access due to an instution setting", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "dateAtTime": "{date},时间 {time}", - "@dateAtTime": { - "description": "The string to format dates", - "type": "text", - "placeholders_order": [ - "date", - "time" - ], - "placeholders": { - "date": {}, - "time": {} - } - }, - "dueDateAtTime": "截止于 {date},{time}", - "@dueDateAtTime": { - "description": "The string to format due dates", - "type": "text", - "placeholders_order": [ - "date", - "time" - ], - "placeholders": { - "date": {}, - "time": {} - } - }, - "No Due Date": "无截止日期", - "@No Due Date": { - "description": "Label for assignments that do not have a due date", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Filter": "筛选器", - "@Filter": { - "description": "Label for buttons to filter what items are visible", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "unread": "未读", - "@unread": { - "description": "Label for things that are marked as unread", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "unreadCount": "{count}未读", - "@unreadCount": { - "description": "Formatted string for when there are a number of unread items", - "type": "text", - "placeholders_order": [ - "count" - ], - "placeholders": { - "count": {} - } - }, - "badgeNumberPlus": "{count}+", - "@badgeNumberPlus": { - "description": "Formatted string for when too many items are being notified in a badge, generally something like: 99+", - "type": "text", - "placeholders_order": [ - "count" - ], - "placeholders": { - "count": {} - } - }, - "There was an error loading this announcement": "加载此公告时发生错误", - "@There was an error loading this announcement": { - "description": "Message shown when an announcement detail screen fails to load", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Network error": "网络错误", - "@Network error": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Under Construction": "正在建设中", - "@Under Construction": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "We are currently building this feature for your viewing pleasure.": "我们目前在构建此功能,以便为您提供愉悦的浏览体验。", - "@We are currently building this feature for your viewing pleasure.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Request Login Help Button": "请求登录帮助按钮", - "@Request Login Help Button": { - "description": "Accessibility hint for button that opens help dialog for a login help request", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Request Login Help": "请求登录帮助", - "@Request Login Help": { - "description": "Title of help dialog for a login help request", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I'm having trouble logging in": "我在登录时遇到问题", - "@I'm having trouble logging in": { - "description": "Subject of help dialog for a login help request", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "An error occurred when trying to display this link": "尝试显示此链接时发生错误", - "@An error occurred when trying to display this link": { - "description": "Error message shown when a link can't be opened", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "We are unable to display this link, it may belong to an institution you currently aren't logged in to.": "无法显示此链接,可能属于您目前未登录的机构。", - "@We are unable to display this link, it may belong to an institution you currently aren't logged in to.": { - "description": "Description for error page shown when clicking a link", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Link Error": "链接错误", - "@Link Error": { - "description": "Title for error page shown when clicking a link", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Open In Browser": "在浏览器里打开", - "@Open In Browser": { - "description": "Text for button to open a link in the browswer", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You'll find the QR code on the web in your account profile. Click 'QR for Mobile Login' in the list.": "在 Web 的帐户个人资料中可以找到二维码。点击列表中的“用于移动设备登录的二维码”。", - "@You'll find the QR code on the web in your account profile. Click 'QR for Mobile Login' in the list.": { - "description": "Text for qr login tutorial screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Locate QR Code": "查找二维码", - "@Locate QR Code": { - "description": "Text for qr login button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Please scan a QR code generated by Canvas": "请扫描 Canvas 生成的二维码", - "@Please scan a QR code generated by Canvas": { - "description": "Text for qr login error with incorrect qr code", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error logging in. Please generate another QR Code and try again.": "登录时发生错误。请生成新的二维码并重试。", - "@There was an error logging in. Please generate another QR Code and try again.": { - "description": "Text for qr login error", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Screenshot showing location of QR code generation in browser": "在浏览器中显示二维码生成位置的截图", - "@Screenshot showing location of QR code generation in browser": { - "description": "Content Description for qr login tutorial screenshot", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "QR scanning requires camera access": "扫描二维码要求具有相机访问权限", - "@QR scanning requires camera access": { - "description": "placeholder for camera error for QR code scan", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The linked item is no longer available": "链接项目不再可用", - "@The linked item is no longer available": { - "description": "error message when the alert could no be opened", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Message sent": "消息已发送", - "@Message sent": { - "description": "confirmation message on the screen when the user succesfully sends a message", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Acceptable Use Policy": "可接受的使用政策", - "@Acceptable Use Policy": { - "description": "title for the acceptable use policy screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Submit": "提交", - "@Submit": { - "description": "submit button title for acceptable use policy screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Either you're a new user or the Acceptable Use Policy has changed since you last agreed to it. Please agree to the Acceptable Use Policy before you continue.": "您是新用户,或者自您上次同意可接受的使用政策后,该政策已更改。请同意“可接受的使用政策”后再继续。", - "@Either you're a new user or the Acceptable Use Policy has changed since you last agreed to it. Please agree to the Acceptable Use Policy before you continue.": { - "description": "acceptable use policy screen description", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I agree to the Acceptable Use Policy.": "我同意“可接受的使用政策”。", - "@I agree to the Acceptable Use Policy.": { - "description": "acceptable use policy switch title", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "About": "关于", - "@About": { - "description": "Title for about menu item in settings", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "App": "应用程序", - "@App": { - "description": "Title for App field on about page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Login ID": "登录 ID", - "@Login ID": { - "description": "Title for Login ID field on about page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Email": "电子邮件", - "@Email": { - "description": "Title for Email field on about page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Version": "版本", - "@Version": { - "description": "Title for Version field on about page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - } -} \ No newline at end of file diff --git a/apps/flutter_parent/lib/l10n/res/intl_zh_Hant.arb b/apps/flutter_parent/lib/l10n/res/intl_zh_Hant.arb deleted file mode 100644 index c19d37b2ac..0000000000 --- a/apps/flutter_parent/lib/l10n/res/intl_zh_Hant.arb +++ /dev/null @@ -1,2746 +0,0 @@ -{ - "@@last_modified": "2023-04-14T11:04:46.988317", - "alertsLabel": "提醒", - "@alertsLabel": { - "description": "The label for the Alerts tab", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "calendarLabel": "行事曆", - "@calendarLabel": { - "description": "The label for the Calendar tab", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "coursesLabel": "課程", - "@coursesLabel": { - "description": "The label for the Courses tab", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Students": "無學生", - "@No Students": { - "description": "Text for when an observer has no students they are observing", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Tap to show student selector": "點選以顯示學生選擇器", - "@Tap to show student selector": { - "description": "Semantics label for the area that will show the student selector when tapped", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Tap to pair with a new student": "點選以和新學生配對", - "@Tap to pair with a new student": { - "description": "Semantics label for the add student button in the student selector", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Tap to select this student": "點選以選擇此學生", - "@Tap to select this student": { - "description": "Semantics label on individual students in the student switcher", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Manage Students": "管理學生", - "@Manage Students": { - "description": "Label text for the Manage Students nav drawer button as well as the title for the Manage Students screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Help": "支援", - "@Help": { - "description": "Label text for the help nav drawer button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Log Out": "登出", - "@Log Out": { - "description": "Label text for the Log Out nav drawer button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Switch Users": "切換使用者", - "@Switch Users": { - "description": "Label text for the Switch Users nav drawer button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "appVersion": "v. {version}", - "@appVersion": { - "description": "App version shown in the navigation drawer", - "type": "text", - "placeholders_order": [ - "version" - ], - "placeholders": { - "version": {} - } - }, - "Are you sure you want to log out?": "是否確定登出?", - "@Are you sure you want to log out?": { - "description": "Confirmation message displayed when the user tries to log out", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Calendars": "行事曆", - "@Calendars": { - "description": "Label for button that lets users select which calendars to display", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "nextMonth": "下個月:{month}", - "@nextMonth": { - "description": "Label for the button that switches the calendar to the next month", - "type": "text", - "placeholders_order": [ - "month" - ], - "placeholders": { - "month": {} - } - }, - "previousMonth": "上個月:{month}", - "@previousMonth": { - "description": "Label for the button that switches the calendar to the previous month", - "type": "text", - "placeholders_order": [ - "month" - ], - "placeholders": { - "month": {} - } - }, - "nextWeek": "下一週開始 {date}", - "@nextWeek": { - "description": "Label for the button that switches the calendar to the next week", - "type": "text", - "placeholders_order": [ - "date" - ], - "placeholders": { - "date": {} - } - }, - "previousWeek": "上一週開始 {date}", - "@previousWeek": { - "description": "Label for the button that switches the calendar to the previous week", - "type": "text", - "placeholders_order": [ - "date" - ], - "placeholders": { - "date": {} - } - }, - "selectedMonthLabel": "{month} 的月份", - "@selectedMonthLabel": { - "description": "Accessibility label for the button that expands/collapses the month view", - "type": "text", - "placeholders_order": [ - "month" - ], - "placeholders": { - "month": {} - } - }, - "expand": "展開", - "@expand": { - "description": "Accessibility label for the on-tap hint for the button that expands/collapses the month view", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "collapse": "收起", - "@collapse": { - "description": "Accessibility label for the on-tap hint for the button that expands/collapses the month view", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "pointsPossible": "可能 {points} 分", - "@pointsPossible": { - "description": "Screen reader label used for the points possible for an assignment, quiz, etc.", - "type": "text", - "placeholders_order": [ - "points" - ], - "placeholders": { - "points": {} - } - }, - "calendarDaySemanticsLabel": "{eventCount,plural, =1{{date}、{eventCount} 活動}other{{date}、{eventCount} 活動}}", - "@calendarDaySemanticsLabel": { - "description": "Screen reader label used for calendar day, reads the date and count of events", - "type": "text", - "placeholders_order": [ - "date", - "eventCount" - ], - "placeholders": { - "date": {}, - "eventCount": {} - } - }, - "No Events Today!": "今天並無活動!", - "@No Events Today!": { - "description": "Title displayed when there are no calendar events for the current day", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "It looks like a great day to rest, relax, and recharge.": "看來是適合休息、放鬆和充電的一天。", - "@It looks like a great day to rest, relax, and recharge.": { - "description": "Message displayed when there are no calendar events for the current day", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading your student's calendar": "載入您的學生的行事曆時發生錯誤", - "@There was an error loading your student's calendar": { - "description": "Message displayed when calendar events could not be loaded for the current student", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Tap to favorite the courses you want to see on the Calendar. Select up to 10.": "點選以選擇您要在行事曆上看到的最愛課程。選擇最多 10 個。", - "@Tap to favorite the courses you want to see on the Calendar. Select up to 10.": { - "description": "Description text on calendar filter screen.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You may only choose 10 calendars to display": "您只能選擇顯示 10 個行事曆", - "@You may only choose 10 calendars to display": { - "description": "Error text when trying to select more than 10 calendars", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You must select at least one calendar to display": "必須選擇最少顯示一個行事曆", - "@You must select at least one calendar to display": { - "description": "Error text when trying to de-select all calendars", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Planner Note": "規劃注釋", - "@Planner Note": { - "description": "Label used for notes in the planner", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Go to today": "前往今天", - "@Go to today": { - "description": "Accessibility label used for the today button in the planner", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Previous Logins": "先前登入", - "@Previous Logins": { - "description": "Label for the list of previous user logins", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "canvasLogoLabel": "Canvas 標誌", - "@canvasLogoLabel": { - "description": "The semantics label for the Canvas logo", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "findSchool": "尋找學校", - "@findSchool": { - "description": "Text for the find-my-school button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "findAnotherSchool": "尋找其他學校", - "@findAnotherSchool": { - "description": "Text for the find-another-school button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "domainSearchInputHint": "輸入學校名稱或地區…", - "@domainSearchInputHint": { - "description": "Input hint for the text box on the domain search screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "noDomainResults": "找不到符合 \"{query}\" 的學校", - "@noDomainResults": { - "description": "Message shown to users when the domain search query did not return any results", - "type": "text", - "placeholders_order": [ - "query" - ], - "placeholders": { - "query": {} - } - }, - "domainSearchHelpLabel": "如何找到我的學校?", - "@domainSearchHelpLabel": { - "description": "Label for the help button on the domain search screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "canvasGuides": "Canvas 指南", - "@canvasGuides": { - "description": "Proper name for the Canvas Guides. This will be used in the domainSearchHelpBody text and will be highlighted and clickable", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "canvasSupport": "Canvas 支援", - "@canvasSupport": { - "description": "Proper name for Canvas Support. This will be used in the domainSearchHelpBody text and will be highlighted and clickable", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "domainSearchHelpBody": "嘗試搜尋您試著存取的學校或地區的名稱,例如“Smith Private School”或“Smith County Schools”。您也可以直接輸入 Canvas 網域,例如“smith.instructure.com”。\n\n如需更多有關尋找您的機構的 Canvas 帳戶的資訊,您可以瀏覽 {canvasGuides}、連線到 {canvasSupport} 或聯絡您的學校尋求協助。", - "@domainSearchHelpBody": { - "description": "The body text shown in the help dialog on the domain search screen", - "type": "text", - "placeholders_order": [ - "canvasGuides", - "canvasSupport" - ], - "placeholders": { - "canvasGuides": {}, - "canvasSupport": {} - } - }, - "Uh oh!": "噢!", - "@Uh oh!": { - "description": "Title of the screen that shows when a crash has occurred", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "We’re not sure what happened, but it wasn’t good. Contact us if this keeps happening.": "不確定發生什麼事,但不是好事。如果持續發生,請聯絡我們。", - "@We’re not sure what happened, but it wasn’t good. Contact us if this keeps happening.": { - "description": "Message shown when a crash has occurred", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Contact Support": "聯絡支援", - "@Contact Support": { - "description": "Label for the button that allows users to contact support after a crash has occurred", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "View error details": "檢視錯誤詳細資料", - "@View error details": { - "description": "Label for the button that allowed users to view crash details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Restart app": "重新啟動應用程式", - "@Restart app": { - "description": "Label for the button that will restart the entire application", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Application version": "應用程式版本", - "@Application version": { - "description": "Label for the application version displayed in the crash details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Device model": "裝置機型", - "@Device model": { - "description": "Label for the device model displayed in the crash details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Android OS version": "Android 作業系統版本", - "@Android OS version": { - "description": "Label for the Android operating system version displayed in the crash details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Full error message": "完整錯誤訊息", - "@Full error message": { - "description": "Label for the full error message displayed in the crash details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Inbox": "收件匣", - "@Inbox": { - "description": "Title for the Inbox screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading your inbox messages.": "載入您的收件匣訊息時發生錯誤。", - "@There was an error loading your inbox messages.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Subject": "無主題", - "@No Subject": { - "description": "Title used for inbox messages that have no subject", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unable to fetch courses. Please check your connection and try again.": "無法取得課程。請檢查您的連接然後重試。", - "@Unable to fetch courses. Please check your connection and try again.": { - "description": "Message shown when an error occured while loading courses", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Choose a course to message": "選擇課程以傳送訊息", - "@Choose a course to message": { - "description": "Header in the course list shown when the user is choosing which course to associate with a new message", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Inbox Zero": "收件匣無訊息", - "@Inbox Zero": { - "description": "Title of the message shown when there are no inbox messages", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You’re all caught up!": "您已讀完所有新訊息!", - "@You’re all caught up!": { - "description": "Subtitle of the message shown when there are no inbox messages", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading recipients for this course": "載入此課程的收件人時發生錯誤", - "@There was an error loading recipients for this course": { - "description": "Message shown when attempting to create a new message but the recipients list failed to load", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unable to send message. Check your connection and try again.": "無法傳送訊息。請檢查您的連線,然後再試一次。", - "@Unable to send message. Check your connection and try again.": { - "description": "Message show when there was an error creating or sending a new message", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unsaved changes": "未儲存的變更", - "@Unsaved changes": { - "description": "Title of the dialog shown when the user tries to leave with unsaved changes", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Are you sure you wish to close this page? Your unsent message will be lost.": "是否確定要關閉此頁面?將遺失未傳送的訊息。", - "@Are you sure you wish to close this page? Your unsent message will be lost.": { - "description": "Body text of the dialog shown when the user tries leave with unsaved changes", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "New message": "新訊息", - "@New message": { - "description": "Title of the new-message screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Add attachment": "添加附件", - "@Add attachment": { - "description": "Tooltip for the add-attachment button in the new-message screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Send message": "傳送訊息", - "@Send message": { - "description": "Tooltip for the send-message button in the new-message screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Select recipients": "選擇收件人", - "@Select recipients": { - "description": "Tooltip for the button that allows users to select message recipients", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No recipients selected": "未選擇收件人", - "@No recipients selected": { - "description": "Hint displayed when the user has not selected any message recipients", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Message subject": "訊息主題", - "@Message subject": { - "description": "Hint text displayed in the input field for the message subject", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Message": "訊息", - "@Message": { - "description": "Hint text displayed in the input field for the message body", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Recipients": "收件人", - "@Recipients": { - "description": "Label for message recipients", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "plusRecipientCount": "+{count}", - "@plusRecipientCount": { - "description": "Shows the number of recipients that are selected but not displayed on screen.", - "type": "text", - "placeholders_order": [ - "count" - ], - "placeholders": { - "count": { - "example": 5 - } - } - }, - "Failed. Tap for options.": "失敗。點選選項。", - "@Failed. Tap for options.": { - "description": "Short message shown on a message attachment when uploading has failed", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "courseForWhom": "針對 {studentShortName}", - "@courseForWhom": { - "description": "Describes for whom a course is for (i.e. for Bill)", - "type": "text", - "placeholders_order": [ - "studentShortName" - ], - "placeholders": { - "studentShortName": {} - } - }, - "messageLinkPostscript": "關於:{studentName},{linkUrl}", - "@messageLinkPostscript": { - "description": "A postscript appended to new messages that clarifies which student is the subject of the message and also includes a URL for the related Canvas component (course, assignment, event, etc).", - "type": "text", - "placeholders_order": [ - "studentName", - "linkUrl" - ], - "placeholders": { - "studentName": {}, - "linkUrl": {} - } - }, - "There was an error loading this conversation": "載入此交談時發生錯誤", - "@There was an error loading this conversation": { - "description": "Message shown when a conversation fails to load", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Reply": "回覆", - "@Reply": { - "description": "Button label for replying to a conversation", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Reply All": "全部回覆", - "@Reply All": { - "description": "Button label for replying to all conversation participants", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unknown User": "未知使用者", - "@Unknown User": { - "description": "Label used where the user name is not known", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "me": "我", - "@me": { - "description": "First-person pronoun (i.e. 'me') that will be used in message author info, e.g. 'Me to 4 others' or 'Jon Snow to me'", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "authorToRecipient": "{authorName} 至 {recipientName}", - "@authorToRecipient": { - "description": "Author info for a single-recipient message; includes both the author name and the recipient name.", - "type": "text", - "placeholders_order": [ - "authorName", - "recipientName" - ], - "placeholders": { - "authorName": {}, - "recipientName": {} - } - }, - "authorToNOthers": "{howMany,plural, =1{{authorName} 到 1 個其他}other{{authorName} 到 {howMany} 其他}}", - "@authorToNOthers": { - "description": "Author info for a mutli-recipient message; includes the author name and the number of recipients", - "type": "text", - "placeholders_order": [ - "authorName", - "howMany" - ], - "placeholders": { - "authorName": {}, - "howMany": {} - } - }, - "authorToRecipientAndNOthers": "{howMany,plural, =1{{authorName} 到 {recipientName} 和 1 個其他}other{{authorName} 到 {recipientName} 和 {howMany} 其他}}", - "@authorToRecipientAndNOthers": { - "description": "Author info for a multi-recipient message; includes the author name, one recipient name, and the number of other recipients", - "type": "text", - "placeholders_order": [ - "authorName", - "recipientName", - "howMany" - ], - "placeholders": { - "authorName": {}, - "recipientName": {}, - "howMany": {} - } - }, - "Download": "下載", - "@Download": { - "description": "Label for the button that will begin downloading a file", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Open with another app": "使用其他應用程式開啟", - "@Open with another app": { - "description": "Label for the button that will allow users to open a file with another app", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There are no installed applications that can open this file": "未安裝可開啟此檔案的應用程式", - "@There are no installed applications that can open this file": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unsupported File": "不支援的檔案", - "@Unsupported File": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "This file is unsupported and can’t be viewed through the app": "不支援此檔案,而且無法透過應用程式檢視", - "@This file is unsupported and can’t be viewed through the app": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unable to play this media file": "無法播放此媒體檔案", - "@Unable to play this media file": { - "description": "Message shown when audio or video media could not be played", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Unable to load this image": "無法載入此影像", - "@Unable to load this image": { - "description": "Message shown when an image file could not be loaded or displayed", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading this file": "載入此檔案時發生錯誤", - "@There was an error loading this file": { - "description": "Message shown when a file could not be loaded or displayed", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Courses": "無課程", - "@No Courses": { - "description": "Title for having no courses", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Your student’s courses might not be published yet.": "您的學生的課程可能尚未發佈。", - "@Your student’s courses might not be published yet.": { - "description": "Message for having no courses", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading your student’s courses.": "載入您的學生的課程時發生錯誤。", - "@There was an error loading your student’s courses.": { - "description": "Message displayed when the list of student courses could not be loaded", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Grade": "無評分", - "@No Grade": { - "description": "Message shown when there is currently no grade available for a course", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Filter by": "篩選條件", - "@Filter by": { - "description": "Title for list of terms to filter grades by", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Grades": "成績", - "@Grades": { - "description": "Label for the \"Grades\" tab in course details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Syllabus": "課程大綱", - "@Syllabus": { - "description": "Label for the \"Syllabus\" tab in course details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Front Page": "首頁", - "@Front Page": { - "description": "Label for the \"Front Page\" tab in course details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Summary": "摘要", - "@Summary": { - "description": "Label for the \"Summary\" tab in course details", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Send a message about this course": "傳送與此學生有關的訊息", - "@Send a message about this course": { - "description": "Accessibility hint for the course messaage floating action button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Total Grade": "總評級", - "@Total Grade": { - "description": "Label for the total grade in the course", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Graded": "已評分", - "@Graded": { - "description": "Label for assignments that have been graded", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Submitted": "已提交", - "@Submitted": { - "description": "Label for assignments that have been submitted", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Not Submitted": "未提交", - "@Not Submitted": { - "description": "Label for assignments that have not been submitted", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Late": "逾期", - "@Late": { - "description": "Label for assignments that have been marked late or submitted late", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Missing": "缺少", - "@Missing": { - "description": "Label for assignments that have been marked missing or are not submitted and past the due date", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "-": "-", - "@-": { - "description": "Value representing no score for student submission", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "All Grading Periods": "所有評分期", - "@All Grading Periods": { - "description": "Label for selecting all grading periods", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Assignments": "無作業", - "@No Assignments": { - "description": "Title for the no assignments message", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "It looks like assignments haven't been created in this space yet.": "此空間中尚未建立任何作業。", - "@It looks like assignments haven't been created in this space yet.": { - "description": "Message for no assignments", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading the summary details for this course.": "載入此課程的摘要詳細資料時發生錯誤。", - "@There was an error loading the summary details for this course.": { - "description": "Message shown when the course summary could not be loaded", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Summary": "無摘要", - "@No Summary": { - "description": "Title displayed when there are no items in the course summary", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "This course does not have any assignments or calendar events yet.": "此課程還沒有任何作業列表或行事曆。", - "@This course does not have any assignments or calendar events yet.": { - "description": "Message displayed when there are no items in the course summary", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "gradeFormatScoreOutOfPointsPossible": "{score} / {pointsPossible}", - "@gradeFormatScoreOutOfPointsPossible": { - "description": "Formatted string for a student score out of the points possible", - "type": "text", - "placeholders_order": [ - "score", - "pointsPossible" - ], - "placeholders": { - "score": {}, - "pointsPossible": {} - } - }, - "contentDescriptionScoreOutOfPointsPossible": "得分為 {score},滿分為 {pointsPossible}", - "@contentDescriptionScoreOutOfPointsPossible": { - "description": "Formatted string for a student score out of the points possible", - "type": "text", - "placeholders_order": [ - "score", - "pointsPossible" - ], - "placeholders": { - "score": {}, - "pointsPossible": {} - } - }, - "gradesSubjectMessage": "關於:{studentName},成績", - "@gradesSubjectMessage": { - "description": "The subject line for a message to a teacher regarding a student's grades", - "type": "text", - "placeholders_order": [ - "studentName" - ], - "placeholders": { - "studentName": {} - } - }, - "syllabusSubjectMessage": "關於:{studentName},課程大綱", - "@syllabusSubjectMessage": { - "description": "The subject line for a message to a teacher regarding a course syllabus", - "type": "text", - "placeholders_order": [ - "studentName" - ], - "placeholders": { - "studentName": {} - } - }, - "frontPageSubjectMessage": "關於:{studentName},封面頁", - "@frontPageSubjectMessage": { - "description": "The subject line for a message to a teacher regarding a course front page", - "type": "text", - "placeholders_order": [ - "studentName" - ], - "placeholders": { - "studentName": {} - } - }, - "assignmentSubjectMessage": "關於:{studentName},作業 - {assignmentName}", - "@assignmentSubjectMessage": { - "description": "The subject line for a message to a teacher regarding a student's assignment", - "type": "text", - "placeholders_order": [ - "studentName", - "assignmentName" - ], - "placeholders": { - "studentName": {}, - "assignmentName": {} - } - }, - "eventSubjectMessage": "關於:{studentName},活動 - {eventTitle}", - "@eventSubjectMessage": { - "description": "The subject line for a message to a teacher regarding a calendar event", - "type": "text", - "placeholders_order": [ - "studentName", - "eventTitle" - ], - "placeholders": { - "studentName": {}, - "eventTitle": {} - } - }, - "There is no page information available.": "沒有可用的頁面資訊。", - "@There is no page information available.": { - "description": "Description for when no page information is available", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Assignment Details": "作業詳細資料", - "@Assignment Details": { - "description": "Title for the page that shows details for an assignment", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "assignmentTotalPoints": "{points} 分", - "@assignmentTotalPoints": { - "description": "Label used for the total points the assignment is worth", - "type": "text", - "placeholders_order": [ - "points" - ], - "placeholders": { - "points": {} - } - }, - "assignmentTotalPointsAccessible": "{points} 分", - "@assignmentTotalPointsAccessible": { - "description": "Screen reader label used for the total points the assignment is worth", - "type": "text", - "placeholders_order": [ - "points" - ], - "placeholders": { - "points": {} - } - }, - "Due": "截止", - "@Due": { - "description": "Label for an assignment due date", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Grade": "評分", - "@Grade": { - "description": "Label for the section that displays an assignment's grade", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Locked": "已鎖定", - "@Locked": { - "description": "Label for when an assignment is locked", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "assignmentLockedModule": "此作業由單元 \"{moduleName}\" 鎖定。", - "@assignmentLockedModule": { - "description": "The locked description when an assignment is locked by a module", - "type": "text", - "placeholders_order": [ - "moduleName" - ], - "placeholders": { - "moduleName": {} - } - }, - "Remind Me": "提醒我", - "@Remind Me": { - "description": "Label for the row to set reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Set a date and time to be notified of this specific assignment.": "設定通知此指定作業的日期和時間。", - "@Set a date and time to be notified of this specific assignment.": { - "description": "Description for row to set reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You will be notified about this assignment on…": "將在以下時間通知您關於此作業…", - "@You will be notified about this assignment on…": { - "description": "Description for when a reminder is set", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Instructions": "教學", - "@Instructions": { - "description": "Label for the description of the assignment when it has quiz instructions", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Send a message about this assignment": "傳送與此作業有關的訊息", - "@Send a message about this assignment": { - "description": "Accessibility hint for the assignment messaage floating action button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "This app is not authorized for use.": "該 app 程式未獲得使用權限。", - "@This app is not authorized for use.": { - "description": "The error shown when the app being used is not verified by Canvas", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The server you entered is not authorized for this app.": "您輸入的伺服器未獲得使用該應用程式的授權。", - "@The server you entered is not authorized for this app.": { - "description": "The error shown when the desired login domain is not verified by Canvas", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The user agent for this app is not authorized.": "該應用程式的使用者代理未獲得授權。", - "@The user agent for this app is not authorized.": { - "description": "The error shown when the user agent during verification is not verified by Canvas", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "We were unable to verify the server for use with this app.": "無法確認此應用程式使用的伺服器。", - "@We were unable to verify the server for use with this app.": { - "description": "The generic error shown when we are unable to verify with Canvas", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Reminders": "提醒", - "@Reminders": { - "description": "Name of the system notification channel for assignment and event reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Notifications for reminders about assignments and calendar events": "與作業和行事曆活動有關的提醒通知", - "@Notifications for reminders about assignments and calendar events": { - "description": "Description of the system notification channel for assignment and event reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Reminders have changed!": "提醒功能已改變!", - "@Reminders have changed!": { - "description": "Title of the dialog shown when the user needs to update their reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "In order to provide you with a better experience, we have updated how reminders work. You can add new reminders by viewing an assignment or calendar event and tapping the switch under the \"Remind Me\" section.\n\nBe aware that any reminders created with older versions of this app will not be compatible with the new changes and you will need to create them again.": "為向您提供更佳體驗,我們更新了提醒功能的運作方式。您可以在檢視作業或行事曆活動時,點擊「提醒我」部分下方的切換按鈕,以新增提醒。\n\n請注意,任何透過較舊版本應用程式創建的提醒將不能與新功能相容,您需要再次創建提醒。", - "@In order to provide you with a better experience, we have updated how reminders work. You can add new reminders by viewing an assignment or calendar event and tapping the switch under the \"Remind Me\" section.\n\nBe aware that any reminders created with older versions of this app will not be compatible with the new changes and you will need to create them again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Not a parent?": "不是父母?", - "@Not a parent?": { - "description": "Title for the screen that shows when the user is not observing any students", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "We couldn't find any students associated with this account": "我們找不到與此帳戶有關的任何學生", - "@We couldn't find any students associated with this account": { - "description": "Subtitle for the screen that shows when the user is not observing any students", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Are you a student or teacher?": "您是學生或教師?", - "@Are you a student or teacher?": { - "description": "Label for button that will show users the option to view other Canvas apps in the Play Store", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "One of our other apps might be a better fit. Tap one to visit the Play Store.": "我們其他應用程式可能更適合您。按一查看 Play Store。", - "@One of our other apps might be a better fit. Tap one to visit the Play Store.": { - "description": "Description of options to view other Canvas apps in the Play Store", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Return to Login": "返回登入頁面", - "@Return to Login": { - "description": "Label for the button that returns the user to the login screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "STUDENT": "學生", - "@STUDENT": { - "description": "The \"student\" portion of the \"Canvas Student\" app name, in all caps. \"Canvas\" is excluded in this context as it will be displayed to the user as a wordmark image", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "TEACHER": "教師", - "@TEACHER": { - "description": "The \"teacher\" portion of the \"Canvas Teacher\" app name, in all caps. \"Canvas\" is excluded in this context as it will be displayed to the user as a wordmark image", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Canvas Student": "Canvas Student", - "@Canvas Student": { - "description": "The name of the Canvas Student app. Only \"Student\" should be translated as \"Canvas\" is a brand name in this context and should not be translated.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Canvas Teacher": "Canvas Teacher", - "@Canvas Teacher": { - "description": "The name of the Canvas Teacher app. Only \"Teacher\" should be translated as \"Canvas\" is a brand name in this context and should not be translated.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Alerts": "無提醒", - "@No Alerts": { - "description": "The title for the empty message to show to users when there are no alerts for the student.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There’s nothing to be notified of yet.": "尚未有任何通知。尚未有任何通知。", - "@There’s nothing to be notified of yet.": { - "description": "The empty message to show to users when there are no alerts for the student.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "dismissAlertLabel": "忽略 {alertTitle}", - "@dismissAlertLabel": { - "description": "Accessibility label to dismiss an alert", - "type": "text", - "placeholders_order": [ - "alertTitle" - ], - "placeholders": { - "alertTitle": {} - } - }, - "Course Announcement": "課程通告", - "@Course Announcement": { - "description": "Title for alerts when there is a course announcement", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Institution Announcement": "機構通告", - "@Institution Announcement": { - "description": "Title for alerts when there is an institution announcement", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "assignmentGradeAboveThreshold": "作業評分高於 {threshold}", - "@assignmentGradeAboveThreshold": { - "description": "Title for alerts when an assignment grade is above the threshold value", - "type": "text", - "placeholders_order": [ - "threshold" - ], - "placeholders": { - "threshold": {} - } - }, - "assignmentGradeBelowThreshold": "作業評分低於 {threshold}", - "@assignmentGradeBelowThreshold": { - "description": "Title for alerts when an assignment grade is below the threshold value", - "type": "text", - "placeholders_order": [ - "threshold" - ], - "placeholders": { - "threshold": {} - } - }, - "courseGradeAboveThreshold": "課程評分高於 {threshold}", - "@courseGradeAboveThreshold": { - "description": "Title for alerts when a course grade is above the threshold value", - "type": "text", - "placeholders_order": [ - "threshold" - ], - "placeholders": { - "threshold": {} - } - }, - "courseGradeBelowThreshold": "課程評分低於 {threshold}", - "@courseGradeBelowThreshold": { - "description": "Title for alerts when a course grade is below the threshold value", - "type": "text", - "placeholders_order": [ - "threshold" - ], - "placeholders": { - "threshold": {} - } - }, - "Settings": "設定", - "@Settings": { - "description": "Title for the settings screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Theme": "主題", - "@Theme": { - "description": "Label for the light/dark theme section in the settings page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Dark Mode": "暗色模式", - "@Dark Mode": { - "description": "Label for the button that enables dark mode", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Light Mode": "淡色模式", - "@Light Mode": { - "description": "Label for the button that enables light mode", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "High Contrast Mode": "高對比模式", - "@High Contrast Mode": { - "description": "Label for the switch that toggles high contrast mode", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Use Dark Theme in Web Content": "在網頁內容使用暗色外觀主題", - "@Use Dark Theme in Web Content": { - "description": "Label for the switch that toggles dark mode for webviews", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Appearance": "外觀", - "@Appearance": { - "description": "Label for the appearance section in the settings page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Successfully submitted!": "成功提交!", - "@Successfully submitted!": { - "description": "Title displayed in the grade cell for an assignment that has been submitted", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "submissionStatusSuccessSubtitle": "此作業在 {date} 的 {time} 上已提交,並且正在等待評分", - "@submissionStatusSuccessSubtitle": { - "description": "Subtitle displayed in the grade cell for an assignment that has been submitted and is awaiting a grade", - "type": "text", - "placeholders_order": [ - "date", - "time" - ], - "placeholders": { - "date": {}, - "time": {} - } - }, - "outOfPoints": "{howMany,plural, =1{滿分為 1 分}other{滿分為 {points} 分}}", - "@outOfPoints": { - "description": "Description for an assignment grade that has points without a current scoroe", - "type": "text", - "placeholders_order": [ - "points", - "howMany" - ], - "placeholders": { - "points": {}, - "howMany": {} - } - }, - "Excused": "已免除", - "@Excused": { - "description": "Grading status for an assignment marked as excused", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Complete": "完成", - "@Complete": { - "description": "Grading status for an assignment marked as complete", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Incomplete": "未完成", - "@Incomplete": { - "description": "Grading status for an assignment marked as incomplete", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "minus": "減", - "@minus": { - "description": "Screen reader-friendly replacement for the \"-\" character in letter grades like \"A-\"", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "latePenalty": "逾期懲罰 (-{pointsLost})", - "@latePenalty": { - "description": "Text displayed when a late penalty has been applied to the assignment", - "type": "text", - "placeholders_order": [ - "pointsLost" - ], - "placeholders": { - "pointsLost": {} - } - }, - "finalGrade": "最終評分:{grade}", - "@finalGrade": { - "description": "Text that displays the final grade of an assignment", - "type": "text", - "placeholders_order": [ - "grade" - ], - "placeholders": { - "grade": {} - } - }, - "Alert Settings": "提醒設定", - "@Alert Settings": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Alert me when…": "在下列情形時提醒我...", - "@Alert me when…": { - "description": "Header for the screen where the observer chooses the thresholds that will determine when they receive alerts (e.g. when an assignment is graded below 70%)", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Course grade below": "課程評分低於", - "@Course grade below": { - "description": "Label describing the threshold for when the course grade is below a certain percentage", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Course grade above": "課程評分高於", - "@Course grade above": { - "description": "Label describing the threshold for when the course grade is above a certain percentage", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Assignment missing": "缺少作業", - "@Assignment missing": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Assignment grade below": "作業評分低於", - "@Assignment grade below": { - "description": "Label describing the threshold for when an assignment is graded below a certain percentage", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Assignment grade above": "作業評分高於", - "@Assignment grade above": { - "description": "Label describing the threshold for when an assignment is graded above a certain percentage", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Course Announcements": "課程通告", - "@Course Announcements": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Institution Announcements": "機構的告", - "@Institution Announcements": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Never": "永不", - "@Never": { - "description": "Indication that tells the user they will not receive alert notifications of a specific kind", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Grade percentage": "評分百分比", - "@Grade percentage": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading your student's alerts.": "載入您的學生的提醒時發生錯誤。", - "@There was an error loading your student's alerts.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Must be below 100": "必須低於 100", - "@Must be below 100": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "mustBeBelowN": "必須低於 {percentage}", - "@mustBeBelowN": { - "description": "Validation error to the user that they must choose a percentage below 'n'", - "type": "text", - "placeholders_order": [ - "percentage" - ], - "placeholders": { - "percentage": { - "example": 5 - } - } - }, - "mustBeAboveN": "必須高於 {percentage}", - "@mustBeAboveN": { - "description": "Validation error to the user that they must choose a percentage above 'n'", - "type": "text", - "placeholders_order": [ - "percentage" - ], - "placeholders": { - "percentage": { - "example": 5 - } - } - }, - "Select Student Color": "選擇學生顏色", - "@Select Student Color": { - "description": "Title for screen that allows users to assign a color to a specific student", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Electric, blue": "電,藍色", - "@Electric, blue": { - "description": "Name of the Electric (blue) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Plum, Purple": "梅子,紫色", - "@Plum, Purple": { - "description": "Name of the Plum (purple) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Barney, Fuschia": "巴尼,紫紅色", - "@Barney, Fuschia": { - "description": "Name of the Barney (fuschia) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Raspberry, Red": "樹莓,紅色", - "@Raspberry, Red": { - "description": "Name of the Raspberry (red) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Fire, Orange": "火,橙色", - "@Fire, Orange": { - "description": "Name of the Fire (orange) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Shamrock, Green": "三葉草,綠色", - "@Shamrock, Green": { - "description": "Name of the Shamrock (green) color", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "An error occurred while saving your selection. Please try again.": "儲存您的選擇時發生錯誤。請重試。", - "@An error occurred while saving your selection. Please try again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "changeStudentColorLabel": "變更 {studentName} 的顏色", - "@changeStudentColorLabel": { - "description": "Accessibility label for the button that lets users change the color associated with a specific student", - "type": "text", - "placeholders_order": [ - "studentName" - ], - "placeholders": { - "studentName": {} - } - }, - "Teacher": "教師", - "@Teacher": { - "description": "Label for the Teacher enrollment type", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Student": "學生", - "@Student": { - "description": "Label for the Student enrollment type", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "TA": "助教", - "@TA": { - "description": "Label for the Teaching Assistant enrollment type (also known as Teacher Aid or Education Assistant), reduced to a short acronym/initialism if appropriate.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Observer": "觀察者", - "@Observer": { - "description": "Label for the Observer enrollment type", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Use Camera": "使用攝影機", - "@Use Camera": { - "description": "Label for the action item that lets the user capture a photo using the device camera", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Upload File": "上傳檔案", - "@Upload File": { - "description": "Label for the action item that lets the user upload a file from their device", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Choose from Gallery": "從圖片庫中選擇", - "@Choose from Gallery": { - "description": "Label for the action item that lets the user select a photo from their device gallery", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Preparing…": "準備中…", - "@Preparing…": { - "description": "Message shown while a file is being prepared to attach to a message", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Add student with…": "添加學生…", - "@Add student with…": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Add Student": "添加學生", - "@Add Student": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You are not observing any students.": "您未正在觀察任何學生。", - "@You are not observing any students.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error loading your students.": "載入您的學生時發生錯誤。", - "@There was an error loading your students.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Pairing Code": "配對代碼", - "@Pairing Code": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Students can obtain a pairing code through the Canvas website": "學生可以透過 Canvas 網站獲取配對碼", - "@Students can obtain a pairing code through the Canvas website": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Enter the student pairing code provided to you. If the pairing code doesn't work, it may have expired": "輸入已提供給您的學生配對代碼。如果配對代碼無效,可能是已到期", - "@Enter the student pairing code provided to you. If the pairing code doesn't work, it may have expired": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Your code is incorrect or expired.": "您的代碼錯誤或到期。", - "@Your code is incorrect or expired.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Something went wrong trying to create your account, please reach out to your school for assistance.": "嘗試建立您的錯誤時發生錯誤,請聯絡您的學校尋求協助。", - "@Something went wrong trying to create your account, please reach out to your school for assistance.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "QR Code": "QR 碼", - "@QR Code": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Students can create a QR code using the Canvas Student app on their mobile device": "學生可以使用流動裝置上的 Canvas Student 應用程式創建 QR 碼", - "@Students can create a QR code using the Canvas Student app on their mobile device": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Add new student": "添加新學生", - "@Add new student": { - "description": "Semantics label for the FAB on the Manage Students Screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Select": "選擇", - "@Select": { - "description": "Hint text to tell the user to choose one of two options", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I have a Canvas account": "我有 Canvas 帳戶", - "@I have a Canvas account": { - "description": "Option to select for users that have a canvas account", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I don't have a Canvas account": "我沒有 Canvas 帳戶", - "@I don't have a Canvas account": { - "description": "Option to select for users that don't have a canvas account", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Create Account": "建立帳戶", - "@Create Account": { - "description": "Button text for account creation confirmation", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Full Name": "全名", - "@Full Name": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Email Address": "電郵地址", - "@Email Address": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Password": "密碼", - "@Password": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Full Name…": "全名...", - "@Full Name…": { - "description": "hint label for inside form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Email…": "電郵...", - "@Email…": { - "description": "hint label for inside form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Password…": "密碼...", - "@Password…": { - "description": "hint label for inside form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Please enter full name": "請輸入全名", - "@Please enter full name": { - "description": "Error message for form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Please enter an email address": "請輸入電郵地址", - "@Please enter an email address": { - "description": "Error message for form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Please enter a valid email address": "請輸入有效電郵地址", - "@Please enter a valid email address": { - "description": "Error message for form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Password is required": "需要輸入密碼", - "@Password is required": { - "description": "Error message for form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Password must contain at least 8 characters": "密碼必須最少包含 8 個字符", - "@Password must contain at least 8 characters": { - "description": "Error message for form field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "qrCreateAccountTos": "點擊「創建帳戶」,代表您同意{termsOfService},並了解{privacyPolicy}", - "@qrCreateAccountTos": { - "description": "The text show on the account creation screen", - "type": "text", - "placeholders_order": [ - "termsOfService", - "privacyPolicy" - ], - "placeholders": { - "termsOfService": {}, - "privacyPolicy": {} - } - }, - "Terms of Service": "服務條款", - "@Terms of Service": { - "description": "Label for the Canvas Terms of Service agreement. This will be used in the qrCreateAccountTos text and will be highlighted and clickable", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Privacy Policy": "隱私政策", - "@Privacy Policy": { - "description": "Label for the Canvas Privacy Policy agreement. This will be used in the qrCreateAccountTos text and will be highlighted and clickable", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "View the Privacy Policy": "檢視隱私政策", - "@View the Privacy Policy": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Already have an account? ": "已經擁有帳戶? ", - "@Already have an account? ": { - "description": "Part of multiline text span, includes AccountSignIn1-2, in that order", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Sign In": "登入", - "@Sign In": { - "description": "Part of multiline text span, includes AccountSignIn1-2, in that order", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Hide Password": "隱藏密碼", - "@Hide Password": { - "description": "content description for password hide button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Show Password": "顯示密碼", - "@Show Password": { - "description": "content description for password show button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Terms of Service Link": "服務條款連結", - "@Terms of Service Link": { - "description": "content description for terms of service link", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Privacy Policy Link": "隱私政策連結", - "@Privacy Policy Link": { - "description": "content description for privacy policy link", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Event": "活動", - "@Event": { - "description": "Title for the event details screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Date": "日期", - "@Date": { - "description": "Label for the event date", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Location": "位置", - "@Location": { - "description": "Label for the location information", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No Location Specified": "無指定的地點", - "@No Location Specified": { - "description": "Description for events that do not have a location", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "eventTime": "{startAt} - {endAt}", - "@eventTime": { - "description": "The time the event is happening, example: \"2:00 pm - 4:00 pm\"", - "type": "text", - "placeholders_order": [ - "startAt", - "endAt" - ], - "placeholders": { - "startAt": {}, - "endAt": {} - } - }, - "Set a date and time to be notified of this event.": "設定通知此活動的日期和時間。", - "@Set a date and time to be notified of this event.": { - "description": "Description for row to set event reminders", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You will be notified about this event on…": "將在以下時間通知您關於此沽動…", - "@You will be notified about this event on…": { - "description": "Description for when an event reminder is set", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Share Your Love for the App": "分享您對於本應用程式的喜愛", - "@Share Your Love for the App": { - "description": "Label for option to open the app store", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Tell us about your favorite parts of the app": "告訴我們本應用程式最讓您滿意之處", - "@Tell us about your favorite parts of the app": { - "description": "Description for option to open the app store", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Legal": "法律事務", - "@Legal": { - "description": "Label for legal information option", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Privacy policy, terms of use, open source": "隱私政策,使用條款,開放源碼", - "@Privacy policy, terms of use, open source": { - "description": "Description for legal information option", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Idea for Canvas Parent App [Android]": "關於 Canvas Parent 程式 [Android] 的想法", - "@Idea for Canvas Parent App [Android]": { - "description": "The subject for the email to request a feature", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The following information will help us better understand your idea:": "下列資訊能幫我們好好理解您的想法:", - "@The following information will help us better understand your idea:": { - "description": "The header for the users information that is attached to a feature request", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Domain:": "網域:", - "@Domain:": { - "description": "The label for the Canvas domain of the logged in user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "User ID:": "使用者 ID:", - "@User ID:": { - "description": "The label for the Canvas user ID of the logged in user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Email:": "電郵地址:", - "@Email:": { - "description": "The label for the eamil of the logged in user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Locale:": "位置:", - "@Locale:": { - "description": "The label for the locale of the logged in user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Terms of Use": "使用條款", - "@Terms of Use": { - "description": "Label for the terms of use", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Canvas on GitHub": "GitHub 上的 Canvas", - "@Canvas on GitHub": { - "description": "Label for the button that opens the Canvas project on GitHub's website", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was a problem loading the Terms of Use": "載入使用條款時出現問題", - "@There was a problem loading the Terms of Use": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Device": "裝置", - "@Device": { - "description": "Label used for device manufacturer/model in the error report", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "OS Version": "OS 版本", - "@OS Version": { - "description": "Label used for device operating system version in the error report", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Version Number": "版本編號", - "@Version Number": { - "description": "Label used for the app version number in the error report", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Report A Problem": "報告問題", - "@Report A Problem": { - "description": "Title used for generic dialog to report problems", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Subject": "主題", - "@Subject": { - "description": "Label used for Subject text field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "A subject is required.": "主題必填。", - "@A subject is required.": { - "description": "Error shown when the subject field is empty", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "An email address is required.": "電郵地址必填。", - "@An email address is required.": { - "description": "Error shown when the email field is empty", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Description": "描述", - "@Description": { - "description": "Label used for Description text field", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "A description is required.": "描述必填。", - "@A description is required.": { - "description": "Error shown when the description field is empty", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "How is this affecting you?": "問題對您造成什麼影響?", - "@How is this affecting you?": { - "description": "Label used for the dropdown to select how severe the issue is", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "send": "傳送", - "@send": { - "description": "Label used for send button when reporting a problem", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Just a casual question, comment, idea, suggestion…": "只是隨意提問、評論、想法、建議……", - "@Just a casual question, comment, idea, suggestion…": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I need some help but it's not urgent.": "我需要支援,但並不緊迫。", - "@I need some help but it's not urgent.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Something's broken but I can work around it to get what I need done.": "有些地方出現了問題,但我能繞過問題實現我的目的。", - "@Something's broken but I can work around it to get what I need done.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I can't get things done until I hear back from you.": "在收到您的回覆之前,我無法處理。", - "@I can't get things done until I hear back from you.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "EXTREME CRITICAL EMERGENCY!!": "極其重要的緊急情況!!", - "@EXTREME CRITICAL EMERGENCY!!": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Not Graded": "未評分", - "@Not Graded": { - "description": "Description for an assignment has not been graded.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Login flow: Normal": "登入流態:正常", - "@Login flow: Normal": { - "description": "Description for the normal login flow", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Login flow: Canvas": "登入流態:Canvas", - "@Login flow: Canvas": { - "description": "Description for the Canvas login flow", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Login flow: Site Admin": "登入流態:網站管理員", - "@Login flow: Site Admin": { - "description": "Description for the Site Admin login flow", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Login flow: Skip mobile verify": "登入流態:跳過流動認證", - "@Login flow: Skip mobile verify": { - "description": "Description for the login flow that skips domain verification for mobile", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Act As User": "作為使用者", - "@Act As User": { - "description": "Label for the button that allows the user to act (masquerade) as another user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Stop Acting as User": "停止作為使用者", - "@Stop Acting as User": { - "description": "Label for the button that allows the user to stop acting (masquerading) as another user", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "actingAsUser": "您正在作為 {userName}", - "@actingAsUser": { - "description": "Message shown while acting (masquerading) as another user", - "type": "text", - "placeholders_order": [ - "userName" - ], - "placeholders": { - "userName": {} - } - }, - "\"Act as\" is essentially logging in as this user without a password. You will be able to take any action as if you were this user, and from other users' points of views, it will be as if this user performed them. However, audit logs record that you were the one who performed the actions on behalf of this user.": "「作為」本質上是以此使用者身份登錄,沒有密碼。您將能夠進行任何操作,就好像您就是此使用者一樣,並且,其他使用者也會認為是此使用者執行了操作。然而,活動紀錄會記錄事實,即您是代表此使用者執行操作的人。", - "@\"Act as\" is essentially logging in as this user without a password. You will be able to take any action as if you were this user, and from other users' points of views, it will be as if this user performed them. However, audit logs record that you were the one who performed the actions on behalf of this user.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Domain": "網域", - "@Domain": { - "description": "Text field hint for domain url input", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You must enter a valid domain": "您必須輸入有效的網域", - "@You must enter a valid domain": { - "description": "Message displayed for domain input error", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "User ID": "使用者 ID", - "@User ID": { - "description": "Text field hint for user ID input", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You must enter a user id": "您必須輸入使用者 ID", - "@You must enter a user id": { - "description": "Message displayed for user Id input error", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error trying to act as this user. Please check the Domain and User ID and try again.": "嘗試作為此使用者時出現錯誤。請檢查網域及使用者 ID 然後重試。", - "@There was an error trying to act as this user. Please check the Domain and User ID and try again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "endMasqueradeMessage": "您將會停止作為 {userName} 並返回到您的原有帳戶。", - "@endMasqueradeMessage": { - "description": "Confirmation message displayed when the user wants to stop acting (masquerading) as another user", - "type": "text", - "placeholders_order": [ - "userName" - ], - "placeholders": { - "userName": {} - } - }, - "endMasqueradeLogoutMessage": "您將會停止作為 {userName} 並登出。", - "@endMasqueradeLogoutMessage": { - "description": "Confirmation message displayed when the user wants to stop acting (masquerading) as another user and will be logged out.", - "type": "text", - "placeholders_order": [ - "userName" - ], - "placeholders": { - "userName": {} - } - }, - "How are we doing?": "我們表現如何?", - "@How are we doing?": { - "description": "Title for dialog asking user to rate the app out of 5 stars.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Don't show again": "不要再次顯示", - "@Don't show again": { - "description": "Button to prevent the rating dialog from showing again.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "What can we do better?": "我們有何可改進之處?", - "@What can we do better?": { - "description": "Hint text for providing a comment with the rating.", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Send Feedback": "發送回饋", - "@Send Feedback": { - "description": "Button to send rating with feedback", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "ratingDialogEmailSubject": "給 Android 的建議 - Canvas Parent {version}", - "@ratingDialogEmailSubject": { - "description": "The subject for an email to provide feedback for CanvasParent.", - "type": "text", - "placeholders_order": [ - "version" - ], - "placeholders": { - "version": {} - } - }, - "starRating": "{position,plural, =1{{position} 顆星}other{{position}顆星}}", - "@starRating": { - "description": "Accessibility label for the 1 stars to 5 stars rating", - "type": "text", - "placeholders_order": [ - "position" - ], - "placeholders": { - "position": { - "example": 1 - } - } - }, - "Student Pairing": "學生配對", - "@Student Pairing": { - "description": "Title for the screen where users can pair to students using a QR code", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Open Canvas Student": "開啟 Canvas Student", - "@Open Canvas Student": { - "description": "Title for QR pairing tutorial screen instructing users to open the Canvas Student app", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You'll need to open your student's Canvas Student app to continue. Go into Main Menu > Settings > Pair with Observer and scan the QR code you see there.": "您需要開啟學生的 Canvas Student 應用程式以繼續操作。前往主選單 > 設定 > 與觀察者配對,然後掃描該處顯示的 QR 碼。", - "@You'll need to open your student's Canvas Student app to continue. Go into Main Menu > Settings > Pair with Observer and scan the QR code you see there.": { - "description": "Message explaining how QR code pairing works", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Screenshot showing location of pairing QR code generation in the Canvas Student app": "螢幕截圖顯示 Canvas Student 應用程式內產生配對 QR 碼的位置", - "@Screenshot showing location of pairing QR code generation in the Canvas Student app": { - "description": "Content Description for qr pairing tutorial screenshot", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Expired QR Code": "已過期 QR 碼", - "@Expired QR Code": { - "description": "Error title shown when the users scans a QR code that has expired", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The QR code you scanned may have expired. Refresh the code on the student's device and try again.": "您所掃描的 QR 碼可能已經過期。請在學生的裝置上重新載入 QR 碼然後重試。", - "@The QR code you scanned may have expired. Refresh the code on the student's device and try again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "A network error occurred when adding this student. Check your connection and try again.": "添加此學生時發生網路錯誤。請檢查您的連線,然後再試一次。", - "@A network error occurred when adding this student. Check your connection and try again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Invalid QR Code": "無效的 QR 碼", - "@Invalid QR Code": { - "description": "Error title shown when the user scans an invalid QR code", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Incorrect Domain": "錯誤網域", - "@Incorrect Domain": { - "description": "Error title shown when the users scane a QR code for a student that belongs to a different domain", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The student you are trying to add belongs to a different school. Log in or create an account with that school to scan this code.": "您嘗試添加的學生屬於另一所學校。請登入至該學校或在該學校創建帳戶以掃描此 QR 碼。", - "@The student you are trying to add belongs to a different school. Log in or create an account with that school to scan this code.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Camera Permission": "攝影機權限", - "@Camera Permission": { - "description": "Error title shown when the user wans to scan a QR code but has denied the camera permission", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "This will unpair and remove all enrollments for this student from your account.": "此操作將取消配對並從您的帳戶中移除所有此學生的註冊資料。", - "@This will unpair and remove all enrollments for this student from your account.": { - "description": "Confirmation message shown when the user tries to delete a student from their account", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was a problem removing this student from your account. Please check your connection and try again.": "從帳戶中移除此學生時發生問題。請檢查您的連接然後重試。", - "@There was a problem removing this student from your account. Please check your connection and try again.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Cancel": "取消", - "@Cancel": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "next": "下一個", - "@next": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "ok": "確定", - "@ok": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Yes": "是", - "@Yes": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No": "否", - "@No": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Retry": "重試", - "@Retry": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Delete": "刪除", - "@Delete": { - "description": "Label used for general delete/remove actions", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Done": "已完成", - "@Done": { - "description": "Label for general done/finished actions", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Refresh": "重新整理", - "@Refresh": { - "description": "Label for button to refresh data from the web", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "View Description": "檢視描述", - "@View Description": { - "description": "Button to view the description for an event or assignment", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "expanded": "展開", - "@expanded": { - "description": "Description for the accessibility reader for list groups that are expanded", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "collapsed": "收起", - "@collapsed": { - "description": "Description for the accessibility reader for list groups that are expanded", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "An unexpected error occurred": "出現意外錯誤", - "@An unexpected error occurred": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "No description": "沒有說明", - "@No description": { - "description": "Message used when the assignment has no description", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Launch External Tool": "啟動外部工具", - "@Launch External Tool": { - "description": "Button text added to webviews to let users open external tools in their browser", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Interactions on this page are limited by your institution.": "本頁面的互動受您所在機構的限制。", - "@Interactions on this page are limited by your institution.": { - "description": "Message describing how the webview has limited access due to an instution setting", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "dateAtTime": "日期 {date},時間 {time}", - "@dateAtTime": { - "description": "The string to format dates", - "type": "text", - "placeholders_order": [ - "date", - "time" - ], - "placeholders": { - "date": {}, - "time": {} - } - }, - "dueDateAtTime": "截止於 {date} 的 {time}", - "@dueDateAtTime": { - "description": "The string to format due dates", - "type": "text", - "placeholders_order": [ - "date", - "time" - ], - "placeholders": { - "date": {}, - "time": {} - } - }, - "No Due Date": "無截止日期", - "@No Due Date": { - "description": "Label for assignments that do not have a due date", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Filter": "篩選器", - "@Filter": { - "description": "Label for buttons to filter what items are visible", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "unread": "未讀", - "@unread": { - "description": "Label for things that are marked as unread", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "unreadCount": "{count} 則未讀", - "@unreadCount": { - "description": "Formatted string for when there are a number of unread items", - "type": "text", - "placeholders_order": [ - "count" - ], - "placeholders": { - "count": {} - } - }, - "badgeNumberPlus": "{count}+", - "@badgeNumberPlus": { - "description": "Formatted string for when too many items are being notified in a badge, generally something like: 99+", - "type": "text", - "placeholders_order": [ - "count" - ], - "placeholders": { - "count": {} - } - }, - "There was an error loading this announcement": "載入此通告時發生錯誤", - "@There was an error loading this announcement": { - "description": "Message shown when an announcement detail screen fails to load", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Network error": "網路錯誤", - "@Network error": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Under Construction": "建構中", - "@Under Construction": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "We are currently building this feature for your viewing pleasure.": "我們目前正在建立讓您開心檢視的功能。", - "@We are currently building this feature for your viewing pleasure.": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Request Login Help Button": "請求登入支援按鈕", - "@Request Login Help Button": { - "description": "Accessibility hint for button that opens help dialog for a login help request", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Request Login Help": "請求登入支援", - "@Request Login Help": { - "description": "Title of help dialog for a login help request", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I'm having trouble logging in": "我登入時發生問題", - "@I'm having trouble logging in": { - "description": "Subject of help dialog for a login help request", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "An error occurred when trying to display this link": "嘗試顯示此連結時出現錯誤", - "@An error occurred when trying to display this link": { - "description": "Error message shown when a link can't be opened", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "We are unable to display this link, it may belong to an institution you currently aren't logged in to.": "我們無法顯示此連結,連結可能屬於您現在尚未登入的機構。", - "@We are unable to display this link, it may belong to an institution you currently aren't logged in to.": { - "description": "Description for error page shown when clicking a link", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Link Error": "連結錯誤", - "@Link Error": { - "description": "Title for error page shown when clicking a link", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Open In Browser": "在瀏覽器中打開", - "@Open In Browser": { - "description": "Text for button to open a link in the browswer", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "You'll find the QR code on the web in your account profile. Click 'QR for Mobile Login' in the list.": "您可以在您的網上帳戶個人檔案找到這個 QR 碼。點擊列表內的「流動登入 QR 碼」。", - "@You'll find the QR code on the web in your account profile. Click 'QR for Mobile Login' in the list.": { - "description": "Text for qr login tutorial screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Locate QR Code": "尋找 QR 碼", - "@Locate QR Code": { - "description": "Text for qr login button", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Please scan a QR code generated by Canvas": "請掃描由 Canvas 產生的 QR 碼", - "@Please scan a QR code generated by Canvas": { - "description": "Text for qr login error with incorrect qr code", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "There was an error logging in. Please generate another QR Code and try again.": "登入時出現錯誤。請產生另一個 QR 碼然後重試。", - "@There was an error logging in. Please generate another QR Code and try again.": { - "description": "Text for qr login error", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Screenshot showing location of QR code generation in browser": "瀏覽器內的螢幕截圖顯示產生 QR 碼的位置", - "@Screenshot showing location of QR code generation in browser": { - "description": "Content Description for qr login tutorial screenshot", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "QR scanning requires camera access": "QR 碼掃描需要攝影機存取權限", - "@QR scanning requires camera access": { - "description": "placeholder for camera error for QR code scan", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "The linked item is no longer available": "連結的項目不再可用", - "@The linked item is no longer available": { - "description": "error message when the alert could no be opened", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Message sent": "訊息已發送", - "@Message sent": { - "description": "confirmation message on the screen when the user succesfully sends a message", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Acceptable Use Policy": "可接受使用政策", - "@Acceptable Use Policy": { - "description": "title for the acceptable use policy screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Submit": "提交", - "@Submit": { - "description": "submit button title for acceptable use policy screen", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Either you're a new user or the Acceptable Use Policy has changed since you last agreed to it. Please agree to the Acceptable Use Policy before you continue.": "無論您是新的使用者,或是自上次同意以來,「可接受使用政策」都已經變更。請在您繼續使用前同意「可接受使用政策」。", - "@Either you're a new user or the Acceptable Use Policy has changed since you last agreed to it. Please agree to the Acceptable Use Policy before you continue.": { - "description": "acceptable use policy screen description", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "I agree to the Acceptable Use Policy.": "您必須同意「可接受使用政策」。", - "@I agree to the Acceptable Use Policy.": { - "description": "acceptable use policy switch title", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "About": "關於", - "@About": { - "description": "Title for about menu item in settings", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "App": "應用程式", - "@App": { - "description": "Title for App field on about page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Login ID": "登入 ID", - "@Login ID": { - "description": "Title for Login ID field on about page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Email": "電郵", - "@Email": { - "description": "Title for Email field on about page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "Version": "版本", - "@Version": { - "description": "Title for Version field on about page", - "type": "text", - "placeholders_order": [], - "placeholders": {} - } -} \ No newline at end of file diff --git a/apps/flutter_parent/lib/main.dart b/apps/flutter_parent/lib/main.dart deleted file mode 100644 index 1ee693d05a..0000000000 --- a/apps/flutter_parent/lib/main.dart +++ /dev/null @@ -1,74 +0,0 @@ -// Copyright (C) 2019 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'dart:async'; -import 'dart:io'; -import 'dart:isolate'; -import 'dart:ui'; - -import 'package:device_info_plus/device_info_plus.dart'; -import 'package:firebase_core/firebase_core.dart'; -import 'package:firebase_crashlytics/firebase_crashlytics.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_local_notifications/flutter_local_notifications.dart'; -import 'package:flutter_parent/network/utils/analytics.dart'; -import 'package:flutter_parent/network/utils/api_prefs.dart'; -import 'package:flutter_parent/parent_app.dart'; -import 'package:flutter_parent/router/panda_router.dart'; -import 'package:flutter_parent/utils/crash_utils.dart'; -import 'package:flutter_parent/utils/db/db_util.dart'; -import 'package:flutter_parent/utils/design/theme_prefs.dart'; -import 'package:flutter_parent/utils/notification_util.dart'; -import 'package:flutter_parent/utils/old_app_migration.dart'; -import 'package:flutter_parent/utils/remote_config_utils.dart'; -import 'package:flutter_parent/utils/service_locator.dart'; -import 'package:flutter_downloader/flutter_downloader.dart'; - -void main() async { - await WidgetsFlutterBinding.ensureInitialized(); - await Firebase.initializeApp(); - - setupLocator(); - runZonedGuarded>(() async { - - await ApiPrefs.init(); - await ThemePrefs.init(); - await RemoteConfigUtils.initialize(); - await CrashUtils.init(); - await FlutterDownloader.initialize(); - await DbUtil.init(); - - PandaRouter.init(); - - await FlutterDownloader.registerCallback(downloadCallback); - - // This completer waits for the app to be built before allowing the notificationUtil to handle notifications - final Completer _appCompleter = Completer(); - NotificationUtil.init(_appCompleter); - - await locator().performMigrationIfNecessary(); // ApiPrefs must be initialized before calling this - - // Set environment properties for analytics. No need to await this. - locator().setEnvironmentProperties(); - - runApp(ParentApp(_appCompleter)); - }, FirebaseCrashlytics.instance.recordError); -} - -@pragma('vm:entry-point') -void downloadCallback(String id, int status, int progress) { - final SendPort? send = - IsolateNameServer.lookupPortByName('downloader_send_port'); - send?.send([id, status, progress]); -} diff --git a/apps/flutter_parent/lib/models/account_creation_models/create_account_post_body.dart b/apps/flutter_parent/lib/models/account_creation_models/create_account_post_body.dart deleted file mode 100644 index 94a0ef2222..0000000000 --- a/apps/flutter_parent/lib/models/account_creation_models/create_account_post_body.dart +++ /dev/null @@ -1,39 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:built_value/built_value.dart'; -import 'package:built_value/serializer.dart'; -import 'package:flutter_parent/models/account_creation_models/post_pairing_code.dart'; -import 'package:flutter_parent/models/account_creation_models/post_pseudonym.dart'; -import 'package:flutter_parent/models/account_creation_models/post_user.dart'; - -part 'create_account_post_body.g.dart'; - -/// To have this built_value be generated, run this command from the project root: -/// flutter packages pub run build_runner build --delete-conflicting-outputs -abstract class CreateAccountPostBody implements Built { - @BuiltValueSerializer(serializeNulls: false) // Add this line to get nulls to serialize when we convert to JSON - static Serializer get serializer => _$createAccountPostBodySerializer; - - CreateAccountPostBody._(); - - factory CreateAccountPostBody([void Function(CreateAccountPostBodyBuilder) updates]) = _$CreateAccountPostBody; - - PostPseudonym get pseudonym; - - @BuiltValueField(wireName: 'pairing_code') - PostPairingCode get pairingCode; - - PostUser get user; -} diff --git a/apps/flutter_parent/lib/models/account_creation_models/create_account_post_body.g.dart b/apps/flutter_parent/lib/models/account_creation_models/create_account_post_body.g.dart deleted file mode 100644 index d20d530d70..0000000000 --- a/apps/flutter_parent/lib/models/account_creation_models/create_account_post_body.g.dart +++ /dev/null @@ -1,209 +0,0 @@ -// GENERATED CODE - DO NOT MODIFY BY HAND - -part of 'create_account_post_body.dart'; - -// ************************************************************************** -// BuiltValueGenerator -// ************************************************************************** - -Serializer _$createAccountPostBodySerializer = - new _$CreateAccountPostBodySerializer(); - -class _$CreateAccountPostBodySerializer - implements StructuredSerializer { - @override - final Iterable types = const [ - CreateAccountPostBody, - _$CreateAccountPostBody - ]; - @override - final String wireName = 'CreateAccountPostBody'; - - @override - Iterable serialize( - Serializers serializers, CreateAccountPostBody object, - {FullType specifiedType = FullType.unspecified}) { - final result = [ - 'pseudonym', - serializers.serialize(object.pseudonym, - specifiedType: const FullType(PostPseudonym)), - 'pairing_code', - serializers.serialize(object.pairingCode, - specifiedType: const FullType(PostPairingCode)), - 'user', - serializers.serialize(object.user, - specifiedType: const FullType(PostUser)), - ]; - - return result; - } - - @override - CreateAccountPostBody deserialize( - Serializers serializers, Iterable serialized, - {FullType specifiedType = FullType.unspecified}) { - final result = new CreateAccountPostBodyBuilder(); - - final iterator = serialized.iterator; - while (iterator.moveNext()) { - final key = iterator.current! as String; - iterator.moveNext(); - final Object? value = iterator.current; - switch (key) { - case 'pseudonym': - result.pseudonym.replace(serializers.deserialize(value, - specifiedType: const FullType(PostPseudonym))! as PostPseudonym); - break; - case 'pairing_code': - result.pairingCode.replace(serializers.deserialize(value, - specifiedType: const FullType(PostPairingCode))! - as PostPairingCode); - break; - case 'user': - result.user.replace(serializers.deserialize(value, - specifiedType: const FullType(PostUser))! as PostUser); - break; - } - } - - return result.build(); - } -} - -class _$CreateAccountPostBody extends CreateAccountPostBody { - @override - final PostPseudonym pseudonym; - @override - final PostPairingCode pairingCode; - @override - final PostUser user; - - factory _$CreateAccountPostBody( - [void Function(CreateAccountPostBodyBuilder)? updates]) => - (new CreateAccountPostBodyBuilder()..update(updates))._build(); - - _$CreateAccountPostBody._( - {required this.pseudonym, required this.pairingCode, required this.user}) - : super._() { - BuiltValueNullFieldError.checkNotNull( - pseudonym, r'CreateAccountPostBody', 'pseudonym'); - BuiltValueNullFieldError.checkNotNull( - pairingCode, r'CreateAccountPostBody', 'pairingCode'); - BuiltValueNullFieldError.checkNotNull( - user, r'CreateAccountPostBody', 'user'); - } - - @override - CreateAccountPostBody rebuild( - void Function(CreateAccountPostBodyBuilder) updates) => - (toBuilder()..update(updates)).build(); - - @override - CreateAccountPostBodyBuilder toBuilder() => - new CreateAccountPostBodyBuilder()..replace(this); - - @override - bool operator ==(Object other) { - if (identical(other, this)) return true; - return other is CreateAccountPostBody && - pseudonym == other.pseudonym && - pairingCode == other.pairingCode && - user == other.user; - } - - @override - int get hashCode { - var _$hash = 0; - _$hash = $jc(_$hash, pseudonym.hashCode); - _$hash = $jc(_$hash, pairingCode.hashCode); - _$hash = $jc(_$hash, user.hashCode); - _$hash = $jf(_$hash); - return _$hash; - } - - @override - String toString() { - return (newBuiltValueToStringHelper(r'CreateAccountPostBody') - ..add('pseudonym', pseudonym) - ..add('pairingCode', pairingCode) - ..add('user', user)) - .toString(); - } -} - -class CreateAccountPostBodyBuilder - implements Builder { - _$CreateAccountPostBody? _$v; - - PostPseudonymBuilder? _pseudonym; - PostPseudonymBuilder get pseudonym => - _$this._pseudonym ??= new PostPseudonymBuilder(); - set pseudonym(PostPseudonymBuilder? pseudonym) => - _$this._pseudonym = pseudonym; - - PostPairingCodeBuilder? _pairingCode; - PostPairingCodeBuilder get pairingCode => - _$this._pairingCode ??= new PostPairingCodeBuilder(); - set pairingCode(PostPairingCodeBuilder? pairingCode) => - _$this._pairingCode = pairingCode; - - PostUserBuilder? _user; - PostUserBuilder get user => _$this._user ??= new PostUserBuilder(); - set user(PostUserBuilder? user) => _$this._user = user; - - CreateAccountPostBodyBuilder(); - - CreateAccountPostBodyBuilder get _$this { - final $v = _$v; - if ($v != null) { - _pseudonym = $v.pseudonym.toBuilder(); - _pairingCode = $v.pairingCode.toBuilder(); - _user = $v.user.toBuilder(); - _$v = null; - } - return this; - } - - @override - void replace(CreateAccountPostBody other) { - ArgumentError.checkNotNull(other, 'other'); - _$v = other as _$CreateAccountPostBody; - } - - @override - void update(void Function(CreateAccountPostBodyBuilder)? updates) { - if (updates != null) updates(this); - } - - @override - CreateAccountPostBody build() => _build(); - - _$CreateAccountPostBody _build() { - _$CreateAccountPostBody _$result; - try { - _$result = _$v ?? - new _$CreateAccountPostBody._( - pseudonym: pseudonym.build(), - pairingCode: pairingCode.build(), - user: user.build()); - } catch (_) { - late String _$failedField; - try { - _$failedField = 'pseudonym'; - pseudonym.build(); - _$failedField = 'pairingCode'; - pairingCode.build(); - _$failedField = 'user'; - user.build(); - } catch (e) { - throw new BuiltValueNestedFieldError( - r'CreateAccountPostBody', _$failedField, e.toString()); - } - rethrow; - } - replace(_$result); - return _$result; - } -} - -// ignore_for_file: deprecated_member_use_from_same_package,type=lint diff --git a/apps/flutter_parent/lib/models/account_creation_models/post_pairing_code.dart b/apps/flutter_parent/lib/models/account_creation_models/post_pairing_code.dart deleted file mode 100644 index 28599e6a60..0000000000 --- a/apps/flutter_parent/lib/models/account_creation_models/post_pairing_code.dart +++ /dev/null @@ -1,31 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:built_value/built_value.dart'; -import 'package:built_value/serializer.dart'; - -part 'post_pairing_code.g.dart'; - -/// To have this built_value be generated, run this command from the project root: -/// flutter packages pub run build_runner build --delete-conflicting-outputs -abstract class PostPairingCode implements Built { - @BuiltValueSerializer(serializeNulls: false) // Add this line to get nulls to serialize when we convert to JSON - static Serializer get serializer => _$postPairingCodeSerializer; - - PostPairingCode._(); - - factory PostPairingCode([void Function(PostPairingCodeBuilder) updates]) = _$PostPairingCode; - - String get code; -} diff --git a/apps/flutter_parent/lib/models/account_creation_models/post_pairing_code.g.dart b/apps/flutter_parent/lib/models/account_creation_models/post_pairing_code.g.dart deleted file mode 100644 index 9aedcfa018..0000000000 --- a/apps/flutter_parent/lib/models/account_creation_models/post_pairing_code.g.dart +++ /dev/null @@ -1,136 +0,0 @@ -// GENERATED CODE - DO NOT MODIFY BY HAND - -part of 'post_pairing_code.dart'; - -// ************************************************************************** -// BuiltValueGenerator -// ************************************************************************** - -Serializer _$postPairingCodeSerializer = - new _$PostPairingCodeSerializer(); - -class _$PostPairingCodeSerializer - implements StructuredSerializer { - @override - final Iterable types = const [PostPairingCode, _$PostPairingCode]; - @override - final String wireName = 'PostPairingCode'; - - @override - Iterable serialize(Serializers serializers, PostPairingCode object, - {FullType specifiedType = FullType.unspecified}) { - final result = [ - 'code', - serializers.serialize(object.code, specifiedType: const FullType(String)), - ]; - - return result; - } - - @override - PostPairingCode deserialize( - Serializers serializers, Iterable serialized, - {FullType specifiedType = FullType.unspecified}) { - final result = new PostPairingCodeBuilder(); - - final iterator = serialized.iterator; - while (iterator.moveNext()) { - final key = iterator.current! as String; - iterator.moveNext(); - final Object? value = iterator.current; - switch (key) { - case 'code': - result.code = serializers.deserialize(value, - specifiedType: const FullType(String))! as String; - break; - } - } - - return result.build(); - } -} - -class _$PostPairingCode extends PostPairingCode { - @override - final String code; - - factory _$PostPairingCode([void Function(PostPairingCodeBuilder)? updates]) => - (new PostPairingCodeBuilder()..update(updates))._build(); - - _$PostPairingCode._({required this.code}) : super._() { - BuiltValueNullFieldError.checkNotNull(code, r'PostPairingCode', 'code'); - } - - @override - PostPairingCode rebuild(void Function(PostPairingCodeBuilder) updates) => - (toBuilder()..update(updates)).build(); - - @override - PostPairingCodeBuilder toBuilder() => - new PostPairingCodeBuilder()..replace(this); - - @override - bool operator ==(Object other) { - if (identical(other, this)) return true; - return other is PostPairingCode && code == other.code; - } - - @override - int get hashCode { - var _$hash = 0; - _$hash = $jc(_$hash, code.hashCode); - _$hash = $jf(_$hash); - return _$hash; - } - - @override - String toString() { - return (newBuiltValueToStringHelper(r'PostPairingCode')..add('code', code)) - .toString(); - } -} - -class PostPairingCodeBuilder - implements Builder { - _$PostPairingCode? _$v; - - String? _code; - String? get code => _$this._code; - set code(String? code) => _$this._code = code; - - PostPairingCodeBuilder(); - - PostPairingCodeBuilder get _$this { - final $v = _$v; - if ($v != null) { - _code = $v.code; - _$v = null; - } - return this; - } - - @override - void replace(PostPairingCode other) { - ArgumentError.checkNotNull(other, 'other'); - _$v = other as _$PostPairingCode; - } - - @override - void update(void Function(PostPairingCodeBuilder)? updates) { - if (updates != null) updates(this); - } - - @override - PostPairingCode build() => _build(); - - _$PostPairingCode _build() { - final _$result = _$v ?? - new _$PostPairingCode._( - code: BuiltValueNullFieldError.checkNotNull( - code, r'PostPairingCode', 'code')); - replace(_$result); - return _$result; - } -} - -// ignore_for_file: deprecated_member_use_from_same_package,type=lint diff --git a/apps/flutter_parent/lib/models/account_creation_models/post_pseudonym.dart b/apps/flutter_parent/lib/models/account_creation_models/post_pseudonym.dart deleted file mode 100644 index cf76fcb90d..0000000000 --- a/apps/flutter_parent/lib/models/account_creation_models/post_pseudonym.dart +++ /dev/null @@ -1,34 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:built_value/built_value.dart'; -import 'package:built_value/serializer.dart'; - -part 'post_pseudonym.g.dart'; - -/// To have this built_value be generated, run this command from the project root: -/// flutter packages pub run build_runner build --delete-conflicting-outputs -abstract class PostPseudonym implements Built { - @BuiltValueSerializer(serializeNulls: false) // Add this line to get nulls to serialize when we convert to JSON - static Serializer get serializer => _$postPseudonymSerializer; - - PostPseudonym._(); - - factory PostPseudonym([void Function(PostPseudonymBuilder) updates]) = _$PostPseudonym; - - @BuiltValueField(wireName: 'unique_id') - String get uniqueId; - - String get password; -} diff --git a/apps/flutter_parent/lib/models/account_creation_models/post_pseudonym.g.dart b/apps/flutter_parent/lib/models/account_creation_models/post_pseudonym.g.dart deleted file mode 100644 index a4602ac397..0000000000 --- a/apps/flutter_parent/lib/models/account_creation_models/post_pseudonym.g.dart +++ /dev/null @@ -1,160 +0,0 @@ -// GENERATED CODE - DO NOT MODIFY BY HAND - -part of 'post_pseudonym.dart'; - -// ************************************************************************** -// BuiltValueGenerator -// ************************************************************************** - -Serializer _$postPseudonymSerializer = - new _$PostPseudonymSerializer(); - -class _$PostPseudonymSerializer implements StructuredSerializer { - @override - final Iterable types = const [PostPseudonym, _$PostPseudonym]; - @override - final String wireName = 'PostPseudonym'; - - @override - Iterable serialize(Serializers serializers, PostPseudonym object, - {FullType specifiedType = FullType.unspecified}) { - final result = [ - 'unique_id', - serializers.serialize(object.uniqueId, - specifiedType: const FullType(String)), - 'password', - serializers.serialize(object.password, - specifiedType: const FullType(String)), - ]; - - return result; - } - - @override - PostPseudonym deserialize( - Serializers serializers, Iterable serialized, - {FullType specifiedType = FullType.unspecified}) { - final result = new PostPseudonymBuilder(); - - final iterator = serialized.iterator; - while (iterator.moveNext()) { - final key = iterator.current! as String; - iterator.moveNext(); - final Object? value = iterator.current; - switch (key) { - case 'unique_id': - result.uniqueId = serializers.deserialize(value, - specifiedType: const FullType(String))! as String; - break; - case 'password': - result.password = serializers.deserialize(value, - specifiedType: const FullType(String))! as String; - break; - } - } - - return result.build(); - } -} - -class _$PostPseudonym extends PostPseudonym { - @override - final String uniqueId; - @override - final String password; - - factory _$PostPseudonym([void Function(PostPseudonymBuilder)? updates]) => - (new PostPseudonymBuilder()..update(updates))._build(); - - _$PostPseudonym._({required this.uniqueId, required this.password}) - : super._() { - BuiltValueNullFieldError.checkNotNull( - uniqueId, r'PostPseudonym', 'uniqueId'); - BuiltValueNullFieldError.checkNotNull( - password, r'PostPseudonym', 'password'); - } - - @override - PostPseudonym rebuild(void Function(PostPseudonymBuilder) updates) => - (toBuilder()..update(updates)).build(); - - @override - PostPseudonymBuilder toBuilder() => new PostPseudonymBuilder()..replace(this); - - @override - bool operator ==(Object other) { - if (identical(other, this)) return true; - return other is PostPseudonym && - uniqueId == other.uniqueId && - password == other.password; - } - - @override - int get hashCode { - var _$hash = 0; - _$hash = $jc(_$hash, uniqueId.hashCode); - _$hash = $jc(_$hash, password.hashCode); - _$hash = $jf(_$hash); - return _$hash; - } - - @override - String toString() { - return (newBuiltValueToStringHelper(r'PostPseudonym') - ..add('uniqueId', uniqueId) - ..add('password', password)) - .toString(); - } -} - -class PostPseudonymBuilder - implements Builder { - _$PostPseudonym? _$v; - - String? _uniqueId; - String? get uniqueId => _$this._uniqueId; - set uniqueId(String? uniqueId) => _$this._uniqueId = uniqueId; - - String? _password; - String? get password => _$this._password; - set password(String? password) => _$this._password = password; - - PostPseudonymBuilder(); - - PostPseudonymBuilder get _$this { - final $v = _$v; - if ($v != null) { - _uniqueId = $v.uniqueId; - _password = $v.password; - _$v = null; - } - return this; - } - - @override - void replace(PostPseudonym other) { - ArgumentError.checkNotNull(other, 'other'); - _$v = other as _$PostPseudonym; - } - - @override - void update(void Function(PostPseudonymBuilder)? updates) { - if (updates != null) updates(this); - } - - @override - PostPseudonym build() => _build(); - - _$PostPseudonym _build() { - final _$result = _$v ?? - new _$PostPseudonym._( - uniqueId: BuiltValueNullFieldError.checkNotNull( - uniqueId, r'PostPseudonym', 'uniqueId'), - password: BuiltValueNullFieldError.checkNotNull( - password, r'PostPseudonym', 'password')); - replace(_$result); - return _$result; - } -} - -// ignore_for_file: deprecated_member_use_from_same_package,type=lint diff --git a/apps/flutter_parent/lib/models/account_creation_models/post_user.dart b/apps/flutter_parent/lib/models/account_creation_models/post_user.dart deleted file mode 100644 index 168844971b..0000000000 --- a/apps/flutter_parent/lib/models/account_creation_models/post_user.dart +++ /dev/null @@ -1,37 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:built_value/built_value.dart'; -import 'package:built_value/serializer.dart'; - -part 'post_user.g.dart'; - -/// To have this built_value be generated, run this command from the project root: -/// flutter packages pub run build_runner build --delete-conflicting-outputs -abstract class PostUser implements Built { - @BuiltValueSerializer(serializeNulls: false) // Add this line to get nulls to serialize when we convert to JSON - static Serializer get serializer => _$postUserSerializer; - - PostUser._(); - - factory PostUser([void Function(PostUserBuilder) updates]) = _$PostUser; - - String get name; - - @BuiltValueField(wireName: 'initial_enrollment_type') - String get initialEnrollmentType; - - @BuiltValueField(wireName: 'terms_of_use') - bool get termsOfUse; -} diff --git a/apps/flutter_parent/lib/models/account_creation_models/post_user.g.dart b/apps/flutter_parent/lib/models/account_creation_models/post_user.g.dart deleted file mode 100644 index dbad749267..0000000000 --- a/apps/flutter_parent/lib/models/account_creation_models/post_user.g.dart +++ /dev/null @@ -1,180 +0,0 @@ -// GENERATED CODE - DO NOT MODIFY BY HAND - -part of 'post_user.dart'; - -// ************************************************************************** -// BuiltValueGenerator -// ************************************************************************** - -Serializer _$postUserSerializer = new _$PostUserSerializer(); - -class _$PostUserSerializer implements StructuredSerializer { - @override - final Iterable types = const [PostUser, _$PostUser]; - @override - final String wireName = 'PostUser'; - - @override - Iterable serialize(Serializers serializers, PostUser object, - {FullType specifiedType = FullType.unspecified}) { - final result = [ - 'name', - serializers.serialize(object.name, specifiedType: const FullType(String)), - 'initial_enrollment_type', - serializers.serialize(object.initialEnrollmentType, - specifiedType: const FullType(String)), - 'terms_of_use', - serializers.serialize(object.termsOfUse, - specifiedType: const FullType(bool)), - ]; - - return result; - } - - @override - PostUser deserialize(Serializers serializers, Iterable serialized, - {FullType specifiedType = FullType.unspecified}) { - final result = new PostUserBuilder(); - - final iterator = serialized.iterator; - while (iterator.moveNext()) { - final key = iterator.current! as String; - iterator.moveNext(); - final Object? value = iterator.current; - switch (key) { - case 'name': - result.name = serializers.deserialize(value, - specifiedType: const FullType(String))! as String; - break; - case 'initial_enrollment_type': - result.initialEnrollmentType = serializers.deserialize(value, - specifiedType: const FullType(String))! as String; - break; - case 'terms_of_use': - result.termsOfUse = serializers.deserialize(value, - specifiedType: const FullType(bool))! as bool; - break; - } - } - - return result.build(); - } -} - -class _$PostUser extends PostUser { - @override - final String name; - @override - final String initialEnrollmentType; - @override - final bool termsOfUse; - - factory _$PostUser([void Function(PostUserBuilder)? updates]) => - (new PostUserBuilder()..update(updates))._build(); - - _$PostUser._( - {required this.name, - required this.initialEnrollmentType, - required this.termsOfUse}) - : super._() { - BuiltValueNullFieldError.checkNotNull(name, r'PostUser', 'name'); - BuiltValueNullFieldError.checkNotNull( - initialEnrollmentType, r'PostUser', 'initialEnrollmentType'); - BuiltValueNullFieldError.checkNotNull( - termsOfUse, r'PostUser', 'termsOfUse'); - } - - @override - PostUser rebuild(void Function(PostUserBuilder) updates) => - (toBuilder()..update(updates)).build(); - - @override - PostUserBuilder toBuilder() => new PostUserBuilder()..replace(this); - - @override - bool operator ==(Object other) { - if (identical(other, this)) return true; - return other is PostUser && - name == other.name && - initialEnrollmentType == other.initialEnrollmentType && - termsOfUse == other.termsOfUse; - } - - @override - int get hashCode { - var _$hash = 0; - _$hash = $jc(_$hash, name.hashCode); - _$hash = $jc(_$hash, initialEnrollmentType.hashCode); - _$hash = $jc(_$hash, termsOfUse.hashCode); - _$hash = $jf(_$hash); - return _$hash; - } - - @override - String toString() { - return (newBuiltValueToStringHelper(r'PostUser') - ..add('name', name) - ..add('initialEnrollmentType', initialEnrollmentType) - ..add('termsOfUse', termsOfUse)) - .toString(); - } -} - -class PostUserBuilder implements Builder { - _$PostUser? _$v; - - String? _name; - String? get name => _$this._name; - set name(String? name) => _$this._name = name; - - String? _initialEnrollmentType; - String? get initialEnrollmentType => _$this._initialEnrollmentType; - set initialEnrollmentType(String? initialEnrollmentType) => - _$this._initialEnrollmentType = initialEnrollmentType; - - bool? _termsOfUse; - bool? get termsOfUse => _$this._termsOfUse; - set termsOfUse(bool? termsOfUse) => _$this._termsOfUse = termsOfUse; - - PostUserBuilder(); - - PostUserBuilder get _$this { - final $v = _$v; - if ($v != null) { - _name = $v.name; - _initialEnrollmentType = $v.initialEnrollmentType; - _termsOfUse = $v.termsOfUse; - _$v = null; - } - return this; - } - - @override - void replace(PostUser other) { - ArgumentError.checkNotNull(other, 'other'); - _$v = other as _$PostUser; - } - - @override - void update(void Function(PostUserBuilder)? updates) { - if (updates != null) updates(this); - } - - @override - PostUser build() => _build(); - - _$PostUser _build() { - final _$result = _$v ?? - new _$PostUser._( - name: BuiltValueNullFieldError.checkNotNull( - name, r'PostUser', 'name'), - initialEnrollmentType: BuiltValueNullFieldError.checkNotNull( - initialEnrollmentType, r'PostUser', 'initialEnrollmentType'), - termsOfUse: BuiltValueNullFieldError.checkNotNull( - termsOfUse, r'PostUser', 'termsOfUse')); - replace(_$result); - return _$result; - } -} - -// ignore_for_file: deprecated_member_use_from_same_package,type=lint diff --git a/apps/flutter_parent/lib/models/account_notification.dart b/apps/flutter_parent/lib/models/account_notification.dart deleted file mode 100644 index 55f7ffcc15..0000000000 --- a/apps/flutter_parent/lib/models/account_notification.dart +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Copyright (C) 2020 - present Instructure, Inc. - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, version 3 of the License. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -import 'package:built_value/built_value.dart'; -import 'package:built_value/serializer.dart'; - -part 'account_notification.g.dart'; - -/// To have this built_value be generated, run this command from the project root: -/// flutter packages pub run build_runner build --delete-conflicting-outputs -abstract class AccountNotification implements Built { - @BuiltValueSerializer(serializeNulls: true) // Add this line to get nulls to serialize when we convert to JSON - static Serializer get serializer => _$accountNotificationSerializer; - - AccountNotification._(); - - factory AccountNotification([void Function(AccountNotificationBuilder) updates]) = _$AccountNotification; - - String get id; - - String get message; - - String get subject; - - @BuiltValueField(wireName: 'start_at') - String get startAt; - - static void _initializeBuilder(AccountNotificationBuilder b) => b - ..id = '' - ..message = '' - ..subject = '' - ..startAt = ''; -} diff --git a/apps/flutter_parent/lib/models/account_notification.g.dart b/apps/flutter_parent/lib/models/account_notification.g.dart deleted file mode 100644 index 52f81819c1..0000000000 --- a/apps/flutter_parent/lib/models/account_notification.g.dart +++ /dev/null @@ -1,214 +0,0 @@ -// GENERATED CODE - DO NOT MODIFY BY HAND - -part of 'account_notification.dart'; - -// ************************************************************************** -// BuiltValueGenerator -// ************************************************************************** - -Serializer _$accountNotificationSerializer = - new _$AccountNotificationSerializer(); - -class _$AccountNotificationSerializer - implements StructuredSerializer { - @override - final Iterable types = const [ - AccountNotification, - _$AccountNotification - ]; - @override - final String wireName = 'AccountNotification'; - - @override - Iterable serialize( - Serializers serializers, AccountNotification object, - {FullType specifiedType = FullType.unspecified}) { - final result = [ - 'id', - serializers.serialize(object.id, specifiedType: const FullType(String)), - 'message', - serializers.serialize(object.message, - specifiedType: const FullType(String)), - 'subject', - serializers.serialize(object.subject, - specifiedType: const FullType(String)), - 'start_at', - serializers.serialize(object.startAt, - specifiedType: const FullType(String)), - ]; - - return result; - } - - @override - AccountNotification deserialize( - Serializers serializers, Iterable serialized, - {FullType specifiedType = FullType.unspecified}) { - final result = new AccountNotificationBuilder(); - - final iterator = serialized.iterator; - while (iterator.moveNext()) { - final key = iterator.current! as String; - iterator.moveNext(); - final Object? value = iterator.current; - switch (key) { - case 'id': - result.id = serializers.deserialize(value, - specifiedType: const FullType(String))! as String; - break; - case 'message': - result.message = serializers.deserialize(value, - specifiedType: const FullType(String))! as String; - break; - case 'subject': - result.subject = serializers.deserialize(value, - specifiedType: const FullType(String))! as String; - break; - case 'start_at': - result.startAt = serializers.deserialize(value, - specifiedType: const FullType(String))! as String; - break; - } - } - - return result.build(); - } -} - -class _$AccountNotification extends AccountNotification { - @override - final String id; - @override - final String message; - @override - final String subject; - @override - final String startAt; - - factory _$AccountNotification( - [void Function(AccountNotificationBuilder)? updates]) => - (new AccountNotificationBuilder()..update(updates))._build(); - - _$AccountNotification._( - {required this.id, - required this.message, - required this.subject, - required this.startAt}) - : super._() { - BuiltValueNullFieldError.checkNotNull(id, r'AccountNotification', 'id'); - BuiltValueNullFieldError.checkNotNull( - message, r'AccountNotification', 'message'); - BuiltValueNullFieldError.checkNotNull( - subject, r'AccountNotification', 'subject'); - BuiltValueNullFieldError.checkNotNull( - startAt, r'AccountNotification', 'startAt'); - } - - @override - AccountNotification rebuild( - void Function(AccountNotificationBuilder) updates) => - (toBuilder()..update(updates)).build(); - - @override - AccountNotificationBuilder toBuilder() => - new AccountNotificationBuilder()..replace(this); - - @override - bool operator ==(Object other) { - if (identical(other, this)) return true; - return other is AccountNotification && - id == other.id && - message == other.message && - subject == other.subject && - startAt == other.startAt; - } - - @override - int get hashCode { - var _$hash = 0; - _$hash = $jc(_$hash, id.hashCode); - _$hash = $jc(_$hash, message.hashCode); - _$hash = $jc(_$hash, subject.hashCode); - _$hash = $jc(_$hash, startAt.hashCode); - _$hash = $jf(_$hash); - return _$hash; - } - - @override - String toString() { - return (newBuiltValueToStringHelper(r'AccountNotification') - ..add('id', id) - ..add('message', message) - ..add('subject', subject) - ..add('startAt', startAt)) - .toString(); - } -} - -class AccountNotificationBuilder - implements Builder { - _$AccountNotification? _$v; - - String? _id; - String? get id => _$this._id; - set id(String? id) => _$this._id = id; - - String? _message; - String? get message => _$this._message; - set message(String? message) => _$this._message = message; - - String? _subject; - String? get subject => _$this._subject; - set subject(String? subject) => _$this._subject = subject; - - String? _startAt; - String? get startAt => _$this._startAt; - set startAt(String? startAt) => _$this._startAt = startAt; - - AccountNotificationBuilder() { - AccountNotification._initializeBuilder(this); - } - - AccountNotificationBuilder get _$this { - final $v = _$v; - if ($v != null) { - _id = $v.id; - _message = $v.message; - _subject = $v.subject; - _startAt = $v.startAt; - _$v = null; - } - return this; - } - - @override - void replace(AccountNotification other) { - ArgumentError.checkNotNull(other, 'other'); - _$v = other as _$AccountNotification; - } - - @override - void update(void Function(AccountNotificationBuilder)? updates) { - if (updates != null) updates(this); - } - - @override - AccountNotification build() => _build(); - - _$AccountNotification _build() { - final _$result = _$v ?? - new _$AccountNotification._( - id: BuiltValueNullFieldError.checkNotNull( - id, r'AccountNotification', 'id'), - message: BuiltValueNullFieldError.checkNotNull( - message, r'AccountNotification', 'message'), - subject: BuiltValueNullFieldError.checkNotNull( - subject, r'AccountNotification', 'subject'), - startAt: BuiltValueNullFieldError.checkNotNull( - startAt, r'AccountNotification', 'startAt')); - replace(_$result); - return _$result; - } -} - -// ignore_for_file: deprecated_member_use_from_same_package,type=lint diff --git a/apps/flutter_parent/lib/models/account_permissions.dart b/apps/flutter_parent/lib/models/account_permissions.dart deleted file mode 100644 index 6e57ec1b92..0000000000 --- a/apps/flutter_parent/lib/models/account_permissions.dart +++ /dev/null @@ -1,33 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:built_value/built_value.dart'; -import 'package:built_value/serializer.dart'; - -part 'account_permissions.g.dart'; - -/// To have this built_value be generated, run this command from the project root: -/// flutter pub run build_runner build --delete-conflicting-outputs -abstract class AccountPermissions implements Built { - @BuiltValueSerializer(serializeNulls: true) // Add this line to get nulls to serialize when we convert to JSON - static Serializer get serializer => _$accountPermissionsSerializer; - - @BuiltValueField(wireName: 'become_user') - bool get becomeUser; - - AccountPermissions._(); - factory AccountPermissions([void Function(AccountPermissionsBuilder) updates]) = _$AccountPermissions; - - static void _initializeBuilder(AccountPermissionsBuilder b) => b..becomeUser = false; -} diff --git a/apps/flutter_parent/lib/models/account_permissions.g.dart b/apps/flutter_parent/lib/models/account_permissions.g.dart deleted file mode 100644 index 3f6c9bc7b6..0000000000 --- a/apps/flutter_parent/lib/models/account_permissions.g.dart +++ /dev/null @@ -1,144 +0,0 @@ -// GENERATED CODE - DO NOT MODIFY BY HAND - -part of 'account_permissions.dart'; - -// ************************************************************************** -// BuiltValueGenerator -// ************************************************************************** - -Serializer _$accountPermissionsSerializer = - new _$AccountPermissionsSerializer(); - -class _$AccountPermissionsSerializer - implements StructuredSerializer { - @override - final Iterable types = const [AccountPermissions, _$AccountPermissions]; - @override - final String wireName = 'AccountPermissions'; - - @override - Iterable serialize( - Serializers serializers, AccountPermissions object, - {FullType specifiedType = FullType.unspecified}) { - final result = [ - 'become_user', - serializers.serialize(object.becomeUser, - specifiedType: const FullType(bool)), - ]; - - return result; - } - - @override - AccountPermissions deserialize( - Serializers serializers, Iterable serialized, - {FullType specifiedType = FullType.unspecified}) { - final result = new AccountPermissionsBuilder(); - - final iterator = serialized.iterator; - while (iterator.moveNext()) { - final key = iterator.current! as String; - iterator.moveNext(); - final Object? value = iterator.current; - switch (key) { - case 'become_user': - result.becomeUser = serializers.deserialize(value, - specifiedType: const FullType(bool))! as bool; - break; - } - } - - return result.build(); - } -} - -class _$AccountPermissions extends AccountPermissions { - @override - final bool becomeUser; - - factory _$AccountPermissions( - [void Function(AccountPermissionsBuilder)? updates]) => - (new AccountPermissionsBuilder()..update(updates))._build(); - - _$AccountPermissions._({required this.becomeUser}) : super._() { - BuiltValueNullFieldError.checkNotNull( - becomeUser, r'AccountPermissions', 'becomeUser'); - } - - @override - AccountPermissions rebuild( - void Function(AccountPermissionsBuilder) updates) => - (toBuilder()..update(updates)).build(); - - @override - AccountPermissionsBuilder toBuilder() => - new AccountPermissionsBuilder()..replace(this); - - @override - bool operator ==(Object other) { - if (identical(other, this)) return true; - return other is AccountPermissions && becomeUser == other.becomeUser; - } - - @override - int get hashCode { - var _$hash = 0; - _$hash = $jc(_$hash, becomeUser.hashCode); - _$hash = $jf(_$hash); - return _$hash; - } - - @override - String toString() { - return (newBuiltValueToStringHelper(r'AccountPermissions') - ..add('becomeUser', becomeUser)) - .toString(); - } -} - -class AccountPermissionsBuilder - implements Builder { - _$AccountPermissions? _$v; - - bool? _becomeUser; - bool? get becomeUser => _$this._becomeUser; - set becomeUser(bool? becomeUser) => _$this._becomeUser = becomeUser; - - AccountPermissionsBuilder() { - AccountPermissions._initializeBuilder(this); - } - - AccountPermissionsBuilder get _$this { - final $v = _$v; - if ($v != null) { - _becomeUser = $v.becomeUser; - _$v = null; - } - return this; - } - - @override - void replace(AccountPermissions other) { - ArgumentError.checkNotNull(other, 'other'); - _$v = other as _$AccountPermissions; - } - - @override - void update(void Function(AccountPermissionsBuilder)? updates) { - if (updates != null) updates(this); - } - - @override - AccountPermissions build() => _build(); - - _$AccountPermissions _build() { - final _$result = _$v ?? - new _$AccountPermissions._( - becomeUser: BuiltValueNullFieldError.checkNotNull( - becomeUser, r'AccountPermissions', 'becomeUser')); - replace(_$result); - return _$result; - } -} - -// ignore_for_file: deprecated_member_use_from_same_package,type=lint diff --git a/apps/flutter_parent/lib/models/alert.dart b/apps/flutter_parent/lib/models/alert.dart deleted file mode 100644 index c68e6d57f3..0000000000 --- a/apps/flutter_parent/lib/models/alert.dart +++ /dev/null @@ -1,222 +0,0 @@ -// Copyright (C) 2019 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:built_collection/built_collection.dart'; -import 'package:built_value/built_value.dart'; -import 'package:built_value/serializer.dart'; - -part 'alert.g.dart'; - -/// To have this built_value be generated, run this command from the project root: -/// flutter packages pub run build_runner build --delete-conflicting-outputs -abstract class Alert implements Built { - @BuiltValueSerializer(serializeNulls: true) // Add this line to get nulls to serialize when we convert to JSON - static Serializer get serializer => _$alertSerializer; - - Alert._(); - - factory Alert([void Function(AlertBuilder) updates]) = _$Alert; - - String get id; - - @BuiltValueField(wireName: 'observer_alert_threshold_id') - String get observerAlertThresholdId; - - @BuiltValueField(wireName: 'context_type') - String get contextType; - - @BuiltValueField(wireName: 'context_id') - String get contextId; - - @BuiltValueField(wireName: 'alert_type') - AlertType get alertType; - - @BuiltValueField(wireName: 'workflow_state') - AlertWorkflowState get workflowState; - - @BuiltValueField(wireName: 'action_date') - DateTime? get actionDate; - - String get title; - - @BuiltValueField(wireName: 'user_id') - String get userId; - - @BuiltValueField(wireName: 'observer_id') - String get observerId; - - @BuiltValueField(wireName: 'html_url') - String get htmlUrl; - - @BuiltValueField(wireName: 'locked_for_user') - bool get lockedForUser; - - static void _initializeBuilder(AlertBuilder b) => b - ..id = '' - ..observerAlertThresholdId = '' - ..contextType = 'institution' - ..contextId = '' - ..alertType = AlertType.institutionAnnouncement - ..workflowState = AlertWorkflowState.unread - ..actionDate = DateTime.now() - ..title = '' - ..userId = '' - ..observerId = '' - ..htmlUrl = ''; - - // Utility functions - - bool isAlertInfo() { - return const [ - AlertType.courseAnnouncement, - AlertType.institutionAnnouncement, - ].contains(alertType); - } - - bool isAlertPositive() { - return const [ - AlertType.assignmentGradeHigh, - AlertType.courseGradeHigh, - ].contains(alertType); - } - - bool isAlertNegative() { - return const [ - AlertType.assignmentMissing, - AlertType.assignmentGradeLow, - AlertType.courseGradeLow, - ].contains(alertType); - } - - String getCourseIdForAnnouncement() { - assert(alertType == AlertType.courseAnnouncement); - - int index1 = htmlUrl.lastIndexOf('/courses/'); - if (index1 != -1) { - index1 = index1 + '/courses/'.length; - } - int index2 = htmlUrl.lastIndexOf('/discussion_topics'); - return htmlUrl.substring(index1, index2); - } - - String? getCourseIdForGradeAlerts() { - if (alertType == AlertType.courseGradeLow || alertType == AlertType.courseGradeHigh) { - return contextId; - } else if (alertType == AlertType.assignmentGradeLow || alertType == AlertType.assignmentGradeHigh) { - return _getCourseIdFromUrl(); - } else { - return null; - } - } - - String? _getCourseIdFromUrl() { - RegExp regex = RegExp(r'/courses/(\d+)/'); - Match? match = regex.firstMatch(htmlUrl); - return (match != null && match.groupCount >= 1) ? match.group(1) : null; - } -} - -/// If you need to change the values sent over the wire when serializing you -/// can do so using the [BuiltValueEnum] and [BuiltValueEnumConst] annotations. -@BuiltValueEnum(wireName: 'alert_type') -class AlertType extends EnumClass { - const AlertType._(String name) : super(name); - - static BuiltSet get values => _$alertTypeValues; - - static AlertType valueOf(String name) => _$alertTypeValueOf(name); - - static Serializer get serializer => _$alertTypeSerializer; - - @BuiltValueEnumConst(wireName: 'assignment_missing') - static const AlertType assignmentMissing = _$alertTypeAssignmentMissing; - - @BuiltValueEnumConst(wireName: 'assignment_grade_high') - static const AlertType assignmentGradeHigh = _$alertTypeAssignmentGradeHigh; - - @BuiltValueEnumConst(wireName: 'assignment_grade_low') - static const AlertType assignmentGradeLow = _$alertTypeAssignmentGradeLow; - - @BuiltValueEnumConst(wireName: 'course_grade_high') - static const AlertType courseGradeHigh = _$alertTypeCourseGradeHigh; - - @BuiltValueEnumConst(wireName: 'course_grade_low') - static const AlertType courseGradeLow = _$alertTypeCourseGradeLow; - - @BuiltValueEnumConst(wireName: 'course_announcement') - static const AlertType courseAnnouncement = _$alertTypeCourseAnnouncement; - - @BuiltValueEnumConst(wireName: 'institution_announcement') - static const AlertType institutionAnnouncement = _$alertTypeInstitutionAnnouncement; - - @BuiltValueEnumConst(fallback: true) - static const AlertType unknown = _$alertTypeUnknown; - - bool isPercentage() { - return const [ - AlertType.courseGradeLow, - AlertType.courseGradeHigh, - AlertType.assignmentGradeLow, - AlertType.assignmentGradeHigh - ].contains(this); - } - - bool isSwitch() { - return const [AlertType.assignmentMissing, AlertType.courseAnnouncement, AlertType.institutionAnnouncement] - .contains(this); - } - - String toApiString() { - switch (this) { - case AlertType.courseAnnouncement: - return 'course_announcement'; - case AlertType.institutionAnnouncement: - return 'institution_announcement'; - case AlertType.assignmentGradeHigh: - return 'assignment_grade_high'; - case AlertType.assignmentGradeLow: - return 'assignment_grade_low'; - case AlertType.assignmentMissing: - return 'assignment_missing'; - case AlertType.courseGradeHigh: - return 'course_grade_high'; - case AlertType.courseGradeLow: - return 'course_grade_low'; - default: - return ''; - } - } -} - -@BuiltValueEnum(wireName: 'workflow_state') -class AlertWorkflowState extends EnumClass { - const AlertWorkflowState._(String name) : super(name); - - static BuiltSet get values => _$alertWorkflowStateValues; - - static AlertWorkflowState valueOf(String name) => _$alertWorkflowStateValueOf(name); - - static Serializer get serializer => _$alertWorkflowStateSerializer; - - static const AlertWorkflowState read = _$alertWorkflowStateRead; - - static const AlertWorkflowState unread = _$alertWorkflowStateUnread; - - static const AlertWorkflowState deleted = _$alertWorkflowStateDeletted; - - static const AlertWorkflowState dismissed = _$alertWorkflowStateDismissed; - - @BuiltValueEnumConst(fallback: true) - static const AlertWorkflowState unknown = _$alertWorkflowStateUnknown; -} diff --git a/apps/flutter_parent/lib/models/alert.g.dart b/apps/flutter_parent/lib/models/alert.g.dart deleted file mode 100644 index bfa3308e37..0000000000 --- a/apps/flutter_parent/lib/models/alert.g.dart +++ /dev/null @@ -1,521 +0,0 @@ -// GENERATED CODE - DO NOT MODIFY BY HAND - -part of 'alert.dart'; - -// ************************************************************************** -// BuiltValueGenerator -// ************************************************************************** - -const AlertType _$alertTypeAssignmentMissing = - const AlertType._('assignmentMissing'); -const AlertType _$alertTypeAssignmentGradeHigh = - const AlertType._('assignmentGradeHigh'); -const AlertType _$alertTypeAssignmentGradeLow = - const AlertType._('assignmentGradeLow'); -const AlertType _$alertTypeCourseGradeHigh = - const AlertType._('courseGradeHigh'); -const AlertType _$alertTypeCourseGradeLow = const AlertType._('courseGradeLow'); -const AlertType _$alertTypeCourseAnnouncement = - const AlertType._('courseAnnouncement'); -const AlertType _$alertTypeInstitutionAnnouncement = - const AlertType._('institutionAnnouncement'); -const AlertType _$alertTypeUnknown = const AlertType._('unknown'); - -AlertType _$alertTypeValueOf(String name) { - switch (name) { - case 'assignmentMissing': - return _$alertTypeAssignmentMissing; - case 'assignmentGradeHigh': - return _$alertTypeAssignmentGradeHigh; - case 'assignmentGradeLow': - return _$alertTypeAssignmentGradeLow; - case 'courseGradeHigh': - return _$alertTypeCourseGradeHigh; - case 'courseGradeLow': - return _$alertTypeCourseGradeLow; - case 'courseAnnouncement': - return _$alertTypeCourseAnnouncement; - case 'institutionAnnouncement': - return _$alertTypeInstitutionAnnouncement; - case 'unknown': - return _$alertTypeUnknown; - default: - return _$alertTypeUnknown; - } -} - -final BuiltSet _$alertTypeValues = - new BuiltSet(const [ - _$alertTypeAssignmentMissing, - _$alertTypeAssignmentGradeHigh, - _$alertTypeAssignmentGradeLow, - _$alertTypeCourseGradeHigh, - _$alertTypeCourseGradeLow, - _$alertTypeCourseAnnouncement, - _$alertTypeInstitutionAnnouncement, - _$alertTypeUnknown, -]); - -const AlertWorkflowState _$alertWorkflowStateRead = - const AlertWorkflowState._('read'); -const AlertWorkflowState _$alertWorkflowStateUnread = - const AlertWorkflowState._('unread'); -const AlertWorkflowState _$alertWorkflowStateDeletted = - const AlertWorkflowState._('deleted'); -const AlertWorkflowState _$alertWorkflowStateDismissed = - const AlertWorkflowState._('dismissed'); -const AlertWorkflowState _$alertWorkflowStateUnknown = - const AlertWorkflowState._('unknown'); - -AlertWorkflowState _$alertWorkflowStateValueOf(String name) { - switch (name) { - case 'read': - return _$alertWorkflowStateRead; - case 'unread': - return _$alertWorkflowStateUnread; - case 'deleted': - return _$alertWorkflowStateDeletted; - case 'dismissed': - return _$alertWorkflowStateDismissed; - case 'unknown': - return _$alertWorkflowStateUnknown; - default: - return _$alertWorkflowStateUnknown; - } -} - -final BuiltSet _$alertWorkflowStateValues = - new BuiltSet(const [ - _$alertWorkflowStateRead, - _$alertWorkflowStateUnread, - _$alertWorkflowStateDeletted, - _$alertWorkflowStateDismissed, - _$alertWorkflowStateUnknown, -]); - -Serializer _$alertSerializer = new _$AlertSerializer(); -Serializer _$alertTypeSerializer = new _$AlertTypeSerializer(); -Serializer _$alertWorkflowStateSerializer = - new _$AlertWorkflowStateSerializer(); - -class _$AlertSerializer implements StructuredSerializer { - @override - final Iterable types = const [Alert, _$Alert]; - @override - final String wireName = 'Alert'; - - @override - Iterable serialize(Serializers serializers, Alert object, - {FullType specifiedType = FullType.unspecified}) { - final result = [ - 'id', - serializers.serialize(object.id, specifiedType: const FullType(String)), - 'observer_alert_threshold_id', - serializers.serialize(object.observerAlertThresholdId, - specifiedType: const FullType(String)), - 'context_type', - serializers.serialize(object.contextType, - specifiedType: const FullType(String)), - 'context_id', - serializers.serialize(object.contextId, - specifiedType: const FullType(String)), - 'alert_type', - serializers.serialize(object.alertType, - specifiedType: const FullType(AlertType)), - 'workflow_state', - serializers.serialize(object.workflowState, - specifiedType: const FullType(AlertWorkflowState)), - 'title', - serializers.serialize(object.title, - specifiedType: const FullType(String)), - 'user_id', - serializers.serialize(object.userId, - specifiedType: const FullType(String)), - 'observer_id', - serializers.serialize(object.observerId, - specifiedType: const FullType(String)), - 'html_url', - serializers.serialize(object.htmlUrl, - specifiedType: const FullType(String)), - 'locked_for_user', - serializers.serialize(object.lockedForUser, - specifiedType: const FullType(bool)), - ]; - Object? value; - value = object.actionDate; - - result - ..add('action_date') - ..add(serializers.serialize(value, - specifiedType: const FullType(DateTime))); - - return result; - } - - @override - Alert deserialize(Serializers serializers, Iterable serialized, - {FullType specifiedType = FullType.unspecified}) { - final result = new AlertBuilder(); - - final iterator = serialized.iterator; - while (iterator.moveNext()) { - final key = iterator.current! as String; - iterator.moveNext(); - final Object? value = iterator.current; - switch (key) { - case 'id': - result.id = serializers.deserialize(value, - specifiedType: const FullType(String))! as String; - break; - case 'observer_alert_threshold_id': - result.observerAlertThresholdId = serializers.deserialize(value, - specifiedType: const FullType(String))! as String; - break; - case 'context_type': - result.contextType = serializers.deserialize(value, - specifiedType: const FullType(String))! as String; - break; - case 'context_id': - result.contextId = serializers.deserialize(value, - specifiedType: const FullType(String))! as String; - break; - case 'alert_type': - result.alertType = serializers.deserialize(value, - specifiedType: const FullType(AlertType))! as AlertType; - break; - case 'workflow_state': - result.workflowState = serializers.deserialize(value, - specifiedType: const FullType(AlertWorkflowState))! - as AlertWorkflowState; - break; - case 'action_date': - result.actionDate = serializers.deserialize(value, - specifiedType: const FullType(DateTime)) as DateTime?; - break; - case 'title': - result.title = serializers.deserialize(value, - specifiedType: const FullType(String))! as String; - break; - case 'user_id': - result.userId = serializers.deserialize(value, - specifiedType: const FullType(String))! as String; - break; - case 'observer_id': - result.observerId = serializers.deserialize(value, - specifiedType: const FullType(String))! as String; - break; - case 'html_url': - result.htmlUrl = serializers.deserialize(value, - specifiedType: const FullType(String))! as String; - break; - case 'locked_for_user': - result.lockedForUser = serializers.deserialize(value, - specifiedType: const FullType(bool))! as bool; - break; - } - } - - return result.build(); - } -} - -class _$AlertTypeSerializer implements PrimitiveSerializer { - static const Map _toWire = const { - 'assignmentMissing': 'assignment_missing', - 'assignmentGradeHigh': 'assignment_grade_high', - 'assignmentGradeLow': 'assignment_grade_low', - 'courseGradeHigh': 'course_grade_high', - 'courseGradeLow': 'course_grade_low', - 'courseAnnouncement': 'course_announcement', - 'institutionAnnouncement': 'institution_announcement', - }; - static const Map _fromWire = const { - 'assignment_missing': 'assignmentMissing', - 'assignment_grade_high': 'assignmentGradeHigh', - 'assignment_grade_low': 'assignmentGradeLow', - 'course_grade_high': 'courseGradeHigh', - 'course_grade_low': 'courseGradeLow', - 'course_announcement': 'courseAnnouncement', - 'institution_announcement': 'institutionAnnouncement', - }; - - @override - final Iterable types = const [AlertType]; - @override - final String wireName = 'alert_type'; - - @override - Object serialize(Serializers serializers, AlertType object, - {FullType specifiedType = FullType.unspecified}) => - _toWire[object.name] ?? object.name; - - @override - AlertType deserialize(Serializers serializers, Object serialized, - {FullType specifiedType = FullType.unspecified}) => - AlertType.valueOf( - _fromWire[serialized] ?? (serialized is String ? serialized : '')); -} - -class _$AlertWorkflowStateSerializer - implements PrimitiveSerializer { - @override - final Iterable types = const [AlertWorkflowState]; - @override - final String wireName = 'workflow_state'; - - @override - Object serialize(Serializers serializers, AlertWorkflowState object, - {FullType specifiedType = FullType.unspecified}) => - object.name; - - @override - AlertWorkflowState deserialize(Serializers serializers, Object serialized, - {FullType specifiedType = FullType.unspecified}) => - AlertWorkflowState.valueOf(serialized as String); -} - -class _$Alert extends Alert { - @override - final String id; - @override - final String observerAlertThresholdId; - @override - final String contextType; - @override - final String contextId; - @override - final AlertType alertType; - @override - final AlertWorkflowState workflowState; - @override - final DateTime? actionDate; - @override - final String title; - @override - final String userId; - @override - final String observerId; - @override - final String htmlUrl; - @override - final bool lockedForUser; - - factory _$Alert([void Function(AlertBuilder)? updates]) => - (new AlertBuilder()..update(updates))._build(); - - _$Alert._( - {required this.id, - required this.observerAlertThresholdId, - required this.contextType, - required this.contextId, - required this.alertType, - required this.workflowState, - this.actionDate, - required this.title, - required this.userId, - required this.observerId, - required this.htmlUrl, - required this.lockedForUser}) - : super._() { - BuiltValueNullFieldError.checkNotNull(id, r'Alert', 'id'); - BuiltValueNullFieldError.checkNotNull( - observerAlertThresholdId, r'Alert', 'observerAlertThresholdId'); - BuiltValueNullFieldError.checkNotNull(contextType, r'Alert', 'contextType'); - BuiltValueNullFieldError.checkNotNull(contextId, r'Alert', 'contextId'); - BuiltValueNullFieldError.checkNotNull(alertType, r'Alert', 'alertType'); - BuiltValueNullFieldError.checkNotNull( - workflowState, r'Alert', 'workflowState'); - BuiltValueNullFieldError.checkNotNull(title, r'Alert', 'title'); - BuiltValueNullFieldError.checkNotNull(userId, r'Alert', 'userId'); - BuiltValueNullFieldError.checkNotNull(observerId, r'Alert', 'observerId'); - BuiltValueNullFieldError.checkNotNull(htmlUrl, r'Alert', 'htmlUrl'); - BuiltValueNullFieldError.checkNotNull( - lockedForUser, r'Alert', 'lockedForUser'); - } - - @override - Alert rebuild(void Function(AlertBuilder) updates) => - (toBuilder()..update(updates)).build(); - - @override - AlertBuilder toBuilder() => new AlertBuilder()..replace(this); - - @override - bool operator ==(Object other) { - if (identical(other, this)) return true; - return other is Alert && - id == other.id && - observerAlertThresholdId == other.observerAlertThresholdId && - contextType == other.contextType && - contextId == other.contextId && - alertType == other.alertType && - workflowState == other.workflowState && - actionDate == other.actionDate && - title == other.title && - userId == other.userId && - observerId == other.observerId && - htmlUrl == other.htmlUrl && - lockedForUser == other.lockedForUser; - } - - @override - int get hashCode { - var _$hash = 0; - _$hash = $jc(_$hash, id.hashCode); - _$hash = $jc(_$hash, observerAlertThresholdId.hashCode); - _$hash = $jc(_$hash, contextType.hashCode); - _$hash = $jc(_$hash, contextId.hashCode); - _$hash = $jc(_$hash, alertType.hashCode); - _$hash = $jc(_$hash, workflowState.hashCode); - _$hash = $jc(_$hash, actionDate.hashCode); - _$hash = $jc(_$hash, title.hashCode); - _$hash = $jc(_$hash, userId.hashCode); - _$hash = $jc(_$hash, observerId.hashCode); - _$hash = $jc(_$hash, htmlUrl.hashCode); - _$hash = $jc(_$hash, lockedForUser.hashCode); - _$hash = $jf(_$hash); - return _$hash; - } - - @override - String toString() { - return (newBuiltValueToStringHelper(r'Alert') - ..add('id', id) - ..add('observerAlertThresholdId', observerAlertThresholdId) - ..add('contextType', contextType) - ..add('contextId', contextId) - ..add('alertType', alertType) - ..add('workflowState', workflowState) - ..add('actionDate', actionDate) - ..add('title', title) - ..add('userId', userId) - ..add('observerId', observerId) - ..add('htmlUrl', htmlUrl) - ..add('lockedForUser', lockedForUser)) - .toString(); - } -} - -class AlertBuilder implements Builder { - _$Alert? _$v; - - String? _id; - String? get id => _$this._id; - set id(String? id) => _$this._id = id; - - String? _observerAlertThresholdId; - String? get observerAlertThresholdId => _$this._observerAlertThresholdId; - set observerAlertThresholdId(String? observerAlertThresholdId) => - _$this._observerAlertThresholdId = observerAlertThresholdId; - - String? _contextType; - String? get contextType => _$this._contextType; - set contextType(String? contextType) => _$this._contextType = contextType; - - String? _contextId; - String? get contextId => _$this._contextId; - set contextId(String? contextId) => _$this._contextId = contextId; - - AlertType? _alertType; - AlertType? get alertType => _$this._alertType; - set alertType(AlertType? alertType) => _$this._alertType = alertType; - - AlertWorkflowState? _workflowState; - AlertWorkflowState? get workflowState => _$this._workflowState; - set workflowState(AlertWorkflowState? workflowState) => - _$this._workflowState = workflowState; - - DateTime? _actionDate; - DateTime? get actionDate => _$this._actionDate; - set actionDate(DateTime? actionDate) => _$this._actionDate = actionDate; - - String? _title; - String? get title => _$this._title; - set title(String? title) => _$this._title = title; - - String? _userId; - String? get userId => _$this._userId; - set userId(String? userId) => _$this._userId = userId; - - String? _observerId; - String? get observerId => _$this._observerId; - set observerId(String? observerId) => _$this._observerId = observerId; - - String? _htmlUrl; - String? get htmlUrl => _$this._htmlUrl; - set htmlUrl(String? htmlUrl) => _$this._htmlUrl = htmlUrl; - - bool? _lockedForUser; - bool? get lockedForUser => _$this._lockedForUser; - set lockedForUser(bool? lockedForUser) => - _$this._lockedForUser = lockedForUser; - - AlertBuilder() { - Alert._initializeBuilder(this); - } - - AlertBuilder get _$this { - final $v = _$v; - if ($v != null) { - _id = $v.id; - _observerAlertThresholdId = $v.observerAlertThresholdId; - _contextType = $v.contextType; - _contextId = $v.contextId; - _alertType = $v.alertType; - _workflowState = $v.workflowState; - _actionDate = $v.actionDate; - _title = $v.title; - _userId = $v.userId; - _observerId = $v.observerId; - _htmlUrl = $v.htmlUrl; - _lockedForUser = $v.lockedForUser; - _$v = null; - } - return this; - } - - @override - void replace(Alert other) { - ArgumentError.checkNotNull(other, 'other'); - _$v = other as _$Alert; - } - - @override - void update(void Function(AlertBuilder)? updates) { - if (updates != null) updates(this); - } - - @override - Alert build() => _build(); - - _$Alert _build() { - final _$result = _$v ?? - new _$Alert._( - id: BuiltValueNullFieldError.checkNotNull(id, r'Alert', 'id'), - observerAlertThresholdId: BuiltValueNullFieldError.checkNotNull( - observerAlertThresholdId, r'Alert', 'observerAlertThresholdId'), - contextType: BuiltValueNullFieldError.checkNotNull( - contextType, r'Alert', 'contextType'), - contextId: BuiltValueNullFieldError.checkNotNull( - contextId, r'Alert', 'contextId'), - alertType: BuiltValueNullFieldError.checkNotNull( - alertType, r'Alert', 'alertType'), - workflowState: BuiltValueNullFieldError.checkNotNull( - workflowState, r'Alert', 'workflowState'), - actionDate: actionDate, - title: - BuiltValueNullFieldError.checkNotNull(title, r'Alert', 'title'), - userId: BuiltValueNullFieldError.checkNotNull( - userId, r'Alert', 'userId'), - observerId: BuiltValueNullFieldError.checkNotNull( - observerId, r'Alert', 'observerId'), - htmlUrl: BuiltValueNullFieldError.checkNotNull( - htmlUrl, r'Alert', 'htmlUrl'), - lockedForUser: - BuiltValueNullFieldError.checkNotNull(lockedForUser, r'Alert', 'lockedForUser')); - replace(_$result); - return _$result; - } -} - -// ignore_for_file: deprecated_member_use_from_same_package,type=lint diff --git a/apps/flutter_parent/lib/models/alert_threshold.dart b/apps/flutter_parent/lib/models/alert_threshold.dart deleted file mode 100644 index 48819b674f..0000000000 --- a/apps/flutter_parent/lib/models/alert_threshold.dart +++ /dev/null @@ -1,50 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:built_value/built_value.dart'; -import 'package:built_value/serializer.dart'; - -import 'alert.dart'; - -part 'alert_threshold.g.dart'; - -/// To have this built_value be generated, run this command from the project root: -/// flutter packages pub run build_runner build --delete-conflicting-outputs -abstract class AlertThreshold implements Built { - @BuiltValueSerializer(serializeNulls: true) // Add this line to get nulls to serialize when we convert to JSON - static Serializer get serializer => _$alertThresholdSerializer; - - AlertThreshold._(); - - factory AlertThreshold([void Function(AlertThresholdBuilder) updates]) = _$AlertThreshold; - - String get id; - - @BuiltValueField(wireName: 'alert_type') - AlertType get alertType; - - String? get threshold; - - @BuiltValueField(wireName: 'user_id') - String get userId; - - @BuiltValueField(wireName: 'observer_id') - String get observerId; - - static void _initializeBuilder(AlertThresholdBuilder b) => b - ..id = '' - ..alertType = AlertType.institutionAnnouncement - ..userId = '' - ..observerId = ''; -} diff --git a/apps/flutter_parent/lib/models/alert_threshold.g.dart b/apps/flutter_parent/lib/models/alert_threshold.g.dart deleted file mode 100644 index ada94874e3..0000000000 --- a/apps/flutter_parent/lib/models/alert_threshold.g.dart +++ /dev/null @@ -1,230 +0,0 @@ -// GENERATED CODE - DO NOT MODIFY BY HAND - -part of 'alert_threshold.dart'; - -// ************************************************************************** -// BuiltValueGenerator -// ************************************************************************** - -Serializer _$alertThresholdSerializer = - new _$AlertThresholdSerializer(); - -class _$AlertThresholdSerializer - implements StructuredSerializer { - @override - final Iterable types = const [AlertThreshold, _$AlertThreshold]; - @override - final String wireName = 'AlertThreshold'; - - @override - Iterable serialize(Serializers serializers, AlertThreshold object, - {FullType specifiedType = FullType.unspecified}) { - final result = [ - 'id', - serializers.serialize(object.id, specifiedType: const FullType(String)), - 'alert_type', - serializers.serialize(object.alertType, - specifiedType: const FullType(AlertType)), - 'user_id', - serializers.serialize(object.userId, - specifiedType: const FullType(String)), - 'observer_id', - serializers.serialize(object.observerId, - specifiedType: const FullType(String)), - ]; - Object? value; - value = object.threshold; - - result - ..add('threshold') - ..add( - serializers.serialize(value, specifiedType: const FullType(String))); - - return result; - } - - @override - AlertThreshold deserialize( - Serializers serializers, Iterable serialized, - {FullType specifiedType = FullType.unspecified}) { - final result = new AlertThresholdBuilder(); - - final iterator = serialized.iterator; - while (iterator.moveNext()) { - final key = iterator.current! as String; - iterator.moveNext(); - final Object? value = iterator.current; - switch (key) { - case 'id': - result.id = serializers.deserialize(value, - specifiedType: const FullType(String))! as String; - break; - case 'alert_type': - result.alertType = serializers.deserialize(value, - specifiedType: const FullType(AlertType))! as AlertType; - break; - case 'threshold': - result.threshold = serializers.deserialize(value, - specifiedType: const FullType(String)) as String?; - break; - case 'user_id': - result.userId = serializers.deserialize(value, - specifiedType: const FullType(String))! as String; - break; - case 'observer_id': - result.observerId = serializers.deserialize(value, - specifiedType: const FullType(String))! as String; - break; - } - } - - return result.build(); - } -} - -class _$AlertThreshold extends AlertThreshold { - @override - final String id; - @override - final AlertType alertType; - @override - final String? threshold; - @override - final String userId; - @override - final String observerId; - - factory _$AlertThreshold([void Function(AlertThresholdBuilder)? updates]) => - (new AlertThresholdBuilder()..update(updates))._build(); - - _$AlertThreshold._( - {required this.id, - required this.alertType, - this.threshold, - required this.userId, - required this.observerId}) - : super._() { - BuiltValueNullFieldError.checkNotNull(id, r'AlertThreshold', 'id'); - BuiltValueNullFieldError.checkNotNull( - alertType, r'AlertThreshold', 'alertType'); - BuiltValueNullFieldError.checkNotNull(userId, r'AlertThreshold', 'userId'); - BuiltValueNullFieldError.checkNotNull( - observerId, r'AlertThreshold', 'observerId'); - } - - @override - AlertThreshold rebuild(void Function(AlertThresholdBuilder) updates) => - (toBuilder()..update(updates)).build(); - - @override - AlertThresholdBuilder toBuilder() => - new AlertThresholdBuilder()..replace(this); - - @override - bool operator ==(Object other) { - if (identical(other, this)) return true; - return other is AlertThreshold && - id == other.id && - alertType == other.alertType && - threshold == other.threshold && - userId == other.userId && - observerId == other.observerId; - } - - @override - int get hashCode { - var _$hash = 0; - _$hash = $jc(_$hash, id.hashCode); - _$hash = $jc(_$hash, alertType.hashCode); - _$hash = $jc(_$hash, threshold.hashCode); - _$hash = $jc(_$hash, userId.hashCode); - _$hash = $jc(_$hash, observerId.hashCode); - _$hash = $jf(_$hash); - return _$hash; - } - - @override - String toString() { - return (newBuiltValueToStringHelper(r'AlertThreshold') - ..add('id', id) - ..add('alertType', alertType) - ..add('threshold', threshold) - ..add('userId', userId) - ..add('observerId', observerId)) - .toString(); - } -} - -class AlertThresholdBuilder - implements Builder { - _$AlertThreshold? _$v; - - String? _id; - String? get id => _$this._id; - set id(String? id) => _$this._id = id; - - AlertType? _alertType; - AlertType? get alertType => _$this._alertType; - set alertType(AlertType? alertType) => _$this._alertType = alertType; - - String? _threshold; - String? get threshold => _$this._threshold; - set threshold(String? threshold) => _$this._threshold = threshold; - - String? _userId; - String? get userId => _$this._userId; - set userId(String? userId) => _$this._userId = userId; - - String? _observerId; - String? get observerId => _$this._observerId; - set observerId(String? observerId) => _$this._observerId = observerId; - - AlertThresholdBuilder() { - AlertThreshold._initializeBuilder(this); - } - - AlertThresholdBuilder get _$this { - final $v = _$v; - if ($v != null) { - _id = $v.id; - _alertType = $v.alertType; - _threshold = $v.threshold; - _userId = $v.userId; - _observerId = $v.observerId; - _$v = null; - } - return this; - } - - @override - void replace(AlertThreshold other) { - ArgumentError.checkNotNull(other, 'other'); - _$v = other as _$AlertThreshold; - } - - @override - void update(void Function(AlertThresholdBuilder)? updates) { - if (updates != null) updates(this); - } - - @override - AlertThreshold build() => _build(); - - _$AlertThreshold _build() { - final _$result = _$v ?? - new _$AlertThreshold._( - id: BuiltValueNullFieldError.checkNotNull( - id, r'AlertThreshold', 'id'), - alertType: BuiltValueNullFieldError.checkNotNull( - alertType, r'AlertThreshold', 'alertType'), - threshold: threshold, - userId: BuiltValueNullFieldError.checkNotNull( - userId, r'AlertThreshold', 'userId'), - observerId: BuiltValueNullFieldError.checkNotNull( - observerId, r'AlertThreshold', 'observerId')); - replace(_$result); - return _$result; - } -} - -// ignore_for_file: deprecated_member_use_from_same_package,type=lint diff --git a/apps/flutter_parent/lib/models/announcement.dart b/apps/flutter_parent/lib/models/announcement.dart deleted file mode 100644 index dc7cb7a6c2..0000000000 --- a/apps/flutter_parent/lib/models/announcement.dart +++ /dev/null @@ -1,53 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:built_collection/built_collection.dart'; -import 'package:built_value/built_value.dart'; -import 'package:built_value/serializer.dart'; - -import 'remote_file.dart'; - -part 'announcement.g.dart'; - -/// To have this built_value be generated, run this command from the project root: -/// flutter packages pub run build_runner build --delete-conflicting-outputs -abstract class Announcement implements Built { - @BuiltValueSerializer(serializeNulls: true) // Add this line to get nulls to serialize when we convert to JSON - static Serializer get serializer => _$announcementSerializer; - - Announcement._(); - - factory Announcement([void Function(AnnouncementBuilder) updates]) = _$Announcement; - - String get id; - - String get title; - - String get message; - - @BuiltValueField(wireName: 'posted_at') - DateTime get postedAt; - - @BuiltValueField(wireName: 'html_url') - String get htmlUrl; - - BuiltList get attachments; - - static void _initializeBuilder(AnnouncementBuilder b) => b - ..id = '' - ..title = '' - ..message = '' - ..postedAt = DateTime.now() - ..htmlUrl = ''; -} diff --git a/apps/flutter_parent/lib/models/announcement.g.dart b/apps/flutter_parent/lib/models/announcement.g.dart deleted file mode 100644 index ed7235ba3a..0000000000 --- a/apps/flutter_parent/lib/models/announcement.g.dart +++ /dev/null @@ -1,264 +0,0 @@ -// GENERATED CODE - DO NOT MODIFY BY HAND - -part of 'announcement.dart'; - -// ************************************************************************** -// BuiltValueGenerator -// ************************************************************************** - -Serializer _$announcementSerializer = - new _$AnnouncementSerializer(); - -class _$AnnouncementSerializer implements StructuredSerializer { - @override - final Iterable types = const [Announcement, _$Announcement]; - @override - final String wireName = 'Announcement'; - - @override - Iterable serialize(Serializers serializers, Announcement object, - {FullType specifiedType = FullType.unspecified}) { - final result = [ - 'id', - serializers.serialize(object.id, specifiedType: const FullType(String)), - 'title', - serializers.serialize(object.title, - specifiedType: const FullType(String)), - 'message', - serializers.serialize(object.message, - specifiedType: const FullType(String)), - 'posted_at', - serializers.serialize(object.postedAt, - specifiedType: const FullType(DateTime)), - 'html_url', - serializers.serialize(object.htmlUrl, - specifiedType: const FullType(String)), - 'attachments', - serializers.serialize(object.attachments, - specifiedType: - const FullType(BuiltList, const [const FullType(RemoteFile)])), - ]; - - return result; - } - - @override - Announcement deserialize( - Serializers serializers, Iterable serialized, - {FullType specifiedType = FullType.unspecified}) { - final result = new AnnouncementBuilder(); - - final iterator = serialized.iterator; - while (iterator.moveNext()) { - final key = iterator.current! as String; - iterator.moveNext(); - final Object? value = iterator.current; - switch (key) { - case 'id': - result.id = serializers.deserialize(value, - specifiedType: const FullType(String))! as String; - break; - case 'title': - result.title = serializers.deserialize(value, - specifiedType: const FullType(String))! as String; - break; - case 'message': - result.message = serializers.deserialize(value, - specifiedType: const FullType(String))! as String; - break; - case 'posted_at': - result.postedAt = serializers.deserialize(value, - specifiedType: const FullType(DateTime))! as DateTime; - break; - case 'html_url': - result.htmlUrl = serializers.deserialize(value, - specifiedType: const FullType(String))! as String; - break; - case 'attachments': - result.attachments.replace(serializers.deserialize(value, - specifiedType: const FullType( - BuiltList, const [const FullType(RemoteFile)]))! - as BuiltList); - break; - } - } - - return result.build(); - } -} - -class _$Announcement extends Announcement { - @override - final String id; - @override - final String title; - @override - final String message; - @override - final DateTime postedAt; - @override - final String htmlUrl; - @override - final BuiltList attachments; - - factory _$Announcement([void Function(AnnouncementBuilder)? updates]) => - (new AnnouncementBuilder()..update(updates))._build(); - - _$Announcement._( - {required this.id, - required this.title, - required this.message, - required this.postedAt, - required this.htmlUrl, - required this.attachments}) - : super._() { - BuiltValueNullFieldError.checkNotNull(id, r'Announcement', 'id'); - BuiltValueNullFieldError.checkNotNull(title, r'Announcement', 'title'); - BuiltValueNullFieldError.checkNotNull(message, r'Announcement', 'message'); - BuiltValueNullFieldError.checkNotNull( - postedAt, r'Announcement', 'postedAt'); - BuiltValueNullFieldError.checkNotNull(htmlUrl, r'Announcement', 'htmlUrl'); - BuiltValueNullFieldError.checkNotNull( - attachments, r'Announcement', 'attachments'); - } - - @override - Announcement rebuild(void Function(AnnouncementBuilder) updates) => - (toBuilder()..update(updates)).build(); - - @override - AnnouncementBuilder toBuilder() => new AnnouncementBuilder()..replace(this); - - @override - bool operator ==(Object other) { - if (identical(other, this)) return true; - return other is Announcement && - id == other.id && - title == other.title && - message == other.message && - postedAt == other.postedAt && - htmlUrl == other.htmlUrl && - attachments == other.attachments; - } - - @override - int get hashCode { - var _$hash = 0; - _$hash = $jc(_$hash, id.hashCode); - _$hash = $jc(_$hash, title.hashCode); - _$hash = $jc(_$hash, message.hashCode); - _$hash = $jc(_$hash, postedAt.hashCode); - _$hash = $jc(_$hash, htmlUrl.hashCode); - _$hash = $jc(_$hash, attachments.hashCode); - _$hash = $jf(_$hash); - return _$hash; - } - - @override - String toString() { - return (newBuiltValueToStringHelper(r'Announcement') - ..add('id', id) - ..add('title', title) - ..add('message', message) - ..add('postedAt', postedAt) - ..add('htmlUrl', htmlUrl) - ..add('attachments', attachments)) - .toString(); - } -} - -class AnnouncementBuilder - implements Builder { - _$Announcement? _$v; - - String? _id; - String? get id => _$this._id; - set id(String? id) => _$this._id = id; - - String? _title; - String? get title => _$this._title; - set title(String? title) => _$this._title = title; - - String? _message; - String? get message => _$this._message; - set message(String? message) => _$this._message = message; - - DateTime? _postedAt; - DateTime? get postedAt => _$this._postedAt; - set postedAt(DateTime? postedAt) => _$this._postedAt = postedAt; - - String? _htmlUrl; - String? get htmlUrl => _$this._htmlUrl; - set htmlUrl(String? htmlUrl) => _$this._htmlUrl = htmlUrl; - - ListBuilder? _attachments; - ListBuilder get attachments => - _$this._attachments ??= new ListBuilder(); - set attachments(ListBuilder? attachments) => - _$this._attachments = attachments; - - AnnouncementBuilder() { - Announcement._initializeBuilder(this); - } - - AnnouncementBuilder get _$this { - final $v = _$v; - if ($v != null) { - _id = $v.id; - _title = $v.title; - _message = $v.message; - _postedAt = $v.postedAt; - _htmlUrl = $v.htmlUrl; - _attachments = $v.attachments.toBuilder(); - _$v = null; - } - return this; - } - - @override - void replace(Announcement other) { - ArgumentError.checkNotNull(other, 'other'); - _$v = other as _$Announcement; - } - - @override - void update(void Function(AnnouncementBuilder)? updates) { - if (updates != null) updates(this); - } - - @override - Announcement build() => _build(); - - _$Announcement _build() { - _$Announcement _$result; - try { - _$result = _$v ?? - new _$Announcement._( - id: BuiltValueNullFieldError.checkNotNull( - id, r'Announcement', 'id'), - title: BuiltValueNullFieldError.checkNotNull( - title, r'Announcement', 'title'), - message: BuiltValueNullFieldError.checkNotNull( - message, r'Announcement', 'message'), - postedAt: BuiltValueNullFieldError.checkNotNull( - postedAt, r'Announcement', 'postedAt'), - htmlUrl: BuiltValueNullFieldError.checkNotNull( - htmlUrl, r'Announcement', 'htmlUrl'), - attachments: attachments.build()); - } catch (_) { - late String _$failedField; - try { - _$failedField = 'attachments'; - attachments.build(); - } catch (e) { - throw new BuiltValueNestedFieldError( - r'Announcement', _$failedField, e.toString()); - } - rethrow; - } - replace(_$result); - return _$result; - } -} - -// ignore_for_file: deprecated_member_use_from_same_package,type=lint diff --git a/apps/flutter_parent/lib/models/assignment.dart b/apps/flutter_parent/lib/models/assignment.dart deleted file mode 100644 index fadb6aa113..0000000000 --- a/apps/flutter_parent/lib/models/assignment.dart +++ /dev/null @@ -1,256 +0,0 @@ -// Copyright (C) 2019 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -library assignment; - -import 'package:built_collection/built_collection.dart'; -import 'package:built_value/built_value.dart'; -import 'package:built_value/serializer.dart'; -import 'package:collection/collection.dart'; -import 'package:flutter_parent/models/lock_info.dart'; -import 'package:flutter_parent/models/submission_wrapper.dart'; - -import 'submission.dart'; - -part 'assignment.g.dart'; - -abstract class Assignment implements Built { - @BuiltValueSerializer(serializeNulls: true) - static Serializer get serializer => _$assignmentSerializer; - - Assignment._(); - - factory Assignment([void Function(AssignmentBuilder) updates]) = _$Assignment; - - String get id; - - String? get name; - - String? get description; - - @BuiltValueField(wireName: 'due_at') - DateTime? get dueAt; - - @BuiltValueField(wireName: 'points_possible') - double get pointsPossible; - - @BuiltValueField(wireName: 'course_id') - String get courseId; - - @BuiltValueField(wireName: 'grading_type') - GradingType? get gradingType; - - @BuiltValueField(wireName: 'html_url') - String? get htmlUrl; - - String? get url; - - @BuiltValueField(wireName: 'quiz_id') - String? get quizId; // (Optional) id of the associated quiz (applies only when submission_types is ["online_quiz"]) - - @BuiltValueField(wireName: 'use_rubric_for_grading') - bool get useRubricForGrading; - - /// Wrapper object to handle observer and non-observer submission case - /// See SubmissionWrapper for more details - @BuiltValueField(wireName: 'submission') - SubmissionWrapper? get submissionWrapper; - - /// This is used specifically for the observer -> assignment list case (all observee submissions are returned) - /// If you are using the assignment/submission model for any other case use submissionWrapper.submission above. - Submission? submission(String? studentId) => - submissionWrapper?.submissionList?.firstWhereOrNull((submission) => submission.userId == studentId); - - @BuiltValueField(wireName: 'assignment_group_id') - String get assignmentGroupId; - - int get position; - - @BuiltValueField(wireName: 'lock_info') - LockInfo? get lockInfo; - - @BuiltValueField(wireName: 'locked_for_user') - bool get lockedForUser; - - @BuiltValueField(wireName: 'lock_at') - DateTime? get lockAt; // Date the teacher no longer accepts submissions. - - @BuiltValueField(wireName: 'unlock_at') - DateTime? get unlockAt; - - @BuiltValueField(wireName: 'lock_explanation') - String? get lockExplanation; - - @BuiltValueField(wireName: 'free_form_criterion_comments') - bool get freeFormCriterionComments; - - bool get published; - - @BuiltValueField(wireName: 'group_category_id') - String? get groupCategoryId; - - @BuiltValueField(wireName: 'user_submitted') - bool get userSubmitted; - - @BuiltValueField(wireName: 'only_visible_to_overrides') - bool get onlyVisibleToOverrides; - - @BuiltValueField(wireName: 'anonymous_peer_reviews') - bool get anonymousPeerReviews; - - @BuiltValueField(wireName: 'moderated_grading') - bool get moderatedGrading; - - @BuiltValueField(wireName: 'anonymous_grading') - bool get anonymousGrading; - - bool get isStudioEnabled; - - @BuiltValueField(wireName: 'submission_types') - BuiltList? get submissionTypes; - - @BuiltValueField(wireName: 'hide_in_gradebook') - bool? get isHiddenInGradeBook; - - static void _initializeBuilder(AssignmentBuilder b) => b - ..pointsPossible = 0.0 - ..useRubricForGrading = false - ..lockedForUser = false - ..freeFormCriterionComments = false - ..published = false - ..userSubmitted = false - ..onlyVisibleToOverrides = false - ..anonymousPeerReviews = false - ..moderatedGrading = false - ..anonymousGrading = false - ..isStudioEnabled = false; - - @BuiltValueField(serialize: false) - bool get isFullyLocked { - if (lockInfo == null || lockInfo?.isEmpty == true) return false; - if (lockInfo!.hasModuleName) return true; - if (lockInfo!.unlockAt != null && lockInfo!.unlockAt!.isAfter(DateTime.now())) return true; - return false; - } - - bool isSubmittable() => - submissionTypes?.every((type) => type == SubmissionTypes.onPaper || type == SubmissionTypes.none) != true; - - SubmissionStatus getStatus({required String? studentId}) { - final submission = this.submission(studentId); - if ((!isSubmittable() && submission == null) || (!isSubmittable() && submission?.isGraded() == false)) { - return SubmissionStatus.NONE; - } else if (submission?.isLate == true) { - return SubmissionStatus.LATE; - } else if (_isMissingSubmission(studentId)) { - return SubmissionStatus.MISSING; - } else if (submission?.submittedAt == null && (submission?.isGraded() ?? false) == false) { - return SubmissionStatus.NOT_SUBMITTED; - } else { - return SubmissionStatus.SUBMITTED; - } - } - - // Returns true if the submission is marked as missing, or if it's pass due and either no submission or 'fake' submission - bool _isMissingSubmission(String? studentId) { - final submission = this.submission(studentId); - if (submission?.missing == true) return true; - - // Don't mark LTI assignments as missing when overdue as they usually won't have a real submission for it - if (submissionTypes?.contains(SubmissionTypes.externalTool) == true) return false; - - final isPastDue = dueAt?.isBefore(DateTime.now()) == true; - return isPastDue && (submission == null || (submission.attempt == 0 && submission.grade == null)); - } - - bool get isDiscussion => submissionTypes?.contains(SubmissionTypes.discussionTopic) ?? false; - - bool get isQuiz => submissionTypes?.contains(SubmissionTypes.onlineQuiz) ?? false; - - bool isGradingTypeQuantitative() { - return gradingType == GradingType.points || gradingType == GradingType.percent; - } -} - -@BuiltValueEnum(wireName: 'grading_type') -class GradingType extends EnumClass { - const GradingType._(String name) : super(name); - - static BuiltSet get values => _$gradingTypeValues; - - static GradingType valueOf(String name) => _$gradingTypeValueOf(name); - - static Serializer get serializer => _$gradingTypeSerializer; - - @BuiltValueEnumConst(wireName: 'pass_fail') - static const GradingType passFail = _$gradingTypePassFail; - - @BuiltValueEnumConst(wireName: 'percent') - static const GradingType percent = _$gradingTypePercent; - - @BuiltValueEnumConst(wireName: 'letter_grade') - static const GradingType letterGrade = _$gradingTypeLetterGrade; - - @BuiltValueEnumConst(wireName: 'points') - static const GradingType points = _$gradingTypePoints; - - @BuiltValueEnumConst(wireName: 'gpa_scale') - static const GradingType gpaScale = _$gradingTypeGpaScale; - - @BuiltValueEnumConst(wireName: 'not_graded') - static const GradingType notGraded = _$gradingTypeNotGraded; - - @BuiltValueEnumConst(fallback: true) - static const GradingType other = _$gradingTypeOther; -} - -@BuiltValueEnum(wireName: 'submission_types') -class SubmissionTypes extends EnumClass { - const SubmissionTypes._(String name) : super(name); - - static BuiltSet get values => _$submissionTypesValues; - - static SubmissionTypes valueOf(String name) => _$submissionTypesValueOf(name); - - static Serializer get serializer => _$submissionTypesSerializer; - - @BuiltValueEnumConst(wireName: 'discussion_topic') - static const SubmissionTypes discussionTopic = _$submissionTypesDiscussionTopic; - - @BuiltValueEnumConst(wireName: 'online_quiz') - static const SubmissionTypes onlineQuiz = _$submissionTypesOnlineQuiz; - - @BuiltValueEnumConst(wireName: 'on_paper') - static const SubmissionTypes onPaper = _$submissionTypesOnPaper; - - @BuiltValueEnumConst(fallback: true) - static const SubmissionTypes none = _$submissionTypesNone; - - @BuiltValueEnumConst(wireName: 'external_tool') - static const SubmissionTypes externalTool = _$submissionTypesExternalTool; - - @BuiltValueEnumConst(wireName: 'online_text_entry') - static const SubmissionTypes onlineTextEntry = _$submissionTypesOnlineTextEntry; - - @BuiltValueEnumConst(wireName: 'online_url') - static const SubmissionTypes onlineUrl = _$submissionTypesOnlineUrl; - - @BuiltValueEnumConst(wireName: 'online_upload') - static const SubmissionTypes onlineUpload = _$submissionTypesOnlineUpload; - - @BuiltValueEnumConst(wireName: 'media_recording') - static const SubmissionTypes mediaRecording = _$submissionTypesMediaRecording; -} - -/// Internal enum for determining the assignment's submission status, NONE represents on_paper and none submission types -enum SubmissionStatus { LATE, MISSING, SUBMITTED, NOT_SUBMITTED, NONE } diff --git a/apps/flutter_parent/lib/models/assignment.g.dart b/apps/flutter_parent/lib/models/assignment.g.dart deleted file mode 100644 index dd5c864e4c..0000000000 --- a/apps/flutter_parent/lib/models/assignment.g.dart +++ /dev/null @@ -1,984 +0,0 @@ -// GENERATED CODE - DO NOT MODIFY BY HAND - -part of 'assignment.dart'; - -// ************************************************************************** -// BuiltValueGenerator -// ************************************************************************** - -const GradingType _$gradingTypePassFail = const GradingType._('passFail'); -const GradingType _$gradingTypePercent = const GradingType._('percent'); -const GradingType _$gradingTypeLetterGrade = const GradingType._('letterGrade'); -const GradingType _$gradingTypePoints = const GradingType._('points'); -const GradingType _$gradingTypeGpaScale = const GradingType._('gpaScale'); -const GradingType _$gradingTypeNotGraded = const GradingType._('notGraded'); -const GradingType _$gradingTypeOther = const GradingType._('other'); - -GradingType _$gradingTypeValueOf(String name) { - switch (name) { - case 'passFail': - return _$gradingTypePassFail; - case 'percent': - return _$gradingTypePercent; - case 'letterGrade': - return _$gradingTypeLetterGrade; - case 'points': - return _$gradingTypePoints; - case 'gpaScale': - return _$gradingTypeGpaScale; - case 'notGraded': - return _$gradingTypeNotGraded; - case 'other': - return _$gradingTypeOther; - default: - return _$gradingTypeOther; - } -} - -final BuiltSet _$gradingTypeValues = - new BuiltSet(const [ - _$gradingTypePassFail, - _$gradingTypePercent, - _$gradingTypeLetterGrade, - _$gradingTypePoints, - _$gradingTypeGpaScale, - _$gradingTypeNotGraded, - _$gradingTypeOther, -]); - -const SubmissionTypes _$submissionTypesDiscussionTopic = - const SubmissionTypes._('discussionTopic'); -const SubmissionTypes _$submissionTypesOnlineQuiz = - const SubmissionTypes._('onlineQuiz'); -const SubmissionTypes _$submissionTypesOnPaper = - const SubmissionTypes._('onPaper'); -const SubmissionTypes _$submissionTypesNone = const SubmissionTypes._('none'); -const SubmissionTypes _$submissionTypesExternalTool = - const SubmissionTypes._('externalTool'); -const SubmissionTypes _$submissionTypesOnlineTextEntry = - const SubmissionTypes._('onlineTextEntry'); -const SubmissionTypes _$submissionTypesOnlineUrl = - const SubmissionTypes._('onlineUrl'); -const SubmissionTypes _$submissionTypesOnlineUpload = - const SubmissionTypes._('onlineUpload'); -const SubmissionTypes _$submissionTypesMediaRecording = - const SubmissionTypes._('mediaRecording'); - -SubmissionTypes _$submissionTypesValueOf(String name) { - switch (name) { - case 'discussionTopic': - return _$submissionTypesDiscussionTopic; - case 'onlineQuiz': - return _$submissionTypesOnlineQuiz; - case 'onPaper': - return _$submissionTypesOnPaper; - case 'none': - return _$submissionTypesNone; - case 'externalTool': - return _$submissionTypesExternalTool; - case 'onlineTextEntry': - return _$submissionTypesOnlineTextEntry; - case 'onlineUrl': - return _$submissionTypesOnlineUrl; - case 'onlineUpload': - return _$submissionTypesOnlineUpload; - case 'mediaRecording': - return _$submissionTypesMediaRecording; - default: - return _$submissionTypesNone; - } -} - -final BuiltSet _$submissionTypesValues = - new BuiltSet(const [ - _$submissionTypesDiscussionTopic, - _$submissionTypesOnlineQuiz, - _$submissionTypesOnPaper, - _$submissionTypesNone, - _$submissionTypesExternalTool, - _$submissionTypesOnlineTextEntry, - _$submissionTypesOnlineUrl, - _$submissionTypesOnlineUpload, - _$submissionTypesMediaRecording, -]); - -Serializer _$assignmentSerializer = new _$AssignmentSerializer(); -Serializer _$gradingTypeSerializer = new _$GradingTypeSerializer(); -Serializer _$submissionTypesSerializer = - new _$SubmissionTypesSerializer(); - -class _$AssignmentSerializer implements StructuredSerializer { - @override - final Iterable types = const [Assignment, _$Assignment]; - @override - final String wireName = 'Assignment'; - - @override - Iterable serialize(Serializers serializers, Assignment object, - {FullType specifiedType = FullType.unspecified}) { - final result = [ - 'id', - serializers.serialize(object.id, specifiedType: const FullType(String)), - 'points_possible', - serializers.serialize(object.pointsPossible, - specifiedType: const FullType(double)), - 'course_id', - serializers.serialize(object.courseId, - specifiedType: const FullType(String)), - 'use_rubric_for_grading', - serializers.serialize(object.useRubricForGrading, - specifiedType: const FullType(bool)), - 'assignment_group_id', - serializers.serialize(object.assignmentGroupId, - specifiedType: const FullType(String)), - 'position', - serializers.serialize(object.position, - specifiedType: const FullType(int)), - 'locked_for_user', - serializers.serialize(object.lockedForUser, - specifiedType: const FullType(bool)), - 'free_form_criterion_comments', - serializers.serialize(object.freeFormCriterionComments, - specifiedType: const FullType(bool)), - 'published', - serializers.serialize(object.published, - specifiedType: const FullType(bool)), - 'user_submitted', - serializers.serialize(object.userSubmitted, - specifiedType: const FullType(bool)), - 'only_visible_to_overrides', - serializers.serialize(object.onlyVisibleToOverrides, - specifiedType: const FullType(bool)), - 'anonymous_peer_reviews', - serializers.serialize(object.anonymousPeerReviews, - specifiedType: const FullType(bool)), - 'moderated_grading', - serializers.serialize(object.moderatedGrading, - specifiedType: const FullType(bool)), - 'anonymous_grading', - serializers.serialize(object.anonymousGrading, - specifiedType: const FullType(bool)), - 'isStudioEnabled', - serializers.serialize(object.isStudioEnabled, - specifiedType: const FullType(bool)), - ]; - Object? value; - value = object.name; - - result - ..add('name') - ..add( - serializers.serialize(value, specifiedType: const FullType(String))); - value = object.description; - - result - ..add('description') - ..add( - serializers.serialize(value, specifiedType: const FullType(String))); - value = object.dueAt; - - result - ..add('due_at') - ..add(serializers.serialize(value, - specifiedType: const FullType(DateTime))); - value = object.gradingType; - - result - ..add('grading_type') - ..add(serializers.serialize(value, - specifiedType: const FullType(GradingType))); - value = object.htmlUrl; - - result - ..add('html_url') - ..add( - serializers.serialize(value, specifiedType: const FullType(String))); - value = object.url; - - result - ..add('url') - ..add( - serializers.serialize(value, specifiedType: const FullType(String))); - value = object.quizId; - - result - ..add('quiz_id') - ..add( - serializers.serialize(value, specifiedType: const FullType(String))); - value = object.submissionWrapper; - - result - ..add('submission') - ..add(serializers.serialize(value, - specifiedType: const FullType(SubmissionWrapper))); - value = object.lockInfo; - - result - ..add('lock_info') - ..add(serializers.serialize(value, - specifiedType: const FullType(LockInfo))); - value = object.lockAt; - - result - ..add('lock_at') - ..add(serializers.serialize(value, - specifiedType: const FullType(DateTime))); - value = object.unlockAt; - - result - ..add('unlock_at') - ..add(serializers.serialize(value, - specifiedType: const FullType(DateTime))); - value = object.lockExplanation; - - result - ..add('lock_explanation') - ..add( - serializers.serialize(value, specifiedType: const FullType(String))); - value = object.groupCategoryId; - - result - ..add('group_category_id') - ..add( - serializers.serialize(value, specifiedType: const FullType(String))); - value = object.submissionTypes; - - result - ..add('submission_types') - ..add(serializers.serialize(value, - specifiedType: const FullType( - BuiltList, const [const FullType(SubmissionTypes)]))); - value = object.isHiddenInGradeBook; - - result - ..add('hide_in_gradebook') - ..add(serializers.serialize(value, specifiedType: const FullType(bool))); - - return result; - } - - @override - Assignment deserialize(Serializers serializers, Iterable serialized, - {FullType specifiedType = FullType.unspecified}) { - final result = new AssignmentBuilder(); - - final iterator = serialized.iterator; - while (iterator.moveNext()) { - final key = iterator.current! as String; - iterator.moveNext(); - final Object? value = iterator.current; - switch (key) { - case 'id': - result.id = serializers.deserialize(value, - specifiedType: const FullType(String))! as String; - break; - case 'name': - result.name = serializers.deserialize(value, - specifiedType: const FullType(String)) as String?; - break; - case 'description': - result.description = serializers.deserialize(value, - specifiedType: const FullType(String)) as String?; - break; - case 'due_at': - result.dueAt = serializers.deserialize(value, - specifiedType: const FullType(DateTime)) as DateTime?; - break; - case 'points_possible': - result.pointsPossible = serializers.deserialize(value, - specifiedType: const FullType(double))! as double; - break; - case 'course_id': - result.courseId = serializers.deserialize(value, - specifiedType: const FullType(String))! as String; - break; - case 'grading_type': - result.gradingType = serializers.deserialize(value, - specifiedType: const FullType(GradingType)) as GradingType?; - break; - case 'html_url': - result.htmlUrl = serializers.deserialize(value, - specifiedType: const FullType(String)) as String?; - break; - case 'url': - result.url = serializers.deserialize(value, - specifiedType: const FullType(String)) as String?; - break; - case 'quiz_id': - result.quizId = serializers.deserialize(value, - specifiedType: const FullType(String)) as String?; - break; - case 'use_rubric_for_grading': - result.useRubricForGrading = serializers.deserialize(value, - specifiedType: const FullType(bool))! as bool; - break; - case 'submission': - result.submissionWrapper.replace(serializers.deserialize(value, - specifiedType: const FullType(SubmissionWrapper))! - as SubmissionWrapper); - break; - case 'assignment_group_id': - result.assignmentGroupId = serializers.deserialize(value, - specifiedType: const FullType(String))! as String; - break; - case 'position': - result.position = serializers.deserialize(value, - specifiedType: const FullType(int))! as int; - break; - case 'lock_info': - result.lockInfo.replace(serializers.deserialize(value, - specifiedType: const FullType(LockInfo))! as LockInfo); - break; - case 'locked_for_user': - result.lockedForUser = serializers.deserialize(value, - specifiedType: const FullType(bool))! as bool; - break; - case 'lock_at': - result.lockAt = serializers.deserialize(value, - specifiedType: const FullType(DateTime)) as DateTime?; - break; - case 'unlock_at': - result.unlockAt = serializers.deserialize(value, - specifiedType: const FullType(DateTime)) as DateTime?; - break; - case 'lock_explanation': - result.lockExplanation = serializers.deserialize(value, - specifiedType: const FullType(String)) as String?; - break; - case 'free_form_criterion_comments': - result.freeFormCriterionComments = serializers.deserialize(value, - specifiedType: const FullType(bool))! as bool; - break; - case 'published': - result.published = serializers.deserialize(value, - specifiedType: const FullType(bool))! as bool; - break; - case 'group_category_id': - result.groupCategoryId = serializers.deserialize(value, - specifiedType: const FullType(String)) as String?; - break; - case 'user_submitted': - result.userSubmitted = serializers.deserialize(value, - specifiedType: const FullType(bool))! as bool; - break; - case 'only_visible_to_overrides': - result.onlyVisibleToOverrides = serializers.deserialize(value, - specifiedType: const FullType(bool))! as bool; - break; - case 'anonymous_peer_reviews': - result.anonymousPeerReviews = serializers.deserialize(value, - specifiedType: const FullType(bool))! as bool; - break; - case 'moderated_grading': - result.moderatedGrading = serializers.deserialize(value, - specifiedType: const FullType(bool))! as bool; - break; - case 'anonymous_grading': - result.anonymousGrading = serializers.deserialize(value, - specifiedType: const FullType(bool))! as bool; - break; - case 'isStudioEnabled': - result.isStudioEnabled = serializers.deserialize(value, - specifiedType: const FullType(bool))! as bool; - break; - case 'submission_types': - result.submissionTypes.replace(serializers.deserialize(value, - specifiedType: const FullType( - BuiltList, const [const FullType(SubmissionTypes)]))! - as BuiltList); - break; - case 'hide_in_gradebook': - result.isHiddenInGradeBook = serializers.deserialize(value, - specifiedType: const FullType(bool)) as bool?; - break; - } - } - - return result.build(); - } -} - -class _$GradingTypeSerializer implements PrimitiveSerializer { - static const Map _toWire = const { - 'passFail': 'pass_fail', - 'percent': 'percent', - 'letterGrade': 'letter_grade', - 'points': 'points', - 'gpaScale': 'gpa_scale', - 'notGraded': 'not_graded', - }; - static const Map _fromWire = const { - 'pass_fail': 'passFail', - 'percent': 'percent', - 'letter_grade': 'letterGrade', - 'points': 'points', - 'gpa_scale': 'gpaScale', - 'not_graded': 'notGraded', - }; - - @override - final Iterable types = const [GradingType]; - @override - final String wireName = 'grading_type'; - - @override - Object serialize(Serializers serializers, GradingType object, - {FullType specifiedType = FullType.unspecified}) => - _toWire[object.name] ?? object.name; - - @override - GradingType deserialize(Serializers serializers, Object serialized, - {FullType specifiedType = FullType.unspecified}) => - GradingType.valueOf( - _fromWire[serialized] ?? (serialized is String ? serialized : '')); -} - -class _$SubmissionTypesSerializer - implements PrimitiveSerializer { - static const Map _toWire = const { - 'discussionTopic': 'discussion_topic', - 'onlineQuiz': 'online_quiz', - 'onPaper': 'on_paper', - 'externalTool': 'external_tool', - 'onlineTextEntry': 'online_text_entry', - 'onlineUrl': 'online_url', - 'onlineUpload': 'online_upload', - 'mediaRecording': 'media_recording', - }; - static const Map _fromWire = const { - 'discussion_topic': 'discussionTopic', - 'online_quiz': 'onlineQuiz', - 'on_paper': 'onPaper', - 'external_tool': 'externalTool', - 'online_text_entry': 'onlineTextEntry', - 'online_url': 'onlineUrl', - 'online_upload': 'onlineUpload', - 'media_recording': 'mediaRecording', - }; - - @override - final Iterable types = const [SubmissionTypes]; - @override - final String wireName = 'submission_types'; - - @override - Object serialize(Serializers serializers, SubmissionTypes object, - {FullType specifiedType = FullType.unspecified}) => - _toWire[object.name] ?? object.name; - - @override - SubmissionTypes deserialize(Serializers serializers, Object serialized, - {FullType specifiedType = FullType.unspecified}) => - SubmissionTypes.valueOf( - _fromWire[serialized] ?? (serialized is String ? serialized : '')); -} - -class _$Assignment extends Assignment { - @override - final String id; - @override - final String? name; - @override - final String? description; - @override - final DateTime? dueAt; - @override - final double pointsPossible; - @override - final String courseId; - @override - final GradingType? gradingType; - @override - final String? htmlUrl; - @override - final String? url; - @override - final String? quizId; - @override - final bool useRubricForGrading; - @override - final SubmissionWrapper? submissionWrapper; - @override - final String assignmentGroupId; - @override - final int position; - @override - final LockInfo? lockInfo; - @override - final bool lockedForUser; - @override - final DateTime? lockAt; - @override - final DateTime? unlockAt; - @override - final String? lockExplanation; - @override - final bool freeFormCriterionComments; - @override - final bool published; - @override - final String? groupCategoryId; - @override - final bool userSubmitted; - @override - final bool onlyVisibleToOverrides; - @override - final bool anonymousPeerReviews; - @override - final bool moderatedGrading; - @override - final bool anonymousGrading; - @override - final bool isStudioEnabled; - @override - final BuiltList? submissionTypes; - @override - final bool? isHiddenInGradeBook; - - factory _$Assignment([void Function(AssignmentBuilder)? updates]) => - (new AssignmentBuilder()..update(updates))._build(); - - _$Assignment._( - {required this.id, - this.name, - this.description, - this.dueAt, - required this.pointsPossible, - required this.courseId, - this.gradingType, - this.htmlUrl, - this.url, - this.quizId, - required this.useRubricForGrading, - this.submissionWrapper, - required this.assignmentGroupId, - required this.position, - this.lockInfo, - required this.lockedForUser, - this.lockAt, - this.unlockAt, - this.lockExplanation, - required this.freeFormCriterionComments, - required this.published, - this.groupCategoryId, - required this.userSubmitted, - required this.onlyVisibleToOverrides, - required this.anonymousPeerReviews, - required this.moderatedGrading, - required this.anonymousGrading, - required this.isStudioEnabled, - this.submissionTypes, - this.isHiddenInGradeBook}) - : super._() { - BuiltValueNullFieldError.checkNotNull(id, r'Assignment', 'id'); - BuiltValueNullFieldError.checkNotNull( - pointsPossible, r'Assignment', 'pointsPossible'); - BuiltValueNullFieldError.checkNotNull(courseId, r'Assignment', 'courseId'); - BuiltValueNullFieldError.checkNotNull( - useRubricForGrading, r'Assignment', 'useRubricForGrading'); - BuiltValueNullFieldError.checkNotNull( - assignmentGroupId, r'Assignment', 'assignmentGroupId'); - BuiltValueNullFieldError.checkNotNull(position, r'Assignment', 'position'); - BuiltValueNullFieldError.checkNotNull( - lockedForUser, r'Assignment', 'lockedForUser'); - BuiltValueNullFieldError.checkNotNull( - freeFormCriterionComments, r'Assignment', 'freeFormCriterionComments'); - BuiltValueNullFieldError.checkNotNull( - published, r'Assignment', 'published'); - BuiltValueNullFieldError.checkNotNull( - userSubmitted, r'Assignment', 'userSubmitted'); - BuiltValueNullFieldError.checkNotNull( - onlyVisibleToOverrides, r'Assignment', 'onlyVisibleToOverrides'); - BuiltValueNullFieldError.checkNotNull( - anonymousPeerReviews, r'Assignment', 'anonymousPeerReviews'); - BuiltValueNullFieldError.checkNotNull( - moderatedGrading, r'Assignment', 'moderatedGrading'); - BuiltValueNullFieldError.checkNotNull( - anonymousGrading, r'Assignment', 'anonymousGrading'); - BuiltValueNullFieldError.checkNotNull( - isStudioEnabled, r'Assignment', 'isStudioEnabled'); - } - - @override - Assignment rebuild(void Function(AssignmentBuilder) updates) => - (toBuilder()..update(updates)).build(); - - @override - AssignmentBuilder toBuilder() => new AssignmentBuilder()..replace(this); - - @override - bool operator ==(Object other) { - if (identical(other, this)) return true; - return other is Assignment && - id == other.id && - name == other.name && - description == other.description && - dueAt == other.dueAt && - pointsPossible == other.pointsPossible && - courseId == other.courseId && - gradingType == other.gradingType && - htmlUrl == other.htmlUrl && - url == other.url && - quizId == other.quizId && - useRubricForGrading == other.useRubricForGrading && - submissionWrapper == other.submissionWrapper && - assignmentGroupId == other.assignmentGroupId && - position == other.position && - lockInfo == other.lockInfo && - lockedForUser == other.lockedForUser && - lockAt == other.lockAt && - unlockAt == other.unlockAt && - lockExplanation == other.lockExplanation && - freeFormCriterionComments == other.freeFormCriterionComments && - published == other.published && - groupCategoryId == other.groupCategoryId && - userSubmitted == other.userSubmitted && - onlyVisibleToOverrides == other.onlyVisibleToOverrides && - anonymousPeerReviews == other.anonymousPeerReviews && - moderatedGrading == other.moderatedGrading && - anonymousGrading == other.anonymousGrading && - isStudioEnabled == other.isStudioEnabled && - submissionTypes == other.submissionTypes && - isHiddenInGradeBook == other.isHiddenInGradeBook; - } - - @override - int get hashCode { - var _$hash = 0; - _$hash = $jc(_$hash, id.hashCode); - _$hash = $jc(_$hash, name.hashCode); - _$hash = $jc(_$hash, description.hashCode); - _$hash = $jc(_$hash, dueAt.hashCode); - _$hash = $jc(_$hash, pointsPossible.hashCode); - _$hash = $jc(_$hash, courseId.hashCode); - _$hash = $jc(_$hash, gradingType.hashCode); - _$hash = $jc(_$hash, htmlUrl.hashCode); - _$hash = $jc(_$hash, url.hashCode); - _$hash = $jc(_$hash, quizId.hashCode); - _$hash = $jc(_$hash, useRubricForGrading.hashCode); - _$hash = $jc(_$hash, submissionWrapper.hashCode); - _$hash = $jc(_$hash, assignmentGroupId.hashCode); - _$hash = $jc(_$hash, position.hashCode); - _$hash = $jc(_$hash, lockInfo.hashCode); - _$hash = $jc(_$hash, lockedForUser.hashCode); - _$hash = $jc(_$hash, lockAt.hashCode); - _$hash = $jc(_$hash, unlockAt.hashCode); - _$hash = $jc(_$hash, lockExplanation.hashCode); - _$hash = $jc(_$hash, freeFormCriterionComments.hashCode); - _$hash = $jc(_$hash, published.hashCode); - _$hash = $jc(_$hash, groupCategoryId.hashCode); - _$hash = $jc(_$hash, userSubmitted.hashCode); - _$hash = $jc(_$hash, onlyVisibleToOverrides.hashCode); - _$hash = $jc(_$hash, anonymousPeerReviews.hashCode); - _$hash = $jc(_$hash, moderatedGrading.hashCode); - _$hash = $jc(_$hash, anonymousGrading.hashCode); - _$hash = $jc(_$hash, isStudioEnabled.hashCode); - _$hash = $jc(_$hash, submissionTypes.hashCode); - _$hash = $jc(_$hash, isHiddenInGradeBook.hashCode); - _$hash = $jf(_$hash); - return _$hash; - } - - @override - String toString() { - return (newBuiltValueToStringHelper(r'Assignment') - ..add('id', id) - ..add('name', name) - ..add('description', description) - ..add('dueAt', dueAt) - ..add('pointsPossible', pointsPossible) - ..add('courseId', courseId) - ..add('gradingType', gradingType) - ..add('htmlUrl', htmlUrl) - ..add('url', url) - ..add('quizId', quizId) - ..add('useRubricForGrading', useRubricForGrading) - ..add('submissionWrapper', submissionWrapper) - ..add('assignmentGroupId', assignmentGroupId) - ..add('position', position) - ..add('lockInfo', lockInfo) - ..add('lockedForUser', lockedForUser) - ..add('lockAt', lockAt) - ..add('unlockAt', unlockAt) - ..add('lockExplanation', lockExplanation) - ..add('freeFormCriterionComments', freeFormCriterionComments) - ..add('published', published) - ..add('groupCategoryId', groupCategoryId) - ..add('userSubmitted', userSubmitted) - ..add('onlyVisibleToOverrides', onlyVisibleToOverrides) - ..add('anonymousPeerReviews', anonymousPeerReviews) - ..add('moderatedGrading', moderatedGrading) - ..add('anonymousGrading', anonymousGrading) - ..add('isStudioEnabled', isStudioEnabled) - ..add('submissionTypes', submissionTypes) - ..add('isHiddenInGradeBook', isHiddenInGradeBook)) - .toString(); - } -} - -class AssignmentBuilder implements Builder { - _$Assignment? _$v; - - String? _id; - String? get id => _$this._id; - set id(String? id) => _$this._id = id; - - String? _name; - String? get name => _$this._name; - set name(String? name) => _$this._name = name; - - String? _description; - String? get description => _$this._description; - set description(String? description) => _$this._description = description; - - DateTime? _dueAt; - DateTime? get dueAt => _$this._dueAt; - set dueAt(DateTime? dueAt) => _$this._dueAt = dueAt; - - double? _pointsPossible; - double? get pointsPossible => _$this._pointsPossible; - set pointsPossible(double? pointsPossible) => - _$this._pointsPossible = pointsPossible; - - String? _courseId; - String? get courseId => _$this._courseId; - set courseId(String? courseId) => _$this._courseId = courseId; - - GradingType? _gradingType; - GradingType? get gradingType => _$this._gradingType; - set gradingType(GradingType? gradingType) => - _$this._gradingType = gradingType; - - String? _htmlUrl; - String? get htmlUrl => _$this._htmlUrl; - set htmlUrl(String? htmlUrl) => _$this._htmlUrl = htmlUrl; - - String? _url; - String? get url => _$this._url; - set url(String? url) => _$this._url = url; - - String? _quizId; - String? get quizId => _$this._quizId; - set quizId(String? quizId) => _$this._quizId = quizId; - - bool? _useRubricForGrading; - bool? get useRubricForGrading => _$this._useRubricForGrading; - set useRubricForGrading(bool? useRubricForGrading) => - _$this._useRubricForGrading = useRubricForGrading; - - SubmissionWrapperBuilder? _submissionWrapper; - SubmissionWrapperBuilder get submissionWrapper => - _$this._submissionWrapper ??= new SubmissionWrapperBuilder(); - set submissionWrapper(SubmissionWrapperBuilder? submissionWrapper) => - _$this._submissionWrapper = submissionWrapper; - - String? _assignmentGroupId; - String? get assignmentGroupId => _$this._assignmentGroupId; - set assignmentGroupId(String? assignmentGroupId) => - _$this._assignmentGroupId = assignmentGroupId; - - int? _position; - int? get position => _$this._position; - set position(int? position) => _$this._position = position; - - LockInfoBuilder? _lockInfo; - LockInfoBuilder get lockInfo => _$this._lockInfo ??= new LockInfoBuilder(); - set lockInfo(LockInfoBuilder? lockInfo) => _$this._lockInfo = lockInfo; - - bool? _lockedForUser; - bool? get lockedForUser => _$this._lockedForUser; - set lockedForUser(bool? lockedForUser) => - _$this._lockedForUser = lockedForUser; - - DateTime? _lockAt; - DateTime? get lockAt => _$this._lockAt; - set lockAt(DateTime? lockAt) => _$this._lockAt = lockAt; - - DateTime? _unlockAt; - DateTime? get unlockAt => _$this._unlockAt; - set unlockAt(DateTime? unlockAt) => _$this._unlockAt = unlockAt; - - String? _lockExplanation; - String? get lockExplanation => _$this._lockExplanation; - set lockExplanation(String? lockExplanation) => - _$this._lockExplanation = lockExplanation; - - bool? _freeFormCriterionComments; - bool? get freeFormCriterionComments => _$this._freeFormCriterionComments; - set freeFormCriterionComments(bool? freeFormCriterionComments) => - _$this._freeFormCriterionComments = freeFormCriterionComments; - - bool? _published; - bool? get published => _$this._published; - set published(bool? published) => _$this._published = published; - - String? _groupCategoryId; - String? get groupCategoryId => _$this._groupCategoryId; - set groupCategoryId(String? groupCategoryId) => - _$this._groupCategoryId = groupCategoryId; - - bool? _userSubmitted; - bool? get userSubmitted => _$this._userSubmitted; - set userSubmitted(bool? userSubmitted) => - _$this._userSubmitted = userSubmitted; - - bool? _onlyVisibleToOverrides; - bool? get onlyVisibleToOverrides => _$this._onlyVisibleToOverrides; - set onlyVisibleToOverrides(bool? onlyVisibleToOverrides) => - _$this._onlyVisibleToOverrides = onlyVisibleToOverrides; - - bool? _anonymousPeerReviews; - bool? get anonymousPeerReviews => _$this._anonymousPeerReviews; - set anonymousPeerReviews(bool? anonymousPeerReviews) => - _$this._anonymousPeerReviews = anonymousPeerReviews; - - bool? _moderatedGrading; - bool? get moderatedGrading => _$this._moderatedGrading; - set moderatedGrading(bool? moderatedGrading) => - _$this._moderatedGrading = moderatedGrading; - - bool? _anonymousGrading; - bool? get anonymousGrading => _$this._anonymousGrading; - set anonymousGrading(bool? anonymousGrading) => - _$this._anonymousGrading = anonymousGrading; - - bool? _isStudioEnabled; - bool? get isStudioEnabled => _$this._isStudioEnabled; - set isStudioEnabled(bool? isStudioEnabled) => - _$this._isStudioEnabled = isStudioEnabled; - - ListBuilder? _submissionTypes; - ListBuilder get submissionTypes => - _$this._submissionTypes ??= new ListBuilder(); - set submissionTypes(ListBuilder? submissionTypes) => - _$this._submissionTypes = submissionTypes; - - bool? _isHiddenInGradeBook; - bool? get isHiddenInGradeBook => _$this._isHiddenInGradeBook; - set isHiddenInGradeBook(bool? isHiddenInGradeBook) => - _$this._isHiddenInGradeBook = isHiddenInGradeBook; - - AssignmentBuilder() { - Assignment._initializeBuilder(this); - } - - AssignmentBuilder get _$this { - final $v = _$v; - if ($v != null) { - _id = $v.id; - _name = $v.name; - _description = $v.description; - _dueAt = $v.dueAt; - _pointsPossible = $v.pointsPossible; - _courseId = $v.courseId; - _gradingType = $v.gradingType; - _htmlUrl = $v.htmlUrl; - _url = $v.url; - _quizId = $v.quizId; - _useRubricForGrading = $v.useRubricForGrading; - _submissionWrapper = $v.submissionWrapper?.toBuilder(); - _assignmentGroupId = $v.assignmentGroupId; - _position = $v.position; - _lockInfo = $v.lockInfo?.toBuilder(); - _lockedForUser = $v.lockedForUser; - _lockAt = $v.lockAt; - _unlockAt = $v.unlockAt; - _lockExplanation = $v.lockExplanation; - _freeFormCriterionComments = $v.freeFormCriterionComments; - _published = $v.published; - _groupCategoryId = $v.groupCategoryId; - _userSubmitted = $v.userSubmitted; - _onlyVisibleToOverrides = $v.onlyVisibleToOverrides; - _anonymousPeerReviews = $v.anonymousPeerReviews; - _moderatedGrading = $v.moderatedGrading; - _anonymousGrading = $v.anonymousGrading; - _isStudioEnabled = $v.isStudioEnabled; - _submissionTypes = $v.submissionTypes?.toBuilder(); - _isHiddenInGradeBook = $v.isHiddenInGradeBook; - _$v = null; - } - return this; - } - - @override - void replace(Assignment other) { - ArgumentError.checkNotNull(other, 'other'); - _$v = other as _$Assignment; - } - - @override - void update(void Function(AssignmentBuilder)? updates) { - if (updates != null) updates(this); - } - - @override - Assignment build() => _build(); - - _$Assignment _build() { - _$Assignment _$result; - try { - _$result = _$v ?? - new _$Assignment._( - id: BuiltValueNullFieldError.checkNotNull( - id, r'Assignment', 'id'), - name: name, - description: description, - dueAt: dueAt, - pointsPossible: BuiltValueNullFieldError.checkNotNull( - pointsPossible, r'Assignment', 'pointsPossible'), - courseId: BuiltValueNullFieldError.checkNotNull( - courseId, r'Assignment', 'courseId'), - gradingType: gradingType, - htmlUrl: htmlUrl, - url: url, - quizId: quizId, - useRubricForGrading: BuiltValueNullFieldError.checkNotNull( - useRubricForGrading, r'Assignment', 'useRubricForGrading'), - submissionWrapper: _submissionWrapper?.build(), - assignmentGroupId: BuiltValueNullFieldError.checkNotNull( - assignmentGroupId, r'Assignment', 'assignmentGroupId'), - position: BuiltValueNullFieldError.checkNotNull( - position, r'Assignment', 'position'), - lockInfo: _lockInfo?.build(), - lockedForUser: BuiltValueNullFieldError.checkNotNull( - lockedForUser, r'Assignment', 'lockedForUser'), - lockAt: lockAt, - unlockAt: unlockAt, - lockExplanation: lockExplanation, - freeFormCriterionComments: BuiltValueNullFieldError.checkNotNull( - freeFormCriterionComments, - r'Assignment', - 'freeFormCriterionComments'), - published: BuiltValueNullFieldError.checkNotNull(published, r'Assignment', 'published'), - groupCategoryId: groupCategoryId, - userSubmitted: BuiltValueNullFieldError.checkNotNull(userSubmitted, r'Assignment', 'userSubmitted'), - onlyVisibleToOverrides: BuiltValueNullFieldError.checkNotNull(onlyVisibleToOverrides, r'Assignment', 'onlyVisibleToOverrides'), - anonymousPeerReviews: BuiltValueNullFieldError.checkNotNull(anonymousPeerReviews, r'Assignment', 'anonymousPeerReviews'), - moderatedGrading: BuiltValueNullFieldError.checkNotNull(moderatedGrading, r'Assignment', 'moderatedGrading'), - anonymousGrading: BuiltValueNullFieldError.checkNotNull(anonymousGrading, r'Assignment', 'anonymousGrading'), - isStudioEnabled: BuiltValueNullFieldError.checkNotNull(isStudioEnabled, r'Assignment', 'isStudioEnabled'), - submissionTypes: _submissionTypes?.build(), - isHiddenInGradeBook: isHiddenInGradeBook); - } catch (_) { - late String _$failedField; - try { - _$failedField = 'submissionWrapper'; - _submissionWrapper?.build(); - - _$failedField = 'lockInfo'; - _lockInfo?.build(); - - _$failedField = 'submissionTypes'; - _submissionTypes?.build(); - } catch (e) { - throw new BuiltValueNestedFieldError( - r'Assignment', _$failedField, e.toString()); - } - rethrow; - } - replace(_$result); - return _$result; - } -} - -// ignore_for_file: deprecated_member_use_from_same_package,type=lint diff --git a/apps/flutter_parent/lib/models/assignment_group.dart b/apps/flutter_parent/lib/models/assignment_group.dart deleted file mode 100644 index 5039de801f..0000000000 --- a/apps/flutter_parent/lib/models/assignment_group.dart +++ /dev/null @@ -1,46 +0,0 @@ -// Copyright (C) 2019 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:built_collection/built_collection.dart'; -import 'package:built_value/built_value.dart'; -import 'package:built_value/serializer.dart'; -import 'package:flutter_parent/models/assignment.dart'; - -part 'assignment_group.g.dart'; - -/// To have this built_value be generated, run this command from the project root: -/// flutter packages pub run build_runner build --delete-conflicting-outputs -abstract class AssignmentGroup implements Built { - @BuiltValueSerializer(serializeNulls: true) - static Serializer get serializer => _$assignmentGroupSerializer; - - AssignmentGroup._(); - - factory AssignmentGroup([void Function(AssignmentGroupBuilder) updates]) = _$AssignmentGroup; - - String get id; - - String get name; - - int get position; - - @BuiltValueField(wireName: 'group_weight') - double get groupWeight; - - BuiltList get assignments; - - static void _initializeBuilder(AssignmentGroupBuilder b) => b - ..position = 0 - ..groupWeight = 0; -} diff --git a/apps/flutter_parent/lib/models/assignment_group.g.dart b/apps/flutter_parent/lib/models/assignment_group.g.dart deleted file mode 100644 index 9fe4fce4f7..0000000000 --- a/apps/flutter_parent/lib/models/assignment_group.g.dart +++ /dev/null @@ -1,245 +0,0 @@ -// GENERATED CODE - DO NOT MODIFY BY HAND - -part of 'assignment_group.dart'; - -// ************************************************************************** -// BuiltValueGenerator -// ************************************************************************** - -Serializer _$assignmentGroupSerializer = - new _$AssignmentGroupSerializer(); - -class _$AssignmentGroupSerializer - implements StructuredSerializer { - @override - final Iterable types = const [AssignmentGroup, _$AssignmentGroup]; - @override - final String wireName = 'AssignmentGroup'; - - @override - Iterable serialize(Serializers serializers, AssignmentGroup object, - {FullType specifiedType = FullType.unspecified}) { - final result = [ - 'id', - serializers.serialize(object.id, specifiedType: const FullType(String)), - 'name', - serializers.serialize(object.name, specifiedType: const FullType(String)), - 'position', - serializers.serialize(object.position, - specifiedType: const FullType(int)), - 'group_weight', - serializers.serialize(object.groupWeight, - specifiedType: const FullType(double)), - 'assignments', - serializers.serialize(object.assignments, - specifiedType: - const FullType(BuiltList, const [const FullType(Assignment)])), - ]; - - return result; - } - - @override - AssignmentGroup deserialize( - Serializers serializers, Iterable serialized, - {FullType specifiedType = FullType.unspecified}) { - final result = new AssignmentGroupBuilder(); - - final iterator = serialized.iterator; - while (iterator.moveNext()) { - final key = iterator.current! as String; - iterator.moveNext(); - final Object? value = iterator.current; - switch (key) { - case 'id': - result.id = serializers.deserialize(value, - specifiedType: const FullType(String))! as String; - break; - case 'name': - result.name = serializers.deserialize(value, - specifiedType: const FullType(String))! as String; - break; - case 'position': - result.position = serializers.deserialize(value, - specifiedType: const FullType(int))! as int; - break; - case 'group_weight': - result.groupWeight = serializers.deserialize(value, - specifiedType: const FullType(double))! as double; - break; - case 'assignments': - result.assignments.replace(serializers.deserialize(value, - specifiedType: const FullType( - BuiltList, const [const FullType(Assignment)]))! - as BuiltList); - break; - } - } - - return result.build(); - } -} - -class _$AssignmentGroup extends AssignmentGroup { - @override - final String id; - @override - final String name; - @override - final int position; - @override - final double groupWeight; - @override - final BuiltList assignments; - - factory _$AssignmentGroup([void Function(AssignmentGroupBuilder)? updates]) => - (new AssignmentGroupBuilder()..update(updates))._build(); - - _$AssignmentGroup._( - {required this.id, - required this.name, - required this.position, - required this.groupWeight, - required this.assignments}) - : super._() { - BuiltValueNullFieldError.checkNotNull(id, r'AssignmentGroup', 'id'); - BuiltValueNullFieldError.checkNotNull(name, r'AssignmentGroup', 'name'); - BuiltValueNullFieldError.checkNotNull( - position, r'AssignmentGroup', 'position'); - BuiltValueNullFieldError.checkNotNull( - groupWeight, r'AssignmentGroup', 'groupWeight'); - BuiltValueNullFieldError.checkNotNull( - assignments, r'AssignmentGroup', 'assignments'); - } - - @override - AssignmentGroup rebuild(void Function(AssignmentGroupBuilder) updates) => - (toBuilder()..update(updates)).build(); - - @override - AssignmentGroupBuilder toBuilder() => - new AssignmentGroupBuilder()..replace(this); - - @override - bool operator ==(Object other) { - if (identical(other, this)) return true; - return other is AssignmentGroup && - id == other.id && - name == other.name && - position == other.position && - groupWeight == other.groupWeight && - assignments == other.assignments; - } - - @override - int get hashCode { - var _$hash = 0; - _$hash = $jc(_$hash, id.hashCode); - _$hash = $jc(_$hash, name.hashCode); - _$hash = $jc(_$hash, position.hashCode); - _$hash = $jc(_$hash, groupWeight.hashCode); - _$hash = $jc(_$hash, assignments.hashCode); - _$hash = $jf(_$hash); - return _$hash; - } - - @override - String toString() { - return (newBuiltValueToStringHelper(r'AssignmentGroup') - ..add('id', id) - ..add('name', name) - ..add('position', position) - ..add('groupWeight', groupWeight) - ..add('assignments', assignments)) - .toString(); - } -} - -class AssignmentGroupBuilder - implements Builder { - _$AssignmentGroup? _$v; - - String? _id; - String? get id => _$this._id; - set id(String? id) => _$this._id = id; - - String? _name; - String? get name => _$this._name; - set name(String? name) => _$this._name = name; - - int? _position; - int? get position => _$this._position; - set position(int? position) => _$this._position = position; - - double? _groupWeight; - double? get groupWeight => _$this._groupWeight; - set groupWeight(double? groupWeight) => _$this._groupWeight = groupWeight; - - ListBuilder? _assignments; - ListBuilder get assignments => - _$this._assignments ??= new ListBuilder(); - set assignments(ListBuilder? assignments) => - _$this._assignments = assignments; - - AssignmentGroupBuilder() { - AssignmentGroup._initializeBuilder(this); - } - - AssignmentGroupBuilder get _$this { - final $v = _$v; - if ($v != null) { - _id = $v.id; - _name = $v.name; - _position = $v.position; - _groupWeight = $v.groupWeight; - _assignments = $v.assignments.toBuilder(); - _$v = null; - } - return this; - } - - @override - void replace(AssignmentGroup other) { - ArgumentError.checkNotNull(other, 'other'); - _$v = other as _$AssignmentGroup; - } - - @override - void update(void Function(AssignmentGroupBuilder)? updates) { - if (updates != null) updates(this); - } - - @override - AssignmentGroup build() => _build(); - - _$AssignmentGroup _build() { - _$AssignmentGroup _$result; - try { - _$result = _$v ?? - new _$AssignmentGroup._( - id: BuiltValueNullFieldError.checkNotNull( - id, r'AssignmentGroup', 'id'), - name: BuiltValueNullFieldError.checkNotNull( - name, r'AssignmentGroup', 'name'), - position: BuiltValueNullFieldError.checkNotNull( - position, r'AssignmentGroup', 'position'), - groupWeight: BuiltValueNullFieldError.checkNotNull( - groupWeight, r'AssignmentGroup', 'groupWeight'), - assignments: assignments.build()); - } catch (_) { - late String _$failedField; - try { - _$failedField = 'assignments'; - assignments.build(); - } catch (e) { - throw new BuiltValueNestedFieldError( - r'AssignmentGroup', _$failedField, e.toString()); - } - rethrow; - } - replace(_$result); - return _$result; - } -} - -// ignore_for_file: deprecated_member_use_from_same_package,type=lint diff --git a/apps/flutter_parent/lib/models/assignment_override.dart b/apps/flutter_parent/lib/models/assignment_override.dart deleted file mode 100644 index 1736192c1e..0000000000 --- a/apps/flutter_parent/lib/models/assignment_override.dart +++ /dev/null @@ -1,61 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:built_collection/built_collection.dart'; -import 'package:built_value/built_value.dart'; -import 'package:built_value/serializer.dart'; - -part 'assignment_override.g.dart'; - -/// To have this built_value be generated, run this command from the project root: -/// flutter pub run build_runner build --delete-conflicting-outputs -abstract class AssignmentOverride implements Built { - @BuiltValueSerializer(serializeNulls: true) // Add this line to get nulls to serialize when we convert to JSON - static Serializer get serializer => _$assignmentOverrideSerializer; - - @BuiltValueField(wireName: 'id') - String get id; - - @BuiltValueField(wireName: 'assignment_id') - String get assignmentId; - - @BuiltValueField(wireName: 'title') - String? get title; - - @BuiltValueField(wireName: 'due_at') - DateTime? get dueAt; - - @BuiltValueField(wireName: 'all_day') - bool? get allDay; - - @BuiltValueField(wireName: 'all_day_date') - DateTime? get allDayDate; - - @BuiltValueField(wireName: 'unlock_at') - DateTime? get unlockAt; - - @BuiltValueField(wireName: 'lock_at') - DateTime? get lockAt; - - @BuiltValueField(wireName: 'student_ids') - BuiltList get studentIds; - - AssignmentOverride._(); - factory AssignmentOverride([void Function(AssignmentOverrideBuilder) updates]) = _$AssignmentOverride; - - static void _initializeBuilder(AssignmentOverrideBuilder b) => b - ..id = '' - ..assignmentId = '' - ..studentIds = ListBuilder([]); -} diff --git a/apps/flutter_parent/lib/models/assignment_override.g.dart b/apps/flutter_parent/lib/models/assignment_override.g.dart deleted file mode 100644 index 4c8bcc6e64..0000000000 --- a/apps/flutter_parent/lib/models/assignment_override.g.dart +++ /dev/null @@ -1,338 +0,0 @@ -// GENERATED CODE - DO NOT MODIFY BY HAND - -part of 'assignment_override.dart'; - -// ************************************************************************** -// BuiltValueGenerator -// ************************************************************************** - -Serializer _$assignmentOverrideSerializer = - new _$AssignmentOverrideSerializer(); - -class _$AssignmentOverrideSerializer - implements StructuredSerializer { - @override - final Iterable types = const [AssignmentOverride, _$AssignmentOverride]; - @override - final String wireName = 'AssignmentOverride'; - - @override - Iterable serialize( - Serializers serializers, AssignmentOverride object, - {FullType specifiedType = FullType.unspecified}) { - final result = [ - 'id', - serializers.serialize(object.id, specifiedType: const FullType(String)), - 'assignment_id', - serializers.serialize(object.assignmentId, - specifiedType: const FullType(String)), - 'student_ids', - serializers.serialize(object.studentIds, - specifiedType: - const FullType(BuiltList, const [const FullType(String)])), - ]; - Object? value; - value = object.title; - - result - ..add('title') - ..add( - serializers.serialize(value, specifiedType: const FullType(String))); - value = object.dueAt; - - result - ..add('due_at') - ..add(serializers.serialize(value, - specifiedType: const FullType(DateTime))); - value = object.allDay; - - result - ..add('all_day') - ..add(serializers.serialize(value, specifiedType: const FullType(bool))); - value = object.allDayDate; - - result - ..add('all_day_date') - ..add(serializers.serialize(value, - specifiedType: const FullType(DateTime))); - value = object.unlockAt; - - result - ..add('unlock_at') - ..add(serializers.serialize(value, - specifiedType: const FullType(DateTime))); - value = object.lockAt; - - result - ..add('lock_at') - ..add(serializers.serialize(value, - specifiedType: const FullType(DateTime))); - - return result; - } - - @override - AssignmentOverride deserialize( - Serializers serializers, Iterable serialized, - {FullType specifiedType = FullType.unspecified}) { - final result = new AssignmentOverrideBuilder(); - - final iterator = serialized.iterator; - while (iterator.moveNext()) { - final key = iterator.current! as String; - iterator.moveNext(); - final Object? value = iterator.current; - switch (key) { - case 'id': - result.id = serializers.deserialize(value, - specifiedType: const FullType(String))! as String; - break; - case 'assignment_id': - result.assignmentId = serializers.deserialize(value, - specifiedType: const FullType(String))! as String; - break; - case 'title': - result.title = serializers.deserialize(value, - specifiedType: const FullType(String)) as String?; - break; - case 'due_at': - result.dueAt = serializers.deserialize(value, - specifiedType: const FullType(DateTime)) as DateTime?; - break; - case 'all_day': - result.allDay = serializers.deserialize(value, - specifiedType: const FullType(bool)) as bool?; - break; - case 'all_day_date': - result.allDayDate = serializers.deserialize(value, - specifiedType: const FullType(DateTime)) as DateTime?; - break; - case 'unlock_at': - result.unlockAt = serializers.deserialize(value, - specifiedType: const FullType(DateTime)) as DateTime?; - break; - case 'lock_at': - result.lockAt = serializers.deserialize(value, - specifiedType: const FullType(DateTime)) as DateTime?; - break; - case 'student_ids': - result.studentIds.replace(serializers.deserialize(value, - specifiedType: const FullType( - BuiltList, const [const FullType(String)]))! - as BuiltList); - break; - } - } - - return result.build(); - } -} - -class _$AssignmentOverride extends AssignmentOverride { - @override - final String id; - @override - final String assignmentId; - @override - final String? title; - @override - final DateTime? dueAt; - @override - final bool? allDay; - @override - final DateTime? allDayDate; - @override - final DateTime? unlockAt; - @override - final DateTime? lockAt; - @override - final BuiltList studentIds; - - factory _$AssignmentOverride( - [void Function(AssignmentOverrideBuilder)? updates]) => - (new AssignmentOverrideBuilder()..update(updates))._build(); - - _$AssignmentOverride._( - {required this.id, - required this.assignmentId, - this.title, - this.dueAt, - this.allDay, - this.allDayDate, - this.unlockAt, - this.lockAt, - required this.studentIds}) - : super._() { - BuiltValueNullFieldError.checkNotNull(id, r'AssignmentOverride', 'id'); - BuiltValueNullFieldError.checkNotNull( - assignmentId, r'AssignmentOverride', 'assignmentId'); - BuiltValueNullFieldError.checkNotNull( - studentIds, r'AssignmentOverride', 'studentIds'); - } - - @override - AssignmentOverride rebuild( - void Function(AssignmentOverrideBuilder) updates) => - (toBuilder()..update(updates)).build(); - - @override - AssignmentOverrideBuilder toBuilder() => - new AssignmentOverrideBuilder()..replace(this); - - @override - bool operator ==(Object other) { - if (identical(other, this)) return true; - return other is AssignmentOverride && - id == other.id && - assignmentId == other.assignmentId && - title == other.title && - dueAt == other.dueAt && - allDay == other.allDay && - allDayDate == other.allDayDate && - unlockAt == other.unlockAt && - lockAt == other.lockAt && - studentIds == other.studentIds; - } - - @override - int get hashCode { - var _$hash = 0; - _$hash = $jc(_$hash, id.hashCode); - _$hash = $jc(_$hash, assignmentId.hashCode); - _$hash = $jc(_$hash, title.hashCode); - _$hash = $jc(_$hash, dueAt.hashCode); - _$hash = $jc(_$hash, allDay.hashCode); - _$hash = $jc(_$hash, allDayDate.hashCode); - _$hash = $jc(_$hash, unlockAt.hashCode); - _$hash = $jc(_$hash, lockAt.hashCode); - _$hash = $jc(_$hash, studentIds.hashCode); - _$hash = $jf(_$hash); - return _$hash; - } - - @override - String toString() { - return (newBuiltValueToStringHelper(r'AssignmentOverride') - ..add('id', id) - ..add('assignmentId', assignmentId) - ..add('title', title) - ..add('dueAt', dueAt) - ..add('allDay', allDay) - ..add('allDayDate', allDayDate) - ..add('unlockAt', unlockAt) - ..add('lockAt', lockAt) - ..add('studentIds', studentIds)) - .toString(); - } -} - -class AssignmentOverrideBuilder - implements Builder { - _$AssignmentOverride? _$v; - - String? _id; - String? get id => _$this._id; - set id(String? id) => _$this._id = id; - - String? _assignmentId; - String? get assignmentId => _$this._assignmentId; - set assignmentId(String? assignmentId) => _$this._assignmentId = assignmentId; - - String? _title; - String? get title => _$this._title; - set title(String? title) => _$this._title = title; - - DateTime? _dueAt; - DateTime? get dueAt => _$this._dueAt; - set dueAt(DateTime? dueAt) => _$this._dueAt = dueAt; - - bool? _allDay; - bool? get allDay => _$this._allDay; - set allDay(bool? allDay) => _$this._allDay = allDay; - - DateTime? _allDayDate; - DateTime? get allDayDate => _$this._allDayDate; - set allDayDate(DateTime? allDayDate) => _$this._allDayDate = allDayDate; - - DateTime? _unlockAt; - DateTime? get unlockAt => _$this._unlockAt; - set unlockAt(DateTime? unlockAt) => _$this._unlockAt = unlockAt; - - DateTime? _lockAt; - DateTime? get lockAt => _$this._lockAt; - set lockAt(DateTime? lockAt) => _$this._lockAt = lockAt; - - ListBuilder? _studentIds; - ListBuilder get studentIds => - _$this._studentIds ??= new ListBuilder(); - set studentIds(ListBuilder? studentIds) => - _$this._studentIds = studentIds; - - AssignmentOverrideBuilder() { - AssignmentOverride._initializeBuilder(this); - } - - AssignmentOverrideBuilder get _$this { - final $v = _$v; - if ($v != null) { - _id = $v.id; - _assignmentId = $v.assignmentId; - _title = $v.title; - _dueAt = $v.dueAt; - _allDay = $v.allDay; - _allDayDate = $v.allDayDate; - _unlockAt = $v.unlockAt; - _lockAt = $v.lockAt; - _studentIds = $v.studentIds.toBuilder(); - _$v = null; - } - return this; - } - - @override - void replace(AssignmentOverride other) { - ArgumentError.checkNotNull(other, 'other'); - _$v = other as _$AssignmentOverride; - } - - @override - void update(void Function(AssignmentOverrideBuilder)? updates) { - if (updates != null) updates(this); - } - - @override - AssignmentOverride build() => _build(); - - _$AssignmentOverride _build() { - _$AssignmentOverride _$result; - try { - _$result = _$v ?? - new _$AssignmentOverride._( - id: BuiltValueNullFieldError.checkNotNull( - id, r'AssignmentOverride', 'id'), - assignmentId: BuiltValueNullFieldError.checkNotNull( - assignmentId, r'AssignmentOverride', 'assignmentId'), - title: title, - dueAt: dueAt, - allDay: allDay, - allDayDate: allDayDate, - unlockAt: unlockAt, - lockAt: lockAt, - studentIds: studentIds.build()); - } catch (_) { - late String _$failedField; - try { - _$failedField = 'studentIds'; - studentIds.build(); - } catch (e) { - throw new BuiltValueNestedFieldError( - r'AssignmentOverride', _$failedField, e.toString()); - } - rethrow; - } - replace(_$result); - return _$result; - } -} - -// ignore_for_file: deprecated_member_use_from_same_package,type=lint diff --git a/apps/flutter_parent/lib/models/attachment.dart b/apps/flutter_parent/lib/models/attachment.dart deleted file mode 100644 index deeb0806ee..0000000000 --- a/apps/flutter_parent/lib/models/attachment.dart +++ /dev/null @@ -1,76 +0,0 @@ -// Copyright (C) 2019 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:built_value/built_value.dart'; -import 'package:built_value/json_object.dart'; -import 'package:built_value/serializer.dart'; -import 'package:mime/mime.dart'; - -part 'attachment.g.dart'; - -/// To have this built_value be generated, run this command from the project root: -/// flutter pub run build_runner build -abstract class Attachment implements Built { - @BuiltValueSerializer(serializeNulls: true) // Add this line to get nulls to serialize when we convert to JSON - static Serializer get serializer => _$attachmentSerializer; - - @BuiltValueField(serialize: false) - String get id => jsonId.isString ? jsonId.asString : jsonId.asNum.toString(); - - @BuiltValueField(wireName: 'id') - JsonObject get jsonId; - - @BuiltValueField(wireName: 'content-type') - String? get contentType; - - String? get filename; - - @BuiltValueField(wireName: 'display_name') - String? get displayName; - - String? get url; - - @BuiltValueField(wireName: 'thumbnail_url') - String? get thumbnailUrl; - - @BuiltValueField(wireName: 'preview_url') - String? get previewUrl; - - @BuiltValueField(wireName: 'created_at') - DateTime? get createdAt; - - int get size; - - String? inferContentType() { - if (contentType != null && contentType?.isNotEmpty == true) return contentType!; - - // First, attempt to infer content type from file name - String? type = lookupMimeType(filename ?? ''); - - // Next, attempt to infer from url - if (type == null) type = lookupMimeType(url ?? ''); - - // Last, attempt to infer from display name - if (type == null) type = lookupMimeType(displayName ?? ''); - - return type; - } - - Attachment._(); - factory Attachment([void Function(AttachmentBuilder) updates]) = _$Attachment; - - static void _initializeBuilder(AttachmentBuilder b) => b - ..jsonId = JsonObject('') - ..size = 0; -} diff --git a/apps/flutter_parent/lib/models/attachment.g.dart b/apps/flutter_parent/lib/models/attachment.g.dart deleted file mode 100644 index 4535d3beac..0000000000 --- a/apps/flutter_parent/lib/models/attachment.g.dart +++ /dev/null @@ -1,313 +0,0 @@ -// GENERATED CODE - DO NOT MODIFY BY HAND - -part of 'attachment.dart'; - -// ************************************************************************** -// BuiltValueGenerator -// ************************************************************************** - -Serializer _$attachmentSerializer = new _$AttachmentSerializer(); - -class _$AttachmentSerializer implements StructuredSerializer { - @override - final Iterable types = const [Attachment, _$Attachment]; - @override - final String wireName = 'Attachment'; - - @override - Iterable serialize(Serializers serializers, Attachment object, - {FullType specifiedType = FullType.unspecified}) { - final result = [ - 'id', - serializers.serialize(object.jsonId, - specifiedType: const FullType(JsonObject)), - 'size', - serializers.serialize(object.size, specifiedType: const FullType(int)), - ]; - Object? value; - value = object.contentType; - - result - ..add('content-type') - ..add( - serializers.serialize(value, specifiedType: const FullType(String))); - value = object.filename; - - result - ..add('filename') - ..add( - serializers.serialize(value, specifiedType: const FullType(String))); - value = object.displayName; - - result - ..add('display_name') - ..add( - serializers.serialize(value, specifiedType: const FullType(String))); - value = object.url; - - result - ..add('url') - ..add( - serializers.serialize(value, specifiedType: const FullType(String))); - value = object.thumbnailUrl; - - result - ..add('thumbnail_url') - ..add( - serializers.serialize(value, specifiedType: const FullType(String))); - value = object.previewUrl; - - result - ..add('preview_url') - ..add( - serializers.serialize(value, specifiedType: const FullType(String))); - value = object.createdAt; - - result - ..add('created_at') - ..add(serializers.serialize(value, - specifiedType: const FullType(DateTime))); - - return result; - } - - @override - Attachment deserialize(Serializers serializers, Iterable serialized, - {FullType specifiedType = FullType.unspecified}) { - final result = new AttachmentBuilder(); - - final iterator = serialized.iterator; - while (iterator.moveNext()) { - final key = iterator.current! as String; - iterator.moveNext(); - final Object? value = iterator.current; - switch (key) { - case 'id': - result.jsonId = serializers.deserialize(value, - specifiedType: const FullType(JsonObject))! as JsonObject; - break; - case 'content-type': - result.contentType = serializers.deserialize(value, - specifiedType: const FullType(String)) as String?; - break; - case 'filename': - result.filename = serializers.deserialize(value, - specifiedType: const FullType(String)) as String?; - break; - case 'display_name': - result.displayName = serializers.deserialize(value, - specifiedType: const FullType(String)) as String?; - break; - case 'url': - result.url = serializers.deserialize(value, - specifiedType: const FullType(String)) as String?; - break; - case 'thumbnail_url': - result.thumbnailUrl = serializers.deserialize(value, - specifiedType: const FullType(String)) as String?; - break; - case 'preview_url': - result.previewUrl = serializers.deserialize(value, - specifiedType: const FullType(String)) as String?; - break; - case 'created_at': - result.createdAt = serializers.deserialize(value, - specifiedType: const FullType(DateTime)) as DateTime?; - break; - case 'size': - result.size = serializers.deserialize(value, - specifiedType: const FullType(int))! as int; - break; - } - } - - return result.build(); - } -} - -class _$Attachment extends Attachment { - @override - final JsonObject jsonId; - @override - final String? contentType; - @override - final String? filename; - @override - final String? displayName; - @override - final String? url; - @override - final String? thumbnailUrl; - @override - final String? previewUrl; - @override - final DateTime? createdAt; - @override - final int size; - - factory _$Attachment([void Function(AttachmentBuilder)? updates]) => - (new AttachmentBuilder()..update(updates))._build(); - - _$Attachment._( - {required this.jsonId, - this.contentType, - this.filename, - this.displayName, - this.url, - this.thumbnailUrl, - this.previewUrl, - this.createdAt, - required this.size}) - : super._() { - BuiltValueNullFieldError.checkNotNull(jsonId, r'Attachment', 'jsonId'); - BuiltValueNullFieldError.checkNotNull(size, r'Attachment', 'size'); - } - - @override - Attachment rebuild(void Function(AttachmentBuilder) updates) => - (toBuilder()..update(updates)).build(); - - @override - AttachmentBuilder toBuilder() => new AttachmentBuilder()..replace(this); - - @override - bool operator ==(Object other) { - if (identical(other, this)) return true; - return other is Attachment && - jsonId == other.jsonId && - contentType == other.contentType && - filename == other.filename && - displayName == other.displayName && - url == other.url && - thumbnailUrl == other.thumbnailUrl && - previewUrl == other.previewUrl && - createdAt == other.createdAt && - size == other.size; - } - - @override - int get hashCode { - var _$hash = 0; - _$hash = $jc(_$hash, jsonId.hashCode); - _$hash = $jc(_$hash, contentType.hashCode); - _$hash = $jc(_$hash, filename.hashCode); - _$hash = $jc(_$hash, displayName.hashCode); - _$hash = $jc(_$hash, url.hashCode); - _$hash = $jc(_$hash, thumbnailUrl.hashCode); - _$hash = $jc(_$hash, previewUrl.hashCode); - _$hash = $jc(_$hash, createdAt.hashCode); - _$hash = $jc(_$hash, size.hashCode); - _$hash = $jf(_$hash); - return _$hash; - } - - @override - String toString() { - return (newBuiltValueToStringHelper(r'Attachment') - ..add('jsonId', jsonId) - ..add('contentType', contentType) - ..add('filename', filename) - ..add('displayName', displayName) - ..add('url', url) - ..add('thumbnailUrl', thumbnailUrl) - ..add('previewUrl', previewUrl) - ..add('createdAt', createdAt) - ..add('size', size)) - .toString(); - } -} - -class AttachmentBuilder implements Builder { - _$Attachment? _$v; - - JsonObject? _jsonId; - JsonObject? get jsonId => _$this._jsonId; - set jsonId(JsonObject? jsonId) => _$this._jsonId = jsonId; - - String? _contentType; - String? get contentType => _$this._contentType; - set contentType(String? contentType) => _$this._contentType = contentType; - - String? _filename; - String? get filename => _$this._filename; - set filename(String? filename) => _$this._filename = filename; - - String? _displayName; - String? get displayName => _$this._displayName; - set displayName(String? displayName) => _$this._displayName = displayName; - - String? _url; - String? get url => _$this._url; - set url(String? url) => _$this._url = url; - - String? _thumbnailUrl; - String? get thumbnailUrl => _$this._thumbnailUrl; - set thumbnailUrl(String? thumbnailUrl) => _$this._thumbnailUrl = thumbnailUrl; - - String? _previewUrl; - String? get previewUrl => _$this._previewUrl; - set previewUrl(String? previewUrl) => _$this._previewUrl = previewUrl; - - DateTime? _createdAt; - DateTime? get createdAt => _$this._createdAt; - set createdAt(DateTime? createdAt) => _$this._createdAt = createdAt; - - int? _size; - int? get size => _$this._size; - set size(int? size) => _$this._size = size; - - AttachmentBuilder() { - Attachment._initializeBuilder(this); - } - - AttachmentBuilder get _$this { - final $v = _$v; - if ($v != null) { - _jsonId = $v.jsonId; - _contentType = $v.contentType; - _filename = $v.filename; - _displayName = $v.displayName; - _url = $v.url; - _thumbnailUrl = $v.thumbnailUrl; - _previewUrl = $v.previewUrl; - _createdAt = $v.createdAt; - _size = $v.size; - _$v = null; - } - return this; - } - - @override - void replace(Attachment other) { - ArgumentError.checkNotNull(other, 'other'); - _$v = other as _$Attachment; - } - - @override - void update(void Function(AttachmentBuilder)? updates) { - if (updates != null) updates(this); - } - - @override - Attachment build() => _build(); - - _$Attachment _build() { - final _$result = _$v ?? - new _$Attachment._( - jsonId: BuiltValueNullFieldError.checkNotNull( - jsonId, r'Attachment', 'jsonId'), - contentType: contentType, - filename: filename, - displayName: displayName, - url: url, - thumbnailUrl: thumbnailUrl, - previewUrl: previewUrl, - createdAt: createdAt, - size: BuiltValueNullFieldError.checkNotNull( - size, r'Attachment', 'size')); - replace(_$result); - return _$result; - } -} - -// ignore_for_file: deprecated_member_use_from_same_package,type=lint diff --git a/apps/flutter_parent/lib/models/authenticated_url.dart b/apps/flutter_parent/lib/models/authenticated_url.dart deleted file mode 100644 index d5353f694c..0000000000 --- a/apps/flutter_parent/lib/models/authenticated_url.dart +++ /dev/null @@ -1,36 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:built_value/built_value.dart'; -import 'package:built_value/serializer.dart'; - -part 'authenticated_url.g.dart'; - -/// To have this built_value be generated, run this command from the project root: -/// flutter pub run build_runner build --delete-conflicting-outputs -abstract class AuthenticatedUrl implements Built { - @BuiltValueSerializer(serializeNulls: true) // Add this line to get nulls to serialize when we convert to JSON - static Serializer get serializer => _$authenticatedUrlSerializer; - - @BuiltValueField(wireName: 'session_url') - String get sessionUrl; - - @BuiltValueField(wireName: 'requires_terms_acceptance') - bool get requiresTermsAcceptance; - - AuthenticatedUrl._(); - factory AuthenticatedUrl([void Function(AuthenticatedUrlBuilder) updates]) = _$AuthenticatedUrl; - - static void _initializeBuilder(AuthenticatedUrlBuilder b) => b..sessionUrl = ''; -} diff --git a/apps/flutter_parent/lib/models/authenticated_url.g.dart b/apps/flutter_parent/lib/models/authenticated_url.g.dart deleted file mode 100644 index 3f0c7e42f3..0000000000 --- a/apps/flutter_parent/lib/models/authenticated_url.g.dart +++ /dev/null @@ -1,169 +0,0 @@ -// GENERATED CODE - DO NOT MODIFY BY HAND - -part of 'authenticated_url.dart'; - -// ************************************************************************** -// BuiltValueGenerator -// ************************************************************************** - -Serializer _$authenticatedUrlSerializer = - new _$AuthenticatedUrlSerializer(); - -class _$AuthenticatedUrlSerializer - implements StructuredSerializer { - @override - final Iterable types = const [AuthenticatedUrl, _$AuthenticatedUrl]; - @override - final String wireName = 'AuthenticatedUrl'; - - @override - Iterable serialize(Serializers serializers, AuthenticatedUrl object, - {FullType specifiedType = FullType.unspecified}) { - final result = [ - 'session_url', - serializers.serialize(object.sessionUrl, - specifiedType: const FullType(String)), - 'requires_terms_acceptance', - serializers.serialize(object.requiresTermsAcceptance, - specifiedType: const FullType(bool)), - ]; - - return result; - } - - @override - AuthenticatedUrl deserialize( - Serializers serializers, Iterable serialized, - {FullType specifiedType = FullType.unspecified}) { - final result = new AuthenticatedUrlBuilder(); - - final iterator = serialized.iterator; - while (iterator.moveNext()) { - final key = iterator.current! as String; - iterator.moveNext(); - final Object? value = iterator.current; - switch (key) { - case 'session_url': - result.sessionUrl = serializers.deserialize(value, - specifiedType: const FullType(String))! as String; - break; - case 'requires_terms_acceptance': - result.requiresTermsAcceptance = serializers.deserialize(value, - specifiedType: const FullType(bool))! as bool; - break; - } - } - - return result.build(); - } -} - -class _$AuthenticatedUrl extends AuthenticatedUrl { - @override - final String sessionUrl; - @override - final bool requiresTermsAcceptance; - - factory _$AuthenticatedUrl( - [void Function(AuthenticatedUrlBuilder)? updates]) => - (new AuthenticatedUrlBuilder()..update(updates))._build(); - - _$AuthenticatedUrl._( - {required this.sessionUrl, required this.requiresTermsAcceptance}) - : super._() { - BuiltValueNullFieldError.checkNotNull( - sessionUrl, r'AuthenticatedUrl', 'sessionUrl'); - BuiltValueNullFieldError.checkNotNull(requiresTermsAcceptance, - r'AuthenticatedUrl', 'requiresTermsAcceptance'); - } - - @override - AuthenticatedUrl rebuild(void Function(AuthenticatedUrlBuilder) updates) => - (toBuilder()..update(updates)).build(); - - @override - AuthenticatedUrlBuilder toBuilder() => - new AuthenticatedUrlBuilder()..replace(this); - - @override - bool operator ==(Object other) { - if (identical(other, this)) return true; - return other is AuthenticatedUrl && - sessionUrl == other.sessionUrl && - requiresTermsAcceptance == other.requiresTermsAcceptance; - } - - @override - int get hashCode { - var _$hash = 0; - _$hash = $jc(_$hash, sessionUrl.hashCode); - _$hash = $jc(_$hash, requiresTermsAcceptance.hashCode); - _$hash = $jf(_$hash); - return _$hash; - } - - @override - String toString() { - return (newBuiltValueToStringHelper(r'AuthenticatedUrl') - ..add('sessionUrl', sessionUrl) - ..add('requiresTermsAcceptance', requiresTermsAcceptance)) - .toString(); - } -} - -class AuthenticatedUrlBuilder - implements Builder { - _$AuthenticatedUrl? _$v; - - String? _sessionUrl; - String? get sessionUrl => _$this._sessionUrl; - set sessionUrl(String? sessionUrl) => _$this._sessionUrl = sessionUrl; - - bool? _requiresTermsAcceptance; - bool? get requiresTermsAcceptance => _$this._requiresTermsAcceptance; - set requiresTermsAcceptance(bool? requiresTermsAcceptance) => - _$this._requiresTermsAcceptance = requiresTermsAcceptance; - - AuthenticatedUrlBuilder() { - AuthenticatedUrl._initializeBuilder(this); - } - - AuthenticatedUrlBuilder get _$this { - final $v = _$v; - if ($v != null) { - _sessionUrl = $v.sessionUrl; - _requiresTermsAcceptance = $v.requiresTermsAcceptance; - _$v = null; - } - return this; - } - - @override - void replace(AuthenticatedUrl other) { - ArgumentError.checkNotNull(other, 'other'); - _$v = other as _$AuthenticatedUrl; - } - - @override - void update(void Function(AuthenticatedUrlBuilder)? updates) { - if (updates != null) updates(this); - } - - @override - AuthenticatedUrl build() => _build(); - - _$AuthenticatedUrl _build() { - final _$result = _$v ?? - new _$AuthenticatedUrl._( - sessionUrl: BuiltValueNullFieldError.checkNotNull( - sessionUrl, r'AuthenticatedUrl', 'sessionUrl'), - requiresTermsAcceptance: BuiltValueNullFieldError.checkNotNull( - requiresTermsAcceptance, - r'AuthenticatedUrl', - 'requiresTermsAcceptance')); - replace(_$result); - return _$result; - } -} - -// ignore_for_file: deprecated_member_use_from_same_package,type=lint diff --git a/apps/flutter_parent/lib/models/basic_user.dart b/apps/flutter_parent/lib/models/basic_user.dart deleted file mode 100644 index 38214c8945..0000000000 --- a/apps/flutter_parent/lib/models/basic_user.dart +++ /dev/null @@ -1,39 +0,0 @@ -// Copyright (C) 2019 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:built_value/built_value.dart'; -import 'package:built_value/serializer.dart'; - -part 'basic_user.g.dart'; - -/// To have this built_value be generated, run this command from the project root: -/// flutter pub run build_runner build -abstract class BasicUser implements Built { - @BuiltValueSerializer(serializeNulls: true) // Add this line to get nulls to serialize when we convert to JSON - static Serializer get serializer => _$basicUserSerializer; - - String get id; - - String? get name; - - String? get pronouns; - - @BuiltValueField(wireName: 'avatar_url') - String? get avatarUrl; - - BasicUser._(); - factory BasicUser([void Function(BasicUserBuilder) updates]) = _$BasicUser; - - static void _initializeBuilder(BasicUserBuilder b) => b..id = ''; -} diff --git a/apps/flutter_parent/lib/models/basic_user.g.dart b/apps/flutter_parent/lib/models/basic_user.g.dart deleted file mode 100644 index 88338ecfff..0000000000 --- a/apps/flutter_parent/lib/models/basic_user.g.dart +++ /dev/null @@ -1,199 +0,0 @@ -// GENERATED CODE - DO NOT MODIFY BY HAND - -part of 'basic_user.dart'; - -// ************************************************************************** -// BuiltValueGenerator -// ************************************************************************** - -Serializer _$basicUserSerializer = new _$BasicUserSerializer(); - -class _$BasicUserSerializer implements StructuredSerializer { - @override - final Iterable types = const [BasicUser, _$BasicUser]; - @override - final String wireName = 'BasicUser'; - - @override - Iterable serialize(Serializers serializers, BasicUser object, - {FullType specifiedType = FullType.unspecified}) { - final result = [ - 'id', - serializers.serialize(object.id, specifiedType: const FullType(String)), - ]; - Object? value; - value = object.name; - - result - ..add('name') - ..add( - serializers.serialize(value, specifiedType: const FullType(String))); - value = object.pronouns; - - result - ..add('pronouns') - ..add( - serializers.serialize(value, specifiedType: const FullType(String))); - value = object.avatarUrl; - - result - ..add('avatar_url') - ..add( - serializers.serialize(value, specifiedType: const FullType(String))); - - return result; - } - - @override - BasicUser deserialize(Serializers serializers, Iterable serialized, - {FullType specifiedType = FullType.unspecified}) { - final result = new BasicUserBuilder(); - - final iterator = serialized.iterator; - while (iterator.moveNext()) { - final key = iterator.current! as String; - iterator.moveNext(); - final Object? value = iterator.current; - switch (key) { - case 'id': - result.id = serializers.deserialize(value, - specifiedType: const FullType(String))! as String; - break; - case 'name': - result.name = serializers.deserialize(value, - specifiedType: const FullType(String)) as String?; - break; - case 'pronouns': - result.pronouns = serializers.deserialize(value, - specifiedType: const FullType(String)) as String?; - break; - case 'avatar_url': - result.avatarUrl = serializers.deserialize(value, - specifiedType: const FullType(String)) as String?; - break; - } - } - - return result.build(); - } -} - -class _$BasicUser extends BasicUser { - @override - final String id; - @override - final String? name; - @override - final String? pronouns; - @override - final String? avatarUrl; - - factory _$BasicUser([void Function(BasicUserBuilder)? updates]) => - (new BasicUserBuilder()..update(updates))._build(); - - _$BasicUser._({required this.id, this.name, this.pronouns, this.avatarUrl}) - : super._() { - BuiltValueNullFieldError.checkNotNull(id, r'BasicUser', 'id'); - } - - @override - BasicUser rebuild(void Function(BasicUserBuilder) updates) => - (toBuilder()..update(updates)).build(); - - @override - BasicUserBuilder toBuilder() => new BasicUserBuilder()..replace(this); - - @override - bool operator ==(Object other) { - if (identical(other, this)) return true; - return other is BasicUser && - id == other.id && - name == other.name && - pronouns == other.pronouns && - avatarUrl == other.avatarUrl; - } - - @override - int get hashCode { - var _$hash = 0; - _$hash = $jc(_$hash, id.hashCode); - _$hash = $jc(_$hash, name.hashCode); - _$hash = $jc(_$hash, pronouns.hashCode); - _$hash = $jc(_$hash, avatarUrl.hashCode); - _$hash = $jf(_$hash); - return _$hash; - } - - @override - String toString() { - return (newBuiltValueToStringHelper(r'BasicUser') - ..add('id', id) - ..add('name', name) - ..add('pronouns', pronouns) - ..add('avatarUrl', avatarUrl)) - .toString(); - } -} - -class BasicUserBuilder implements Builder { - _$BasicUser? _$v; - - String? _id; - String? get id => _$this._id; - set id(String? id) => _$this._id = id; - - String? _name; - String? get name => _$this._name; - set name(String? name) => _$this._name = name; - - String? _pronouns; - String? get pronouns => _$this._pronouns; - set pronouns(String? pronouns) => _$this._pronouns = pronouns; - - String? _avatarUrl; - String? get avatarUrl => _$this._avatarUrl; - set avatarUrl(String? avatarUrl) => _$this._avatarUrl = avatarUrl; - - BasicUserBuilder() { - BasicUser._initializeBuilder(this); - } - - BasicUserBuilder get _$this { - final $v = _$v; - if ($v != null) { - _id = $v.id; - _name = $v.name; - _pronouns = $v.pronouns; - _avatarUrl = $v.avatarUrl; - _$v = null; - } - return this; - } - - @override - void replace(BasicUser other) { - ArgumentError.checkNotNull(other, 'other'); - _$v = other as _$BasicUser; - } - - @override - void update(void Function(BasicUserBuilder)? updates) { - if (updates != null) updates(this); - } - - @override - BasicUser build() => _build(); - - _$BasicUser _build() { - final _$result = _$v ?? - new _$BasicUser._( - id: BuiltValueNullFieldError.checkNotNull(id, r'BasicUser', 'id'), - name: name, - pronouns: pronouns, - avatarUrl: avatarUrl); - replace(_$result); - return _$result; - } -} - -// ignore_for_file: deprecated_member_use_from_same_package,type=lint diff --git a/apps/flutter_parent/lib/models/calendar_filter.dart b/apps/flutter_parent/lib/models/calendar_filter.dart deleted file mode 100644 index 0b1d03afa6..0000000000 --- a/apps/flutter_parent/lib/models/calendar_filter.dart +++ /dev/null @@ -1,41 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:built_collection/built_collection.dart'; -import 'package:built_value/built_value.dart'; - -part 'calendar_filter.g.dart'; - -/// To have this built_value be generated, run this command from the project root: -/// flutter pub run build_runner build --delete-conflicting-outputs -abstract class CalendarFilter implements Built { - int? get id; - - String get userDomain; - - String get userId; - - String get observeeId; - - BuiltSet get filters; - - CalendarFilter._(); - factory CalendarFilter([void Function(CalendarFilterBuilder) updates]) = _$CalendarFilter; - - static void _initializeBuilder(CalendarFilterBuilder b) => b - ..userDomain = '' - ..userId = '' - ..observeeId = '' - ..filters = SetBuilder(); -} diff --git a/apps/flutter_parent/lib/models/calendar_filter.g.dart b/apps/flutter_parent/lib/models/calendar_filter.g.dart deleted file mode 100644 index 3597758512..0000000000 --- a/apps/flutter_parent/lib/models/calendar_filter.g.dart +++ /dev/null @@ -1,168 +0,0 @@ -// GENERATED CODE - DO NOT MODIFY BY HAND - -part of 'calendar_filter.dart'; - -// ************************************************************************** -// BuiltValueGenerator -// ************************************************************************** - -class _$CalendarFilter extends CalendarFilter { - @override - final int? id; - @override - final String userDomain; - @override - final String userId; - @override - final String observeeId; - @override - final BuiltSet filters; - - factory _$CalendarFilter([void Function(CalendarFilterBuilder)? updates]) => - (new CalendarFilterBuilder()..update(updates))._build(); - - _$CalendarFilter._( - {this.id, - required this.userDomain, - required this.userId, - required this.observeeId, - required this.filters}) - : super._() { - BuiltValueNullFieldError.checkNotNull( - userDomain, r'CalendarFilter', 'userDomain'); - BuiltValueNullFieldError.checkNotNull(userId, r'CalendarFilter', 'userId'); - BuiltValueNullFieldError.checkNotNull( - observeeId, r'CalendarFilter', 'observeeId'); - BuiltValueNullFieldError.checkNotNull( - filters, r'CalendarFilter', 'filters'); - } - - @override - CalendarFilter rebuild(void Function(CalendarFilterBuilder) updates) => - (toBuilder()..update(updates)).build(); - - @override - CalendarFilterBuilder toBuilder() => - new CalendarFilterBuilder()..replace(this); - - @override - bool operator ==(Object other) { - if (identical(other, this)) return true; - return other is CalendarFilter && - id == other.id && - userDomain == other.userDomain && - userId == other.userId && - observeeId == other.observeeId && - filters == other.filters; - } - - @override - int get hashCode { - var _$hash = 0; - _$hash = $jc(_$hash, id.hashCode); - _$hash = $jc(_$hash, userDomain.hashCode); - _$hash = $jc(_$hash, userId.hashCode); - _$hash = $jc(_$hash, observeeId.hashCode); - _$hash = $jc(_$hash, filters.hashCode); - _$hash = $jf(_$hash); - return _$hash; - } - - @override - String toString() { - return (newBuiltValueToStringHelper(r'CalendarFilter') - ..add('id', id) - ..add('userDomain', userDomain) - ..add('userId', userId) - ..add('observeeId', observeeId) - ..add('filters', filters)) - .toString(); - } -} - -class CalendarFilterBuilder - implements Builder { - _$CalendarFilter? _$v; - - int? _id; - int? get id => _$this._id; - set id(int? id) => _$this._id = id; - - String? _userDomain; - String? get userDomain => _$this._userDomain; - set userDomain(String? userDomain) => _$this._userDomain = userDomain; - - String? _userId; - String? get userId => _$this._userId; - set userId(String? userId) => _$this._userId = userId; - - String? _observeeId; - String? get observeeId => _$this._observeeId; - set observeeId(String? observeeId) => _$this._observeeId = observeeId; - - SetBuilder? _filters; - SetBuilder get filters => - _$this._filters ??= new SetBuilder(); - set filters(SetBuilder? filters) => _$this._filters = filters; - - CalendarFilterBuilder() { - CalendarFilter._initializeBuilder(this); - } - - CalendarFilterBuilder get _$this { - final $v = _$v; - if ($v != null) { - _id = $v.id; - _userDomain = $v.userDomain; - _userId = $v.userId; - _observeeId = $v.observeeId; - _filters = $v.filters.toBuilder(); - _$v = null; - } - return this; - } - - @override - void replace(CalendarFilter other) { - ArgumentError.checkNotNull(other, 'other'); - _$v = other as _$CalendarFilter; - } - - @override - void update(void Function(CalendarFilterBuilder)? updates) { - if (updates != null) updates(this); - } - - @override - CalendarFilter build() => _build(); - - _$CalendarFilter _build() { - _$CalendarFilter _$result; - try { - _$result = _$v ?? - new _$CalendarFilter._( - id: id, - userDomain: BuiltValueNullFieldError.checkNotNull( - userDomain, r'CalendarFilter', 'userDomain'), - userId: BuiltValueNullFieldError.checkNotNull( - userId, r'CalendarFilter', 'userId'), - observeeId: BuiltValueNullFieldError.checkNotNull( - observeeId, r'CalendarFilter', 'observeeId'), - filters: filters.build()); - } catch (_) { - late String _$failedField; - try { - _$failedField = 'filters'; - filters.build(); - } catch (e) { - throw new BuiltValueNestedFieldError( - r'CalendarFilter', _$failedField, e.toString()); - } - rethrow; - } - replace(_$result); - return _$result; - } -} - -// ignore_for_file: deprecated_member_use_from_same_package,type=lint diff --git a/apps/flutter_parent/lib/models/canvas_page.dart b/apps/flutter_parent/lib/models/canvas_page.dart deleted file mode 100644 index 73f90a20cf..0000000000 --- a/apps/flutter_parent/lib/models/canvas_page.dart +++ /dev/null @@ -1,69 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -import 'package:built_value/built_value.dart'; -import 'package:built_value/serializer.dart'; -import 'package:flutter_parent/models/lock_info.dart'; - -part 'canvas_page.g.dart'; - -/// To have this built_value be generated, run this command from the project root: -/// flutter packages pub run build_runner build --delete-conflicting-outputs -abstract class CanvasPage implements Built { - @BuiltValueSerializer(serializeNulls: true) // Add this line to get nulls to serialize when we convert to JSON - static Serializer get serializer => _$canvasPageSerializer; - - CanvasPage._(); - - factory CanvasPage([void Function(CanvasPageBuilder) updates]) = _$CanvasPage; - - @BuiltValueField(wireName: 'page_id') - String get id; - - String? get url; - - String? get title; - - @BuiltValueField(wireName: 'created_at') - DateTime? get createdAt; - - @BuiltValueField(wireName: 'updated_at') - DateTime? get updatedAt; - - @BuiltValueField(wireName: 'hide_from_students') - bool get hideFromStudents; - - String? get status; - - String? get body; - - @BuiltValueField(wireName: 'front_page') - bool get frontPage; - - @BuiltValueField(wireName: 'lock_info') - LockInfo get lockInfo; - - @BuiltValueField(wireName: 'published') - bool get published; - - @BuiltValueField(wireName: 'editing_roles') - String? get editingRoles; - - @BuiltValueField(wireName: 'lock_explanation') - String? get lockExplanation; - - static void _initializeBuilder(CanvasPageBuilder b) => b - ..hideFromStudents = false - ..frontPage = false - ..published = false; -} diff --git a/apps/flutter_parent/lib/models/canvas_page.g.dart b/apps/flutter_parent/lib/models/canvas_page.g.dart deleted file mode 100644 index 5b0413742e..0000000000 --- a/apps/flutter_parent/lib/models/canvas_page.g.dart +++ /dev/null @@ -1,415 +0,0 @@ -// GENERATED CODE - DO NOT MODIFY BY HAND - -part of 'canvas_page.dart'; - -// ************************************************************************** -// BuiltValueGenerator -// ************************************************************************** - -Serializer _$canvasPageSerializer = new _$CanvasPageSerializer(); - -class _$CanvasPageSerializer implements StructuredSerializer { - @override - final Iterable types = const [CanvasPage, _$CanvasPage]; - @override - final String wireName = 'CanvasPage'; - - @override - Iterable serialize(Serializers serializers, CanvasPage object, - {FullType specifiedType = FullType.unspecified}) { - final result = [ - 'page_id', - serializers.serialize(object.id, specifiedType: const FullType(String)), - 'hide_from_students', - serializers.serialize(object.hideFromStudents, - specifiedType: const FullType(bool)), - 'front_page', - serializers.serialize(object.frontPage, - specifiedType: const FullType(bool)), - 'lock_info', - serializers.serialize(object.lockInfo, - specifiedType: const FullType(LockInfo)), - 'published', - serializers.serialize(object.published, - specifiedType: const FullType(bool)), - ]; - Object? value; - value = object.url; - - result - ..add('url') - ..add( - serializers.serialize(value, specifiedType: const FullType(String))); - value = object.title; - - result - ..add('title') - ..add( - serializers.serialize(value, specifiedType: const FullType(String))); - value = object.createdAt; - - result - ..add('created_at') - ..add(serializers.serialize(value, - specifiedType: const FullType(DateTime))); - value = object.updatedAt; - - result - ..add('updated_at') - ..add(serializers.serialize(value, - specifiedType: const FullType(DateTime))); - value = object.status; - - result - ..add('status') - ..add( - serializers.serialize(value, specifiedType: const FullType(String))); - value = object.body; - - result - ..add('body') - ..add( - serializers.serialize(value, specifiedType: const FullType(String))); - value = object.editingRoles; - - result - ..add('editing_roles') - ..add( - serializers.serialize(value, specifiedType: const FullType(String))); - value = object.lockExplanation; - - result - ..add('lock_explanation') - ..add( - serializers.serialize(value, specifiedType: const FullType(String))); - - return result; - } - - @override - CanvasPage deserialize(Serializers serializers, Iterable serialized, - {FullType specifiedType = FullType.unspecified}) { - final result = new CanvasPageBuilder(); - - final iterator = serialized.iterator; - while (iterator.moveNext()) { - final key = iterator.current! as String; - iterator.moveNext(); - final Object? value = iterator.current; - switch (key) { - case 'page_id': - result.id = serializers.deserialize(value, - specifiedType: const FullType(String))! as String; - break; - case 'url': - result.url = serializers.deserialize(value, - specifiedType: const FullType(String)) as String?; - break; - case 'title': - result.title = serializers.deserialize(value, - specifiedType: const FullType(String)) as String?; - break; - case 'created_at': - result.createdAt = serializers.deserialize(value, - specifiedType: const FullType(DateTime)) as DateTime?; - break; - case 'updated_at': - result.updatedAt = serializers.deserialize(value, - specifiedType: const FullType(DateTime)) as DateTime?; - break; - case 'hide_from_students': - result.hideFromStudents = serializers.deserialize(value, - specifiedType: const FullType(bool))! as bool; - break; - case 'status': - result.status = serializers.deserialize(value, - specifiedType: const FullType(String)) as String?; - break; - case 'body': - result.body = serializers.deserialize(value, - specifiedType: const FullType(String)) as String?; - break; - case 'front_page': - result.frontPage = serializers.deserialize(value, - specifiedType: const FullType(bool))! as bool; - break; - case 'lock_info': - result.lockInfo.replace(serializers.deserialize(value, - specifiedType: const FullType(LockInfo))! as LockInfo); - break; - case 'published': - result.published = serializers.deserialize(value, - specifiedType: const FullType(bool))! as bool; - break; - case 'editing_roles': - result.editingRoles = serializers.deserialize(value, - specifiedType: const FullType(String)) as String?; - break; - case 'lock_explanation': - result.lockExplanation = serializers.deserialize(value, - specifiedType: const FullType(String)) as String?; - break; - } - } - - return result.build(); - } -} - -class _$CanvasPage extends CanvasPage { - @override - final String id; - @override - final String? url; - @override - final String? title; - @override - final DateTime? createdAt; - @override - final DateTime? updatedAt; - @override - final bool hideFromStudents; - @override - final String? status; - @override - final String? body; - @override - final bool frontPage; - @override - final LockInfo lockInfo; - @override - final bool published; - @override - final String? editingRoles; - @override - final String? lockExplanation; - - factory _$CanvasPage([void Function(CanvasPageBuilder)? updates]) => - (new CanvasPageBuilder()..update(updates))._build(); - - _$CanvasPage._( - {required this.id, - this.url, - this.title, - this.createdAt, - this.updatedAt, - required this.hideFromStudents, - this.status, - this.body, - required this.frontPage, - required this.lockInfo, - required this.published, - this.editingRoles, - this.lockExplanation}) - : super._() { - BuiltValueNullFieldError.checkNotNull(id, r'CanvasPage', 'id'); - BuiltValueNullFieldError.checkNotNull( - hideFromStudents, r'CanvasPage', 'hideFromStudents'); - BuiltValueNullFieldError.checkNotNull( - frontPage, r'CanvasPage', 'frontPage'); - BuiltValueNullFieldError.checkNotNull(lockInfo, r'CanvasPage', 'lockInfo'); - BuiltValueNullFieldError.checkNotNull( - published, r'CanvasPage', 'published'); - } - - @override - CanvasPage rebuild(void Function(CanvasPageBuilder) updates) => - (toBuilder()..update(updates)).build(); - - @override - CanvasPageBuilder toBuilder() => new CanvasPageBuilder()..replace(this); - - @override - bool operator ==(Object other) { - if (identical(other, this)) return true; - return other is CanvasPage && - id == other.id && - url == other.url && - title == other.title && - createdAt == other.createdAt && - updatedAt == other.updatedAt && - hideFromStudents == other.hideFromStudents && - status == other.status && - body == other.body && - frontPage == other.frontPage && - lockInfo == other.lockInfo && - published == other.published && - editingRoles == other.editingRoles && - lockExplanation == other.lockExplanation; - } - - @override - int get hashCode { - var _$hash = 0; - _$hash = $jc(_$hash, id.hashCode); - _$hash = $jc(_$hash, url.hashCode); - _$hash = $jc(_$hash, title.hashCode); - _$hash = $jc(_$hash, createdAt.hashCode); - _$hash = $jc(_$hash, updatedAt.hashCode); - _$hash = $jc(_$hash, hideFromStudents.hashCode); - _$hash = $jc(_$hash, status.hashCode); - _$hash = $jc(_$hash, body.hashCode); - _$hash = $jc(_$hash, frontPage.hashCode); - _$hash = $jc(_$hash, lockInfo.hashCode); - _$hash = $jc(_$hash, published.hashCode); - _$hash = $jc(_$hash, editingRoles.hashCode); - _$hash = $jc(_$hash, lockExplanation.hashCode); - _$hash = $jf(_$hash); - return _$hash; - } - - @override - String toString() { - return (newBuiltValueToStringHelper(r'CanvasPage') - ..add('id', id) - ..add('url', url) - ..add('title', title) - ..add('createdAt', createdAt) - ..add('updatedAt', updatedAt) - ..add('hideFromStudents', hideFromStudents) - ..add('status', status) - ..add('body', body) - ..add('frontPage', frontPage) - ..add('lockInfo', lockInfo) - ..add('published', published) - ..add('editingRoles', editingRoles) - ..add('lockExplanation', lockExplanation)) - .toString(); - } -} - -class CanvasPageBuilder implements Builder { - _$CanvasPage? _$v; - - String? _id; - String? get id => _$this._id; - set id(String? id) => _$this._id = id; - - String? _url; - String? get url => _$this._url; - set url(String? url) => _$this._url = url; - - String? _title; - String? get title => _$this._title; - set title(String? title) => _$this._title = title; - - DateTime? _createdAt; - DateTime? get createdAt => _$this._createdAt; - set createdAt(DateTime? createdAt) => _$this._createdAt = createdAt; - - DateTime? _updatedAt; - DateTime? get updatedAt => _$this._updatedAt; - set updatedAt(DateTime? updatedAt) => _$this._updatedAt = updatedAt; - - bool? _hideFromStudents; - bool? get hideFromStudents => _$this._hideFromStudents; - set hideFromStudents(bool? hideFromStudents) => - _$this._hideFromStudents = hideFromStudents; - - String? _status; - String? get status => _$this._status; - set status(String? status) => _$this._status = status; - - String? _body; - String? get body => _$this._body; - set body(String? body) => _$this._body = body; - - bool? _frontPage; - bool? get frontPage => _$this._frontPage; - set frontPage(bool? frontPage) => _$this._frontPage = frontPage; - - LockInfoBuilder? _lockInfo; - LockInfoBuilder get lockInfo => _$this._lockInfo ??= new LockInfoBuilder(); - set lockInfo(LockInfoBuilder? lockInfo) => _$this._lockInfo = lockInfo; - - bool? _published; - bool? get published => _$this._published; - set published(bool? published) => _$this._published = published; - - String? _editingRoles; - String? get editingRoles => _$this._editingRoles; - set editingRoles(String? editingRoles) => _$this._editingRoles = editingRoles; - - String? _lockExplanation; - String? get lockExplanation => _$this._lockExplanation; - set lockExplanation(String? lockExplanation) => - _$this._lockExplanation = lockExplanation; - - CanvasPageBuilder() { - CanvasPage._initializeBuilder(this); - } - - CanvasPageBuilder get _$this { - final $v = _$v; - if ($v != null) { - _id = $v.id; - _url = $v.url; - _title = $v.title; - _createdAt = $v.createdAt; - _updatedAt = $v.updatedAt; - _hideFromStudents = $v.hideFromStudents; - _status = $v.status; - _body = $v.body; - _frontPage = $v.frontPage; - _lockInfo = $v.lockInfo.toBuilder(); - _published = $v.published; - _editingRoles = $v.editingRoles; - _lockExplanation = $v.lockExplanation; - _$v = null; - } - return this; - } - - @override - void replace(CanvasPage other) { - ArgumentError.checkNotNull(other, 'other'); - _$v = other as _$CanvasPage; - } - - @override - void update(void Function(CanvasPageBuilder)? updates) { - if (updates != null) updates(this); - } - - @override - CanvasPage build() => _build(); - - _$CanvasPage _build() { - _$CanvasPage _$result; - try { - _$result = _$v ?? - new _$CanvasPage._( - id: BuiltValueNullFieldError.checkNotNull( - id, r'CanvasPage', 'id'), - url: url, - title: title, - createdAt: createdAt, - updatedAt: updatedAt, - hideFromStudents: BuiltValueNullFieldError.checkNotNull( - hideFromStudents, r'CanvasPage', 'hideFromStudents'), - status: status, - body: body, - frontPage: BuiltValueNullFieldError.checkNotNull( - frontPage, r'CanvasPage', 'frontPage'), - lockInfo: lockInfo.build(), - published: BuiltValueNullFieldError.checkNotNull( - published, r'CanvasPage', 'published'), - editingRoles: editingRoles, - lockExplanation: lockExplanation); - } catch (_) { - late String _$failedField; - try { - _$failedField = 'lockInfo'; - lockInfo.build(); - } catch (e) { - throw new BuiltValueNestedFieldError( - r'CanvasPage', _$failedField, e.toString()); - } - rethrow; - } - replace(_$result); - return _$result; - } -} - -// ignore_for_file: deprecated_member_use_from_same_package,type=lint diff --git a/apps/flutter_parent/lib/models/canvas_token.dart b/apps/flutter_parent/lib/models/canvas_token.dart deleted file mode 100644 index 571e79b168..0000000000 --- a/apps/flutter_parent/lib/models/canvas_token.dart +++ /dev/null @@ -1,39 +0,0 @@ -// Copyright (C) 2019 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:built_value/built_value.dart'; -import 'package:built_value/serializer.dart'; -import 'package:flutter_parent/models/user.dart'; - -part 'canvas_token.g.dart'; - -abstract class CanvasToken implements Built { - @BuiltValueSerializer(serializeNulls: true) - static Serializer get serializer => _$canvasTokenSerializer; - - CanvasToken._(); - - factory CanvasToken([void Function(CanvasTokenBuilder) updates]) = _$CanvasToken; - - @BuiltValueField(wireName: 'access_token') - String get accessToken; - - @BuiltValueField(wireName: 'refresh_token') - String? get refreshToken; - - User? get user; - - @BuiltValueField(wireName: 'real_user') - User? get realUser; -} diff --git a/apps/flutter_parent/lib/models/canvas_token.g.dart b/apps/flutter_parent/lib/models/canvas_token.g.dart deleted file mode 100644 index 9166a153b9..0000000000 --- a/apps/flutter_parent/lib/models/canvas_token.g.dart +++ /dev/null @@ -1,214 +0,0 @@ -// GENERATED CODE - DO NOT MODIFY BY HAND - -part of 'canvas_token.dart'; - -// ************************************************************************** -// BuiltValueGenerator -// ************************************************************************** - -Serializer _$canvasTokenSerializer = new _$CanvasTokenSerializer(); - -class _$CanvasTokenSerializer implements StructuredSerializer { - @override - final Iterable types = const [CanvasToken, _$CanvasToken]; - @override - final String wireName = 'CanvasToken'; - - @override - Iterable serialize(Serializers serializers, CanvasToken object, - {FullType specifiedType = FullType.unspecified}) { - final result = [ - 'access_token', - serializers.serialize(object.accessToken, - specifiedType: const FullType(String)), - ]; - Object? value; - value = object.refreshToken; - - result - ..add('refresh_token') - ..add( - serializers.serialize(value, specifiedType: const FullType(String))); - value = object.user; - - result - ..add('user') - ..add(serializers.serialize(value, specifiedType: const FullType(User))); - value = object.realUser; - - result - ..add('real_user') - ..add(serializers.serialize(value, specifiedType: const FullType(User))); - - return result; - } - - @override - CanvasToken deserialize(Serializers serializers, Iterable serialized, - {FullType specifiedType = FullType.unspecified}) { - final result = new CanvasTokenBuilder(); - - final iterator = serialized.iterator; - while (iterator.moveNext()) { - final key = iterator.current! as String; - iterator.moveNext(); - final Object? value = iterator.current; - switch (key) { - case 'access_token': - result.accessToken = serializers.deserialize(value, - specifiedType: const FullType(String))! as String; - break; - case 'refresh_token': - result.refreshToken = serializers.deserialize(value, - specifiedType: const FullType(String)) as String?; - break; - case 'user': - result.user.replace(serializers.deserialize(value, - specifiedType: const FullType(User))! as User); - break; - case 'real_user': - result.realUser.replace(serializers.deserialize(value, - specifiedType: const FullType(User))! as User); - break; - } - } - - return result.build(); - } -} - -class _$CanvasToken extends CanvasToken { - @override - final String accessToken; - @override - final String? refreshToken; - @override - final User? user; - @override - final User? realUser; - - factory _$CanvasToken([void Function(CanvasTokenBuilder)? updates]) => - (new CanvasTokenBuilder()..update(updates))._build(); - - _$CanvasToken._( - {required this.accessToken, this.refreshToken, this.user, this.realUser}) - : super._() { - BuiltValueNullFieldError.checkNotNull( - accessToken, r'CanvasToken', 'accessToken'); - } - - @override - CanvasToken rebuild(void Function(CanvasTokenBuilder) updates) => - (toBuilder()..update(updates)).build(); - - @override - CanvasTokenBuilder toBuilder() => new CanvasTokenBuilder()..replace(this); - - @override - bool operator ==(Object other) { - if (identical(other, this)) return true; - return other is CanvasToken && - accessToken == other.accessToken && - refreshToken == other.refreshToken && - user == other.user && - realUser == other.realUser; - } - - @override - int get hashCode { - var _$hash = 0; - _$hash = $jc(_$hash, accessToken.hashCode); - _$hash = $jc(_$hash, refreshToken.hashCode); - _$hash = $jc(_$hash, user.hashCode); - _$hash = $jc(_$hash, realUser.hashCode); - _$hash = $jf(_$hash); - return _$hash; - } - - @override - String toString() { - return (newBuiltValueToStringHelper(r'CanvasToken') - ..add('accessToken', accessToken) - ..add('refreshToken', refreshToken) - ..add('user', user) - ..add('realUser', realUser)) - .toString(); - } -} - -class CanvasTokenBuilder implements Builder { - _$CanvasToken? _$v; - - String? _accessToken; - String? get accessToken => _$this._accessToken; - set accessToken(String? accessToken) => _$this._accessToken = accessToken; - - String? _refreshToken; - String? get refreshToken => _$this._refreshToken; - set refreshToken(String? refreshToken) => _$this._refreshToken = refreshToken; - - UserBuilder? _user; - UserBuilder get user => _$this._user ??= new UserBuilder(); - set user(UserBuilder? user) => _$this._user = user; - - UserBuilder? _realUser; - UserBuilder get realUser => _$this._realUser ??= new UserBuilder(); - set realUser(UserBuilder? realUser) => _$this._realUser = realUser; - - CanvasTokenBuilder(); - - CanvasTokenBuilder get _$this { - final $v = _$v; - if ($v != null) { - _accessToken = $v.accessToken; - _refreshToken = $v.refreshToken; - _user = $v.user?.toBuilder(); - _realUser = $v.realUser?.toBuilder(); - _$v = null; - } - return this; - } - - @override - void replace(CanvasToken other) { - ArgumentError.checkNotNull(other, 'other'); - _$v = other as _$CanvasToken; - } - - @override - void update(void Function(CanvasTokenBuilder)? updates) { - if (updates != null) updates(this); - } - - @override - CanvasToken build() => _build(); - - _$CanvasToken _build() { - _$CanvasToken _$result; - try { - _$result = _$v ?? - new _$CanvasToken._( - accessToken: BuiltValueNullFieldError.checkNotNull( - accessToken, r'CanvasToken', 'accessToken'), - refreshToken: refreshToken, - user: _user?.build(), - realUser: _realUser?.build()); - } catch (_) { - late String _$failedField; - try { - _$failedField = 'user'; - _user?.build(); - _$failedField = 'realUser'; - _realUser?.build(); - } catch (e) { - throw new BuiltValueNestedFieldError( - r'CanvasToken', _$failedField, e.toString()); - } - rethrow; - } - replace(_$result); - return _$result; - } -} - -// ignore_for_file: deprecated_member_use_from_same_package,type=lint diff --git a/apps/flutter_parent/lib/models/color_change_response.dart b/apps/flutter_parent/lib/models/color_change_response.dart deleted file mode 100644 index 8837da56c7..0000000000 --- a/apps/flutter_parent/lib/models/color_change_response.dart +++ /dev/null @@ -1,19 +0,0 @@ -import 'package:built_value/built_value.dart'; -import 'package:built_value/serializer.dart'; - -part 'color_change_response.g.dart'; - -/// To have this built_value be generated, run this command from the project root: -/// flutter pub run build_runner build --delete-conflicting-outputs -abstract class ColorChangeResponse implements Built { - @BuiltValueSerializer(serializeNulls: true) - static Serializer get serializer => _$colorChangeResponseSerializer; - - @BuiltValueField(wireName: 'hexcode') - String? get hexCode; - - ColorChangeResponse._(); - factory ColorChangeResponse([void Function(ColorChangeResponseBuilder) updates]) = _$ColorChangeResponse; - - static void _initializeBuilder(ColorChangeResponseBuilder b) => b..hexCode = null; -} \ No newline at end of file diff --git a/apps/flutter_parent/lib/models/color_change_response.g.dart b/apps/flutter_parent/lib/models/color_change_response.g.dart deleted file mode 100644 index e9622d18a8..0000000000 --- a/apps/flutter_parent/lib/models/color_change_response.g.dart +++ /dev/null @@ -1,144 +0,0 @@ -// GENERATED CODE - DO NOT MODIFY BY HAND - -part of 'color_change_response.dart'; - -// ************************************************************************** -// BuiltValueGenerator -// ************************************************************************** - -Serializer _$colorChangeResponseSerializer = - new _$ColorChangeResponseSerializer(); - -class _$ColorChangeResponseSerializer - implements StructuredSerializer { - @override - final Iterable types = const [ - ColorChangeResponse, - _$ColorChangeResponse - ]; - @override - final String wireName = 'ColorChangeResponse'; - - @override - Iterable serialize( - Serializers serializers, ColorChangeResponse object, - {FullType specifiedType = FullType.unspecified}) { - final result = []; - Object? value; - value = object.hexCode; - - result - ..add('hexcode') - ..add( - serializers.serialize(value, specifiedType: const FullType(String))); - - return result; - } - - @override - ColorChangeResponse deserialize( - Serializers serializers, Iterable serialized, - {FullType specifiedType = FullType.unspecified}) { - final result = new ColorChangeResponseBuilder(); - - final iterator = serialized.iterator; - while (iterator.moveNext()) { - final key = iterator.current! as String; - iterator.moveNext(); - final Object? value = iterator.current; - switch (key) { - case 'hexcode': - result.hexCode = serializers.deserialize(value, - specifiedType: const FullType(String)) as String?; - break; - } - } - - return result.build(); - } -} - -class _$ColorChangeResponse extends ColorChangeResponse { - @override - final String? hexCode; - - factory _$ColorChangeResponse( - [void Function(ColorChangeResponseBuilder)? updates]) => - (new ColorChangeResponseBuilder()..update(updates))._build(); - - _$ColorChangeResponse._({this.hexCode}) : super._(); - - @override - ColorChangeResponse rebuild( - void Function(ColorChangeResponseBuilder) updates) => - (toBuilder()..update(updates)).build(); - - @override - ColorChangeResponseBuilder toBuilder() => - new ColorChangeResponseBuilder()..replace(this); - - @override - bool operator ==(Object other) { - if (identical(other, this)) return true; - return other is ColorChangeResponse && hexCode == other.hexCode; - } - - @override - int get hashCode { - var _$hash = 0; - _$hash = $jc(_$hash, hexCode.hashCode); - _$hash = $jf(_$hash); - return _$hash; - } - - @override - String toString() { - return (newBuiltValueToStringHelper(r'ColorChangeResponse') - ..add('hexCode', hexCode)) - .toString(); - } -} - -class ColorChangeResponseBuilder - implements Builder { - _$ColorChangeResponse? _$v; - - String? _hexCode; - String? get hexCode => _$this._hexCode; - set hexCode(String? hexCode) => _$this._hexCode = hexCode; - - ColorChangeResponseBuilder() { - ColorChangeResponse._initializeBuilder(this); - } - - ColorChangeResponseBuilder get _$this { - final $v = _$v; - if ($v != null) { - _hexCode = $v.hexCode; - _$v = null; - } - return this; - } - - @override - void replace(ColorChangeResponse other) { - ArgumentError.checkNotNull(other, 'other'); - _$v = other as _$ColorChangeResponse; - } - - @override - void update(void Function(ColorChangeResponseBuilder)? updates) { - if (updates != null) updates(this); - } - - @override - ColorChangeResponse build() => _build(); - - _$ColorChangeResponse _build() { - final _$result = _$v ?? new _$ColorChangeResponse._(hexCode: hexCode); - replace(_$result); - return _$result; - } -} - -// ignore_for_file: deprecated_member_use_from_same_package,type=lint diff --git a/apps/flutter_parent/lib/models/conversation.dart b/apps/flutter_parent/lib/models/conversation.dart deleted file mode 100644 index fbc6f2a6a5..0000000000 --- a/apps/flutter_parent/lib/models/conversation.dart +++ /dev/null @@ -1,131 +0,0 @@ -// Copyright (C) 2019 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:built_collection/built_collection.dart'; -import 'package:built_value/built_value.dart'; -import 'package:built_value/serializer.dart'; - -import 'basic_user.dart'; -import 'message.dart'; - -part 'conversation.g.dart'; - -/// To have this built_value be generated, run this command from the project root: -/// flutter pub run build_runner build -abstract class Conversation implements Built { - @BuiltValueSerializer(serializeNulls: false) // Add this line to get nulls to serialize when we convert to JSON - static Serializer get serializer => _$conversationSerializer; - - /// The unique id for the conversation - String get id; - - /// Message Subject - String get subject; - - /// The workflowState of the conversation (unread, read, archived) - @BuiltValueField(wireName: 'workflow_state') - ConversationWorkflowState get workflowState; - - /// 100 character preview of the last message - @BuiltValueField(wireName: 'last_message') - String? get lastMessage; - - /// 100 character preview of the last authored message - @BuiltValueField(wireName: 'last_authored_message') - String? get lastAuthoredMessage; - - /// Date of the last message sent - @BuiltValueField(wireName: 'last_message_at') - DateTime? get lastMessageAt; - - @BuiltValueField(wireName: 'last_authored_message_at') - DateTime? get lastAuthoredMessageAt; - - // Number of messages in the conversation. - @BuiltValueField(wireName: 'message_count') - int get messageCount; - - /// Whether or not the user is subscribed to the current message - @BuiltValueField(wireName: 'subscribed') - bool get isSubscribed; - - /// Whether or not the message is starred - @BuiltValueField(wireName: 'starred') - bool get isStarred; - - /// The avatar to display. Knows if group, user, etc. - @BuiltValueField(wireName: 'avatar_url') - String? get avatarUrl; - - /// Whether this conversation is visible in the current context. Not 100% what that means - @BuiltValueField(wireName: 'visible') - bool get isVisible; - - /// The IDs of all people in the conversation. EXCLUDING the current user unless it's a monologue - BuiltList? get audience; - - /// The name and IDs of all participants in the conversation - BuiltList? get participants; - - /// Messages attached to the conversation - BuiltList? get messages; - - @BuiltValueField(wireName: 'context_name') - String? get contextName; - - @BuiltValueField(wireName: 'context_code') - String? get contextCode; - - bool isUnread() => workflowState == ConversationWorkflowState.unread; - - Conversation._(); - factory Conversation([void Function(ConversationBuilder) updates]) = _$Conversation; - - static void _initializeBuilder(ConversationBuilder b) => b - ..id = '' - ..subject = '' - ..messageCount = 0 - ..isSubscribed = false - ..workflowState = ConversationWorkflowState.unread - ..isStarred = false - ..isVisible = false; - - String? getContextId() { - if (contextCode == null) { - return null; - } - final index = contextCode!.indexOf('_'); - return contextCode!.substring(index + 1, contextCode!.length); - } -} - -@BuiltValueEnum(wireName: 'workflow_state') -class ConversationWorkflowState extends EnumClass { - const ConversationWorkflowState._(String name) : super(name); - - static BuiltSet get values => _$conversationWorkflowStateValues; - - static ConversationWorkflowState valueOf(String name) => _$conversationWorkflowStateValueOf(name); - - static Serializer get serializer => _$conversationWorkflowStateSerializer; - - static const ConversationWorkflowState read = _$conversationWorkflowStateRead; - - static const ConversationWorkflowState unread = _$conversationWorkflowStateUnread; - - static const ConversationWorkflowState archived = _$conversationWorkflowStateArchived; - - @BuiltValueEnumConst(fallback: true) - static const ConversationWorkflowState unknown = _$conversationWorkflowStateUnknown; -} diff --git a/apps/flutter_parent/lib/models/conversation.g.dart b/apps/flutter_parent/lib/models/conversation.g.dart deleted file mode 100644 index e1e6beac97..0000000000 --- a/apps/flutter_parent/lib/models/conversation.g.dart +++ /dev/null @@ -1,589 +0,0 @@ -// GENERATED CODE - DO NOT MODIFY BY HAND - -part of 'conversation.dart'; - -// ************************************************************************** -// BuiltValueGenerator -// ************************************************************************** - -const ConversationWorkflowState _$conversationWorkflowStateRead = - const ConversationWorkflowState._('read'); -const ConversationWorkflowState _$conversationWorkflowStateUnread = - const ConversationWorkflowState._('unread'); -const ConversationWorkflowState _$conversationWorkflowStateArchived = - const ConversationWorkflowState._('archived'); -const ConversationWorkflowState _$conversationWorkflowStateUnknown = - const ConversationWorkflowState._('unknown'); - -ConversationWorkflowState _$conversationWorkflowStateValueOf(String name) { - switch (name) { - case 'read': - return _$conversationWorkflowStateRead; - case 'unread': - return _$conversationWorkflowStateUnread; - case 'archived': - return _$conversationWorkflowStateArchived; - case 'unknown': - return _$conversationWorkflowStateUnknown; - default: - return _$conversationWorkflowStateUnknown; - } -} - -final BuiltSet _$conversationWorkflowStateValues = - new BuiltSet(const [ - _$conversationWorkflowStateRead, - _$conversationWorkflowStateUnread, - _$conversationWorkflowStateArchived, - _$conversationWorkflowStateUnknown, -]); - -Serializer _$conversationSerializer = - new _$ConversationSerializer(); -Serializer _$conversationWorkflowStateSerializer = - new _$ConversationWorkflowStateSerializer(); - -class _$ConversationSerializer implements StructuredSerializer { - @override - final Iterable types = const [Conversation, _$Conversation]; - @override - final String wireName = 'Conversation'; - - @override - Iterable serialize(Serializers serializers, Conversation object, - {FullType specifiedType = FullType.unspecified}) { - final result = [ - 'id', - serializers.serialize(object.id, specifiedType: const FullType(String)), - 'subject', - serializers.serialize(object.subject, - specifiedType: const FullType(String)), - 'workflow_state', - serializers.serialize(object.workflowState, - specifiedType: const FullType(ConversationWorkflowState)), - 'message_count', - serializers.serialize(object.messageCount, - specifiedType: const FullType(int)), - 'subscribed', - serializers.serialize(object.isSubscribed, - specifiedType: const FullType(bool)), - 'starred', - serializers.serialize(object.isStarred, - specifiedType: const FullType(bool)), - 'visible', - serializers.serialize(object.isVisible, - specifiedType: const FullType(bool)), - ]; - Object? value; - value = object.lastMessage; - if (value != null) { - result - ..add('last_message') - ..add(serializers.serialize(value, - specifiedType: const FullType(String))); - } - value = object.lastAuthoredMessage; - if (value != null) { - result - ..add('last_authored_message') - ..add(serializers.serialize(value, - specifiedType: const FullType(String))); - } - value = object.lastMessageAt; - if (value != null) { - result - ..add('last_message_at') - ..add(serializers.serialize(value, - specifiedType: const FullType(DateTime))); - } - value = object.lastAuthoredMessageAt; - if (value != null) { - result - ..add('last_authored_message_at') - ..add(serializers.serialize(value, - specifiedType: const FullType(DateTime))); - } - value = object.avatarUrl; - if (value != null) { - result - ..add('avatar_url') - ..add(serializers.serialize(value, - specifiedType: const FullType(String))); - } - value = object.audience; - if (value != null) { - result - ..add('audience') - ..add(serializers.serialize(value, - specifiedType: - const FullType(BuiltList, const [const FullType(String)]))); - } - value = object.participants; - if (value != null) { - result - ..add('participants') - ..add(serializers.serialize(value, - specifiedType: - const FullType(BuiltList, const [const FullType(BasicUser)]))); - } - value = object.messages; - if (value != null) { - result - ..add('messages') - ..add(serializers.serialize(value, - specifiedType: - const FullType(BuiltList, const [const FullType(Message)]))); - } - value = object.contextName; - if (value != null) { - result - ..add('context_name') - ..add(serializers.serialize(value, - specifiedType: const FullType(String))); - } - value = object.contextCode; - if (value != null) { - result - ..add('context_code') - ..add(serializers.serialize(value, - specifiedType: const FullType(String))); - } - return result; - } - - @override - Conversation deserialize( - Serializers serializers, Iterable serialized, - {FullType specifiedType = FullType.unspecified}) { - final result = new ConversationBuilder(); - - final iterator = serialized.iterator; - while (iterator.moveNext()) { - final key = iterator.current! as String; - iterator.moveNext(); - final Object? value = iterator.current; - switch (key) { - case 'id': - result.id = serializers.deserialize(value, - specifiedType: const FullType(String))! as String; - break; - case 'subject': - result.subject = serializers.deserialize(value, - specifiedType: const FullType(String))! as String; - break; - case 'workflow_state': - result.workflowState = serializers.deserialize(value, - specifiedType: const FullType(ConversationWorkflowState))! - as ConversationWorkflowState; - break; - case 'last_message': - result.lastMessage = serializers.deserialize(value, - specifiedType: const FullType(String)) as String?; - break; - case 'last_authored_message': - result.lastAuthoredMessage = serializers.deserialize(value, - specifiedType: const FullType(String)) as String?; - break; - case 'last_message_at': - result.lastMessageAt = serializers.deserialize(value, - specifiedType: const FullType(DateTime)) as DateTime?; - break; - case 'last_authored_message_at': - result.lastAuthoredMessageAt = serializers.deserialize(value, - specifiedType: const FullType(DateTime)) as DateTime?; - break; - case 'message_count': - result.messageCount = serializers.deserialize(value, - specifiedType: const FullType(int))! as int; - break; - case 'subscribed': - result.isSubscribed = serializers.deserialize(value, - specifiedType: const FullType(bool))! as bool; - break; - case 'starred': - result.isStarred = serializers.deserialize(value, - specifiedType: const FullType(bool))! as bool; - break; - case 'avatar_url': - result.avatarUrl = serializers.deserialize(value, - specifiedType: const FullType(String)) as String?; - break; - case 'visible': - result.isVisible = serializers.deserialize(value, - specifiedType: const FullType(bool))! as bool; - break; - case 'audience': - result.audience.replace(serializers.deserialize(value, - specifiedType: const FullType( - BuiltList, const [const FullType(String)]))! - as BuiltList); - break; - case 'participants': - result.participants.replace(serializers.deserialize(value, - specifiedType: const FullType( - BuiltList, const [const FullType(BasicUser)]))! - as BuiltList); - break; - case 'messages': - result.messages.replace(serializers.deserialize(value, - specifiedType: const FullType( - BuiltList, const [const FullType(Message)]))! - as BuiltList); - break; - case 'context_name': - result.contextName = serializers.deserialize(value, - specifiedType: const FullType(String)) as String?; - break; - case 'context_code': - result.contextCode = serializers.deserialize(value, - specifiedType: const FullType(String)) as String?; - break; - } - } - - return result.build(); - } -} - -class _$ConversationWorkflowStateSerializer - implements PrimitiveSerializer { - @override - final Iterable types = const [ConversationWorkflowState]; - @override - final String wireName = 'workflow_state'; - - @override - Object serialize(Serializers serializers, ConversationWorkflowState object, - {FullType specifiedType = FullType.unspecified}) => - object.name; - - @override - ConversationWorkflowState deserialize( - Serializers serializers, Object serialized, - {FullType specifiedType = FullType.unspecified}) => - ConversationWorkflowState.valueOf(serialized as String); -} - -class _$Conversation extends Conversation { - @override - final String id; - @override - final String subject; - @override - final ConversationWorkflowState workflowState; - @override - final String? lastMessage; - @override - final String? lastAuthoredMessage; - @override - final DateTime? lastMessageAt; - @override - final DateTime? lastAuthoredMessageAt; - @override - final int messageCount; - @override - final bool isSubscribed; - @override - final bool isStarred; - @override - final String? avatarUrl; - @override - final bool isVisible; - @override - final BuiltList? audience; - @override - final BuiltList? participants; - @override - final BuiltList? messages; - @override - final String? contextName; - @override - final String? contextCode; - - factory _$Conversation([void Function(ConversationBuilder)? updates]) => - (new ConversationBuilder()..update(updates))._build(); - - _$Conversation._( - {required this.id, - required this.subject, - required this.workflowState, - this.lastMessage, - this.lastAuthoredMessage, - this.lastMessageAt, - this.lastAuthoredMessageAt, - required this.messageCount, - required this.isSubscribed, - required this.isStarred, - this.avatarUrl, - required this.isVisible, - this.audience, - this.participants, - this.messages, - this.contextName, - this.contextCode}) - : super._() { - BuiltValueNullFieldError.checkNotNull(id, r'Conversation', 'id'); - BuiltValueNullFieldError.checkNotNull(subject, r'Conversation', 'subject'); - BuiltValueNullFieldError.checkNotNull( - workflowState, r'Conversation', 'workflowState'); - BuiltValueNullFieldError.checkNotNull( - messageCount, r'Conversation', 'messageCount'); - BuiltValueNullFieldError.checkNotNull( - isSubscribed, r'Conversation', 'isSubscribed'); - BuiltValueNullFieldError.checkNotNull( - isStarred, r'Conversation', 'isStarred'); - BuiltValueNullFieldError.checkNotNull( - isVisible, r'Conversation', 'isVisible'); - } - - @override - Conversation rebuild(void Function(ConversationBuilder) updates) => - (toBuilder()..update(updates)).build(); - - @override - ConversationBuilder toBuilder() => new ConversationBuilder()..replace(this); - - @override - bool operator ==(Object other) { - if (identical(other, this)) return true; - return other is Conversation && - id == other.id && - subject == other.subject && - workflowState == other.workflowState && - lastMessage == other.lastMessage && - lastAuthoredMessage == other.lastAuthoredMessage && - lastMessageAt == other.lastMessageAt && - lastAuthoredMessageAt == other.lastAuthoredMessageAt && - messageCount == other.messageCount && - isSubscribed == other.isSubscribed && - isStarred == other.isStarred && - avatarUrl == other.avatarUrl && - isVisible == other.isVisible && - audience == other.audience && - participants == other.participants && - messages == other.messages && - contextName == other.contextName && - contextCode == other.contextCode; - } - - @override - int get hashCode { - var _$hash = 0; - _$hash = $jc(_$hash, id.hashCode); - _$hash = $jc(_$hash, subject.hashCode); - _$hash = $jc(_$hash, workflowState.hashCode); - _$hash = $jc(_$hash, lastMessage.hashCode); - _$hash = $jc(_$hash, lastAuthoredMessage.hashCode); - _$hash = $jc(_$hash, lastMessageAt.hashCode); - _$hash = $jc(_$hash, lastAuthoredMessageAt.hashCode); - _$hash = $jc(_$hash, messageCount.hashCode); - _$hash = $jc(_$hash, isSubscribed.hashCode); - _$hash = $jc(_$hash, isStarred.hashCode); - _$hash = $jc(_$hash, avatarUrl.hashCode); - _$hash = $jc(_$hash, isVisible.hashCode); - _$hash = $jc(_$hash, audience.hashCode); - _$hash = $jc(_$hash, participants.hashCode); - _$hash = $jc(_$hash, messages.hashCode); - _$hash = $jc(_$hash, contextName.hashCode); - _$hash = $jc(_$hash, contextCode.hashCode); - _$hash = $jf(_$hash); - return _$hash; - } - - @override - String toString() { - return (newBuiltValueToStringHelper(r'Conversation') - ..add('id', id) - ..add('subject', subject) - ..add('workflowState', workflowState) - ..add('lastMessage', lastMessage) - ..add('lastAuthoredMessage', lastAuthoredMessage) - ..add('lastMessageAt', lastMessageAt) - ..add('lastAuthoredMessageAt', lastAuthoredMessageAt) - ..add('messageCount', messageCount) - ..add('isSubscribed', isSubscribed) - ..add('isStarred', isStarred) - ..add('avatarUrl', avatarUrl) - ..add('isVisible', isVisible) - ..add('audience', audience) - ..add('participants', participants) - ..add('messages', messages) - ..add('contextName', contextName) - ..add('contextCode', contextCode)) - .toString(); - } -} - -class ConversationBuilder - implements Builder { - _$Conversation? _$v; - - String? _id; - String? get id => _$this._id; - set id(String? id) => _$this._id = id; - - String? _subject; - String? get subject => _$this._subject; - set subject(String? subject) => _$this._subject = subject; - - ConversationWorkflowState? _workflowState; - ConversationWorkflowState? get workflowState => _$this._workflowState; - set workflowState(ConversationWorkflowState? workflowState) => - _$this._workflowState = workflowState; - - String? _lastMessage; - String? get lastMessage => _$this._lastMessage; - set lastMessage(String? lastMessage) => _$this._lastMessage = lastMessage; - - String? _lastAuthoredMessage; - String? get lastAuthoredMessage => _$this._lastAuthoredMessage; - set lastAuthoredMessage(String? lastAuthoredMessage) => - _$this._lastAuthoredMessage = lastAuthoredMessage; - - DateTime? _lastMessageAt; - DateTime? get lastMessageAt => _$this._lastMessageAt; - set lastMessageAt(DateTime? lastMessageAt) => - _$this._lastMessageAt = lastMessageAt; - - DateTime? _lastAuthoredMessageAt; - DateTime? get lastAuthoredMessageAt => _$this._lastAuthoredMessageAt; - set lastAuthoredMessageAt(DateTime? lastAuthoredMessageAt) => - _$this._lastAuthoredMessageAt = lastAuthoredMessageAt; - - int? _messageCount; - int? get messageCount => _$this._messageCount; - set messageCount(int? messageCount) => _$this._messageCount = messageCount; - - bool? _isSubscribed; - bool? get isSubscribed => _$this._isSubscribed; - set isSubscribed(bool? isSubscribed) => _$this._isSubscribed = isSubscribed; - - bool? _isStarred; - bool? get isStarred => _$this._isStarred; - set isStarred(bool? isStarred) => _$this._isStarred = isStarred; - - String? _avatarUrl; - String? get avatarUrl => _$this._avatarUrl; - set avatarUrl(String? avatarUrl) => _$this._avatarUrl = avatarUrl; - - bool? _isVisible; - bool? get isVisible => _$this._isVisible; - set isVisible(bool? isVisible) => _$this._isVisible = isVisible; - - ListBuilder? _audience; - ListBuilder get audience => - _$this._audience ??= new ListBuilder(); - set audience(ListBuilder? audience) => _$this._audience = audience; - - ListBuilder? _participants; - ListBuilder get participants => - _$this._participants ??= new ListBuilder(); - set participants(ListBuilder? participants) => - _$this._participants = participants; - - ListBuilder? _messages; - ListBuilder get messages => - _$this._messages ??= new ListBuilder(); - set messages(ListBuilder? messages) => _$this._messages = messages; - - String? _contextName; - String? get contextName => _$this._contextName; - set contextName(String? contextName) => _$this._contextName = contextName; - - String? _contextCode; - String? get contextCode => _$this._contextCode; - set contextCode(String? contextCode) => _$this._contextCode = contextCode; - - ConversationBuilder() { - Conversation._initializeBuilder(this); - } - - ConversationBuilder get _$this { - final $v = _$v; - if ($v != null) { - _id = $v.id; - _subject = $v.subject; - _workflowState = $v.workflowState; - _lastMessage = $v.lastMessage; - _lastAuthoredMessage = $v.lastAuthoredMessage; - _lastMessageAt = $v.lastMessageAt; - _lastAuthoredMessageAt = $v.lastAuthoredMessageAt; - _messageCount = $v.messageCount; - _isSubscribed = $v.isSubscribed; - _isStarred = $v.isStarred; - _avatarUrl = $v.avatarUrl; - _isVisible = $v.isVisible; - _audience = $v.audience?.toBuilder(); - _participants = $v.participants?.toBuilder(); - _messages = $v.messages?.toBuilder(); - _contextName = $v.contextName; - _contextCode = $v.contextCode; - _$v = null; - } - return this; - } - - @override - void replace(Conversation other) { - ArgumentError.checkNotNull(other, 'other'); - _$v = other as _$Conversation; - } - - @override - void update(void Function(ConversationBuilder)? updates) { - if (updates != null) updates(this); - } - - @override - Conversation build() => _build(); - - _$Conversation _build() { - _$Conversation _$result; - try { - _$result = _$v ?? - new _$Conversation._( - id: BuiltValueNullFieldError.checkNotNull( - id, r'Conversation', 'id'), - subject: BuiltValueNullFieldError.checkNotNull( - subject, r'Conversation', 'subject'), - workflowState: BuiltValueNullFieldError.checkNotNull( - workflowState, r'Conversation', 'workflowState'), - lastMessage: lastMessage, - lastAuthoredMessage: lastAuthoredMessage, - lastMessageAt: lastMessageAt, - lastAuthoredMessageAt: lastAuthoredMessageAt, - messageCount: BuiltValueNullFieldError.checkNotNull( - messageCount, r'Conversation', 'messageCount'), - isSubscribed: BuiltValueNullFieldError.checkNotNull( - isSubscribed, r'Conversation', 'isSubscribed'), - isStarred: BuiltValueNullFieldError.checkNotNull( - isStarred, r'Conversation', 'isStarred'), - avatarUrl: avatarUrl, - isVisible: BuiltValueNullFieldError.checkNotNull( - isVisible, r'Conversation', 'isVisible'), - audience: _audience?.build(), - participants: _participants?.build(), - messages: _messages?.build(), - contextName: contextName, - contextCode: contextCode); - } catch (_) { - late String _$failedField; - try { - _$failedField = 'audience'; - _audience?.build(); - _$failedField = 'participants'; - _participants?.build(); - _$failedField = 'messages'; - _messages?.build(); - } catch (e) { - throw new BuiltValueNestedFieldError( - r'Conversation', _$failedField, e.toString()); - } - rethrow; - } - replace(_$result); - return _$result; - } -} - -// ignore_for_file: deprecated_member_use_from_same_package,type=lint diff --git a/apps/flutter_parent/lib/models/course.dart b/apps/flutter_parent/lib/models/course.dart deleted file mode 100644 index 9c704943da..0000000000 --- a/apps/flutter_parent/lib/models/course.dart +++ /dev/null @@ -1,203 +0,0 @@ -// Copyright (C) 2019 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -library course; - -import 'package:built_collection/built_collection.dart'; -import 'package:built_value/built_value.dart'; -import 'package:built_value/json_object.dart'; -import 'package:built_value/serializer.dart'; -import 'package:collection/collection.dart'; -import 'package:flutter_parent/models/course_settings.dart'; -import 'package:flutter_parent/models/grading_scheme_item.dart'; -import 'package:flutter_parent/models/section.dart'; -import 'package:flutter_parent/models/term.dart'; - -import 'course_grade.dart'; -import 'enrollment.dart'; - -part 'course.g.dart'; - -/// To have this built_value be generated, run this command from the project root: -/// flutter packages pub run build_runner build --delete-conflicting-outputs -abstract class Course implements Built { - @BuiltValueSerializer(serializeNulls: true) - static Serializer get serializer => _$courseSerializer; - - Course._(); - - factory Course([void Function(CourseBuilder) updates]) = _$Course; - - // Helper variables - @BuiltValueField(serialize: false) - double? get currentScore; - - @BuiltValueField(serialize: false) - double? get finalScore; - - @BuiltValueField(serialize: false) - String? get currentGrade; - - @BuiltValueField(serialize: false) - String? get finalGrade; - - String get id; - - String get name; - - @BuiltValueField(wireName: 'original_name') - String? get originalName; - - @BuiltValueField(wireName: 'course_code') - String? get courseCode; - - @BuiltValueField(wireName: 'start_at') - DateTime? get startAt; - - @BuiltValueField(wireName: 'end_at') - DateTime? get endAt; - - @BuiltValueField(wireName: 'syllabus_body') - String? get syllabusBody; - - @BuiltValueField(wireName: 'hide_final_grades') - bool get hideFinalGrades; - - @BuiltValueField(wireName: 'is_public') - bool get isPublic; - - BuiltList? get enrollments; - - @BuiltValueField(wireName: 'needs_grading_count') - int get needsGradingCount; - - @BuiltValueField(wireName: 'apply_assignment_group_weights') - bool get applyAssignmentGroupWeights; - - @BuiltValueField(wireName: 'is_favorite') - bool get isFavorite; - - @BuiltValueField(wireName: 'access_restricted_by_date') - bool get accessRestrictedByDate; - - @BuiltValueField(wireName: 'image_download_url') - String? get imageDownloadUrl; - - @BuiltValueField(wireName: 'has_weighted_grading_periods') - bool get hasWeightedGradingPeriods; - - @BuiltValueField(wireName: 'has_grading_periods') - bool get hasGradingPeriods; - - @BuiltValueField(wireName: 'restrict_enrollments_to_course_dates') - bool get restrictEnrollmentsToCourseDates; - - @BuiltValueField(wireName: 'workflow_state') - String? get workflowState; - - @BuiltValueField(wireName: 'default_view') - HomePage? get homePage; - - Term? get term; - - BuiltList
? get sections; - - CourseSettings? get settings; - - @BuiltValueField(wireName: 'grading_scheme') - BuiltList? get gradingScheme; - - List get gradingSchemeItems { - if (gradingScheme == null) return []; - return gradingScheme!.map((item) => GradingSchemeItem.fromJson(item)).nonNulls.where((element) => element.grade != null && element.value != null).toList() - ..sort((a, b) => b.value!.compareTo(a.value!)); - } - - static void _initializeBuilder(CourseBuilder b) => b - ..id = '' - ..enrollments = ListBuilder() - ..sections = ListBuilder
() - ..name = '' - ..needsGradingCount = 0 - ..hideFinalGrades = false - ..isPublic = false - ..applyAssignmentGroupWeights = false - ..isFavorite = false - ..accessRestrictedByDate = false - ..hasWeightedGradingPeriods = false - ..hasGradingPeriods = false - ..restrictEnrollmentsToCourseDates = false; - - /// Get the course grade. - /// Optional: - /// [forceAllPeriods] -> Used to determine if there's an active grading period on the enrollment, true for this will - /// always force no active grading period - /// [enrollment] -> If specified, will use for the grading period grades, unless a non-null value is provided this - /// will default to the student's enrollment in the course - /// [gradingPeriodId] -> Only used when [enrollment] is not provided or is null, when pulling the student's enrollment - /// from the course will also match based on [Enrollment.currentGradingPeriodId] - CourseGrade getCourseGrade( - String? studentId, { - Enrollment? enrollment, - String? gradingPeriodId, - bool forceAllPeriods = false, - }) => - CourseGrade( - this, - enrollment ?? - enrollments?.firstWhereOrNull( - (enrollment) => - enrollment.userId == studentId && - (gradingPeriodId == null || - gradingPeriodId.isEmpty || - gradingPeriodId == enrollment.currentGradingPeriodId), - ), - forceAllPeriods: forceAllPeriods, - ); - - String contextFilterId() => 'course_${this.id}'; - - /// Filters enrollments by those associated with the currently selected user - bool isValidForCurrentStudent(String? currentStudentId) { - return enrollments?.any((enrollment) => enrollment.userId == currentStudentId) ?? false; - } - - String convertScoreToLetterGrade(double score, double maxScore) { - if (maxScore == 0.0 || gradingSchemeItems.isEmpty) return ""; - double percent = score / maxScore; - return gradingSchemeItems.firstWhere((element) => percent >= element.value!, orElse: () => gradingSchemeItems.last).grade!; - } -} - -@BuiltValueEnum(wireName: 'default_view') -class HomePage extends EnumClass { - const HomePage._(String name) : super(name); - - static BuiltSet get values => _$homePageValues; - - static HomePage valueOf(String name) => _$homePageValueOf(name); - - static Serializer get serializer => _$homePageSerializer; - - static const HomePage feed = _$homePageFeed; - - /// Front Page - static const HomePage wiki = _$homePageWiki; - - static const HomePage modules = _$homePageModules; - - static const HomePage assignments = _$homePageAssignments; - - @BuiltValueEnumConst(fallback: true) - static const HomePage syllabus = _$homePageSyllabus; -} diff --git a/apps/flutter_parent/lib/models/course.g.dart b/apps/flutter_parent/lib/models/course.g.dart deleted file mode 100644 index 4da07d1242..0000000000 --- a/apps/flutter_parent/lib/models/course.g.dart +++ /dev/null @@ -1,787 +0,0 @@ -// GENERATED CODE - DO NOT MODIFY BY HAND - -part of 'course.dart'; - -// ************************************************************************** -// BuiltValueGenerator -// ************************************************************************** - -const HomePage _$homePageFeed = const HomePage._('feed'); -const HomePage _$homePageWiki = const HomePage._('wiki'); -const HomePage _$homePageModules = const HomePage._('modules'); -const HomePage _$homePageAssignments = const HomePage._('assignments'); -const HomePage _$homePageSyllabus = const HomePage._('syllabus'); - -HomePage _$homePageValueOf(String name) { - switch (name) { - case 'feed': - return _$homePageFeed; - case 'wiki': - return _$homePageWiki; - case 'modules': - return _$homePageModules; - case 'assignments': - return _$homePageAssignments; - case 'syllabus': - return _$homePageSyllabus; - default: - return _$homePageSyllabus; - } -} - -final BuiltSet _$homePageValues = - new BuiltSet(const [ - _$homePageFeed, - _$homePageWiki, - _$homePageModules, - _$homePageAssignments, - _$homePageSyllabus, -]); - -Serializer _$courseSerializer = new _$CourseSerializer(); -Serializer _$homePageSerializer = new _$HomePageSerializer(); - -class _$CourseSerializer implements StructuredSerializer { - @override - final Iterable types = const [Course, _$Course]; - @override - final String wireName = 'Course'; - - @override - Iterable serialize(Serializers serializers, Course object, - {FullType specifiedType = FullType.unspecified}) { - final result = [ - 'id', - serializers.serialize(object.id, specifiedType: const FullType(String)), - 'name', - serializers.serialize(object.name, specifiedType: const FullType(String)), - 'hide_final_grades', - serializers.serialize(object.hideFinalGrades, - specifiedType: const FullType(bool)), - 'is_public', - serializers.serialize(object.isPublic, - specifiedType: const FullType(bool)), - 'needs_grading_count', - serializers.serialize(object.needsGradingCount, - specifiedType: const FullType(int)), - 'apply_assignment_group_weights', - serializers.serialize(object.applyAssignmentGroupWeights, - specifiedType: const FullType(bool)), - 'is_favorite', - serializers.serialize(object.isFavorite, - specifiedType: const FullType(bool)), - 'access_restricted_by_date', - serializers.serialize(object.accessRestrictedByDate, - specifiedType: const FullType(bool)), - 'has_weighted_grading_periods', - serializers.serialize(object.hasWeightedGradingPeriods, - specifiedType: const FullType(bool)), - 'has_grading_periods', - serializers.serialize(object.hasGradingPeriods, - specifiedType: const FullType(bool)), - 'restrict_enrollments_to_course_dates', - serializers.serialize(object.restrictEnrollmentsToCourseDates, - specifiedType: const FullType(bool)), - ]; - Object? value; - value = object.originalName; - - result - ..add('original_name') - ..add( - serializers.serialize(value, specifiedType: const FullType(String))); - value = object.courseCode; - - result - ..add('course_code') - ..add( - serializers.serialize(value, specifiedType: const FullType(String))); - value = object.startAt; - - result - ..add('start_at') - ..add(serializers.serialize(value, - specifiedType: const FullType(DateTime))); - value = object.endAt; - - result - ..add('end_at') - ..add(serializers.serialize(value, - specifiedType: const FullType(DateTime))); - value = object.syllabusBody; - - result - ..add('syllabus_body') - ..add( - serializers.serialize(value, specifiedType: const FullType(String))); - value = object.enrollments; - - result - ..add('enrollments') - ..add(serializers.serialize(value, - specifiedType: - const FullType(BuiltList, const [const FullType(Enrollment)]))); - value = object.imageDownloadUrl; - - result - ..add('image_download_url') - ..add( - serializers.serialize(value, specifiedType: const FullType(String))); - value = object.workflowState; - - result - ..add('workflow_state') - ..add( - serializers.serialize(value, specifiedType: const FullType(String))); - value = object.homePage; - - result - ..add('default_view') - ..add(serializers.serialize(value, - specifiedType: const FullType(HomePage))); - value = object.term; - - result - ..add('term') - ..add(serializers.serialize(value, specifiedType: const FullType(Term))); - value = object.sections; - - result - ..add('sections') - ..add(serializers.serialize(value, - specifiedType: - const FullType(BuiltList, const [const FullType(Section)]))); - value = object.settings; - - result - ..add('settings') - ..add(serializers.serialize(value, - specifiedType: const FullType(CourseSettings))); - value = object.gradingScheme; - - result - ..add('grading_scheme') - ..add(serializers.serialize(value, - specifiedType: - const FullType(BuiltList, const [const FullType(JsonObject)]))); - - return result; - } - - @override - Course deserialize(Serializers serializers, Iterable serialized, - {FullType specifiedType = FullType.unspecified}) { - final result = new CourseBuilder(); - - final iterator = serialized.iterator; - while (iterator.moveNext()) { - final key = iterator.current! as String; - iterator.moveNext(); - final Object? value = iterator.current; - switch (key) { - case 'id': - result.id = serializers.deserialize(value, - specifiedType: const FullType(String))! as String; - break; - case 'name': - result.name = serializers.deserialize(value, - specifiedType: const FullType(String))! as String; - break; - case 'original_name': - result.originalName = serializers.deserialize(value, - specifiedType: const FullType(String)) as String?; - break; - case 'course_code': - result.courseCode = serializers.deserialize(value, - specifiedType: const FullType(String)) as String?; - break; - case 'start_at': - result.startAt = serializers.deserialize(value, - specifiedType: const FullType(DateTime)) as DateTime?; - break; - case 'end_at': - result.endAt = serializers.deserialize(value, - specifiedType: const FullType(DateTime)) as DateTime?; - break; - case 'syllabus_body': - result.syllabusBody = serializers.deserialize(value, - specifiedType: const FullType(String)) as String?; - break; - case 'hide_final_grades': - result.hideFinalGrades = serializers.deserialize(value, - specifiedType: const FullType(bool))! as bool; - break; - case 'is_public': - result.isPublic = serializers.deserialize(value, - specifiedType: const FullType(bool))! as bool; - break; - case 'enrollments': - result.enrollments.replace(serializers.deserialize(value, - specifiedType: const FullType( - BuiltList, const [const FullType(Enrollment)]))! - as BuiltList); - break; - case 'needs_grading_count': - result.needsGradingCount = serializers.deserialize(value, - specifiedType: const FullType(int))! as int; - break; - case 'apply_assignment_group_weights': - result.applyAssignmentGroupWeights = serializers.deserialize(value, - specifiedType: const FullType(bool))! as bool; - break; - case 'is_favorite': - result.isFavorite = serializers.deserialize(value, - specifiedType: const FullType(bool))! as bool; - break; - case 'access_restricted_by_date': - result.accessRestrictedByDate = serializers.deserialize(value, - specifiedType: const FullType(bool))! as bool; - break; - case 'image_download_url': - result.imageDownloadUrl = serializers.deserialize(value, - specifiedType: const FullType(String)) as String?; - break; - case 'has_weighted_grading_periods': - result.hasWeightedGradingPeriods = serializers.deserialize(value, - specifiedType: const FullType(bool))! as bool; - break; - case 'has_grading_periods': - result.hasGradingPeriods = serializers.deserialize(value, - specifiedType: const FullType(bool))! as bool; - break; - case 'restrict_enrollments_to_course_dates': - result.restrictEnrollmentsToCourseDates = serializers - .deserialize(value, specifiedType: const FullType(bool))! as bool; - break; - case 'workflow_state': - result.workflowState = serializers.deserialize(value, - specifiedType: const FullType(String)) as String?; - break; - case 'default_view': - result.homePage = serializers.deserialize(value, - specifiedType: const FullType(HomePage)) as HomePage?; - break; - case 'term': - result.term.replace(serializers.deserialize(value, - specifiedType: const FullType(Term))! as Term); - break; - case 'sections': - result.sections.replace(serializers.deserialize(value, - specifiedType: const FullType( - BuiltList, const [const FullType(Section)]))! - as BuiltList); - break; - case 'settings': - result.settings.replace(serializers.deserialize(value, - specifiedType: const FullType(CourseSettings))! - as CourseSettings); - break; - case 'grading_scheme': - result.gradingScheme.replace(serializers.deserialize(value, - specifiedType: const FullType( - BuiltList, const [const FullType(JsonObject)]))! - as BuiltList); - break; - } - } - - return result.build(); - } -} - -class _$HomePageSerializer implements PrimitiveSerializer { - @override - final Iterable types = const [HomePage]; - @override - final String wireName = 'default_view'; - - @override - Object serialize(Serializers serializers, HomePage object, - {FullType specifiedType = FullType.unspecified}) => - object.name; - - @override - HomePage deserialize(Serializers serializers, Object serialized, - {FullType specifiedType = FullType.unspecified}) => - HomePage.valueOf(serialized as String); -} - -class _$Course extends Course { - @override - final double? currentScore; - @override - final double? finalScore; - @override - final String? currentGrade; - @override - final String? finalGrade; - @override - final String id; - @override - final String name; - @override - final String? originalName; - @override - final String? courseCode; - @override - final DateTime? startAt; - @override - final DateTime? endAt; - @override - final String? syllabusBody; - @override - final bool hideFinalGrades; - @override - final bool isPublic; - @override - final BuiltList? enrollments; - @override - final int needsGradingCount; - @override - final bool applyAssignmentGroupWeights; - @override - final bool isFavorite; - @override - final bool accessRestrictedByDate; - @override - final String? imageDownloadUrl; - @override - final bool hasWeightedGradingPeriods; - @override - final bool hasGradingPeriods; - @override - final bool restrictEnrollmentsToCourseDates; - @override - final String? workflowState; - @override - final HomePage? homePage; - @override - final Term? term; - @override - final BuiltList
? sections; - @override - final CourseSettings? settings; - @override - final BuiltList? gradingScheme; - - factory _$Course([void Function(CourseBuilder)? updates]) => - (new CourseBuilder()..update(updates))._build(); - - _$Course._( - {this.currentScore, - this.finalScore, - this.currentGrade, - this.finalGrade, - required this.id, - required this.name, - this.originalName, - this.courseCode, - this.startAt, - this.endAt, - this.syllabusBody, - required this.hideFinalGrades, - required this.isPublic, - this.enrollments, - required this.needsGradingCount, - required this.applyAssignmentGroupWeights, - required this.isFavorite, - required this.accessRestrictedByDate, - this.imageDownloadUrl, - required this.hasWeightedGradingPeriods, - required this.hasGradingPeriods, - required this.restrictEnrollmentsToCourseDates, - this.workflowState, - this.homePage, - this.term, - this.sections, - this.settings, - this.gradingScheme}) - : super._() { - BuiltValueNullFieldError.checkNotNull(id, r'Course', 'id'); - BuiltValueNullFieldError.checkNotNull(name, r'Course', 'name'); - BuiltValueNullFieldError.checkNotNull( - hideFinalGrades, r'Course', 'hideFinalGrades'); - BuiltValueNullFieldError.checkNotNull(isPublic, r'Course', 'isPublic'); - BuiltValueNullFieldError.checkNotNull( - needsGradingCount, r'Course', 'needsGradingCount'); - BuiltValueNullFieldError.checkNotNull( - applyAssignmentGroupWeights, r'Course', 'applyAssignmentGroupWeights'); - BuiltValueNullFieldError.checkNotNull(isFavorite, r'Course', 'isFavorite'); - BuiltValueNullFieldError.checkNotNull( - accessRestrictedByDate, r'Course', 'accessRestrictedByDate'); - BuiltValueNullFieldError.checkNotNull( - hasWeightedGradingPeriods, r'Course', 'hasWeightedGradingPeriods'); - BuiltValueNullFieldError.checkNotNull( - hasGradingPeriods, r'Course', 'hasGradingPeriods'); - BuiltValueNullFieldError.checkNotNull(restrictEnrollmentsToCourseDates, - r'Course', 'restrictEnrollmentsToCourseDates'); - } - - @override - Course rebuild(void Function(CourseBuilder) updates) => - (toBuilder()..update(updates)).build(); - - @override - CourseBuilder toBuilder() => new CourseBuilder()..replace(this); - - @override - bool operator ==(Object other) { - if (identical(other, this)) return true; - return other is Course && - currentScore == other.currentScore && - finalScore == other.finalScore && - currentGrade == other.currentGrade && - finalGrade == other.finalGrade && - id == other.id && - name == other.name && - originalName == other.originalName && - courseCode == other.courseCode && - startAt == other.startAt && - endAt == other.endAt && - syllabusBody == other.syllabusBody && - hideFinalGrades == other.hideFinalGrades && - isPublic == other.isPublic && - enrollments == other.enrollments && - needsGradingCount == other.needsGradingCount && - applyAssignmentGroupWeights == other.applyAssignmentGroupWeights && - isFavorite == other.isFavorite && - accessRestrictedByDate == other.accessRestrictedByDate && - imageDownloadUrl == other.imageDownloadUrl && - hasWeightedGradingPeriods == other.hasWeightedGradingPeriods && - hasGradingPeriods == other.hasGradingPeriods && - restrictEnrollmentsToCourseDates == - other.restrictEnrollmentsToCourseDates && - workflowState == other.workflowState && - homePage == other.homePage && - term == other.term && - sections == other.sections && - settings == other.settings && - gradingScheme == other.gradingScheme; - } - - @override - int get hashCode { - var _$hash = 0; - _$hash = $jc(_$hash, currentScore.hashCode); - _$hash = $jc(_$hash, finalScore.hashCode); - _$hash = $jc(_$hash, currentGrade.hashCode); - _$hash = $jc(_$hash, finalGrade.hashCode); - _$hash = $jc(_$hash, id.hashCode); - _$hash = $jc(_$hash, name.hashCode); - _$hash = $jc(_$hash, originalName.hashCode); - _$hash = $jc(_$hash, courseCode.hashCode); - _$hash = $jc(_$hash, startAt.hashCode); - _$hash = $jc(_$hash, endAt.hashCode); - _$hash = $jc(_$hash, syllabusBody.hashCode); - _$hash = $jc(_$hash, hideFinalGrades.hashCode); - _$hash = $jc(_$hash, isPublic.hashCode); - _$hash = $jc(_$hash, enrollments.hashCode); - _$hash = $jc(_$hash, needsGradingCount.hashCode); - _$hash = $jc(_$hash, applyAssignmentGroupWeights.hashCode); - _$hash = $jc(_$hash, isFavorite.hashCode); - _$hash = $jc(_$hash, accessRestrictedByDate.hashCode); - _$hash = $jc(_$hash, imageDownloadUrl.hashCode); - _$hash = $jc(_$hash, hasWeightedGradingPeriods.hashCode); - _$hash = $jc(_$hash, hasGradingPeriods.hashCode); - _$hash = $jc(_$hash, restrictEnrollmentsToCourseDates.hashCode); - _$hash = $jc(_$hash, workflowState.hashCode); - _$hash = $jc(_$hash, homePage.hashCode); - _$hash = $jc(_$hash, term.hashCode); - _$hash = $jc(_$hash, sections.hashCode); - _$hash = $jc(_$hash, settings.hashCode); - _$hash = $jc(_$hash, gradingScheme.hashCode); - _$hash = $jf(_$hash); - return _$hash; - } - - @override - String toString() { - return (newBuiltValueToStringHelper(r'Course') - ..add('currentScore', currentScore) - ..add('finalScore', finalScore) - ..add('currentGrade', currentGrade) - ..add('finalGrade', finalGrade) - ..add('id', id) - ..add('name', name) - ..add('originalName', originalName) - ..add('courseCode', courseCode) - ..add('startAt', startAt) - ..add('endAt', endAt) - ..add('syllabusBody', syllabusBody) - ..add('hideFinalGrades', hideFinalGrades) - ..add('isPublic', isPublic) - ..add('enrollments', enrollments) - ..add('needsGradingCount', needsGradingCount) - ..add('applyAssignmentGroupWeights', applyAssignmentGroupWeights) - ..add('isFavorite', isFavorite) - ..add('accessRestrictedByDate', accessRestrictedByDate) - ..add('imageDownloadUrl', imageDownloadUrl) - ..add('hasWeightedGradingPeriods', hasWeightedGradingPeriods) - ..add('hasGradingPeriods', hasGradingPeriods) - ..add('restrictEnrollmentsToCourseDates', - restrictEnrollmentsToCourseDates) - ..add('workflowState', workflowState) - ..add('homePage', homePage) - ..add('term', term) - ..add('sections', sections) - ..add('settings', settings) - ..add('gradingScheme', gradingScheme)) - .toString(); - } -} - -class CourseBuilder implements Builder { - _$Course? _$v; - - double? _currentScore; - double? get currentScore => _$this._currentScore; - set currentScore(double? currentScore) => _$this._currentScore = currentScore; - - double? _finalScore; - double? get finalScore => _$this._finalScore; - set finalScore(double? finalScore) => _$this._finalScore = finalScore; - - String? _currentGrade; - String? get currentGrade => _$this._currentGrade; - set currentGrade(String? currentGrade) => _$this._currentGrade = currentGrade; - - String? _finalGrade; - String? get finalGrade => _$this._finalGrade; - set finalGrade(String? finalGrade) => _$this._finalGrade = finalGrade; - - String? _id; - String? get id => _$this._id; - set id(String? id) => _$this._id = id; - - String? _name; - String? get name => _$this._name; - set name(String? name) => _$this._name = name; - - String? _originalName; - String? get originalName => _$this._originalName; - set originalName(String? originalName) => _$this._originalName = originalName; - - String? _courseCode; - String? get courseCode => _$this._courseCode; - set courseCode(String? courseCode) => _$this._courseCode = courseCode; - - DateTime? _startAt; - DateTime? get startAt => _$this._startAt; - set startAt(DateTime? startAt) => _$this._startAt = startAt; - - DateTime? _endAt; - DateTime? get endAt => _$this._endAt; - set endAt(DateTime? endAt) => _$this._endAt = endAt; - - String? _syllabusBody; - String? get syllabusBody => _$this._syllabusBody; - set syllabusBody(String? syllabusBody) => _$this._syllabusBody = syllabusBody; - - bool? _hideFinalGrades; - bool? get hideFinalGrades => _$this._hideFinalGrades; - set hideFinalGrades(bool? hideFinalGrades) => - _$this._hideFinalGrades = hideFinalGrades; - - bool? _isPublic; - bool? get isPublic => _$this._isPublic; - set isPublic(bool? isPublic) => _$this._isPublic = isPublic; - - ListBuilder? _enrollments; - ListBuilder get enrollments => - _$this._enrollments ??= new ListBuilder(); - set enrollments(ListBuilder? enrollments) => - _$this._enrollments = enrollments; - - int? _needsGradingCount; - int? get needsGradingCount => _$this._needsGradingCount; - set needsGradingCount(int? needsGradingCount) => - _$this._needsGradingCount = needsGradingCount; - - bool? _applyAssignmentGroupWeights; - bool? get applyAssignmentGroupWeights => _$this._applyAssignmentGroupWeights; - set applyAssignmentGroupWeights(bool? applyAssignmentGroupWeights) => - _$this._applyAssignmentGroupWeights = applyAssignmentGroupWeights; - - bool? _isFavorite; - bool? get isFavorite => _$this._isFavorite; - set isFavorite(bool? isFavorite) => _$this._isFavorite = isFavorite; - - bool? _accessRestrictedByDate; - bool? get accessRestrictedByDate => _$this._accessRestrictedByDate; - set accessRestrictedByDate(bool? accessRestrictedByDate) => - _$this._accessRestrictedByDate = accessRestrictedByDate; - - String? _imageDownloadUrl; - String? get imageDownloadUrl => _$this._imageDownloadUrl; - set imageDownloadUrl(String? imageDownloadUrl) => - _$this._imageDownloadUrl = imageDownloadUrl; - - bool? _hasWeightedGradingPeriods; - bool? get hasWeightedGradingPeriods => _$this._hasWeightedGradingPeriods; - set hasWeightedGradingPeriods(bool? hasWeightedGradingPeriods) => - _$this._hasWeightedGradingPeriods = hasWeightedGradingPeriods; - - bool? _hasGradingPeriods; - bool? get hasGradingPeriods => _$this._hasGradingPeriods; - set hasGradingPeriods(bool? hasGradingPeriods) => - _$this._hasGradingPeriods = hasGradingPeriods; - - bool? _restrictEnrollmentsToCourseDates; - bool? get restrictEnrollmentsToCourseDates => - _$this._restrictEnrollmentsToCourseDates; - set restrictEnrollmentsToCourseDates( - bool? restrictEnrollmentsToCourseDates) => - _$this._restrictEnrollmentsToCourseDates = - restrictEnrollmentsToCourseDates; - - String? _workflowState; - String? get workflowState => _$this._workflowState; - set workflowState(String? workflowState) => - _$this._workflowState = workflowState; - - HomePage? _homePage; - HomePage? get homePage => _$this._homePage; - set homePage(HomePage? homePage) => _$this._homePage = homePage; - - TermBuilder? _term; - TermBuilder get term => _$this._term ??= new TermBuilder(); - set term(TermBuilder? term) => _$this._term = term; - - ListBuilder
? _sections; - ListBuilder
get sections => - _$this._sections ??= new ListBuilder
(); - set sections(ListBuilder
? sections) => _$this._sections = sections; - - CourseSettingsBuilder? _settings; - CourseSettingsBuilder get settings => - _$this._settings ??= new CourseSettingsBuilder(); - set settings(CourseSettingsBuilder? settings) => _$this._settings = settings; - - ListBuilder? _gradingScheme; - ListBuilder get gradingScheme => - _$this._gradingScheme ??= new ListBuilder(); - set gradingScheme(ListBuilder? gradingScheme) => - _$this._gradingScheme = gradingScheme; - - CourseBuilder() { - Course._initializeBuilder(this); - } - - CourseBuilder get _$this { - final $v = _$v; - if ($v != null) { - _currentScore = $v.currentScore; - _finalScore = $v.finalScore; - _currentGrade = $v.currentGrade; - _finalGrade = $v.finalGrade; - _id = $v.id; - _name = $v.name; - _originalName = $v.originalName; - _courseCode = $v.courseCode; - _startAt = $v.startAt; - _endAt = $v.endAt; - _syllabusBody = $v.syllabusBody; - _hideFinalGrades = $v.hideFinalGrades; - _isPublic = $v.isPublic; - _enrollments = $v.enrollments?.toBuilder(); - _needsGradingCount = $v.needsGradingCount; - _applyAssignmentGroupWeights = $v.applyAssignmentGroupWeights; - _isFavorite = $v.isFavorite; - _accessRestrictedByDate = $v.accessRestrictedByDate; - _imageDownloadUrl = $v.imageDownloadUrl; - _hasWeightedGradingPeriods = $v.hasWeightedGradingPeriods; - _hasGradingPeriods = $v.hasGradingPeriods; - _restrictEnrollmentsToCourseDates = $v.restrictEnrollmentsToCourseDates; - _workflowState = $v.workflowState; - _homePage = $v.homePage; - _term = $v.term?.toBuilder(); - _sections = $v.sections?.toBuilder(); - _settings = $v.settings?.toBuilder(); - _gradingScheme = $v.gradingScheme?.toBuilder(); - _$v = null; - } - return this; - } - - @override - void replace(Course other) { - ArgumentError.checkNotNull(other, 'other'); - _$v = other as _$Course; - } - - @override - void update(void Function(CourseBuilder)? updates) { - if (updates != null) updates(this); - } - - @override - Course build() => _build(); - - _$Course _build() { - _$Course _$result; - try { - _$result = _$v ?? - new _$Course._( - currentScore: currentScore, - finalScore: finalScore, - currentGrade: currentGrade, - finalGrade: finalGrade, - id: BuiltValueNullFieldError.checkNotNull(id, r'Course', 'id'), - name: BuiltValueNullFieldError.checkNotNull( - name, r'Course', 'name'), - originalName: originalName, - courseCode: courseCode, - startAt: startAt, - endAt: endAt, - syllabusBody: syllabusBody, - hideFinalGrades: BuiltValueNullFieldError.checkNotNull( - hideFinalGrades, r'Course', 'hideFinalGrades'), - isPublic: BuiltValueNullFieldError.checkNotNull( - isPublic, r'Course', 'isPublic'), - enrollments: _enrollments?.build(), - needsGradingCount: BuiltValueNullFieldError.checkNotNull( - needsGradingCount, r'Course', 'needsGradingCount'), - applyAssignmentGroupWeights: BuiltValueNullFieldError.checkNotNull( - applyAssignmentGroupWeights, r'Course', 'applyAssignmentGroupWeights'), - isFavorite: BuiltValueNullFieldError.checkNotNull( - isFavorite, r'Course', 'isFavorite'), - accessRestrictedByDate: BuiltValueNullFieldError.checkNotNull( - accessRestrictedByDate, r'Course', 'accessRestrictedByDate'), - imageDownloadUrl: imageDownloadUrl, - hasWeightedGradingPeriods: BuiltValueNullFieldError.checkNotNull( - hasWeightedGradingPeriods, r'Course', 'hasWeightedGradingPeriods'), - hasGradingPeriods: - BuiltValueNullFieldError.checkNotNull(hasGradingPeriods, r'Course', 'hasGradingPeriods'), - restrictEnrollmentsToCourseDates: BuiltValueNullFieldError.checkNotNull(restrictEnrollmentsToCourseDates, r'Course', 'restrictEnrollmentsToCourseDates'), - workflowState: workflowState, - homePage: homePage, - term: _term?.build(), - sections: _sections?.build(), - settings: _settings?.build(), - gradingScheme: _gradingScheme?.build()); - } catch (_) { - late String _$failedField; - try { - _$failedField = 'enrollments'; - _enrollments?.build(); - - _$failedField = 'term'; - _term?.build(); - _$failedField = 'sections'; - _sections?.build(); - _$failedField = 'settings'; - _settings?.build(); - _$failedField = 'gradingScheme'; - _gradingScheme?.build(); - } catch (e) { - throw new BuiltValueNestedFieldError( - r'Course', _$failedField, e.toString()); - } - rethrow; - } - replace(_$result); - return _$result; - } -} - -// ignore_for_file: deprecated_member_use_from_same_package,type=lint diff --git a/apps/flutter_parent/lib/models/course_grade.dart b/apps/flutter_parent/lib/models/course_grade.dart deleted file mode 100644 index 681be6364f..0000000000 --- a/apps/flutter_parent/lib/models/course_grade.dart +++ /dev/null @@ -1,91 +0,0 @@ -// Copyright (C) 2019 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -import 'package:flutter_parent/models/course.dart'; - -import 'enrollment.dart'; - -/** - * CourseGrade object for displaying course grade totals. - * - * Note: Current vs Final - * As a general rule, current represents a grade calculated only from graded assignments, where as - * final grades use all assignments, regardless of grading status, in their calculation. - * - * @finalGrade - Final grade string value, for the current grading period or the current term - * (see Course.getCourseGrade, ignoreMGP). - * - * @finalScore - Final score value, a double representation of a percentage grade, for the current - * grading period or the current term (see Course.getCourseGrade, ignoreMGP). Needs formatting - * prior to use. - * - * @noFinalGrade - If the course contains no valid final grade or score, this flag will be true. This is usually - * represented in the UI with "N/A". See Course.noFinalGrade for logic. - */ -class CourseGrade { - Course? _course; - Enrollment? _enrollment; - bool _forceAllPeriods; - - CourseGrade(this._course, this._enrollment, {bool forceAllPeriods = false}) : _forceAllPeriods = forceAllPeriods; - - operator ==(Object other) { - if (!(other is CourseGrade)) { - return false; - } - final grade = other; - return _course == grade._course && _enrollment == grade._enrollment && _forceAllPeriods == grade._forceAllPeriods; - } - - /// Represents the lock status of a course, this is different from hideFinalGrades, as it takes both that value, and - /// totalsForAllGradingPeriodsOption into account. The latter is only used when relevant. - bool isCourseGradeLocked({bool forAllGradingPeriods = true}) { - if (_course?.hideFinalGrades == true) { - return true; - } else if (_course?.hasGradingPeriods == true) { - return forAllGradingPeriods && !_hasActiveGradingPeriod() && !_isTotalsForAllGradingPeriodsEnabled(); - } else { - return false; - } - } - - /// Current score value, a double representation of a percentage grade, for the current grading period or the current - /// term (see Course.getCourseGrade, ignoreMGP). Needs formatting prior to use. - double? currentScore() => _hasActiveGradingPeriod() ? _getCurrentPeriodComputedCurrentScore() : _getCurrentScore(); - - /// Current grade string value, for the current grading period or the current term. (see Course.getCourseGrade) - String? currentGrade() => _hasActiveGradingPeriod() ? _getCurrentPeriodComputedCurrentGrade() : _getCurrentGrade(); - - /// If the course contains no valid current grade or score, this flag will be true. This is usually represented in the - /// UI with "N/A". - bool noCurrentGrade() => - currentScore() == null && (currentGrade() == null || currentGrade()!.contains('N/A') || currentGrade()!.isEmpty); - - bool _hasActiveGradingPeriod() => - !_forceAllPeriods && - (_course?.enrollments?.toList().any((enrollment) => enrollment.hasActiveGradingPeriod()) ?? false); - - bool _isTotalsForAllGradingPeriodsEnabled() => - _course?.enrollments?.toList().any((enrollment) => enrollment.isTotalsForAllGradingPeriodsEnabled()) ?? false; - - double? _getCurrentScore() => _enrollment?.grades?.currentScore ?? _enrollment?.computedCurrentScore; - - String? _getCurrentGrade() => _enrollment?.grades?.currentGrade ?? _enrollment?.computedCurrentGrade ?? _enrollment?.computedCurrentLetterGrade; - - double? _getCurrentPeriodComputedCurrentScore() => - _enrollment?.grades?.currentScore ?? _enrollment?.currentPeriodComputedCurrentScore; - - String? _getCurrentPeriodComputedCurrentGrade() => - _enrollment?.grades?.currentGrade ?? _enrollment?.currentPeriodComputedCurrentGrade; - -} diff --git a/apps/flutter_parent/lib/models/course_permissions.dart b/apps/flutter_parent/lib/models/course_permissions.dart deleted file mode 100644 index 0222c04e9d..0000000000 --- a/apps/flutter_parent/lib/models/course_permissions.dart +++ /dev/null @@ -1,30 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:built_value/built_value.dart'; -import 'package:built_value/serializer.dart'; - -part 'course_permissions.g.dart'; - -/// To have this built_value be generated, run this command from the project root: -/// flutter pub run build_runner build --delete-conflicting-outputs -abstract class CoursePermissions implements Built { - static Serializer get serializer => _$coursePermissionsSerializer; - - @BuiltValueField(wireName: 'send_messages') - bool? get sendMessages; - - CoursePermissions._(); - factory CoursePermissions([void Function(CoursePermissionsBuilder) updates]) = _$CoursePermissions; -} diff --git a/apps/flutter_parent/lib/models/course_permissions.g.dart b/apps/flutter_parent/lib/models/course_permissions.g.dart deleted file mode 100644 index d5d33dd74b..0000000000 --- a/apps/flutter_parent/lib/models/course_permissions.g.dart +++ /dev/null @@ -1,138 +0,0 @@ -// GENERATED CODE - DO NOT MODIFY BY HAND - -part of 'course_permissions.dart'; - -// ************************************************************************** -// BuiltValueGenerator -// ************************************************************************** - -Serializer _$coursePermissionsSerializer = - new _$CoursePermissionsSerializer(); - -class _$CoursePermissionsSerializer - implements StructuredSerializer { - @override - final Iterable types = const [CoursePermissions, _$CoursePermissions]; - @override - final String wireName = 'CoursePermissions'; - - @override - Iterable serialize(Serializers serializers, CoursePermissions object, - {FullType specifiedType = FullType.unspecified}) { - final result = []; - Object? value; - value = object.sendMessages; - if (value != null) { - result - ..add('send_messages') - ..add( - serializers.serialize(value, specifiedType: const FullType(bool))); - } - return result; - } - - @override - CoursePermissions deserialize( - Serializers serializers, Iterable serialized, - {FullType specifiedType = FullType.unspecified}) { - final result = new CoursePermissionsBuilder(); - - final iterator = serialized.iterator; - while (iterator.moveNext()) { - final key = iterator.current! as String; - iterator.moveNext(); - final Object? value = iterator.current; - switch (key) { - case 'send_messages': - result.sendMessages = serializers.deserialize(value, - specifiedType: const FullType(bool)) as bool?; - break; - } - } - - return result.build(); - } -} - -class _$CoursePermissions extends CoursePermissions { - @override - final bool? sendMessages; - - factory _$CoursePermissions( - [void Function(CoursePermissionsBuilder)? updates]) => - (new CoursePermissionsBuilder()..update(updates))._build(); - - _$CoursePermissions._({this.sendMessages}) : super._(); - - @override - CoursePermissions rebuild(void Function(CoursePermissionsBuilder) updates) => - (toBuilder()..update(updates)).build(); - - @override - CoursePermissionsBuilder toBuilder() => - new CoursePermissionsBuilder()..replace(this); - - @override - bool operator ==(Object other) { - if (identical(other, this)) return true; - return other is CoursePermissions && sendMessages == other.sendMessages; - } - - @override - int get hashCode { - var _$hash = 0; - _$hash = $jc(_$hash, sendMessages.hashCode); - _$hash = $jf(_$hash); - return _$hash; - } - - @override - String toString() { - return (newBuiltValueToStringHelper(r'CoursePermissions') - ..add('sendMessages', sendMessages)) - .toString(); - } -} - -class CoursePermissionsBuilder - implements Builder { - _$CoursePermissions? _$v; - - bool? _sendMessages; - bool? get sendMessages => _$this._sendMessages; - set sendMessages(bool? sendMessages) => _$this._sendMessages = sendMessages; - - CoursePermissionsBuilder(); - - CoursePermissionsBuilder get _$this { - final $v = _$v; - if ($v != null) { - _sendMessages = $v.sendMessages; - _$v = null; - } - return this; - } - - @override - void replace(CoursePermissions other) { - ArgumentError.checkNotNull(other, 'other'); - _$v = other as _$CoursePermissions; - } - - @override - void update(void Function(CoursePermissionsBuilder)? updates) { - if (updates != null) updates(this); - } - - @override - CoursePermissions build() => _build(); - - _$CoursePermissions _build() { - final _$result = - _$v ?? new _$CoursePermissions._(sendMessages: sendMessages); - replace(_$result); - return _$result; - } -} - -// ignore_for_file: deprecated_member_use_from_same_package,type=lint diff --git a/apps/flutter_parent/lib/models/course_settings.dart b/apps/flutter_parent/lib/models/course_settings.dart deleted file mode 100644 index d869457cde..0000000000 --- a/apps/flutter_parent/lib/models/course_settings.dart +++ /dev/null @@ -1,33 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:built_value/built_value.dart'; -import 'package:built_value/serializer.dart'; - -part 'course_settings.g.dart'; - -/// To have this built_value be generated, run this command from the project root: -/// flutter pub run build_runner build --delete-conflicting-outputs -abstract class CourseSettings implements Built { - static Serializer get serializer => _$courseSettingsSerializer; - - @BuiltValueField(wireName: 'syllabus_course_summary') - bool? get courseSummary; - - @BuiltValueField(wireName: 'restrict_quantitative_data') - bool? get restrictQuantitativeData; - - CourseSettings._(); - factory CourseSettings([void Function(CourseSettingsBuilder) updates]) = _$CourseSettings; -} diff --git a/apps/flutter_parent/lib/models/course_settings.g.dart b/apps/flutter_parent/lib/models/course_settings.g.dart deleted file mode 100644 index 5a12d8572f..0000000000 --- a/apps/flutter_parent/lib/models/course_settings.g.dart +++ /dev/null @@ -1,164 +0,0 @@ -// GENERATED CODE - DO NOT MODIFY BY HAND - -part of 'course_settings.dart'; - -// ************************************************************************** -// BuiltValueGenerator -// ************************************************************************** - -Serializer _$courseSettingsSerializer = - new _$CourseSettingsSerializer(); - -class _$CourseSettingsSerializer - implements StructuredSerializer { - @override - final Iterable types = const [CourseSettings, _$CourseSettings]; - @override - final String wireName = 'CourseSettings'; - - @override - Iterable serialize(Serializers serializers, CourseSettings object, - {FullType specifiedType = FullType.unspecified}) { - final result = []; - Object? value; - value = object.courseSummary; - if (value != null) { - result - ..add('syllabus_course_summary') - ..add( - serializers.serialize(value, specifiedType: const FullType(bool))); - } - value = object.restrictQuantitativeData; - if (value != null) { - result - ..add('restrict_quantitative_data') - ..add( - serializers.serialize(value, specifiedType: const FullType(bool))); - } - return result; - } - - @override - CourseSettings deserialize( - Serializers serializers, Iterable serialized, - {FullType specifiedType = FullType.unspecified}) { - final result = new CourseSettingsBuilder(); - - final iterator = serialized.iterator; - while (iterator.moveNext()) { - final key = iterator.current! as String; - iterator.moveNext(); - final Object? value = iterator.current; - switch (key) { - case 'syllabus_course_summary': - result.courseSummary = serializers.deserialize(value, - specifiedType: const FullType(bool)) as bool?; - break; - case 'restrict_quantitative_data': - result.restrictQuantitativeData = serializers.deserialize(value, - specifiedType: const FullType(bool)) as bool?; - break; - } - } - - return result.build(); - } -} - -class _$CourseSettings extends CourseSettings { - @override - final bool? courseSummary; - @override - final bool? restrictQuantitativeData; - - factory _$CourseSettings([void Function(CourseSettingsBuilder)? updates]) => - (new CourseSettingsBuilder()..update(updates))._build(); - - _$CourseSettings._({this.courseSummary, this.restrictQuantitativeData}) - : super._(); - - @override - CourseSettings rebuild(void Function(CourseSettingsBuilder) updates) => - (toBuilder()..update(updates)).build(); - - @override - CourseSettingsBuilder toBuilder() => - new CourseSettingsBuilder()..replace(this); - - @override - bool operator ==(Object other) { - if (identical(other, this)) return true; - return other is CourseSettings && - courseSummary == other.courseSummary && - restrictQuantitativeData == other.restrictQuantitativeData; - } - - @override - int get hashCode { - var _$hash = 0; - _$hash = $jc(_$hash, courseSummary.hashCode); - _$hash = $jc(_$hash, restrictQuantitativeData.hashCode); - _$hash = $jf(_$hash); - return _$hash; - } - - @override - String toString() { - return (newBuiltValueToStringHelper(r'CourseSettings') - ..add('courseSummary', courseSummary) - ..add('restrictQuantitativeData', restrictQuantitativeData)) - .toString(); - } -} - -class CourseSettingsBuilder - implements Builder { - _$CourseSettings? _$v; - - bool? _courseSummary; - bool? get courseSummary => _$this._courseSummary; - set courseSummary(bool? courseSummary) => - _$this._courseSummary = courseSummary; - - bool? _restrictQuantitativeData; - bool? get restrictQuantitativeData => _$this._restrictQuantitativeData; - set restrictQuantitativeData(bool? restrictQuantitativeData) => - _$this._restrictQuantitativeData = restrictQuantitativeData; - - CourseSettingsBuilder(); - - CourseSettingsBuilder get _$this { - final $v = _$v; - if ($v != null) { - _courseSummary = $v.courseSummary; - _restrictQuantitativeData = $v.restrictQuantitativeData; - _$v = null; - } - return this; - } - - @override - void replace(CourseSettings other) { - ArgumentError.checkNotNull(other, 'other'); - _$v = other as _$CourseSettings; - } - - @override - void update(void Function(CourseSettingsBuilder)? updates) { - if (updates != null) updates(this); - } - - @override - CourseSettings build() => _build(); - - _$CourseSettings _build() { - final _$result = _$v ?? - new _$CourseSettings._( - courseSummary: courseSummary, - restrictQuantitativeData: restrictQuantitativeData); - replace(_$result); - return _$result; - } -} - -// ignore_for_file: deprecated_member_use_from_same_package,type=lint diff --git a/apps/flutter_parent/lib/models/course_tab.dart b/apps/flutter_parent/lib/models/course_tab.dart deleted file mode 100644 index c82663888b..0000000000 --- a/apps/flutter_parent/lib/models/course_tab.dart +++ /dev/null @@ -1,32 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -import 'package:built_value/built_value.dart'; -import 'package:built_value/serializer.dart'; - -part 'course_tab.g.dart'; - -/// To have this built_value be generated, run this command from the project root: -/// flutter packages pub run build_runner build --delete-conflicting-outputs -abstract class CourseTab implements Built { - @BuiltValueSerializer(serializeNulls: true) - static Serializer get serializer => _$courseTabSerializer; - - CourseTab._(); - - factory CourseTab([void Function(CourseTabBuilder) updates]) = _$CourseTab; - - String get id; - - // There are more fields, but we don't need any others for parent _yet_ -} diff --git a/apps/flutter_parent/lib/models/course_tab.g.dart b/apps/flutter_parent/lib/models/course_tab.g.dart deleted file mode 100644 index aca82c6850..0000000000 --- a/apps/flutter_parent/lib/models/course_tab.g.dart +++ /dev/null @@ -1,130 +0,0 @@ -// GENERATED CODE - DO NOT MODIFY BY HAND - -part of 'course_tab.dart'; - -// ************************************************************************** -// BuiltValueGenerator -// ************************************************************************** - -Serializer _$courseTabSerializer = new _$CourseTabSerializer(); - -class _$CourseTabSerializer implements StructuredSerializer { - @override - final Iterable types = const [CourseTab, _$CourseTab]; - @override - final String wireName = 'CourseTab'; - - @override - Iterable serialize(Serializers serializers, CourseTab object, - {FullType specifiedType = FullType.unspecified}) { - final result = [ - 'id', - serializers.serialize(object.id, specifiedType: const FullType(String)), - ]; - - return result; - } - - @override - CourseTab deserialize(Serializers serializers, Iterable serialized, - {FullType specifiedType = FullType.unspecified}) { - final result = new CourseTabBuilder(); - - final iterator = serialized.iterator; - while (iterator.moveNext()) { - final key = iterator.current! as String; - iterator.moveNext(); - final Object? value = iterator.current; - switch (key) { - case 'id': - result.id = serializers.deserialize(value, - specifiedType: const FullType(String))! as String; - break; - } - } - - return result.build(); - } -} - -class _$CourseTab extends CourseTab { - @override - final String id; - - factory _$CourseTab([void Function(CourseTabBuilder)? updates]) => - (new CourseTabBuilder()..update(updates))._build(); - - _$CourseTab._({required this.id}) : super._() { - BuiltValueNullFieldError.checkNotNull(id, r'CourseTab', 'id'); - } - - @override - CourseTab rebuild(void Function(CourseTabBuilder) updates) => - (toBuilder()..update(updates)).build(); - - @override - CourseTabBuilder toBuilder() => new CourseTabBuilder()..replace(this); - - @override - bool operator ==(Object other) { - if (identical(other, this)) return true; - return other is CourseTab && id == other.id; - } - - @override - int get hashCode { - var _$hash = 0; - _$hash = $jc(_$hash, id.hashCode); - _$hash = $jf(_$hash); - return _$hash; - } - - @override - String toString() { - return (newBuiltValueToStringHelper(r'CourseTab')..add('id', id)) - .toString(); - } -} - -class CourseTabBuilder implements Builder { - _$CourseTab? _$v; - - String? _id; - String? get id => _$this._id; - set id(String? id) => _$this._id = id; - - CourseTabBuilder(); - - CourseTabBuilder get _$this { - final $v = _$v; - if ($v != null) { - _id = $v.id; - _$v = null; - } - return this; - } - - @override - void replace(CourseTab other) { - ArgumentError.checkNotNull(other, 'other'); - _$v = other as _$CourseTab; - } - - @override - void update(void Function(CourseTabBuilder)? updates) { - if (updates != null) updates(this); - } - - @override - CourseTab build() => _build(); - - _$CourseTab _build() { - final _$result = _$v ?? - new _$CourseTab._( - id: BuiltValueNullFieldError.checkNotNull(id, r'CourseTab', 'id')); - replace(_$result); - return _$result; - } -} - -// ignore_for_file: deprecated_member_use_from_same_package,type=lint diff --git a/apps/flutter_parent/lib/models/dataseeding/communication_channel.dart b/apps/flutter_parent/lib/models/dataseeding/communication_channel.dart deleted file mode 100644 index 4b046ad8d0..0000000000 --- a/apps/flutter_parent/lib/models/dataseeding/communication_channel.dart +++ /dev/null @@ -1,31 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:built_value/built_value.dart'; -import 'package:built_value/serializer.dart'; - -part 'communication_channel.g.dart'; - -abstract class CommunicationChannel implements Built { - @BuiltValueSerializer(serializeNulls: true) - static Serializer get serializer => _$communicationChannelSerializer; - - CommunicationChannel._(); - factory CommunicationChannel([void Function(CommunicationChannelBuilder) updates]) = _$CommunicationChannel; - - @BuiltValueField(wireName: "skip_confirmation") - bool get skipConfirmation; - - static void _initializeBuilder(CommunicationChannelBuilder b) => b..skipConfirmation = false; -} diff --git a/apps/flutter_parent/lib/models/dataseeding/communication_channel.g.dart b/apps/flutter_parent/lib/models/dataseeding/communication_channel.g.dart deleted file mode 100644 index be18d24237..0000000000 --- a/apps/flutter_parent/lib/models/dataseeding/communication_channel.g.dart +++ /dev/null @@ -1,149 +0,0 @@ -// GENERATED CODE - DO NOT MODIFY BY HAND - -part of 'communication_channel.dart'; - -// ************************************************************************** -// BuiltValueGenerator -// ************************************************************************** - -Serializer _$communicationChannelSerializer = - new _$CommunicationChannelSerializer(); - -class _$CommunicationChannelSerializer - implements StructuredSerializer { - @override - final Iterable types = const [ - CommunicationChannel, - _$CommunicationChannel - ]; - @override - final String wireName = 'CommunicationChannel'; - - @override - Iterable serialize( - Serializers serializers, CommunicationChannel object, - {FullType specifiedType = FullType.unspecified}) { - final result = [ - 'skip_confirmation', - serializers.serialize(object.skipConfirmation, - specifiedType: const FullType(bool)), - ]; - - return result; - } - - @override - CommunicationChannel deserialize( - Serializers serializers, Iterable serialized, - {FullType specifiedType = FullType.unspecified}) { - final result = new CommunicationChannelBuilder(); - - final iterator = serialized.iterator; - while (iterator.moveNext()) { - final key = iterator.current! as String; - iterator.moveNext(); - final Object? value = iterator.current; - switch (key) { - case 'skip_confirmation': - result.skipConfirmation = serializers.deserialize(value, - specifiedType: const FullType(bool))! as bool; - break; - } - } - - return result.build(); - } -} - -class _$CommunicationChannel extends CommunicationChannel { - @override - final bool skipConfirmation; - - factory _$CommunicationChannel( - [void Function(CommunicationChannelBuilder)? updates]) => - (new CommunicationChannelBuilder()..update(updates))._build(); - - _$CommunicationChannel._({required this.skipConfirmation}) : super._() { - BuiltValueNullFieldError.checkNotNull( - skipConfirmation, r'CommunicationChannel', 'skipConfirmation'); - } - - @override - CommunicationChannel rebuild( - void Function(CommunicationChannelBuilder) updates) => - (toBuilder()..update(updates)).build(); - - @override - CommunicationChannelBuilder toBuilder() => - new CommunicationChannelBuilder()..replace(this); - - @override - bool operator ==(Object other) { - if (identical(other, this)) return true; - return other is CommunicationChannel && - skipConfirmation == other.skipConfirmation; - } - - @override - int get hashCode { - var _$hash = 0; - _$hash = $jc(_$hash, skipConfirmation.hashCode); - _$hash = $jf(_$hash); - return _$hash; - } - - @override - String toString() { - return (newBuiltValueToStringHelper(r'CommunicationChannel') - ..add('skipConfirmation', skipConfirmation)) - .toString(); - } -} - -class CommunicationChannelBuilder - implements Builder { - _$CommunicationChannel? _$v; - - bool? _skipConfirmation; - bool? get skipConfirmation => _$this._skipConfirmation; - set skipConfirmation(bool? skipConfirmation) => - _$this._skipConfirmation = skipConfirmation; - - CommunicationChannelBuilder() { - CommunicationChannel._initializeBuilder(this); - } - - CommunicationChannelBuilder get _$this { - final $v = _$v; - if ($v != null) { - _skipConfirmation = $v.skipConfirmation; - _$v = null; - } - return this; - } - - @override - void replace(CommunicationChannel other) { - ArgumentError.checkNotNull(other, 'other'); - _$v = other as _$CommunicationChannel; - } - - @override - void update(void Function(CommunicationChannelBuilder)? updates) { - if (updates != null) updates(this); - } - - @override - CommunicationChannel build() => _build(); - - _$CommunicationChannel _build() { - final _$result = _$v ?? - new _$CommunicationChannel._( - skipConfirmation: BuiltValueNullFieldError.checkNotNull( - skipConfirmation, r'CommunicationChannel', 'skipConfirmation')); - replace(_$result); - return _$result; - } -} - -// ignore_for_file: deprecated_member_use_from_same_package,type=lint diff --git a/apps/flutter_parent/lib/models/dataseeding/create_assignment_info.dart b/apps/flutter_parent/lib/models/dataseeding/create_assignment_info.dart deleted file mode 100644 index 23b2195823..0000000000 --- a/apps/flutter_parent/lib/models/dataseeding/create_assignment_info.dart +++ /dev/null @@ -1,96 +0,0 @@ -// Copyright (C) 2019 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -import 'package:built_collection/built_collection.dart'; -import 'package:built_value/built_value.dart'; -import 'package:built_value/serializer.dart'; -import 'package:flutter_parent/models/lock_info.dart'; - -import '../assignment.dart'; - -part 'create_assignment_info.g.dart'; - -abstract class CreateAssignmentInfo implements Built { - @BuiltValueSerializer(serializeNulls: true) - static Serializer get serializer => _$createAssignmentInfoSerializer; - - CreateAssignmentInfo._(); - - factory CreateAssignmentInfo([void Function(CreateAssignmentInfoBuilder) updates]) = _$CreateAssignmentInfo; - - String get name; - - String? get description; - - @BuiltValueField(wireName: 'due_at') - DateTime? get dueAt; - - @BuiltValueField(wireName: 'points_possible') - double get pointsPossible; - - @BuiltValueField(wireName: 'course_id') - String get courseId; - - @BuiltValueField(wireName: 'grading_type') - GradingType? get gradingType; - - @BuiltValueField(wireName: 'html_url') - String? get htmlUrl; - - String? get url; - - @BuiltValueField(wireName: 'quiz_id') - String? get quizId; // (Optional) id of the associated quiz (applies only when submission_types is ["online_quiz"]) - - @BuiltValueField(wireName: 'use_rubric_for_grading') - bool? get useRubricForGrading; - - @BuiltValueField(wireName: 'assignment_group_id') - String? get assignmentGroupId; - - int? get position; - - @BuiltValueField(wireName: 'lock_info') - LockInfo? get lockInfo; - - @BuiltValueField(wireName: 'locked_for_user') - bool? get lockedForUser; - - @BuiltValueField(wireName: 'lock_at') - DateTime? get lockAt; // Date the teacher no longer accepts submissions. - - @BuiltValueField(wireName: 'unlock_at') - DateTime? get unlockAt; - - @BuiltValueField(wireName: 'lock_explanation') - String? get lockExplanation; - - @BuiltValueField(wireName: 'free_form_criterion_comments') - bool? get freeFormCriterionComments; - - bool get published; - - bool? get muted; - - @BuiltValueField(wireName: 'group_category_id') - String? get groupCategoryId; - - @BuiltValueField(wireName: 'submission_types') - BuiltList? get submissionTypes; - - static void _initializeBuilder(CreateAssignmentInfoBuilder b) => b; - - bool get isDiscussion => submissionTypes?.contains(SubmissionTypes.discussionTopic) == true; - - bool get isQuiz => submissionTypes?.contains(SubmissionTypes.onlineQuiz) == true; -} diff --git a/apps/flutter_parent/lib/models/dataseeding/create_assignment_info.g.dart b/apps/flutter_parent/lib/models/dataseeding/create_assignment_info.g.dart deleted file mode 100644 index 9322ddc24c..0000000000 --- a/apps/flutter_parent/lib/models/dataseeding/create_assignment_info.g.dart +++ /dev/null @@ -1,636 +0,0 @@ -// GENERATED CODE - DO NOT MODIFY BY HAND - -part of 'create_assignment_info.dart'; - -// ************************************************************************** -// BuiltValueGenerator -// ************************************************************************** - -Serializer _$createAssignmentInfoSerializer = - new _$CreateAssignmentInfoSerializer(); - -class _$CreateAssignmentInfoSerializer - implements StructuredSerializer { - @override - final Iterable types = const [ - CreateAssignmentInfo, - _$CreateAssignmentInfo - ]; - @override - final String wireName = 'CreateAssignmentInfo'; - - @override - Iterable serialize( - Serializers serializers, CreateAssignmentInfo object, - {FullType specifiedType = FullType.unspecified}) { - final result = [ - 'name', - serializers.serialize(object.name, specifiedType: const FullType(String)), - 'points_possible', - serializers.serialize(object.pointsPossible, - specifiedType: const FullType(double)), - 'course_id', - serializers.serialize(object.courseId, - specifiedType: const FullType(String)), - 'published', - serializers.serialize(object.published, - specifiedType: const FullType(bool)), - ]; - Object? value; - value = object.description; - - result - ..add('description') - ..add( - serializers.serialize(value, specifiedType: const FullType(String))); - value = object.dueAt; - - result - ..add('due_at') - ..add(serializers.serialize(value, - specifiedType: const FullType(DateTime))); - value = object.gradingType; - - result - ..add('grading_type') - ..add(serializers.serialize(value, - specifiedType: const FullType(GradingType))); - value = object.htmlUrl; - - result - ..add('html_url') - ..add( - serializers.serialize(value, specifiedType: const FullType(String))); - value = object.url; - - result - ..add('url') - ..add( - serializers.serialize(value, specifiedType: const FullType(String))); - value = object.quizId; - - result - ..add('quiz_id') - ..add( - serializers.serialize(value, specifiedType: const FullType(String))); - value = object.useRubricForGrading; - - result - ..add('use_rubric_for_grading') - ..add(serializers.serialize(value, specifiedType: const FullType(bool))); - value = object.assignmentGroupId; - - result - ..add('assignment_group_id') - ..add( - serializers.serialize(value, specifiedType: const FullType(String))); - value = object.position; - - result - ..add('position') - ..add(serializers.serialize(value, specifiedType: const FullType(int))); - value = object.lockInfo; - - result - ..add('lock_info') - ..add(serializers.serialize(value, - specifiedType: const FullType(LockInfo))); - value = object.lockedForUser; - - result - ..add('locked_for_user') - ..add(serializers.serialize(value, specifiedType: const FullType(bool))); - value = object.lockAt; - - result - ..add('lock_at') - ..add(serializers.serialize(value, - specifiedType: const FullType(DateTime))); - value = object.unlockAt; - - result - ..add('unlock_at') - ..add(serializers.serialize(value, - specifiedType: const FullType(DateTime))); - value = object.lockExplanation; - - result - ..add('lock_explanation') - ..add( - serializers.serialize(value, specifiedType: const FullType(String))); - value = object.freeFormCriterionComments; - - result - ..add('free_form_criterion_comments') - ..add(serializers.serialize(value, specifiedType: const FullType(bool))); - value = object.muted; - - result - ..add('muted') - ..add(serializers.serialize(value, specifiedType: const FullType(bool))); - value = object.groupCategoryId; - - result - ..add('group_category_id') - ..add( - serializers.serialize(value, specifiedType: const FullType(String))); - value = object.submissionTypes; - - result - ..add('submission_types') - ..add(serializers.serialize(value, - specifiedType: const FullType( - BuiltList, const [const FullType(SubmissionTypes)]))); - - return result; - } - - @override - CreateAssignmentInfo deserialize( - Serializers serializers, Iterable serialized, - {FullType specifiedType = FullType.unspecified}) { - final result = new CreateAssignmentInfoBuilder(); - - final iterator = serialized.iterator; - while (iterator.moveNext()) { - final key = iterator.current! as String; - iterator.moveNext(); - final Object? value = iterator.current; - switch (key) { - case 'name': - result.name = serializers.deserialize(value, - specifiedType: const FullType(String))! as String; - break; - case 'description': - result.description = serializers.deserialize(value, - specifiedType: const FullType(String)) as String?; - break; - case 'due_at': - result.dueAt = serializers.deserialize(value, - specifiedType: const FullType(DateTime)) as DateTime?; - break; - case 'points_possible': - result.pointsPossible = serializers.deserialize(value, - specifiedType: const FullType(double))! as double; - break; - case 'course_id': - result.courseId = serializers.deserialize(value, - specifiedType: const FullType(String))! as String; - break; - case 'grading_type': - result.gradingType = serializers.deserialize(value, - specifiedType: const FullType(GradingType)) as GradingType?; - break; - case 'html_url': - result.htmlUrl = serializers.deserialize(value, - specifiedType: const FullType(String)) as String?; - break; - case 'url': - result.url = serializers.deserialize(value, - specifiedType: const FullType(String)) as String?; - break; - case 'quiz_id': - result.quizId = serializers.deserialize(value, - specifiedType: const FullType(String)) as String?; - break; - case 'use_rubric_for_grading': - result.useRubricForGrading = serializers.deserialize(value, - specifiedType: const FullType(bool)) as bool?; - break; - case 'assignment_group_id': - result.assignmentGroupId = serializers.deserialize(value, - specifiedType: const FullType(String)) as String?; - break; - case 'position': - result.position = serializers.deserialize(value, - specifiedType: const FullType(int)) as int?; - break; - case 'lock_info': - result.lockInfo.replace(serializers.deserialize(value, - specifiedType: const FullType(LockInfo))! as LockInfo); - break; - case 'locked_for_user': - result.lockedForUser = serializers.deserialize(value, - specifiedType: const FullType(bool)) as bool?; - break; - case 'lock_at': - result.lockAt = serializers.deserialize(value, - specifiedType: const FullType(DateTime)) as DateTime?; - break; - case 'unlock_at': - result.unlockAt = serializers.deserialize(value, - specifiedType: const FullType(DateTime)) as DateTime?; - break; - case 'lock_explanation': - result.lockExplanation = serializers.deserialize(value, - specifiedType: const FullType(String)) as String?; - break; - case 'free_form_criterion_comments': - result.freeFormCriterionComments = serializers.deserialize(value, - specifiedType: const FullType(bool)) as bool?; - break; - case 'published': - result.published = serializers.deserialize(value, - specifiedType: const FullType(bool))! as bool; - break; - case 'muted': - result.muted = serializers.deserialize(value, - specifiedType: const FullType(bool)) as bool?; - break; - case 'group_category_id': - result.groupCategoryId = serializers.deserialize(value, - specifiedType: const FullType(String)) as String?; - break; - case 'submission_types': - result.submissionTypes.replace(serializers.deserialize(value, - specifiedType: const FullType( - BuiltList, const [const FullType(SubmissionTypes)]))! - as BuiltList); - break; - } - } - - return result.build(); - } -} - -class _$CreateAssignmentInfo extends CreateAssignmentInfo { - @override - final String name; - @override - final String? description; - @override - final DateTime? dueAt; - @override - final double pointsPossible; - @override - final String courseId; - @override - final GradingType? gradingType; - @override - final String? htmlUrl; - @override - final String? url; - @override - final String? quizId; - @override - final bool? useRubricForGrading; - @override - final String? assignmentGroupId; - @override - final int? position; - @override - final LockInfo? lockInfo; - @override - final bool? lockedForUser; - @override - final DateTime? lockAt; - @override - final DateTime? unlockAt; - @override - final String? lockExplanation; - @override - final bool? freeFormCriterionComments; - @override - final bool published; - @override - final bool? muted; - @override - final String? groupCategoryId; - @override - final BuiltList? submissionTypes; - - factory _$CreateAssignmentInfo( - [void Function(CreateAssignmentInfoBuilder)? updates]) => - (new CreateAssignmentInfoBuilder()..update(updates))._build(); - - _$CreateAssignmentInfo._( - {required this.name, - this.description, - this.dueAt, - required this.pointsPossible, - required this.courseId, - this.gradingType, - this.htmlUrl, - this.url, - this.quizId, - this.useRubricForGrading, - this.assignmentGroupId, - this.position, - this.lockInfo, - this.lockedForUser, - this.lockAt, - this.unlockAt, - this.lockExplanation, - this.freeFormCriterionComments, - required this.published, - this.muted, - this.groupCategoryId, - this.submissionTypes}) - : super._() { - BuiltValueNullFieldError.checkNotNull( - name, r'CreateAssignmentInfo', 'name'); - BuiltValueNullFieldError.checkNotNull( - pointsPossible, r'CreateAssignmentInfo', 'pointsPossible'); - BuiltValueNullFieldError.checkNotNull( - courseId, r'CreateAssignmentInfo', 'courseId'); - BuiltValueNullFieldError.checkNotNull( - published, r'CreateAssignmentInfo', 'published'); - } - - @override - CreateAssignmentInfo rebuild( - void Function(CreateAssignmentInfoBuilder) updates) => - (toBuilder()..update(updates)).build(); - - @override - CreateAssignmentInfoBuilder toBuilder() => - new CreateAssignmentInfoBuilder()..replace(this); - - @override - bool operator ==(Object other) { - if (identical(other, this)) return true; - return other is CreateAssignmentInfo && - name == other.name && - description == other.description && - dueAt == other.dueAt && - pointsPossible == other.pointsPossible && - courseId == other.courseId && - gradingType == other.gradingType && - htmlUrl == other.htmlUrl && - url == other.url && - quizId == other.quizId && - useRubricForGrading == other.useRubricForGrading && - assignmentGroupId == other.assignmentGroupId && - position == other.position && - lockInfo == other.lockInfo && - lockedForUser == other.lockedForUser && - lockAt == other.lockAt && - unlockAt == other.unlockAt && - lockExplanation == other.lockExplanation && - freeFormCriterionComments == other.freeFormCriterionComments && - published == other.published && - muted == other.muted && - groupCategoryId == other.groupCategoryId && - submissionTypes == other.submissionTypes; - } - - @override - int get hashCode { - var _$hash = 0; - _$hash = $jc(_$hash, name.hashCode); - _$hash = $jc(_$hash, description.hashCode); - _$hash = $jc(_$hash, dueAt.hashCode); - _$hash = $jc(_$hash, pointsPossible.hashCode); - _$hash = $jc(_$hash, courseId.hashCode); - _$hash = $jc(_$hash, gradingType.hashCode); - _$hash = $jc(_$hash, htmlUrl.hashCode); - _$hash = $jc(_$hash, url.hashCode); - _$hash = $jc(_$hash, quizId.hashCode); - _$hash = $jc(_$hash, useRubricForGrading.hashCode); - _$hash = $jc(_$hash, assignmentGroupId.hashCode); - _$hash = $jc(_$hash, position.hashCode); - _$hash = $jc(_$hash, lockInfo.hashCode); - _$hash = $jc(_$hash, lockedForUser.hashCode); - _$hash = $jc(_$hash, lockAt.hashCode); - _$hash = $jc(_$hash, unlockAt.hashCode); - _$hash = $jc(_$hash, lockExplanation.hashCode); - _$hash = $jc(_$hash, freeFormCriterionComments.hashCode); - _$hash = $jc(_$hash, published.hashCode); - _$hash = $jc(_$hash, muted.hashCode); - _$hash = $jc(_$hash, groupCategoryId.hashCode); - _$hash = $jc(_$hash, submissionTypes.hashCode); - _$hash = $jf(_$hash); - return _$hash; - } - - @override - String toString() { - return (newBuiltValueToStringHelper(r'CreateAssignmentInfo') - ..add('name', name) - ..add('description', description) - ..add('dueAt', dueAt) - ..add('pointsPossible', pointsPossible) - ..add('courseId', courseId) - ..add('gradingType', gradingType) - ..add('htmlUrl', htmlUrl) - ..add('url', url) - ..add('quizId', quizId) - ..add('useRubricForGrading', useRubricForGrading) - ..add('assignmentGroupId', assignmentGroupId) - ..add('position', position) - ..add('lockInfo', lockInfo) - ..add('lockedForUser', lockedForUser) - ..add('lockAt', lockAt) - ..add('unlockAt', unlockAt) - ..add('lockExplanation', lockExplanation) - ..add('freeFormCriterionComments', freeFormCriterionComments) - ..add('published', published) - ..add('muted', muted) - ..add('groupCategoryId', groupCategoryId) - ..add('submissionTypes', submissionTypes)) - .toString(); - } -} - -class CreateAssignmentInfoBuilder - implements Builder { - _$CreateAssignmentInfo? _$v; - - String? _name; - String? get name => _$this._name; - set name(String? name) => _$this._name = name; - - String? _description; - String? get description => _$this._description; - set description(String? description) => _$this._description = description; - - DateTime? _dueAt; - DateTime? get dueAt => _$this._dueAt; - set dueAt(DateTime? dueAt) => _$this._dueAt = dueAt; - - double? _pointsPossible; - double? get pointsPossible => _$this._pointsPossible; - set pointsPossible(double? pointsPossible) => - _$this._pointsPossible = pointsPossible; - - String? _courseId; - String? get courseId => _$this._courseId; - set courseId(String? courseId) => _$this._courseId = courseId; - - GradingType? _gradingType; - GradingType? get gradingType => _$this._gradingType; - set gradingType(GradingType? gradingType) => - _$this._gradingType = gradingType; - - String? _htmlUrl; - String? get htmlUrl => _$this._htmlUrl; - set htmlUrl(String? htmlUrl) => _$this._htmlUrl = htmlUrl; - - String? _url; - String? get url => _$this._url; - set url(String? url) => _$this._url = url; - - String? _quizId; - String? get quizId => _$this._quizId; - set quizId(String? quizId) => _$this._quizId = quizId; - - bool? _useRubricForGrading; - bool? get useRubricForGrading => _$this._useRubricForGrading; - set useRubricForGrading(bool? useRubricForGrading) => - _$this._useRubricForGrading = useRubricForGrading; - - String? _assignmentGroupId; - String? get assignmentGroupId => _$this._assignmentGroupId; - set assignmentGroupId(String? assignmentGroupId) => - _$this._assignmentGroupId = assignmentGroupId; - - int? _position; - int? get position => _$this._position; - set position(int? position) => _$this._position = position; - - LockInfoBuilder? _lockInfo; - LockInfoBuilder get lockInfo => _$this._lockInfo ??= new LockInfoBuilder(); - set lockInfo(LockInfoBuilder? lockInfo) => _$this._lockInfo = lockInfo; - - bool? _lockedForUser; - bool? get lockedForUser => _$this._lockedForUser; - set lockedForUser(bool? lockedForUser) => - _$this._lockedForUser = lockedForUser; - - DateTime? _lockAt; - DateTime? get lockAt => _$this._lockAt; - set lockAt(DateTime? lockAt) => _$this._lockAt = lockAt; - - DateTime? _unlockAt; - DateTime? get unlockAt => _$this._unlockAt; - set unlockAt(DateTime? unlockAt) => _$this._unlockAt = unlockAt; - - String? _lockExplanation; - String? get lockExplanation => _$this._lockExplanation; - set lockExplanation(String? lockExplanation) => - _$this._lockExplanation = lockExplanation; - - bool? _freeFormCriterionComments; - bool? get freeFormCriterionComments => _$this._freeFormCriterionComments; - set freeFormCriterionComments(bool? freeFormCriterionComments) => - _$this._freeFormCriterionComments = freeFormCriterionComments; - - bool? _published; - bool? get published => _$this._published; - set published(bool? published) => _$this._published = published; - - bool? _muted; - bool? get muted => _$this._muted; - set muted(bool? muted) => _$this._muted = muted; - - String? _groupCategoryId; - String? get groupCategoryId => _$this._groupCategoryId; - set groupCategoryId(String? groupCategoryId) => - _$this._groupCategoryId = groupCategoryId; - - ListBuilder? _submissionTypes; - ListBuilder get submissionTypes => - _$this._submissionTypes ??= new ListBuilder(); - set submissionTypes(ListBuilder? submissionTypes) => - _$this._submissionTypes = submissionTypes; - - CreateAssignmentInfoBuilder() { - CreateAssignmentInfo._initializeBuilder(this); - } - - CreateAssignmentInfoBuilder get _$this { - final $v = _$v; - if ($v != null) { - _name = $v.name; - _description = $v.description; - _dueAt = $v.dueAt; - _pointsPossible = $v.pointsPossible; - _courseId = $v.courseId; - _gradingType = $v.gradingType; - _htmlUrl = $v.htmlUrl; - _url = $v.url; - _quizId = $v.quizId; - _useRubricForGrading = $v.useRubricForGrading; - _assignmentGroupId = $v.assignmentGroupId; - _position = $v.position; - _lockInfo = $v.lockInfo?.toBuilder(); - _lockedForUser = $v.lockedForUser; - _lockAt = $v.lockAt; - _unlockAt = $v.unlockAt; - _lockExplanation = $v.lockExplanation; - _freeFormCriterionComments = $v.freeFormCriterionComments; - _published = $v.published; - _muted = $v.muted; - _groupCategoryId = $v.groupCategoryId; - _submissionTypes = $v.submissionTypes?.toBuilder(); - _$v = null; - } - return this; - } - - @override - void replace(CreateAssignmentInfo other) { - ArgumentError.checkNotNull(other, 'other'); - _$v = other as _$CreateAssignmentInfo; - } - - @override - void update(void Function(CreateAssignmentInfoBuilder)? updates) { - if (updates != null) updates(this); - } - - @override - CreateAssignmentInfo build() => _build(); - - _$CreateAssignmentInfo _build() { - _$CreateAssignmentInfo _$result; - try { - _$result = _$v ?? - new _$CreateAssignmentInfo._( - name: BuiltValueNullFieldError.checkNotNull( - name, r'CreateAssignmentInfo', 'name'), - description: description, - dueAt: dueAt, - pointsPossible: BuiltValueNullFieldError.checkNotNull( - pointsPossible, r'CreateAssignmentInfo', 'pointsPossible'), - courseId: BuiltValueNullFieldError.checkNotNull( - courseId, r'CreateAssignmentInfo', 'courseId'), - gradingType: gradingType, - htmlUrl: htmlUrl, - url: url, - quizId: quizId, - useRubricForGrading: useRubricForGrading, - assignmentGroupId: assignmentGroupId, - position: position, - lockInfo: _lockInfo?.build(), - lockedForUser: lockedForUser, - lockAt: lockAt, - unlockAt: unlockAt, - lockExplanation: lockExplanation, - freeFormCriterionComments: freeFormCriterionComments, - published: BuiltValueNullFieldError.checkNotNull( - published, r'CreateAssignmentInfo', 'published'), - muted: muted, - groupCategoryId: groupCategoryId, - submissionTypes: _submissionTypes?.build()); - } catch (_) { - late String _$failedField; - try { - _$failedField = 'lockInfo'; - _lockInfo?.build(); - - _$failedField = 'submissionTypes'; - _submissionTypes?.build(); - } catch (e) { - throw new BuiltValueNestedFieldError( - r'CreateAssignmentInfo', _$failedField, e.toString()); - } - rethrow; - } - replace(_$result); - return _$result; - } -} - -// ignore_for_file: deprecated_member_use_from_same_package,type=lint diff --git a/apps/flutter_parent/lib/models/dataseeding/create_assignment_wrapper.dart b/apps/flutter_parent/lib/models/dataseeding/create_assignment_wrapper.dart deleted file mode 100644 index fc73f63847..0000000000 --- a/apps/flutter_parent/lib/models/dataseeding/create_assignment_wrapper.dart +++ /dev/null @@ -1,32 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -import 'package:built_value/built_value.dart'; -import 'package:built_value/serializer.dart'; - -import 'create_assignment_info.dart'; - -part 'create_assignment_wrapper.g.dart'; - -abstract class CreateAssignmentWrapper implements Built { - @BuiltValueSerializer(serializeNulls: true) - static Serializer get serializer => _$createAssignmentWrapperSerializer; - - CreateAssignmentWrapper._(); - - factory CreateAssignmentWrapper([void Function(CreateAssignmentWrapperBuilder) updates]) = _$CreateAssignmentWrapper; - - CreateAssignmentInfo get assignment; - - static void _initializeBuilder(CreateAssignmentWrapperBuilder b) => b; -} diff --git a/apps/flutter_parent/lib/models/dataseeding/create_assignment_wrapper.g.dart b/apps/flutter_parent/lib/models/dataseeding/create_assignment_wrapper.g.dart deleted file mode 100644 index 92ec7895dd..0000000000 --- a/apps/flutter_parent/lib/models/dataseeding/create_assignment_wrapper.g.dart +++ /dev/null @@ -1,162 +0,0 @@ -// GENERATED CODE - DO NOT MODIFY BY HAND - -part of 'create_assignment_wrapper.dart'; - -// ************************************************************************** -// BuiltValueGenerator -// ************************************************************************** - -Serializer _$createAssignmentWrapperSerializer = - new _$CreateAssignmentWrapperSerializer(); - -class _$CreateAssignmentWrapperSerializer - implements StructuredSerializer { - @override - final Iterable types = const [ - CreateAssignmentWrapper, - _$CreateAssignmentWrapper - ]; - @override - final String wireName = 'CreateAssignmentWrapper'; - - @override - Iterable serialize( - Serializers serializers, CreateAssignmentWrapper object, - {FullType specifiedType = FullType.unspecified}) { - final result = [ - 'assignment', - serializers.serialize(object.assignment, - specifiedType: const FullType(CreateAssignmentInfo)), - ]; - - return result; - } - - @override - CreateAssignmentWrapper deserialize( - Serializers serializers, Iterable serialized, - {FullType specifiedType = FullType.unspecified}) { - final result = new CreateAssignmentWrapperBuilder(); - - final iterator = serialized.iterator; - while (iterator.moveNext()) { - final key = iterator.current! as String; - iterator.moveNext(); - final Object? value = iterator.current; - switch (key) { - case 'assignment': - result.assignment.replace(serializers.deserialize(value, - specifiedType: const FullType(CreateAssignmentInfo))! - as CreateAssignmentInfo); - break; - } - } - - return result.build(); - } -} - -class _$CreateAssignmentWrapper extends CreateAssignmentWrapper { - @override - final CreateAssignmentInfo assignment; - - factory _$CreateAssignmentWrapper( - [void Function(CreateAssignmentWrapperBuilder)? updates]) => - (new CreateAssignmentWrapperBuilder()..update(updates))._build(); - - _$CreateAssignmentWrapper._({required this.assignment}) : super._() { - BuiltValueNullFieldError.checkNotNull( - assignment, r'CreateAssignmentWrapper', 'assignment'); - } - - @override - CreateAssignmentWrapper rebuild( - void Function(CreateAssignmentWrapperBuilder) updates) => - (toBuilder()..update(updates)).build(); - - @override - CreateAssignmentWrapperBuilder toBuilder() => - new CreateAssignmentWrapperBuilder()..replace(this); - - @override - bool operator ==(Object other) { - if (identical(other, this)) return true; - return other is CreateAssignmentWrapper && assignment == other.assignment; - } - - @override - int get hashCode { - var _$hash = 0; - _$hash = $jc(_$hash, assignment.hashCode); - _$hash = $jf(_$hash); - return _$hash; - } - - @override - String toString() { - return (newBuiltValueToStringHelper(r'CreateAssignmentWrapper') - ..add('assignment', assignment)) - .toString(); - } -} - -class CreateAssignmentWrapperBuilder - implements - Builder { - _$CreateAssignmentWrapper? _$v; - - CreateAssignmentInfoBuilder? _assignment; - CreateAssignmentInfoBuilder get assignment => - _$this._assignment ??= new CreateAssignmentInfoBuilder(); - set assignment(CreateAssignmentInfoBuilder? assignment) => - _$this._assignment = assignment; - - CreateAssignmentWrapperBuilder() { - CreateAssignmentWrapper._initializeBuilder(this); - } - - CreateAssignmentWrapperBuilder get _$this { - final $v = _$v; - if ($v != null) { - _assignment = $v.assignment.toBuilder(); - _$v = null; - } - return this; - } - - @override - void replace(CreateAssignmentWrapper other) { - ArgumentError.checkNotNull(other, 'other'); - _$v = other as _$CreateAssignmentWrapper; - } - - @override - void update(void Function(CreateAssignmentWrapperBuilder)? updates) { - if (updates != null) updates(this); - } - - @override - CreateAssignmentWrapper build() => _build(); - - _$CreateAssignmentWrapper _build() { - _$CreateAssignmentWrapper _$result; - try { - _$result = _$v ?? - new _$CreateAssignmentWrapper._(assignment: assignment.build()); - } catch (_) { - late String _$failedField; - try { - _$failedField = 'assignment'; - assignment.build(); - } catch (e) { - throw new BuiltValueNestedFieldError( - r'CreateAssignmentWrapper', _$failedField, e.toString()); - } - rethrow; - } - replace(_$result); - return _$result; - } -} - -// ignore_for_file: deprecated_member_use_from_same_package,type=lint diff --git a/apps/flutter_parent/lib/models/dataseeding/create_course_info.dart b/apps/flutter_parent/lib/models/dataseeding/create_course_info.dart deleted file mode 100644 index e9a88a6bb1..0000000000 --- a/apps/flutter_parent/lib/models/dataseeding/create_course_info.dart +++ /dev/null @@ -1,41 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:built_value/built_value.dart'; -import 'package:built_value/serializer.dart'; - -part 'create_course_info.g.dart'; - -abstract class CreateCourseInfo implements Built { - @BuiltValueSerializer(serializeNulls: true) - static Serializer get serializer => _$createCourseInfoSerializer; - - CreateCourseInfo._(); - factory CreateCourseInfo([void Function(CreateCourseInfoBuilder) updates]) = _$CreateCourseInfo; - - String get name; - - @BuiltValueField(wireName: "course_code") - String get courseCode; - - @BuiltValueField(wireName: "enrollment_term_id") - int? get enrollmentTermId; - - String get role; - - @BuiltValueField(wireName: "syllabus_body") - String? get syllabusBody; - - static void _initializeBuilder(CreateCourseInfoBuilder b) => b..role = "student"; -} diff --git a/apps/flutter_parent/lib/models/dataseeding/create_course_info.g.dart b/apps/flutter_parent/lib/models/dataseeding/create_course_info.g.dart deleted file mode 100644 index c20a27641b..0000000000 --- a/apps/flutter_parent/lib/models/dataseeding/create_course_info.g.dart +++ /dev/null @@ -1,230 +0,0 @@ -// GENERATED CODE - DO NOT MODIFY BY HAND - -part of 'create_course_info.dart'; - -// ************************************************************************** -// BuiltValueGenerator -// ************************************************************************** - -Serializer _$createCourseInfoSerializer = - new _$CreateCourseInfoSerializer(); - -class _$CreateCourseInfoSerializer - implements StructuredSerializer { - @override - final Iterable types = const [CreateCourseInfo, _$CreateCourseInfo]; - @override - final String wireName = 'CreateCourseInfo'; - - @override - Iterable serialize(Serializers serializers, CreateCourseInfo object, - {FullType specifiedType = FullType.unspecified}) { - final result = [ - 'name', - serializers.serialize(object.name, specifiedType: const FullType(String)), - 'course_code', - serializers.serialize(object.courseCode, - specifiedType: const FullType(String)), - 'role', - serializers.serialize(object.role, specifiedType: const FullType(String)), - ]; - Object? value; - value = object.enrollmentTermId; - - result - ..add('enrollment_term_id') - ..add(serializers.serialize(value, specifiedType: const FullType(int))); - value = object.syllabusBody; - - result - ..add('syllabus_body') - ..add( - serializers.serialize(value, specifiedType: const FullType(String))); - - return result; - } - - @override - CreateCourseInfo deserialize( - Serializers serializers, Iterable serialized, - {FullType specifiedType = FullType.unspecified}) { - final result = new CreateCourseInfoBuilder(); - - final iterator = serialized.iterator; - while (iterator.moveNext()) { - final key = iterator.current! as String; - iterator.moveNext(); - final Object? value = iterator.current; - switch (key) { - case 'name': - result.name = serializers.deserialize(value, - specifiedType: const FullType(String))! as String; - break; - case 'course_code': - result.courseCode = serializers.deserialize(value, - specifiedType: const FullType(String))! as String; - break; - case 'enrollment_term_id': - result.enrollmentTermId = serializers.deserialize(value, - specifiedType: const FullType(int)) as int?; - break; - case 'role': - result.role = serializers.deserialize(value, - specifiedType: const FullType(String))! as String; - break; - case 'syllabus_body': - result.syllabusBody = serializers.deserialize(value, - specifiedType: const FullType(String)) as String?; - break; - } - } - - return result.build(); - } -} - -class _$CreateCourseInfo extends CreateCourseInfo { - @override - final String name; - @override - final String courseCode; - @override - final int? enrollmentTermId; - @override - final String role; - @override - final String? syllabusBody; - - factory _$CreateCourseInfo( - [void Function(CreateCourseInfoBuilder)? updates]) => - (new CreateCourseInfoBuilder()..update(updates))._build(); - - _$CreateCourseInfo._( - {required this.name, - required this.courseCode, - this.enrollmentTermId, - required this.role, - this.syllabusBody}) - : super._() { - BuiltValueNullFieldError.checkNotNull(name, r'CreateCourseInfo', 'name'); - BuiltValueNullFieldError.checkNotNull( - courseCode, r'CreateCourseInfo', 'courseCode'); - BuiltValueNullFieldError.checkNotNull(role, r'CreateCourseInfo', 'role'); - } - - @override - CreateCourseInfo rebuild(void Function(CreateCourseInfoBuilder) updates) => - (toBuilder()..update(updates)).build(); - - @override - CreateCourseInfoBuilder toBuilder() => - new CreateCourseInfoBuilder()..replace(this); - - @override - bool operator ==(Object other) { - if (identical(other, this)) return true; - return other is CreateCourseInfo && - name == other.name && - courseCode == other.courseCode && - enrollmentTermId == other.enrollmentTermId && - role == other.role && - syllabusBody == other.syllabusBody; - } - - @override - int get hashCode { - var _$hash = 0; - _$hash = $jc(_$hash, name.hashCode); - _$hash = $jc(_$hash, courseCode.hashCode); - _$hash = $jc(_$hash, enrollmentTermId.hashCode); - _$hash = $jc(_$hash, role.hashCode); - _$hash = $jc(_$hash, syllabusBody.hashCode); - _$hash = $jf(_$hash); - return _$hash; - } - - @override - String toString() { - return (newBuiltValueToStringHelper(r'CreateCourseInfo') - ..add('name', name) - ..add('courseCode', courseCode) - ..add('enrollmentTermId', enrollmentTermId) - ..add('role', role) - ..add('syllabusBody', syllabusBody)) - .toString(); - } -} - -class CreateCourseInfoBuilder - implements Builder { - _$CreateCourseInfo? _$v; - - String? _name; - String? get name => _$this._name; - set name(String? name) => _$this._name = name; - - String? _courseCode; - String? get courseCode => _$this._courseCode; - set courseCode(String? courseCode) => _$this._courseCode = courseCode; - - int? _enrollmentTermId; - int? get enrollmentTermId => _$this._enrollmentTermId; - set enrollmentTermId(int? enrollmentTermId) => - _$this._enrollmentTermId = enrollmentTermId; - - String? _role; - String? get role => _$this._role; - set role(String? role) => _$this._role = role; - - String? _syllabusBody; - String? get syllabusBody => _$this._syllabusBody; - set syllabusBody(String? syllabusBody) => _$this._syllabusBody = syllabusBody; - - CreateCourseInfoBuilder() { - CreateCourseInfo._initializeBuilder(this); - } - - CreateCourseInfoBuilder get _$this { - final $v = _$v; - if ($v != null) { - _name = $v.name; - _courseCode = $v.courseCode; - _enrollmentTermId = $v.enrollmentTermId; - _role = $v.role; - _syllabusBody = $v.syllabusBody; - _$v = null; - } - return this; - } - - @override - void replace(CreateCourseInfo other) { - ArgumentError.checkNotNull(other, 'other'); - _$v = other as _$CreateCourseInfo; - } - - @override - void update(void Function(CreateCourseInfoBuilder)? updates) { - if (updates != null) updates(this); - } - - @override - CreateCourseInfo build() => _build(); - - _$CreateCourseInfo _build() { - final _$result = _$v ?? - new _$CreateCourseInfo._( - name: BuiltValueNullFieldError.checkNotNull( - name, r'CreateCourseInfo', 'name'), - courseCode: BuiltValueNullFieldError.checkNotNull( - courseCode, r'CreateCourseInfo', 'courseCode'), - enrollmentTermId: enrollmentTermId, - role: BuiltValueNullFieldError.checkNotNull( - role, r'CreateCourseInfo', 'role'), - syllabusBody: syllabusBody); - replace(_$result); - return _$result; - } -} - -// ignore_for_file: deprecated_member_use_from_same_package,type=lint diff --git a/apps/flutter_parent/lib/models/dataseeding/create_course_wrapper.dart b/apps/flutter_parent/lib/models/dataseeding/create_course_wrapper.dart deleted file mode 100644 index f57d8d318e..0000000000 --- a/apps/flutter_parent/lib/models/dataseeding/create_course_wrapper.dart +++ /dev/null @@ -1,33 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:built_value/built_value.dart'; -import 'package:built_value/serializer.dart'; - -import 'create_course_info.dart'; - -part 'create_course_wrapper.g.dart'; - -abstract class CreateCourseWrapper implements Built { - @BuiltValueSerializer(serializeNulls: true) - static Serializer get serializer => _$createCourseWrapperSerializer; - - CreateCourseWrapper._(); - factory CreateCourseWrapper([void Function(CreateCourseWrapperBuilder) updates]) = _$CreateCourseWrapper; - - CreateCourseInfo get course; - bool get offer; - - static void _initializeBuilder(CreateCourseWrapperBuilder b) => b..offer = true; -} diff --git a/apps/flutter_parent/lib/models/dataseeding/create_course_wrapper.g.dart b/apps/flutter_parent/lib/models/dataseeding/create_course_wrapper.g.dart deleted file mode 100644 index 5fa72345bc..0000000000 --- a/apps/flutter_parent/lib/models/dataseeding/create_course_wrapper.g.dart +++ /dev/null @@ -1,183 +0,0 @@ -// GENERATED CODE - DO NOT MODIFY BY HAND - -part of 'create_course_wrapper.dart'; - -// ************************************************************************** -// BuiltValueGenerator -// ************************************************************************** - -Serializer _$createCourseWrapperSerializer = - new _$CreateCourseWrapperSerializer(); - -class _$CreateCourseWrapperSerializer - implements StructuredSerializer { - @override - final Iterable types = const [ - CreateCourseWrapper, - _$CreateCourseWrapper - ]; - @override - final String wireName = 'CreateCourseWrapper'; - - @override - Iterable serialize( - Serializers serializers, CreateCourseWrapper object, - {FullType specifiedType = FullType.unspecified}) { - final result = [ - 'course', - serializers.serialize(object.course, - specifiedType: const FullType(CreateCourseInfo)), - 'offer', - serializers.serialize(object.offer, specifiedType: const FullType(bool)), - ]; - - return result; - } - - @override - CreateCourseWrapper deserialize( - Serializers serializers, Iterable serialized, - {FullType specifiedType = FullType.unspecified}) { - final result = new CreateCourseWrapperBuilder(); - - final iterator = serialized.iterator; - while (iterator.moveNext()) { - final key = iterator.current! as String; - iterator.moveNext(); - final Object? value = iterator.current; - switch (key) { - case 'course': - result.course.replace(serializers.deserialize(value, - specifiedType: const FullType(CreateCourseInfo))! - as CreateCourseInfo); - break; - case 'offer': - result.offer = serializers.deserialize(value, - specifiedType: const FullType(bool))! as bool; - break; - } - } - - return result.build(); - } -} - -class _$CreateCourseWrapper extends CreateCourseWrapper { - @override - final CreateCourseInfo course; - @override - final bool offer; - - factory _$CreateCourseWrapper( - [void Function(CreateCourseWrapperBuilder)? updates]) => - (new CreateCourseWrapperBuilder()..update(updates))._build(); - - _$CreateCourseWrapper._({required this.course, required this.offer}) - : super._() { - BuiltValueNullFieldError.checkNotNull( - course, r'CreateCourseWrapper', 'course'); - BuiltValueNullFieldError.checkNotNull( - offer, r'CreateCourseWrapper', 'offer'); - } - - @override - CreateCourseWrapper rebuild( - void Function(CreateCourseWrapperBuilder) updates) => - (toBuilder()..update(updates)).build(); - - @override - CreateCourseWrapperBuilder toBuilder() => - new CreateCourseWrapperBuilder()..replace(this); - - @override - bool operator ==(Object other) { - if (identical(other, this)) return true; - return other is CreateCourseWrapper && - course == other.course && - offer == other.offer; - } - - @override - int get hashCode { - var _$hash = 0; - _$hash = $jc(_$hash, course.hashCode); - _$hash = $jc(_$hash, offer.hashCode); - _$hash = $jf(_$hash); - return _$hash; - } - - @override - String toString() { - return (newBuiltValueToStringHelper(r'CreateCourseWrapper') - ..add('course', course) - ..add('offer', offer)) - .toString(); - } -} - -class CreateCourseWrapperBuilder - implements Builder { - _$CreateCourseWrapper? _$v; - - CreateCourseInfoBuilder? _course; - CreateCourseInfoBuilder get course => - _$this._course ??= new CreateCourseInfoBuilder(); - set course(CreateCourseInfoBuilder? course) => _$this._course = course; - - bool? _offer; - bool? get offer => _$this._offer; - set offer(bool? offer) => _$this._offer = offer; - - CreateCourseWrapperBuilder() { - CreateCourseWrapper._initializeBuilder(this); - } - - CreateCourseWrapperBuilder get _$this { - final $v = _$v; - if ($v != null) { - _course = $v.course.toBuilder(); - _offer = $v.offer; - _$v = null; - } - return this; - } - - @override - void replace(CreateCourseWrapper other) { - ArgumentError.checkNotNull(other, 'other'); - _$v = other as _$CreateCourseWrapper; - } - - @override - void update(void Function(CreateCourseWrapperBuilder)? updates) { - if (updates != null) updates(this); - } - - @override - CreateCourseWrapper build() => _build(); - - _$CreateCourseWrapper _build() { - _$CreateCourseWrapper _$result; - try { - _$result = _$v ?? - new _$CreateCourseWrapper._( - course: course.build(), - offer: BuiltValueNullFieldError.checkNotNull( - offer, r'CreateCourseWrapper', 'offer')); - } catch (_) { - late String _$failedField; - try { - _$failedField = 'course'; - course.build(); - } catch (e) { - throw new BuiltValueNestedFieldError( - r'CreateCourseWrapper', _$failedField, e.toString()); - } - rethrow; - } - replace(_$result); - return _$result; - } -} - -// ignore_for_file: deprecated_member_use_from_same_package,type=lint diff --git a/apps/flutter_parent/lib/models/dataseeding/create_enrollment_info.dart b/apps/flutter_parent/lib/models/dataseeding/create_enrollment_info.dart deleted file mode 100644 index 7c92c7df34..0000000000 --- a/apps/flutter_parent/lib/models/dataseeding/create_enrollment_info.dart +++ /dev/null @@ -1,41 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:built_value/built_value.dart'; -import 'package:built_value/serializer.dart'; - -part 'create_enrollment_info.g.dart'; - -abstract class CreateEnrollmentInfo implements Built { - @BuiltValueSerializer(serializeNulls: true) - static Serializer get serializer => _$createEnrollmentInfoSerializer; - - CreateEnrollmentInfo._(); - factory CreateEnrollmentInfo([void Function(CreateEnrollmentInfoBuilder) updates]) = _$CreateEnrollmentInfo; - - @BuiltValueField(wireName: "user_id") - String get userId; - - String get type; - - String get role; - - @BuiltValueField(wireName: "enrollment_state") - String get enrollmentState; - - @BuiltValueField(wireName: "associated_user_id") - String? get associatedUserId; - - static void _initializeBuilder(CreateEnrollmentInfoBuilder b) => b..role = ""; -} diff --git a/apps/flutter_parent/lib/models/dataseeding/create_enrollment_info.g.dart b/apps/flutter_parent/lib/models/dataseeding/create_enrollment_info.g.dart deleted file mode 100644 index 2de6540dd6..0000000000 --- a/apps/flutter_parent/lib/models/dataseeding/create_enrollment_info.g.dart +++ /dev/null @@ -1,239 +0,0 @@ -// GENERATED CODE - DO NOT MODIFY BY HAND - -part of 'create_enrollment_info.dart'; - -// ************************************************************************** -// BuiltValueGenerator -// ************************************************************************** - -Serializer _$createEnrollmentInfoSerializer = - new _$CreateEnrollmentInfoSerializer(); - -class _$CreateEnrollmentInfoSerializer - implements StructuredSerializer { - @override - final Iterable types = const [ - CreateEnrollmentInfo, - _$CreateEnrollmentInfo - ]; - @override - final String wireName = 'CreateEnrollmentInfo'; - - @override - Iterable serialize( - Serializers serializers, CreateEnrollmentInfo object, - {FullType specifiedType = FullType.unspecified}) { - final result = [ - 'user_id', - serializers.serialize(object.userId, - specifiedType: const FullType(String)), - 'type', - serializers.serialize(object.type, specifiedType: const FullType(String)), - 'role', - serializers.serialize(object.role, specifiedType: const FullType(String)), - 'enrollment_state', - serializers.serialize(object.enrollmentState, - specifiedType: const FullType(String)), - ]; - Object? value; - value = object.associatedUserId; - - result - ..add('associated_user_id') - ..add( - serializers.serialize(value, specifiedType: const FullType(String))); - - return result; - } - - @override - CreateEnrollmentInfo deserialize( - Serializers serializers, Iterable serialized, - {FullType specifiedType = FullType.unspecified}) { - final result = new CreateEnrollmentInfoBuilder(); - - final iterator = serialized.iterator; - while (iterator.moveNext()) { - final key = iterator.current! as String; - iterator.moveNext(); - final Object? value = iterator.current; - switch (key) { - case 'user_id': - result.userId = serializers.deserialize(value, - specifiedType: const FullType(String))! as String; - break; - case 'type': - result.type = serializers.deserialize(value, - specifiedType: const FullType(String))! as String; - break; - case 'role': - result.role = serializers.deserialize(value, - specifiedType: const FullType(String))! as String; - break; - case 'enrollment_state': - result.enrollmentState = serializers.deserialize(value, - specifiedType: const FullType(String))! as String; - break; - case 'associated_user_id': - result.associatedUserId = serializers.deserialize(value, - specifiedType: const FullType(String)) as String?; - break; - } - } - - return result.build(); - } -} - -class _$CreateEnrollmentInfo extends CreateEnrollmentInfo { - @override - final String userId; - @override - final String type; - @override - final String role; - @override - final String enrollmentState; - @override - final String? associatedUserId; - - factory _$CreateEnrollmentInfo( - [void Function(CreateEnrollmentInfoBuilder)? updates]) => - (new CreateEnrollmentInfoBuilder()..update(updates))._build(); - - _$CreateEnrollmentInfo._( - {required this.userId, - required this.type, - required this.role, - required this.enrollmentState, - this.associatedUserId}) - : super._() { - BuiltValueNullFieldError.checkNotNull( - userId, r'CreateEnrollmentInfo', 'userId'); - BuiltValueNullFieldError.checkNotNull( - type, r'CreateEnrollmentInfo', 'type'); - BuiltValueNullFieldError.checkNotNull( - role, r'CreateEnrollmentInfo', 'role'); - BuiltValueNullFieldError.checkNotNull( - enrollmentState, r'CreateEnrollmentInfo', 'enrollmentState'); - } - - @override - CreateEnrollmentInfo rebuild( - void Function(CreateEnrollmentInfoBuilder) updates) => - (toBuilder()..update(updates)).build(); - - @override - CreateEnrollmentInfoBuilder toBuilder() => - new CreateEnrollmentInfoBuilder()..replace(this); - - @override - bool operator ==(Object other) { - if (identical(other, this)) return true; - return other is CreateEnrollmentInfo && - userId == other.userId && - type == other.type && - role == other.role && - enrollmentState == other.enrollmentState && - associatedUserId == other.associatedUserId; - } - - @override - int get hashCode { - var _$hash = 0; - _$hash = $jc(_$hash, userId.hashCode); - _$hash = $jc(_$hash, type.hashCode); - _$hash = $jc(_$hash, role.hashCode); - _$hash = $jc(_$hash, enrollmentState.hashCode); - _$hash = $jc(_$hash, associatedUserId.hashCode); - _$hash = $jf(_$hash); - return _$hash; - } - - @override - String toString() { - return (newBuiltValueToStringHelper(r'CreateEnrollmentInfo') - ..add('userId', userId) - ..add('type', type) - ..add('role', role) - ..add('enrollmentState', enrollmentState) - ..add('associatedUserId', associatedUserId)) - .toString(); - } -} - -class CreateEnrollmentInfoBuilder - implements Builder { - _$CreateEnrollmentInfo? _$v; - - String? _userId; - String? get userId => _$this._userId; - set userId(String? userId) => _$this._userId = userId; - - String? _type; - String? get type => _$this._type; - set type(String? type) => _$this._type = type; - - String? _role; - String? get role => _$this._role; - set role(String? role) => _$this._role = role; - - String? _enrollmentState; - String? get enrollmentState => _$this._enrollmentState; - set enrollmentState(String? enrollmentState) => - _$this._enrollmentState = enrollmentState; - - String? _associatedUserId; - String? get associatedUserId => _$this._associatedUserId; - set associatedUserId(String? associatedUserId) => - _$this._associatedUserId = associatedUserId; - - CreateEnrollmentInfoBuilder() { - CreateEnrollmentInfo._initializeBuilder(this); - } - - CreateEnrollmentInfoBuilder get _$this { - final $v = _$v; - if ($v != null) { - _userId = $v.userId; - _type = $v.type; - _role = $v.role; - _enrollmentState = $v.enrollmentState; - _associatedUserId = $v.associatedUserId; - _$v = null; - } - return this; - } - - @override - void replace(CreateEnrollmentInfo other) { - ArgumentError.checkNotNull(other, 'other'); - _$v = other as _$CreateEnrollmentInfo; - } - - @override - void update(void Function(CreateEnrollmentInfoBuilder)? updates) { - if (updates != null) updates(this); - } - - @override - CreateEnrollmentInfo build() => _build(); - - _$CreateEnrollmentInfo _build() { - final _$result = _$v ?? - new _$CreateEnrollmentInfo._( - userId: BuiltValueNullFieldError.checkNotNull( - userId, r'CreateEnrollmentInfo', 'userId'), - type: BuiltValueNullFieldError.checkNotNull( - type, r'CreateEnrollmentInfo', 'type'), - role: BuiltValueNullFieldError.checkNotNull( - role, r'CreateEnrollmentInfo', 'role'), - enrollmentState: BuiltValueNullFieldError.checkNotNull( - enrollmentState, r'CreateEnrollmentInfo', 'enrollmentState'), - associatedUserId: associatedUserId); - replace(_$result); - return _$result; - } -} - -// ignore_for_file: deprecated_member_use_from_same_package,type=lint diff --git a/apps/flutter_parent/lib/models/dataseeding/create_enrollment_wrapper.dart b/apps/flutter_parent/lib/models/dataseeding/create_enrollment_wrapper.dart deleted file mode 100644 index 4339b3b661..0000000000 --- a/apps/flutter_parent/lib/models/dataseeding/create_enrollment_wrapper.dart +++ /dev/null @@ -1,31 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:built_value/built_value.dart'; -import 'package:built_value/serializer.dart'; -import 'package:flutter_parent/models/dataseeding/create_enrollment_info.dart'; - -part 'create_enrollment_wrapper.g.dart'; - -abstract class CreateEnrollmentWrapper implements Built { - @BuiltValueSerializer(serializeNulls: true) - static Serializer get serializer => _$createEnrollmentWrapperSerializer; - - CreateEnrollmentWrapper._(); - factory CreateEnrollmentWrapper([void Function(CreateEnrollmentWrapperBuilder) updates]) = _$CreateEnrollmentWrapper; - - CreateEnrollmentInfo get enrollment; - - static void _initializeBuilder(CreateEnrollmentWrapperBuilder b) => b; -} diff --git a/apps/flutter_parent/lib/models/dataseeding/create_enrollment_wrapper.g.dart b/apps/flutter_parent/lib/models/dataseeding/create_enrollment_wrapper.g.dart deleted file mode 100644 index 63c5691d77..0000000000 --- a/apps/flutter_parent/lib/models/dataseeding/create_enrollment_wrapper.g.dart +++ /dev/null @@ -1,162 +0,0 @@ -// GENERATED CODE - DO NOT MODIFY BY HAND - -part of 'create_enrollment_wrapper.dart'; - -// ************************************************************************** -// BuiltValueGenerator -// ************************************************************************** - -Serializer _$createEnrollmentWrapperSerializer = - new _$CreateEnrollmentWrapperSerializer(); - -class _$CreateEnrollmentWrapperSerializer - implements StructuredSerializer { - @override - final Iterable types = const [ - CreateEnrollmentWrapper, - _$CreateEnrollmentWrapper - ]; - @override - final String wireName = 'CreateEnrollmentWrapper'; - - @override - Iterable serialize( - Serializers serializers, CreateEnrollmentWrapper object, - {FullType specifiedType = FullType.unspecified}) { - final result = [ - 'enrollment', - serializers.serialize(object.enrollment, - specifiedType: const FullType(CreateEnrollmentInfo)), - ]; - - return result; - } - - @override - CreateEnrollmentWrapper deserialize( - Serializers serializers, Iterable serialized, - {FullType specifiedType = FullType.unspecified}) { - final result = new CreateEnrollmentWrapperBuilder(); - - final iterator = serialized.iterator; - while (iterator.moveNext()) { - final key = iterator.current! as String; - iterator.moveNext(); - final Object? value = iterator.current; - switch (key) { - case 'enrollment': - result.enrollment.replace(serializers.deserialize(value, - specifiedType: const FullType(CreateEnrollmentInfo))! - as CreateEnrollmentInfo); - break; - } - } - - return result.build(); - } -} - -class _$CreateEnrollmentWrapper extends CreateEnrollmentWrapper { - @override - final CreateEnrollmentInfo enrollment; - - factory _$CreateEnrollmentWrapper( - [void Function(CreateEnrollmentWrapperBuilder)? updates]) => - (new CreateEnrollmentWrapperBuilder()..update(updates))._build(); - - _$CreateEnrollmentWrapper._({required this.enrollment}) : super._() { - BuiltValueNullFieldError.checkNotNull( - enrollment, r'CreateEnrollmentWrapper', 'enrollment'); - } - - @override - CreateEnrollmentWrapper rebuild( - void Function(CreateEnrollmentWrapperBuilder) updates) => - (toBuilder()..update(updates)).build(); - - @override - CreateEnrollmentWrapperBuilder toBuilder() => - new CreateEnrollmentWrapperBuilder()..replace(this); - - @override - bool operator ==(Object other) { - if (identical(other, this)) return true; - return other is CreateEnrollmentWrapper && enrollment == other.enrollment; - } - - @override - int get hashCode { - var _$hash = 0; - _$hash = $jc(_$hash, enrollment.hashCode); - _$hash = $jf(_$hash); - return _$hash; - } - - @override - String toString() { - return (newBuiltValueToStringHelper(r'CreateEnrollmentWrapper') - ..add('enrollment', enrollment)) - .toString(); - } -} - -class CreateEnrollmentWrapperBuilder - implements - Builder { - _$CreateEnrollmentWrapper? _$v; - - CreateEnrollmentInfoBuilder? _enrollment; - CreateEnrollmentInfoBuilder get enrollment => - _$this._enrollment ??= new CreateEnrollmentInfoBuilder(); - set enrollment(CreateEnrollmentInfoBuilder? enrollment) => - _$this._enrollment = enrollment; - - CreateEnrollmentWrapperBuilder() { - CreateEnrollmentWrapper._initializeBuilder(this); - } - - CreateEnrollmentWrapperBuilder get _$this { - final $v = _$v; - if ($v != null) { - _enrollment = $v.enrollment.toBuilder(); - _$v = null; - } - return this; - } - - @override - void replace(CreateEnrollmentWrapper other) { - ArgumentError.checkNotNull(other, 'other'); - _$v = other as _$CreateEnrollmentWrapper; - } - - @override - void update(void Function(CreateEnrollmentWrapperBuilder)? updates) { - if (updates != null) updates(this); - } - - @override - CreateEnrollmentWrapper build() => _build(); - - _$CreateEnrollmentWrapper _build() { - _$CreateEnrollmentWrapper _$result; - try { - _$result = _$v ?? - new _$CreateEnrollmentWrapper._(enrollment: enrollment.build()); - } catch (_) { - late String _$failedField; - try { - _$failedField = 'enrollment'; - enrollment.build(); - } catch (e) { - throw new BuiltValueNestedFieldError( - r'CreateEnrollmentWrapper', _$failedField, e.toString()); - } - rethrow; - } - replace(_$result); - return _$result; - } -} - -// ignore_for_file: deprecated_member_use_from_same_package,type=lint diff --git a/apps/flutter_parent/lib/models/dataseeding/create_submission_info.dart b/apps/flutter_parent/lib/models/dataseeding/create_submission_info.dart deleted file mode 100644 index 74eb58138f..0000000000 --- a/apps/flutter_parent/lib/models/dataseeding/create_submission_info.dart +++ /dev/null @@ -1,45 +0,0 @@ -// Copyright (C) 2019 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -import 'package:built_value/built_value.dart'; -import 'package:built_value/serializer.dart'; - -part 'create_submission_info.g.dart'; - -abstract class CreateSubmissionInfo implements Built { - @BuiltValueSerializer(serializeNulls: true) - static Serializer get serializer => _$createSubmissionInfoSerializer; - - CreateSubmissionInfo._(); - - factory CreateSubmissionInfo([void Function(CreateSubmissionInfoBuilder) updates]) = _$CreateSubmissionInfo; - - // Shouldn't be null for submissions, can be null for grades - @BuiltValueField(wireName: "submission_type") - String? get submissionType; - - String? get body; - - String? get url; - - // TODO: Support file submissions - // TODO: Support media comments - - @BuiltValueField(wireName: "user_id") - int? get userId; - - @BuiltValueField(wireName: "submitted_at") - DateTime? get submittedAt; - - static void _initializeBuilder(CreateSubmissionInfoBuilder b) => b; -} diff --git a/apps/flutter_parent/lib/models/dataseeding/create_submission_info.g.dart b/apps/flutter_parent/lib/models/dataseeding/create_submission_info.g.dart deleted file mode 100644 index a0362d6953..0000000000 --- a/apps/flutter_parent/lib/models/dataseeding/create_submission_info.g.dart +++ /dev/null @@ -1,233 +0,0 @@ -// GENERATED CODE - DO NOT MODIFY BY HAND - -part of 'create_submission_info.dart'; - -// ************************************************************************** -// BuiltValueGenerator -// ************************************************************************** - -Serializer _$createSubmissionInfoSerializer = - new _$CreateSubmissionInfoSerializer(); - -class _$CreateSubmissionInfoSerializer - implements StructuredSerializer { - @override - final Iterable types = const [ - CreateSubmissionInfo, - _$CreateSubmissionInfo - ]; - @override - final String wireName = 'CreateSubmissionInfo'; - - @override - Iterable serialize( - Serializers serializers, CreateSubmissionInfo object, - {FullType specifiedType = FullType.unspecified}) { - final result = []; - Object? value; - value = object.submissionType; - - result - ..add('submission_type') - ..add( - serializers.serialize(value, specifiedType: const FullType(String))); - value = object.body; - - result - ..add('body') - ..add( - serializers.serialize(value, specifiedType: const FullType(String))); - value = object.url; - - result - ..add('url') - ..add( - serializers.serialize(value, specifiedType: const FullType(String))); - value = object.userId; - - result - ..add('user_id') - ..add(serializers.serialize(value, specifiedType: const FullType(int))); - value = object.submittedAt; - - result - ..add('submitted_at') - ..add(serializers.serialize(value, - specifiedType: const FullType(DateTime))); - - return result; - } - - @override - CreateSubmissionInfo deserialize( - Serializers serializers, Iterable serialized, - {FullType specifiedType = FullType.unspecified}) { - final result = new CreateSubmissionInfoBuilder(); - - final iterator = serialized.iterator; - while (iterator.moveNext()) { - final key = iterator.current! as String; - iterator.moveNext(); - final Object? value = iterator.current; - switch (key) { - case 'submission_type': - result.submissionType = serializers.deserialize(value, - specifiedType: const FullType(String)) as String?; - break; - case 'body': - result.body = serializers.deserialize(value, - specifiedType: const FullType(String)) as String?; - break; - case 'url': - result.url = serializers.deserialize(value, - specifiedType: const FullType(String)) as String?; - break; - case 'user_id': - result.userId = serializers.deserialize(value, - specifiedType: const FullType(int)) as int?; - break; - case 'submitted_at': - result.submittedAt = serializers.deserialize(value, - specifiedType: const FullType(DateTime)) as DateTime?; - break; - } - } - - return result.build(); - } -} - -class _$CreateSubmissionInfo extends CreateSubmissionInfo { - @override - final String? submissionType; - @override - final String? body; - @override - final String? url; - @override - final int? userId; - @override - final DateTime? submittedAt; - - factory _$CreateSubmissionInfo( - [void Function(CreateSubmissionInfoBuilder)? updates]) => - (new CreateSubmissionInfoBuilder()..update(updates))._build(); - - _$CreateSubmissionInfo._( - {this.submissionType, this.body, this.url, this.userId, this.submittedAt}) - : super._(); - - @override - CreateSubmissionInfo rebuild( - void Function(CreateSubmissionInfoBuilder) updates) => - (toBuilder()..update(updates)).build(); - - @override - CreateSubmissionInfoBuilder toBuilder() => - new CreateSubmissionInfoBuilder()..replace(this); - - @override - bool operator ==(Object other) { - if (identical(other, this)) return true; - return other is CreateSubmissionInfo && - submissionType == other.submissionType && - body == other.body && - url == other.url && - userId == other.userId && - submittedAt == other.submittedAt; - } - - @override - int get hashCode { - var _$hash = 0; - _$hash = $jc(_$hash, submissionType.hashCode); - _$hash = $jc(_$hash, body.hashCode); - _$hash = $jc(_$hash, url.hashCode); - _$hash = $jc(_$hash, userId.hashCode); - _$hash = $jc(_$hash, submittedAt.hashCode); - _$hash = $jf(_$hash); - return _$hash; - } - - @override - String toString() { - return (newBuiltValueToStringHelper(r'CreateSubmissionInfo') - ..add('submissionType', submissionType) - ..add('body', body) - ..add('url', url) - ..add('userId', userId) - ..add('submittedAt', submittedAt)) - .toString(); - } -} - -class CreateSubmissionInfoBuilder - implements Builder { - _$CreateSubmissionInfo? _$v; - - String? _submissionType; - String? get submissionType => _$this._submissionType; - set submissionType(String? submissionType) => - _$this._submissionType = submissionType; - - String? _body; - String? get body => _$this._body; - set body(String? body) => _$this._body = body; - - String? _url; - String? get url => _$this._url; - set url(String? url) => _$this._url = url; - - int? _userId; - int? get userId => _$this._userId; - set userId(int? userId) => _$this._userId = userId; - - DateTime? _submittedAt; - DateTime? get submittedAt => _$this._submittedAt; - set submittedAt(DateTime? submittedAt) => _$this._submittedAt = submittedAt; - - CreateSubmissionInfoBuilder() { - CreateSubmissionInfo._initializeBuilder(this); - } - - CreateSubmissionInfoBuilder get _$this { - final $v = _$v; - if ($v != null) { - _submissionType = $v.submissionType; - _body = $v.body; - _url = $v.url; - _userId = $v.userId; - _submittedAt = $v.submittedAt; - _$v = null; - } - return this; - } - - @override - void replace(CreateSubmissionInfo other) { - ArgumentError.checkNotNull(other, 'other'); - _$v = other as _$CreateSubmissionInfo; - } - - @override - void update(void Function(CreateSubmissionInfoBuilder)? updates) { - if (updates != null) updates(this); - } - - @override - CreateSubmissionInfo build() => _build(); - - _$CreateSubmissionInfo _build() { - final _$result = _$v ?? - new _$CreateSubmissionInfo._( - submissionType: submissionType, - body: body, - url: url, - userId: userId, - submittedAt: submittedAt); - replace(_$result); - return _$result; - } -} - -// ignore_for_file: deprecated_member_use_from_same_package,type=lint diff --git a/apps/flutter_parent/lib/models/dataseeding/create_submission_wrapper.dart b/apps/flutter_parent/lib/models/dataseeding/create_submission_wrapper.dart deleted file mode 100644 index 4f06ecce77..0000000000 --- a/apps/flutter_parent/lib/models/dataseeding/create_submission_wrapper.dart +++ /dev/null @@ -1,32 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -import 'package:built_value/built_value.dart'; -import 'package:built_value/serializer.dart'; - -import 'create_submission_info.dart'; - -part 'create_submission_wrapper.g.dart'; - -abstract class CreateSubmissionWrapper implements Built { - @BuiltValueSerializer(serializeNulls: true) - static Serializer get serializer => _$createSubmissionWrapperSerializer; - - CreateSubmissionWrapper._(); - - factory CreateSubmissionWrapper([void Function(CreateSubmissionWrapperBuilder) updates]) = _$CreateSubmissionWrapper; - - CreateSubmissionInfo get submission; - - static void _initializeBuilder(CreateSubmissionWrapperBuilder b) => b; -} diff --git a/apps/flutter_parent/lib/models/dataseeding/create_submission_wrapper.g.dart b/apps/flutter_parent/lib/models/dataseeding/create_submission_wrapper.g.dart deleted file mode 100644 index 5735ee2af6..0000000000 --- a/apps/flutter_parent/lib/models/dataseeding/create_submission_wrapper.g.dart +++ /dev/null @@ -1,162 +0,0 @@ -// GENERATED CODE - DO NOT MODIFY BY HAND - -part of 'create_submission_wrapper.dart'; - -// ************************************************************************** -// BuiltValueGenerator -// ************************************************************************** - -Serializer _$createSubmissionWrapperSerializer = - new _$CreateSubmissionWrapperSerializer(); - -class _$CreateSubmissionWrapperSerializer - implements StructuredSerializer { - @override - final Iterable types = const [ - CreateSubmissionWrapper, - _$CreateSubmissionWrapper - ]; - @override - final String wireName = 'CreateSubmissionWrapper'; - - @override - Iterable serialize( - Serializers serializers, CreateSubmissionWrapper object, - {FullType specifiedType = FullType.unspecified}) { - final result = [ - 'submission', - serializers.serialize(object.submission, - specifiedType: const FullType(CreateSubmissionInfo)), - ]; - - return result; - } - - @override - CreateSubmissionWrapper deserialize( - Serializers serializers, Iterable serialized, - {FullType specifiedType = FullType.unspecified}) { - final result = new CreateSubmissionWrapperBuilder(); - - final iterator = serialized.iterator; - while (iterator.moveNext()) { - final key = iterator.current! as String; - iterator.moveNext(); - final Object? value = iterator.current; - switch (key) { - case 'submission': - result.submission.replace(serializers.deserialize(value, - specifiedType: const FullType(CreateSubmissionInfo))! - as CreateSubmissionInfo); - break; - } - } - - return result.build(); - } -} - -class _$CreateSubmissionWrapper extends CreateSubmissionWrapper { - @override - final CreateSubmissionInfo submission; - - factory _$CreateSubmissionWrapper( - [void Function(CreateSubmissionWrapperBuilder)? updates]) => - (new CreateSubmissionWrapperBuilder()..update(updates))._build(); - - _$CreateSubmissionWrapper._({required this.submission}) : super._() { - BuiltValueNullFieldError.checkNotNull( - submission, r'CreateSubmissionWrapper', 'submission'); - } - - @override - CreateSubmissionWrapper rebuild( - void Function(CreateSubmissionWrapperBuilder) updates) => - (toBuilder()..update(updates)).build(); - - @override - CreateSubmissionWrapperBuilder toBuilder() => - new CreateSubmissionWrapperBuilder()..replace(this); - - @override - bool operator ==(Object other) { - if (identical(other, this)) return true; - return other is CreateSubmissionWrapper && submission == other.submission; - } - - @override - int get hashCode { - var _$hash = 0; - _$hash = $jc(_$hash, submission.hashCode); - _$hash = $jf(_$hash); - return _$hash; - } - - @override - String toString() { - return (newBuiltValueToStringHelper(r'CreateSubmissionWrapper') - ..add('submission', submission)) - .toString(); - } -} - -class CreateSubmissionWrapperBuilder - implements - Builder { - _$CreateSubmissionWrapper? _$v; - - CreateSubmissionInfoBuilder? _submission; - CreateSubmissionInfoBuilder get submission => - _$this._submission ??= new CreateSubmissionInfoBuilder(); - set submission(CreateSubmissionInfoBuilder? submission) => - _$this._submission = submission; - - CreateSubmissionWrapperBuilder() { - CreateSubmissionWrapper._initializeBuilder(this); - } - - CreateSubmissionWrapperBuilder get _$this { - final $v = _$v; - if ($v != null) { - _submission = $v.submission.toBuilder(); - _$v = null; - } - return this; - } - - @override - void replace(CreateSubmissionWrapper other) { - ArgumentError.checkNotNull(other, 'other'); - _$v = other as _$CreateSubmissionWrapper; - } - - @override - void update(void Function(CreateSubmissionWrapperBuilder)? updates) { - if (updates != null) updates(this); - } - - @override - CreateSubmissionWrapper build() => _build(); - - _$CreateSubmissionWrapper _build() { - _$CreateSubmissionWrapper _$result; - try { - _$result = _$v ?? - new _$CreateSubmissionWrapper._(submission: submission.build()); - } catch (_) { - late String _$failedField; - try { - _$failedField = 'submission'; - submission.build(); - } catch (e) { - throw new BuiltValueNestedFieldError( - r'CreateSubmissionWrapper', _$failedField, e.toString()); - } - rethrow; - } - replace(_$result); - return _$result; - } -} - -// ignore_for_file: deprecated_member_use_from_same_package,type=lint diff --git a/apps/flutter_parent/lib/models/dataseeding/create_user_info.dart b/apps/flutter_parent/lib/models/dataseeding/create_user_info.dart deleted file mode 100644 index 735bb4203b..0000000000 --- a/apps/flutter_parent/lib/models/dataseeding/create_user_info.dart +++ /dev/null @@ -1,36 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:built_value/built_value.dart'; -import 'package:built_value/serializer.dart'; -import 'package:flutter_parent/models/dataseeding/communication_channel.dart'; -import 'package:flutter_parent/models/dataseeding/pseudonym.dart'; -import 'package:flutter_parent/models/dataseeding/user_name_data.dart'; - -part 'create_user_info.g.dart'; - -abstract class CreateUserInfo implements Built { - @BuiltValueSerializer(serializeNulls: true) - static Serializer get serializer => _$createUserInfoSerializer; - - CreateUserInfo._(); - factory CreateUserInfo([void Function(CreateUserInfoBuilder) updates]) = _$CreateUserInfo; - - UserNameData get user; - Pseudonym get pseudonym; - @BuiltValueField(wireName: "communication_channel") - CommunicationChannel get communicationChannel; - - static void _initializeBuilder(CreateUserInfoBuilder b) => b; -} diff --git a/apps/flutter_parent/lib/models/dataseeding/create_user_info.g.dart b/apps/flutter_parent/lib/models/dataseeding/create_user_info.g.dart deleted file mode 100644 index 758a8fed59..0000000000 --- a/apps/flutter_parent/lib/models/dataseeding/create_user_info.g.dart +++ /dev/null @@ -1,205 +0,0 @@ -// GENERATED CODE - DO NOT MODIFY BY HAND - -part of 'create_user_info.dart'; - -// ************************************************************************** -// BuiltValueGenerator -// ************************************************************************** - -Serializer _$createUserInfoSerializer = - new _$CreateUserInfoSerializer(); - -class _$CreateUserInfoSerializer - implements StructuredSerializer { - @override - final Iterable types = const [CreateUserInfo, _$CreateUserInfo]; - @override - final String wireName = 'CreateUserInfo'; - - @override - Iterable serialize(Serializers serializers, CreateUserInfo object, - {FullType specifiedType = FullType.unspecified}) { - final result = [ - 'user', - serializers.serialize(object.user, - specifiedType: const FullType(UserNameData)), - 'pseudonym', - serializers.serialize(object.pseudonym, - specifiedType: const FullType(Pseudonym)), - 'communication_channel', - serializers.serialize(object.communicationChannel, - specifiedType: const FullType(CommunicationChannel)), - ]; - - return result; - } - - @override - CreateUserInfo deserialize( - Serializers serializers, Iterable serialized, - {FullType specifiedType = FullType.unspecified}) { - final result = new CreateUserInfoBuilder(); - - final iterator = serialized.iterator; - while (iterator.moveNext()) { - final key = iterator.current! as String; - iterator.moveNext(); - final Object? value = iterator.current; - switch (key) { - case 'user': - result.user.replace(serializers.deserialize(value, - specifiedType: const FullType(UserNameData))! as UserNameData); - break; - case 'pseudonym': - result.pseudonym.replace(serializers.deserialize(value, - specifiedType: const FullType(Pseudonym))! as Pseudonym); - break; - case 'communication_channel': - result.communicationChannel.replace(serializers.deserialize(value, - specifiedType: const FullType(CommunicationChannel))! - as CommunicationChannel); - break; - } - } - - return result.build(); - } -} - -class _$CreateUserInfo extends CreateUserInfo { - @override - final UserNameData user; - @override - final Pseudonym pseudonym; - @override - final CommunicationChannel communicationChannel; - - factory _$CreateUserInfo([void Function(CreateUserInfoBuilder)? updates]) => - (new CreateUserInfoBuilder()..update(updates))._build(); - - _$CreateUserInfo._( - {required this.user, - required this.pseudonym, - required this.communicationChannel}) - : super._() { - BuiltValueNullFieldError.checkNotNull(user, r'CreateUserInfo', 'user'); - BuiltValueNullFieldError.checkNotNull( - pseudonym, r'CreateUserInfo', 'pseudonym'); - BuiltValueNullFieldError.checkNotNull( - communicationChannel, r'CreateUserInfo', 'communicationChannel'); - } - - @override - CreateUserInfo rebuild(void Function(CreateUserInfoBuilder) updates) => - (toBuilder()..update(updates)).build(); - - @override - CreateUserInfoBuilder toBuilder() => - new CreateUserInfoBuilder()..replace(this); - - @override - bool operator ==(Object other) { - if (identical(other, this)) return true; - return other is CreateUserInfo && - user == other.user && - pseudonym == other.pseudonym && - communicationChannel == other.communicationChannel; - } - - @override - int get hashCode { - var _$hash = 0; - _$hash = $jc(_$hash, user.hashCode); - _$hash = $jc(_$hash, pseudonym.hashCode); - _$hash = $jc(_$hash, communicationChannel.hashCode); - _$hash = $jf(_$hash); - return _$hash; - } - - @override - String toString() { - return (newBuiltValueToStringHelper(r'CreateUserInfo') - ..add('user', user) - ..add('pseudonym', pseudonym) - ..add('communicationChannel', communicationChannel)) - .toString(); - } -} - -class CreateUserInfoBuilder - implements Builder { - _$CreateUserInfo? _$v; - - UserNameDataBuilder? _user; - UserNameDataBuilder get user => _$this._user ??= new UserNameDataBuilder(); - set user(UserNameDataBuilder? user) => _$this._user = user; - - PseudonymBuilder? _pseudonym; - PseudonymBuilder get pseudonym => - _$this._pseudonym ??= new PseudonymBuilder(); - set pseudonym(PseudonymBuilder? pseudonym) => _$this._pseudonym = pseudonym; - - CommunicationChannelBuilder? _communicationChannel; - CommunicationChannelBuilder get communicationChannel => - _$this._communicationChannel ??= new CommunicationChannelBuilder(); - set communicationChannel(CommunicationChannelBuilder? communicationChannel) => - _$this._communicationChannel = communicationChannel; - - CreateUserInfoBuilder() { - CreateUserInfo._initializeBuilder(this); - } - - CreateUserInfoBuilder get _$this { - final $v = _$v; - if ($v != null) { - _user = $v.user.toBuilder(); - _pseudonym = $v.pseudonym.toBuilder(); - _communicationChannel = $v.communicationChannel.toBuilder(); - _$v = null; - } - return this; - } - - @override - void replace(CreateUserInfo other) { - ArgumentError.checkNotNull(other, 'other'); - _$v = other as _$CreateUserInfo; - } - - @override - void update(void Function(CreateUserInfoBuilder)? updates) { - if (updates != null) updates(this); - } - - @override - CreateUserInfo build() => _build(); - - _$CreateUserInfo _build() { - _$CreateUserInfo _$result; - try { - _$result = _$v ?? - new _$CreateUserInfo._( - user: user.build(), - pseudonym: pseudonym.build(), - communicationChannel: communicationChannel.build()); - } catch (_) { - late String _$failedField; - try { - _$failedField = 'user'; - user.build(); - _$failedField = 'pseudonym'; - pseudonym.build(); - _$failedField = 'communicationChannel'; - communicationChannel.build(); - } catch (e) { - throw new BuiltValueNestedFieldError( - r'CreateUserInfo', _$failedField, e.toString()); - } - rethrow; - } - replace(_$result); - return _$result; - } -} - -// ignore_for_file: deprecated_member_use_from_same_package,type=lint diff --git a/apps/flutter_parent/lib/models/dataseeding/grade_submission_info.dart b/apps/flutter_parent/lib/models/dataseeding/grade_submission_info.dart deleted file mode 100644 index 4c4cba2965..0000000000 --- a/apps/flutter_parent/lib/models/dataseeding/grade_submission_info.dart +++ /dev/null @@ -1,33 +0,0 @@ -// Copyright (C) 2019 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -import 'package:built_value/built_value.dart'; -import 'package:built_value/serializer.dart'; - -part 'grade_submission_info.g.dart'; - -abstract class GradeSubmissionInfo implements Built { - @BuiltValueSerializer(serializeNulls: true) - static Serializer get serializer => _$gradeSubmissionInfoSerializer; - - GradeSubmissionInfo._(); - - factory GradeSubmissionInfo([void Function(GradeSubmissionInfoBuilder) updates]) = _$GradeSubmissionInfo; - - @BuiltValueField(wireName: "posted_grade") - String get postedGrade; - - bool? get excuse; - - static void _initializeBuilder(GradeSubmissionInfoBuilder b) => b; -} diff --git a/apps/flutter_parent/lib/models/dataseeding/grade_submission_info.g.dart b/apps/flutter_parent/lib/models/dataseeding/grade_submission_info.g.dart deleted file mode 100644 index 0fd309db3f..0000000000 --- a/apps/flutter_parent/lib/models/dataseeding/grade_submission_info.g.dart +++ /dev/null @@ -1,170 +0,0 @@ -// GENERATED CODE - DO NOT MODIFY BY HAND - -part of 'grade_submission_info.dart'; - -// ************************************************************************** -// BuiltValueGenerator -// ************************************************************************** - -Serializer _$gradeSubmissionInfoSerializer = - new _$GradeSubmissionInfoSerializer(); - -class _$GradeSubmissionInfoSerializer - implements StructuredSerializer { - @override - final Iterable types = const [ - GradeSubmissionInfo, - _$GradeSubmissionInfo - ]; - @override - final String wireName = 'GradeSubmissionInfo'; - - @override - Iterable serialize( - Serializers serializers, GradeSubmissionInfo object, - {FullType specifiedType = FullType.unspecified}) { - final result = [ - 'posted_grade', - serializers.serialize(object.postedGrade, - specifiedType: const FullType(String)), - ]; - Object? value; - value = object.excuse; - - result - ..add('excuse') - ..add(serializers.serialize(value, specifiedType: const FullType(bool))); - - return result; - } - - @override - GradeSubmissionInfo deserialize( - Serializers serializers, Iterable serialized, - {FullType specifiedType = FullType.unspecified}) { - final result = new GradeSubmissionInfoBuilder(); - - final iterator = serialized.iterator; - while (iterator.moveNext()) { - final key = iterator.current! as String; - iterator.moveNext(); - final Object? value = iterator.current; - switch (key) { - case 'posted_grade': - result.postedGrade = serializers.deserialize(value, - specifiedType: const FullType(String))! as String; - break; - case 'excuse': - result.excuse = serializers.deserialize(value, - specifiedType: const FullType(bool)) as bool?; - break; - } - } - - return result.build(); - } -} - -class _$GradeSubmissionInfo extends GradeSubmissionInfo { - @override - final String postedGrade; - @override - final bool? excuse; - - factory _$GradeSubmissionInfo( - [void Function(GradeSubmissionInfoBuilder)? updates]) => - (new GradeSubmissionInfoBuilder()..update(updates))._build(); - - _$GradeSubmissionInfo._({required this.postedGrade, this.excuse}) - : super._() { - BuiltValueNullFieldError.checkNotNull( - postedGrade, r'GradeSubmissionInfo', 'postedGrade'); - } - - @override - GradeSubmissionInfo rebuild( - void Function(GradeSubmissionInfoBuilder) updates) => - (toBuilder()..update(updates)).build(); - - @override - GradeSubmissionInfoBuilder toBuilder() => - new GradeSubmissionInfoBuilder()..replace(this); - - @override - bool operator ==(Object other) { - if (identical(other, this)) return true; - return other is GradeSubmissionInfo && - postedGrade == other.postedGrade && - excuse == other.excuse; - } - - @override - int get hashCode { - var _$hash = 0; - _$hash = $jc(_$hash, postedGrade.hashCode); - _$hash = $jc(_$hash, excuse.hashCode); - _$hash = $jf(_$hash); - return _$hash; - } - - @override - String toString() { - return (newBuiltValueToStringHelper(r'GradeSubmissionInfo') - ..add('postedGrade', postedGrade) - ..add('excuse', excuse)) - .toString(); - } -} - -class GradeSubmissionInfoBuilder - implements Builder { - _$GradeSubmissionInfo? _$v; - - String? _postedGrade; - String? get postedGrade => _$this._postedGrade; - set postedGrade(String? postedGrade) => _$this._postedGrade = postedGrade; - - bool? _excuse; - bool? get excuse => _$this._excuse; - set excuse(bool? excuse) => _$this._excuse = excuse; - - GradeSubmissionInfoBuilder() { - GradeSubmissionInfo._initializeBuilder(this); - } - - GradeSubmissionInfoBuilder get _$this { - final $v = _$v; - if ($v != null) { - _postedGrade = $v.postedGrade; - _excuse = $v.excuse; - _$v = null; - } - return this; - } - - @override - void replace(GradeSubmissionInfo other) { - ArgumentError.checkNotNull(other, 'other'); - _$v = other as _$GradeSubmissionInfo; - } - - @override - void update(void Function(GradeSubmissionInfoBuilder)? updates) { - if (updates != null) updates(this); - } - - @override - GradeSubmissionInfo build() => _build(); - - _$GradeSubmissionInfo _build() { - final _$result = _$v ?? - new _$GradeSubmissionInfo._( - postedGrade: BuiltValueNullFieldError.checkNotNull( - postedGrade, r'GradeSubmissionInfo', 'postedGrade'), - excuse: excuse); - replace(_$result); - return _$result; - } -} - -// ignore_for_file: deprecated_member_use_from_same_package,type=lint diff --git a/apps/flutter_parent/lib/models/dataseeding/grade_submission_wrapper.dart b/apps/flutter_parent/lib/models/dataseeding/grade_submission_wrapper.dart deleted file mode 100644 index 75c313d55e..0000000000 --- a/apps/flutter_parent/lib/models/dataseeding/grade_submission_wrapper.dart +++ /dev/null @@ -1,32 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -import 'package:built_value/built_value.dart'; -import 'package:built_value/serializer.dart'; - -import 'grade_submission_info.dart'; - -part 'grade_submission_wrapper.g.dart'; - -abstract class GradeSubmissionWrapper implements Built { - @BuiltValueSerializer(serializeNulls: true) - static Serializer get serializer => _$gradeSubmissionWrapperSerializer; - - GradeSubmissionWrapper._(); - - factory GradeSubmissionWrapper([void Function(GradeSubmissionWrapperBuilder) updates]) = _$GradeSubmissionWrapper; - - GradeSubmissionInfo get submission; - - static void _initializeBuilder(GradeSubmissionWrapperBuilder b) => b; -} diff --git a/apps/flutter_parent/lib/models/dataseeding/grade_submission_wrapper.g.dart b/apps/flutter_parent/lib/models/dataseeding/grade_submission_wrapper.g.dart deleted file mode 100644 index 00093e37de..0000000000 --- a/apps/flutter_parent/lib/models/dataseeding/grade_submission_wrapper.g.dart +++ /dev/null @@ -1,161 +0,0 @@ -// GENERATED CODE - DO NOT MODIFY BY HAND - -part of 'grade_submission_wrapper.dart'; - -// ************************************************************************** -// BuiltValueGenerator -// ************************************************************************** - -Serializer _$gradeSubmissionWrapperSerializer = - new _$GradeSubmissionWrapperSerializer(); - -class _$GradeSubmissionWrapperSerializer - implements StructuredSerializer { - @override - final Iterable types = const [ - GradeSubmissionWrapper, - _$GradeSubmissionWrapper - ]; - @override - final String wireName = 'GradeSubmissionWrapper'; - - @override - Iterable serialize( - Serializers serializers, GradeSubmissionWrapper object, - {FullType specifiedType = FullType.unspecified}) { - final result = [ - 'submission', - serializers.serialize(object.submission, - specifiedType: const FullType(GradeSubmissionInfo)), - ]; - - return result; - } - - @override - GradeSubmissionWrapper deserialize( - Serializers serializers, Iterable serialized, - {FullType specifiedType = FullType.unspecified}) { - final result = new GradeSubmissionWrapperBuilder(); - - final iterator = serialized.iterator; - while (iterator.moveNext()) { - final key = iterator.current! as String; - iterator.moveNext(); - final Object? value = iterator.current; - switch (key) { - case 'submission': - result.submission.replace(serializers.deserialize(value, - specifiedType: const FullType(GradeSubmissionInfo))! - as GradeSubmissionInfo); - break; - } - } - - return result.build(); - } -} - -class _$GradeSubmissionWrapper extends GradeSubmissionWrapper { - @override - final GradeSubmissionInfo submission; - - factory _$GradeSubmissionWrapper( - [void Function(GradeSubmissionWrapperBuilder)? updates]) => - (new GradeSubmissionWrapperBuilder()..update(updates))._build(); - - _$GradeSubmissionWrapper._({required this.submission}) : super._() { - BuiltValueNullFieldError.checkNotNull( - submission, r'GradeSubmissionWrapper', 'submission'); - } - - @override - GradeSubmissionWrapper rebuild( - void Function(GradeSubmissionWrapperBuilder) updates) => - (toBuilder()..update(updates)).build(); - - @override - GradeSubmissionWrapperBuilder toBuilder() => - new GradeSubmissionWrapperBuilder()..replace(this); - - @override - bool operator ==(Object other) { - if (identical(other, this)) return true; - return other is GradeSubmissionWrapper && submission == other.submission; - } - - @override - int get hashCode { - var _$hash = 0; - _$hash = $jc(_$hash, submission.hashCode); - _$hash = $jf(_$hash); - return _$hash; - } - - @override - String toString() { - return (newBuiltValueToStringHelper(r'GradeSubmissionWrapper') - ..add('submission', submission)) - .toString(); - } -} - -class GradeSubmissionWrapperBuilder - implements Builder { - _$GradeSubmissionWrapper? _$v; - - GradeSubmissionInfoBuilder? _submission; - GradeSubmissionInfoBuilder get submission => - _$this._submission ??= new GradeSubmissionInfoBuilder(); - set submission(GradeSubmissionInfoBuilder? submission) => - _$this._submission = submission; - - GradeSubmissionWrapperBuilder() { - GradeSubmissionWrapper._initializeBuilder(this); - } - - GradeSubmissionWrapperBuilder get _$this { - final $v = _$v; - if ($v != null) { - _submission = $v.submission.toBuilder(); - _$v = null; - } - return this; - } - - @override - void replace(GradeSubmissionWrapper other) { - ArgumentError.checkNotNull(other, 'other'); - _$v = other as _$GradeSubmissionWrapper; - } - - @override - void update(void Function(GradeSubmissionWrapperBuilder)? updates) { - if (updates != null) updates(this); - } - - @override - GradeSubmissionWrapper build() => _build(); - - _$GradeSubmissionWrapper _build() { - _$GradeSubmissionWrapper _$result; - try { - _$result = - _$v ?? new _$GradeSubmissionWrapper._(submission: submission.build()); - } catch (_) { - late String _$failedField; - try { - _$failedField = 'submission'; - submission.build(); - } catch (e) { - throw new BuiltValueNestedFieldError( - r'GradeSubmissionWrapper', _$failedField, e.toString()); - } - rethrow; - } - replace(_$result); - return _$result; - } -} - -// ignore_for_file: deprecated_member_use_from_same_package,type=lint diff --git a/apps/flutter_parent/lib/models/dataseeding/oauth_token.dart b/apps/flutter_parent/lib/models/dataseeding/oauth_token.dart deleted file mode 100644 index 18471ddb7b..0000000000 --- a/apps/flutter_parent/lib/models/dataseeding/oauth_token.dart +++ /dev/null @@ -1,31 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:built_value/built_value.dart'; -import 'package:built_value/serializer.dart'; - -part 'oauth_token.g.dart'; - -abstract class OAuthToken implements Built { - @BuiltValueSerializer(serializeNulls: true) - static Serializer get serializer => _$oAuthTokenSerializer; - - OAuthToken._(); - factory OAuthToken([void Function(OAuthTokenBuilder) updates]) = _$OAuthToken; - - @BuiltValueField(wireName: "access_token") - String get accessToken; - - static void _initializeBuilder(OAuthTokenBuilder b) => b..accessToken = ''; -} diff --git a/apps/flutter_parent/lib/models/dataseeding/oauth_token.g.dart b/apps/flutter_parent/lib/models/dataseeding/oauth_token.g.dart deleted file mode 100644 index b72dd51fd4..0000000000 --- a/apps/flutter_parent/lib/models/dataseeding/oauth_token.g.dart +++ /dev/null @@ -1,136 +0,0 @@ -// GENERATED CODE - DO NOT MODIFY BY HAND - -part of 'oauth_token.dart'; - -// ************************************************************************** -// BuiltValueGenerator -// ************************************************************************** - -Serializer _$oAuthTokenSerializer = new _$OAuthTokenSerializer(); - -class _$OAuthTokenSerializer implements StructuredSerializer { - @override - final Iterable types = const [OAuthToken, _$OAuthToken]; - @override - final String wireName = 'OAuthToken'; - - @override - Iterable serialize(Serializers serializers, OAuthToken object, - {FullType specifiedType = FullType.unspecified}) { - final result = [ - 'access_token', - serializers.serialize(object.accessToken, - specifiedType: const FullType(String)), - ]; - - return result; - } - - @override - OAuthToken deserialize(Serializers serializers, Iterable serialized, - {FullType specifiedType = FullType.unspecified}) { - final result = new OAuthTokenBuilder(); - - final iterator = serialized.iterator; - while (iterator.moveNext()) { - final key = iterator.current! as String; - iterator.moveNext(); - final Object? value = iterator.current; - switch (key) { - case 'access_token': - result.accessToken = serializers.deserialize(value, - specifiedType: const FullType(String))! as String; - break; - } - } - - return result.build(); - } -} - -class _$OAuthToken extends OAuthToken { - @override - final String accessToken; - - factory _$OAuthToken([void Function(OAuthTokenBuilder)? updates]) => - (new OAuthTokenBuilder()..update(updates))._build(); - - _$OAuthToken._({required this.accessToken}) : super._() { - BuiltValueNullFieldError.checkNotNull( - accessToken, r'OAuthToken', 'accessToken'); - } - - @override - OAuthToken rebuild(void Function(OAuthTokenBuilder) updates) => - (toBuilder()..update(updates)).build(); - - @override - OAuthTokenBuilder toBuilder() => new OAuthTokenBuilder()..replace(this); - - @override - bool operator ==(Object other) { - if (identical(other, this)) return true; - return other is OAuthToken && accessToken == other.accessToken; - } - - @override - int get hashCode { - var _$hash = 0; - _$hash = $jc(_$hash, accessToken.hashCode); - _$hash = $jf(_$hash); - return _$hash; - } - - @override - String toString() { - return (newBuiltValueToStringHelper(r'OAuthToken') - ..add('accessToken', accessToken)) - .toString(); - } -} - -class OAuthTokenBuilder implements Builder { - _$OAuthToken? _$v; - - String? _accessToken; - String? get accessToken => _$this._accessToken; - set accessToken(String? accessToken) => _$this._accessToken = accessToken; - - OAuthTokenBuilder() { - OAuthToken._initializeBuilder(this); - } - - OAuthTokenBuilder get _$this { - final $v = _$v; - if ($v != null) { - _accessToken = $v.accessToken; - _$v = null; - } - return this; - } - - @override - void replace(OAuthToken other) { - ArgumentError.checkNotNull(other, 'other'); - _$v = other as _$OAuthToken; - } - - @override - void update(void Function(OAuthTokenBuilder)? updates) { - if (updates != null) updates(this); - } - - @override - OAuthToken build() => _build(); - - _$OAuthToken _build() { - final _$result = _$v ?? - new _$OAuthToken._( - accessToken: BuiltValueNullFieldError.checkNotNull( - accessToken, r'OAuthToken', 'accessToken')); - replace(_$result); - return _$result; - } -} - -// ignore_for_file: deprecated_member_use_from_same_package,type=lint diff --git a/apps/flutter_parent/lib/models/dataseeding/pairing_code.dart b/apps/flutter_parent/lib/models/dataseeding/pairing_code.dart deleted file mode 100644 index 38bd955245..0000000000 --- a/apps/flutter_parent/lib/models/dataseeding/pairing_code.dart +++ /dev/null @@ -1,39 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:built_value/built_value.dart'; -import 'package:built_value/serializer.dart'; - -part 'pairing_code.g.dart'; - -abstract class PairingCode implements Built { - @BuiltValueSerializer(serializeNulls: true) - static Serializer get serializer => _$pairingCodeSerializer; - - PairingCode._(); - factory PairingCode([void Function(PairingCodeBuilder) updates]) = _$PairingCode; - - @BuiltValueField(wireName: "user_id") - String get userId; - - String get code; - - @BuiltValueField(wireName: "expires_at") - String get expiresAt; - - @BuiltValueField(wireName: "workflow_state") - String get workflowState; - - static void _initializeBuilder(PairingCodeBuilder b) => b; -} diff --git a/apps/flutter_parent/lib/models/dataseeding/pairing_code.g.dart b/apps/flutter_parent/lib/models/dataseeding/pairing_code.g.dart deleted file mode 100644 index fa881716d6..0000000000 --- a/apps/flutter_parent/lib/models/dataseeding/pairing_code.g.dart +++ /dev/null @@ -1,203 +0,0 @@ -// GENERATED CODE - DO NOT MODIFY BY HAND - -part of 'pairing_code.dart'; - -// ************************************************************************** -// BuiltValueGenerator -// ************************************************************************** - -Serializer _$pairingCodeSerializer = new _$PairingCodeSerializer(); - -class _$PairingCodeSerializer implements StructuredSerializer { - @override - final Iterable types = const [PairingCode, _$PairingCode]; - @override - final String wireName = 'PairingCode'; - - @override - Iterable serialize(Serializers serializers, PairingCode object, - {FullType specifiedType = FullType.unspecified}) { - final result = [ - 'user_id', - serializers.serialize(object.userId, - specifiedType: const FullType(String)), - 'code', - serializers.serialize(object.code, specifiedType: const FullType(String)), - 'expires_at', - serializers.serialize(object.expiresAt, - specifiedType: const FullType(String)), - 'workflow_state', - serializers.serialize(object.workflowState, - specifiedType: const FullType(String)), - ]; - - return result; - } - - @override - PairingCode deserialize(Serializers serializers, Iterable serialized, - {FullType specifiedType = FullType.unspecified}) { - final result = new PairingCodeBuilder(); - - final iterator = serialized.iterator; - while (iterator.moveNext()) { - final key = iterator.current! as String; - iterator.moveNext(); - final Object? value = iterator.current; - switch (key) { - case 'user_id': - result.userId = serializers.deserialize(value, - specifiedType: const FullType(String))! as String; - break; - case 'code': - result.code = serializers.deserialize(value, - specifiedType: const FullType(String))! as String; - break; - case 'expires_at': - result.expiresAt = serializers.deserialize(value, - specifiedType: const FullType(String))! as String; - break; - case 'workflow_state': - result.workflowState = serializers.deserialize(value, - specifiedType: const FullType(String))! as String; - break; - } - } - - return result.build(); - } -} - -class _$PairingCode extends PairingCode { - @override - final String userId; - @override - final String code; - @override - final String expiresAt; - @override - final String workflowState; - - factory _$PairingCode([void Function(PairingCodeBuilder)? updates]) => - (new PairingCodeBuilder()..update(updates))._build(); - - _$PairingCode._( - {required this.userId, - required this.code, - required this.expiresAt, - required this.workflowState}) - : super._() { - BuiltValueNullFieldError.checkNotNull(userId, r'PairingCode', 'userId'); - BuiltValueNullFieldError.checkNotNull(code, r'PairingCode', 'code'); - BuiltValueNullFieldError.checkNotNull( - expiresAt, r'PairingCode', 'expiresAt'); - BuiltValueNullFieldError.checkNotNull( - workflowState, r'PairingCode', 'workflowState'); - } - - @override - PairingCode rebuild(void Function(PairingCodeBuilder) updates) => - (toBuilder()..update(updates)).build(); - - @override - PairingCodeBuilder toBuilder() => new PairingCodeBuilder()..replace(this); - - @override - bool operator ==(Object other) { - if (identical(other, this)) return true; - return other is PairingCode && - userId == other.userId && - code == other.code && - expiresAt == other.expiresAt && - workflowState == other.workflowState; - } - - @override - int get hashCode { - var _$hash = 0; - _$hash = $jc(_$hash, userId.hashCode); - _$hash = $jc(_$hash, code.hashCode); - _$hash = $jc(_$hash, expiresAt.hashCode); - _$hash = $jc(_$hash, workflowState.hashCode); - _$hash = $jf(_$hash); - return _$hash; - } - - @override - String toString() { - return (newBuiltValueToStringHelper(r'PairingCode') - ..add('userId', userId) - ..add('code', code) - ..add('expiresAt', expiresAt) - ..add('workflowState', workflowState)) - .toString(); - } -} - -class PairingCodeBuilder implements Builder { - _$PairingCode? _$v; - - String? _userId; - String? get userId => _$this._userId; - set userId(String? userId) => _$this._userId = userId; - - String? _code; - String? get code => _$this._code; - set code(String? code) => _$this._code = code; - - String? _expiresAt; - String? get expiresAt => _$this._expiresAt; - set expiresAt(String? expiresAt) => _$this._expiresAt = expiresAt; - - String? _workflowState; - String? get workflowState => _$this._workflowState; - set workflowState(String? workflowState) => - _$this._workflowState = workflowState; - - PairingCodeBuilder() { - PairingCode._initializeBuilder(this); - } - - PairingCodeBuilder get _$this { - final $v = _$v; - if ($v != null) { - _userId = $v.userId; - _code = $v.code; - _expiresAt = $v.expiresAt; - _workflowState = $v.workflowState; - _$v = null; - } - return this; - } - - @override - void replace(PairingCode other) { - ArgumentError.checkNotNull(other, 'other'); - _$v = other as _$PairingCode; - } - - @override - void update(void Function(PairingCodeBuilder)? updates) { - if (updates != null) updates(this); - } - - @override - PairingCode build() => _build(); - - _$PairingCode _build() { - final _$result = _$v ?? - new _$PairingCode._( - userId: BuiltValueNullFieldError.checkNotNull( - userId, r'PairingCode', 'userId'), - code: BuiltValueNullFieldError.checkNotNull( - code, r'PairingCode', 'code'), - expiresAt: BuiltValueNullFieldError.checkNotNull( - expiresAt, r'PairingCode', 'expiresAt'), - workflowState: BuiltValueNullFieldError.checkNotNull( - workflowState, r'PairingCode', 'workflowState')); - replace(_$result); - return _$result; - } -} - -// ignore_for_file: deprecated_member_use_from_same_package,type=lint diff --git a/apps/flutter_parent/lib/models/dataseeding/pseudonym.dart b/apps/flutter_parent/lib/models/dataseeding/pseudonym.dart deleted file mode 100644 index 75fb106547..0000000000 --- a/apps/flutter_parent/lib/models/dataseeding/pseudonym.dart +++ /dev/null @@ -1,34 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:built_value/built_value.dart'; -import 'package:built_value/serializer.dart'; - -part 'pseudonym.g.dart'; - -abstract class Pseudonym implements Built { - @BuiltValueSerializer(serializeNulls: true) - static Serializer get serializer => _$pseudonymSerializer; - - Pseudonym._(); - factory Pseudonym([void Function(PseudonymBuilder) updates]) = _$Pseudonym; - - @BuiltValueField(wireName: "unique_id") - String get uniqueId; - String get password; - - static void _initializeBuilder(PseudonymBuilder b) => b - ..uniqueId = '' - ..password = ''; -} diff --git a/apps/flutter_parent/lib/models/dataseeding/pseudonym.g.dart b/apps/flutter_parent/lib/models/dataseeding/pseudonym.g.dart deleted file mode 100644 index 91af4243dd..0000000000 --- a/apps/flutter_parent/lib/models/dataseeding/pseudonym.g.dart +++ /dev/null @@ -1,156 +0,0 @@ -// GENERATED CODE - DO NOT MODIFY BY HAND - -part of 'pseudonym.dart'; - -// ************************************************************************** -// BuiltValueGenerator -// ************************************************************************** - -Serializer _$pseudonymSerializer = new _$PseudonymSerializer(); - -class _$PseudonymSerializer implements StructuredSerializer { - @override - final Iterable types = const [Pseudonym, _$Pseudonym]; - @override - final String wireName = 'Pseudonym'; - - @override - Iterable serialize(Serializers serializers, Pseudonym object, - {FullType specifiedType = FullType.unspecified}) { - final result = [ - 'unique_id', - serializers.serialize(object.uniqueId, - specifiedType: const FullType(String)), - 'password', - serializers.serialize(object.password, - specifiedType: const FullType(String)), - ]; - - return result; - } - - @override - Pseudonym deserialize(Serializers serializers, Iterable serialized, - {FullType specifiedType = FullType.unspecified}) { - final result = new PseudonymBuilder(); - - final iterator = serialized.iterator; - while (iterator.moveNext()) { - final key = iterator.current! as String; - iterator.moveNext(); - final Object? value = iterator.current; - switch (key) { - case 'unique_id': - result.uniqueId = serializers.deserialize(value, - specifiedType: const FullType(String))! as String; - break; - case 'password': - result.password = serializers.deserialize(value, - specifiedType: const FullType(String))! as String; - break; - } - } - - return result.build(); - } -} - -class _$Pseudonym extends Pseudonym { - @override - final String uniqueId; - @override - final String password; - - factory _$Pseudonym([void Function(PseudonymBuilder)? updates]) => - (new PseudonymBuilder()..update(updates))._build(); - - _$Pseudonym._({required this.uniqueId, required this.password}) : super._() { - BuiltValueNullFieldError.checkNotNull(uniqueId, r'Pseudonym', 'uniqueId'); - BuiltValueNullFieldError.checkNotNull(password, r'Pseudonym', 'password'); - } - - @override - Pseudonym rebuild(void Function(PseudonymBuilder) updates) => - (toBuilder()..update(updates)).build(); - - @override - PseudonymBuilder toBuilder() => new PseudonymBuilder()..replace(this); - - @override - bool operator ==(Object other) { - if (identical(other, this)) return true; - return other is Pseudonym && - uniqueId == other.uniqueId && - password == other.password; - } - - @override - int get hashCode { - var _$hash = 0; - _$hash = $jc(_$hash, uniqueId.hashCode); - _$hash = $jc(_$hash, password.hashCode); - _$hash = $jf(_$hash); - return _$hash; - } - - @override - String toString() { - return (newBuiltValueToStringHelper(r'Pseudonym') - ..add('uniqueId', uniqueId) - ..add('password', password)) - .toString(); - } -} - -class PseudonymBuilder implements Builder { - _$Pseudonym? _$v; - - String? _uniqueId; - String? get uniqueId => _$this._uniqueId; - set uniqueId(String? uniqueId) => _$this._uniqueId = uniqueId; - - String? _password; - String? get password => _$this._password; - set password(String? password) => _$this._password = password; - - PseudonymBuilder() { - Pseudonym._initializeBuilder(this); - } - - PseudonymBuilder get _$this { - final $v = _$v; - if ($v != null) { - _uniqueId = $v.uniqueId; - _password = $v.password; - _$v = null; - } - return this; - } - - @override - void replace(Pseudonym other) { - ArgumentError.checkNotNull(other, 'other'); - _$v = other as _$Pseudonym; - } - - @override - void update(void Function(PseudonymBuilder)? updates) { - if (updates != null) updates(this); - } - - @override - Pseudonym build() => _build(); - - _$Pseudonym _build() { - final _$result = _$v ?? - new _$Pseudonym._( - uniqueId: BuiltValueNullFieldError.checkNotNull( - uniqueId, r'Pseudonym', 'uniqueId'), - password: BuiltValueNullFieldError.checkNotNull( - password, r'Pseudonym', 'password')); - replace(_$result); - return _$result; - } -} - -// ignore_for_file: deprecated_member_use_from_same_package,type=lint diff --git a/apps/flutter_parent/lib/models/dataseeding/quiz.dart b/apps/flutter_parent/lib/models/dataseeding/quiz.dart deleted file mode 100644 index ce7413f631..0000000000 --- a/apps/flutter_parent/lib/models/dataseeding/quiz.dart +++ /dev/null @@ -1,40 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:built_value/built_value.dart'; -import 'package:built_value/serializer.dart'; - -part 'quiz.g.dart'; - -abstract class Quiz implements Built { - @BuiltValueSerializer(serializeNulls: true) - static Serializer get serializer => _$quizSerializer; - - Quiz._(); - factory Quiz([void Function(QuizBuilder) updates]) = _$Quiz; - - String get id; - - String get title; - - String get description; - - @BuiltValueField(wireName: 'due_at') - DateTime get dueAt; - - @BuiltValueField(wireName: 'points_possible') - double get pointsPossible; - - static void _initializeBuilder(QuizBuilder b) => b; -} diff --git a/apps/flutter_parent/lib/models/dataseeding/quiz.g.dart b/apps/flutter_parent/lib/models/dataseeding/quiz.g.dart deleted file mode 100644 index 86df8d0be2..0000000000 --- a/apps/flutter_parent/lib/models/dataseeding/quiz.g.dart +++ /dev/null @@ -1,222 +0,0 @@ -// GENERATED CODE - DO NOT MODIFY BY HAND - -part of 'quiz.dart'; - -// ************************************************************************** -// BuiltValueGenerator -// ************************************************************************** - -Serializer _$quizSerializer = new _$QuizSerializer(); - -class _$QuizSerializer implements StructuredSerializer { - @override - final Iterable types = const [Quiz, _$Quiz]; - @override - final String wireName = 'Quiz'; - - @override - Iterable serialize(Serializers serializers, Quiz object, - {FullType specifiedType = FullType.unspecified}) { - final result = [ - 'id', - serializers.serialize(object.id, specifiedType: const FullType(String)), - 'title', - serializers.serialize(object.title, - specifiedType: const FullType(String)), - 'description', - serializers.serialize(object.description, - specifiedType: const FullType(String)), - 'due_at', - serializers.serialize(object.dueAt, - specifiedType: const FullType(DateTime)), - 'points_possible', - serializers.serialize(object.pointsPossible, - specifiedType: const FullType(double)), - ]; - - return result; - } - - @override - Quiz deserialize(Serializers serializers, Iterable serialized, - {FullType specifiedType = FullType.unspecified}) { - final result = new QuizBuilder(); - - final iterator = serialized.iterator; - while (iterator.moveNext()) { - final key = iterator.current! as String; - iterator.moveNext(); - final Object? value = iterator.current; - switch (key) { - case 'id': - result.id = serializers.deserialize(value, - specifiedType: const FullType(String))! as String; - break; - case 'title': - result.title = serializers.deserialize(value, - specifiedType: const FullType(String))! as String; - break; - case 'description': - result.description = serializers.deserialize(value, - specifiedType: const FullType(String))! as String; - break; - case 'due_at': - result.dueAt = serializers.deserialize(value, - specifiedType: const FullType(DateTime))! as DateTime; - break; - case 'points_possible': - result.pointsPossible = serializers.deserialize(value, - specifiedType: const FullType(double))! as double; - break; - } - } - - return result.build(); - } -} - -class _$Quiz extends Quiz { - @override - final String id; - @override - final String title; - @override - final String description; - @override - final DateTime dueAt; - @override - final double pointsPossible; - - factory _$Quiz([void Function(QuizBuilder)? updates]) => - (new QuizBuilder()..update(updates))._build(); - - _$Quiz._( - {required this.id, - required this.title, - required this.description, - required this.dueAt, - required this.pointsPossible}) - : super._() { - BuiltValueNullFieldError.checkNotNull(id, r'Quiz', 'id'); - BuiltValueNullFieldError.checkNotNull(title, r'Quiz', 'title'); - BuiltValueNullFieldError.checkNotNull(description, r'Quiz', 'description'); - BuiltValueNullFieldError.checkNotNull(dueAt, r'Quiz', 'dueAt'); - BuiltValueNullFieldError.checkNotNull( - pointsPossible, r'Quiz', 'pointsPossible'); - } - - @override - Quiz rebuild(void Function(QuizBuilder) updates) => - (toBuilder()..update(updates)).build(); - - @override - QuizBuilder toBuilder() => new QuizBuilder()..replace(this); - - @override - bool operator ==(Object other) { - if (identical(other, this)) return true; - return other is Quiz && - id == other.id && - title == other.title && - description == other.description && - dueAt == other.dueAt && - pointsPossible == other.pointsPossible; - } - - @override - int get hashCode { - var _$hash = 0; - _$hash = $jc(_$hash, id.hashCode); - _$hash = $jc(_$hash, title.hashCode); - _$hash = $jc(_$hash, description.hashCode); - _$hash = $jc(_$hash, dueAt.hashCode); - _$hash = $jc(_$hash, pointsPossible.hashCode); - _$hash = $jf(_$hash); - return _$hash; - } - - @override - String toString() { - return (newBuiltValueToStringHelper(r'Quiz') - ..add('id', id) - ..add('title', title) - ..add('description', description) - ..add('dueAt', dueAt) - ..add('pointsPossible', pointsPossible)) - .toString(); - } -} - -class QuizBuilder implements Builder { - _$Quiz? _$v; - - String? _id; - String? get id => _$this._id; - set id(String? id) => _$this._id = id; - - String? _title; - String? get title => _$this._title; - set title(String? title) => _$this._title = title; - - String? _description; - String? get description => _$this._description; - set description(String? description) => _$this._description = description; - - DateTime? _dueAt; - DateTime? get dueAt => _$this._dueAt; - set dueAt(DateTime? dueAt) => _$this._dueAt = dueAt; - - double? _pointsPossible; - double? get pointsPossible => _$this._pointsPossible; - set pointsPossible(double? pointsPossible) => - _$this._pointsPossible = pointsPossible; - - QuizBuilder() { - Quiz._initializeBuilder(this); - } - - QuizBuilder get _$this { - final $v = _$v; - if ($v != null) { - _id = $v.id; - _title = $v.title; - _description = $v.description; - _dueAt = $v.dueAt; - _pointsPossible = $v.pointsPossible; - _$v = null; - } - return this; - } - - @override - void replace(Quiz other) { - ArgumentError.checkNotNull(other, 'other'); - _$v = other as _$Quiz; - } - - @override - void update(void Function(QuizBuilder)? updates) { - if (updates != null) updates(this); - } - - @override - Quiz build() => _build(); - - _$Quiz _build() { - final _$result = _$v ?? - new _$Quiz._( - id: BuiltValueNullFieldError.checkNotNull(id, r'Quiz', 'id'), - title: - BuiltValueNullFieldError.checkNotNull(title, r'Quiz', 'title'), - description: BuiltValueNullFieldError.checkNotNull( - description, r'Quiz', 'description'), - dueAt: - BuiltValueNullFieldError.checkNotNull(dueAt, r'Quiz', 'dueAt'), - pointsPossible: BuiltValueNullFieldError.checkNotNull( - pointsPossible, r'Quiz', 'pointsPossible')); - replace(_$result); - return _$result; - } -} - -// ignore_for_file: deprecated_member_use_from_same_package,type=lint diff --git a/apps/flutter_parent/lib/models/dataseeding/seed_context.dart b/apps/flutter_parent/lib/models/dataseeding/seed_context.dart deleted file mode 100644 index a3bc218154..0000000000 --- a/apps/flutter_parent/lib/models/dataseeding/seed_context.dart +++ /dev/null @@ -1,41 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'dart:convert'; - -import 'package:built_collection/built_collection.dart'; -import 'package:built_value/built_value.dart'; -import 'package:built_value/serializer.dart'; -import 'package:flutter_parent/models/serializers.dart'; - -part 'seed_context.g.dart'; - -// Model class used for conveying seeding info from app to test driver -abstract class SeedContext implements Built { - @BuiltValueSerializer(serializeNulls: true) - static Serializer get serializer => _$seedContextSerializer; - - SeedContext._(); - factory SeedContext([void Function(SeedContextBuilder) updates]) = _$SeedContext; - - bool get seedingComplete; - BuiltMap get seedObjects; - - static void _initializeBuilder(SeedContextBuilder b) => b..seedingComplete = false; - - // Convenience method for extracting seed objects - T? getNamedObject(String objectName) { - return deserialize(json.decode(seedObjects[objectName] ?? '')); - } -} diff --git a/apps/flutter_parent/lib/models/dataseeding/seed_context.g.dart b/apps/flutter_parent/lib/models/dataseeding/seed_context.g.dart deleted file mode 100644 index 7ceba76ca9..0000000000 --- a/apps/flutter_parent/lib/models/dataseeding/seed_context.g.dart +++ /dev/null @@ -1,176 +0,0 @@ -// GENERATED CODE - DO NOT MODIFY BY HAND - -part of 'seed_context.dart'; - -// ************************************************************************** -// BuiltValueGenerator -// ************************************************************************** - -Serializer _$seedContextSerializer = new _$SeedContextSerializer(); - -class _$SeedContextSerializer implements StructuredSerializer { - @override - final Iterable types = const [SeedContext, _$SeedContext]; - @override - final String wireName = 'SeedContext'; - - @override - Iterable serialize(Serializers serializers, SeedContext object, - {FullType specifiedType = FullType.unspecified}) { - final result = [ - 'seedingComplete', - serializers.serialize(object.seedingComplete, - specifiedType: const FullType(bool)), - 'seedObjects', - serializers.serialize(object.seedObjects, - specifiedType: const FullType(BuiltMap, - const [const FullType(String), const FullType(String)])), - ]; - - return result; - } - - @override - SeedContext deserialize(Serializers serializers, Iterable serialized, - {FullType specifiedType = FullType.unspecified}) { - final result = new SeedContextBuilder(); - - final iterator = serialized.iterator; - while (iterator.moveNext()) { - final key = iterator.current! as String; - iterator.moveNext(); - final Object? value = iterator.current; - switch (key) { - case 'seedingComplete': - result.seedingComplete = serializers.deserialize(value, - specifiedType: const FullType(bool))! as bool; - break; - case 'seedObjects': - result.seedObjects.replace(serializers.deserialize(value, - specifiedType: const FullType(BuiltMap, - const [const FullType(String), const FullType(String)]))!); - break; - } - } - - return result.build(); - } -} - -class _$SeedContext extends SeedContext { - @override - final bool seedingComplete; - @override - final BuiltMap seedObjects; - - factory _$SeedContext([void Function(SeedContextBuilder)? updates]) => - (new SeedContextBuilder()..update(updates))._build(); - - _$SeedContext._({required this.seedingComplete, required this.seedObjects}) - : super._() { - BuiltValueNullFieldError.checkNotNull( - seedingComplete, r'SeedContext', 'seedingComplete'); - BuiltValueNullFieldError.checkNotNull( - seedObjects, r'SeedContext', 'seedObjects'); - } - - @override - SeedContext rebuild(void Function(SeedContextBuilder) updates) => - (toBuilder()..update(updates)).build(); - - @override - SeedContextBuilder toBuilder() => new SeedContextBuilder()..replace(this); - - @override - bool operator ==(Object other) { - if (identical(other, this)) return true; - return other is SeedContext && - seedingComplete == other.seedingComplete && - seedObjects == other.seedObjects; - } - - @override - int get hashCode { - var _$hash = 0; - _$hash = $jc(_$hash, seedingComplete.hashCode); - _$hash = $jc(_$hash, seedObjects.hashCode); - _$hash = $jf(_$hash); - return _$hash; - } - - @override - String toString() { - return (newBuiltValueToStringHelper(r'SeedContext') - ..add('seedingComplete', seedingComplete) - ..add('seedObjects', seedObjects)) - .toString(); - } -} - -class SeedContextBuilder implements Builder { - _$SeedContext? _$v; - - bool? _seedingComplete; - bool? get seedingComplete => _$this._seedingComplete; - set seedingComplete(bool? seedingComplete) => - _$this._seedingComplete = seedingComplete; - - MapBuilder? _seedObjects; - MapBuilder get seedObjects => - _$this._seedObjects ??= new MapBuilder(); - set seedObjects(MapBuilder? seedObjects) => - _$this._seedObjects = seedObjects; - - SeedContextBuilder() { - SeedContext._initializeBuilder(this); - } - - SeedContextBuilder get _$this { - final $v = _$v; - if ($v != null) { - _seedingComplete = $v.seedingComplete; - _seedObjects = $v.seedObjects.toBuilder(); - _$v = null; - } - return this; - } - - @override - void replace(SeedContext other) { - ArgumentError.checkNotNull(other, 'other'); - _$v = other as _$SeedContext; - } - - @override - void update(void Function(SeedContextBuilder)? updates) { - if (updates != null) updates(this); - } - - @override - SeedContext build() => _build(); - - _$SeedContext _build() { - _$SeedContext _$result; - try { - _$result = _$v ?? - new _$SeedContext._( - seedingComplete: BuiltValueNullFieldError.checkNotNull( - seedingComplete, r'SeedContext', 'seedingComplete'), - seedObjects: seedObjects.build()); - } catch (_) { - late String _$failedField; - try { - _$failedField = 'seedObjects'; - seedObjects.build(); - } catch (e) { - throw new BuiltValueNestedFieldError( - r'SeedContext', _$failedField, e.toString()); - } - rethrow; - } - replace(_$result); - return _$result; - } -} - -// ignore_for_file: deprecated_member_use_from_same_package,type=lint diff --git a/apps/flutter_parent/lib/models/dataseeding/seeded_user.dart b/apps/flutter_parent/lib/models/dataseeding/seeded_user.dart deleted file mode 100644 index 21f57f4596..0000000000 --- a/apps/flutter_parent/lib/models/dataseeding/seeded_user.dart +++ /dev/null @@ -1,77 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:built_value/built_value.dart'; -import 'package:built_value/serializer.dart'; - -import '../login.dart'; -import '../user.dart'; - -part 'seeded_user.g.dart'; - -abstract class SeededUser implements Built { - @BuiltValueSerializer(serializeNulls: true) - static Serializer get serializer => _$seededUserSerializer; - - SeededUser._(); - factory SeededUser([void Function(SeededUserBuilder) updates]) = _$SeededUser; - - String get id; - - String get name; - - @BuiltValueField(wireName: "short_name") - String get shortName; - - @BuiltValueField(wireName: "sortable_name") - String get sortableName; - - @BuiltValueField(wireName: "terms_of_use") - bool? get termsOfUse; - - @BuiltValueField(wireName: "login_id") - String? get loginId; - - String? get password; - - @BuiltValueField(wireName: "avatar_url") - String? get avatarUrl; - - String? get token; - - String? get domain; - - static void _initializeBuilder(SeededUserBuilder b) => b..name = ''; - - User toUser() { - return User((b) => b - ..id = id - ..name = name - ..shortName = shortName - ..sortableName = sortableName - ..build()); - } - - Login toLogin() { - return Login((b) => b - ..domain = "https://$domain/" - ..clientSecret = token - ..accessToken = token - ..user.name = name - ..user.id = id - ..user.shortName = shortName - ..user.sortableName = sortableName - ..build()); - } -} diff --git a/apps/flutter_parent/lib/models/dataseeding/seeded_user.g.dart b/apps/flutter_parent/lib/models/dataseeding/seeded_user.g.dart deleted file mode 100644 index f49bcf7751..0000000000 --- a/apps/flutter_parent/lib/models/dataseeding/seeded_user.g.dart +++ /dev/null @@ -1,332 +0,0 @@ -// GENERATED CODE - DO NOT MODIFY BY HAND - -part of 'seeded_user.dart'; - -// ************************************************************************** -// BuiltValueGenerator -// ************************************************************************** - -Serializer _$seededUserSerializer = new _$SeededUserSerializer(); - -class _$SeededUserSerializer implements StructuredSerializer { - @override - final Iterable types = const [SeededUser, _$SeededUser]; - @override - final String wireName = 'SeededUser'; - - @override - Iterable serialize(Serializers serializers, SeededUser object, - {FullType specifiedType = FullType.unspecified}) { - final result = [ - 'id', - serializers.serialize(object.id, specifiedType: const FullType(String)), - 'name', - serializers.serialize(object.name, specifiedType: const FullType(String)), - 'short_name', - serializers.serialize(object.shortName, - specifiedType: const FullType(String)), - 'sortable_name', - serializers.serialize(object.sortableName, - specifiedType: const FullType(String)), - ]; - Object? value; - value = object.termsOfUse; - - result - ..add('terms_of_use') - ..add(serializers.serialize(value, specifiedType: const FullType(bool))); - value = object.loginId; - - result - ..add('login_id') - ..add( - serializers.serialize(value, specifiedType: const FullType(String))); - value = object.password; - - result - ..add('password') - ..add( - serializers.serialize(value, specifiedType: const FullType(String))); - value = object.avatarUrl; - - result - ..add('avatar_url') - ..add( - serializers.serialize(value, specifiedType: const FullType(String))); - value = object.token; - - result - ..add('token') - ..add( - serializers.serialize(value, specifiedType: const FullType(String))); - value = object.domain; - - result - ..add('domain') - ..add( - serializers.serialize(value, specifiedType: const FullType(String))); - - return result; - } - - @override - SeededUser deserialize(Serializers serializers, Iterable serialized, - {FullType specifiedType = FullType.unspecified}) { - final result = new SeededUserBuilder(); - - final iterator = serialized.iterator; - while (iterator.moveNext()) { - final key = iterator.current! as String; - iterator.moveNext(); - final Object? value = iterator.current; - switch (key) { - case 'id': - result.id = serializers.deserialize(value, - specifiedType: const FullType(String))! as String; - break; - case 'name': - result.name = serializers.deserialize(value, - specifiedType: const FullType(String))! as String; - break; - case 'short_name': - result.shortName = serializers.deserialize(value, - specifiedType: const FullType(String))! as String; - break; - case 'sortable_name': - result.sortableName = serializers.deserialize(value, - specifiedType: const FullType(String))! as String; - break; - case 'terms_of_use': - result.termsOfUse = serializers.deserialize(value, - specifiedType: const FullType(bool)) as bool?; - break; - case 'login_id': - result.loginId = serializers.deserialize(value, - specifiedType: const FullType(String)) as String?; - break; - case 'password': - result.password = serializers.deserialize(value, - specifiedType: const FullType(String)) as String?; - break; - case 'avatar_url': - result.avatarUrl = serializers.deserialize(value, - specifiedType: const FullType(String)) as String?; - break; - case 'token': - result.token = serializers.deserialize(value, - specifiedType: const FullType(String)) as String?; - break; - case 'domain': - result.domain = serializers.deserialize(value, - specifiedType: const FullType(String)) as String?; - break; - } - } - - return result.build(); - } -} - -class _$SeededUser extends SeededUser { - @override - final String id; - @override - final String name; - @override - final String shortName; - @override - final String sortableName; - @override - final bool? termsOfUse; - @override - final String? loginId; - @override - final String? password; - @override - final String? avatarUrl; - @override - final String? token; - @override - final String? domain; - - factory _$SeededUser([void Function(SeededUserBuilder)? updates]) => - (new SeededUserBuilder()..update(updates))._build(); - - _$SeededUser._( - {required this.id, - required this.name, - required this.shortName, - required this.sortableName, - this.termsOfUse, - this.loginId, - this.password, - this.avatarUrl, - this.token, - this.domain}) - : super._() { - BuiltValueNullFieldError.checkNotNull(id, r'SeededUser', 'id'); - BuiltValueNullFieldError.checkNotNull(name, r'SeededUser', 'name'); - BuiltValueNullFieldError.checkNotNull( - shortName, r'SeededUser', 'shortName'); - BuiltValueNullFieldError.checkNotNull( - sortableName, r'SeededUser', 'sortableName'); - } - - @override - SeededUser rebuild(void Function(SeededUserBuilder) updates) => - (toBuilder()..update(updates)).build(); - - @override - SeededUserBuilder toBuilder() => new SeededUserBuilder()..replace(this); - - @override - bool operator ==(Object other) { - if (identical(other, this)) return true; - return other is SeededUser && - id == other.id && - name == other.name && - shortName == other.shortName && - sortableName == other.sortableName && - termsOfUse == other.termsOfUse && - loginId == other.loginId && - password == other.password && - avatarUrl == other.avatarUrl && - token == other.token && - domain == other.domain; - } - - @override - int get hashCode { - var _$hash = 0; - _$hash = $jc(_$hash, id.hashCode); - _$hash = $jc(_$hash, name.hashCode); - _$hash = $jc(_$hash, shortName.hashCode); - _$hash = $jc(_$hash, sortableName.hashCode); - _$hash = $jc(_$hash, termsOfUse.hashCode); - _$hash = $jc(_$hash, loginId.hashCode); - _$hash = $jc(_$hash, password.hashCode); - _$hash = $jc(_$hash, avatarUrl.hashCode); - _$hash = $jc(_$hash, token.hashCode); - _$hash = $jc(_$hash, domain.hashCode); - _$hash = $jf(_$hash); - return _$hash; - } - - @override - String toString() { - return (newBuiltValueToStringHelper(r'SeededUser') - ..add('id', id) - ..add('name', name) - ..add('shortName', shortName) - ..add('sortableName', sortableName) - ..add('termsOfUse', termsOfUse) - ..add('loginId', loginId) - ..add('password', password) - ..add('avatarUrl', avatarUrl) - ..add('token', token) - ..add('domain', domain)) - .toString(); - } -} - -class SeededUserBuilder implements Builder { - _$SeededUser? _$v; - - String? _id; - String? get id => _$this._id; - set id(String? id) => _$this._id = id; - - String? _name; - String? get name => _$this._name; - set name(String? name) => _$this._name = name; - - String? _shortName; - String? get shortName => _$this._shortName; - set shortName(String? shortName) => _$this._shortName = shortName; - - String? _sortableName; - String? get sortableName => _$this._sortableName; - set sortableName(String? sortableName) => _$this._sortableName = sortableName; - - bool? _termsOfUse; - bool? get termsOfUse => _$this._termsOfUse; - set termsOfUse(bool? termsOfUse) => _$this._termsOfUse = termsOfUse; - - String? _loginId; - String? get loginId => _$this._loginId; - set loginId(String? loginId) => _$this._loginId = loginId; - - String? _password; - String? get password => _$this._password; - set password(String? password) => _$this._password = password; - - String? _avatarUrl; - String? get avatarUrl => _$this._avatarUrl; - set avatarUrl(String? avatarUrl) => _$this._avatarUrl = avatarUrl; - - String? _token; - String? get token => _$this._token; - set token(String? token) => _$this._token = token; - - String? _domain; - String? get domain => _$this._domain; - set domain(String? domain) => _$this._domain = domain; - - SeededUserBuilder() { - SeededUser._initializeBuilder(this); - } - - SeededUserBuilder get _$this { - final $v = _$v; - if ($v != null) { - _id = $v.id; - _name = $v.name; - _shortName = $v.shortName; - _sortableName = $v.sortableName; - _termsOfUse = $v.termsOfUse; - _loginId = $v.loginId; - _password = $v.password; - _avatarUrl = $v.avatarUrl; - _token = $v.token; - _domain = $v.domain; - _$v = null; - } - return this; - } - - @override - void replace(SeededUser other) { - ArgumentError.checkNotNull(other, 'other'); - _$v = other as _$SeededUser; - } - - @override - void update(void Function(SeededUserBuilder)? updates) { - if (updates != null) updates(this); - } - - @override - SeededUser build() => _build(); - - _$SeededUser _build() { - final _$result = _$v ?? - new _$SeededUser._( - id: BuiltValueNullFieldError.checkNotNull(id, r'SeededUser', 'id'), - name: BuiltValueNullFieldError.checkNotNull( - name, r'SeededUser', 'name'), - shortName: BuiltValueNullFieldError.checkNotNull( - shortName, r'SeededUser', 'shortName'), - sortableName: BuiltValueNullFieldError.checkNotNull( - sortableName, r'SeededUser', 'sortableName'), - termsOfUse: termsOfUse, - loginId: loginId, - password: password, - avatarUrl: avatarUrl, - token: token, - domain: domain); - replace(_$result); - return _$result; - } -} - -// ignore_for_file: deprecated_member_use_from_same_package,type=lint diff --git a/apps/flutter_parent/lib/models/dataseeding/user_name_data.dart b/apps/flutter_parent/lib/models/dataseeding/user_name_data.dart deleted file mode 100644 index 1da3226ce8..0000000000 --- a/apps/flutter_parent/lib/models/dataseeding/user_name_data.dart +++ /dev/null @@ -1,39 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:built_value/built_value.dart'; -import 'package:built_value/serializer.dart'; - -part 'user_name_data.g.dart'; - -abstract class UserNameData implements Built { - @BuiltValueSerializer(serializeNulls: true) - static Serializer get serializer => _$userNameDataSerializer; - - UserNameData._(); - factory UserNameData([void Function(UserNameDataBuilder) updates]) = _$UserNameData; - - String get name; - - @BuiltValueField(wireName: "short_name") - String get shortName; - - @BuiltValueField(wireName: "sortable_name") - String get sortableName; - - @BuiltValueField(wireName: "terms_of_use") - bool? get termsOfUse; - - static void _initializeBuilder(UserNameDataBuilder b) => b..name = ''; -} diff --git a/apps/flutter_parent/lib/models/dataseeding/user_name_data.g.dart b/apps/flutter_parent/lib/models/dataseeding/user_name_data.g.dart deleted file mode 100644 index e75e6e7ecb..0000000000 --- a/apps/flutter_parent/lib/models/dataseeding/user_name_data.g.dart +++ /dev/null @@ -1,206 +0,0 @@ -// GENERATED CODE - DO NOT MODIFY BY HAND - -part of 'user_name_data.dart'; - -// ************************************************************************** -// BuiltValueGenerator -// ************************************************************************** - -Serializer _$userNameDataSerializer = - new _$UserNameDataSerializer(); - -class _$UserNameDataSerializer implements StructuredSerializer { - @override - final Iterable types = const [UserNameData, _$UserNameData]; - @override - final String wireName = 'UserNameData'; - - @override - Iterable serialize(Serializers serializers, UserNameData object, - {FullType specifiedType = FullType.unspecified}) { - final result = [ - 'name', - serializers.serialize(object.name, specifiedType: const FullType(String)), - 'short_name', - serializers.serialize(object.shortName, - specifiedType: const FullType(String)), - 'sortable_name', - serializers.serialize(object.sortableName, - specifiedType: const FullType(String)), - ]; - Object? value; - value = object.termsOfUse; - - result - ..add('terms_of_use') - ..add(serializers.serialize(value, specifiedType: const FullType(bool))); - - return result; - } - - @override - UserNameData deserialize( - Serializers serializers, Iterable serialized, - {FullType specifiedType = FullType.unspecified}) { - final result = new UserNameDataBuilder(); - - final iterator = serialized.iterator; - while (iterator.moveNext()) { - final key = iterator.current! as String; - iterator.moveNext(); - final Object? value = iterator.current; - switch (key) { - case 'name': - result.name = serializers.deserialize(value, - specifiedType: const FullType(String))! as String; - break; - case 'short_name': - result.shortName = serializers.deserialize(value, - specifiedType: const FullType(String))! as String; - break; - case 'sortable_name': - result.sortableName = serializers.deserialize(value, - specifiedType: const FullType(String))! as String; - break; - case 'terms_of_use': - result.termsOfUse = serializers.deserialize(value, - specifiedType: const FullType(bool)) as bool?; - break; - } - } - - return result.build(); - } -} - -class _$UserNameData extends UserNameData { - @override - final String name; - @override - final String shortName; - @override - final String sortableName; - @override - final bool? termsOfUse; - - factory _$UserNameData([void Function(UserNameDataBuilder)? updates]) => - (new UserNameDataBuilder()..update(updates))._build(); - - _$UserNameData._( - {required this.name, - required this.shortName, - required this.sortableName, - this.termsOfUse}) - : super._() { - BuiltValueNullFieldError.checkNotNull(name, r'UserNameData', 'name'); - BuiltValueNullFieldError.checkNotNull( - shortName, r'UserNameData', 'shortName'); - BuiltValueNullFieldError.checkNotNull( - sortableName, r'UserNameData', 'sortableName'); - } - - @override - UserNameData rebuild(void Function(UserNameDataBuilder) updates) => - (toBuilder()..update(updates)).build(); - - @override - UserNameDataBuilder toBuilder() => new UserNameDataBuilder()..replace(this); - - @override - bool operator ==(Object other) { - if (identical(other, this)) return true; - return other is UserNameData && - name == other.name && - shortName == other.shortName && - sortableName == other.sortableName && - termsOfUse == other.termsOfUse; - } - - @override - int get hashCode { - var _$hash = 0; - _$hash = $jc(_$hash, name.hashCode); - _$hash = $jc(_$hash, shortName.hashCode); - _$hash = $jc(_$hash, sortableName.hashCode); - _$hash = $jc(_$hash, termsOfUse.hashCode); - _$hash = $jf(_$hash); - return _$hash; - } - - @override - String toString() { - return (newBuiltValueToStringHelper(r'UserNameData') - ..add('name', name) - ..add('shortName', shortName) - ..add('sortableName', sortableName) - ..add('termsOfUse', termsOfUse)) - .toString(); - } -} - -class UserNameDataBuilder - implements Builder { - _$UserNameData? _$v; - - String? _name; - String? get name => _$this._name; - set name(String? name) => _$this._name = name; - - String? _shortName; - String? get shortName => _$this._shortName; - set shortName(String? shortName) => _$this._shortName = shortName; - - String? _sortableName; - String? get sortableName => _$this._sortableName; - set sortableName(String? sortableName) => _$this._sortableName = sortableName; - - bool? _termsOfUse; - bool? get termsOfUse => _$this._termsOfUse; - set termsOfUse(bool? termsOfUse) => _$this._termsOfUse = termsOfUse; - - UserNameDataBuilder() { - UserNameData._initializeBuilder(this); - } - - UserNameDataBuilder get _$this { - final $v = _$v; - if ($v != null) { - _name = $v.name; - _shortName = $v.shortName; - _sortableName = $v.sortableName; - _termsOfUse = $v.termsOfUse; - _$v = null; - } - return this; - } - - @override - void replace(UserNameData other) { - ArgumentError.checkNotNull(other, 'other'); - _$v = other as _$UserNameData; - } - - @override - void update(void Function(UserNameDataBuilder)? updates) { - if (updates != null) updates(this); - } - - @override - UserNameData build() => _build(); - - _$UserNameData _build() { - final _$result = _$v ?? - new _$UserNameData._( - name: BuiltValueNullFieldError.checkNotNull( - name, r'UserNameData', 'name'), - shortName: BuiltValueNullFieldError.checkNotNull( - shortName, r'UserNameData', 'shortName'), - sortableName: BuiltValueNullFieldError.checkNotNull( - sortableName, r'UserNameData', 'sortableName'), - termsOfUse: termsOfUse); - replace(_$result); - return _$result; - } -} - -// ignore_for_file: deprecated_member_use_from_same_package,type=lint diff --git a/apps/flutter_parent/lib/models/enrollment.dart b/apps/flutter_parent/lib/models/enrollment.dart deleted file mode 100644 index 0a0c2d8afb..0000000000 --- a/apps/flutter_parent/lib/models/enrollment.dart +++ /dev/null @@ -1,146 +0,0 @@ -// Copyright (C) 2019 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -library enrollment; - -import 'package:built_value/built_value.dart'; -import 'package:built_value/serializer.dart'; - -import 'grade.dart'; -import 'user.dart'; - -part 'enrollment.g.dart'; - -/// To have this built_value be generated, run this command from the project root: -/// flutter packages pub run build_runner build --delete-conflicting-outputs -abstract class Enrollment implements Built { - @BuiltValueSerializer(serializeNulls: true) - static Serializer get serializer => _$enrollmentSerializer; - - Enrollment._(); - - factory Enrollment([void Function(EnrollmentBuilder) updates]) = _$Enrollment; - - // The enrollment role, for course-level permissions - this field will match `type` if the enrollment role has not been customized - String? get role; - - String? get type; - - String get id; - - // Only included when we get enrollments using the user's url: /users/self/enrollments - @BuiltValueField(wireName: 'course_id') - String? get courseId; - - @BuiltValueField(wireName: 'course_section_id') - String? get courseSectionId; - - @BuiltValueField(wireName: 'enrollment_state') - String get enrollmentState; - - @BuiltValueField(wireName: 'user_id') - String get userId; - - Grade? get grades; - - // Only included when we get the enrollment with a course object - @BuiltValueField(wireName: 'computed_current_score') - double? get computedCurrentScore; - - @BuiltValueField(wireName: 'computed_final_score') - double? get computedFinalScore; - - @BuiltValueField(wireName: 'computed_current_grade') - String? get computedCurrentGrade; - - @BuiltValueField(wireName: 'computed_final_grade') - String? get computedFinalGrade; - - @BuiltValueField(wireName: 'computed_current_letter_grade') - String? get computedCurrentLetterGrade; - - @BuiltValueField(wireName: 'multiple_grading_periods_enabled') - bool get multipleGradingPeriodsEnabled; - - @BuiltValueField(wireName: 'totals_for_all_grading_periods_option') - bool get totalsForAllGradingPeriodsOption; - - @BuiltValueField(wireName: 'current_period_computed_current_score') - double? get currentPeriodComputedCurrentScore; - - @BuiltValueField(wireName: 'current_period_computed_final_score') - double? get currentPeriodComputedFinalScore; - - @BuiltValueField(wireName: 'current_period_computed_current_grade') - String? get currentPeriodComputedCurrentGrade; - - @BuiltValueField(wireName: 'current_period_computed_final_grade') - String? get currentPeriodComputedFinalGrade; - - @BuiltValueField(wireName: 'current_grading_period_id') - String? get currentGradingPeriodId; - - @BuiltValueField(wireName: 'current_grading_period_title') - String? get currentGradingPeriodTitle; - - @BuiltValueField(wireName: 'associated_user_id') - String get associatedUserId; // The unique id of the associated user. Will be null unless type is ObserverEnrollment. - - @BuiltValueField(wireName: 'last_activity_at') - DateTime? get lastActivityAt; - - @BuiltValueField(wireName: 'limit_privileges_to_course_section') - bool get limitPrivilegesToCourseSection; - - @BuiltValueField(wireName: 'observed_user') - User? get observedUser; - - User? get user; - - // Helper functions - bool _matchesEnrollment(value) => value == type || value == role; - - bool isTa() => ['ta', 'TaEnrollment'].any(_matchesEnrollment); - - bool isStudent() => ['student', 'StudentEnrollment'].any(_matchesEnrollment); - - bool isTeacher() => ['teacher', 'TeacherEnrollment'].any(_matchesEnrollment); - - bool isObserver() => ['observer', 'ObserverEnrollment'].any(_matchesEnrollment); - - bool isDesigner() => ['designer', 'DesignerEnrollment'].any(_matchesEnrollment); - - bool hasActiveGradingPeriod() => - multipleGradingPeriodsEnabled && - currentGradingPeriodId != null && - currentGradingPeriodId?.isNotEmpty == true && - currentGradingPeriodId != '0'; - - // NOTE: Looks like the API will never return multipleGradingPeriodsEnabled for observer enrollments, still checking just in case - bool isTotalsForAllGradingPeriodsEnabled() => - (isStudent() || isObserver()) && multipleGradingPeriodsEnabled && totalsForAllGradingPeriodsOption; - -// NOTE: There is also a StudentViewEnrollment that allows Teachers to view the course as a student - we don't handle that right now, and we probably don't have to worry about it - - static void _initializeBuilder(EnrollmentBuilder b) => b - ..id = '' - ..userId = '' - ..courseId = '' - ..courseSectionId = '' - ..enrollmentState = '' - ..multipleGradingPeriodsEnabled = false - ..totalsForAllGradingPeriodsOption = false - ..currentGradingPeriodId = '' - ..associatedUserId = '' - ..limitPrivilegesToCourseSection = false; -} diff --git a/apps/flutter_parent/lib/models/enrollment.g.dart b/apps/flutter_parent/lib/models/enrollment.g.dart deleted file mode 100644 index 313d4a7b83..0000000000 --- a/apps/flutter_parent/lib/models/enrollment.g.dart +++ /dev/null @@ -1,756 +0,0 @@ -// GENERATED CODE - DO NOT MODIFY BY HAND - -part of 'enrollment.dart'; - -// ************************************************************************** -// BuiltValueGenerator -// ************************************************************************** - -Serializer _$enrollmentSerializer = new _$EnrollmentSerializer(); - -class _$EnrollmentSerializer implements StructuredSerializer { - @override - final Iterable types = const [Enrollment, _$Enrollment]; - @override - final String wireName = 'Enrollment'; - - @override - Iterable serialize(Serializers serializers, Enrollment object, - {FullType specifiedType = FullType.unspecified}) { - final result = [ - 'id', - serializers.serialize(object.id, specifiedType: const FullType(String)), - 'enrollment_state', - serializers.serialize(object.enrollmentState, - specifiedType: const FullType(String)), - 'user_id', - serializers.serialize(object.userId, - specifiedType: const FullType(String)), - 'multiple_grading_periods_enabled', - serializers.serialize(object.multipleGradingPeriodsEnabled, - specifiedType: const FullType(bool)), - 'totals_for_all_grading_periods_option', - serializers.serialize(object.totalsForAllGradingPeriodsOption, - specifiedType: const FullType(bool)), - 'associated_user_id', - serializers.serialize(object.associatedUserId, - specifiedType: const FullType(String)), - 'limit_privileges_to_course_section', - serializers.serialize(object.limitPrivilegesToCourseSection, - specifiedType: const FullType(bool)), - ]; - Object? value; - value = object.role; - - result - ..add('role') - ..add( - serializers.serialize(value, specifiedType: const FullType(String))); - value = object.type; - - result - ..add('type') - ..add( - serializers.serialize(value, specifiedType: const FullType(String))); - value = object.courseId; - - result - ..add('course_id') - ..add( - serializers.serialize(value, specifiedType: const FullType(String))); - value = object.courseSectionId; - - result - ..add('course_section_id') - ..add( - serializers.serialize(value, specifiedType: const FullType(String))); - value = object.grades; - - result - ..add('grades') - ..add(serializers.serialize(value, specifiedType: const FullType(Grade))); - value = object.computedCurrentScore; - - result - ..add('computed_current_score') - ..add( - serializers.serialize(value, specifiedType: const FullType(double))); - value = object.computedFinalScore; - - result - ..add('computed_final_score') - ..add( - serializers.serialize(value, specifiedType: const FullType(double))); - value = object.computedCurrentGrade; - - result - ..add('computed_current_grade') - ..add( - serializers.serialize(value, specifiedType: const FullType(String))); - value = object.computedFinalGrade; - - result - ..add('computed_final_grade') - ..add( - serializers.serialize(value, specifiedType: const FullType(String))); - value = object.computedCurrentLetterGrade; - - result - ..add('computed_current_letter_grade') - ..add( - serializers.serialize(value, specifiedType: const FullType(String))); - value = object.currentPeriodComputedCurrentScore; - - result - ..add('current_period_computed_current_score') - ..add( - serializers.serialize(value, specifiedType: const FullType(double))); - value = object.currentPeriodComputedFinalScore; - - result - ..add('current_period_computed_final_score') - ..add( - serializers.serialize(value, specifiedType: const FullType(double))); - value = object.currentPeriodComputedCurrentGrade; - - result - ..add('current_period_computed_current_grade') - ..add( - serializers.serialize(value, specifiedType: const FullType(String))); - value = object.currentPeriodComputedFinalGrade; - - result - ..add('current_period_computed_final_grade') - ..add( - serializers.serialize(value, specifiedType: const FullType(String))); - value = object.currentGradingPeriodId; - - result - ..add('current_grading_period_id') - ..add( - serializers.serialize(value, specifiedType: const FullType(String))); - value = object.currentGradingPeriodTitle; - - result - ..add('current_grading_period_title') - ..add( - serializers.serialize(value, specifiedType: const FullType(String))); - value = object.lastActivityAt; - - result - ..add('last_activity_at') - ..add(serializers.serialize(value, - specifiedType: const FullType(DateTime))); - value = object.observedUser; - - result - ..add('observed_user') - ..add(serializers.serialize(value, specifiedType: const FullType(User))); - value = object.user; - - result - ..add('user') - ..add(serializers.serialize(value, specifiedType: const FullType(User))); - - return result; - } - - @override - Enrollment deserialize(Serializers serializers, Iterable serialized, - {FullType specifiedType = FullType.unspecified}) { - final result = new EnrollmentBuilder(); - - final iterator = serialized.iterator; - while (iterator.moveNext()) { - final key = iterator.current! as String; - iterator.moveNext(); - final Object? value = iterator.current; - switch (key) { - case 'role': - result.role = serializers.deserialize(value, - specifiedType: const FullType(String)) as String?; - break; - case 'type': - result.type = serializers.deserialize(value, - specifiedType: const FullType(String)) as String?; - break; - case 'id': - result.id = serializers.deserialize(value, - specifiedType: const FullType(String))! as String; - break; - case 'course_id': - result.courseId = serializers.deserialize(value, - specifiedType: const FullType(String)) as String?; - break; - case 'course_section_id': - result.courseSectionId = serializers.deserialize(value, - specifiedType: const FullType(String)) as String?; - break; - case 'enrollment_state': - result.enrollmentState = serializers.deserialize(value, - specifiedType: const FullType(String))! as String; - break; - case 'user_id': - result.userId = serializers.deserialize(value, - specifiedType: const FullType(String))! as String; - break; - case 'grades': - result.grades.replace(serializers.deserialize(value, - specifiedType: const FullType(Grade))! as Grade); - break; - case 'computed_current_score': - result.computedCurrentScore = serializers.deserialize(value, - specifiedType: const FullType(double)) as double?; - break; - case 'computed_final_score': - result.computedFinalScore = serializers.deserialize(value, - specifiedType: const FullType(double)) as double?; - break; - case 'computed_current_grade': - result.computedCurrentGrade = serializers.deserialize(value, - specifiedType: const FullType(String)) as String?; - break; - case 'computed_final_grade': - result.computedFinalGrade = serializers.deserialize(value, - specifiedType: const FullType(String)) as String?; - break; - case 'computed_current_letter_grade': - result.computedCurrentLetterGrade = serializers.deserialize(value, - specifiedType: const FullType(String)) as String?; - break; - case 'multiple_grading_periods_enabled': - result.multipleGradingPeriodsEnabled = serializers.deserialize(value, - specifiedType: const FullType(bool))! as bool; - break; - case 'totals_for_all_grading_periods_option': - result.totalsForAllGradingPeriodsOption = serializers - .deserialize(value, specifiedType: const FullType(bool))! as bool; - break; - case 'current_period_computed_current_score': - result.currentPeriodComputedCurrentScore = serializers.deserialize( - value, - specifiedType: const FullType(double)) as double?; - break; - case 'current_period_computed_final_score': - result.currentPeriodComputedFinalScore = serializers.deserialize( - value, - specifiedType: const FullType(double)) as double?; - break; - case 'current_period_computed_current_grade': - result.currentPeriodComputedCurrentGrade = serializers.deserialize( - value, - specifiedType: const FullType(String)) as String?; - break; - case 'current_period_computed_final_grade': - result.currentPeriodComputedFinalGrade = serializers.deserialize( - value, - specifiedType: const FullType(String)) as String?; - break; - case 'current_grading_period_id': - result.currentGradingPeriodId = serializers.deserialize(value, - specifiedType: const FullType(String)) as String?; - break; - case 'current_grading_period_title': - result.currentGradingPeriodTitle = serializers.deserialize(value, - specifiedType: const FullType(String)) as String?; - break; - case 'associated_user_id': - result.associatedUserId = serializers.deserialize(value, - specifiedType: const FullType(String))! as String; - break; - case 'last_activity_at': - result.lastActivityAt = serializers.deserialize(value, - specifiedType: const FullType(DateTime)) as DateTime?; - break; - case 'limit_privileges_to_course_section': - result.limitPrivilegesToCourseSection = serializers.deserialize(value, - specifiedType: const FullType(bool))! as bool; - break; - case 'observed_user': - result.observedUser.replace(serializers.deserialize(value, - specifiedType: const FullType(User))! as User); - break; - case 'user': - result.user.replace(serializers.deserialize(value, - specifiedType: const FullType(User))! as User); - break; - } - } - - return result.build(); - } -} - -class _$Enrollment extends Enrollment { - @override - final String? role; - @override - final String? type; - @override - final String id; - @override - final String? courseId; - @override - final String? courseSectionId; - @override - final String enrollmentState; - @override - final String userId; - @override - final Grade? grades; - @override - final double? computedCurrentScore; - @override - final double? computedFinalScore; - @override - final String? computedCurrentGrade; - @override - final String? computedFinalGrade; - @override - final String? computedCurrentLetterGrade; - @override - final bool multipleGradingPeriodsEnabled; - @override - final bool totalsForAllGradingPeriodsOption; - @override - final double? currentPeriodComputedCurrentScore; - @override - final double? currentPeriodComputedFinalScore; - @override - final String? currentPeriodComputedCurrentGrade; - @override - final String? currentPeriodComputedFinalGrade; - @override - final String? currentGradingPeriodId; - @override - final String? currentGradingPeriodTitle; - @override - final String associatedUserId; - @override - final DateTime? lastActivityAt; - @override - final bool limitPrivilegesToCourseSection; - @override - final User? observedUser; - @override - final User? user; - - factory _$Enrollment([void Function(EnrollmentBuilder)? updates]) => - (new EnrollmentBuilder()..update(updates))._build(); - - _$Enrollment._( - {this.role, - this.type, - required this.id, - this.courseId, - this.courseSectionId, - required this.enrollmentState, - required this.userId, - this.grades, - this.computedCurrentScore, - this.computedFinalScore, - this.computedCurrentGrade, - this.computedFinalGrade, - this.computedCurrentLetterGrade, - required this.multipleGradingPeriodsEnabled, - required this.totalsForAllGradingPeriodsOption, - this.currentPeriodComputedCurrentScore, - this.currentPeriodComputedFinalScore, - this.currentPeriodComputedCurrentGrade, - this.currentPeriodComputedFinalGrade, - this.currentGradingPeriodId, - this.currentGradingPeriodTitle, - required this.associatedUserId, - this.lastActivityAt, - required this.limitPrivilegesToCourseSection, - this.observedUser, - this.user}) - : super._() { - BuiltValueNullFieldError.checkNotNull(id, r'Enrollment', 'id'); - BuiltValueNullFieldError.checkNotNull( - enrollmentState, r'Enrollment', 'enrollmentState'); - BuiltValueNullFieldError.checkNotNull(userId, r'Enrollment', 'userId'); - BuiltValueNullFieldError.checkNotNull(multipleGradingPeriodsEnabled, - r'Enrollment', 'multipleGradingPeriodsEnabled'); - BuiltValueNullFieldError.checkNotNull(totalsForAllGradingPeriodsOption, - r'Enrollment', 'totalsForAllGradingPeriodsOption'); - BuiltValueNullFieldError.checkNotNull( - associatedUserId, r'Enrollment', 'associatedUserId'); - BuiltValueNullFieldError.checkNotNull(limitPrivilegesToCourseSection, - r'Enrollment', 'limitPrivilegesToCourseSection'); - } - - @override - Enrollment rebuild(void Function(EnrollmentBuilder) updates) => - (toBuilder()..update(updates)).build(); - - @override - EnrollmentBuilder toBuilder() => new EnrollmentBuilder()..replace(this); - - @override - bool operator ==(Object other) { - if (identical(other, this)) return true; - return other is Enrollment && - role == other.role && - type == other.type && - id == other.id && - courseId == other.courseId && - courseSectionId == other.courseSectionId && - enrollmentState == other.enrollmentState && - userId == other.userId && - grades == other.grades && - computedCurrentScore == other.computedCurrentScore && - computedFinalScore == other.computedFinalScore && - computedCurrentGrade == other.computedCurrentGrade && - computedFinalGrade == other.computedFinalGrade && - computedCurrentLetterGrade == other.computedCurrentLetterGrade && - multipleGradingPeriodsEnabled == other.multipleGradingPeriodsEnabled && - totalsForAllGradingPeriodsOption == - other.totalsForAllGradingPeriodsOption && - currentPeriodComputedCurrentScore == - other.currentPeriodComputedCurrentScore && - currentPeriodComputedFinalScore == - other.currentPeriodComputedFinalScore && - currentPeriodComputedCurrentGrade == - other.currentPeriodComputedCurrentGrade && - currentPeriodComputedFinalGrade == - other.currentPeriodComputedFinalGrade && - currentGradingPeriodId == other.currentGradingPeriodId && - currentGradingPeriodTitle == other.currentGradingPeriodTitle && - associatedUserId == other.associatedUserId && - lastActivityAt == other.lastActivityAt && - limitPrivilegesToCourseSection == - other.limitPrivilegesToCourseSection && - observedUser == other.observedUser && - user == other.user; - } - - @override - int get hashCode { - var _$hash = 0; - _$hash = $jc(_$hash, role.hashCode); - _$hash = $jc(_$hash, type.hashCode); - _$hash = $jc(_$hash, id.hashCode); - _$hash = $jc(_$hash, courseId.hashCode); - _$hash = $jc(_$hash, courseSectionId.hashCode); - _$hash = $jc(_$hash, enrollmentState.hashCode); - _$hash = $jc(_$hash, userId.hashCode); - _$hash = $jc(_$hash, grades.hashCode); - _$hash = $jc(_$hash, computedCurrentScore.hashCode); - _$hash = $jc(_$hash, computedFinalScore.hashCode); - _$hash = $jc(_$hash, computedCurrentGrade.hashCode); - _$hash = $jc(_$hash, computedFinalGrade.hashCode); - _$hash = $jc(_$hash, computedCurrentLetterGrade.hashCode); - _$hash = $jc(_$hash, multipleGradingPeriodsEnabled.hashCode); - _$hash = $jc(_$hash, totalsForAllGradingPeriodsOption.hashCode); - _$hash = $jc(_$hash, currentPeriodComputedCurrentScore.hashCode); - _$hash = $jc(_$hash, currentPeriodComputedFinalScore.hashCode); - _$hash = $jc(_$hash, currentPeriodComputedCurrentGrade.hashCode); - _$hash = $jc(_$hash, currentPeriodComputedFinalGrade.hashCode); - _$hash = $jc(_$hash, currentGradingPeriodId.hashCode); - _$hash = $jc(_$hash, currentGradingPeriodTitle.hashCode); - _$hash = $jc(_$hash, associatedUserId.hashCode); - _$hash = $jc(_$hash, lastActivityAt.hashCode); - _$hash = $jc(_$hash, limitPrivilegesToCourseSection.hashCode); - _$hash = $jc(_$hash, observedUser.hashCode); - _$hash = $jc(_$hash, user.hashCode); - _$hash = $jf(_$hash); - return _$hash; - } - - @override - String toString() { - return (newBuiltValueToStringHelper(r'Enrollment') - ..add('role', role) - ..add('type', type) - ..add('id', id) - ..add('courseId', courseId) - ..add('courseSectionId', courseSectionId) - ..add('enrollmentState', enrollmentState) - ..add('userId', userId) - ..add('grades', grades) - ..add('computedCurrentScore', computedCurrentScore) - ..add('computedFinalScore', computedFinalScore) - ..add('computedCurrentGrade', computedCurrentGrade) - ..add('computedFinalGrade', computedFinalGrade) - ..add('computedCurrentLetterGrade', computedCurrentLetterGrade) - ..add('multipleGradingPeriodsEnabled', multipleGradingPeriodsEnabled) - ..add('totalsForAllGradingPeriodsOption', - totalsForAllGradingPeriodsOption) - ..add('currentPeriodComputedCurrentScore', - currentPeriodComputedCurrentScore) - ..add('currentPeriodComputedFinalScore', - currentPeriodComputedFinalScore) - ..add('currentPeriodComputedCurrentGrade', - currentPeriodComputedCurrentGrade) - ..add('currentPeriodComputedFinalGrade', - currentPeriodComputedFinalGrade) - ..add('currentGradingPeriodId', currentGradingPeriodId) - ..add('currentGradingPeriodTitle', currentGradingPeriodTitle) - ..add('associatedUserId', associatedUserId) - ..add('lastActivityAt', lastActivityAt) - ..add( - 'limitPrivilegesToCourseSection', limitPrivilegesToCourseSection) - ..add('observedUser', observedUser) - ..add('user', user)) - .toString(); - } -} - -class EnrollmentBuilder implements Builder { - _$Enrollment? _$v; - - String? _role; - String? get role => _$this._role; - set role(String? role) => _$this._role = role; - - String? _type; - String? get type => _$this._type; - set type(String? type) => _$this._type = type; - - String? _id; - String? get id => _$this._id; - set id(String? id) => _$this._id = id; - - String? _courseId; - String? get courseId => _$this._courseId; - set courseId(String? courseId) => _$this._courseId = courseId; - - String? _courseSectionId; - String? get courseSectionId => _$this._courseSectionId; - set courseSectionId(String? courseSectionId) => - _$this._courseSectionId = courseSectionId; - - String? _enrollmentState; - String? get enrollmentState => _$this._enrollmentState; - set enrollmentState(String? enrollmentState) => - _$this._enrollmentState = enrollmentState; - - String? _userId; - String? get userId => _$this._userId; - set userId(String? userId) => _$this._userId = userId; - - GradeBuilder? _grades; - GradeBuilder get grades => _$this._grades ??= new GradeBuilder(); - set grades(GradeBuilder? grades) => _$this._grades = grades; - - double? _computedCurrentScore; - double? get computedCurrentScore => _$this._computedCurrentScore; - set computedCurrentScore(double? computedCurrentScore) => - _$this._computedCurrentScore = computedCurrentScore; - - double? _computedFinalScore; - double? get computedFinalScore => _$this._computedFinalScore; - set computedFinalScore(double? computedFinalScore) => - _$this._computedFinalScore = computedFinalScore; - - String? _computedCurrentGrade; - String? get computedCurrentGrade => _$this._computedCurrentGrade; - set computedCurrentGrade(String? computedCurrentGrade) => - _$this._computedCurrentGrade = computedCurrentGrade; - - String? _computedFinalGrade; - String? get computedFinalGrade => _$this._computedFinalGrade; - set computedFinalGrade(String? computedFinalGrade) => - _$this._computedFinalGrade = computedFinalGrade; - - String? _computedCurrentLetterGrade; - String? get computedCurrentLetterGrade => _$this._computedCurrentLetterGrade; - set computedCurrentLetterGrade(String? computedCurrentLetterGrade) => - _$this._computedCurrentLetterGrade = computedCurrentLetterGrade; - - bool? _multipleGradingPeriodsEnabled; - bool? get multipleGradingPeriodsEnabled => - _$this._multipleGradingPeriodsEnabled; - set multipleGradingPeriodsEnabled(bool? multipleGradingPeriodsEnabled) => - _$this._multipleGradingPeriodsEnabled = multipleGradingPeriodsEnabled; - - bool? _totalsForAllGradingPeriodsOption; - bool? get totalsForAllGradingPeriodsOption => - _$this._totalsForAllGradingPeriodsOption; - set totalsForAllGradingPeriodsOption( - bool? totalsForAllGradingPeriodsOption) => - _$this._totalsForAllGradingPeriodsOption = - totalsForAllGradingPeriodsOption; - - double? _currentPeriodComputedCurrentScore; - double? get currentPeriodComputedCurrentScore => - _$this._currentPeriodComputedCurrentScore; - set currentPeriodComputedCurrentScore( - double? currentPeriodComputedCurrentScore) => - _$this._currentPeriodComputedCurrentScore = - currentPeriodComputedCurrentScore; - - double? _currentPeriodComputedFinalScore; - double? get currentPeriodComputedFinalScore => - _$this._currentPeriodComputedFinalScore; - set currentPeriodComputedFinalScore( - double? currentPeriodComputedFinalScore) => - _$this._currentPeriodComputedFinalScore = currentPeriodComputedFinalScore; - - String? _currentPeriodComputedCurrentGrade; - String? get currentPeriodComputedCurrentGrade => - _$this._currentPeriodComputedCurrentGrade; - set currentPeriodComputedCurrentGrade( - String? currentPeriodComputedCurrentGrade) => - _$this._currentPeriodComputedCurrentGrade = - currentPeriodComputedCurrentGrade; - - String? _currentPeriodComputedFinalGrade; - String? get currentPeriodComputedFinalGrade => - _$this._currentPeriodComputedFinalGrade; - set currentPeriodComputedFinalGrade( - String? currentPeriodComputedFinalGrade) => - _$this._currentPeriodComputedFinalGrade = currentPeriodComputedFinalGrade; - - String? _currentGradingPeriodId; - String? get currentGradingPeriodId => _$this._currentGradingPeriodId; - set currentGradingPeriodId(String? currentGradingPeriodId) => - _$this._currentGradingPeriodId = currentGradingPeriodId; - - String? _currentGradingPeriodTitle; - String? get currentGradingPeriodTitle => _$this._currentGradingPeriodTitle; - set currentGradingPeriodTitle(String? currentGradingPeriodTitle) => - _$this._currentGradingPeriodTitle = currentGradingPeriodTitle; - - String? _associatedUserId; - String? get associatedUserId => _$this._associatedUserId; - set associatedUserId(String? associatedUserId) => - _$this._associatedUserId = associatedUserId; - - DateTime? _lastActivityAt; - DateTime? get lastActivityAt => _$this._lastActivityAt; - set lastActivityAt(DateTime? lastActivityAt) => - _$this._lastActivityAt = lastActivityAt; - - bool? _limitPrivilegesToCourseSection; - bool? get limitPrivilegesToCourseSection => - _$this._limitPrivilegesToCourseSection; - set limitPrivilegesToCourseSection(bool? limitPrivilegesToCourseSection) => - _$this._limitPrivilegesToCourseSection = limitPrivilegesToCourseSection; - - UserBuilder? _observedUser; - UserBuilder get observedUser => _$this._observedUser ??= new UserBuilder(); - set observedUser(UserBuilder? observedUser) => - _$this._observedUser = observedUser; - - UserBuilder? _user; - UserBuilder get user => _$this._user ??= new UserBuilder(); - set user(UserBuilder? user) => _$this._user = user; - - EnrollmentBuilder() { - Enrollment._initializeBuilder(this); - } - - EnrollmentBuilder get _$this { - final $v = _$v; - if ($v != null) { - _role = $v.role; - _type = $v.type; - _id = $v.id; - _courseId = $v.courseId; - _courseSectionId = $v.courseSectionId; - _enrollmentState = $v.enrollmentState; - _userId = $v.userId; - _grades = $v.grades?.toBuilder(); - _computedCurrentScore = $v.computedCurrentScore; - _computedFinalScore = $v.computedFinalScore; - _computedCurrentGrade = $v.computedCurrentGrade; - _computedFinalGrade = $v.computedFinalGrade; - _computedCurrentLetterGrade = $v.computedCurrentLetterGrade; - _multipleGradingPeriodsEnabled = $v.multipleGradingPeriodsEnabled; - _totalsForAllGradingPeriodsOption = $v.totalsForAllGradingPeriodsOption; - _currentPeriodComputedCurrentScore = $v.currentPeriodComputedCurrentScore; - _currentPeriodComputedFinalScore = $v.currentPeriodComputedFinalScore; - _currentPeriodComputedCurrentGrade = $v.currentPeriodComputedCurrentGrade; - _currentPeriodComputedFinalGrade = $v.currentPeriodComputedFinalGrade; - _currentGradingPeriodId = $v.currentGradingPeriodId; - _currentGradingPeriodTitle = $v.currentGradingPeriodTitle; - _associatedUserId = $v.associatedUserId; - _lastActivityAt = $v.lastActivityAt; - _limitPrivilegesToCourseSection = $v.limitPrivilegesToCourseSection; - _observedUser = $v.observedUser?.toBuilder(); - _user = $v.user?.toBuilder(); - _$v = null; - } - return this; - } - - @override - void replace(Enrollment other) { - ArgumentError.checkNotNull(other, 'other'); - _$v = other as _$Enrollment; - } - - @override - void update(void Function(EnrollmentBuilder)? updates) { - if (updates != null) updates(this); - } - - @override - Enrollment build() => _build(); - - _$Enrollment _build() { - _$Enrollment _$result; - try { - _$result = _$v ?? - new _$Enrollment._( - role: role, - type: type, - id: BuiltValueNullFieldError.checkNotNull( - id, r'Enrollment', 'id'), - courseId: courseId, - courseSectionId: courseSectionId, - enrollmentState: BuiltValueNullFieldError.checkNotNull( - enrollmentState, r'Enrollment', 'enrollmentState'), - userId: BuiltValueNullFieldError.checkNotNull( - userId, r'Enrollment', 'userId'), - grades: _grades?.build(), - computedCurrentScore: computedCurrentScore, - computedFinalScore: computedFinalScore, - computedCurrentGrade: computedCurrentGrade, - computedFinalGrade: computedFinalGrade, - computedCurrentLetterGrade: computedCurrentLetterGrade, - multipleGradingPeriodsEnabled: BuiltValueNullFieldError.checkNotNull( - multipleGradingPeriodsEnabled, r'Enrollment', 'multipleGradingPeriodsEnabled'), - totalsForAllGradingPeriodsOption: BuiltValueNullFieldError.checkNotNull( - totalsForAllGradingPeriodsOption, - r'Enrollment', - 'totalsForAllGradingPeriodsOption'), - currentPeriodComputedCurrentScore: - currentPeriodComputedCurrentScore, - currentPeriodComputedFinalScore: currentPeriodComputedFinalScore, - currentPeriodComputedCurrentGrade: - currentPeriodComputedCurrentGrade, - currentPeriodComputedFinalGrade: currentPeriodComputedFinalGrade, - currentGradingPeriodId: currentGradingPeriodId, - currentGradingPeriodTitle: currentGradingPeriodTitle, - associatedUserId: BuiltValueNullFieldError.checkNotNull( - associatedUserId, r'Enrollment', 'associatedUserId'), - lastActivityAt: lastActivityAt, - limitPrivilegesToCourseSection: BuiltValueNullFieldError.checkNotNull( - limitPrivilegesToCourseSection, r'Enrollment', 'limitPrivilegesToCourseSection'), - observedUser: _observedUser?.build(), - user: _user?.build()); - } catch (_) { - late String _$failedField; - try { - _$failedField = 'grades'; - _grades?.build(); - - _$failedField = 'observedUser'; - _observedUser?.build(); - _$failedField = 'user'; - _user?.build(); - } catch (e) { - throw new BuiltValueNestedFieldError( - r'Enrollment', _$failedField, e.toString()); - } - rethrow; - } - replace(_$result); - return _$result; - } -} - -// ignore_for_file: deprecated_member_use_from_same_package,type=lint diff --git a/apps/flutter_parent/lib/models/feature_flags.dart b/apps/flutter_parent/lib/models/feature_flags.dart deleted file mode 100644 index 4031b3f7f0..0000000000 --- a/apps/flutter_parent/lib/models/feature_flags.dart +++ /dev/null @@ -1,32 +0,0 @@ -// Copyright (C) 2023 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:built_value/built_value.dart'; -import 'package:built_value/serializer.dart'; - -part 'feature_flags.g.dart'; - -abstract class FeatureFlags implements Built { - - @BuiltValueSerializer(serializeNulls: true) // Add this line to get nulls to serialize when we convert to JSON - static Serializer get serializer => _$featureFlagsSerializer; - - @BuiltValueField(wireName: 'send_usage_metrics') - bool get sendUsageMetrics; - - FeatureFlags._(); - factory FeatureFlags([void Function(FeatureFlagsBuilder) updates]) = _$FeatureFlags; - - static void _initializeBuilder(FeatureFlagsBuilder b) => b..sendUsageMetrics = false; -} \ No newline at end of file diff --git a/apps/flutter_parent/lib/models/feature_flags.g.dart b/apps/flutter_parent/lib/models/feature_flags.g.dart deleted file mode 100644 index eb2ab7065e..0000000000 --- a/apps/flutter_parent/lib/models/feature_flags.g.dart +++ /dev/null @@ -1,140 +0,0 @@ -// GENERATED CODE - DO NOT MODIFY BY HAND - -part of 'feature_flags.dart'; - -// ************************************************************************** -// BuiltValueGenerator -// ************************************************************************** - -Serializer _$featureFlagsSerializer = - new _$FeatureFlagsSerializer(); - -class _$FeatureFlagsSerializer implements StructuredSerializer { - @override - final Iterable types = const [FeatureFlags, _$FeatureFlags]; - @override - final String wireName = 'FeatureFlags'; - - @override - Iterable serialize(Serializers serializers, FeatureFlags object, - {FullType specifiedType = FullType.unspecified}) { - final result = [ - 'send_usage_metrics', - serializers.serialize(object.sendUsageMetrics, - specifiedType: const FullType(bool)), - ]; - - return result; - } - - @override - FeatureFlags deserialize( - Serializers serializers, Iterable serialized, - {FullType specifiedType = FullType.unspecified}) { - final result = new FeatureFlagsBuilder(); - - final iterator = serialized.iterator; - while (iterator.moveNext()) { - final key = iterator.current! as String; - iterator.moveNext(); - final Object? value = iterator.current; - switch (key) { - case 'send_usage_metrics': - result.sendUsageMetrics = serializers.deserialize(value, - specifiedType: const FullType(bool))! as bool; - break; - } - } - - return result.build(); - } -} - -class _$FeatureFlags extends FeatureFlags { - @override - final bool sendUsageMetrics; - - factory _$FeatureFlags([void Function(FeatureFlagsBuilder)? updates]) => - (new FeatureFlagsBuilder()..update(updates))._build(); - - _$FeatureFlags._({required this.sendUsageMetrics}) : super._() { - BuiltValueNullFieldError.checkNotNull( - sendUsageMetrics, r'FeatureFlags', 'sendUsageMetrics'); - } - - @override - FeatureFlags rebuild(void Function(FeatureFlagsBuilder) updates) => - (toBuilder()..update(updates)).build(); - - @override - FeatureFlagsBuilder toBuilder() => new FeatureFlagsBuilder()..replace(this); - - @override - bool operator ==(Object other) { - if (identical(other, this)) return true; - return other is FeatureFlags && sendUsageMetrics == other.sendUsageMetrics; - } - - @override - int get hashCode { - var _$hash = 0; - _$hash = $jc(_$hash, sendUsageMetrics.hashCode); - _$hash = $jf(_$hash); - return _$hash; - } - - @override - String toString() { - return (newBuiltValueToStringHelper(r'FeatureFlags') - ..add('sendUsageMetrics', sendUsageMetrics)) - .toString(); - } -} - -class FeatureFlagsBuilder - implements Builder { - _$FeatureFlags? _$v; - - bool? _sendUsageMetrics; - bool? get sendUsageMetrics => _$this._sendUsageMetrics; - set sendUsageMetrics(bool? sendUsageMetrics) => - _$this._sendUsageMetrics = sendUsageMetrics; - - FeatureFlagsBuilder() { - FeatureFlags._initializeBuilder(this); - } - - FeatureFlagsBuilder get _$this { - final $v = _$v; - if ($v != null) { - _sendUsageMetrics = $v.sendUsageMetrics; - _$v = null; - } - return this; - } - - @override - void replace(FeatureFlags other) { - ArgumentError.checkNotNull(other, 'other'); - _$v = other as _$FeatureFlags; - } - - @override - void update(void Function(FeatureFlagsBuilder)? updates) { - if (updates != null) updates(this); - } - - @override - FeatureFlags build() => _build(); - - _$FeatureFlags _build() { - final _$result = _$v ?? - new _$FeatureFlags._( - sendUsageMetrics: BuiltValueNullFieldError.checkNotNull( - sendUsageMetrics, r'FeatureFlags', 'sendUsageMetrics')); - replace(_$result); - return _$result; - } -} - -// ignore_for_file: deprecated_member_use_from_same_package,type=lint diff --git a/apps/flutter_parent/lib/models/file_upload_config.dart b/apps/flutter_parent/lib/models/file_upload_config.dart deleted file mode 100644 index 1358d3b592..0000000000 --- a/apps/flutter_parent/lib/models/file_upload_config.dart +++ /dev/null @@ -1,35 +0,0 @@ -// Copyright (C) 2019 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:built_collection/built_collection.dart'; -import 'package:built_value/built_value.dart'; -import 'package:built_value/serializer.dart'; - -part 'file_upload_config.g.dart'; - -/// To have this built_value be generated, run this command from the project root: -/// flutter pub run build_runner build -abstract class FileUploadConfig implements Built { - @BuiltValueSerializer(serializeNulls: true) // Add this line to get nulls to serialize when we convert to JSON - static Serializer get serializer => _$fileUploadConfigSerializer; - - @BuiltValueField(wireName: 'upload_url') - String? get url; - - @BuiltValueField(wireName: 'upload_params') - BuiltMap? get params; - - FileUploadConfig._(); - factory FileUploadConfig([void Function(FileUploadConfigBuilder) updates]) = _$FileUploadConfig; -} diff --git a/apps/flutter_parent/lib/models/file_upload_config.g.dart b/apps/flutter_parent/lib/models/file_upload_config.g.dart deleted file mode 100644 index f2f498ccc9..0000000000 --- a/apps/flutter_parent/lib/models/file_upload_config.g.dart +++ /dev/null @@ -1,175 +0,0 @@ -// GENERATED CODE - DO NOT MODIFY BY HAND - -part of 'file_upload_config.dart'; - -// ************************************************************************** -// BuiltValueGenerator -// ************************************************************************** - -Serializer _$fileUploadConfigSerializer = - new _$FileUploadConfigSerializer(); - -class _$FileUploadConfigSerializer - implements StructuredSerializer { - @override - final Iterable types = const [FileUploadConfig, _$FileUploadConfig]; - @override - final String wireName = 'FileUploadConfig'; - - @override - Iterable serialize(Serializers serializers, FileUploadConfig object, - {FullType specifiedType = FullType.unspecified}) { - final result = []; - Object? value; - value = object.url; - - result - ..add('upload_url') - ..add( - serializers.serialize(value, specifiedType: const FullType(String))); - value = object.params; - - result - ..add('upload_params') - ..add(serializers.serialize(value, - specifiedType: const FullType(BuiltMap, - const [const FullType(String), const FullType(String)]))); - - return result; - } - - @override - FileUploadConfig deserialize( - Serializers serializers, Iterable serialized, - {FullType specifiedType = FullType.unspecified}) { - final result = new FileUploadConfigBuilder(); - - final iterator = serialized.iterator; - while (iterator.moveNext()) { - final key = iterator.current! as String; - iterator.moveNext(); - final Object? value = iterator.current; - switch (key) { - case 'upload_url': - result.url = serializers.deserialize(value, - specifiedType: const FullType(String)) as String?; - break; - case 'upload_params': - result.params.replace(serializers.deserialize(value, - specifiedType: const FullType(BuiltMap, - const [const FullType(String), const FullType(String)]))!); - break; - } - } - - return result.build(); - } -} - -class _$FileUploadConfig extends FileUploadConfig { - @override - final String? url; - @override - final BuiltMap? params; - - factory _$FileUploadConfig( - [void Function(FileUploadConfigBuilder)? updates]) => - (new FileUploadConfigBuilder()..update(updates))._build(); - - _$FileUploadConfig._({this.url, this.params}) : super._(); - - @override - FileUploadConfig rebuild(void Function(FileUploadConfigBuilder) updates) => - (toBuilder()..update(updates)).build(); - - @override - FileUploadConfigBuilder toBuilder() => - new FileUploadConfigBuilder()..replace(this); - - @override - bool operator ==(Object other) { - if (identical(other, this)) return true; - return other is FileUploadConfig && - url == other.url && - params == other.params; - } - - @override - int get hashCode { - var _$hash = 0; - _$hash = $jc(_$hash, url.hashCode); - _$hash = $jc(_$hash, params.hashCode); - _$hash = $jf(_$hash); - return _$hash; - } - - @override - String toString() { - return (newBuiltValueToStringHelper(r'FileUploadConfig') - ..add('url', url) - ..add('params', params)) - .toString(); - } -} - -class FileUploadConfigBuilder - implements Builder { - _$FileUploadConfig? _$v; - - String? _url; - String? get url => _$this._url; - set url(String? url) => _$this._url = url; - - MapBuilder? _params; - MapBuilder get params => - _$this._params ??= new MapBuilder(); - set params(MapBuilder? params) => _$this._params = params; - - FileUploadConfigBuilder(); - - FileUploadConfigBuilder get _$this { - final $v = _$v; - if ($v != null) { - _url = $v.url; - _params = $v.params?.toBuilder(); - _$v = null; - } - return this; - } - - @override - void replace(FileUploadConfig other) { - ArgumentError.checkNotNull(other, 'other'); - _$v = other as _$FileUploadConfig; - } - - @override - void update(void Function(FileUploadConfigBuilder)? updates) { - if (updates != null) updates(this); - } - - @override - FileUploadConfig build() => _build(); - - _$FileUploadConfig _build() { - _$FileUploadConfig _$result; - try { - _$result = - _$v ?? new _$FileUploadConfig._(url: url, params: _params?.build()); - } catch (_) { - late String _$failedField; - try { - _$failedField = 'params'; - _params?.build(); - } catch (e) { - throw new BuiltValueNestedFieldError( - r'FileUploadConfig', _$failedField, e.toString()); - } - rethrow; - } - replace(_$result); - return _$result; - } -} - -// ignore_for_file: deprecated_member_use_from_same_package,type=lint diff --git a/apps/flutter_parent/lib/models/grade.dart b/apps/flutter_parent/lib/models/grade.dart deleted file mode 100644 index 707e22495b..0000000000 --- a/apps/flutter_parent/lib/models/grade.dart +++ /dev/null @@ -1,42 +0,0 @@ -// Copyright (C) 2019 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -library grade; - -import 'package:built_value/built_value.dart'; -import 'package:built_value/serializer.dart'; - -part 'grade.g.dart'; - -abstract class Grade implements Built { - @BuiltValueSerializer(serializeNulls: true) - static Serializer get serializer => _$gradeSerializer; - - Grade._(); - factory Grade([void Function(GradeBuilder b) updates]) = _$Grade; - - @BuiltValueField(wireName: 'html_url') - String get htmlUrl; - - @BuiltValueField(wireName: 'current_score') - double? get currentScore; - - @BuiltValueField(wireName: 'final_score') - double? get finalScore; - - @BuiltValueField(wireName: 'current_grade') - String? get currentGrade; - - @BuiltValueField(wireName: 'final_grade') - String? get finalGrade; -} diff --git a/apps/flutter_parent/lib/models/grade.g.dart b/apps/flutter_parent/lib/models/grade.g.dart deleted file mode 100644 index 82caf078bc..0000000000 --- a/apps/flutter_parent/lib/models/grade.g.dart +++ /dev/null @@ -1,225 +0,0 @@ -// GENERATED CODE - DO NOT MODIFY BY HAND - -part of 'grade.dart'; - -// ************************************************************************** -// BuiltValueGenerator -// ************************************************************************** - -Serializer _$gradeSerializer = new _$GradeSerializer(); - -class _$GradeSerializer implements StructuredSerializer { - @override - final Iterable types = const [Grade, _$Grade]; - @override - final String wireName = 'Grade'; - - @override - Iterable serialize(Serializers serializers, Grade object, - {FullType specifiedType = FullType.unspecified}) { - final result = [ - 'html_url', - serializers.serialize(object.htmlUrl, - specifiedType: const FullType(String)), - ]; - Object? value; - value = object.currentScore; - - result - ..add('current_score') - ..add( - serializers.serialize(value, specifiedType: const FullType(double))); - value = object.finalScore; - - result - ..add('final_score') - ..add( - serializers.serialize(value, specifiedType: const FullType(double))); - value = object.currentGrade; - - result - ..add('current_grade') - ..add( - serializers.serialize(value, specifiedType: const FullType(String))); - value = object.finalGrade; - - result - ..add('final_grade') - ..add( - serializers.serialize(value, specifiedType: const FullType(String))); - - return result; - } - - @override - Grade deserialize(Serializers serializers, Iterable serialized, - {FullType specifiedType = FullType.unspecified}) { - final result = new GradeBuilder(); - - final iterator = serialized.iterator; - while (iterator.moveNext()) { - final key = iterator.current! as String; - iterator.moveNext(); - final Object? value = iterator.current; - switch (key) { - case 'html_url': - result.htmlUrl = serializers.deserialize(value, - specifiedType: const FullType(String))! as String; - break; - case 'current_score': - result.currentScore = serializers.deserialize(value, - specifiedType: const FullType(double)) as double?; - break; - case 'final_score': - result.finalScore = serializers.deserialize(value, - specifiedType: const FullType(double)) as double?; - break; - case 'current_grade': - result.currentGrade = serializers.deserialize(value, - specifiedType: const FullType(String)) as String?; - break; - case 'final_grade': - result.finalGrade = serializers.deserialize(value, - specifiedType: const FullType(String)) as String?; - break; - } - } - - return result.build(); - } -} - -class _$Grade extends Grade { - @override - final String htmlUrl; - @override - final double? currentScore; - @override - final double? finalScore; - @override - final String? currentGrade; - @override - final String? finalGrade; - - factory _$Grade([void Function(GradeBuilder)? updates]) => - (new GradeBuilder()..update(updates))._build(); - - _$Grade._( - {required this.htmlUrl, - this.currentScore, - this.finalScore, - this.currentGrade, - this.finalGrade}) - : super._() { - BuiltValueNullFieldError.checkNotNull(htmlUrl, r'Grade', 'htmlUrl'); - } - - @override - Grade rebuild(void Function(GradeBuilder) updates) => - (toBuilder()..update(updates)).build(); - - @override - GradeBuilder toBuilder() => new GradeBuilder()..replace(this); - - @override - bool operator ==(Object other) { - if (identical(other, this)) return true; - return other is Grade && - htmlUrl == other.htmlUrl && - currentScore == other.currentScore && - finalScore == other.finalScore && - currentGrade == other.currentGrade && - finalGrade == other.finalGrade; - } - - @override - int get hashCode { - var _$hash = 0; - _$hash = $jc(_$hash, htmlUrl.hashCode); - _$hash = $jc(_$hash, currentScore.hashCode); - _$hash = $jc(_$hash, finalScore.hashCode); - _$hash = $jc(_$hash, currentGrade.hashCode); - _$hash = $jc(_$hash, finalGrade.hashCode); - _$hash = $jf(_$hash); - return _$hash; - } - - @override - String toString() { - return (newBuiltValueToStringHelper(r'Grade') - ..add('htmlUrl', htmlUrl) - ..add('currentScore', currentScore) - ..add('finalScore', finalScore) - ..add('currentGrade', currentGrade) - ..add('finalGrade', finalGrade)) - .toString(); - } -} - -class GradeBuilder implements Builder { - _$Grade? _$v; - - String? _htmlUrl; - String? get htmlUrl => _$this._htmlUrl; - set htmlUrl(String? htmlUrl) => _$this._htmlUrl = htmlUrl; - - double? _currentScore; - double? get currentScore => _$this._currentScore; - set currentScore(double? currentScore) => _$this._currentScore = currentScore; - - double? _finalScore; - double? get finalScore => _$this._finalScore; - set finalScore(double? finalScore) => _$this._finalScore = finalScore; - - String? _currentGrade; - String? get currentGrade => _$this._currentGrade; - set currentGrade(String? currentGrade) => _$this._currentGrade = currentGrade; - - String? _finalGrade; - String? get finalGrade => _$this._finalGrade; - set finalGrade(String? finalGrade) => _$this._finalGrade = finalGrade; - - GradeBuilder(); - - GradeBuilder get _$this { - final $v = _$v; - if ($v != null) { - _htmlUrl = $v.htmlUrl; - _currentScore = $v.currentScore; - _finalScore = $v.finalScore; - _currentGrade = $v.currentGrade; - _finalGrade = $v.finalGrade; - _$v = null; - } - return this; - } - - @override - void replace(Grade other) { - ArgumentError.checkNotNull(other, 'other'); - _$v = other as _$Grade; - } - - @override - void update(void Function(GradeBuilder)? updates) { - if (updates != null) updates(this); - } - - @override - Grade build() => _build(); - - _$Grade _build() { - final _$result = _$v ?? - new _$Grade._( - htmlUrl: BuiltValueNullFieldError.checkNotNull( - htmlUrl, r'Grade', 'htmlUrl'), - currentScore: currentScore, - finalScore: finalScore, - currentGrade: currentGrade, - finalGrade: finalGrade); - replace(_$result); - return _$result; - } -} - -// ignore_for_file: deprecated_member_use_from_same_package,type=lint diff --git a/apps/flutter_parent/lib/models/grade_cell_data.dart b/apps/flutter_parent/lib/models/grade_cell_data.dart deleted file mode 100644 index f30b60241f..0000000000 --- a/apps/flutter_parent/lib/models/grade_cell_data.dart +++ /dev/null @@ -1,180 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:built_value/built_value.dart'; -import 'package:flutter/material.dart' hide Builder; -import 'package:flutter/rendering.dart'; -import 'package:flutter_parent/l10n/app_localizations.dart'; -import 'package:flutter_parent/models/course.dart'; -import 'package:flutter_parent/models/submission.dart'; -import 'package:flutter_parent/utils/core_extensions/date_time_extensions.dart'; -import 'package:flutter_parent/utils/design/parent_colors.dart'; -import 'package:intl/intl.dart'; - -import 'assignment.dart'; - -part 'grade_cell_data.g.dart'; - -/// To have this built_value be generated, run this command from the project root: -/// flutter pub run build_runner build -abstract class GradeCellData implements Built { - GradeCellState get state; - String get submissionText; - bool get showCompleteIcon; - bool get showIncompleteIcon; - bool get showPointsLabel; - Color get accentColor; - double get graphPercent; - String get score; - String get grade; - String get gradeContentDescription; - String get outOf; - String get yourGrade; - String get latePenalty; - String get finalGrade; - - GradeCellData._(); - factory GradeCellData([void Function(GradeCellDataBuilder) updates]) = _$GradeCellData; - - static void _initializeBuilder(GradeCellDataBuilder b) => b - ..state = GradeCellState.empty - ..submissionText = '' - ..showCompleteIcon = false - ..showIncompleteIcon = false - ..showPointsLabel = false - ..accentColor = Colors.grey - ..graphPercent = 0 - ..score = '' - ..grade = '' - ..gradeContentDescription = '' - ..outOf = '' - ..yourGrade = '' - ..latePenalty = '' - ..finalGrade = ''; - - static GradeCellData forSubmission( - Course? course, - Assignment? assignment, - Submission? submission, - ThemeData theme, - AppLocalizations l10n, - ) { - final excused = submission?.excused ?? false; - final restrictQuantitativeData = course?.settings?.restrictQuantitativeData ?? false; - - // Return empty state if null, unsubmitted and ungraded, or has a 'not graded' or restricted grading type - final restricted = restrictQuantitativeData && - assignment?.isGradingTypeQuantitative() == true && - (course?.gradingSchemeItems.isEmpty == true || assignment?.pointsPossible == 0) && - !excused; - - if (assignment == null || - submission == null || - (submission.submittedAt == null && !excused && submission.grade == null) || - assignment.gradingType == GradingType.notGraded || - restricted) { - return GradeCellData(); - } - - // Return submitted state if the submission has not been graded - if (submission.submittedAt != null && submission.grade == null && !excused) { - return GradeCellData((b) => b - ..state = GradeCellState.submitted - ..submissionText = submission.submittedAt!.l10nFormat( - l10n.submissionStatusSuccessSubtitle, - dateFormat: DateFormat.MMMMd(supportedDateLocale), - )); - } - - var accentColor = theme.colorScheme.secondary; - - var pointsPossibleText = NumberFormat.decimalPattern().format(assignment.pointsPossible); - - var outOfText = restrictQuantitativeData ? '' : l10n.outOfPoints(pointsPossibleText, assignment.pointsPossible); - - // Excused - if (submission.excused) { - return GradeCellData((b) => b - ..state = GradeCellState.graded - ..graphPercent = 1.0 - ..showCompleteIcon = true - ..accentColor = accentColor - ..grade = l10n.excused - ..outOf = outOfText); - } - - // Complete/Incomplete - if (assignment.gradingType == GradingType.passFail) { - var isComplete = (submission.grade == 'complete'); - return GradeCellData((b) => b - ..state = GradeCellState.graded - ..showCompleteIcon = isComplete - ..showIncompleteIcon = !isComplete - ..grade = isComplete ? l10n.gradeComplete : l10n.gradeIncomplete - ..accentColor = isComplete ? accentColor : ParentColors.ash - ..outOf = outOfText - ..graphPercent = 1.0); - } - - var score = NumberFormat.decimalPattern().format(submission.score); - var graphPercent = (submission.score / assignment.pointsPossible).clamp(0.0, 1.0); - - // If grading type is Points, don't show the grade since we're already showing it as the score - var grade = assignment.gradingType != GradingType.points ? submission.grade ?? '' : ''; - - if (restrictQuantitativeData && assignment.isGradingTypeQuantitative()) { - grade = course?.convertScoreToLetterGrade(submission.score, assignment.pointsPossible) ?? ''; - } - - // Screen reader fails on letter grades with a minus (e.g. 'A-'), so we replace the dash with the word 'minus' - var accessibleGradeString = grade.replaceAll('-', '. ${l10n.accessibilityMinus}'); - - var yourGrade = ''; - var latePenalty = ''; - var finalGrade = ''; - var restrictedScore = grade; - - // Adjust for late penalty, if any - if ((submission.pointsDeducted ?? 0.0) > 0.0) { - grade = ''; // Grade will be shown in the 'final grade' text - var pointsDeducted = NumberFormat.decimalPattern().format(submission.pointsDeducted ?? 0.0); - var pointsAchieved = NumberFormat.decimalPattern().format(submission.enteredScore); - yourGrade = l10n.yourGrade(pointsAchieved); - latePenalty = l10n.latePenaltyUpdated(pointsDeducted); - finalGrade = l10n.finalGrade(submission.grade ?? grade); - } - - return restrictQuantitativeData - ? GradeCellData((b) => b - ..state = GradeCellState.gradedRestrictQuantitativeData - ..graphPercent = 1.0 - ..accentColor = accentColor - ..score = restrictedScore - ..gradeContentDescription = accessibleGradeString) - : GradeCellData((b) => b - ..state = GradeCellState.graded - ..graphPercent = graphPercent - ..accentColor = accentColor - ..score = score - ..showPointsLabel = true - ..outOf = outOfText - ..grade = grade - ..gradeContentDescription = accessibleGradeString - ..yourGrade = yourGrade - ..latePenalty = latePenalty - ..finalGrade = finalGrade); - } -} - -enum GradeCellState { empty, submitted, graded, gradedRestrictQuantitativeData } diff --git a/apps/flutter_parent/lib/models/grade_cell_data.g.dart b/apps/flutter_parent/lib/models/grade_cell_data.g.dart deleted file mode 100644 index cdc0520063..0000000000 --- a/apps/flutter_parent/lib/models/grade_cell_data.g.dart +++ /dev/null @@ -1,288 +0,0 @@ -// GENERATED CODE - DO NOT MODIFY BY HAND - -part of 'grade_cell_data.dart'; - -// ************************************************************************** -// BuiltValueGenerator -// ************************************************************************** - -class _$GradeCellData extends GradeCellData { - @override - final GradeCellState state; - @override - final String submissionText; - @override - final bool showCompleteIcon; - @override - final bool showIncompleteIcon; - @override - final bool showPointsLabel; - @override - final Color accentColor; - @override - final double graphPercent; - @override - final String score; - @override - final String grade; - @override - final String gradeContentDescription; - @override - final String outOf; - @override - final String yourGrade; - @override - final String latePenalty; - @override - final String finalGrade; - - factory _$GradeCellData([void Function(GradeCellDataBuilder)? updates]) => - (new GradeCellDataBuilder()..update(updates))._build(); - - _$GradeCellData._( - {required this.state, - required this.submissionText, - required this.showCompleteIcon, - required this.showIncompleteIcon, - required this.showPointsLabel, - required this.accentColor, - required this.graphPercent, - required this.score, - required this.grade, - required this.gradeContentDescription, - required this.outOf, - required this.yourGrade, - required this.latePenalty, - required this.finalGrade}) - : super._() { - BuiltValueNullFieldError.checkNotNull(state, r'GradeCellData', 'state'); - BuiltValueNullFieldError.checkNotNull( - submissionText, r'GradeCellData', 'submissionText'); - BuiltValueNullFieldError.checkNotNull( - showCompleteIcon, r'GradeCellData', 'showCompleteIcon'); - BuiltValueNullFieldError.checkNotNull( - showIncompleteIcon, r'GradeCellData', 'showIncompleteIcon'); - BuiltValueNullFieldError.checkNotNull( - showPointsLabel, r'GradeCellData', 'showPointsLabel'); - BuiltValueNullFieldError.checkNotNull( - accentColor, r'GradeCellData', 'accentColor'); - BuiltValueNullFieldError.checkNotNull( - graphPercent, r'GradeCellData', 'graphPercent'); - BuiltValueNullFieldError.checkNotNull(score, r'GradeCellData', 'score'); - BuiltValueNullFieldError.checkNotNull(grade, r'GradeCellData', 'grade'); - BuiltValueNullFieldError.checkNotNull( - gradeContentDescription, r'GradeCellData', 'gradeContentDescription'); - BuiltValueNullFieldError.checkNotNull(outOf, r'GradeCellData', 'outOf'); - BuiltValueNullFieldError.checkNotNull( - yourGrade, r'GradeCellData', 'yourGrade'); - BuiltValueNullFieldError.checkNotNull( - latePenalty, r'GradeCellData', 'latePenalty'); - BuiltValueNullFieldError.checkNotNull( - finalGrade, r'GradeCellData', 'finalGrade'); - } - - @override - GradeCellData rebuild(void Function(GradeCellDataBuilder) updates) => - (toBuilder()..update(updates)).build(); - - @override - GradeCellDataBuilder toBuilder() => new GradeCellDataBuilder()..replace(this); - - @override - bool operator ==(Object other) { - if (identical(other, this)) return true; - return other is GradeCellData && - state == other.state && - submissionText == other.submissionText && - showCompleteIcon == other.showCompleteIcon && - showIncompleteIcon == other.showIncompleteIcon && - showPointsLabel == other.showPointsLabel && - accentColor == other.accentColor && - graphPercent == other.graphPercent && - score == other.score && - grade == other.grade && - gradeContentDescription == other.gradeContentDescription && - outOf == other.outOf && - yourGrade == other.yourGrade && - latePenalty == other.latePenalty && - finalGrade == other.finalGrade; - } - - @override - int get hashCode { - var _$hash = 0; - _$hash = $jc(_$hash, state.hashCode); - _$hash = $jc(_$hash, submissionText.hashCode); - _$hash = $jc(_$hash, showCompleteIcon.hashCode); - _$hash = $jc(_$hash, showIncompleteIcon.hashCode); - _$hash = $jc(_$hash, showPointsLabel.hashCode); - _$hash = $jc(_$hash, accentColor.hashCode); - _$hash = $jc(_$hash, graphPercent.hashCode); - _$hash = $jc(_$hash, score.hashCode); - _$hash = $jc(_$hash, grade.hashCode); - _$hash = $jc(_$hash, gradeContentDescription.hashCode); - _$hash = $jc(_$hash, outOf.hashCode); - _$hash = $jc(_$hash, yourGrade.hashCode); - _$hash = $jc(_$hash, latePenalty.hashCode); - _$hash = $jc(_$hash, finalGrade.hashCode); - _$hash = $jf(_$hash); - return _$hash; - } - - @override - String toString() { - return (newBuiltValueToStringHelper(r'GradeCellData') - ..add('state', state) - ..add('submissionText', submissionText) - ..add('showCompleteIcon', showCompleteIcon) - ..add('showIncompleteIcon', showIncompleteIcon) - ..add('showPointsLabel', showPointsLabel) - ..add('accentColor', accentColor) - ..add('graphPercent', graphPercent) - ..add('score', score) - ..add('grade', grade) - ..add('gradeContentDescription', gradeContentDescription) - ..add('outOf', outOf) - ..add('yourGrade', yourGrade) - ..add('latePenalty', latePenalty) - ..add('finalGrade', finalGrade)) - .toString(); - } -} - -class GradeCellDataBuilder - implements Builder { - _$GradeCellData? _$v; - - GradeCellState? _state; - GradeCellState? get state => _$this._state; - set state(GradeCellState? state) => _$this._state = state; - - String? _submissionText; - String? get submissionText => _$this._submissionText; - set submissionText(String? submissionText) => - _$this._submissionText = submissionText; - - bool? _showCompleteIcon; - bool? get showCompleteIcon => _$this._showCompleteIcon; - set showCompleteIcon(bool? showCompleteIcon) => - _$this._showCompleteIcon = showCompleteIcon; - - bool? _showIncompleteIcon; - bool? get showIncompleteIcon => _$this._showIncompleteIcon; - set showIncompleteIcon(bool? showIncompleteIcon) => - _$this._showIncompleteIcon = showIncompleteIcon; - - bool? _showPointsLabel; - bool? get showPointsLabel => _$this._showPointsLabel; - set showPointsLabel(bool? showPointsLabel) => - _$this._showPointsLabel = showPointsLabel; - - Color? _accentColor; - Color? get accentColor => _$this._accentColor; - set accentColor(Color? accentColor) => _$this._accentColor = accentColor; - - double? _graphPercent; - double? get graphPercent => _$this._graphPercent; - set graphPercent(double? graphPercent) => _$this._graphPercent = graphPercent; - - String? _score; - String? get score => _$this._score; - set score(String? score) => _$this._score = score; - - String? _grade; - String? get grade => _$this._grade; - set grade(String? grade) => _$this._grade = grade; - - String? _gradeContentDescription; - String? get gradeContentDescription => _$this._gradeContentDescription; - set gradeContentDescription(String? gradeContentDescription) => - _$this._gradeContentDescription = gradeContentDescription; - - String? _outOf; - String? get outOf => _$this._outOf; - set outOf(String? outOf) => _$this._outOf = outOf; - - String? _yourGrade; - String? get yourGrade => _$this._yourGrade; - set yourGrade(String? yourGrade) => _$this._yourGrade = yourGrade; - - String? _latePenalty; - String? get latePenalty => _$this._latePenalty; - set latePenalty(String? latePenalty) => _$this._latePenalty = latePenalty; - - String? _finalGrade; - String? get finalGrade => _$this._finalGrade; - set finalGrade(String? finalGrade) => _$this._finalGrade = finalGrade; - - GradeCellDataBuilder() { - GradeCellData._initializeBuilder(this); - } - - GradeCellDataBuilder get _$this { - final $v = _$v; - if ($v != null) { - _state = $v.state; - _submissionText = $v.submissionText; - _showCompleteIcon = $v.showCompleteIcon; - _showIncompleteIcon = $v.showIncompleteIcon; - _showPointsLabel = $v.showPointsLabel; - _accentColor = $v.accentColor; - _graphPercent = $v.graphPercent; - _score = $v.score; - _grade = $v.grade; - _gradeContentDescription = $v.gradeContentDescription; - _outOf = $v.outOf; - _yourGrade = $v.yourGrade; - _latePenalty = $v.latePenalty; - _finalGrade = $v.finalGrade; - _$v = null; - } - return this; - } - - @override - void replace(GradeCellData other) { - ArgumentError.checkNotNull(other, 'other'); - _$v = other as _$GradeCellData; - } - - @override - void update(void Function(GradeCellDataBuilder)? updates) { - if (updates != null) updates(this); - } - - @override - GradeCellData build() => _build(); - - _$GradeCellData _build() { - final _$result = _$v ?? - new _$GradeCellData._( - state: BuiltValueNullFieldError.checkNotNull( - state, r'GradeCellData', 'state'), - submissionText: BuiltValueNullFieldError.checkNotNull( - submissionText, r'GradeCellData', 'submissionText'), - showCompleteIcon: BuiltValueNullFieldError.checkNotNull( - showCompleteIcon, r'GradeCellData', 'showCompleteIcon'), - showIncompleteIcon: BuiltValueNullFieldError.checkNotNull( - showIncompleteIcon, r'GradeCellData', 'showIncompleteIcon'), - showPointsLabel: BuiltValueNullFieldError.checkNotNull( - showPointsLabel, r'GradeCellData', 'showPointsLabel'), - accentColor: BuiltValueNullFieldError.checkNotNull( - accentColor, r'GradeCellData', 'accentColor'), - graphPercent: BuiltValueNullFieldError.checkNotNull( - graphPercent, r'GradeCellData', 'graphPercent'), - score: BuiltValueNullFieldError.checkNotNull( - score, r'GradeCellData', 'score'), - grade: BuiltValueNullFieldError.checkNotNull(grade, r'GradeCellData', 'grade'), - gradeContentDescription: BuiltValueNullFieldError.checkNotNull(gradeContentDescription, r'GradeCellData', 'gradeContentDescription'), - outOf: BuiltValueNullFieldError.checkNotNull(outOf, r'GradeCellData', 'outOf'), - yourGrade: BuiltValueNullFieldError.checkNotNull(yourGrade, r'GradeCellData', 'yourGrade'), - latePenalty: BuiltValueNullFieldError.checkNotNull(latePenalty, r'GradeCellData', 'latePenalty'), - finalGrade: BuiltValueNullFieldError.checkNotNull(finalGrade, r'GradeCellData', 'finalGrade')); - replace(_$result); - return _$result; - } -} - -// ignore_for_file: deprecated_member_use_from_same_package,type=lint diff --git a/apps/flutter_parent/lib/models/grading_period.dart b/apps/flutter_parent/lib/models/grading_period.dart deleted file mode 100644 index 7c0a160dd0..0000000000 --- a/apps/flutter_parent/lib/models/grading_period.dart +++ /dev/null @@ -1,40 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -import 'package:built_value/built_value.dart'; -import 'package:built_value/serializer.dart'; - -part 'grading_period.g.dart'; - -/// To have this built_value be generated, run this command from the project root: -/// flutter packages pub run build_runner build --delete-conflicting-outputs -abstract class GradingPeriod implements Built { - @BuiltValueSerializer(serializeNulls: true) // Add this line to get nulls to serialize when we convert to JSON - static Serializer get serializer => _$gradingPeriodSerializer; - - GradingPeriod._(); - - factory GradingPeriod([void Function(GradingPeriodBuilder) updates]) = _$GradingPeriod; - - String? get id; - - String? get title; - - @BuiltValueField(wireName: 'start_date') - DateTime? get startDate; - - @BuiltValueField(wireName: 'end_date') - DateTime? get endDate; - - double? get weight; -} diff --git a/apps/flutter_parent/lib/models/grading_period.g.dart b/apps/flutter_parent/lib/models/grading_period.g.dart deleted file mode 100644 index 4cffaa97cb..0000000000 --- a/apps/flutter_parent/lib/models/grading_period.g.dart +++ /dev/null @@ -1,223 +0,0 @@ -// GENERATED CODE - DO NOT MODIFY BY HAND - -part of 'grading_period.dart'; - -// ************************************************************************** -// BuiltValueGenerator -// ************************************************************************** - -Serializer _$gradingPeriodSerializer = - new _$GradingPeriodSerializer(); - -class _$GradingPeriodSerializer implements StructuredSerializer { - @override - final Iterable types = const [GradingPeriod, _$GradingPeriod]; - @override - final String wireName = 'GradingPeriod'; - - @override - Iterable serialize(Serializers serializers, GradingPeriod object, - {FullType specifiedType = FullType.unspecified}) { - final result = []; - Object? value; - value = object.id; - - result - ..add('id') - ..add( - serializers.serialize(value, specifiedType: const FullType(String))); - value = object.title; - - result - ..add('title') - ..add( - serializers.serialize(value, specifiedType: const FullType(String))); - value = object.startDate; - - result - ..add('start_date') - ..add(serializers.serialize(value, - specifiedType: const FullType(DateTime))); - value = object.endDate; - - result - ..add('end_date') - ..add(serializers.serialize(value, - specifiedType: const FullType(DateTime))); - value = object.weight; - - result - ..add('weight') - ..add( - serializers.serialize(value, specifiedType: const FullType(double))); - - return result; - } - - @override - GradingPeriod deserialize( - Serializers serializers, Iterable serialized, - {FullType specifiedType = FullType.unspecified}) { - final result = new GradingPeriodBuilder(); - - final iterator = serialized.iterator; - while (iterator.moveNext()) { - final key = iterator.current! as String; - iterator.moveNext(); - final Object? value = iterator.current; - switch (key) { - case 'id': - result.id = serializers.deserialize(value, - specifiedType: const FullType(String)) as String?; - break; - case 'title': - result.title = serializers.deserialize(value, - specifiedType: const FullType(String)) as String?; - break; - case 'start_date': - result.startDate = serializers.deserialize(value, - specifiedType: const FullType(DateTime)) as DateTime?; - break; - case 'end_date': - result.endDate = serializers.deserialize(value, - specifiedType: const FullType(DateTime)) as DateTime?; - break; - case 'weight': - result.weight = serializers.deserialize(value, - specifiedType: const FullType(double)) as double?; - break; - } - } - - return result.build(); - } -} - -class _$GradingPeriod extends GradingPeriod { - @override - final String? id; - @override - final String? title; - @override - final DateTime? startDate; - @override - final DateTime? endDate; - @override - final double? weight; - - factory _$GradingPeriod([void Function(GradingPeriodBuilder)? updates]) => - (new GradingPeriodBuilder()..update(updates))._build(); - - _$GradingPeriod._( - {this.id, this.title, this.startDate, this.endDate, this.weight}) - : super._(); - - @override - GradingPeriod rebuild(void Function(GradingPeriodBuilder) updates) => - (toBuilder()..update(updates)).build(); - - @override - GradingPeriodBuilder toBuilder() => new GradingPeriodBuilder()..replace(this); - - @override - bool operator ==(Object other) { - if (identical(other, this)) return true; - return other is GradingPeriod && - id == other.id && - title == other.title && - startDate == other.startDate && - endDate == other.endDate && - weight == other.weight; - } - - @override - int get hashCode { - var _$hash = 0; - _$hash = $jc(_$hash, id.hashCode); - _$hash = $jc(_$hash, title.hashCode); - _$hash = $jc(_$hash, startDate.hashCode); - _$hash = $jc(_$hash, endDate.hashCode); - _$hash = $jc(_$hash, weight.hashCode); - _$hash = $jf(_$hash); - return _$hash; - } - - @override - String toString() { - return (newBuiltValueToStringHelper(r'GradingPeriod') - ..add('id', id) - ..add('title', title) - ..add('startDate', startDate) - ..add('endDate', endDate) - ..add('weight', weight)) - .toString(); - } -} - -class GradingPeriodBuilder - implements Builder { - _$GradingPeriod? _$v; - - String? _id; - String? get id => _$this._id; - set id(String? id) => _$this._id = id; - - String? _title; - String? get title => _$this._title; - set title(String? title) => _$this._title = title; - - DateTime? _startDate; - DateTime? get startDate => _$this._startDate; - set startDate(DateTime? startDate) => _$this._startDate = startDate; - - DateTime? _endDate; - DateTime? get endDate => _$this._endDate; - set endDate(DateTime? endDate) => _$this._endDate = endDate; - - double? _weight; - double? get weight => _$this._weight; - set weight(double? weight) => _$this._weight = weight; - - GradingPeriodBuilder(); - - GradingPeriodBuilder get _$this { - final $v = _$v; - if ($v != null) { - _id = $v.id; - _title = $v.title; - _startDate = $v.startDate; - _endDate = $v.endDate; - _weight = $v.weight; - _$v = null; - } - return this; - } - - @override - void replace(GradingPeriod other) { - ArgumentError.checkNotNull(other, 'other'); - _$v = other as _$GradingPeriod; - } - - @override - void update(void Function(GradingPeriodBuilder)? updates) { - if (updates != null) updates(this); - } - - @override - GradingPeriod build() => _build(); - - _$GradingPeriod _build() { - final _$result = _$v ?? - new _$GradingPeriod._( - id: id, - title: title, - startDate: startDate, - endDate: endDate, - weight: weight); - replace(_$result); - return _$result; - } -} - -// ignore_for_file: deprecated_member_use_from_same_package,type=lint diff --git a/apps/flutter_parent/lib/models/grading_period_response.dart b/apps/flutter_parent/lib/models/grading_period_response.dart deleted file mode 100644 index ee7cfbce11..0000000000 --- a/apps/flutter_parent/lib/models/grading_period_response.dart +++ /dev/null @@ -1,33 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -import 'package:built_collection/built_collection.dart'; -import 'package:built_value/built_value.dart'; -import 'package:built_value/serializer.dart'; -import 'package:flutter_parent/models/grading_period.dart'; - -part 'grading_period_response.g.dart'; - -/// To have this built_value be generated, run this command from the project root: -/// flutter packages pub run build_runner build --delete-conflicting-outputs -abstract class GradingPeriodResponse implements Built { - @BuiltValueSerializer(serializeNulls: true) // Add this line to get nulls to serialize when we convert to JSON - static Serializer get serializer => _$gradingPeriodResponseSerializer; - - GradingPeriodResponse._(); - - factory GradingPeriodResponse([void Function(GradingPeriodResponseBuilder) updates]) = _$GradingPeriodResponse; - - @BuiltValueField(wireName: 'grading_periods') - BuiltList get gradingPeriods; -} diff --git a/apps/flutter_parent/lib/models/grading_period_response.g.dart b/apps/flutter_parent/lib/models/grading_period_response.g.dart deleted file mode 100644 index d68204168e..0000000000 --- a/apps/flutter_parent/lib/models/grading_period_response.g.dart +++ /dev/null @@ -1,162 +0,0 @@ -// GENERATED CODE - DO NOT MODIFY BY HAND - -part of 'grading_period_response.dart'; - -// ************************************************************************** -// BuiltValueGenerator -// ************************************************************************** - -Serializer _$gradingPeriodResponseSerializer = - new _$GradingPeriodResponseSerializer(); - -class _$GradingPeriodResponseSerializer - implements StructuredSerializer { - @override - final Iterable types = const [ - GradingPeriodResponse, - _$GradingPeriodResponse - ]; - @override - final String wireName = 'GradingPeriodResponse'; - - @override - Iterable serialize( - Serializers serializers, GradingPeriodResponse object, - {FullType specifiedType = FullType.unspecified}) { - final result = [ - 'grading_periods', - serializers.serialize(object.gradingPeriods, - specifiedType: - const FullType(BuiltList, const [const FullType(GradingPeriod)])), - ]; - - return result; - } - - @override - GradingPeriodResponse deserialize( - Serializers serializers, Iterable serialized, - {FullType specifiedType = FullType.unspecified}) { - final result = new GradingPeriodResponseBuilder(); - - final iterator = serialized.iterator; - while (iterator.moveNext()) { - final key = iterator.current! as String; - iterator.moveNext(); - final Object? value = iterator.current; - switch (key) { - case 'grading_periods': - result.gradingPeriods.replace(serializers.deserialize(value, - specifiedType: const FullType( - BuiltList, const [const FullType(GradingPeriod)]))! - as BuiltList); - break; - } - } - - return result.build(); - } -} - -class _$GradingPeriodResponse extends GradingPeriodResponse { - @override - final BuiltList gradingPeriods; - - factory _$GradingPeriodResponse( - [void Function(GradingPeriodResponseBuilder)? updates]) => - (new GradingPeriodResponseBuilder()..update(updates))._build(); - - _$GradingPeriodResponse._({required this.gradingPeriods}) : super._() { - BuiltValueNullFieldError.checkNotNull( - gradingPeriods, r'GradingPeriodResponse', 'gradingPeriods'); - } - - @override - GradingPeriodResponse rebuild( - void Function(GradingPeriodResponseBuilder) updates) => - (toBuilder()..update(updates)).build(); - - @override - GradingPeriodResponseBuilder toBuilder() => - new GradingPeriodResponseBuilder()..replace(this); - - @override - bool operator ==(Object other) { - if (identical(other, this)) return true; - return other is GradingPeriodResponse && - gradingPeriods == other.gradingPeriods; - } - - @override - int get hashCode { - var _$hash = 0; - _$hash = $jc(_$hash, gradingPeriods.hashCode); - _$hash = $jf(_$hash); - return _$hash; - } - - @override - String toString() { - return (newBuiltValueToStringHelper(r'GradingPeriodResponse') - ..add('gradingPeriods', gradingPeriods)) - .toString(); - } -} - -class GradingPeriodResponseBuilder - implements Builder { - _$GradingPeriodResponse? _$v; - - ListBuilder? _gradingPeriods; - ListBuilder get gradingPeriods => - _$this._gradingPeriods ??= new ListBuilder(); - set gradingPeriods(ListBuilder? gradingPeriods) => - _$this._gradingPeriods = gradingPeriods; - - GradingPeriodResponseBuilder(); - - GradingPeriodResponseBuilder get _$this { - final $v = _$v; - if ($v != null) { - _gradingPeriods = $v.gradingPeriods.toBuilder(); - _$v = null; - } - return this; - } - - @override - void replace(GradingPeriodResponse other) { - ArgumentError.checkNotNull(other, 'other'); - _$v = other as _$GradingPeriodResponse; - } - - @override - void update(void Function(GradingPeriodResponseBuilder)? updates) { - if (updates != null) updates(this); - } - - @override - GradingPeriodResponse build() => _build(); - - _$GradingPeriodResponse _build() { - _$GradingPeriodResponse _$result; - try { - _$result = _$v ?? - new _$GradingPeriodResponse._(gradingPeriods: gradingPeriods.build()); - } catch (_) { - late String _$failedField; - try { - _$failedField = 'gradingPeriods'; - gradingPeriods.build(); - } catch (e) { - throw new BuiltValueNestedFieldError( - r'GradingPeriodResponse', _$failedField, e.toString()); - } - rethrow; - } - replace(_$result); - return _$result; - } -} - -// ignore_for_file: deprecated_member_use_from_same_package,type=lint diff --git a/apps/flutter_parent/lib/models/grading_scheme_item.dart b/apps/flutter_parent/lib/models/grading_scheme_item.dart deleted file mode 100644 index 477f8508d8..0000000000 --- a/apps/flutter_parent/lib/models/grading_scheme_item.dart +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Copyright (C) 2023 - present Instructure, Inc. - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, version 3 of the License. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -import 'package:built_value/built_value.dart'; -import 'package:built_value/json_object.dart'; -import 'package:built_value/serializer.dart'; - -part 'grading_scheme_item.g.dart'; - -abstract class GradingSchemeItem implements Built { - static Serializer get serializer => _$gradingSchemeItemSerializer; - - GradingSchemeItem._(); - - factory GradingSchemeItem([void Function(GradingSchemeItemBuilder) updates]) = _$GradingSchemeItem; - - factory GradingSchemeItem.fromJson(JsonObject json) { - var emptyGradingSchemeItem = GradingSchemeItem((b) => b - ..grade = null - ..value = null); - if (!json.isList) return emptyGradingSchemeItem; - List items = json.asList; - if (!(items[0] is String) || !(items[1] is num)) return emptyGradingSchemeItem; - String grade = items[0] as String; - double value = (items[1] as num).toDouble(); - return GradingSchemeItem((b) => b - ..grade = grade - ..value = value); - } - - String? get grade; - - double? get value; -} diff --git a/apps/flutter_parent/lib/models/grading_scheme_item.g.dart b/apps/flutter_parent/lib/models/grading_scheme_item.g.dart deleted file mode 100644 index a17a4d23de..0000000000 --- a/apps/flutter_parent/lib/models/grading_scheme_item.g.dart +++ /dev/null @@ -1,160 +0,0 @@ -// GENERATED CODE - DO NOT MODIFY BY HAND - -part of 'grading_scheme_item.dart'; - -// ************************************************************************** -// BuiltValueGenerator -// ************************************************************************** - -Serializer _$gradingSchemeItemSerializer = - new _$GradingSchemeItemSerializer(); - -class _$GradingSchemeItemSerializer - implements StructuredSerializer { - @override - final Iterable types = const [GradingSchemeItem, _$GradingSchemeItem]; - @override - final String wireName = 'GradingSchemeItem'; - - @override - Iterable serialize(Serializers serializers, GradingSchemeItem object, - {FullType specifiedType = FullType.unspecified}) { - final result = []; - Object? value; - value = object.grade; - if (value != null) { - result - ..add('grade') - ..add(serializers.serialize(value, - specifiedType: const FullType(String))); - } - value = object.value; - if (value != null) { - result - ..add('value') - ..add(serializers.serialize(value, - specifiedType: const FullType(double))); - } - return result; - } - - @override - GradingSchemeItem deserialize( - Serializers serializers, Iterable serialized, - {FullType specifiedType = FullType.unspecified}) { - final result = new GradingSchemeItemBuilder(); - - final iterator = serialized.iterator; - while (iterator.moveNext()) { - final key = iterator.current! as String; - iterator.moveNext(); - final Object? value = iterator.current; - switch (key) { - case 'grade': - result.grade = serializers.deserialize(value, - specifiedType: const FullType(String)) as String?; - break; - case 'value': - result.value = serializers.deserialize(value, - specifiedType: const FullType(double)) as double?; - break; - } - } - - return result.build(); - } -} - -class _$GradingSchemeItem extends GradingSchemeItem { - @override - final String? grade; - @override - final double? value; - - factory _$GradingSchemeItem( - [void Function(GradingSchemeItemBuilder)? updates]) => - (new GradingSchemeItemBuilder()..update(updates))._build(); - - _$GradingSchemeItem._({this.grade, this.value}) : super._(); - - @override - GradingSchemeItem rebuild(void Function(GradingSchemeItemBuilder) updates) => - (toBuilder()..update(updates)).build(); - - @override - GradingSchemeItemBuilder toBuilder() => - new GradingSchemeItemBuilder()..replace(this); - - @override - bool operator ==(Object other) { - if (identical(other, this)) return true; - return other is GradingSchemeItem && - grade == other.grade && - value == other.value; - } - - @override - int get hashCode { - var _$hash = 0; - _$hash = $jc(_$hash, grade.hashCode); - _$hash = $jc(_$hash, value.hashCode); - _$hash = $jf(_$hash); - return _$hash; - } - - @override - String toString() { - return (newBuiltValueToStringHelper(r'GradingSchemeItem') - ..add('grade', grade) - ..add('value', value)) - .toString(); - } -} - -class GradingSchemeItemBuilder - implements Builder { - _$GradingSchemeItem? _$v; - - String? _grade; - String? get grade => _$this._grade; - set grade(String? grade) => _$this._grade = grade; - - double? _value; - double? get value => _$this._value; - set value(double? value) => _$this._value = value; - - GradingSchemeItemBuilder(); - - GradingSchemeItemBuilder get _$this { - final $v = _$v; - if ($v != null) { - _grade = $v.grade; - _value = $v.value; - _$v = null; - } - return this; - } - - @override - void replace(GradingSchemeItem other) { - ArgumentError.checkNotNull(other, 'other'); - _$v = other as _$GradingSchemeItem; - } - - @override - void update(void Function(GradingSchemeItemBuilder)? updates) { - if (updates != null) updates(this); - } - - @override - GradingSchemeItem build() => _build(); - - _$GradingSchemeItem _build() { - final _$result = - _$v ?? new _$GradingSchemeItem._(grade: grade, value: value); - replace(_$result); - return _$result; - } -} - -// ignore_for_file: deprecated_member_use_from_same_package,type=lint diff --git a/apps/flutter_parent/lib/models/help_link.dart b/apps/flutter_parent/lib/models/help_link.dart deleted file mode 100644 index af8241783a..0000000000 --- a/apps/flutter_parent/lib/models/help_link.dart +++ /dev/null @@ -1,59 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:built_collection/built_collection.dart'; -import 'package:built_value/built_value.dart'; -import 'package:built_value/serializer.dart'; - -part 'help_link.g.dart'; - -/// To have this built_value be generated, run this command from the project root: -/// flutter packages pub run build_runner build --delete-conflicting-outputs -abstract class HelpLink implements Built { - @BuiltValueSerializer(serializeNulls: true) // Add this line to get nulls to serialize when we convert to JSON - static Serializer get serializer => _$helpLinkSerializer; - - HelpLink._(); - - factory HelpLink([void Function(HelpLinkBuilder) updates]) = _$HelpLink; - - String? get id; - - String get type; - - @BuiltValueField(wireName: 'available_to') - BuiltList get availableTo; - - String? get url; - - String? get text; - - String? get subtext; -} - -class AvailableTo extends EnumClass { - static Serializer get serializer => _$availableToSerializer; - - static const AvailableTo user = _$user; - static const AvailableTo student = _$student; - static const AvailableTo teacher = _$teacher; - static const AvailableTo admin = _$admin; - static const AvailableTo observer = _$observer; - static const AvailableTo unenrolled = _$unenrolled; - - const AvailableTo._(String name) : super(name); - - static BuiltSet get values => _$atValues; - static AvailableTo valueOf(String name) => _$atValueOf(name); -} diff --git a/apps/flutter_parent/lib/models/help_link.g.dart b/apps/flutter_parent/lib/models/help_link.g.dart deleted file mode 100644 index e9bd162ddf..0000000000 --- a/apps/flutter_parent/lib/models/help_link.g.dart +++ /dev/null @@ -1,317 +0,0 @@ -// GENERATED CODE - DO NOT MODIFY BY HAND - -part of 'help_link.dart'; - -// ************************************************************************** -// BuiltValueGenerator -// ************************************************************************** - -const AvailableTo _$user = const AvailableTo._('user'); -const AvailableTo _$student = const AvailableTo._('student'); -const AvailableTo _$teacher = const AvailableTo._('teacher'); -const AvailableTo _$admin = const AvailableTo._('admin'); -const AvailableTo _$observer = const AvailableTo._('observer'); -const AvailableTo _$unenrolled = const AvailableTo._('unenrolled'); - -AvailableTo _$atValueOf(String name) { - switch (name) { - case 'user': - return _$user; - case 'student': - return _$student; - case 'teacher': - return _$teacher; - case 'admin': - return _$admin; - case 'observer': - return _$observer; - case 'unenrolled': - return _$unenrolled; - default: - throw new ArgumentError(name); - } -} - -final BuiltSet _$atValues = - new BuiltSet(const [ - _$user, - _$student, - _$teacher, - _$admin, - _$observer, - _$unenrolled, -]); - -Serializer _$helpLinkSerializer = new _$HelpLinkSerializer(); -Serializer _$availableToSerializer = new _$AvailableToSerializer(); - -class _$HelpLinkSerializer implements StructuredSerializer { - @override - final Iterable types = const [HelpLink, _$HelpLink]; - @override - final String wireName = 'HelpLink'; - - @override - Iterable serialize(Serializers serializers, HelpLink object, - {FullType specifiedType = FullType.unspecified}) { - final result = [ - 'type', - serializers.serialize(object.type, specifiedType: const FullType(String)), - 'available_to', - serializers.serialize(object.availableTo, - specifiedType: - const FullType(BuiltList, const [const FullType(AvailableTo)])), - ]; - Object? value; - value = object.id; - - result - ..add('id') - ..add( - serializers.serialize(value, specifiedType: const FullType(String))); - value = object.url; - - result - ..add('url') - ..add( - serializers.serialize(value, specifiedType: const FullType(String))); - value = object.text; - - result - ..add('text') - ..add( - serializers.serialize(value, specifiedType: const FullType(String))); - value = object.subtext; - - result - ..add('subtext') - ..add( - serializers.serialize(value, specifiedType: const FullType(String))); - - return result; - } - - @override - HelpLink deserialize(Serializers serializers, Iterable serialized, - {FullType specifiedType = FullType.unspecified}) { - final result = new HelpLinkBuilder(); - - final iterator = serialized.iterator; - while (iterator.moveNext()) { - final key = iterator.current! as String; - iterator.moveNext(); - final Object? value = iterator.current; - switch (key) { - case 'id': - result.id = serializers.deserialize(value, - specifiedType: const FullType(String)) as String?; - break; - case 'type': - result.type = serializers.deserialize(value, - specifiedType: const FullType(String))! as String; - break; - case 'available_to': - result.availableTo.replace(serializers.deserialize(value, - specifiedType: const FullType( - BuiltList, const [const FullType(AvailableTo)]))! - as BuiltList); - break; - case 'url': - result.url = serializers.deserialize(value, - specifiedType: const FullType(String)) as String?; - break; - case 'text': - result.text = serializers.deserialize(value, - specifiedType: const FullType(String)) as String?; - break; - case 'subtext': - result.subtext = serializers.deserialize(value, - specifiedType: const FullType(String)) as String?; - break; - } - } - - return result.build(); - } -} - -class _$AvailableToSerializer implements PrimitiveSerializer { - @override - final Iterable types = const [AvailableTo]; - @override - final String wireName = 'AvailableTo'; - - @override - Object serialize(Serializers serializers, AvailableTo object, - {FullType specifiedType = FullType.unspecified}) => - object.name; - - @override - AvailableTo deserialize(Serializers serializers, Object serialized, - {FullType specifiedType = FullType.unspecified}) => - AvailableTo.valueOf(serialized as String); -} - -class _$HelpLink extends HelpLink { - @override - final String? id; - @override - final String type; - @override - final BuiltList availableTo; - @override - final String? url; - @override - final String? text; - @override - final String? subtext; - - factory _$HelpLink([void Function(HelpLinkBuilder)? updates]) => - (new HelpLinkBuilder()..update(updates))._build(); - - _$HelpLink._( - {this.id, - required this.type, - required this.availableTo, - this.url, - this.text, - this.subtext}) - : super._() { - BuiltValueNullFieldError.checkNotNull(type, r'HelpLink', 'type'); - BuiltValueNullFieldError.checkNotNull( - availableTo, r'HelpLink', 'availableTo'); - } - - @override - HelpLink rebuild(void Function(HelpLinkBuilder) updates) => - (toBuilder()..update(updates)).build(); - - @override - HelpLinkBuilder toBuilder() => new HelpLinkBuilder()..replace(this); - - @override - bool operator ==(Object other) { - if (identical(other, this)) return true; - return other is HelpLink && - id == other.id && - type == other.type && - availableTo == other.availableTo && - url == other.url && - text == other.text && - subtext == other.subtext; - } - - @override - int get hashCode { - var _$hash = 0; - _$hash = $jc(_$hash, id.hashCode); - _$hash = $jc(_$hash, type.hashCode); - _$hash = $jc(_$hash, availableTo.hashCode); - _$hash = $jc(_$hash, url.hashCode); - _$hash = $jc(_$hash, text.hashCode); - _$hash = $jc(_$hash, subtext.hashCode); - _$hash = $jf(_$hash); - return _$hash; - } - - @override - String toString() { - return (newBuiltValueToStringHelper(r'HelpLink') - ..add('id', id) - ..add('type', type) - ..add('availableTo', availableTo) - ..add('url', url) - ..add('text', text) - ..add('subtext', subtext)) - .toString(); - } -} - -class HelpLinkBuilder implements Builder { - _$HelpLink? _$v; - - String? _id; - String? get id => _$this._id; - set id(String? id) => _$this._id = id; - - String? _type; - String? get type => _$this._type; - set type(String? type) => _$this._type = type; - - ListBuilder? _availableTo; - ListBuilder get availableTo => - _$this._availableTo ??= new ListBuilder(); - set availableTo(ListBuilder? availableTo) => - _$this._availableTo = availableTo; - - String? _url; - String? get url => _$this._url; - set url(String? url) => _$this._url = url; - - String? _text; - String? get text => _$this._text; - set text(String? text) => _$this._text = text; - - String? _subtext; - String? get subtext => _$this._subtext; - set subtext(String? subtext) => _$this._subtext = subtext; - - HelpLinkBuilder(); - - HelpLinkBuilder get _$this { - final $v = _$v; - if ($v != null) { - _id = $v.id; - _type = $v.type; - _availableTo = $v.availableTo.toBuilder(); - _url = $v.url; - _text = $v.text; - _subtext = $v.subtext; - _$v = null; - } - return this; - } - - @override - void replace(HelpLink other) { - ArgumentError.checkNotNull(other, 'other'); - _$v = other as _$HelpLink; - } - - @override - void update(void Function(HelpLinkBuilder)? updates) { - if (updates != null) updates(this); - } - - @override - HelpLink build() => _build(); - - _$HelpLink _build() { - _$HelpLink _$result; - try { - _$result = _$v ?? - new _$HelpLink._( - id: id, - type: BuiltValueNullFieldError.checkNotNull( - type, r'HelpLink', 'type'), - availableTo: availableTo.build(), - url: url, - text: text, - subtext: subtext); - } catch (_) { - late String _$failedField; - try { - _$failedField = 'availableTo'; - availableTo.build(); - } catch (e) { - throw new BuiltValueNestedFieldError( - r'HelpLink', _$failedField, e.toString()); - } - rethrow; - } - replace(_$result); - return _$result; - } -} - -// ignore_for_file: deprecated_member_use_from_same_package,type=lint diff --git a/apps/flutter_parent/lib/models/help_links.dart b/apps/flutter_parent/lib/models/help_links.dart deleted file mode 100644 index 0287644714..0000000000 --- a/apps/flutter_parent/lib/models/help_links.dart +++ /dev/null @@ -1,37 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:built_collection/built_collection.dart'; -import 'package:built_value/built_value.dart'; -import 'package:built_value/serializer.dart'; -import 'package:flutter_parent/models/help_link.dart'; - -part 'help_links.g.dart'; - -/// To have this built_value be generated, run this command from the project root: -/// flutter packages pub run build_runner build --delete-conflicting-outputs -abstract class HelpLinks implements Built { - @BuiltValueSerializer(serializeNulls: true) // Add this line to get nulls to serialize when we convert to JSON - static Serializer get serializer => _$helpLinksSerializer; - - HelpLinks._(); - - factory HelpLinks([void Function(HelpLinksBuilder) updates]) = _$HelpLinks; - - @BuiltValueField(wireName: 'custom_help_links') - BuiltList get customHelpLinks; - - @BuiltValueField(wireName: 'default_help_links') - BuiltList get defaultHelpLinks; -} diff --git a/apps/flutter_parent/lib/models/help_links.g.dart b/apps/flutter_parent/lib/models/help_links.g.dart deleted file mode 100644 index 4f4fe7bbf5..0000000000 --- a/apps/flutter_parent/lib/models/help_links.g.dart +++ /dev/null @@ -1,180 +0,0 @@ -// GENERATED CODE - DO NOT MODIFY BY HAND - -part of 'help_links.dart'; - -// ************************************************************************** -// BuiltValueGenerator -// ************************************************************************** - -Serializer _$helpLinksSerializer = new _$HelpLinksSerializer(); - -class _$HelpLinksSerializer implements StructuredSerializer { - @override - final Iterable types = const [HelpLinks, _$HelpLinks]; - @override - final String wireName = 'HelpLinks'; - - @override - Iterable serialize(Serializers serializers, HelpLinks object, - {FullType specifiedType = FullType.unspecified}) { - final result = [ - 'custom_help_links', - serializers.serialize(object.customHelpLinks, - specifiedType: - const FullType(BuiltList, const [const FullType(HelpLink)])), - 'default_help_links', - serializers.serialize(object.defaultHelpLinks, - specifiedType: - const FullType(BuiltList, const [const FullType(HelpLink)])), - ]; - - return result; - } - - @override - HelpLinks deserialize(Serializers serializers, Iterable serialized, - {FullType specifiedType = FullType.unspecified}) { - final result = new HelpLinksBuilder(); - - final iterator = serialized.iterator; - while (iterator.moveNext()) { - final key = iterator.current! as String; - iterator.moveNext(); - final Object? value = iterator.current; - switch (key) { - case 'custom_help_links': - result.customHelpLinks.replace(serializers.deserialize(value, - specifiedType: const FullType( - BuiltList, const [const FullType(HelpLink)]))! - as BuiltList); - break; - case 'default_help_links': - result.defaultHelpLinks.replace(serializers.deserialize(value, - specifiedType: const FullType( - BuiltList, const [const FullType(HelpLink)]))! - as BuiltList); - break; - } - } - - return result.build(); - } -} - -class _$HelpLinks extends HelpLinks { - @override - final BuiltList customHelpLinks; - @override - final BuiltList defaultHelpLinks; - - factory _$HelpLinks([void Function(HelpLinksBuilder)? updates]) => - (new HelpLinksBuilder()..update(updates))._build(); - - _$HelpLinks._({required this.customHelpLinks, required this.defaultHelpLinks}) - : super._() { - BuiltValueNullFieldError.checkNotNull( - customHelpLinks, r'HelpLinks', 'customHelpLinks'); - BuiltValueNullFieldError.checkNotNull( - defaultHelpLinks, r'HelpLinks', 'defaultHelpLinks'); - } - - @override - HelpLinks rebuild(void Function(HelpLinksBuilder) updates) => - (toBuilder()..update(updates)).build(); - - @override - HelpLinksBuilder toBuilder() => new HelpLinksBuilder()..replace(this); - - @override - bool operator ==(Object other) { - if (identical(other, this)) return true; - return other is HelpLinks && - customHelpLinks == other.customHelpLinks && - defaultHelpLinks == other.defaultHelpLinks; - } - - @override - int get hashCode { - var _$hash = 0; - _$hash = $jc(_$hash, customHelpLinks.hashCode); - _$hash = $jc(_$hash, defaultHelpLinks.hashCode); - _$hash = $jf(_$hash); - return _$hash; - } - - @override - String toString() { - return (newBuiltValueToStringHelper(r'HelpLinks') - ..add('customHelpLinks', customHelpLinks) - ..add('defaultHelpLinks', defaultHelpLinks)) - .toString(); - } -} - -class HelpLinksBuilder implements Builder { - _$HelpLinks? _$v; - - ListBuilder? _customHelpLinks; - ListBuilder get customHelpLinks => - _$this._customHelpLinks ??= new ListBuilder(); - set customHelpLinks(ListBuilder? customHelpLinks) => - _$this._customHelpLinks = customHelpLinks; - - ListBuilder? _defaultHelpLinks; - ListBuilder get defaultHelpLinks => - _$this._defaultHelpLinks ??= new ListBuilder(); - set defaultHelpLinks(ListBuilder? defaultHelpLinks) => - _$this._defaultHelpLinks = defaultHelpLinks; - - HelpLinksBuilder(); - - HelpLinksBuilder get _$this { - final $v = _$v; - if ($v != null) { - _customHelpLinks = $v.customHelpLinks.toBuilder(); - _defaultHelpLinks = $v.defaultHelpLinks.toBuilder(); - _$v = null; - } - return this; - } - - @override - void replace(HelpLinks other) { - ArgumentError.checkNotNull(other, 'other'); - _$v = other as _$HelpLinks; - } - - @override - void update(void Function(HelpLinksBuilder)? updates) { - if (updates != null) updates(this); - } - - @override - HelpLinks build() => _build(); - - _$HelpLinks _build() { - _$HelpLinks _$result; - try { - _$result = _$v ?? - new _$HelpLinks._( - customHelpLinks: customHelpLinks.build(), - defaultHelpLinks: defaultHelpLinks.build()); - } catch (_) { - late String _$failedField; - try { - _$failedField = 'customHelpLinks'; - customHelpLinks.build(); - _$failedField = 'defaultHelpLinks'; - defaultHelpLinks.build(); - } catch (e) { - throw new BuiltValueNestedFieldError( - r'HelpLinks', _$failedField, e.toString()); - } - rethrow; - } - replace(_$result); - return _$result; - } -} - -// ignore_for_file: deprecated_member_use_from_same_package,type=lint diff --git a/apps/flutter_parent/lib/models/lock_info.dart b/apps/flutter_parent/lib/models/lock_info.dart deleted file mode 100644 index e62a7c6302..0000000000 --- a/apps/flutter_parent/lib/models/lock_info.dart +++ /dev/null @@ -1,50 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -import 'package:built_value/built_value.dart'; -import 'package:built_value/serializer.dart'; -import 'package:flutter_parent/models/locked_module.dart'; - -part 'lock_info.g.dart'; - -/// To have this built_value be generated, run this command from the project root: -/// flutter packages pub run build_runner build --delete-conflicting-outputs -abstract class LockInfo implements Built { - @BuiltValueSerializer(serializeNulls: true) // Add this line to get nulls to serialize when we convert to JSON - static Serializer get serializer => _$lockInfoSerializer; - - LockInfo._(); - - factory LockInfo([void Function(LockInfoBuilder) updates]) = _$LockInfo; - - @BuiltValueField(wireName: 'context_module') - LockedModule? get contextModule; - - @BuiltValueField(wireName: 'unlock_at') - DateTime? get unlockAt; - - @BuiltValueField(serialize: false) - List? get modulePrerequisiteNames; - - @BuiltValueField(serialize: false) - bool get isEmpty { - return (contextModule?.name == null && - (modulePrerequisiteNames == null || modulePrerequisiteNames?.length == 0) && - unlockAt == null); - } - - @BuiltValueField(serialize: false) - bool get hasModuleName { - return contextModule?.name != null && contextModule?.name?.isNotEmpty == true && contextModule?.name != 'null'; - } -} diff --git a/apps/flutter_parent/lib/models/lock_info.g.dart b/apps/flutter_parent/lib/models/lock_info.g.dart deleted file mode 100644 index 286ed068aa..0000000000 --- a/apps/flutter_parent/lib/models/lock_info.g.dart +++ /dev/null @@ -1,184 +0,0 @@ -// GENERATED CODE - DO NOT MODIFY BY HAND - -part of 'lock_info.dart'; - -// ************************************************************************** -// BuiltValueGenerator -// ************************************************************************** - -Serializer _$lockInfoSerializer = new _$LockInfoSerializer(); - -class _$LockInfoSerializer implements StructuredSerializer { - @override - final Iterable types = const [LockInfo, _$LockInfo]; - @override - final String wireName = 'LockInfo'; - - @override - Iterable serialize(Serializers serializers, LockInfo object, - {FullType specifiedType = FullType.unspecified}) { - final result = []; - Object? value; - value = object.contextModule; - - result - ..add('context_module') - ..add(serializers.serialize(value, - specifiedType: const FullType(LockedModule))); - value = object.unlockAt; - - result - ..add('unlock_at') - ..add(serializers.serialize(value, - specifiedType: const FullType(DateTime))); - - return result; - } - - @override - LockInfo deserialize(Serializers serializers, Iterable serialized, - {FullType specifiedType = FullType.unspecified}) { - final result = new LockInfoBuilder(); - - final iterator = serialized.iterator; - while (iterator.moveNext()) { - final key = iterator.current! as String; - iterator.moveNext(); - final Object? value = iterator.current; - switch (key) { - case 'context_module': - result.contextModule.replace(serializers.deserialize(value, - specifiedType: const FullType(LockedModule))! as LockedModule); - break; - case 'unlock_at': - result.unlockAt = serializers.deserialize(value, - specifiedType: const FullType(DateTime)) as DateTime?; - break; - } - } - - return result.build(); - } -} - -class _$LockInfo extends LockInfo { - @override - final LockedModule? contextModule; - @override - final DateTime? unlockAt; - @override - final List? modulePrerequisiteNames; - - factory _$LockInfo([void Function(LockInfoBuilder)? updates]) => - (new LockInfoBuilder()..update(updates))._build(); - - _$LockInfo._( - {this.contextModule, this.unlockAt, this.modulePrerequisiteNames}) - : super._(); - - @override - LockInfo rebuild(void Function(LockInfoBuilder) updates) => - (toBuilder()..update(updates)).build(); - - @override - LockInfoBuilder toBuilder() => new LockInfoBuilder()..replace(this); - - @override - bool operator ==(Object other) { - if (identical(other, this)) return true; - return other is LockInfo && - contextModule == other.contextModule && - unlockAt == other.unlockAt && - modulePrerequisiteNames == other.modulePrerequisiteNames; - } - - @override - int get hashCode { - var _$hash = 0; - _$hash = $jc(_$hash, contextModule.hashCode); - _$hash = $jc(_$hash, unlockAt.hashCode); - _$hash = $jc(_$hash, modulePrerequisiteNames.hashCode); - _$hash = $jf(_$hash); - return _$hash; - } - - @override - String toString() { - return (newBuiltValueToStringHelper(r'LockInfo') - ..add('contextModule', contextModule) - ..add('unlockAt', unlockAt) - ..add('modulePrerequisiteNames', modulePrerequisiteNames)) - .toString(); - } -} - -class LockInfoBuilder implements Builder { - _$LockInfo? _$v; - - LockedModuleBuilder? _contextModule; - LockedModuleBuilder get contextModule => - _$this._contextModule ??= new LockedModuleBuilder(); - set contextModule(LockedModuleBuilder? contextModule) => - _$this._contextModule = contextModule; - - DateTime? _unlockAt; - DateTime? get unlockAt => _$this._unlockAt; - set unlockAt(DateTime? unlockAt) => _$this._unlockAt = unlockAt; - - List? _modulePrerequisiteNames; - List? get modulePrerequisiteNames => _$this._modulePrerequisiteNames; - set modulePrerequisiteNames(List? modulePrerequisiteNames) => - _$this._modulePrerequisiteNames = modulePrerequisiteNames; - - LockInfoBuilder(); - - LockInfoBuilder get _$this { - final $v = _$v; - if ($v != null) { - _contextModule = $v.contextModule?.toBuilder(); - _unlockAt = $v.unlockAt; - _modulePrerequisiteNames = $v.modulePrerequisiteNames; - _$v = null; - } - return this; - } - - @override - void replace(LockInfo other) { - ArgumentError.checkNotNull(other, 'other'); - _$v = other as _$LockInfo; - } - - @override - void update(void Function(LockInfoBuilder)? updates) { - if (updates != null) updates(this); - } - - @override - LockInfo build() => _build(); - - _$LockInfo _build() { - _$LockInfo _$result; - try { - _$result = _$v ?? - new _$LockInfo._( - contextModule: _contextModule?.build(), - unlockAt: unlockAt, - modulePrerequisiteNames: modulePrerequisiteNames); - } catch (_) { - late String _$failedField; - try { - _$failedField = 'contextModule'; - _contextModule?.build(); - } catch (e) { - throw new BuiltValueNestedFieldError( - r'LockInfo', _$failedField, e.toString()); - } - rethrow; - } - replace(_$result); - return _$result; - } -} - -// ignore_for_file: deprecated_member_use_from_same_package,type=lint diff --git a/apps/flutter_parent/lib/models/locked_module.dart b/apps/flutter_parent/lib/models/locked_module.dart deleted file mode 100644 index dc9d183ae8..0000000000 --- a/apps/flutter_parent/lib/models/locked_module.dart +++ /dev/null @@ -1,44 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -import 'package:built_value/built_value.dart'; -import 'package:built_value/serializer.dart'; - -part 'locked_module.g.dart'; - -/// To have this built_value be generated, run this command from the project root: -/// flutter packages pub run build_runner build --delete-conflicting-outputs -abstract class LockedModule implements Built { - @BuiltValueSerializer(serializeNulls: true) // Add this line to get nulls to serialize when we convert to JSON - static Serializer get serializer => _$lockedModuleSerializer; - - LockedModule._(); - - factory LockedModule([void Function(LockedModuleBuilder) updates]) = _$LockedModule; - - String get id; - - @BuiltValueField(wireName: 'context_id') - String get contextId; - - @BuiltValueField(wireName: 'context_type') - String? get contextType; - - String? get name; - - @BuiltValueField(wireName: 'unlock_at') - DateTime? get unlockAt; - - @BuiltValueField(wireName: 'require_sequential_progress') - bool? get isRequireSequentialProgress; -} diff --git a/apps/flutter_parent/lib/models/locked_module.g.dart b/apps/flutter_parent/lib/models/locked_module.g.dart deleted file mode 100644 index dd8d5ea577..0000000000 --- a/apps/flutter_parent/lib/models/locked_module.g.dart +++ /dev/null @@ -1,249 +0,0 @@ -// GENERATED CODE - DO NOT MODIFY BY HAND - -part of 'locked_module.dart'; - -// ************************************************************************** -// BuiltValueGenerator -// ************************************************************************** - -Serializer _$lockedModuleSerializer = - new _$LockedModuleSerializer(); - -class _$LockedModuleSerializer implements StructuredSerializer { - @override - final Iterable types = const [LockedModule, _$LockedModule]; - @override - final String wireName = 'LockedModule'; - - @override - Iterable serialize(Serializers serializers, LockedModule object, - {FullType specifiedType = FullType.unspecified}) { - final result = [ - 'id', - serializers.serialize(object.id, specifiedType: const FullType(String)), - 'context_id', - serializers.serialize(object.contextId, - specifiedType: const FullType(String)), - ]; - Object? value; - value = object.contextType; - - result - ..add('context_type') - ..add( - serializers.serialize(value, specifiedType: const FullType(String))); - value = object.name; - - result - ..add('name') - ..add( - serializers.serialize(value, specifiedType: const FullType(String))); - value = object.unlockAt; - - result - ..add('unlock_at') - ..add(serializers.serialize(value, - specifiedType: const FullType(DateTime))); - value = object.isRequireSequentialProgress; - - result - ..add('require_sequential_progress') - ..add(serializers.serialize(value, specifiedType: const FullType(bool))); - - return result; - } - - @override - LockedModule deserialize( - Serializers serializers, Iterable serialized, - {FullType specifiedType = FullType.unspecified}) { - final result = new LockedModuleBuilder(); - - final iterator = serialized.iterator; - while (iterator.moveNext()) { - final key = iterator.current! as String; - iterator.moveNext(); - final Object? value = iterator.current; - switch (key) { - case 'id': - result.id = serializers.deserialize(value, - specifiedType: const FullType(String))! as String; - break; - case 'context_id': - result.contextId = serializers.deserialize(value, - specifiedType: const FullType(String))! as String; - break; - case 'context_type': - result.contextType = serializers.deserialize(value, - specifiedType: const FullType(String)) as String?; - break; - case 'name': - result.name = serializers.deserialize(value, - specifiedType: const FullType(String)) as String?; - break; - case 'unlock_at': - result.unlockAt = serializers.deserialize(value, - specifiedType: const FullType(DateTime)) as DateTime?; - break; - case 'require_sequential_progress': - result.isRequireSequentialProgress = serializers.deserialize(value, - specifiedType: const FullType(bool)) as bool?; - break; - } - } - - return result.build(); - } -} - -class _$LockedModule extends LockedModule { - @override - final String id; - @override - final String contextId; - @override - final String? contextType; - @override - final String? name; - @override - final DateTime? unlockAt; - @override - final bool? isRequireSequentialProgress; - - factory _$LockedModule([void Function(LockedModuleBuilder)? updates]) => - (new LockedModuleBuilder()..update(updates))._build(); - - _$LockedModule._( - {required this.id, - required this.contextId, - this.contextType, - this.name, - this.unlockAt, - this.isRequireSequentialProgress}) - : super._() { - BuiltValueNullFieldError.checkNotNull(id, r'LockedModule', 'id'); - BuiltValueNullFieldError.checkNotNull( - contextId, r'LockedModule', 'contextId'); - } - - @override - LockedModule rebuild(void Function(LockedModuleBuilder) updates) => - (toBuilder()..update(updates)).build(); - - @override - LockedModuleBuilder toBuilder() => new LockedModuleBuilder()..replace(this); - - @override - bool operator ==(Object other) { - if (identical(other, this)) return true; - return other is LockedModule && - id == other.id && - contextId == other.contextId && - contextType == other.contextType && - name == other.name && - unlockAt == other.unlockAt && - isRequireSequentialProgress == other.isRequireSequentialProgress; - } - - @override - int get hashCode { - var _$hash = 0; - _$hash = $jc(_$hash, id.hashCode); - _$hash = $jc(_$hash, contextId.hashCode); - _$hash = $jc(_$hash, contextType.hashCode); - _$hash = $jc(_$hash, name.hashCode); - _$hash = $jc(_$hash, unlockAt.hashCode); - _$hash = $jc(_$hash, isRequireSequentialProgress.hashCode); - _$hash = $jf(_$hash); - return _$hash; - } - - @override - String toString() { - return (newBuiltValueToStringHelper(r'LockedModule') - ..add('id', id) - ..add('contextId', contextId) - ..add('contextType', contextType) - ..add('name', name) - ..add('unlockAt', unlockAt) - ..add('isRequireSequentialProgress', isRequireSequentialProgress)) - .toString(); - } -} - -class LockedModuleBuilder - implements Builder { - _$LockedModule? _$v; - - String? _id; - String? get id => _$this._id; - set id(String? id) => _$this._id = id; - - String? _contextId; - String? get contextId => _$this._contextId; - set contextId(String? contextId) => _$this._contextId = contextId; - - String? _contextType; - String? get contextType => _$this._contextType; - set contextType(String? contextType) => _$this._contextType = contextType; - - String? _name; - String? get name => _$this._name; - set name(String? name) => _$this._name = name; - - DateTime? _unlockAt; - DateTime? get unlockAt => _$this._unlockAt; - set unlockAt(DateTime? unlockAt) => _$this._unlockAt = unlockAt; - - bool? _isRequireSequentialProgress; - bool? get isRequireSequentialProgress => _$this._isRequireSequentialProgress; - set isRequireSequentialProgress(bool? isRequireSequentialProgress) => - _$this._isRequireSequentialProgress = isRequireSequentialProgress; - - LockedModuleBuilder(); - - LockedModuleBuilder get _$this { - final $v = _$v; - if ($v != null) { - _id = $v.id; - _contextId = $v.contextId; - _contextType = $v.contextType; - _name = $v.name; - _unlockAt = $v.unlockAt; - _isRequireSequentialProgress = $v.isRequireSequentialProgress; - _$v = null; - } - return this; - } - - @override - void replace(LockedModule other) { - ArgumentError.checkNotNull(other, 'other'); - _$v = other as _$LockedModule; - } - - @override - void update(void Function(LockedModuleBuilder)? updates) { - if (updates != null) updates(this); - } - - @override - LockedModule build() => _build(); - - _$LockedModule _build() { - final _$result = _$v ?? - new _$LockedModule._( - id: BuiltValueNullFieldError.checkNotNull( - id, r'LockedModule', 'id'), - contextId: BuiltValueNullFieldError.checkNotNull( - contextId, r'LockedModule', 'contextId'), - contextType: contextType, - name: name, - unlockAt: unlockAt, - isRequireSequentialProgress: isRequireSequentialProgress); - replace(_$result); - return _$result; - } -} - -// ignore_for_file: deprecated_member_use_from_same_package,type=lint diff --git a/apps/flutter_parent/lib/models/login.dart b/apps/flutter_parent/lib/models/login.dart deleted file mode 100644 index c0615fe0ac..0000000000 --- a/apps/flutter_parent/lib/models/login.dart +++ /dev/null @@ -1,67 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:built_value/built_value.dart'; -import 'package:built_value/serializer.dart'; -import 'package:flutter_parent/models/user.dart'; -import 'package:uuid/uuid.dart'; - -part 'login.g.dart'; - -/// To have this built_value be generated, run this command from the project root: -/// flutter pub run build_runner build --delete-conflicting-outputs -abstract class Login implements Built { - @BuiltValueSerializer(serializeNulls: true) // Add this line to get nulls to serialize when we convert to JSON - static Serializer get serializer => _$loginSerializer; - - String get uuid; - - String get domain; - - String? get clientId; - - String? get clientSecret; - - String get accessToken; - - String get refreshToken; - - User get user; - - String? get selectedStudentId; - - bool? get canMasquerade; - - User? get masqueradeUser; - - String? get masqueradeDomain; - - bool? get isMasqueradingFromQRCode; - - bool get isMasquerading => masqueradeUser != null && masqueradeDomain != null; - - User get currentUser => masqueradeUser ?? user; - - String get currentDomain => masqueradeDomain ?? domain; - - Login._(); - factory Login([void Function(LoginBuilder) updates]) = _$Login; - - static void _initializeBuilder(LoginBuilder b) => b - ..uuid = Uuid().v4() - ..domain = '' - ..accessToken = '' - ..refreshToken = '' - ..user = User().toBuilder(); -} diff --git a/apps/flutter_parent/lib/models/login.g.dart b/apps/flutter_parent/lib/models/login.g.dart deleted file mode 100644 index 83373d0b54..0000000000 --- a/apps/flutter_parent/lib/models/login.g.dart +++ /dev/null @@ -1,394 +0,0 @@ -// GENERATED CODE - DO NOT MODIFY BY HAND - -part of 'login.dart'; - -// ************************************************************************** -// BuiltValueGenerator -// ************************************************************************** - -Serializer _$loginSerializer = new _$LoginSerializer(); - -class _$LoginSerializer implements StructuredSerializer { - @override - final Iterable types = const [Login, _$Login]; - @override - final String wireName = 'Login'; - - @override - Iterable serialize(Serializers serializers, Login object, - {FullType specifiedType = FullType.unspecified}) { - final result = [ - 'uuid', - serializers.serialize(object.uuid, specifiedType: const FullType(String)), - 'domain', - serializers.serialize(object.domain, - specifiedType: const FullType(String)), - 'accessToken', - serializers.serialize(object.accessToken, - specifiedType: const FullType(String)), - 'refreshToken', - serializers.serialize(object.refreshToken, - specifiedType: const FullType(String)), - 'user', - serializers.serialize(object.user, specifiedType: const FullType(User)), - ]; - Object? value; - value = object.clientId; - - result - ..add('clientId') - ..add( - serializers.serialize(value, specifiedType: const FullType(String))); - value = object.clientSecret; - - result - ..add('clientSecret') - ..add( - serializers.serialize(value, specifiedType: const FullType(String))); - value = object.selectedStudentId; - - result - ..add('selectedStudentId') - ..add( - serializers.serialize(value, specifiedType: const FullType(String))); - value = object.canMasquerade; - - result - ..add('canMasquerade') - ..add(serializers.serialize(value, specifiedType: const FullType(bool))); - value = object.masqueradeUser; - - result - ..add('masqueradeUser') - ..add(serializers.serialize(value, specifiedType: const FullType(User))); - value = object.masqueradeDomain; - - result - ..add('masqueradeDomain') - ..add( - serializers.serialize(value, specifiedType: const FullType(String))); - value = object.isMasqueradingFromQRCode; - - result - ..add('isMasqueradingFromQRCode') - ..add(serializers.serialize(value, specifiedType: const FullType(bool))); - - return result; - } - - @override - Login deserialize(Serializers serializers, Iterable serialized, - {FullType specifiedType = FullType.unspecified}) { - final result = new LoginBuilder(); - - final iterator = serialized.iterator; - while (iterator.moveNext()) { - final key = iterator.current! as String; - iterator.moveNext(); - final Object? value = iterator.current; - switch (key) { - case 'uuid': - result.uuid = serializers.deserialize(value, - specifiedType: const FullType(String))! as String; - break; - case 'domain': - result.domain = serializers.deserialize(value, - specifiedType: const FullType(String))! as String; - break; - case 'clientId': - result.clientId = serializers.deserialize(value, - specifiedType: const FullType(String)) as String?; - break; - case 'clientSecret': - result.clientSecret = serializers.deserialize(value, - specifiedType: const FullType(String)) as String?; - break; - case 'accessToken': - result.accessToken = serializers.deserialize(value, - specifiedType: const FullType(String))! as String; - break; - case 'refreshToken': - result.refreshToken = serializers.deserialize(value, - specifiedType: const FullType(String))! as String; - break; - case 'user': - result.user.replace(serializers.deserialize(value, - specifiedType: const FullType(User))! as User); - break; - case 'selectedStudentId': - result.selectedStudentId = serializers.deserialize(value, - specifiedType: const FullType(String)) as String?; - break; - case 'canMasquerade': - result.canMasquerade = serializers.deserialize(value, - specifiedType: const FullType(bool)) as bool?; - break; - case 'masqueradeUser': - result.masqueradeUser.replace(serializers.deserialize(value, - specifiedType: const FullType(User))! as User); - break; - case 'masqueradeDomain': - result.masqueradeDomain = serializers.deserialize(value, - specifiedType: const FullType(String)) as String?; - break; - case 'isMasqueradingFromQRCode': - result.isMasqueradingFromQRCode = serializers.deserialize(value, - specifiedType: const FullType(bool)) as bool?; - break; - } - } - - return result.build(); - } -} - -class _$Login extends Login { - @override - final String uuid; - @override - final String domain; - @override - final String? clientId; - @override - final String? clientSecret; - @override - final String accessToken; - @override - final String refreshToken; - @override - final User user; - @override - final String? selectedStudentId; - @override - final bool? canMasquerade; - @override - final User? masqueradeUser; - @override - final String? masqueradeDomain; - @override - final bool? isMasqueradingFromQRCode; - - factory _$Login([void Function(LoginBuilder)? updates]) => - (new LoginBuilder()..update(updates))._build(); - - _$Login._( - {required this.uuid, - required this.domain, - this.clientId, - this.clientSecret, - required this.accessToken, - required this.refreshToken, - required this.user, - this.selectedStudentId, - this.canMasquerade, - this.masqueradeUser, - this.masqueradeDomain, - this.isMasqueradingFromQRCode}) - : super._() { - BuiltValueNullFieldError.checkNotNull(uuid, r'Login', 'uuid'); - BuiltValueNullFieldError.checkNotNull(domain, r'Login', 'domain'); - BuiltValueNullFieldError.checkNotNull(accessToken, r'Login', 'accessToken'); - BuiltValueNullFieldError.checkNotNull( - refreshToken, r'Login', 'refreshToken'); - BuiltValueNullFieldError.checkNotNull(user, r'Login', 'user'); - } - - @override - Login rebuild(void Function(LoginBuilder) updates) => - (toBuilder()..update(updates)).build(); - - @override - LoginBuilder toBuilder() => new LoginBuilder()..replace(this); - - @override - bool operator ==(Object other) { - if (identical(other, this)) return true; - return other is Login && - uuid == other.uuid && - domain == other.domain && - clientId == other.clientId && - clientSecret == other.clientSecret && - accessToken == other.accessToken && - refreshToken == other.refreshToken && - user == other.user && - selectedStudentId == other.selectedStudentId && - canMasquerade == other.canMasquerade && - masqueradeUser == other.masqueradeUser && - masqueradeDomain == other.masqueradeDomain && - isMasqueradingFromQRCode == other.isMasqueradingFromQRCode; - } - - @override - int get hashCode { - var _$hash = 0; - _$hash = $jc(_$hash, uuid.hashCode); - _$hash = $jc(_$hash, domain.hashCode); - _$hash = $jc(_$hash, clientId.hashCode); - _$hash = $jc(_$hash, clientSecret.hashCode); - _$hash = $jc(_$hash, accessToken.hashCode); - _$hash = $jc(_$hash, refreshToken.hashCode); - _$hash = $jc(_$hash, user.hashCode); - _$hash = $jc(_$hash, selectedStudentId.hashCode); - _$hash = $jc(_$hash, canMasquerade.hashCode); - _$hash = $jc(_$hash, masqueradeUser.hashCode); - _$hash = $jc(_$hash, masqueradeDomain.hashCode); - _$hash = $jc(_$hash, isMasqueradingFromQRCode.hashCode); - _$hash = $jf(_$hash); - return _$hash; - } - - @override - String toString() { - return (newBuiltValueToStringHelper(r'Login') - ..add('uuid', uuid) - ..add('domain', domain) - ..add('clientId', clientId) - ..add('clientSecret', clientSecret) - ..add('accessToken', accessToken) - ..add('refreshToken', refreshToken) - ..add('user', user) - ..add('selectedStudentId', selectedStudentId) - ..add('canMasquerade', canMasquerade) - ..add('masqueradeUser', masqueradeUser) - ..add('masqueradeDomain', masqueradeDomain) - ..add('isMasqueradingFromQRCode', isMasqueradingFromQRCode)) - .toString(); - } -} - -class LoginBuilder implements Builder { - _$Login? _$v; - - String? _uuid; - String? get uuid => _$this._uuid; - set uuid(String? uuid) => _$this._uuid = uuid; - - String? _domain; - String? get domain => _$this._domain; - set domain(String? domain) => _$this._domain = domain; - - String? _clientId; - String? get clientId => _$this._clientId; - set clientId(String? clientId) => _$this._clientId = clientId; - - String? _clientSecret; - String? get clientSecret => _$this._clientSecret; - set clientSecret(String? clientSecret) => _$this._clientSecret = clientSecret; - - String? _accessToken; - String? get accessToken => _$this._accessToken; - set accessToken(String? accessToken) => _$this._accessToken = accessToken; - - String? _refreshToken; - String? get refreshToken => _$this._refreshToken; - set refreshToken(String? refreshToken) => _$this._refreshToken = refreshToken; - - UserBuilder? _user; - UserBuilder get user => _$this._user ??= new UserBuilder(); - set user(UserBuilder? user) => _$this._user = user; - - String? _selectedStudentId; - String? get selectedStudentId => _$this._selectedStudentId; - set selectedStudentId(String? selectedStudentId) => - _$this._selectedStudentId = selectedStudentId; - - bool? _canMasquerade; - bool? get canMasquerade => _$this._canMasquerade; - set canMasquerade(bool? canMasquerade) => - _$this._canMasquerade = canMasquerade; - - UserBuilder? _masqueradeUser; - UserBuilder get masqueradeUser => - _$this._masqueradeUser ??= new UserBuilder(); - set masqueradeUser(UserBuilder? masqueradeUser) => - _$this._masqueradeUser = masqueradeUser; - - String? _masqueradeDomain; - String? get masqueradeDomain => _$this._masqueradeDomain; - set masqueradeDomain(String? masqueradeDomain) => - _$this._masqueradeDomain = masqueradeDomain; - - bool? _isMasqueradingFromQRCode; - bool? get isMasqueradingFromQRCode => _$this._isMasqueradingFromQRCode; - set isMasqueradingFromQRCode(bool? isMasqueradingFromQRCode) => - _$this._isMasqueradingFromQRCode = isMasqueradingFromQRCode; - - LoginBuilder() { - Login._initializeBuilder(this); - } - - LoginBuilder get _$this { - final $v = _$v; - if ($v != null) { - _uuid = $v.uuid; - _domain = $v.domain; - _clientId = $v.clientId; - _clientSecret = $v.clientSecret; - _accessToken = $v.accessToken; - _refreshToken = $v.refreshToken; - _user = $v.user.toBuilder(); - _selectedStudentId = $v.selectedStudentId; - _canMasquerade = $v.canMasquerade; - _masqueradeUser = $v.masqueradeUser?.toBuilder(); - _masqueradeDomain = $v.masqueradeDomain; - _isMasqueradingFromQRCode = $v.isMasqueradingFromQRCode; - _$v = null; - } - return this; - } - - @override - void replace(Login other) { - ArgumentError.checkNotNull(other, 'other'); - _$v = other as _$Login; - } - - @override - void update(void Function(LoginBuilder)? updates) { - if (updates != null) updates(this); - } - - @override - Login build() => _build(); - - _$Login _build() { - _$Login _$result; - try { - _$result = _$v ?? - new _$Login._( - uuid: - BuiltValueNullFieldError.checkNotNull(uuid, r'Login', 'uuid'), - domain: BuiltValueNullFieldError.checkNotNull( - domain, r'Login', 'domain'), - clientId: clientId, - clientSecret: clientSecret, - accessToken: BuiltValueNullFieldError.checkNotNull( - accessToken, r'Login', 'accessToken'), - refreshToken: BuiltValueNullFieldError.checkNotNull( - refreshToken, r'Login', 'refreshToken'), - user: user.build(), - selectedStudentId: selectedStudentId, - canMasquerade: canMasquerade, - masqueradeUser: _masqueradeUser?.build(), - masqueradeDomain: masqueradeDomain, - isMasqueradingFromQRCode: isMasqueradingFromQRCode); - } catch (_) { - late String _$failedField; - try { - _$failedField = 'user'; - user.build(); - - _$failedField = 'masqueradeUser'; - _masqueradeUser?.build(); - } catch (e) { - throw new BuiltValueNestedFieldError( - r'Login', _$failedField, e.toString()); - } - rethrow; - } - replace(_$result); - return _$result; - } -} - -// ignore_for_file: deprecated_member_use_from_same_package,type=lint diff --git a/apps/flutter_parent/lib/models/media_comment.dart b/apps/flutter_parent/lib/models/media_comment.dart deleted file mode 100644 index f10d9d9995..0000000000 --- a/apps/flutter_parent/lib/models/media_comment.dart +++ /dev/null @@ -1,74 +0,0 @@ -// Copyright (C) 2019 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:built_collection/built_collection.dart'; -import 'package:built_value/built_value.dart'; -import 'package:built_value/json_object.dart'; -import 'package:built_value/serializer.dart'; - -import 'attachment.dart'; - -part 'media_comment.g.dart'; - -/// To have this built_value be generated, run this command from the project root: -/// flutter pub run build_runner build -abstract class MediaComment implements Built { - @BuiltValueSerializer(serializeNulls: true) // Add this line to get nulls to serialize when we convert to JSON - static Serializer get serializer => _$mediaCommentSerializer; - - @BuiltValueField(wireName: 'media_id') - String? get mediaId; - - @BuiltValueField(wireName: 'display_name') - String? get displayName; - - String? get url; - - /// Can be either 'audio' or 'video' - @BuiltValueField(wireName: 'media_type') - MediaType get mediaType; - - @BuiltValueField(wireName: 'content-type') - String? get contentType; - - MediaComment._(); - factory MediaComment([void Function(MediaCommentBuilder) updates]) = _$MediaComment; - - Attachment toAttachment() { - return Attachment((a) => a - ..jsonId = JsonObject('media-comment-$mediaId') - ..contentType = contentType - ..filename = mediaId - ..displayName = displayName - ..url = url); - } -} - -@BuiltValueEnum(wireName: 'media_type') -class MediaType extends EnumClass { - const MediaType._(String name) : super(name); - - static BuiltSet get values => _$mediaTypeValues; - - static MediaType valueOf(String name) => _$mediaTypeValueOf(name); - - static Serializer get serializer => _$mediaTypeSerializer; - - static const MediaType audio = _$mediaTypeAudio; - - static const MediaType video = _$mediaTypeVideo; - - @BuiltValueEnumConst(fallback: true) - static const MediaType unknown = _$mediaTypeUnknown; -} diff --git a/apps/flutter_parent/lib/models/media_comment.g.dart b/apps/flutter_parent/lib/models/media_comment.g.dart deleted file mode 100644 index 5b963aa3c4..0000000000 --- a/apps/flutter_parent/lib/models/media_comment.g.dart +++ /dev/null @@ -1,271 +0,0 @@ -// GENERATED CODE - DO NOT MODIFY BY HAND - -part of 'media_comment.dart'; - -// ************************************************************************** -// BuiltValueGenerator -// ************************************************************************** - -const MediaType _$mediaTypeAudio = const MediaType._('audio'); -const MediaType _$mediaTypeVideo = const MediaType._('video'); -const MediaType _$mediaTypeUnknown = const MediaType._('unknown'); - -MediaType _$mediaTypeValueOf(String name) { - switch (name) { - case 'audio': - return _$mediaTypeAudio; - case 'video': - return _$mediaTypeVideo; - case 'unknown': - return _$mediaTypeUnknown; - default: - return _$mediaTypeUnknown; - } -} - -final BuiltSet _$mediaTypeValues = - new BuiltSet(const [ - _$mediaTypeAudio, - _$mediaTypeVideo, - _$mediaTypeUnknown, -]); - -Serializer _$mediaCommentSerializer = - new _$MediaCommentSerializer(); -Serializer _$mediaTypeSerializer = new _$MediaTypeSerializer(); - -class _$MediaCommentSerializer implements StructuredSerializer { - @override - final Iterable types = const [MediaComment, _$MediaComment]; - @override - final String wireName = 'MediaComment'; - - @override - Iterable serialize(Serializers serializers, MediaComment object, - {FullType specifiedType = FullType.unspecified}) { - final result = [ - 'media_type', - serializers.serialize(object.mediaType, - specifiedType: const FullType(MediaType)), - ]; - Object? value; - value = object.mediaId; - - result - ..add('media_id') - ..add( - serializers.serialize(value, specifiedType: const FullType(String))); - value = object.displayName; - - result - ..add('display_name') - ..add( - serializers.serialize(value, specifiedType: const FullType(String))); - value = object.url; - - result - ..add('url') - ..add( - serializers.serialize(value, specifiedType: const FullType(String))); - value = object.contentType; - - result - ..add('content-type') - ..add( - serializers.serialize(value, specifiedType: const FullType(String))); - - return result; - } - - @override - MediaComment deserialize( - Serializers serializers, Iterable serialized, - {FullType specifiedType = FullType.unspecified}) { - final result = new MediaCommentBuilder(); - - final iterator = serialized.iterator; - while (iterator.moveNext()) { - final key = iterator.current! as String; - iterator.moveNext(); - final Object? value = iterator.current; - switch (key) { - case 'media_id': - result.mediaId = serializers.deserialize(value, - specifiedType: const FullType(String)) as String?; - break; - case 'display_name': - result.displayName = serializers.deserialize(value, - specifiedType: const FullType(String)) as String?; - break; - case 'url': - result.url = serializers.deserialize(value, - specifiedType: const FullType(String)) as String?; - break; - case 'media_type': - result.mediaType = serializers.deserialize(value, - specifiedType: const FullType(MediaType))! as MediaType; - break; - case 'content-type': - result.contentType = serializers.deserialize(value, - specifiedType: const FullType(String)) as String?; - break; - } - } - - return result.build(); - } -} - -class _$MediaTypeSerializer implements PrimitiveSerializer { - @override - final Iterable types = const [MediaType]; - @override - final String wireName = 'media_type'; - - @override - Object serialize(Serializers serializers, MediaType object, - {FullType specifiedType = FullType.unspecified}) => - object.name; - - @override - MediaType deserialize(Serializers serializers, Object serialized, - {FullType specifiedType = FullType.unspecified}) => - MediaType.valueOf(serialized as String); -} - -class _$MediaComment extends MediaComment { - @override - final String? mediaId; - @override - final String? displayName; - @override - final String? url; - @override - final MediaType mediaType; - @override - final String? contentType; - - factory _$MediaComment([void Function(MediaCommentBuilder)? updates]) => - (new MediaCommentBuilder()..update(updates))._build(); - - _$MediaComment._( - {this.mediaId, - this.displayName, - this.url, - required this.mediaType, - this.contentType}) - : super._() { - BuiltValueNullFieldError.checkNotNull( - mediaType, r'MediaComment', 'mediaType'); - } - - @override - MediaComment rebuild(void Function(MediaCommentBuilder) updates) => - (toBuilder()..update(updates)).build(); - - @override - MediaCommentBuilder toBuilder() => new MediaCommentBuilder()..replace(this); - - @override - bool operator ==(Object other) { - if (identical(other, this)) return true; - return other is MediaComment && - mediaId == other.mediaId && - displayName == other.displayName && - url == other.url && - mediaType == other.mediaType && - contentType == other.contentType; - } - - @override - int get hashCode { - var _$hash = 0; - _$hash = $jc(_$hash, mediaId.hashCode); - _$hash = $jc(_$hash, displayName.hashCode); - _$hash = $jc(_$hash, url.hashCode); - _$hash = $jc(_$hash, mediaType.hashCode); - _$hash = $jc(_$hash, contentType.hashCode); - _$hash = $jf(_$hash); - return _$hash; - } - - @override - String toString() { - return (newBuiltValueToStringHelper(r'MediaComment') - ..add('mediaId', mediaId) - ..add('displayName', displayName) - ..add('url', url) - ..add('mediaType', mediaType) - ..add('contentType', contentType)) - .toString(); - } -} - -class MediaCommentBuilder - implements Builder { - _$MediaComment? _$v; - - String? _mediaId; - String? get mediaId => _$this._mediaId; - set mediaId(String? mediaId) => _$this._mediaId = mediaId; - - String? _displayName; - String? get displayName => _$this._displayName; - set displayName(String? displayName) => _$this._displayName = displayName; - - String? _url; - String? get url => _$this._url; - set url(String? url) => _$this._url = url; - - MediaType? _mediaType; - MediaType? get mediaType => _$this._mediaType; - set mediaType(MediaType? mediaType) => _$this._mediaType = mediaType; - - String? _contentType; - String? get contentType => _$this._contentType; - set contentType(String? contentType) => _$this._contentType = contentType; - - MediaCommentBuilder(); - - MediaCommentBuilder get _$this { - final $v = _$v; - if ($v != null) { - _mediaId = $v.mediaId; - _displayName = $v.displayName; - _url = $v.url; - _mediaType = $v.mediaType; - _contentType = $v.contentType; - _$v = null; - } - return this; - } - - @override - void replace(MediaComment other) { - ArgumentError.checkNotNull(other, 'other'); - _$v = other as _$MediaComment; - } - - @override - void update(void Function(MediaCommentBuilder)? updates) { - if (updates != null) updates(this); - } - - @override - MediaComment build() => _build(); - - _$MediaComment _build() { - final _$result = _$v ?? - new _$MediaComment._( - mediaId: mediaId, - displayName: displayName, - url: url, - mediaType: BuiltValueNullFieldError.checkNotNull( - mediaType, r'MediaComment', 'mediaType'), - contentType: contentType); - replace(_$result); - return _$result; - } -} - -// ignore_for_file: deprecated_member_use_from_same_package,type=lint diff --git a/apps/flutter_parent/lib/models/message.dart b/apps/flutter_parent/lib/models/message.dart deleted file mode 100644 index 963e2b3950..0000000000 --- a/apps/flutter_parent/lib/models/message.dart +++ /dev/null @@ -1,61 +0,0 @@ -// Copyright (C) 2019 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:built_collection/built_collection.dart'; -import 'package:built_value/built_value.dart'; -import 'package:built_value/serializer.dart'; - -import 'attachment.dart'; -import 'media_comment.dart'; - -part 'message.g.dart'; - -/// To have this built_value be generated, run this command from the project root: -/// flutter pub run build_runner build -abstract class Message implements Built { - @BuiltValueSerializer(serializeNulls: true) // Add this line to get nulls to serialize when we convert to JSON - static Serializer get serializer => _$messageSerializer; - - String get id; - - @BuiltValueField(wireName: 'created_at') - DateTime? get createdAt; - - String? get body; - - @BuiltValueField(wireName: 'author_id') - String get authorId; - - @BuiltValueField(wireName: 'generated') - bool get isGenerated; - - BuiltList? get attachments; - - @BuiltValueField(wireName: 'media_comment') - MediaComment? get mediaComment; - - @BuiltValueField(wireName: 'forwarded_messages') - BuiltList? get forwardedMessages; - - @BuiltValueField(wireName: 'participating_user_ids') - BuiltList? get participatingUserIds; - - Message._(); - factory Message([void Function(MessageBuilder) updates]) = _$Message; - - static void _initializeBuilder(MessageBuilder b) => b - ..id = '' - ..authorId = '' - ..isGenerated = false; -} diff --git a/apps/flutter_parent/lib/models/message.g.dart b/apps/flutter_parent/lib/models/message.g.dart deleted file mode 100644 index c8455f141a..0000000000 --- a/apps/flutter_parent/lib/models/message.g.dart +++ /dev/null @@ -1,348 +0,0 @@ -// GENERATED CODE - DO NOT MODIFY BY HAND - -part of 'message.dart'; - -// ************************************************************************** -// BuiltValueGenerator -// ************************************************************************** - -Serializer _$messageSerializer = new _$MessageSerializer(); - -class _$MessageSerializer implements StructuredSerializer { - @override - final Iterable types = const [Message, _$Message]; - @override - final String wireName = 'Message'; - - @override - Iterable serialize(Serializers serializers, Message object, - {FullType specifiedType = FullType.unspecified}) { - final result = [ - 'id', - serializers.serialize(object.id, specifiedType: const FullType(String)), - 'author_id', - serializers.serialize(object.authorId, - specifiedType: const FullType(String)), - 'generated', - serializers.serialize(object.isGenerated, - specifiedType: const FullType(bool)), - ]; - Object? value; - value = object.createdAt; - - result - ..add('created_at') - ..add(serializers.serialize(value, - specifiedType: const FullType(DateTime))); - value = object.body; - - result - ..add('body') - ..add( - serializers.serialize(value, specifiedType: const FullType(String))); - value = object.attachments; - - result - ..add('attachments') - ..add(serializers.serialize(value, - specifiedType: - const FullType(BuiltList, const [const FullType(Attachment)]))); - value = object.mediaComment; - - result - ..add('media_comment') - ..add(serializers.serialize(value, - specifiedType: const FullType(MediaComment))); - value = object.forwardedMessages; - - result - ..add('forwarded_messages') - ..add(serializers.serialize(value, - specifiedType: - const FullType(BuiltList, const [const FullType(Message)]))); - value = object.participatingUserIds; - - result - ..add('participating_user_ids') - ..add(serializers.serialize(value, - specifiedType: - const FullType(BuiltList, const [const FullType(String)]))); - - return result; - } - - @override - Message deserialize(Serializers serializers, Iterable serialized, - {FullType specifiedType = FullType.unspecified}) { - final result = new MessageBuilder(); - - final iterator = serialized.iterator; - while (iterator.moveNext()) { - final key = iterator.current! as String; - iterator.moveNext(); - final Object? value = iterator.current; - switch (key) { - case 'id': - result.id = serializers.deserialize(value, - specifiedType: const FullType(String))! as String; - break; - case 'created_at': - result.createdAt = serializers.deserialize(value, - specifiedType: const FullType(DateTime)) as DateTime?; - break; - case 'body': - result.body = serializers.deserialize(value, - specifiedType: const FullType(String)) as String?; - break; - case 'author_id': - result.authorId = serializers.deserialize(value, - specifiedType: const FullType(String))! as String; - break; - case 'generated': - result.isGenerated = serializers.deserialize(value, - specifiedType: const FullType(bool))! as bool; - break; - case 'attachments': - result.attachments.replace(serializers.deserialize(value, - specifiedType: const FullType( - BuiltList, const [const FullType(Attachment)]))! - as BuiltList); - break; - case 'media_comment': - result.mediaComment.replace(serializers.deserialize(value, - specifiedType: const FullType(MediaComment))! as MediaComment); - break; - case 'forwarded_messages': - result.forwardedMessages.replace(serializers.deserialize(value, - specifiedType: const FullType( - BuiltList, const [const FullType(Message)]))! - as BuiltList); - break; - case 'participating_user_ids': - result.participatingUserIds.replace(serializers.deserialize(value, - specifiedType: const FullType( - BuiltList, const [const FullType(String)]))! - as BuiltList); - break; - } - } - - return result.build(); - } -} - -class _$Message extends Message { - @override - final String id; - @override - final DateTime? createdAt; - @override - final String? body; - @override - final String authorId; - @override - final bool isGenerated; - @override - final BuiltList? attachments; - @override - final MediaComment? mediaComment; - @override - final BuiltList? forwardedMessages; - @override - final BuiltList? participatingUserIds; - - factory _$Message([void Function(MessageBuilder)? updates]) => - (new MessageBuilder()..update(updates))._build(); - - _$Message._( - {required this.id, - this.createdAt, - this.body, - required this.authorId, - required this.isGenerated, - this.attachments, - this.mediaComment, - this.forwardedMessages, - this.participatingUserIds}) - : super._() { - BuiltValueNullFieldError.checkNotNull(id, r'Message', 'id'); - BuiltValueNullFieldError.checkNotNull(authorId, r'Message', 'authorId'); - BuiltValueNullFieldError.checkNotNull( - isGenerated, r'Message', 'isGenerated'); - } - - @override - Message rebuild(void Function(MessageBuilder) updates) => - (toBuilder()..update(updates)).build(); - - @override - MessageBuilder toBuilder() => new MessageBuilder()..replace(this); - - @override - bool operator ==(Object other) { - if (identical(other, this)) return true; - return other is Message && - id == other.id && - createdAt == other.createdAt && - body == other.body && - authorId == other.authorId && - isGenerated == other.isGenerated && - attachments == other.attachments && - mediaComment == other.mediaComment && - forwardedMessages == other.forwardedMessages && - participatingUserIds == other.participatingUserIds; - } - - @override - int get hashCode { - var _$hash = 0; - _$hash = $jc(_$hash, id.hashCode); - _$hash = $jc(_$hash, createdAt.hashCode); - _$hash = $jc(_$hash, body.hashCode); - _$hash = $jc(_$hash, authorId.hashCode); - _$hash = $jc(_$hash, isGenerated.hashCode); - _$hash = $jc(_$hash, attachments.hashCode); - _$hash = $jc(_$hash, mediaComment.hashCode); - _$hash = $jc(_$hash, forwardedMessages.hashCode); - _$hash = $jc(_$hash, participatingUserIds.hashCode); - _$hash = $jf(_$hash); - return _$hash; - } - - @override - String toString() { - return (newBuiltValueToStringHelper(r'Message') - ..add('id', id) - ..add('createdAt', createdAt) - ..add('body', body) - ..add('authorId', authorId) - ..add('isGenerated', isGenerated) - ..add('attachments', attachments) - ..add('mediaComment', mediaComment) - ..add('forwardedMessages', forwardedMessages) - ..add('participatingUserIds', participatingUserIds)) - .toString(); - } -} - -class MessageBuilder implements Builder { - _$Message? _$v; - - String? _id; - String? get id => _$this._id; - set id(String? id) => _$this._id = id; - - DateTime? _createdAt; - DateTime? get createdAt => _$this._createdAt; - set createdAt(DateTime? createdAt) => _$this._createdAt = createdAt; - - String? _body; - String? get body => _$this._body; - set body(String? body) => _$this._body = body; - - String? _authorId; - String? get authorId => _$this._authorId; - set authorId(String? authorId) => _$this._authorId = authorId; - - bool? _isGenerated; - bool? get isGenerated => _$this._isGenerated; - set isGenerated(bool? isGenerated) => _$this._isGenerated = isGenerated; - - ListBuilder? _attachments; - ListBuilder get attachments => - _$this._attachments ??= new ListBuilder(); - set attachments(ListBuilder? attachments) => - _$this._attachments = attachments; - - MediaCommentBuilder? _mediaComment; - MediaCommentBuilder get mediaComment => - _$this._mediaComment ??= new MediaCommentBuilder(); - set mediaComment(MediaCommentBuilder? mediaComment) => - _$this._mediaComment = mediaComment; - - ListBuilder? _forwardedMessages; - ListBuilder get forwardedMessages => - _$this._forwardedMessages ??= new ListBuilder(); - set forwardedMessages(ListBuilder? forwardedMessages) => - _$this._forwardedMessages = forwardedMessages; - - ListBuilder? _participatingUserIds; - ListBuilder get participatingUserIds => - _$this._participatingUserIds ??= new ListBuilder(); - set participatingUserIds(ListBuilder? participatingUserIds) => - _$this._participatingUserIds = participatingUserIds; - - MessageBuilder() { - Message._initializeBuilder(this); - } - - MessageBuilder get _$this { - final $v = _$v; - if ($v != null) { - _id = $v.id; - _createdAt = $v.createdAt; - _body = $v.body; - _authorId = $v.authorId; - _isGenerated = $v.isGenerated; - _attachments = $v.attachments?.toBuilder(); - _mediaComment = $v.mediaComment?.toBuilder(); - _forwardedMessages = $v.forwardedMessages?.toBuilder(); - _participatingUserIds = $v.participatingUserIds?.toBuilder(); - _$v = null; - } - return this; - } - - @override - void replace(Message other) { - ArgumentError.checkNotNull(other, 'other'); - _$v = other as _$Message; - } - - @override - void update(void Function(MessageBuilder)? updates) { - if (updates != null) updates(this); - } - - @override - Message build() => _build(); - - _$Message _build() { - _$Message _$result; - try { - _$result = _$v ?? - new _$Message._( - id: BuiltValueNullFieldError.checkNotNull(id, r'Message', 'id'), - createdAt: createdAt, - body: body, - authorId: BuiltValueNullFieldError.checkNotNull( - authorId, r'Message', 'authorId'), - isGenerated: BuiltValueNullFieldError.checkNotNull( - isGenerated, r'Message', 'isGenerated'), - attachments: _attachments?.build(), - mediaComment: _mediaComment?.build(), - forwardedMessages: _forwardedMessages?.build(), - participatingUserIds: _participatingUserIds?.build()); - } catch (_) { - late String _$failedField; - try { - _$failedField = 'attachments'; - _attachments?.build(); - _$failedField = 'mediaComment'; - _mediaComment?.build(); - _$failedField = 'forwardedMessages'; - _forwardedMessages?.build(); - _$failedField = 'participatingUserIds'; - _participatingUserIds?.build(); - } catch (e) { - throw new BuiltValueNestedFieldError( - r'Message', _$failedField, e.toString()); - } - rethrow; - } - replace(_$result); - return _$result; - } -} - -// ignore_for_file: deprecated_member_use_from_same_package,type=lint diff --git a/apps/flutter_parent/lib/models/mobile_verify_result.dart b/apps/flutter_parent/lib/models/mobile_verify_result.dart deleted file mode 100644 index e29320e37a..0000000000 --- a/apps/flutter_parent/lib/models/mobile_verify_result.dart +++ /dev/null @@ -1,81 +0,0 @@ -// Copyright (C) 2019 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:built_collection/built_collection.dart'; -import 'package:built_value/built_value.dart'; -import 'package:built_value/serializer.dart'; - -part 'mobile_verify_result.g.dart'; - -/// To have this built_value be generated, run this command from the project root: -/// flutter packages pub run build_runner build --delete-conflicting-outputs -abstract class MobileVerifyResult implements Built { - @BuiltValueSerializer(serializeNulls: true) // Add this line to get nulls to serialize when we convert to JSON - static Serializer get serializer => _$mobileVerifyResultSerializer; - - MobileVerifyResult._(); - - factory MobileVerifyResult([void Function(MobileVerifyResultBuilder) updates]) = _$MobileVerifyResult; - - bool get authorized; - - VerifyResultEnum get result; - - @BuiltValueField(wireName: 'client_id') - String get clientId; - - @BuiltValueField(wireName: 'client_secret') - String get clientSecret; - - @BuiltValueField(wireName: 'api_key') - String get apiKey; - - @BuiltValueField(wireName: 'base_url') - String get baseUrl; - - static void _initializeBuilder(MobileVerifyResultBuilder b) => b - ..authorized = true - ..result = VerifyResultEnum.success - ..clientId = '' - ..clientSecret = '' - ..apiKey = '' - ..baseUrl = ''; -} - -enum VerifyResultEnum { - success, - generalError, - domainNotAuthorized, - unknownUserAgent, - unknownError, -} - -class ResultEnumSerializer extends PrimitiveSerializer { - @override - final Iterable types = BuiltList([VerifyResultEnum]); - - @override - final String wireName = 'int'; - - @override - Object serialize(Serializers serializers, VerifyResultEnum integer, {FullType specifiedType = FullType.unspecified}) { - return integer.index; - } - - @override - VerifyResultEnum deserialize(Serializers serializers, Object serialized, - {FullType specifiedType = FullType.unspecified}) { - return VerifyResultEnum.values[serialized as int]; - } -} diff --git a/apps/flutter_parent/lib/models/mobile_verify_result.g.dart b/apps/flutter_parent/lib/models/mobile_verify_result.g.dart deleted file mode 100644 index f97c0088fa..0000000000 --- a/apps/flutter_parent/lib/models/mobile_verify_result.g.dart +++ /dev/null @@ -1,258 +0,0 @@ -// GENERATED CODE - DO NOT MODIFY BY HAND - -part of 'mobile_verify_result.dart'; - -// ************************************************************************** -// BuiltValueGenerator -// ************************************************************************** - -Serializer _$mobileVerifyResultSerializer = - new _$MobileVerifyResultSerializer(); - -class _$MobileVerifyResultSerializer - implements StructuredSerializer { - @override - final Iterable types = const [MobileVerifyResult, _$MobileVerifyResult]; - @override - final String wireName = 'MobileVerifyResult'; - - @override - Iterable serialize( - Serializers serializers, MobileVerifyResult object, - {FullType specifiedType = FullType.unspecified}) { - final result = [ - 'authorized', - serializers.serialize(object.authorized, - specifiedType: const FullType(bool)), - 'result', - serializers.serialize(object.result, - specifiedType: const FullType(VerifyResultEnum)), - 'client_id', - serializers.serialize(object.clientId, - specifiedType: const FullType(String)), - 'client_secret', - serializers.serialize(object.clientSecret, - specifiedType: const FullType(String)), - 'api_key', - serializers.serialize(object.apiKey, - specifiedType: const FullType(String)), - 'base_url', - serializers.serialize(object.baseUrl, - specifiedType: const FullType(String)), - ]; - - return result; - } - - @override - MobileVerifyResult deserialize( - Serializers serializers, Iterable serialized, - {FullType specifiedType = FullType.unspecified}) { - final result = new MobileVerifyResultBuilder(); - - final iterator = serialized.iterator; - while (iterator.moveNext()) { - final key = iterator.current! as String; - iterator.moveNext(); - final Object? value = iterator.current; - switch (key) { - case 'authorized': - result.authorized = serializers.deserialize(value, - specifiedType: const FullType(bool))! as bool; - break; - case 'result': - result.result = serializers.deserialize(value, - specifiedType: const FullType(VerifyResultEnum))! - as VerifyResultEnum; - break; - case 'client_id': - result.clientId = serializers.deserialize(value, - specifiedType: const FullType(String))! as String; - break; - case 'client_secret': - result.clientSecret = serializers.deserialize(value, - specifiedType: const FullType(String))! as String; - break; - case 'api_key': - result.apiKey = serializers.deserialize(value, - specifiedType: const FullType(String))! as String; - break; - case 'base_url': - result.baseUrl = serializers.deserialize(value, - specifiedType: const FullType(String))! as String; - break; - } - } - - return result.build(); - } -} - -class _$MobileVerifyResult extends MobileVerifyResult { - @override - final bool authorized; - @override - final VerifyResultEnum result; - @override - final String clientId; - @override - final String clientSecret; - @override - final String apiKey; - @override - final String baseUrl; - - factory _$MobileVerifyResult( - [void Function(MobileVerifyResultBuilder)? updates]) => - (new MobileVerifyResultBuilder()..update(updates))._build(); - - _$MobileVerifyResult._( - {required this.authorized, - required this.result, - required this.clientId, - required this.clientSecret, - required this.apiKey, - required this.baseUrl}) - : super._() { - BuiltValueNullFieldError.checkNotNull( - authorized, r'MobileVerifyResult', 'authorized'); - BuiltValueNullFieldError.checkNotNull( - result, r'MobileVerifyResult', 'result'); - BuiltValueNullFieldError.checkNotNull( - clientId, r'MobileVerifyResult', 'clientId'); - BuiltValueNullFieldError.checkNotNull( - clientSecret, r'MobileVerifyResult', 'clientSecret'); - BuiltValueNullFieldError.checkNotNull( - apiKey, r'MobileVerifyResult', 'apiKey'); - BuiltValueNullFieldError.checkNotNull( - baseUrl, r'MobileVerifyResult', 'baseUrl'); - } - - @override - MobileVerifyResult rebuild( - void Function(MobileVerifyResultBuilder) updates) => - (toBuilder()..update(updates)).build(); - - @override - MobileVerifyResultBuilder toBuilder() => - new MobileVerifyResultBuilder()..replace(this); - - @override - bool operator ==(Object other) { - if (identical(other, this)) return true; - return other is MobileVerifyResult && - authorized == other.authorized && - result == other.result && - clientId == other.clientId && - clientSecret == other.clientSecret && - apiKey == other.apiKey && - baseUrl == other.baseUrl; - } - - @override - int get hashCode { - var _$hash = 0; - _$hash = $jc(_$hash, authorized.hashCode); - _$hash = $jc(_$hash, result.hashCode); - _$hash = $jc(_$hash, clientId.hashCode); - _$hash = $jc(_$hash, clientSecret.hashCode); - _$hash = $jc(_$hash, apiKey.hashCode); - _$hash = $jc(_$hash, baseUrl.hashCode); - _$hash = $jf(_$hash); - return _$hash; - } - - @override - String toString() { - return (newBuiltValueToStringHelper(r'MobileVerifyResult') - ..add('authorized', authorized) - ..add('result', result) - ..add('clientId', clientId) - ..add('clientSecret', clientSecret) - ..add('apiKey', apiKey) - ..add('baseUrl', baseUrl)) - .toString(); - } -} - -class MobileVerifyResultBuilder - implements Builder { - _$MobileVerifyResult? _$v; - - bool? _authorized; - bool? get authorized => _$this._authorized; - set authorized(bool? authorized) => _$this._authorized = authorized; - - VerifyResultEnum? _result; - VerifyResultEnum? get result => _$this._result; - set result(VerifyResultEnum? result) => _$this._result = result; - - String? _clientId; - String? get clientId => _$this._clientId; - set clientId(String? clientId) => _$this._clientId = clientId; - - String? _clientSecret; - String? get clientSecret => _$this._clientSecret; - set clientSecret(String? clientSecret) => _$this._clientSecret = clientSecret; - - String? _apiKey; - String? get apiKey => _$this._apiKey; - set apiKey(String? apiKey) => _$this._apiKey = apiKey; - - String? _baseUrl; - String? get baseUrl => _$this._baseUrl; - set baseUrl(String? baseUrl) => _$this._baseUrl = baseUrl; - - MobileVerifyResultBuilder() { - MobileVerifyResult._initializeBuilder(this); - } - - MobileVerifyResultBuilder get _$this { - final $v = _$v; - if ($v != null) { - _authorized = $v.authorized; - _result = $v.result; - _clientId = $v.clientId; - _clientSecret = $v.clientSecret; - _apiKey = $v.apiKey; - _baseUrl = $v.baseUrl; - _$v = null; - } - return this; - } - - @override - void replace(MobileVerifyResult other) { - ArgumentError.checkNotNull(other, 'other'); - _$v = other as _$MobileVerifyResult; - } - - @override - void update(void Function(MobileVerifyResultBuilder)? updates) { - if (updates != null) updates(this); - } - - @override - MobileVerifyResult build() => _build(); - - _$MobileVerifyResult _build() { - final _$result = _$v ?? - new _$MobileVerifyResult._( - authorized: BuiltValueNullFieldError.checkNotNull( - authorized, r'MobileVerifyResult', 'authorized'), - result: BuiltValueNullFieldError.checkNotNull( - result, r'MobileVerifyResult', 'result'), - clientId: BuiltValueNullFieldError.checkNotNull( - clientId, r'MobileVerifyResult', 'clientId'), - clientSecret: BuiltValueNullFieldError.checkNotNull( - clientSecret, r'MobileVerifyResult', 'clientSecret'), - apiKey: BuiltValueNullFieldError.checkNotNull( - apiKey, r'MobileVerifyResult', 'apiKey'), - baseUrl: BuiltValueNullFieldError.checkNotNull( - baseUrl, r'MobileVerifyResult', 'baseUrl')); - replace(_$result); - return _$result; - } -} - -// ignore_for_file: deprecated_member_use_from_same_package,type=lint diff --git a/apps/flutter_parent/lib/models/notification_payload.dart b/apps/flutter_parent/lib/models/notification_payload.dart deleted file mode 100644 index 19ff3b1f98..0000000000 --- a/apps/flutter_parent/lib/models/notification_payload.dart +++ /dev/null @@ -1,50 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:built_collection/built_collection.dart'; -import 'package:built_value/built_value.dart'; -import 'package:built_value/serializer.dart'; - -part 'notification_payload.g.dart'; - -/// To have this built_value be generated, run this command from the project root: -/// flutter pub run build_runner build --delete-conflicting-outputs -abstract class NotificationPayload implements Built { - @BuiltValueSerializer(serializeNulls: true) // Add this line to get nulls to serialize when we convert to JSON - static Serializer get serializer => _$notificationPayloadSerializer; - - NotificationPayloadType get type; - - String? get data; - - NotificationPayload._(); - factory NotificationPayload([void Function(NotificationPayloadBuilder) updates]) = _$NotificationPayload; -} - -@BuiltValueEnum(wireName: 'type') -class NotificationPayloadType extends EnumClass { - const NotificationPayloadType._(String name) : super(name); - - static BuiltSet get values => _$notificationPayloadTypeValues; - - static NotificationPayloadType valueOf(String name) => _$notificationPayloadTypeValueOf(name); - - static Serializer get serializer => _$notificationPayloadTypeSerializer; - - @BuiltValueEnumConst(wireName: 'reminder') - static const NotificationPayloadType reminder = _$notificationPayloadTypeReminder; - - @BuiltValueEnumConst(fallback: true) - static const NotificationPayloadType other = _$notificationPayloadTypeOther; -} diff --git a/apps/flutter_parent/lib/models/notification_payload.g.dart b/apps/flutter_parent/lib/models/notification_payload.g.dart deleted file mode 100644 index ee664136d1..0000000000 --- a/apps/flutter_parent/lib/models/notification_payload.g.dart +++ /dev/null @@ -1,219 +0,0 @@ -// GENERATED CODE - DO NOT MODIFY BY HAND - -part of 'notification_payload.dart'; - -// ************************************************************************** -// BuiltValueGenerator -// ************************************************************************** - -const NotificationPayloadType _$notificationPayloadTypeReminder = - const NotificationPayloadType._('reminder'); -const NotificationPayloadType _$notificationPayloadTypeOther = - const NotificationPayloadType._('other'); - -NotificationPayloadType _$notificationPayloadTypeValueOf(String name) { - switch (name) { - case 'reminder': - return _$notificationPayloadTypeReminder; - case 'other': - return _$notificationPayloadTypeOther; - default: - return _$notificationPayloadTypeOther; - } -} - -final BuiltSet _$notificationPayloadTypeValues = - new BuiltSet(const [ - _$notificationPayloadTypeReminder, - _$notificationPayloadTypeOther, -]); - -Serializer _$notificationPayloadSerializer = - new _$NotificationPayloadSerializer(); -Serializer _$notificationPayloadTypeSerializer = - new _$NotificationPayloadTypeSerializer(); - -class _$NotificationPayloadSerializer - implements StructuredSerializer { - @override - final Iterable types = const [ - NotificationPayload, - _$NotificationPayload - ]; - @override - final String wireName = 'NotificationPayload'; - - @override - Iterable serialize( - Serializers serializers, NotificationPayload object, - {FullType specifiedType = FullType.unspecified}) { - final result = [ - 'type', - serializers.serialize(object.type, - specifiedType: const FullType(NotificationPayloadType)), - ]; - Object? value; - value = object.data; - - result - ..add('data') - ..add( - serializers.serialize(value, specifiedType: const FullType(String))); - - return result; - } - - @override - NotificationPayload deserialize( - Serializers serializers, Iterable serialized, - {FullType specifiedType = FullType.unspecified}) { - final result = new NotificationPayloadBuilder(); - - final iterator = serialized.iterator; - while (iterator.moveNext()) { - final key = iterator.current! as String; - iterator.moveNext(); - final Object? value = iterator.current; - switch (key) { - case 'type': - result.type = serializers.deserialize(value, - specifiedType: const FullType(NotificationPayloadType))! - as NotificationPayloadType; - break; - case 'data': - result.data = serializers.deserialize(value, - specifiedType: const FullType(String)) as String?; - break; - } - } - - return result.build(); - } -} - -class _$NotificationPayloadTypeSerializer - implements PrimitiveSerializer { - static const Map _toWire = const { - 'reminder': 'reminder', - }; - static const Map _fromWire = const { - 'reminder': 'reminder', - }; - - @override - final Iterable types = const [NotificationPayloadType]; - @override - final String wireName = 'type'; - - @override - Object serialize(Serializers serializers, NotificationPayloadType object, - {FullType specifiedType = FullType.unspecified}) => - _toWire[object.name] ?? object.name; - - @override - NotificationPayloadType deserialize( - Serializers serializers, Object serialized, - {FullType specifiedType = FullType.unspecified}) => - NotificationPayloadType.valueOf( - _fromWire[serialized] ?? (serialized is String ? serialized : '')); -} - -class _$NotificationPayload extends NotificationPayload { - @override - final NotificationPayloadType type; - @override - final String? data; - - factory _$NotificationPayload( - [void Function(NotificationPayloadBuilder)? updates]) => - (new NotificationPayloadBuilder()..update(updates))._build(); - - _$NotificationPayload._({required this.type, this.data}) : super._() { - BuiltValueNullFieldError.checkNotNull(type, r'NotificationPayload', 'type'); - } - - @override - NotificationPayload rebuild( - void Function(NotificationPayloadBuilder) updates) => - (toBuilder()..update(updates)).build(); - - @override - NotificationPayloadBuilder toBuilder() => - new NotificationPayloadBuilder()..replace(this); - - @override - bool operator ==(Object other) { - if (identical(other, this)) return true; - return other is NotificationPayload && - type == other.type && - data == other.data; - } - - @override - int get hashCode { - var _$hash = 0; - _$hash = $jc(_$hash, type.hashCode); - _$hash = $jc(_$hash, data.hashCode); - _$hash = $jf(_$hash); - return _$hash; - } - - @override - String toString() { - return (newBuiltValueToStringHelper(r'NotificationPayload') - ..add('type', type) - ..add('data', data)) - .toString(); - } -} - -class NotificationPayloadBuilder - implements Builder { - _$NotificationPayload? _$v; - - NotificationPayloadType? _type; - NotificationPayloadType? get type => _$this._type; - set type(NotificationPayloadType? type) => _$this._type = type; - - String? _data; - String? get data => _$this._data; - set data(String? data) => _$this._data = data; - - NotificationPayloadBuilder(); - - NotificationPayloadBuilder get _$this { - final $v = _$v; - if ($v != null) { - _type = $v.type; - _data = $v.data; - _$v = null; - } - return this; - } - - @override - void replace(NotificationPayload other) { - ArgumentError.checkNotNull(other, 'other'); - _$v = other as _$NotificationPayload; - } - - @override - void update(void Function(NotificationPayloadBuilder)? updates) { - if (updates != null) updates(this); - } - - @override - NotificationPayload build() => _build(); - - _$NotificationPayload _build() { - final _$result = _$v ?? - new _$NotificationPayload._( - type: BuiltValueNullFieldError.checkNotNull( - type, r'NotificationPayload', 'type'), - data: data); - replace(_$result); - return _$result; - } -} - -// ignore_for_file: deprecated_member_use_from_same_package,type=lint diff --git a/apps/flutter_parent/lib/models/plannable.dart b/apps/flutter_parent/lib/models/plannable.dart deleted file mode 100644 index 93e20f6968..0000000000 --- a/apps/flutter_parent/lib/models/plannable.dart +++ /dev/null @@ -1,43 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:built_value/built_value.dart'; -import 'package:built_value/serializer.dart'; - -part 'plannable.g.dart'; - -/// To have this built_value be generated, run this command from the project root: -/// flutter pub run build_runner build --delete-conflicting-outputs -abstract class Plannable implements Built { - @BuiltValueSerializer(serializeNulls: true) // Add this line to get nulls to serialize when we convert to JSON - static Serializer get serializer => _$plannableSerializer; - - Plannable._(); - - String get id; - - String get title; - - @BuiltValueField(wireName: 'points_possible') - double? get pointsPossible; - - @BuiltValueField(wireName: 'due_at') - DateTime? get dueAt; - - // Used to determine if a quiz is an assignment or not - @BuiltValueField(wireName: 'assignment_id') - String? get assignmentId; - - factory Plannable([void Function(PlannableBuilder) updates]) = _$Plannable; -} diff --git a/apps/flutter_parent/lib/models/plannable.g.dart b/apps/flutter_parent/lib/models/plannable.g.dart deleted file mode 100644 index c225b48224..0000000000 --- a/apps/flutter_parent/lib/models/plannable.g.dart +++ /dev/null @@ -1,223 +0,0 @@ -// GENERATED CODE - DO NOT MODIFY BY HAND - -part of 'plannable.dart'; - -// ************************************************************************** -// BuiltValueGenerator -// ************************************************************************** - -Serializer _$plannableSerializer = new _$PlannableSerializer(); - -class _$PlannableSerializer implements StructuredSerializer { - @override - final Iterable types = const [Plannable, _$Plannable]; - @override - final String wireName = 'Plannable'; - - @override - Iterable serialize(Serializers serializers, Plannable object, - {FullType specifiedType = FullType.unspecified}) { - final result = [ - 'id', - serializers.serialize(object.id, specifiedType: const FullType(String)), - 'title', - serializers.serialize(object.title, - specifiedType: const FullType(String)), - ]; - Object? value; - value = object.pointsPossible; - - result - ..add('points_possible') - ..add( - serializers.serialize(value, specifiedType: const FullType(double))); - value = object.dueAt; - - result - ..add('due_at') - ..add(serializers.serialize(value, - specifiedType: const FullType(DateTime))); - value = object.assignmentId; - - result - ..add('assignment_id') - ..add( - serializers.serialize(value, specifiedType: const FullType(String))); - - return result; - } - - @override - Plannable deserialize(Serializers serializers, Iterable serialized, - {FullType specifiedType = FullType.unspecified}) { - final result = new PlannableBuilder(); - - final iterator = serialized.iterator; - while (iterator.moveNext()) { - final key = iterator.current! as String; - iterator.moveNext(); - final Object? value = iterator.current; - switch (key) { - case 'id': - result.id = serializers.deserialize(value, - specifiedType: const FullType(String))! as String; - break; - case 'title': - result.title = serializers.deserialize(value, - specifiedType: const FullType(String))! as String; - break; - case 'points_possible': - result.pointsPossible = serializers.deserialize(value, - specifiedType: const FullType(double)) as double?; - break; - case 'due_at': - result.dueAt = serializers.deserialize(value, - specifiedType: const FullType(DateTime)) as DateTime?; - break; - case 'assignment_id': - result.assignmentId = serializers.deserialize(value, - specifiedType: const FullType(String)) as String?; - break; - } - } - - return result.build(); - } -} - -class _$Plannable extends Plannable { - @override - final String id; - @override - final String title; - @override - final double? pointsPossible; - @override - final DateTime? dueAt; - @override - final String? assignmentId; - - factory _$Plannable([void Function(PlannableBuilder)? updates]) => - (new PlannableBuilder()..update(updates))._build(); - - _$Plannable._( - {required this.id, - required this.title, - this.pointsPossible, - this.dueAt, - this.assignmentId}) - : super._() { - BuiltValueNullFieldError.checkNotNull(id, r'Plannable', 'id'); - BuiltValueNullFieldError.checkNotNull(title, r'Plannable', 'title'); - } - - @override - Plannable rebuild(void Function(PlannableBuilder) updates) => - (toBuilder()..update(updates)).build(); - - @override - PlannableBuilder toBuilder() => new PlannableBuilder()..replace(this); - - @override - bool operator ==(Object other) { - if (identical(other, this)) return true; - return other is Plannable && - id == other.id && - title == other.title && - pointsPossible == other.pointsPossible && - dueAt == other.dueAt && - assignmentId == other.assignmentId; - } - - @override - int get hashCode { - var _$hash = 0; - _$hash = $jc(_$hash, id.hashCode); - _$hash = $jc(_$hash, title.hashCode); - _$hash = $jc(_$hash, pointsPossible.hashCode); - _$hash = $jc(_$hash, dueAt.hashCode); - _$hash = $jc(_$hash, assignmentId.hashCode); - _$hash = $jf(_$hash); - return _$hash; - } - - @override - String toString() { - return (newBuiltValueToStringHelper(r'Plannable') - ..add('id', id) - ..add('title', title) - ..add('pointsPossible', pointsPossible) - ..add('dueAt', dueAt) - ..add('assignmentId', assignmentId)) - .toString(); - } -} - -class PlannableBuilder implements Builder { - _$Plannable? _$v; - - String? _id; - String? get id => _$this._id; - set id(String? id) => _$this._id = id; - - String? _title; - String? get title => _$this._title; - set title(String? title) => _$this._title = title; - - double? _pointsPossible; - double? get pointsPossible => _$this._pointsPossible; - set pointsPossible(double? pointsPossible) => - _$this._pointsPossible = pointsPossible; - - DateTime? _dueAt; - DateTime? get dueAt => _$this._dueAt; - set dueAt(DateTime? dueAt) => _$this._dueAt = dueAt; - - String? _assignmentId; - String? get assignmentId => _$this._assignmentId; - set assignmentId(String? assignmentId) => _$this._assignmentId = assignmentId; - - PlannableBuilder(); - - PlannableBuilder get _$this { - final $v = _$v; - if ($v != null) { - _id = $v.id; - _title = $v.title; - _pointsPossible = $v.pointsPossible; - _dueAt = $v.dueAt; - _assignmentId = $v.assignmentId; - _$v = null; - } - return this; - } - - @override - void replace(Plannable other) { - ArgumentError.checkNotNull(other, 'other'); - _$v = other as _$Plannable; - } - - @override - void update(void Function(PlannableBuilder)? updates) { - if (updates != null) updates(this); - } - - @override - Plannable build() => _build(); - - _$Plannable _build() { - final _$result = _$v ?? - new _$Plannable._( - id: BuiltValueNullFieldError.checkNotNull(id, r'Plannable', 'id'), - title: BuiltValueNullFieldError.checkNotNull( - title, r'Plannable', 'title'), - pointsPossible: pointsPossible, - dueAt: dueAt, - assignmentId: assignmentId); - replace(_$result); - return _$result; - } -} - -// ignore_for_file: deprecated_member_use_from_same_package,type=lint diff --git a/apps/flutter_parent/lib/models/planner_item.dart b/apps/flutter_parent/lib/models/planner_item.dart deleted file mode 100644 index ee8258791c..0000000000 --- a/apps/flutter_parent/lib/models/planner_item.dart +++ /dev/null @@ -1,57 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:built_value/built_value.dart'; -import 'package:built_value/json_object.dart'; -import 'package:built_value/serializer.dart'; -import 'package:flutter_parent/models/plannable.dart'; -import 'package:flutter_parent/models/planner_submission.dart'; - -part 'planner_item.g.dart'; - -/// To have this built_value be generated, run this command from the project root: -/// flutter pub run build_runner build --delete-conflicting-outputs -abstract class PlannerItem implements Built { - @BuiltValueSerializer(serializeNulls: true) // Add this line to get nulls to serialize when we convert to JSON - static Serializer get serializer => _$plannerItemSerializer; - - PlannerItem._(); - - @BuiltValueField(wireName: 'course_id') - String? get courseId; - - @BuiltValueField(wireName: 'context_type') - String? get contextType; - - @BuiltValueField(wireName: 'context_name') - String? get contextName; - - @BuiltValueField(wireName: 'plannable_type') - String get plannableType; - - Plannable get plannable; - - @BuiltValueField(wireName: 'plannable_date') - DateTime? get plannableDate; - - @BuiltValueField(wireName: 'submissions') - JsonObject? get submissionStatusRaw; - - @BuiltValueField(wireName: 'html_url') - String? get htmlUrl; - - PlannerSubmission? get submissionStatus; - - factory PlannerItem([void Function(PlannerItemBuilder) updates]) = _$PlannerItem; -} diff --git a/apps/flutter_parent/lib/models/planner_item.g.dart b/apps/flutter_parent/lib/models/planner_item.g.dart deleted file mode 100644 index e4b087c9b9..0000000000 --- a/apps/flutter_parent/lib/models/planner_item.g.dart +++ /dev/null @@ -1,336 +0,0 @@ -// GENERATED CODE - DO NOT MODIFY BY HAND - -part of 'planner_item.dart'; - -// ************************************************************************** -// BuiltValueGenerator -// ************************************************************************** - -Serializer _$plannerItemSerializer = new _$PlannerItemSerializer(); - -class _$PlannerItemSerializer implements StructuredSerializer { - @override - final Iterable types = const [PlannerItem, _$PlannerItem]; - @override - final String wireName = 'PlannerItem'; - - @override - Iterable serialize(Serializers serializers, PlannerItem object, - {FullType specifiedType = FullType.unspecified}) { - final result = [ - 'plannable_type', - serializers.serialize(object.plannableType, - specifiedType: const FullType(String)), - 'plannable', - serializers.serialize(object.plannable, - specifiedType: const FullType(Plannable)), - ]; - Object? value; - value = object.courseId; - - result - ..add('course_id') - ..add( - serializers.serialize(value, specifiedType: const FullType(String))); - value = object.contextType; - - result - ..add('context_type') - ..add( - serializers.serialize(value, specifiedType: const FullType(String))); - value = object.contextName; - - result - ..add('context_name') - ..add( - serializers.serialize(value, specifiedType: const FullType(String))); - value = object.plannableDate; - - result - ..add('plannable_date') - ..add(serializers.serialize(value, - specifiedType: const FullType(DateTime))); - value = object.submissionStatusRaw; - - result - ..add('submissions') - ..add(serializers.serialize(value, - specifiedType: const FullType(JsonObject))); - value = object.htmlUrl; - - result - ..add('html_url') - ..add( - serializers.serialize(value, specifiedType: const FullType(String))); - value = object.submissionStatus; - - result - ..add('submissionStatus') - ..add(serializers.serialize(value, - specifiedType: const FullType(PlannerSubmission))); - - return result; - } - - @override - PlannerItem deserialize(Serializers serializers, Iterable serialized, - {FullType specifiedType = FullType.unspecified}) { - final result = new PlannerItemBuilder(); - - final iterator = serialized.iterator; - while (iterator.moveNext()) { - final key = iterator.current! as String; - iterator.moveNext(); - final Object? value = iterator.current; - switch (key) { - case 'course_id': - result.courseId = serializers.deserialize(value, - specifiedType: const FullType(String)) as String?; - break; - case 'context_type': - result.contextType = serializers.deserialize(value, - specifiedType: const FullType(String)) as String?; - break; - case 'context_name': - result.contextName = serializers.deserialize(value, - specifiedType: const FullType(String)) as String?; - break; - case 'plannable_type': - result.plannableType = serializers.deserialize(value, - specifiedType: const FullType(String))! as String; - break; - case 'plannable': - result.plannable.replace(serializers.deserialize(value, - specifiedType: const FullType(Plannable))! as Plannable); - break; - case 'plannable_date': - result.plannableDate = serializers.deserialize(value, - specifiedType: const FullType(DateTime)) as DateTime?; - break; - case 'submissions': - result.submissionStatusRaw = serializers.deserialize(value, - specifiedType: const FullType(JsonObject)) as JsonObject?; - break; - case 'html_url': - result.htmlUrl = serializers.deserialize(value, - specifiedType: const FullType(String)) as String?; - break; - case 'submissionStatus': - result.submissionStatus.replace(serializers.deserialize(value, - specifiedType: const FullType(PlannerSubmission))! - as PlannerSubmission); - break; - } - } - - return result.build(); - } -} - -class _$PlannerItem extends PlannerItem { - @override - final String? courseId; - @override - final String? contextType; - @override - final String? contextName; - @override - final String plannableType; - @override - final Plannable plannable; - @override - final DateTime? plannableDate; - @override - final JsonObject? submissionStatusRaw; - @override - final String? htmlUrl; - @override - final PlannerSubmission? submissionStatus; - - factory _$PlannerItem([void Function(PlannerItemBuilder)? updates]) => - (new PlannerItemBuilder()..update(updates))._build(); - - _$PlannerItem._( - {this.courseId, - this.contextType, - this.contextName, - required this.plannableType, - required this.plannable, - this.plannableDate, - this.submissionStatusRaw, - this.htmlUrl, - this.submissionStatus}) - : super._() { - BuiltValueNullFieldError.checkNotNull( - plannableType, r'PlannerItem', 'plannableType'); - BuiltValueNullFieldError.checkNotNull( - plannable, r'PlannerItem', 'plannable'); - } - - @override - PlannerItem rebuild(void Function(PlannerItemBuilder) updates) => - (toBuilder()..update(updates)).build(); - - @override - PlannerItemBuilder toBuilder() => new PlannerItemBuilder()..replace(this); - - @override - bool operator ==(Object other) { - if (identical(other, this)) return true; - return other is PlannerItem && - courseId == other.courseId && - contextType == other.contextType && - contextName == other.contextName && - plannableType == other.plannableType && - plannable == other.plannable && - plannableDate == other.plannableDate && - submissionStatusRaw == other.submissionStatusRaw && - htmlUrl == other.htmlUrl && - submissionStatus == other.submissionStatus; - } - - @override - int get hashCode { - var _$hash = 0; - _$hash = $jc(_$hash, courseId.hashCode); - _$hash = $jc(_$hash, contextType.hashCode); - _$hash = $jc(_$hash, contextName.hashCode); - _$hash = $jc(_$hash, plannableType.hashCode); - _$hash = $jc(_$hash, plannable.hashCode); - _$hash = $jc(_$hash, plannableDate.hashCode); - _$hash = $jc(_$hash, submissionStatusRaw.hashCode); - _$hash = $jc(_$hash, htmlUrl.hashCode); - _$hash = $jc(_$hash, submissionStatus.hashCode); - _$hash = $jf(_$hash); - return _$hash; - } - - @override - String toString() { - return (newBuiltValueToStringHelper(r'PlannerItem') - ..add('courseId', courseId) - ..add('contextType', contextType) - ..add('contextName', contextName) - ..add('plannableType', plannableType) - ..add('plannable', plannable) - ..add('plannableDate', plannableDate) - ..add('submissionStatusRaw', submissionStatusRaw) - ..add('htmlUrl', htmlUrl) - ..add('submissionStatus', submissionStatus)) - .toString(); - } -} - -class PlannerItemBuilder implements Builder { - _$PlannerItem? _$v; - - String? _courseId; - String? get courseId => _$this._courseId; - set courseId(String? courseId) => _$this._courseId = courseId; - - String? _contextType; - String? get contextType => _$this._contextType; - set contextType(String? contextType) => _$this._contextType = contextType; - - String? _contextName; - String? get contextName => _$this._contextName; - set contextName(String? contextName) => _$this._contextName = contextName; - - String? _plannableType; - String? get plannableType => _$this._plannableType; - set plannableType(String? plannableType) => - _$this._plannableType = plannableType; - - PlannableBuilder? _plannable; - PlannableBuilder get plannable => - _$this._plannable ??= new PlannableBuilder(); - set plannable(PlannableBuilder? plannable) => _$this._plannable = plannable; - - DateTime? _plannableDate; - DateTime? get plannableDate => _$this._plannableDate; - set plannableDate(DateTime? plannableDate) => - _$this._plannableDate = plannableDate; - - JsonObject? _submissionStatusRaw; - JsonObject? get submissionStatusRaw => _$this._submissionStatusRaw; - set submissionStatusRaw(JsonObject? submissionStatusRaw) => - _$this._submissionStatusRaw = submissionStatusRaw; - - String? _htmlUrl; - String? get htmlUrl => _$this._htmlUrl; - set htmlUrl(String? htmlUrl) => _$this._htmlUrl = htmlUrl; - - PlannerSubmissionBuilder? _submissionStatus; - PlannerSubmissionBuilder get submissionStatus => - _$this._submissionStatus ??= new PlannerSubmissionBuilder(); - set submissionStatus(PlannerSubmissionBuilder? submissionStatus) => - _$this._submissionStatus = submissionStatus; - - PlannerItemBuilder(); - - PlannerItemBuilder get _$this { - final $v = _$v; - if ($v != null) { - _courseId = $v.courseId; - _contextType = $v.contextType; - _contextName = $v.contextName; - _plannableType = $v.plannableType; - _plannable = $v.plannable.toBuilder(); - _plannableDate = $v.plannableDate; - _submissionStatusRaw = $v.submissionStatusRaw; - _htmlUrl = $v.htmlUrl; - _submissionStatus = $v.submissionStatus?.toBuilder(); - _$v = null; - } - return this; - } - - @override - void replace(PlannerItem other) { - ArgumentError.checkNotNull(other, 'other'); - _$v = other as _$PlannerItem; - } - - @override - void update(void Function(PlannerItemBuilder)? updates) { - if (updates != null) updates(this); - } - - @override - PlannerItem build() => _build(); - - _$PlannerItem _build() { - _$PlannerItem _$result; - try { - _$result = _$v ?? - new _$PlannerItem._( - courseId: courseId, - contextType: contextType, - contextName: contextName, - plannableType: BuiltValueNullFieldError.checkNotNull( - plannableType, r'PlannerItem', 'plannableType'), - plannable: plannable.build(), - plannableDate: plannableDate, - submissionStatusRaw: submissionStatusRaw, - htmlUrl: htmlUrl, - submissionStatus: _submissionStatus?.build()); - } catch (_) { - late String _$failedField; - try { - _$failedField = 'plannable'; - plannable.build(); - - _$failedField = 'submissionStatus'; - _submissionStatus?.build(); - } catch (e) { - throw new BuiltValueNestedFieldError( - r'PlannerItem', _$failedField, e.toString()); - } - rethrow; - } - replace(_$result); - return _$result; - } -} - -// ignore_for_file: deprecated_member_use_from_same_package,type=lint diff --git a/apps/flutter_parent/lib/models/planner_submission.dart b/apps/flutter_parent/lib/models/planner_submission.dart deleted file mode 100644 index 54b1a18a14..0000000000 --- a/apps/flutter_parent/lib/models/planner_submission.dart +++ /dev/null @@ -1,46 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:built_value/built_value.dart'; -import 'package:built_value/serializer.dart'; - -part 'planner_submission.g.dart'; - -/// To have this built_value be generated, run this command from the project root: -/// flutter pub run build_runner build --delete-conflicting-outputs -abstract class PlannerSubmission implements Built { - @BuiltValueSerializer(serializeNulls: true) // Add this line to get nulls to serialize when we convert to JSON - static Serializer get serializer => _$plannerSubmissionSerializer; - - PlannerSubmission._(); - - bool get submitted; - bool get excused; - bool get graded; - bool get late; - bool get missing; - - @BuiltValueField(wireName: 'needs_grading') - bool get needsGrading; - - static void _initializeBuilder(PlannerSubmissionBuilder b) => b - ..submitted = false - ..excused = false - ..graded = false - ..late = false - ..missing = false - ..needsGrading = false; - - factory PlannerSubmission([void Function(PlannerSubmissionBuilder) updates]) = _$PlannerSubmission; -} diff --git a/apps/flutter_parent/lib/models/planner_submission.g.dart b/apps/flutter_parent/lib/models/planner_submission.g.dart deleted file mode 100644 index e12752d243..0000000000 --- a/apps/flutter_parent/lib/models/planner_submission.g.dart +++ /dev/null @@ -1,252 +0,0 @@ -// GENERATED CODE - DO NOT MODIFY BY HAND - -part of 'planner_submission.dart'; - -// ************************************************************************** -// BuiltValueGenerator -// ************************************************************************** - -Serializer _$plannerSubmissionSerializer = - new _$PlannerSubmissionSerializer(); - -class _$PlannerSubmissionSerializer - implements StructuredSerializer { - @override - final Iterable types = const [PlannerSubmission, _$PlannerSubmission]; - @override - final String wireName = 'PlannerSubmission'; - - @override - Iterable serialize(Serializers serializers, PlannerSubmission object, - {FullType specifiedType = FullType.unspecified}) { - final result = [ - 'submitted', - serializers.serialize(object.submitted, - specifiedType: const FullType(bool)), - 'excused', - serializers.serialize(object.excused, - specifiedType: const FullType(bool)), - 'graded', - serializers.serialize(object.graded, specifiedType: const FullType(bool)), - 'late', - serializers.serialize(object.late, specifiedType: const FullType(bool)), - 'missing', - serializers.serialize(object.missing, - specifiedType: const FullType(bool)), - 'needs_grading', - serializers.serialize(object.needsGrading, - specifiedType: const FullType(bool)), - ]; - - return result; - } - - @override - PlannerSubmission deserialize( - Serializers serializers, Iterable serialized, - {FullType specifiedType = FullType.unspecified}) { - final result = new PlannerSubmissionBuilder(); - - final iterator = serialized.iterator; - while (iterator.moveNext()) { - final key = iterator.current! as String; - iterator.moveNext(); - final Object? value = iterator.current; - switch (key) { - case 'submitted': - result.submitted = serializers.deserialize(value, - specifiedType: const FullType(bool))! as bool; - break; - case 'excused': - result.excused = serializers.deserialize(value, - specifiedType: const FullType(bool))! as bool; - break; - case 'graded': - result.graded = serializers.deserialize(value, - specifiedType: const FullType(bool))! as bool; - break; - case 'late': - result.late = serializers.deserialize(value, - specifiedType: const FullType(bool))! as bool; - break; - case 'missing': - result.missing = serializers.deserialize(value, - specifiedType: const FullType(bool))! as bool; - break; - case 'needs_grading': - result.needsGrading = serializers.deserialize(value, - specifiedType: const FullType(bool))! as bool; - break; - } - } - - return result.build(); - } -} - -class _$PlannerSubmission extends PlannerSubmission { - @override - final bool submitted; - @override - final bool excused; - @override - final bool graded; - @override - final bool late; - @override - final bool missing; - @override - final bool needsGrading; - - factory _$PlannerSubmission( - [void Function(PlannerSubmissionBuilder)? updates]) => - (new PlannerSubmissionBuilder()..update(updates))._build(); - - _$PlannerSubmission._( - {required this.submitted, - required this.excused, - required this.graded, - required this.late, - required this.missing, - required this.needsGrading}) - : super._() { - BuiltValueNullFieldError.checkNotNull( - submitted, r'PlannerSubmission', 'submitted'); - BuiltValueNullFieldError.checkNotNull( - excused, r'PlannerSubmission', 'excused'); - BuiltValueNullFieldError.checkNotNull( - graded, r'PlannerSubmission', 'graded'); - BuiltValueNullFieldError.checkNotNull(late, r'PlannerSubmission', 'late'); - BuiltValueNullFieldError.checkNotNull( - missing, r'PlannerSubmission', 'missing'); - BuiltValueNullFieldError.checkNotNull( - needsGrading, r'PlannerSubmission', 'needsGrading'); - } - - @override - PlannerSubmission rebuild(void Function(PlannerSubmissionBuilder) updates) => - (toBuilder()..update(updates)).build(); - - @override - PlannerSubmissionBuilder toBuilder() => - new PlannerSubmissionBuilder()..replace(this); - - @override - bool operator ==(Object other) { - if (identical(other, this)) return true; - return other is PlannerSubmission && - submitted == other.submitted && - excused == other.excused && - graded == other.graded && - late == other.late && - missing == other.missing && - needsGrading == other.needsGrading; - } - - @override - int get hashCode { - var _$hash = 0; - _$hash = $jc(_$hash, submitted.hashCode); - _$hash = $jc(_$hash, excused.hashCode); - _$hash = $jc(_$hash, graded.hashCode); - _$hash = $jc(_$hash, late.hashCode); - _$hash = $jc(_$hash, missing.hashCode); - _$hash = $jc(_$hash, needsGrading.hashCode); - _$hash = $jf(_$hash); - return _$hash; - } - - @override - String toString() { - return (newBuiltValueToStringHelper(r'PlannerSubmission') - ..add('submitted', submitted) - ..add('excused', excused) - ..add('graded', graded) - ..add('late', late) - ..add('missing', missing) - ..add('needsGrading', needsGrading)) - .toString(); - } -} - -class PlannerSubmissionBuilder - implements Builder { - _$PlannerSubmission? _$v; - - bool? _submitted; - bool? get submitted => _$this._submitted; - set submitted(bool? submitted) => _$this._submitted = submitted; - - bool? _excused; - bool? get excused => _$this._excused; - set excused(bool? excused) => _$this._excused = excused; - - bool? _graded; - bool? get graded => _$this._graded; - set graded(bool? graded) => _$this._graded = graded; - - bool? _late; - bool? get late => _$this._late; - set late(bool? late) => _$this._late = late; - - bool? _missing; - bool? get missing => _$this._missing; - set missing(bool? missing) => _$this._missing = missing; - - bool? _needsGrading; - bool? get needsGrading => _$this._needsGrading; - set needsGrading(bool? needsGrading) => _$this._needsGrading = needsGrading; - - PlannerSubmissionBuilder() { - PlannerSubmission._initializeBuilder(this); - } - - PlannerSubmissionBuilder get _$this { - final $v = _$v; - if ($v != null) { - _submitted = $v.submitted; - _excused = $v.excused; - _graded = $v.graded; - _late = $v.late; - _missing = $v.missing; - _needsGrading = $v.needsGrading; - _$v = null; - } - return this; - } - - @override - void replace(PlannerSubmission other) { - ArgumentError.checkNotNull(other, 'other'); - _$v = other as _$PlannerSubmission; - } - - @override - void update(void Function(PlannerSubmissionBuilder)? updates) { - if (updates != null) updates(this); - } - - @override - PlannerSubmission build() => _build(); - - _$PlannerSubmission _build() { - final _$result = _$v ?? - new _$PlannerSubmission._( - submitted: BuiltValueNullFieldError.checkNotNull( - submitted, r'PlannerSubmission', 'submitted'), - excused: BuiltValueNullFieldError.checkNotNull( - excused, r'PlannerSubmission', 'excused'), - graded: BuiltValueNullFieldError.checkNotNull( - graded, r'PlannerSubmission', 'graded'), - late: BuiltValueNullFieldError.checkNotNull( - late, r'PlannerSubmission', 'late'), - missing: BuiltValueNullFieldError.checkNotNull( - missing, r'PlannerSubmission', 'missing'), - needsGrading: BuiltValueNullFieldError.checkNotNull( - needsGrading, r'PlannerSubmission', 'needsGrading')); - replace(_$result); - return _$result; - } -} - -// ignore_for_file: deprecated_member_use_from_same_package,type=lint diff --git a/apps/flutter_parent/lib/models/recipient.dart b/apps/flutter_parent/lib/models/recipient.dart deleted file mode 100644 index c2cc9298dd..0000000000 --- a/apps/flutter_parent/lib/models/recipient.dart +++ /dev/null @@ -1,42 +0,0 @@ -// Copyright (C) 2019 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:built_collection/built_collection.dart'; -import 'package:built_value/built_value.dart'; -import 'package:built_value/serializer.dart'; - -part 'recipient.g.dart'; - -/// To have this built_value be generated, run this command from the project root: -/// flutter pub run build_runner build -abstract class Recipient implements Built { - @BuiltValueSerializer(serializeNulls: true) // Add this line to get nulls to serialize when we convert to JSON - static Serializer get serializer => _$recipientSerializer; - - String get id; - - // The name of the context or short name of the user - String get name; - - String? get pronouns; - - @BuiltValueField(wireName: 'avatar_url') - String? get avatarUrl; - - @BuiltValueField(wireName: 'common_courses') - BuiltMap>? get commonCourses; - - Recipient._(); - factory Recipient([void Function(RecipientBuilder) updates]) = _$Recipient; -} diff --git a/apps/flutter_parent/lib/models/recipient.g.dart b/apps/flutter_parent/lib/models/recipient.g.dart deleted file mode 100644 index a2d60d192c..0000000000 --- a/apps/flutter_parent/lib/models/recipient.g.dart +++ /dev/null @@ -1,242 +0,0 @@ -// GENERATED CODE - DO NOT MODIFY BY HAND - -part of 'recipient.dart'; - -// ************************************************************************** -// BuiltValueGenerator -// ************************************************************************** - -Serializer _$recipientSerializer = new _$RecipientSerializer(); - -class _$RecipientSerializer implements StructuredSerializer { - @override - final Iterable types = const [Recipient, _$Recipient]; - @override - final String wireName = 'Recipient'; - - @override - Iterable serialize(Serializers serializers, Recipient object, - {FullType specifiedType = FullType.unspecified}) { - final result = [ - 'id', - serializers.serialize(object.id, specifiedType: const FullType(String)), - 'name', - serializers.serialize(object.name, specifiedType: const FullType(String)), - ]; - Object? value; - value = object.pronouns; - - result - ..add('pronouns') - ..add( - serializers.serialize(value, specifiedType: const FullType(String))); - value = object.avatarUrl; - - result - ..add('avatar_url') - ..add( - serializers.serialize(value, specifiedType: const FullType(String))); - value = object.commonCourses; - - result - ..add('common_courses') - ..add(serializers.serialize(value, - specifiedType: const FullType(BuiltMap, const [ - const FullType(String), - const FullType(BuiltList, const [const FullType(String)]) - ]))); - - return result; - } - - @override - Recipient deserialize(Serializers serializers, Iterable serialized, - {FullType specifiedType = FullType.unspecified}) { - final result = new RecipientBuilder(); - - final iterator = serialized.iterator; - while (iterator.moveNext()) { - final key = iterator.current! as String; - iterator.moveNext(); - final Object? value = iterator.current; - switch (key) { - case 'id': - result.id = serializers.deserialize(value, - specifiedType: const FullType(String))! as String; - break; - case 'name': - result.name = serializers.deserialize(value, - specifiedType: const FullType(String))! as String; - break; - case 'pronouns': - result.pronouns = serializers.deserialize(value, - specifiedType: const FullType(String)) as String?; - break; - case 'avatar_url': - result.avatarUrl = serializers.deserialize(value, - specifiedType: const FullType(String)) as String?; - break; - case 'common_courses': - result.commonCourses.replace(serializers.deserialize(value, - specifiedType: const FullType(BuiltMap, const [ - const FullType(String), - const FullType(BuiltList, const [const FullType(String)]) - ]))!); - break; - } - } - - return result.build(); - } -} - -class _$Recipient extends Recipient { - @override - final String id; - @override - final String name; - @override - final String? pronouns; - @override - final String? avatarUrl; - @override - final BuiltMap>? commonCourses; - - factory _$Recipient([void Function(RecipientBuilder)? updates]) => - (new RecipientBuilder()..update(updates))._build(); - - _$Recipient._( - {required this.id, - required this.name, - this.pronouns, - this.avatarUrl, - this.commonCourses}) - : super._() { - BuiltValueNullFieldError.checkNotNull(id, r'Recipient', 'id'); - BuiltValueNullFieldError.checkNotNull(name, r'Recipient', 'name'); - } - - @override - Recipient rebuild(void Function(RecipientBuilder) updates) => - (toBuilder()..update(updates)).build(); - - @override - RecipientBuilder toBuilder() => new RecipientBuilder()..replace(this); - - @override - bool operator ==(Object other) { - if (identical(other, this)) return true; - return other is Recipient && - id == other.id && - name == other.name && - pronouns == other.pronouns && - avatarUrl == other.avatarUrl && - commonCourses == other.commonCourses; - } - - @override - int get hashCode { - var _$hash = 0; - _$hash = $jc(_$hash, id.hashCode); - _$hash = $jc(_$hash, name.hashCode); - _$hash = $jc(_$hash, pronouns.hashCode); - _$hash = $jc(_$hash, avatarUrl.hashCode); - _$hash = $jc(_$hash, commonCourses.hashCode); - _$hash = $jf(_$hash); - return _$hash; - } - - @override - String toString() { - return (newBuiltValueToStringHelper(r'Recipient') - ..add('id', id) - ..add('name', name) - ..add('pronouns', pronouns) - ..add('avatarUrl', avatarUrl) - ..add('commonCourses', commonCourses)) - .toString(); - } -} - -class RecipientBuilder implements Builder { - _$Recipient? _$v; - - String? _id; - String? get id => _$this._id; - set id(String? id) => _$this._id = id; - - String? _name; - String? get name => _$this._name; - set name(String? name) => _$this._name = name; - - String? _pronouns; - String? get pronouns => _$this._pronouns; - set pronouns(String? pronouns) => _$this._pronouns = pronouns; - - String? _avatarUrl; - String? get avatarUrl => _$this._avatarUrl; - set avatarUrl(String? avatarUrl) => _$this._avatarUrl = avatarUrl; - - MapBuilder>? _commonCourses; - MapBuilder> get commonCourses => - _$this._commonCourses ??= new MapBuilder>(); - set commonCourses(MapBuilder>? commonCourses) => - _$this._commonCourses = commonCourses; - - RecipientBuilder(); - - RecipientBuilder get _$this { - final $v = _$v; - if ($v != null) { - _id = $v.id; - _name = $v.name; - _pronouns = $v.pronouns; - _avatarUrl = $v.avatarUrl; - _commonCourses = $v.commonCourses?.toBuilder(); - _$v = null; - } - return this; - } - - @override - void replace(Recipient other) { - ArgumentError.checkNotNull(other, 'other'); - _$v = other as _$Recipient; - } - - @override - void update(void Function(RecipientBuilder)? updates) { - if (updates != null) updates(this); - } - - @override - Recipient build() => _build(); - - _$Recipient _build() { - _$Recipient _$result; - try { - _$result = _$v ?? - new _$Recipient._( - id: BuiltValueNullFieldError.checkNotNull(id, r'Recipient', 'id'), - name: BuiltValueNullFieldError.checkNotNull( - name, r'Recipient', 'name'), - pronouns: pronouns, - avatarUrl: avatarUrl, - commonCourses: _commonCourses?.build()); - } catch (_) { - late String _$failedField; - try { - _$failedField = 'commonCourses'; - _commonCourses?.build(); - } catch (e) { - throw new BuiltValueNestedFieldError( - r'Recipient', _$failedField, e.toString()); - } - rethrow; - } - replace(_$result); - return _$result; - } -} - -// ignore_for_file: deprecated_member_use_from_same_package,type=lint diff --git a/apps/flutter_parent/lib/models/reminder.dart b/apps/flutter_parent/lib/models/reminder.dart deleted file mode 100644 index 10f6aead33..0000000000 --- a/apps/flutter_parent/lib/models/reminder.dart +++ /dev/null @@ -1,59 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'dart:convert'; - -import 'package:built_value/built_value.dart'; -import 'package:built_value/serializer.dart'; -import 'package:flutter_parent/models/notification_payload.dart'; -import 'package:flutter_parent/models/serializers.dart'; - -part 'reminder.g.dart'; - -/// To have this built_value be generated, run this command from the project root: -/// flutter pub run build_runner build --delete-conflicting-outputs -abstract class Reminder implements Built { - @BuiltValueSerializer(serializeNulls: true) // Add this line to get nulls to serialize when we convert to JSON - static Serializer get serializer => _$reminderSerializer; - - static const TYPE_ASSIGNMENT = 'assignment'; - static const TYPE_EVENT = 'event'; - - int? get id; - - String get userDomain; - - String get userId; - - String get type; - - String get itemId; - - String get courseId; - - DateTime? get date; - - Reminder._(); - factory Reminder([void Function(ReminderBuilder) updates]) = _$Reminder; - - static Reminder? fromNotification(NotificationPayload? payload) => deserialize(json.decode(payload?.data ?? '')); - - static void _initializeBuilder(ReminderBuilder b) => b - ..userDomain = '' - ..userId = '' - ..type = TYPE_EVENT - ..itemId = '' - ..courseId = '' - ..date = DateTime.now(); -} diff --git a/apps/flutter_parent/lib/models/reminder.g.dart b/apps/flutter_parent/lib/models/reminder.g.dart deleted file mode 100644 index c7c017ff27..0000000000 --- a/apps/flutter_parent/lib/models/reminder.g.dart +++ /dev/null @@ -1,266 +0,0 @@ -// GENERATED CODE - DO NOT MODIFY BY HAND - -part of 'reminder.dart'; - -// ************************************************************************** -// BuiltValueGenerator -// ************************************************************************** - -Serializer _$reminderSerializer = new _$ReminderSerializer(); - -class _$ReminderSerializer implements StructuredSerializer { - @override - final Iterable types = const [Reminder, _$Reminder]; - @override - final String wireName = 'Reminder'; - - @override - Iterable serialize(Serializers serializers, Reminder object, - {FullType specifiedType = FullType.unspecified}) { - final result = [ - 'userDomain', - serializers.serialize(object.userDomain, - specifiedType: const FullType(String)), - 'userId', - serializers.serialize(object.userId, - specifiedType: const FullType(String)), - 'type', - serializers.serialize(object.type, specifiedType: const FullType(String)), - 'itemId', - serializers.serialize(object.itemId, - specifiedType: const FullType(String)), - 'courseId', - serializers.serialize(object.courseId, - specifiedType: const FullType(String)), - ]; - Object? value; - value = object.id; - - result - ..add('id') - ..add(serializers.serialize(value, specifiedType: const FullType(int))); - value = object.date; - - result - ..add('date') - ..add(serializers.serialize(value, - specifiedType: const FullType(DateTime))); - - return result; - } - - @override - Reminder deserialize(Serializers serializers, Iterable serialized, - {FullType specifiedType = FullType.unspecified}) { - final result = new ReminderBuilder(); - - final iterator = serialized.iterator; - while (iterator.moveNext()) { - final key = iterator.current! as String; - iterator.moveNext(); - final Object? value = iterator.current; - switch (key) { - case 'id': - result.id = serializers.deserialize(value, - specifiedType: const FullType(int)) as int?; - break; - case 'userDomain': - result.userDomain = serializers.deserialize(value, - specifiedType: const FullType(String))! as String; - break; - case 'userId': - result.userId = serializers.deserialize(value, - specifiedType: const FullType(String))! as String; - break; - case 'type': - result.type = serializers.deserialize(value, - specifiedType: const FullType(String))! as String; - break; - case 'itemId': - result.itemId = serializers.deserialize(value, - specifiedType: const FullType(String))! as String; - break; - case 'courseId': - result.courseId = serializers.deserialize(value, - specifiedType: const FullType(String))! as String; - break; - case 'date': - result.date = serializers.deserialize(value, - specifiedType: const FullType(DateTime)) as DateTime?; - break; - } - } - - return result.build(); - } -} - -class _$Reminder extends Reminder { - @override - final int? id; - @override - final String userDomain; - @override - final String userId; - @override - final String type; - @override - final String itemId; - @override - final String courseId; - @override - final DateTime? date; - - factory _$Reminder([void Function(ReminderBuilder)? updates]) => - (new ReminderBuilder()..update(updates))._build(); - - _$Reminder._( - {this.id, - required this.userDomain, - required this.userId, - required this.type, - required this.itemId, - required this.courseId, - this.date}) - : super._() { - BuiltValueNullFieldError.checkNotNull( - userDomain, r'Reminder', 'userDomain'); - BuiltValueNullFieldError.checkNotNull(userId, r'Reminder', 'userId'); - BuiltValueNullFieldError.checkNotNull(type, r'Reminder', 'type'); - BuiltValueNullFieldError.checkNotNull(itemId, r'Reminder', 'itemId'); - BuiltValueNullFieldError.checkNotNull(courseId, r'Reminder', 'courseId'); - } - - @override - Reminder rebuild(void Function(ReminderBuilder) updates) => - (toBuilder()..update(updates)).build(); - - @override - ReminderBuilder toBuilder() => new ReminderBuilder()..replace(this); - - @override - bool operator ==(Object other) { - if (identical(other, this)) return true; - return other is Reminder && - id == other.id && - userDomain == other.userDomain && - userId == other.userId && - type == other.type && - itemId == other.itemId && - courseId == other.courseId && - date == other.date; - } - - @override - int get hashCode { - var _$hash = 0; - _$hash = $jc(_$hash, id.hashCode); - _$hash = $jc(_$hash, userDomain.hashCode); - _$hash = $jc(_$hash, userId.hashCode); - _$hash = $jc(_$hash, type.hashCode); - _$hash = $jc(_$hash, itemId.hashCode); - _$hash = $jc(_$hash, courseId.hashCode); - _$hash = $jc(_$hash, date.hashCode); - _$hash = $jf(_$hash); - return _$hash; - } - - @override - String toString() { - return (newBuiltValueToStringHelper(r'Reminder') - ..add('id', id) - ..add('userDomain', userDomain) - ..add('userId', userId) - ..add('type', type) - ..add('itemId', itemId) - ..add('courseId', courseId) - ..add('date', date)) - .toString(); - } -} - -class ReminderBuilder implements Builder { - _$Reminder? _$v; - - int? _id; - int? get id => _$this._id; - set id(int? id) => _$this._id = id; - - String? _userDomain; - String? get userDomain => _$this._userDomain; - set userDomain(String? userDomain) => _$this._userDomain = userDomain; - - String? _userId; - String? get userId => _$this._userId; - set userId(String? userId) => _$this._userId = userId; - - String? _type; - String? get type => _$this._type; - set type(String? type) => _$this._type = type; - - String? _itemId; - String? get itemId => _$this._itemId; - set itemId(String? itemId) => _$this._itemId = itemId; - - String? _courseId; - String? get courseId => _$this._courseId; - set courseId(String? courseId) => _$this._courseId = courseId; - - DateTime? _date; - DateTime? get date => _$this._date; - set date(DateTime? date) => _$this._date = date; - - ReminderBuilder() { - Reminder._initializeBuilder(this); - } - - ReminderBuilder get _$this { - final $v = _$v; - if ($v != null) { - _id = $v.id; - _userDomain = $v.userDomain; - _userId = $v.userId; - _type = $v.type; - _itemId = $v.itemId; - _courseId = $v.courseId; - _date = $v.date; - _$v = null; - } - return this; - } - - @override - void replace(Reminder other) { - ArgumentError.checkNotNull(other, 'other'); - _$v = other as _$Reminder; - } - - @override - void update(void Function(ReminderBuilder)? updates) { - if (updates != null) updates(this); - } - - @override - Reminder build() => _build(); - - _$Reminder _build() { - final _$result = _$v ?? - new _$Reminder._( - id: id, - userDomain: BuiltValueNullFieldError.checkNotNull( - userDomain, r'Reminder', 'userDomain'), - userId: BuiltValueNullFieldError.checkNotNull( - userId, r'Reminder', 'userId'), - type: BuiltValueNullFieldError.checkNotNull( - type, r'Reminder', 'type'), - itemId: BuiltValueNullFieldError.checkNotNull( - itemId, r'Reminder', 'itemId'), - courseId: BuiltValueNullFieldError.checkNotNull( - courseId, r'Reminder', 'courseId'), - date: date); - replace(_$result); - return _$result; - } -} - -// ignore_for_file: deprecated_member_use_from_same_package,type=lint diff --git a/apps/flutter_parent/lib/models/remote_file.dart b/apps/flutter_parent/lib/models/remote_file.dart deleted file mode 100644 index 6c0a005f0b..0000000000 --- a/apps/flutter_parent/lib/models/remote_file.dart +++ /dev/null @@ -1,71 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:built_value/built_value.dart'; -import 'package:built_value/json_object.dart'; -import 'package:built_value/serializer.dart'; - -import 'attachment.dart'; - -part 'remote_file.g.dart'; - -/// To have this built_value be generated, run this command from the project root: -/// flutter packages pub run build_runner build --delete-conflicting-outputs -abstract class RemoteFile implements Built { - @BuiltValueSerializer(serializeNulls: true) // Add this line to get nulls to serialize when we convert to JSON - static Serializer get serializer => _$remoteFileSerializer; - - RemoteFile._(); - - factory RemoteFile([void Function(RemoteFileBuilder) updates]) = _$RemoteFile; - - String get id; - - String get url; - - String? get filename; - - @BuiltValueField(wireName: 'preview_url') - String? get previewUrl; - - @BuiltValueField(wireName: 'thumbnail_url') - String? get thumbnailUrl; - - @BuiltValueField(wireName: 'content-type') - String? get contentType; - - @BuiltValueField(wireName: 'display_name') - String? get displayName; - - Attachment toAttachment() { - return Attachment((a) => a - ..jsonId = JsonObject('remote-file-$id') - ..contentType = contentType - ..filename = filename - ..displayName = displayName - ..previewUrl = previewUrl - ..thumbnailUrl = thumbnailUrl - ..url = url); - } - - static void _initializeBuilder(RemoteFileBuilder b) => b - ..id = '' - ..url = '' - ..filename = '' - ..contentType = '' - ..previewUrl = '' - ..thumbnailUrl = '' - ..displayName = ''; - -} \ No newline at end of file diff --git a/apps/flutter_parent/lib/models/remote_file.g.dart b/apps/flutter_parent/lib/models/remote_file.g.dart deleted file mode 100644 index 8b2618fb73..0000000000 --- a/apps/flutter_parent/lib/models/remote_file.g.dart +++ /dev/null @@ -1,267 +0,0 @@ -// GENERATED CODE - DO NOT MODIFY BY HAND - -part of 'remote_file.dart'; - -// ************************************************************************** -// BuiltValueGenerator -// ************************************************************************** - -Serializer _$remoteFileSerializer = new _$RemoteFileSerializer(); - -class _$RemoteFileSerializer implements StructuredSerializer { - @override - final Iterable types = const [RemoteFile, _$RemoteFile]; - @override - final String wireName = 'RemoteFile'; - - @override - Iterable serialize(Serializers serializers, RemoteFile object, - {FullType specifiedType = FullType.unspecified}) { - final result = [ - 'id', - serializers.serialize(object.id, specifiedType: const FullType(String)), - 'url', - serializers.serialize(object.url, specifiedType: const FullType(String)), - ]; - Object? value; - value = object.filename; - - result - ..add('filename') - ..add( - serializers.serialize(value, specifiedType: const FullType(String))); - value = object.previewUrl; - - result - ..add('preview_url') - ..add( - serializers.serialize(value, specifiedType: const FullType(String))); - value = object.thumbnailUrl; - - result - ..add('thumbnail_url') - ..add( - serializers.serialize(value, specifiedType: const FullType(String))); - value = object.contentType; - - result - ..add('content-type') - ..add( - serializers.serialize(value, specifiedType: const FullType(String))); - value = object.displayName; - - result - ..add('display_name') - ..add( - serializers.serialize(value, specifiedType: const FullType(String))); - - return result; - } - - @override - RemoteFile deserialize(Serializers serializers, Iterable serialized, - {FullType specifiedType = FullType.unspecified}) { - final result = new RemoteFileBuilder(); - - final iterator = serialized.iterator; - while (iterator.moveNext()) { - final key = iterator.current! as String; - iterator.moveNext(); - final Object? value = iterator.current; - switch (key) { - case 'id': - result.id = serializers.deserialize(value, - specifiedType: const FullType(String))! as String; - break; - case 'url': - result.url = serializers.deserialize(value, - specifiedType: const FullType(String))! as String; - break; - case 'filename': - result.filename = serializers.deserialize(value, - specifiedType: const FullType(String)) as String?; - break; - case 'preview_url': - result.previewUrl = serializers.deserialize(value, - specifiedType: const FullType(String)) as String?; - break; - case 'thumbnail_url': - result.thumbnailUrl = serializers.deserialize(value, - specifiedType: const FullType(String)) as String?; - break; - case 'content-type': - result.contentType = serializers.deserialize(value, - specifiedType: const FullType(String)) as String?; - break; - case 'display_name': - result.displayName = serializers.deserialize(value, - specifiedType: const FullType(String)) as String?; - break; - } - } - - return result.build(); - } -} - -class _$RemoteFile extends RemoteFile { - @override - final String id; - @override - final String url; - @override - final String? filename; - @override - final String? previewUrl; - @override - final String? thumbnailUrl; - @override - final String? contentType; - @override - final String? displayName; - - factory _$RemoteFile([void Function(RemoteFileBuilder)? updates]) => - (new RemoteFileBuilder()..update(updates))._build(); - - _$RemoteFile._( - {required this.id, - required this.url, - this.filename, - this.previewUrl, - this.thumbnailUrl, - this.contentType, - this.displayName}) - : super._() { - BuiltValueNullFieldError.checkNotNull(id, r'RemoteFile', 'id'); - BuiltValueNullFieldError.checkNotNull(url, r'RemoteFile', 'url'); - } - - @override - RemoteFile rebuild(void Function(RemoteFileBuilder) updates) => - (toBuilder()..update(updates)).build(); - - @override - RemoteFileBuilder toBuilder() => new RemoteFileBuilder()..replace(this); - - @override - bool operator ==(Object other) { - if (identical(other, this)) return true; - return other is RemoteFile && - id == other.id && - url == other.url && - filename == other.filename && - previewUrl == other.previewUrl && - thumbnailUrl == other.thumbnailUrl && - contentType == other.contentType && - displayName == other.displayName; - } - - @override - int get hashCode { - var _$hash = 0; - _$hash = $jc(_$hash, id.hashCode); - _$hash = $jc(_$hash, url.hashCode); - _$hash = $jc(_$hash, filename.hashCode); - _$hash = $jc(_$hash, previewUrl.hashCode); - _$hash = $jc(_$hash, thumbnailUrl.hashCode); - _$hash = $jc(_$hash, contentType.hashCode); - _$hash = $jc(_$hash, displayName.hashCode); - _$hash = $jf(_$hash); - return _$hash; - } - - @override - String toString() { - return (newBuiltValueToStringHelper(r'RemoteFile') - ..add('id', id) - ..add('url', url) - ..add('filename', filename) - ..add('previewUrl', previewUrl) - ..add('thumbnailUrl', thumbnailUrl) - ..add('contentType', contentType) - ..add('displayName', displayName)) - .toString(); - } -} - -class RemoteFileBuilder implements Builder { - _$RemoteFile? _$v; - - String? _id; - String? get id => _$this._id; - set id(String? id) => _$this._id = id; - - String? _url; - String? get url => _$this._url; - set url(String? url) => _$this._url = url; - - String? _filename; - String? get filename => _$this._filename; - set filename(String? filename) => _$this._filename = filename; - - String? _previewUrl; - String? get previewUrl => _$this._previewUrl; - set previewUrl(String? previewUrl) => _$this._previewUrl = previewUrl; - - String? _thumbnailUrl; - String? get thumbnailUrl => _$this._thumbnailUrl; - set thumbnailUrl(String? thumbnailUrl) => _$this._thumbnailUrl = thumbnailUrl; - - String? _contentType; - String? get contentType => _$this._contentType; - set contentType(String? contentType) => _$this._contentType = contentType; - - String? _displayName; - String? get displayName => _$this._displayName; - set displayName(String? displayName) => _$this._displayName = displayName; - - RemoteFileBuilder() { - RemoteFile._initializeBuilder(this); - } - - RemoteFileBuilder get _$this { - final $v = _$v; - if ($v != null) { - _id = $v.id; - _url = $v.url; - _filename = $v.filename; - _previewUrl = $v.previewUrl; - _thumbnailUrl = $v.thumbnailUrl; - _contentType = $v.contentType; - _displayName = $v.displayName; - _$v = null; - } - return this; - } - - @override - void replace(RemoteFile other) { - ArgumentError.checkNotNull(other, 'other'); - _$v = other as _$RemoteFile; - } - - @override - void update(void Function(RemoteFileBuilder)? updates) { - if (updates != null) updates(this); - } - - @override - RemoteFile build() => _build(); - - _$RemoteFile _build() { - final _$result = _$v ?? - new _$RemoteFile._( - id: BuiltValueNullFieldError.checkNotNull(id, r'RemoteFile', 'id'), - url: BuiltValueNullFieldError.checkNotNull( - url, r'RemoteFile', 'url'), - filename: filename, - previewUrl: previewUrl, - thumbnailUrl: thumbnailUrl, - contentType: contentType, - displayName: displayName); - replace(_$result); - return _$result; - } -} - -// ignore_for_file: deprecated_member_use_from_same_package,type=lint diff --git a/apps/flutter_parent/lib/models/schedule_item.dart b/apps/flutter_parent/lib/models/schedule_item.dart deleted file mode 100644 index ae9c27793b..0000000000 --- a/apps/flutter_parent/lib/models/schedule_item.dart +++ /dev/null @@ -1,170 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:built_collection/built_collection.dart'; -import 'package:built_value/built_value.dart'; -import 'package:built_value/serializer.dart'; -import 'package:flutter_parent/models/plannable.dart'; -import 'package:flutter_parent/models/planner_item.dart'; -import 'package:flutter_parent/models/planner_submission.dart'; - -import 'assignment.dart'; -import 'assignment_override.dart'; - -part 'schedule_item.g.dart'; - -/// To have this built_value be generated, run this command from the project root: -/// flutter pub run build_runner build --delete-conflicting-outputs -abstract class ScheduleItem implements Built { - @BuiltValueSerializer(serializeNulls: true) // Add this line to get nulls to serialize when we convert to JSON - static Serializer get serializer => _$scheduleItemSerializer; - - static const apiTypeCalendar = 'event'; - - static const apiTypeAssignment = 'assignment'; - - String get id; - - String? get title; - - String? get description; - - @BuiltValueField(wireName: 'start_at') - DateTime? get startAt; - - @BuiltValueField(wireName: 'end_at') - DateTime? get endAt; - - @BuiltValueField(wireName: 'all_day') - bool get isAllDay; - - @BuiltValueField(wireName: 'all_day_date') - DateTime? get allDayDate; - - @BuiltValueField(wireName: 'location_address') - String? get locationAddress; - - String get type; // Either 'event' or 'assignment' - - @BuiltValueField(wireName: 'location_name') - String? get locationName; - - @BuiltValueField(wireName: 'html_url') - String? get htmlUrl; - - @BuiltValueField(wireName: 'context_code') - String? get contextCode; - - @BuiltValueField(wireName: 'effective_context_code') - String? get effectiveContextCode; - - @BuiltValueField(wireName: 'hidden') - bool? get isHidden; - - Assignment? get assignment; - - @BuiltValueField(wireName: 'assignment_overrides') - BuiltList? get assignmentOverrides; - - ScheduleItem._(); - factory ScheduleItem([void Function(ScheduleItemBuilder) updates]) = _$ScheduleItem; - - static void _initializeBuilder(ScheduleItemBuilder b) => b - ..id = '' - ..type = apiTypeCalendar - ..isAllDay = false - ..isHidden = false; - - /// These values are used to map to the string event type names used by planner items - static const scheduleTypeAssignment = 'assignment'; - static const scheduleTypeEvent = 'calendar_event'; - static const scheduleTypeDiscussion = 'discussion_topic'; - static const scheduleTypeQuiz = 'quiz'; - - ScheduleItemType getItemType() { - if (type == ScheduleItem.apiTypeCalendar) return ScheduleItemType.event; - if (assignment?.isQuiz == true) return ScheduleItemType.quiz; - if (assignment?.isDiscussion == true) return ScheduleItemType.discussion; - return ScheduleItemType.assignment; - } - - String getItemTypeAsString() { - if (type == ScheduleItem.apiTypeCalendar) return scheduleTypeEvent; - if (assignment?.isQuiz == true) return scheduleTypeQuiz; - if (assignment?.isDiscussion == true) return scheduleTypeDiscussion; - return scheduleTypeAssignment; - } - - String getContextId() { - if (effectiveContextCode != null) { - return _parseContextCode(effectiveContextCode!); - } else { - return _parseContextCode(contextCode!); - } - } - - String getContextType() { - if (effectiveContextCode != null) { - return _parseContextType(effectiveContextCode!); - } else { - return _parseContextType(contextCode!); - } - } - - String _parseContextCode(String code) { - final index = code.indexOf('_'); - return code.substring(index + 1, code.length); - } - - String _parseContextType(String code) { - final index = code.indexOf('_'); - return code.substring(0, index); - } - - PlannerSubmission? getPlannerSubmission() { - if (assignment == null) return null; - - // We are only worried about fetching the single submission here, as the calendar request is - // for a specific user. - final submission = assignment?.submissionWrapper?.submission; - if (submission == null) return PlannerSubmission((b) => b..submitted = false); - - return PlannerSubmission((b) => b - ..submitted = submission.submittedAt != null - ..excused = submission.excused - ..graded = submission.isGraded() - ..late = submission.isLate - ..missing = submission.missing); - } - - PlannerItem toPlannerItem(String? courseName) { - final plannable = Plannable((b) => b - ..id = id - ..title = title - ..pointsPossible = assignment?.pointsPossible - ..dueAt = assignment?.dueAt - ..assignmentId = assignment?.id); - return PlannerItem((b) => b - ..courseId = getContextId() - ..contextType = getContextType() - ..contextName = courseName - ..plannableType = getItemTypeAsString() - ..plannable = plannable.toBuilder() - ..plannableDate = startAt - ..htmlUrl = htmlUrl - ..submissionStatus = getPlannerSubmission()?.toBuilder()); - } -} - -enum ScheduleItemType { event, quiz, assignment, discussion } diff --git a/apps/flutter_parent/lib/models/schedule_item.g.dart b/apps/flutter_parent/lib/models/schedule_item.g.dart deleted file mode 100644 index 04fe079965..0000000000 --- a/apps/flutter_parent/lib/models/schedule_item.g.dart +++ /dev/null @@ -1,493 +0,0 @@ -// GENERATED CODE - DO NOT MODIFY BY HAND - -part of 'schedule_item.dart'; - -// ************************************************************************** -// BuiltValueGenerator -// ************************************************************************** - -Serializer _$scheduleItemSerializer = - new _$ScheduleItemSerializer(); - -class _$ScheduleItemSerializer implements StructuredSerializer { - @override - final Iterable types = const [ScheduleItem, _$ScheduleItem]; - @override - final String wireName = 'ScheduleItem'; - - @override - Iterable serialize(Serializers serializers, ScheduleItem object, - {FullType specifiedType = FullType.unspecified}) { - final result = [ - 'id', - serializers.serialize(object.id, specifiedType: const FullType(String)), - 'all_day', - serializers.serialize(object.isAllDay, - specifiedType: const FullType(bool)), - 'type', - serializers.serialize(object.type, specifiedType: const FullType(String)), - ]; - Object? value; - value = object.title; - - result - ..add('title') - ..add( - serializers.serialize(value, specifiedType: const FullType(String))); - value = object.description; - - result - ..add('description') - ..add( - serializers.serialize(value, specifiedType: const FullType(String))); - value = object.startAt; - - result - ..add('start_at') - ..add(serializers.serialize(value, - specifiedType: const FullType(DateTime))); - value = object.endAt; - - result - ..add('end_at') - ..add(serializers.serialize(value, - specifiedType: const FullType(DateTime))); - value = object.allDayDate; - - result - ..add('all_day_date') - ..add(serializers.serialize(value, - specifiedType: const FullType(DateTime))); - value = object.locationAddress; - - result - ..add('location_address') - ..add( - serializers.serialize(value, specifiedType: const FullType(String))); - value = object.locationName; - - result - ..add('location_name') - ..add( - serializers.serialize(value, specifiedType: const FullType(String))); - value = object.htmlUrl; - - result - ..add('html_url') - ..add( - serializers.serialize(value, specifiedType: const FullType(String))); - value = object.contextCode; - - result - ..add('context_code') - ..add( - serializers.serialize(value, specifiedType: const FullType(String))); - value = object.effectiveContextCode; - - result - ..add('effective_context_code') - ..add( - serializers.serialize(value, specifiedType: const FullType(String))); - value = object.isHidden; - - result - ..add('hidden') - ..add(serializers.serialize(value, specifiedType: const FullType(bool))); - value = object.assignment; - - result - ..add('assignment') - ..add(serializers.serialize(value, - specifiedType: const FullType(Assignment))); - value = object.assignmentOverrides; - - result - ..add('assignment_overrides') - ..add(serializers.serialize(value, - specifiedType: const FullType( - BuiltList, const [const FullType(AssignmentOverride)]))); - - return result; - } - - @override - ScheduleItem deserialize( - Serializers serializers, Iterable serialized, - {FullType specifiedType = FullType.unspecified}) { - final result = new ScheduleItemBuilder(); - - final iterator = serialized.iterator; - while (iterator.moveNext()) { - final key = iterator.current! as String; - iterator.moveNext(); - final Object? value = iterator.current; - switch (key) { - case 'id': - result.id = serializers.deserialize(value, - specifiedType: const FullType(String))! as String; - break; - case 'title': - result.title = serializers.deserialize(value, - specifiedType: const FullType(String)) as String?; - break; - case 'description': - result.description = serializers.deserialize(value, - specifiedType: const FullType(String)) as String?; - break; - case 'start_at': - result.startAt = serializers.deserialize(value, - specifiedType: const FullType(DateTime)) as DateTime?; - break; - case 'end_at': - result.endAt = serializers.deserialize(value, - specifiedType: const FullType(DateTime)) as DateTime?; - break; - case 'all_day': - result.isAllDay = serializers.deserialize(value, - specifiedType: const FullType(bool))! as bool; - break; - case 'all_day_date': - result.allDayDate = serializers.deserialize(value, - specifiedType: const FullType(DateTime)) as DateTime?; - break; - case 'location_address': - result.locationAddress = serializers.deserialize(value, - specifiedType: const FullType(String)) as String?; - break; - case 'type': - result.type = serializers.deserialize(value, - specifiedType: const FullType(String))! as String; - break; - case 'location_name': - result.locationName = serializers.deserialize(value, - specifiedType: const FullType(String)) as String?; - break; - case 'html_url': - result.htmlUrl = serializers.deserialize(value, - specifiedType: const FullType(String)) as String?; - break; - case 'context_code': - result.contextCode = serializers.deserialize(value, - specifiedType: const FullType(String)) as String?; - break; - case 'effective_context_code': - result.effectiveContextCode = serializers.deserialize(value, - specifiedType: const FullType(String)) as String?; - break; - case 'hidden': - result.isHidden = serializers.deserialize(value, - specifiedType: const FullType(bool)) as bool?; - break; - case 'assignment': - result.assignment.replace(serializers.deserialize(value, - specifiedType: const FullType(Assignment))! as Assignment); - break; - case 'assignment_overrides': - result.assignmentOverrides.replace(serializers.deserialize(value, - specifiedType: const FullType( - BuiltList, const [const FullType(AssignmentOverride)]))! - as BuiltList); - break; - } - } - - return result.build(); - } -} - -class _$ScheduleItem extends ScheduleItem { - @override - final String id; - @override - final String? title; - @override - final String? description; - @override - final DateTime? startAt; - @override - final DateTime? endAt; - @override - final bool isAllDay; - @override - final DateTime? allDayDate; - @override - final String? locationAddress; - @override - final String type; - @override - final String? locationName; - @override - final String? htmlUrl; - @override - final String? contextCode; - @override - final String? effectiveContextCode; - @override - final bool? isHidden; - @override - final Assignment? assignment; - @override - final BuiltList? assignmentOverrides; - - factory _$ScheduleItem([void Function(ScheduleItemBuilder)? updates]) => - (new ScheduleItemBuilder()..update(updates))._build(); - - _$ScheduleItem._( - {required this.id, - this.title, - this.description, - this.startAt, - this.endAt, - required this.isAllDay, - this.allDayDate, - this.locationAddress, - required this.type, - this.locationName, - this.htmlUrl, - this.contextCode, - this.effectiveContextCode, - this.isHidden, - this.assignment, - this.assignmentOverrides}) - : super._() { - BuiltValueNullFieldError.checkNotNull(id, r'ScheduleItem', 'id'); - BuiltValueNullFieldError.checkNotNull( - isAllDay, r'ScheduleItem', 'isAllDay'); - BuiltValueNullFieldError.checkNotNull(type, r'ScheduleItem', 'type'); - } - - @override - ScheduleItem rebuild(void Function(ScheduleItemBuilder) updates) => - (toBuilder()..update(updates)).build(); - - @override - ScheduleItemBuilder toBuilder() => new ScheduleItemBuilder()..replace(this); - - @override - bool operator ==(Object other) { - if (identical(other, this)) return true; - return other is ScheduleItem && - id == other.id && - title == other.title && - description == other.description && - startAt == other.startAt && - endAt == other.endAt && - isAllDay == other.isAllDay && - allDayDate == other.allDayDate && - locationAddress == other.locationAddress && - type == other.type && - locationName == other.locationName && - htmlUrl == other.htmlUrl && - contextCode == other.contextCode && - effectiveContextCode == other.effectiveContextCode && - isHidden == other.isHidden && - assignment == other.assignment && - assignmentOverrides == other.assignmentOverrides; - } - - @override - int get hashCode { - var _$hash = 0; - _$hash = $jc(_$hash, id.hashCode); - _$hash = $jc(_$hash, title.hashCode); - _$hash = $jc(_$hash, description.hashCode); - _$hash = $jc(_$hash, startAt.hashCode); - _$hash = $jc(_$hash, endAt.hashCode); - _$hash = $jc(_$hash, isAllDay.hashCode); - _$hash = $jc(_$hash, allDayDate.hashCode); - _$hash = $jc(_$hash, locationAddress.hashCode); - _$hash = $jc(_$hash, type.hashCode); - _$hash = $jc(_$hash, locationName.hashCode); - _$hash = $jc(_$hash, htmlUrl.hashCode); - _$hash = $jc(_$hash, contextCode.hashCode); - _$hash = $jc(_$hash, effectiveContextCode.hashCode); - _$hash = $jc(_$hash, isHidden.hashCode); - _$hash = $jc(_$hash, assignment.hashCode); - _$hash = $jc(_$hash, assignmentOverrides.hashCode); - _$hash = $jf(_$hash); - return _$hash; - } - - @override - String toString() { - return (newBuiltValueToStringHelper(r'ScheduleItem') - ..add('id', id) - ..add('title', title) - ..add('description', description) - ..add('startAt', startAt) - ..add('endAt', endAt) - ..add('isAllDay', isAllDay) - ..add('allDayDate', allDayDate) - ..add('locationAddress', locationAddress) - ..add('type', type) - ..add('locationName', locationName) - ..add('htmlUrl', htmlUrl) - ..add('contextCode', contextCode) - ..add('effectiveContextCode', effectiveContextCode) - ..add('isHidden', isHidden) - ..add('assignment', assignment) - ..add('assignmentOverrides', assignmentOverrides)) - .toString(); - } -} - -class ScheduleItemBuilder - implements Builder { - _$ScheduleItem? _$v; - - String? _id; - String? get id => _$this._id; - set id(String? id) => _$this._id = id; - - String? _title; - String? get title => _$this._title; - set title(String? title) => _$this._title = title; - - String? _description; - String? get description => _$this._description; - set description(String? description) => _$this._description = description; - - DateTime? _startAt; - DateTime? get startAt => _$this._startAt; - set startAt(DateTime? startAt) => _$this._startAt = startAt; - - DateTime? _endAt; - DateTime? get endAt => _$this._endAt; - set endAt(DateTime? endAt) => _$this._endAt = endAt; - - bool? _isAllDay; - bool? get isAllDay => _$this._isAllDay; - set isAllDay(bool? isAllDay) => _$this._isAllDay = isAllDay; - - DateTime? _allDayDate; - DateTime? get allDayDate => _$this._allDayDate; - set allDayDate(DateTime? allDayDate) => _$this._allDayDate = allDayDate; - - String? _locationAddress; - String? get locationAddress => _$this._locationAddress; - set locationAddress(String? locationAddress) => - _$this._locationAddress = locationAddress; - - String? _type; - String? get type => _$this._type; - set type(String? type) => _$this._type = type; - - String? _locationName; - String? get locationName => _$this._locationName; - set locationName(String? locationName) => _$this._locationName = locationName; - - String? _htmlUrl; - String? get htmlUrl => _$this._htmlUrl; - set htmlUrl(String? htmlUrl) => _$this._htmlUrl = htmlUrl; - - String? _contextCode; - String? get contextCode => _$this._contextCode; - set contextCode(String? contextCode) => _$this._contextCode = contextCode; - - String? _effectiveContextCode; - String? get effectiveContextCode => _$this._effectiveContextCode; - set effectiveContextCode(String? effectiveContextCode) => - _$this._effectiveContextCode = effectiveContextCode; - - bool? _isHidden; - bool? get isHidden => _$this._isHidden; - set isHidden(bool? isHidden) => _$this._isHidden = isHidden; - - AssignmentBuilder? _assignment; - AssignmentBuilder get assignment => - _$this._assignment ??= new AssignmentBuilder(); - set assignment(AssignmentBuilder? assignment) => - _$this._assignment = assignment; - - ListBuilder? _assignmentOverrides; - ListBuilder get assignmentOverrides => - _$this._assignmentOverrides ??= new ListBuilder(); - set assignmentOverrides( - ListBuilder? assignmentOverrides) => - _$this._assignmentOverrides = assignmentOverrides; - - ScheduleItemBuilder() { - ScheduleItem._initializeBuilder(this); - } - - ScheduleItemBuilder get _$this { - final $v = _$v; - if ($v != null) { - _id = $v.id; - _title = $v.title; - _description = $v.description; - _startAt = $v.startAt; - _endAt = $v.endAt; - _isAllDay = $v.isAllDay; - _allDayDate = $v.allDayDate; - _locationAddress = $v.locationAddress; - _type = $v.type; - _locationName = $v.locationName; - _htmlUrl = $v.htmlUrl; - _contextCode = $v.contextCode; - _effectiveContextCode = $v.effectiveContextCode; - _isHidden = $v.isHidden; - _assignment = $v.assignment?.toBuilder(); - _assignmentOverrides = $v.assignmentOverrides?.toBuilder(); - _$v = null; - } - return this; - } - - @override - void replace(ScheduleItem other) { - ArgumentError.checkNotNull(other, 'other'); - _$v = other as _$ScheduleItem; - } - - @override - void update(void Function(ScheduleItemBuilder)? updates) { - if (updates != null) updates(this); - } - - @override - ScheduleItem build() => _build(); - - _$ScheduleItem _build() { - _$ScheduleItem _$result; - try { - _$result = _$v ?? - new _$ScheduleItem._( - id: BuiltValueNullFieldError.checkNotNull( - id, r'ScheduleItem', 'id'), - title: title, - description: description, - startAt: startAt, - endAt: endAt, - isAllDay: BuiltValueNullFieldError.checkNotNull( - isAllDay, r'ScheduleItem', 'isAllDay'), - allDayDate: allDayDate, - locationAddress: locationAddress, - type: BuiltValueNullFieldError.checkNotNull( - type, r'ScheduleItem', 'type'), - locationName: locationName, - htmlUrl: htmlUrl, - contextCode: contextCode, - effectiveContextCode: effectiveContextCode, - isHidden: isHidden, - assignment: _assignment?.build(), - assignmentOverrides: _assignmentOverrides?.build()); - } catch (_) { - late String _$failedField; - try { - _$failedField = 'assignment'; - _assignment?.build(); - _$failedField = 'assignmentOverrides'; - _assignmentOverrides?.build(); - } catch (e) { - throw new BuiltValueNestedFieldError( - r'ScheduleItem', _$failedField, e.toString()); - } - rethrow; - } - replace(_$result); - return _$result; - } -} - -// ignore_for_file: deprecated_member_use_from_same_package,type=lint diff --git a/apps/flutter_parent/lib/models/school_domain.dart b/apps/flutter_parent/lib/models/school_domain.dart deleted file mode 100644 index 82013557c4..0000000000 --- a/apps/flutter_parent/lib/models/school_domain.dart +++ /dev/null @@ -1,34 +0,0 @@ -// Copyright (C) 2019 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:built_value/built_value.dart'; -import 'package:built_value/serializer.dart'; - -part 'school_domain.g.dart'; - -/// To have this built_value be generated, run this command from the project root: -/// flutter packages pub run build_runner build -abstract class SchoolDomain implements Built { - @BuiltValueSerializer(serializeNulls: true) // Add this line to get nulls to serialize when we convert to JSON - static Serializer get serializer => _$schoolDomainSerializer; - - String get domain; - String? get name; - - @BuiltValueField(wireName: 'authentication_provider') - String? get authenticationProvider; - - SchoolDomain._(); - factory SchoolDomain([void Function(SchoolDomainBuilder) updates]) = _$SchoolDomain; -} diff --git a/apps/flutter_parent/lib/models/school_domain.g.dart b/apps/flutter_parent/lib/models/school_domain.g.dart deleted file mode 100644 index 18b1e3378f..0000000000 --- a/apps/flutter_parent/lib/models/school_domain.g.dart +++ /dev/null @@ -1,183 +0,0 @@ -// GENERATED CODE - DO NOT MODIFY BY HAND - -part of 'school_domain.dart'; - -// ************************************************************************** -// BuiltValueGenerator -// ************************************************************************** - -Serializer _$schoolDomainSerializer = - new _$SchoolDomainSerializer(); - -class _$SchoolDomainSerializer implements StructuredSerializer { - @override - final Iterable types = const [SchoolDomain, _$SchoolDomain]; - @override - final String wireName = 'SchoolDomain'; - - @override - Iterable serialize(Serializers serializers, SchoolDomain object, - {FullType specifiedType = FullType.unspecified}) { - final result = [ - 'domain', - serializers.serialize(object.domain, - specifiedType: const FullType(String)), - ]; - Object? value; - value = object.name; - - result - ..add('name') - ..add( - serializers.serialize(value, specifiedType: const FullType(String))); - value = object.authenticationProvider; - - result - ..add('authentication_provider') - ..add( - serializers.serialize(value, specifiedType: const FullType(String))); - - return result; - } - - @override - SchoolDomain deserialize( - Serializers serializers, Iterable serialized, - {FullType specifiedType = FullType.unspecified}) { - final result = new SchoolDomainBuilder(); - - final iterator = serialized.iterator; - while (iterator.moveNext()) { - final key = iterator.current! as String; - iterator.moveNext(); - final Object? value = iterator.current; - switch (key) { - case 'domain': - result.domain = serializers.deserialize(value, - specifiedType: const FullType(String))! as String; - break; - case 'name': - result.name = serializers.deserialize(value, - specifiedType: const FullType(String)) as String?; - break; - case 'authentication_provider': - result.authenticationProvider = serializers.deserialize(value, - specifiedType: const FullType(String)) as String?; - break; - } - } - - return result.build(); - } -} - -class _$SchoolDomain extends SchoolDomain { - @override - final String domain; - @override - final String? name; - @override - final String? authenticationProvider; - - factory _$SchoolDomain([void Function(SchoolDomainBuilder)? updates]) => - (new SchoolDomainBuilder()..update(updates))._build(); - - _$SchoolDomain._( - {required this.domain, this.name, this.authenticationProvider}) - : super._() { - BuiltValueNullFieldError.checkNotNull(domain, r'SchoolDomain', 'domain'); - } - - @override - SchoolDomain rebuild(void Function(SchoolDomainBuilder) updates) => - (toBuilder()..update(updates)).build(); - - @override - SchoolDomainBuilder toBuilder() => new SchoolDomainBuilder()..replace(this); - - @override - bool operator ==(Object other) { - if (identical(other, this)) return true; - return other is SchoolDomain && - domain == other.domain && - name == other.name && - authenticationProvider == other.authenticationProvider; - } - - @override - int get hashCode { - var _$hash = 0; - _$hash = $jc(_$hash, domain.hashCode); - _$hash = $jc(_$hash, name.hashCode); - _$hash = $jc(_$hash, authenticationProvider.hashCode); - _$hash = $jf(_$hash); - return _$hash; - } - - @override - String toString() { - return (newBuiltValueToStringHelper(r'SchoolDomain') - ..add('domain', domain) - ..add('name', name) - ..add('authenticationProvider', authenticationProvider)) - .toString(); - } -} - -class SchoolDomainBuilder - implements Builder { - _$SchoolDomain? _$v; - - String? _domain; - String? get domain => _$this._domain; - set domain(String? domain) => _$this._domain = domain; - - String? _name; - String? get name => _$this._name; - set name(String? name) => _$this._name = name; - - String? _authenticationProvider; - String? get authenticationProvider => _$this._authenticationProvider; - set authenticationProvider(String? authenticationProvider) => - _$this._authenticationProvider = authenticationProvider; - - SchoolDomainBuilder(); - - SchoolDomainBuilder get _$this { - final $v = _$v; - if ($v != null) { - _domain = $v.domain; - _name = $v.name; - _authenticationProvider = $v.authenticationProvider; - _$v = null; - } - return this; - } - - @override - void replace(SchoolDomain other) { - ArgumentError.checkNotNull(other, 'other'); - _$v = other as _$SchoolDomain; - } - - @override - void update(void Function(SchoolDomainBuilder)? updates) { - if (updates != null) updates(this); - } - - @override - SchoolDomain build() => _build(); - - _$SchoolDomain _build() { - final _$result = _$v ?? - new _$SchoolDomain._( - domain: BuiltValueNullFieldError.checkNotNull( - domain, r'SchoolDomain', 'domain'), - name: name, - authenticationProvider: authenticationProvider); - replace(_$result); - return _$result; - } -} - -// ignore_for_file: deprecated_member_use_from_same_package,type=lint diff --git a/apps/flutter_parent/lib/models/section.dart b/apps/flutter_parent/lib/models/section.dart deleted file mode 100644 index 013afdc22a..0000000000 --- a/apps/flutter_parent/lib/models/section.dart +++ /dev/null @@ -1,43 +0,0 @@ -/* - * Copyright (C) 2020 - present Instructure, Inc. - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, version 3 of the License. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -import 'package:built_value/built_value.dart'; -import 'package:built_value/serializer.dart'; - -part 'section.g.dart'; - -/// To have this built_value be generated, run this command from the project root: -/// flutter pub run build_runner build --delete-conflicting-outputs -abstract class Section implements Built { - @BuiltValueSerializer(serializeNulls: true) // Add this line to get nulls to serialize when we convert to JSON - static Serializer
get serializer => _$sectionSerializer; - - String get id; - String get name; - - @BuiltValueField(wireName: 'start_at') - DateTime? get startAt; - - @BuiltValueField(wireName: 'end_at') - DateTime? get endAt; - - Section._(); - factory Section([void Function(SectionBuilder) updates]) = _$Section; - - static void _initializeBuilder(SectionBuilder b) => b - ..id = '' - ..name = ''; -} diff --git a/apps/flutter_parent/lib/models/section.g.dart b/apps/flutter_parent/lib/models/section.g.dart deleted file mode 100644 index fe5f08729a..0000000000 --- a/apps/flutter_parent/lib/models/section.g.dart +++ /dev/null @@ -1,197 +0,0 @@ -// GENERATED CODE - DO NOT MODIFY BY HAND - -part of 'section.dart'; - -// ************************************************************************** -// BuiltValueGenerator -// ************************************************************************** - -Serializer
_$sectionSerializer = new _$SectionSerializer(); - -class _$SectionSerializer implements StructuredSerializer
{ - @override - final Iterable types = const [Section, _$Section]; - @override - final String wireName = 'Section'; - - @override - Iterable serialize(Serializers serializers, Section object, - {FullType specifiedType = FullType.unspecified}) { - final result = [ - 'id', - serializers.serialize(object.id, specifiedType: const FullType(String)), - 'name', - serializers.serialize(object.name, specifiedType: const FullType(String)), - ]; - Object? value; - value = object.startAt; - - result - ..add('start_at') - ..add(serializers.serialize(value, - specifiedType: const FullType(DateTime))); - value = object.endAt; - - result - ..add('end_at') - ..add(serializers.serialize(value, - specifiedType: const FullType(DateTime))); - - return result; - } - - @override - Section deserialize(Serializers serializers, Iterable serialized, - {FullType specifiedType = FullType.unspecified}) { - final result = new SectionBuilder(); - - final iterator = serialized.iterator; - while (iterator.moveNext()) { - final key = iterator.current! as String; - iterator.moveNext(); - final Object? value = iterator.current; - switch (key) { - case 'id': - result.id = serializers.deserialize(value, - specifiedType: const FullType(String))! as String; - break; - case 'name': - result.name = serializers.deserialize(value, - specifiedType: const FullType(String))! as String; - break; - case 'start_at': - result.startAt = serializers.deserialize(value, - specifiedType: const FullType(DateTime)) as DateTime?; - break; - case 'end_at': - result.endAt = serializers.deserialize(value, - specifiedType: const FullType(DateTime)) as DateTime?; - break; - } - } - - return result.build(); - } -} - -class _$Section extends Section { - @override - final String id; - @override - final String name; - @override - final DateTime? startAt; - @override - final DateTime? endAt; - - factory _$Section([void Function(SectionBuilder)? updates]) => - (new SectionBuilder()..update(updates))._build(); - - _$Section._({required this.id, required this.name, this.startAt, this.endAt}) - : super._() { - BuiltValueNullFieldError.checkNotNull(id, r'Section', 'id'); - BuiltValueNullFieldError.checkNotNull(name, r'Section', 'name'); - } - - @override - Section rebuild(void Function(SectionBuilder) updates) => - (toBuilder()..update(updates)).build(); - - @override - SectionBuilder toBuilder() => new SectionBuilder()..replace(this); - - @override - bool operator ==(Object other) { - if (identical(other, this)) return true; - return other is Section && - id == other.id && - name == other.name && - startAt == other.startAt && - endAt == other.endAt; - } - - @override - int get hashCode { - var _$hash = 0; - _$hash = $jc(_$hash, id.hashCode); - _$hash = $jc(_$hash, name.hashCode); - _$hash = $jc(_$hash, startAt.hashCode); - _$hash = $jc(_$hash, endAt.hashCode); - _$hash = $jf(_$hash); - return _$hash; - } - - @override - String toString() { - return (newBuiltValueToStringHelper(r'Section') - ..add('id', id) - ..add('name', name) - ..add('startAt', startAt) - ..add('endAt', endAt)) - .toString(); - } -} - -class SectionBuilder implements Builder { - _$Section? _$v; - - String? _id; - String? get id => _$this._id; - set id(String? id) => _$this._id = id; - - String? _name; - String? get name => _$this._name; - set name(String? name) => _$this._name = name; - - DateTime? _startAt; - DateTime? get startAt => _$this._startAt; - set startAt(DateTime? startAt) => _$this._startAt = startAt; - - DateTime? _endAt; - DateTime? get endAt => _$this._endAt; - set endAt(DateTime? endAt) => _$this._endAt = endAt; - - SectionBuilder() { - Section._initializeBuilder(this); - } - - SectionBuilder get _$this { - final $v = _$v; - if ($v != null) { - _id = $v.id; - _name = $v.name; - _startAt = $v.startAt; - _endAt = $v.endAt; - _$v = null; - } - return this; - } - - @override - void replace(Section other) { - ArgumentError.checkNotNull(other, 'other'); - _$v = other as _$Section; - } - - @override - void update(void Function(SectionBuilder)? updates) { - if (updates != null) updates(this); - } - - @override - Section build() => _build(); - - _$Section _build() { - final _$result = _$v ?? - new _$Section._( - id: BuiltValueNullFieldError.checkNotNull(id, r'Section', 'id'), - name: - BuiltValueNullFieldError.checkNotNull(name, r'Section', 'name'), - startAt: startAt, - endAt: endAt); - replace(_$result); - return _$result; - } -} - -// ignore_for_file: deprecated_member_use_from_same_package,type=lint diff --git a/apps/flutter_parent/lib/models/serializers.dart b/apps/flutter_parent/lib/models/serializers.dart deleted file mode 100644 index cd7d80f6bd..0000000000 --- a/apps/flutter_parent/lib/models/serializers.dart +++ /dev/null @@ -1,225 +0,0 @@ -// Copyright (C) 2019 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -library serializers; - -import 'package:built_collection/built_collection.dart'; -import 'package:built_value/iso_8601_date_time_serializer.dart'; -import 'package:built_value/json_object.dart'; -import 'package:built_value/serializer.dart'; -import 'package:built_value/standard_json_plugin.dart'; -import 'package:flutter_parent/models/account_creation_models/create_account_post_body.dart'; -import 'package:flutter_parent/models/account_creation_models/post_pairing_code.dart'; -import 'package:flutter_parent/models/account_creation_models/post_pseudonym.dart'; -import 'package:flutter_parent/models/account_creation_models/post_user.dart'; -import 'package:flutter_parent/models/account_notification.dart'; -import 'package:flutter_parent/models/account_permissions.dart'; -import 'package:flutter_parent/models/alert.dart'; -import 'package:flutter_parent/models/alert_threshold.dart'; -import 'package:flutter_parent/models/announcement.dart'; -import 'package:flutter_parent/models/assignment.dart'; -import 'package:flutter_parent/models/assignment_group.dart'; -import 'package:flutter_parent/models/attachment.dart'; -import 'package:flutter_parent/models/authenticated_url.dart'; -import 'package:flutter_parent/models/basic_user.dart'; -import 'package:flutter_parent/models/canvas_page.dart'; -import 'package:flutter_parent/models/canvas_token.dart'; -import 'package:flutter_parent/models/conversation.dart'; -import 'package:flutter_parent/models/course.dart'; -import 'package:flutter_parent/models/course_permissions.dart'; -import 'package:flutter_parent/models/course_tab.dart'; -import 'package:flutter_parent/models/dataseeding/communication_channel.dart'; -import 'package:flutter_parent/models/dataseeding/create_assignment_info.dart'; -import 'package:flutter_parent/models/dataseeding/oauth_token.dart'; -import 'package:flutter_parent/models/dataseeding/pseudonym.dart'; -import 'package:flutter_parent/models/dataseeding/quiz.dart'; -import 'package:flutter_parent/models/enrollment.dart'; -import 'package:flutter_parent/models/grade.dart'; -import 'package:flutter_parent/models/grading_period.dart'; -import 'package:flutter_parent/models/grading_period_response.dart'; -import 'package:flutter_parent/models/grading_scheme_item.dart'; -import 'package:flutter_parent/models/help_link.dart'; -import 'package:flutter_parent/models/help_links.dart'; -import 'package:flutter_parent/models/lock_info.dart'; -import 'package:flutter_parent/models/locked_module.dart'; -import 'package:flutter_parent/models/login.dart'; -import 'package:flutter_parent/models/media_comment.dart'; -import 'package:flutter_parent/models/message.dart'; -import 'package:flutter_parent/models/mobile_verify_result.dart'; -import 'package:flutter_parent/models/notification_payload.dart'; -import 'package:flutter_parent/models/plannable.dart'; -import 'package:flutter_parent/models/planner_item.dart'; -import 'package:flutter_parent/models/planner_submission.dart'; -import 'package:flutter_parent/models/recipient.dart'; -import 'package:flutter_parent/models/reminder.dart'; -import 'package:flutter_parent/models/remote_file.dart'; -import 'package:flutter_parent/models/schedule_item.dart'; -import 'package:flutter_parent/models/school_domain.dart'; -import 'package:flutter_parent/models/section.dart'; -import 'package:flutter_parent/models/submission.dart'; -import 'package:flutter_parent/models/submission_wrapper.dart'; -import 'package:flutter_parent/models/term.dart'; -import 'package:flutter_parent/models/terms_of_service.dart'; -import 'package:flutter_parent/models/unread_count.dart'; -import 'package:flutter_parent/models/user.dart'; -import 'package:flutter_parent/models/user_colors.dart'; - -import 'assignment_override.dart'; -import 'color_change_response.dart'; -import 'course_settings.dart'; -import 'dataseeding/create_assignment_wrapper.dart'; -import 'dataseeding/create_course_info.dart'; -import 'dataseeding/create_course_wrapper.dart'; -import 'dataseeding/create_enrollment_info.dart'; -import 'dataseeding/create_enrollment_wrapper.dart'; -import 'dataseeding/create_submission_info.dart'; -import 'dataseeding/create_submission_wrapper.dart'; -import 'dataseeding/create_user_info.dart'; -import 'dataseeding/grade_submission_info.dart'; -import 'dataseeding/grade_submission_wrapper.dart'; -import 'dataseeding/pairing_code.dart'; -import 'dataseeding/seed_context.dart'; -import 'dataseeding/seeded_user.dart'; -import 'dataseeding/user_name_data.dart'; -import 'feature_flags.dart'; -import 'file_upload_config.dart'; - -part 'serializers.g.dart'; - -/// If changes are made, run `flutter pub run build_runner build` from the project root. Alternatively, you can -/// have it watch for changes and automatically build if you run `flutter pub run build_runner watch`. -@SerializersFor([ - AccountNotification, - AccountPermissions, - Alert, - AlertThreshold, - Announcement, - Assignment, - AssignmentGroup, - AssignmentOverride, - Attachment, - AuthenticatedUrl, - BasicUser, - CanvasPage, - CanvasToken, - CommunicationChannel, - ColorChangeResponse, - Conversation, - Course, - CoursePermissions, - CourseSettings, - CourseTab, - CreateAssignmentInfo, - CreateAssignmentWrapper, - CreateAccountPostBody, - CreateCourseInfo, - CreateCourseWrapper, - CreateEnrollmentInfo, - CreateEnrollmentWrapper, - CreateSubmissionInfo, - CreateSubmissionWrapper, - CreateUserInfo, - Enrollment, - FeatureFlags, - FileUploadConfig, - Grade, - GradeSubmissionInfo, - GradeSubmissionWrapper, - GradingPeriod, - GradingPeriodResponse, - HelpLink, - HelpLinks, - LockInfo, - LockedModule, - Login, - MediaComment, - Message, - MobileVerifyResult, - NotificationPayload, - OAuthToken, - PairingCode, - Plannable, - PlannerItem, - PlannerSubmission, - PostPairingCode, - PostPseudonym, - PostUser, - Pseudonym, - Quiz, - Recipient, - Reminder, - RemoteFile, - Section, - SchoolDomain, - ScheduleItem, - Section, - SeedContext, - SeededUser, - Submission, - SubmissionWrapper, - Term, - TermsOfService, - UnreadCount, - User, - UserColors, - UserNameData, - GradingSchemeItem, -]) -final Serializers _serializers = _$_serializers; - -Serializers jsonSerializers = (_serializers.toBuilder() - ..addPlugin(StandardJsonPlugin()) - ..addPlugin(RemoveNullInMapConvertedListPlugin()) - ..add(Iso8601DateTimeSerializer()) - ..add(ResultEnumSerializer()) - ..addBuilderFactory(FullType(BuiltList, [FullType(String)]), () => ListBuilder()) - ..addBuilderFactory( - FullType(BuiltMap, [ - FullType(String), - FullType(BuiltList, [FullType(String)]) - ]), - () => MapBuilder>()) - ..addBuilderFactory(FullType(BuiltMap, [FullType(String), FullType(String)]), () => MapBuilder())) - .build(); - -T? deserialize(dynamic value) { - var serializer = jsonSerializers.serializerForType(T); - if (serializer == null || !(serializer is Serializer)) return null; - return jsonSerializers.deserializeWith(serializer, value); -} - -dynamic serialize(T value) { - var serializer = jsonSerializers.serializerForType(T); - if (serializer == null) return null; - return jsonSerializers.serializeWith(serializer, value); -} - -List deserializeList(dynamic value) => List.from(value?.map((value) => deserialize(value))?.toList() ?? []); - -/// Plugin that works around an issue where deserialization breaks if a map key is null -/// Sourced from https://github.com/google/built_value.dart/issues/653#issuecomment-495964030 -class RemoveNullInMapConvertedListPlugin implements SerializerPlugin { - Object? beforeSerialize(Object? object, FullType specifiedType) => object; - - Object? afterSerialize(Object? object, FullType specifiedType) => object; - - Object? beforeDeserialize(Object? object, FullType specifiedType) { - if (specifiedType.root == BuiltMap && object is List) { - return object.where((v) => v != null).toList(); - } - return object; - } - - Object? afterDeserialize(Object? object, FullType specifiedType) => object; -} diff --git a/apps/flutter_parent/lib/models/serializers.g.dart b/apps/flutter_parent/lib/models/serializers.g.dart deleted file mode 100644 index 0fd8e996cf..0000000000 --- a/apps/flutter_parent/lib/models/serializers.g.dart +++ /dev/null @@ -1,177 +0,0 @@ -// GENERATED CODE - DO NOT MODIFY BY HAND - -part of 'serializers.dart'; - -// ************************************************************************** -// BuiltValueGenerator -// ************************************************************************** - -Serializers _$_serializers = (new Serializers().toBuilder() - ..add(AccountNotification.serializer) - ..add(AccountPermissions.serializer) - ..add(Alert.serializer) - ..add(AlertThreshold.serializer) - ..add(AlertType.serializer) - ..add(AlertWorkflowState.serializer) - ..add(Announcement.serializer) - ..add(Assignment.serializer) - ..add(AssignmentGroup.serializer) - ..add(AssignmentOverride.serializer) - ..add(Attachment.serializer) - ..add(AuthenticatedUrl.serializer) - ..add(AvailableTo.serializer) - ..add(BasicUser.serializer) - ..add(CanvasPage.serializer) - ..add(CanvasToken.serializer) - ..add(ColorChangeResponse.serializer) - ..add(CommunicationChannel.serializer) - ..add(Conversation.serializer) - ..add(ConversationWorkflowState.serializer) - ..add(Course.serializer) - ..add(CoursePermissions.serializer) - ..add(CourseSettings.serializer) - ..add(CourseTab.serializer) - ..add(CreateAccountPostBody.serializer) - ..add(CreateAssignmentInfo.serializer) - ..add(CreateAssignmentWrapper.serializer) - ..add(CreateCourseInfo.serializer) - ..add(CreateCourseWrapper.serializer) - ..add(CreateEnrollmentInfo.serializer) - ..add(CreateEnrollmentWrapper.serializer) - ..add(CreateSubmissionInfo.serializer) - ..add(CreateSubmissionWrapper.serializer) - ..add(CreateUserInfo.serializer) - ..add(Enrollment.serializer) - ..add(FeatureFlags.serializer) - ..add(FileUploadConfig.serializer) - ..add(Grade.serializer) - ..add(GradeSubmissionInfo.serializer) - ..add(GradeSubmissionWrapper.serializer) - ..add(GradingPeriod.serializer) - ..add(GradingPeriodResponse.serializer) - ..add(GradingSchemeItem.serializer) - ..add(GradingType.serializer) - ..add(HelpLink.serializer) - ..add(HelpLinks.serializer) - ..add(HomePage.serializer) - ..add(LockInfo.serializer) - ..add(LockedModule.serializer) - ..add(Login.serializer) - ..add(MediaComment.serializer) - ..add(MediaType.serializer) - ..add(Message.serializer) - ..add(MobileVerifyResult.serializer) - ..add(NotificationPayload.serializer) - ..add(NotificationPayloadType.serializer) - ..add(OAuthToken.serializer) - ..add(PairingCode.serializer) - ..add(Plannable.serializer) - ..add(PlannerItem.serializer) - ..add(PlannerSubmission.serializer) - ..add(PostPairingCode.serializer) - ..add(PostPseudonym.serializer) - ..add(PostUser.serializer) - ..add(Pseudonym.serializer) - ..add(Quiz.serializer) - ..add(Recipient.serializer) - ..add(Reminder.serializer) - ..add(RemoteFile.serializer) - ..add(ScheduleItem.serializer) - ..add(SchoolDomain.serializer) - ..add(Section.serializer) - ..add(SeedContext.serializer) - ..add(SeededUser.serializer) - ..add(Submission.serializer) - ..add(SubmissionTypes.serializer) - ..add(SubmissionWrapper.serializer) - ..add(Term.serializer) - ..add(TermsOfService.serializer) - ..add(UnreadCount.serializer) - ..add(User.serializer) - ..add(UserColors.serializer) - ..add(UserNameData.serializer) - ..add(UserPermission.serializer) - ..addBuilderFactory( - const FullType(BuiltList, const [const FullType(Assignment)]), - () => new ListBuilder()) - ..addBuilderFactory( - const FullType(BuiltList, const [const FullType(AssignmentOverride)]), - () => new ListBuilder()) - ..addBuilderFactory( - const FullType(BuiltList, const [const FullType(Attachment)]), - () => new ListBuilder()) - ..addBuilderFactory( - const FullType(BuiltList, const [const FullType(Message)]), - () => new ListBuilder()) - ..addBuilderFactory( - const FullType(BuiltList, const [const FullType(String)]), - () => new ListBuilder()) - ..addBuilderFactory( - const FullType(BuiltList, const [const FullType(AvailableTo)]), - () => new ListBuilder()) - ..addBuilderFactory( - const FullType(BuiltList, const [const FullType(Enrollment)]), - () => new ListBuilder()) - ..addBuilderFactory( - const FullType(BuiltList, const [const FullType(Section)]), - () => new ListBuilder
()) - ..addBuilderFactory( - const FullType(BuiltList, const [const FullType(JsonObject)]), - () => new ListBuilder()) - ..addBuilderFactory( - const FullType(BuiltList, const [const FullType(GradingPeriod)]), - () => new ListBuilder()) - ..addBuilderFactory( - const FullType(BuiltList, const [const FullType(HelpLink)]), - () => new ListBuilder()) - ..addBuilderFactory( - const FullType(BuiltList, const [const FullType(HelpLink)]), - () => new ListBuilder()) - ..addBuilderFactory( - const FullType(BuiltList, const [const FullType(RemoteFile)]), - () => new ListBuilder()) - ..addBuilderFactory( - const FullType(BuiltList, const [const FullType(String)]), - () => new ListBuilder()) - ..addBuilderFactory( - const FullType(BuiltList, const [const FullType(String)]), - () => new ListBuilder()) - ..addBuilderFactory( - const FullType(BuiltList, const [const FullType(BasicUser)]), - () => new ListBuilder()) - ..addBuilderFactory( - const FullType(BuiltList, const [const FullType(Message)]), - () => new ListBuilder()) - ..addBuilderFactory( - const FullType(BuiltList, const [const FullType(Submission)]), - () => new ListBuilder()) - ..addBuilderFactory( - const FullType(BuiltList, const [const FullType(Submission)]), - () => new ListBuilder()) - ..addBuilderFactory( - const FullType(BuiltList, const [const FullType(SubmissionTypes)]), - () => new ListBuilder()) - ..addBuilderFactory( - const FullType(BuiltList, const [const FullType(SubmissionTypes)]), - () => new ListBuilder()) - ..addBuilderFactory( - const FullType(BuiltMap, const [ - const FullType(String), - const FullType(BuiltList, const [const FullType(String)]) - ]), - () => new MapBuilder>()) - ..addBuilderFactory( - const FullType( - BuiltMap, const [const FullType(String), const FullType(String)]), - () => new MapBuilder()) - ..addBuilderFactory( - const FullType( - BuiltMap, const [const FullType(String), const FullType(String)]), - () => new MapBuilder()) - ..addBuilderFactory( - const FullType( - BuiltMap, const [const FullType(String), const FullType(String)]), - () => new MapBuilder())) - .build(); - -// ignore_for_file: deprecated_member_use_from_same_package,type=lint diff --git a/apps/flutter_parent/lib/models/snicker_doodle.dart b/apps/flutter_parent/lib/models/snicker_doodle.dart deleted file mode 100644 index fd81859591..0000000000 --- a/apps/flutter_parent/lib/models/snicker_doodle.dart +++ /dev/null @@ -1,31 +0,0 @@ -// Copyright (C) 2019 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:flutter/foundation.dart'; - -class SnickerDoodle { - const SnickerDoodle({ - required this.title, - required this.subtitle, - required this.username, - required this.password, - required this.domain, - }); - - final String title; - final String subtitle; - final String username; - final String password; - final String domain; -} diff --git a/apps/flutter_parent/lib/models/submission.dart b/apps/flutter_parent/lib/models/submission.dart deleted file mode 100644 index ec1eb1fe59..0000000000 --- a/apps/flutter_parent/lib/models/submission.dart +++ /dev/null @@ -1,121 +0,0 @@ -// Copyright (C) 2019 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -library submission; - -import 'package:built_collection/built_collection.dart'; -import 'package:built_value/built_value.dart'; -import 'package:built_value/serializer.dart'; - -import 'assignment.dart'; -import 'user.dart'; - -part 'submission.g.dart'; - -abstract class Submission implements Built { - @BuiltValueSerializer(serializeNulls: true) - static Serializer get serializer => _$submissionSerializer; - - Submission._(); - - factory Submission([void Function(SubmissionBuilder) updates]) = _$Submission; - - String get id; - - String? get grade; - - double get score; - - int get attempt; - - @BuiltValueField(wireName: 'submitted_at') - DateTime? get submittedAt; - - DateTime? get commentCreated; - - String? get mediaContentType; - - String? get mediaCommentUrl; - - String? get mediaCommentDisplay; - - @BuiltValueField(wireName: 'submission_history') - BuiltList get submissionHistory; - - String? get body; - - @BuiltValueField(wireName: 'grade_matches_current_submission') - bool get isGradeMatchesCurrentSubmission; - - @BuiltValueField(wireName: 'workflow_state') - String? get workflowState; - - @BuiltValueField(wireName: 'submission_type') - String? get submissionType; - - @BuiltValueField(wireName: 'preview_url') - String? get previewUrl; - - String? get url; - - // Not sure why, but build_runner fails when this field is named 'late' - @BuiltValueField(wireName: 'late') - bool get isLate; - - bool get excused; - - bool get missing; - - // Conversation Stuff - @BuiltValueField(wireName: 'assignment_id') - String get assignmentId; - - Assignment? get assignment; - - @BuiltValueField(wireName: 'user_id') - String get userId; - - @BuiltValueField(wireName: 'grader_id') - String get graderId; - - User? get user; - - @BuiltValueField(wireName: 'points_deducted') - double? get pointsDeducted; - - @BuiltValueField(wireName: 'entered_score') - double get enteredScore; - - @BuiltValueField(wireName: 'entered_grade') - String? get enteredGrade; - - @BuiltValueField(wireName: 'posted_at') - DateTime? get postedAt; - - bool isGraded() { - return grade != null && workflowState != 'pending_review' && postedAt != null; - } - - static void _initializeBuilder(SubmissionBuilder b) => b - ..id = '' - ..score = 0.0 - ..attempt = 0 - ..enteredScore = 0.0 - ..graderId = '' - ..userId = '' - ..submissionHistory = ListBuilder() - ..isGradeMatchesCurrentSubmission = false - ..isLate = false - ..excused = false - ..missing = false; -} diff --git a/apps/flutter_parent/lib/models/submission.g.dart b/apps/flutter_parent/lib/models/submission.g.dart deleted file mode 100644 index ec4eff6315..0000000000 --- a/apps/flutter_parent/lib/models/submission.g.dart +++ /dev/null @@ -1,759 +0,0 @@ -// GENERATED CODE - DO NOT MODIFY BY HAND - -part of 'submission.dart'; - -// ************************************************************************** -// BuiltValueGenerator -// ************************************************************************** - -Serializer _$submissionSerializer = new _$SubmissionSerializer(); - -class _$SubmissionSerializer implements StructuredSerializer { - @override - final Iterable types = const [Submission, _$Submission]; - @override - final String wireName = 'Submission'; - - @override - Iterable serialize(Serializers serializers, Submission object, - {FullType specifiedType = FullType.unspecified}) { - final result = [ - 'id', - serializers.serialize(object.id, specifiedType: const FullType(String)), - 'score', - serializers.serialize(object.score, - specifiedType: const FullType(double)), - 'attempt', - serializers.serialize(object.attempt, specifiedType: const FullType(int)), - 'submission_history', - serializers.serialize(object.submissionHistory, - specifiedType: - const FullType(BuiltList, const [const FullType(Submission)])), - 'grade_matches_current_submission', - serializers.serialize(object.isGradeMatchesCurrentSubmission, - specifiedType: const FullType(bool)), - 'late', - serializers.serialize(object.isLate, specifiedType: const FullType(bool)), - 'excused', - serializers.serialize(object.excused, - specifiedType: const FullType(bool)), - 'missing', - serializers.serialize(object.missing, - specifiedType: const FullType(bool)), - 'assignment_id', - serializers.serialize(object.assignmentId, - specifiedType: const FullType(String)), - 'user_id', - serializers.serialize(object.userId, - specifiedType: const FullType(String)), - 'grader_id', - serializers.serialize(object.graderId, - specifiedType: const FullType(String)), - 'entered_score', - serializers.serialize(object.enteredScore, - specifiedType: const FullType(double)), - ]; - Object? value; - value = object.grade; - - result - ..add('grade') - ..add( - serializers.serialize(value, specifiedType: const FullType(String))); - value = object.submittedAt; - - result - ..add('submitted_at') - ..add(serializers.serialize(value, - specifiedType: const FullType(DateTime))); - value = object.commentCreated; - - result - ..add('commentCreated') - ..add(serializers.serialize(value, - specifiedType: const FullType(DateTime))); - value = object.mediaContentType; - - result - ..add('mediaContentType') - ..add( - serializers.serialize(value, specifiedType: const FullType(String))); - value = object.mediaCommentUrl; - - result - ..add('mediaCommentUrl') - ..add( - serializers.serialize(value, specifiedType: const FullType(String))); - value = object.mediaCommentDisplay; - - result - ..add('mediaCommentDisplay') - ..add( - serializers.serialize(value, specifiedType: const FullType(String))); - value = object.body; - - result - ..add('body') - ..add( - serializers.serialize(value, specifiedType: const FullType(String))); - value = object.workflowState; - - result - ..add('workflow_state') - ..add( - serializers.serialize(value, specifiedType: const FullType(String))); - value = object.submissionType; - - result - ..add('submission_type') - ..add( - serializers.serialize(value, specifiedType: const FullType(String))); - value = object.previewUrl; - - result - ..add('preview_url') - ..add( - serializers.serialize(value, specifiedType: const FullType(String))); - value = object.url; - - result - ..add('url') - ..add( - serializers.serialize(value, specifiedType: const FullType(String))); - value = object.assignment; - - result - ..add('assignment') - ..add(serializers.serialize(value, - specifiedType: const FullType(Assignment))); - value = object.user; - - result - ..add('user') - ..add(serializers.serialize(value, specifiedType: const FullType(User))); - value = object.pointsDeducted; - - result - ..add('points_deducted') - ..add( - serializers.serialize(value, specifiedType: const FullType(double))); - value = object.enteredGrade; - - result - ..add('entered_grade') - ..add( - serializers.serialize(value, specifiedType: const FullType(String))); - value = object.postedAt; - - result - ..add('posted_at') - ..add(serializers.serialize(value, - specifiedType: const FullType(DateTime))); - - return result; - } - - @override - Submission deserialize(Serializers serializers, Iterable serialized, - {FullType specifiedType = FullType.unspecified}) { - final result = new SubmissionBuilder(); - - final iterator = serialized.iterator; - while (iterator.moveNext()) { - final key = iterator.current! as String; - iterator.moveNext(); - final Object? value = iterator.current; - switch (key) { - case 'id': - result.id = serializers.deserialize(value, - specifiedType: const FullType(String))! as String; - break; - case 'grade': - result.grade = serializers.deserialize(value, - specifiedType: const FullType(String)) as String?; - break; - case 'score': - result.score = serializers.deserialize(value, - specifiedType: const FullType(double))! as double; - break; - case 'attempt': - result.attempt = serializers.deserialize(value, - specifiedType: const FullType(int))! as int; - break; - case 'submitted_at': - result.submittedAt = serializers.deserialize(value, - specifiedType: const FullType(DateTime)) as DateTime?; - break; - case 'commentCreated': - result.commentCreated = serializers.deserialize(value, - specifiedType: const FullType(DateTime)) as DateTime?; - break; - case 'mediaContentType': - result.mediaContentType = serializers.deserialize(value, - specifiedType: const FullType(String)) as String?; - break; - case 'mediaCommentUrl': - result.mediaCommentUrl = serializers.deserialize(value, - specifiedType: const FullType(String)) as String?; - break; - case 'mediaCommentDisplay': - result.mediaCommentDisplay = serializers.deserialize(value, - specifiedType: const FullType(String)) as String?; - break; - case 'submission_history': - result.submissionHistory.replace(serializers.deserialize(value, - specifiedType: const FullType( - BuiltList, const [const FullType(Submission)]))! - as BuiltList); - break; - case 'body': - result.body = serializers.deserialize(value, - specifiedType: const FullType(String)) as String?; - break; - case 'grade_matches_current_submission': - result.isGradeMatchesCurrentSubmission = serializers - .deserialize(value, specifiedType: const FullType(bool))! as bool; - break; - case 'workflow_state': - result.workflowState = serializers.deserialize(value, - specifiedType: const FullType(String)) as String?; - break; - case 'submission_type': - result.submissionType = serializers.deserialize(value, - specifiedType: const FullType(String)) as String?; - break; - case 'preview_url': - result.previewUrl = serializers.deserialize(value, - specifiedType: const FullType(String)) as String?; - break; - case 'url': - result.url = serializers.deserialize(value, - specifiedType: const FullType(String)) as String?; - break; - case 'late': - result.isLate = serializers.deserialize(value, - specifiedType: const FullType(bool))! as bool; - break; - case 'excused': - result.excused = serializers.deserialize(value, - specifiedType: const FullType(bool))! as bool; - break; - case 'missing': - result.missing = serializers.deserialize(value, - specifiedType: const FullType(bool))! as bool; - break; - case 'assignment_id': - result.assignmentId = serializers.deserialize(value, - specifiedType: const FullType(String))! as String; - break; - case 'assignment': - result.assignment.replace(serializers.deserialize(value, - specifiedType: const FullType(Assignment))! as Assignment); - break; - case 'user_id': - result.userId = serializers.deserialize(value, - specifiedType: const FullType(String))! as String; - break; - case 'grader_id': - result.graderId = serializers.deserialize(value, - specifiedType: const FullType(String))! as String; - break; - case 'user': - result.user.replace(serializers.deserialize(value, - specifiedType: const FullType(User))! as User); - break; - case 'points_deducted': - result.pointsDeducted = serializers.deserialize(value, - specifiedType: const FullType(double)) as double?; - break; - case 'entered_score': - result.enteredScore = serializers.deserialize(value, - specifiedType: const FullType(double))! as double; - break; - case 'entered_grade': - result.enteredGrade = serializers.deserialize(value, - specifiedType: const FullType(String)) as String?; - break; - case 'posted_at': - result.postedAt = serializers.deserialize(value, - specifiedType: const FullType(DateTime)) as DateTime?; - break; - } - } - - return result.build(); - } -} - -class _$Submission extends Submission { - @override - final String id; - @override - final String? grade; - @override - final double score; - @override - final int attempt; - @override - final DateTime? submittedAt; - @override - final DateTime? commentCreated; - @override - final String? mediaContentType; - @override - final String? mediaCommentUrl; - @override - final String? mediaCommentDisplay; - @override - final BuiltList submissionHistory; - @override - final String? body; - @override - final bool isGradeMatchesCurrentSubmission; - @override - final String? workflowState; - @override - final String? submissionType; - @override - final String? previewUrl; - @override - final String? url; - @override - final bool isLate; - @override - final bool excused; - @override - final bool missing; - @override - final String assignmentId; - @override - final Assignment? assignment; - @override - final String userId; - @override - final String graderId; - @override - final User? user; - @override - final double? pointsDeducted; - @override - final double enteredScore; - @override - final String? enteredGrade; - @override - final DateTime? postedAt; - - factory _$Submission([void Function(SubmissionBuilder)? updates]) => - (new SubmissionBuilder()..update(updates))._build(); - - _$Submission._( - {required this.id, - this.grade, - required this.score, - required this.attempt, - this.submittedAt, - this.commentCreated, - this.mediaContentType, - this.mediaCommentUrl, - this.mediaCommentDisplay, - required this.submissionHistory, - this.body, - required this.isGradeMatchesCurrentSubmission, - this.workflowState, - this.submissionType, - this.previewUrl, - this.url, - required this.isLate, - required this.excused, - required this.missing, - required this.assignmentId, - this.assignment, - required this.userId, - required this.graderId, - this.user, - this.pointsDeducted, - required this.enteredScore, - this.enteredGrade, - this.postedAt}) - : super._() { - BuiltValueNullFieldError.checkNotNull(id, r'Submission', 'id'); - BuiltValueNullFieldError.checkNotNull(score, r'Submission', 'score'); - BuiltValueNullFieldError.checkNotNull(attempt, r'Submission', 'attempt'); - BuiltValueNullFieldError.checkNotNull( - submissionHistory, r'Submission', 'submissionHistory'); - BuiltValueNullFieldError.checkNotNull(isGradeMatchesCurrentSubmission, - r'Submission', 'isGradeMatchesCurrentSubmission'); - BuiltValueNullFieldError.checkNotNull(isLate, r'Submission', 'isLate'); - BuiltValueNullFieldError.checkNotNull(excused, r'Submission', 'excused'); - BuiltValueNullFieldError.checkNotNull(missing, r'Submission', 'missing'); - BuiltValueNullFieldError.checkNotNull( - assignmentId, r'Submission', 'assignmentId'); - BuiltValueNullFieldError.checkNotNull(userId, r'Submission', 'userId'); - BuiltValueNullFieldError.checkNotNull(graderId, r'Submission', 'graderId'); - BuiltValueNullFieldError.checkNotNull( - enteredScore, r'Submission', 'enteredScore'); - } - - @override - Submission rebuild(void Function(SubmissionBuilder) updates) => - (toBuilder()..update(updates)).build(); - - @override - SubmissionBuilder toBuilder() => new SubmissionBuilder()..replace(this); - - @override - bool operator ==(Object other) { - if (identical(other, this)) return true; - return other is Submission && - id == other.id && - grade == other.grade && - score == other.score && - attempt == other.attempt && - submittedAt == other.submittedAt && - commentCreated == other.commentCreated && - mediaContentType == other.mediaContentType && - mediaCommentUrl == other.mediaCommentUrl && - mediaCommentDisplay == other.mediaCommentDisplay && - submissionHistory == other.submissionHistory && - body == other.body && - isGradeMatchesCurrentSubmission == - other.isGradeMatchesCurrentSubmission && - workflowState == other.workflowState && - submissionType == other.submissionType && - previewUrl == other.previewUrl && - url == other.url && - isLate == other.isLate && - excused == other.excused && - missing == other.missing && - assignmentId == other.assignmentId && - assignment == other.assignment && - userId == other.userId && - graderId == other.graderId && - user == other.user && - pointsDeducted == other.pointsDeducted && - enteredScore == other.enteredScore && - enteredGrade == other.enteredGrade && - postedAt == other.postedAt; - } - - @override - int get hashCode { - var _$hash = 0; - _$hash = $jc(_$hash, id.hashCode); - _$hash = $jc(_$hash, grade.hashCode); - _$hash = $jc(_$hash, score.hashCode); - _$hash = $jc(_$hash, attempt.hashCode); - _$hash = $jc(_$hash, submittedAt.hashCode); - _$hash = $jc(_$hash, commentCreated.hashCode); - _$hash = $jc(_$hash, mediaContentType.hashCode); - _$hash = $jc(_$hash, mediaCommentUrl.hashCode); - _$hash = $jc(_$hash, mediaCommentDisplay.hashCode); - _$hash = $jc(_$hash, submissionHistory.hashCode); - _$hash = $jc(_$hash, body.hashCode); - _$hash = $jc(_$hash, isGradeMatchesCurrentSubmission.hashCode); - _$hash = $jc(_$hash, workflowState.hashCode); - _$hash = $jc(_$hash, submissionType.hashCode); - _$hash = $jc(_$hash, previewUrl.hashCode); - _$hash = $jc(_$hash, url.hashCode); - _$hash = $jc(_$hash, isLate.hashCode); - _$hash = $jc(_$hash, excused.hashCode); - _$hash = $jc(_$hash, missing.hashCode); - _$hash = $jc(_$hash, assignmentId.hashCode); - _$hash = $jc(_$hash, assignment.hashCode); - _$hash = $jc(_$hash, userId.hashCode); - _$hash = $jc(_$hash, graderId.hashCode); - _$hash = $jc(_$hash, user.hashCode); - _$hash = $jc(_$hash, pointsDeducted.hashCode); - _$hash = $jc(_$hash, enteredScore.hashCode); - _$hash = $jc(_$hash, enteredGrade.hashCode); - _$hash = $jc(_$hash, postedAt.hashCode); - _$hash = $jf(_$hash); - return _$hash; - } - - @override - String toString() { - return (newBuiltValueToStringHelper(r'Submission') - ..add('id', id) - ..add('grade', grade) - ..add('score', score) - ..add('attempt', attempt) - ..add('submittedAt', submittedAt) - ..add('commentCreated', commentCreated) - ..add('mediaContentType', mediaContentType) - ..add('mediaCommentUrl', mediaCommentUrl) - ..add('mediaCommentDisplay', mediaCommentDisplay) - ..add('submissionHistory', submissionHistory) - ..add('body', body) - ..add('isGradeMatchesCurrentSubmission', - isGradeMatchesCurrentSubmission) - ..add('workflowState', workflowState) - ..add('submissionType', submissionType) - ..add('previewUrl', previewUrl) - ..add('url', url) - ..add('isLate', isLate) - ..add('excused', excused) - ..add('missing', missing) - ..add('assignmentId', assignmentId) - ..add('assignment', assignment) - ..add('userId', userId) - ..add('graderId', graderId) - ..add('user', user) - ..add('pointsDeducted', pointsDeducted) - ..add('enteredScore', enteredScore) - ..add('enteredGrade', enteredGrade) - ..add('postedAt', postedAt)) - .toString(); - } -} - -class SubmissionBuilder implements Builder { - _$Submission? _$v; - - String? _id; - String? get id => _$this._id; - set id(String? id) => _$this._id = id; - - String? _grade; - String? get grade => _$this._grade; - set grade(String? grade) => _$this._grade = grade; - - double? _score; - double? get score => _$this._score; - set score(double? score) => _$this._score = score; - - int? _attempt; - int? get attempt => _$this._attempt; - set attempt(int? attempt) => _$this._attempt = attempt; - - DateTime? _submittedAt; - DateTime? get submittedAt => _$this._submittedAt; - set submittedAt(DateTime? submittedAt) => _$this._submittedAt = submittedAt; - - DateTime? _commentCreated; - DateTime? get commentCreated => _$this._commentCreated; - set commentCreated(DateTime? commentCreated) => - _$this._commentCreated = commentCreated; - - String? _mediaContentType; - String? get mediaContentType => _$this._mediaContentType; - set mediaContentType(String? mediaContentType) => - _$this._mediaContentType = mediaContentType; - - String? _mediaCommentUrl; - String? get mediaCommentUrl => _$this._mediaCommentUrl; - set mediaCommentUrl(String? mediaCommentUrl) => - _$this._mediaCommentUrl = mediaCommentUrl; - - String? _mediaCommentDisplay; - String? get mediaCommentDisplay => _$this._mediaCommentDisplay; - set mediaCommentDisplay(String? mediaCommentDisplay) => - _$this._mediaCommentDisplay = mediaCommentDisplay; - - ListBuilder? _submissionHistory; - ListBuilder get submissionHistory => - _$this._submissionHistory ??= new ListBuilder(); - set submissionHistory(ListBuilder? submissionHistory) => - _$this._submissionHistory = submissionHistory; - - String? _body; - String? get body => _$this._body; - set body(String? body) => _$this._body = body; - - bool? _isGradeMatchesCurrentSubmission; - bool? get isGradeMatchesCurrentSubmission => - _$this._isGradeMatchesCurrentSubmission; - set isGradeMatchesCurrentSubmission(bool? isGradeMatchesCurrentSubmission) => - _$this._isGradeMatchesCurrentSubmission = isGradeMatchesCurrentSubmission; - - String? _workflowState; - String? get workflowState => _$this._workflowState; - set workflowState(String? workflowState) => - _$this._workflowState = workflowState; - - String? _submissionType; - String? get submissionType => _$this._submissionType; - set submissionType(String? submissionType) => - _$this._submissionType = submissionType; - - String? _previewUrl; - String? get previewUrl => _$this._previewUrl; - set previewUrl(String? previewUrl) => _$this._previewUrl = previewUrl; - - String? _url; - String? get url => _$this._url; - set url(String? url) => _$this._url = url; - - bool? _isLate; - bool? get isLate => _$this._isLate; - set isLate(bool? isLate) => _$this._isLate = isLate; - - bool? _excused; - bool? get excused => _$this._excused; - set excused(bool? excused) => _$this._excused = excused; - - bool? _missing; - bool? get missing => _$this._missing; - set missing(bool? missing) => _$this._missing = missing; - - String? _assignmentId; - String? get assignmentId => _$this._assignmentId; - set assignmentId(String? assignmentId) => _$this._assignmentId = assignmentId; - - AssignmentBuilder? _assignment; - AssignmentBuilder get assignment => - _$this._assignment ??= new AssignmentBuilder(); - set assignment(AssignmentBuilder? assignment) => - _$this._assignment = assignment; - - String? _userId; - String? get userId => _$this._userId; - set userId(String? userId) => _$this._userId = userId; - - String? _graderId; - String? get graderId => _$this._graderId; - set graderId(String? graderId) => _$this._graderId = graderId; - - UserBuilder? _user; - UserBuilder get user => _$this._user ??= new UserBuilder(); - set user(UserBuilder? user) => _$this._user = user; - - double? _pointsDeducted; - double? get pointsDeducted => _$this._pointsDeducted; - set pointsDeducted(double? pointsDeducted) => - _$this._pointsDeducted = pointsDeducted; - - double? _enteredScore; - double? get enteredScore => _$this._enteredScore; - set enteredScore(double? enteredScore) => _$this._enteredScore = enteredScore; - - String? _enteredGrade; - String? get enteredGrade => _$this._enteredGrade; - set enteredGrade(String? enteredGrade) => _$this._enteredGrade = enteredGrade; - - DateTime? _postedAt; - DateTime? get postedAt => _$this._postedAt; - set postedAt(DateTime? postedAt) => _$this._postedAt = postedAt; - - SubmissionBuilder() { - Submission._initializeBuilder(this); - } - - SubmissionBuilder get _$this { - final $v = _$v; - if ($v != null) { - _id = $v.id; - _grade = $v.grade; - _score = $v.score; - _attempt = $v.attempt; - _submittedAt = $v.submittedAt; - _commentCreated = $v.commentCreated; - _mediaContentType = $v.mediaContentType; - _mediaCommentUrl = $v.mediaCommentUrl; - _mediaCommentDisplay = $v.mediaCommentDisplay; - _submissionHistory = $v.submissionHistory.toBuilder(); - _body = $v.body; - _isGradeMatchesCurrentSubmission = $v.isGradeMatchesCurrentSubmission; - _workflowState = $v.workflowState; - _submissionType = $v.submissionType; - _previewUrl = $v.previewUrl; - _url = $v.url; - _isLate = $v.isLate; - _excused = $v.excused; - _missing = $v.missing; - _assignmentId = $v.assignmentId; - _assignment = $v.assignment?.toBuilder(); - _userId = $v.userId; - _graderId = $v.graderId; - _user = $v.user?.toBuilder(); - _pointsDeducted = $v.pointsDeducted; - _enteredScore = $v.enteredScore; - _enteredGrade = $v.enteredGrade; - _postedAt = $v.postedAt; - _$v = null; - } - return this; - } - - @override - void replace(Submission other) { - ArgumentError.checkNotNull(other, 'other'); - _$v = other as _$Submission; - } - - @override - void update(void Function(SubmissionBuilder)? updates) { - if (updates != null) updates(this); - } - - @override - Submission build() => _build(); - - _$Submission _build() { - _$Submission _$result; - try { - _$result = _$v ?? - new _$Submission._( - id: BuiltValueNullFieldError.checkNotNull( - id, r'Submission', 'id'), - grade: grade, - score: BuiltValueNullFieldError.checkNotNull( - score, r'Submission', 'score'), - attempt: BuiltValueNullFieldError.checkNotNull( - attempt, r'Submission', 'attempt'), - submittedAt: submittedAt, - commentCreated: commentCreated, - mediaContentType: mediaContentType, - mediaCommentUrl: mediaCommentUrl, - mediaCommentDisplay: mediaCommentDisplay, - submissionHistory: submissionHistory.build(), - body: body, - isGradeMatchesCurrentSubmission: - BuiltValueNullFieldError.checkNotNull( - isGradeMatchesCurrentSubmission, - r'Submission', - 'isGradeMatchesCurrentSubmission'), - workflowState: workflowState, - submissionType: submissionType, - previewUrl: previewUrl, - url: url, - isLate: BuiltValueNullFieldError.checkNotNull( - isLate, r'Submission', 'isLate'), - excused: BuiltValueNullFieldError.checkNotNull( - excused, r'Submission', 'excused'), - missing: BuiltValueNullFieldError.checkNotNull( - missing, r'Submission', 'missing'), - assignmentId: BuiltValueNullFieldError.checkNotNull( - assignmentId, r'Submission', 'assignmentId'), - assignment: _assignment?.build(), - userId: - BuiltValueNullFieldError.checkNotNull(userId, r'Submission', 'userId'), - graderId: BuiltValueNullFieldError.checkNotNull(graderId, r'Submission', 'graderId'), - user: _user?.build(), - pointsDeducted: pointsDeducted, - enteredScore: BuiltValueNullFieldError.checkNotNull(enteredScore, r'Submission', 'enteredScore'), - enteredGrade: enteredGrade, - postedAt: postedAt); - } catch (_) { - late String _$failedField; - try { - _$failedField = 'submissionHistory'; - submissionHistory.build(); - - _$failedField = 'assignment'; - _assignment?.build(); - - _$failedField = 'user'; - _user?.build(); - } catch (e) { - throw new BuiltValueNestedFieldError( - r'Submission', _$failedField, e.toString()); - } - rethrow; - } - replace(_$result); - return _$result; - } -} - -// ignore_for_file: deprecated_member_use_from_same_package,type=lint diff --git a/apps/flutter_parent/lib/models/submission_wrapper.dart b/apps/flutter_parent/lib/models/submission_wrapper.dart deleted file mode 100644 index 363c676039..0000000000 --- a/apps/flutter_parent/lib/models/submission_wrapper.dart +++ /dev/null @@ -1,97 +0,0 @@ -/* - * Copyright (C) 2020 - present Instructure, Inc. - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, version 3 of the License. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ -import 'package:built_collection/built_collection.dart'; -import 'package:built_value/built_value.dart'; -import 'package:built_value/serializer.dart'; -import 'package:flutter_parent/models/serializers.dart'; -import 'package:flutter_parent/models/submission.dart'; - -part 'submission_wrapper.g.dart'; - -/// To have this built_value be generated, run this command from the project root: -/// flutter pub run build_runner build --delete-conflicting-outputs -/// -/// This enables us to handle both single submission and lists of submission responses. -/// The parent grades list is an example of where the api will return this list, while most other -/// locations will use a single submission (i.e. student grades list). -abstract class SubmissionWrapper implements Built { - @BuiltValueSerializer(custom: true) - static Serializer get serializer => SubmissionWrapperSerializer(); - - Submission? get submission; - - BuiltList? get submissionList; - - SubmissionWrapper._(); - - factory SubmissionWrapper([updates(SubmissionWrapperBuilder b)]) = _$SubmissionWrapper; -} - -class SubmissionWrapperSerializer implements StructuredSerializer { - @override - SubmissionWrapper deserialize(Serializers serializers, Iterable serialized, - {FullType specifiedType = FullType.unspecified}) { - // Initialize an empty builder - final result = new SubmissionWrapperBuilder(); - - if (serialized.first == 'id' || serialized.first is String) { - // This is the single submission case - Submission submission = - jsonSerializers.deserializeWith(jsonSerializers.serializerForType(Submission)!, serialized); - - result.submission = submission.toBuilder(); - } else { - // This is a list of submissions - List submissionList = []; - - serialized.forEach((serializedSubmission) { - submissionList - .add(jsonSerializers.deserializeWith(jsonSerializers.serializerForType(Submission)!, serializedSubmission)); - }); - - result.submissionList = BuiltList.from(submissionList).toBuilder(); - } - - return result.build(); - } - - @override - Iterable serialize(Serializers serializers, SubmissionWrapper object, - {FullType specifiedType = FullType.unspecified}) { - final result = []; - - // Regardless of how we were storing it, we need to serialize it as "submission" since that's what the api expects - if (object.submission != null) { - result - ..add('submission') - ..add(serializers.serialize(object.submission, specifiedType: const FullType(Submission))); - } - if (object.submissionList != null) { - result - ..add('submission') - ..add(serializers.serialize(object.submissionList, - specifiedType: const FullType(BuiltList, const [const FullType(Submission)]))); - } - - return result; - } - - @override - Iterable get types => [SubmissionWrapper, _$SubmissionWrapper]; //[SubmissionWrapper, _$SubmissionWrapper]; - - @override - String get wireName => 'SubmissionWrapper'; -} diff --git a/apps/flutter_parent/lib/models/submission_wrapper.g.dart b/apps/flutter_parent/lib/models/submission_wrapper.g.dart deleted file mode 100644 index 55afdbae1e..0000000000 --- a/apps/flutter_parent/lib/models/submission_wrapper.g.dart +++ /dev/null @@ -1,122 +0,0 @@ -// GENERATED CODE - DO NOT MODIFY BY HAND - -part of 'submission_wrapper.dart'; - -// ************************************************************************** -// BuiltValueGenerator -// ************************************************************************** - -class _$SubmissionWrapper extends SubmissionWrapper { - @override - final Submission? submission; - @override - final BuiltList? submissionList; - - factory _$SubmissionWrapper( - [void Function(SubmissionWrapperBuilder)? updates]) => - (new SubmissionWrapperBuilder()..update(updates))._build(); - - _$SubmissionWrapper._({this.submission, this.submissionList}) : super._(); - - @override - SubmissionWrapper rebuild(void Function(SubmissionWrapperBuilder) updates) => - (toBuilder()..update(updates)).build(); - - @override - SubmissionWrapperBuilder toBuilder() => - new SubmissionWrapperBuilder()..replace(this); - - @override - bool operator ==(Object other) { - if (identical(other, this)) return true; - return other is SubmissionWrapper && - submission == other.submission && - submissionList == other.submissionList; - } - - @override - int get hashCode { - var _$hash = 0; - _$hash = $jc(_$hash, submission.hashCode); - _$hash = $jc(_$hash, submissionList.hashCode); - _$hash = $jf(_$hash); - return _$hash; - } - - @override - String toString() { - return (newBuiltValueToStringHelper(r'SubmissionWrapper') - ..add('submission', submission) - ..add('submissionList', submissionList)) - .toString(); - } -} - -class SubmissionWrapperBuilder - implements Builder { - _$SubmissionWrapper? _$v; - - SubmissionBuilder? _submission; - SubmissionBuilder get submission => - _$this._submission ??= new SubmissionBuilder(); - set submission(SubmissionBuilder? submission) => - _$this._submission = submission; - - ListBuilder? _submissionList; - ListBuilder get submissionList => - _$this._submissionList ??= new ListBuilder(); - set submissionList(ListBuilder? submissionList) => - _$this._submissionList = submissionList; - - SubmissionWrapperBuilder(); - - SubmissionWrapperBuilder get _$this { - final $v = _$v; - if ($v != null) { - _submission = $v.submission?.toBuilder(); - _submissionList = $v.submissionList?.toBuilder(); - _$v = null; - } - return this; - } - - @override - void replace(SubmissionWrapper other) { - ArgumentError.checkNotNull(other, 'other'); - _$v = other as _$SubmissionWrapper; - } - - @override - void update(void Function(SubmissionWrapperBuilder)? updates) { - if (updates != null) updates(this); - } - - @override - SubmissionWrapper build() => _build(); - - _$SubmissionWrapper _build() { - _$SubmissionWrapper _$result; - try { - _$result = _$v ?? - new _$SubmissionWrapper._( - submission: _submission?.build(), - submissionList: _submissionList?.build()); - } catch (_) { - late String _$failedField; - try { - _$failedField = 'submission'; - _submission?.build(); - _$failedField = 'submissionList'; - _submissionList?.build(); - } catch (e) { - throw new BuiltValueNestedFieldError( - r'SubmissionWrapper', _$failedField, e.toString()); - } - rethrow; - } - replace(_$result); - return _$result; - } -} - -// ignore_for_file: deprecated_member_use_from_same_package,type=lint diff --git a/apps/flutter_parent/lib/models/term.dart b/apps/flutter_parent/lib/models/term.dart deleted file mode 100644 index 46b59549f9..0000000000 --- a/apps/flutter_parent/lib/models/term.dart +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Copyright (C) 2020 - present Instructure, Inc. - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, version 3 of the License. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -import 'package:built_value/built_value.dart'; -import 'package:built_value/serializer.dart'; - -part 'term.g.dart'; - -/// To have this built_value be generated, run this command from the project root: -/// flutter pub run build_runner build --delete-conflicting-outputs -abstract class Term implements Built { - @BuiltValueSerializer(serializeNulls: true) // Add this line to get nulls to serialize when we convert to JSON - static Serializer get serializer => _$termSerializer; - - String get id; - - String? get name; - - @BuiltValueField(wireName: 'start_at') - DateTime? get startAt; - - @BuiltValueField(wireName: 'end_at') - DateTime? get endAt; - - Term._(); - factory Term([void Function(TermBuilder) updates]) = _$Term; - - static void _initializeBuilder(TermBuilder b) => b..id = ''; -} diff --git a/apps/flutter_parent/lib/models/term.g.dart b/apps/flutter_parent/lib/models/term.g.dart deleted file mode 100644 index d5f121530d..0000000000 --- a/apps/flutter_parent/lib/models/term.g.dart +++ /dev/null @@ -1,199 +0,0 @@ -// GENERATED CODE - DO NOT MODIFY BY HAND - -part of 'term.dart'; - -// ************************************************************************** -// BuiltValueGenerator -// ************************************************************************** - -Serializer _$termSerializer = new _$TermSerializer(); - -class _$TermSerializer implements StructuredSerializer { - @override - final Iterable types = const [Term, _$Term]; - @override - final String wireName = 'Term'; - - @override - Iterable serialize(Serializers serializers, Term object, - {FullType specifiedType = FullType.unspecified}) { - final result = [ - 'id', - serializers.serialize(object.id, specifiedType: const FullType(String)), - ]; - Object? value; - value = object.name; - - result - ..add('name') - ..add( - serializers.serialize(value, specifiedType: const FullType(String))); - value = object.startAt; - - result - ..add('start_at') - ..add(serializers.serialize(value, - specifiedType: const FullType(DateTime))); - value = object.endAt; - - result - ..add('end_at') - ..add(serializers.serialize(value, - specifiedType: const FullType(DateTime))); - - return result; - } - - @override - Term deserialize(Serializers serializers, Iterable serialized, - {FullType specifiedType = FullType.unspecified}) { - final result = new TermBuilder(); - - final iterator = serialized.iterator; - while (iterator.moveNext()) { - final key = iterator.current! as String; - iterator.moveNext(); - final Object? value = iterator.current; - switch (key) { - case 'id': - result.id = serializers.deserialize(value, - specifiedType: const FullType(String))! as String; - break; - case 'name': - result.name = serializers.deserialize(value, - specifiedType: const FullType(String)) as String?; - break; - case 'start_at': - result.startAt = serializers.deserialize(value, - specifiedType: const FullType(DateTime)) as DateTime?; - break; - case 'end_at': - result.endAt = serializers.deserialize(value, - specifiedType: const FullType(DateTime)) as DateTime?; - break; - } - } - - return result.build(); - } -} - -class _$Term extends Term { - @override - final String id; - @override - final String? name; - @override - final DateTime? startAt; - @override - final DateTime? endAt; - - factory _$Term([void Function(TermBuilder)? updates]) => - (new TermBuilder()..update(updates))._build(); - - _$Term._({required this.id, this.name, this.startAt, this.endAt}) - : super._() { - BuiltValueNullFieldError.checkNotNull(id, r'Term', 'id'); - } - - @override - Term rebuild(void Function(TermBuilder) updates) => - (toBuilder()..update(updates)).build(); - - @override - TermBuilder toBuilder() => new TermBuilder()..replace(this); - - @override - bool operator ==(Object other) { - if (identical(other, this)) return true; - return other is Term && - id == other.id && - name == other.name && - startAt == other.startAt && - endAt == other.endAt; - } - - @override - int get hashCode { - var _$hash = 0; - _$hash = $jc(_$hash, id.hashCode); - _$hash = $jc(_$hash, name.hashCode); - _$hash = $jc(_$hash, startAt.hashCode); - _$hash = $jc(_$hash, endAt.hashCode); - _$hash = $jf(_$hash); - return _$hash; - } - - @override - String toString() { - return (newBuiltValueToStringHelper(r'Term') - ..add('id', id) - ..add('name', name) - ..add('startAt', startAt) - ..add('endAt', endAt)) - .toString(); - } -} - -class TermBuilder implements Builder { - _$Term? _$v; - - String? _id; - String? get id => _$this._id; - set id(String? id) => _$this._id = id; - - String? _name; - String? get name => _$this._name; - set name(String? name) => _$this._name = name; - - DateTime? _startAt; - DateTime? get startAt => _$this._startAt; - set startAt(DateTime? startAt) => _$this._startAt = startAt; - - DateTime? _endAt; - DateTime? get endAt => _$this._endAt; - set endAt(DateTime? endAt) => _$this._endAt = endAt; - - TermBuilder() { - Term._initializeBuilder(this); - } - - TermBuilder get _$this { - final $v = _$v; - if ($v != null) { - _id = $v.id; - _name = $v.name; - _startAt = $v.startAt; - _endAt = $v.endAt; - _$v = null; - } - return this; - } - - @override - void replace(Term other) { - ArgumentError.checkNotNull(other, 'other'); - _$v = other as _$Term; - } - - @override - void update(void Function(TermBuilder)? updates) { - if (updates != null) updates(this); - } - - @override - Term build() => _build(); - - _$Term _build() { - final _$result = _$v ?? - new _$Term._( - id: BuiltValueNullFieldError.checkNotNull(id, r'Term', 'id'), - name: name, - startAt: startAt, - endAt: endAt); - replace(_$result); - return _$result; - } -} - -// ignore_for_file: deprecated_member_use_from_same_package,type=lint diff --git a/apps/flutter_parent/lib/models/terms_of_service.dart b/apps/flutter_parent/lib/models/terms_of_service.dart deleted file mode 100644 index 5e4d11ed52..0000000000 --- a/apps/flutter_parent/lib/models/terms_of_service.dart +++ /dev/null @@ -1,40 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:built_value/built_value.dart'; -import 'package:built_value/serializer.dart'; - -part 'terms_of_service.g.dart'; - -/// To have this built_value be generated, run this command from the project root: -/// flutter pub run build_runner build --delete-conflicting-outputs -abstract class TermsOfService implements Built { - @BuiltValueSerializer(serializeNulls: true) - static Serializer get serializer => _$termsOfServiceSerializer; - - String get id; - - @BuiltValueField(wireName: 'terms_type') - String? get termsType; - - bool get passive; - - @BuiltValueField(wireName: 'account_id') - String get accountId; - - String? get content; - - TermsOfService._(); - factory TermsOfService([void Function(TermsOfServiceBuilder) updates]) = _$TermsOfService; -} diff --git a/apps/flutter_parent/lib/models/terms_of_service.g.dart b/apps/flutter_parent/lib/models/terms_of_service.g.dart deleted file mode 100644 index e765233087..0000000000 --- a/apps/flutter_parent/lib/models/terms_of_service.g.dart +++ /dev/null @@ -1,229 +0,0 @@ -// GENERATED CODE - DO NOT MODIFY BY HAND - -part of 'terms_of_service.dart'; - -// ************************************************************************** -// BuiltValueGenerator -// ************************************************************************** - -Serializer _$termsOfServiceSerializer = - new _$TermsOfServiceSerializer(); - -class _$TermsOfServiceSerializer - implements StructuredSerializer { - @override - final Iterable types = const [TermsOfService, _$TermsOfService]; - @override - final String wireName = 'TermsOfService'; - - @override - Iterable serialize(Serializers serializers, TermsOfService object, - {FullType specifiedType = FullType.unspecified}) { - final result = [ - 'id', - serializers.serialize(object.id, specifiedType: const FullType(String)), - 'passive', - serializers.serialize(object.passive, - specifiedType: const FullType(bool)), - 'account_id', - serializers.serialize(object.accountId, - specifiedType: const FullType(String)), - ]; - Object? value; - value = object.termsType; - - result - ..add('terms_type') - ..add( - serializers.serialize(value, specifiedType: const FullType(String))); - value = object.content; - - result - ..add('content') - ..add( - serializers.serialize(value, specifiedType: const FullType(String))); - - return result; - } - - @override - TermsOfService deserialize( - Serializers serializers, Iterable serialized, - {FullType specifiedType = FullType.unspecified}) { - final result = new TermsOfServiceBuilder(); - - final iterator = serialized.iterator; - while (iterator.moveNext()) { - final key = iterator.current! as String; - iterator.moveNext(); - final Object? value = iterator.current; - switch (key) { - case 'id': - result.id = serializers.deserialize(value, - specifiedType: const FullType(String))! as String; - break; - case 'terms_type': - result.termsType = serializers.deserialize(value, - specifiedType: const FullType(String)) as String?; - break; - case 'passive': - result.passive = serializers.deserialize(value, - specifiedType: const FullType(bool))! as bool; - break; - case 'account_id': - result.accountId = serializers.deserialize(value, - specifiedType: const FullType(String))! as String; - break; - case 'content': - result.content = serializers.deserialize(value, - specifiedType: const FullType(String)) as String?; - break; - } - } - - return result.build(); - } -} - -class _$TermsOfService extends TermsOfService { - @override - final String id; - @override - final String? termsType; - @override - final bool passive; - @override - final String accountId; - @override - final String? content; - - factory _$TermsOfService([void Function(TermsOfServiceBuilder)? updates]) => - (new TermsOfServiceBuilder()..update(updates))._build(); - - _$TermsOfService._( - {required this.id, - this.termsType, - required this.passive, - required this.accountId, - this.content}) - : super._() { - BuiltValueNullFieldError.checkNotNull(id, r'TermsOfService', 'id'); - BuiltValueNullFieldError.checkNotNull( - passive, r'TermsOfService', 'passive'); - BuiltValueNullFieldError.checkNotNull( - accountId, r'TermsOfService', 'accountId'); - } - - @override - TermsOfService rebuild(void Function(TermsOfServiceBuilder) updates) => - (toBuilder()..update(updates)).build(); - - @override - TermsOfServiceBuilder toBuilder() => - new TermsOfServiceBuilder()..replace(this); - - @override - bool operator ==(Object other) { - if (identical(other, this)) return true; - return other is TermsOfService && - id == other.id && - termsType == other.termsType && - passive == other.passive && - accountId == other.accountId && - content == other.content; - } - - @override - int get hashCode { - var _$hash = 0; - _$hash = $jc(_$hash, id.hashCode); - _$hash = $jc(_$hash, termsType.hashCode); - _$hash = $jc(_$hash, passive.hashCode); - _$hash = $jc(_$hash, accountId.hashCode); - _$hash = $jc(_$hash, content.hashCode); - _$hash = $jf(_$hash); - return _$hash; - } - - @override - String toString() { - return (newBuiltValueToStringHelper(r'TermsOfService') - ..add('id', id) - ..add('termsType', termsType) - ..add('passive', passive) - ..add('accountId', accountId) - ..add('content', content)) - .toString(); - } -} - -class TermsOfServiceBuilder - implements Builder { - _$TermsOfService? _$v; - - String? _id; - String? get id => _$this._id; - set id(String? id) => _$this._id = id; - - String? _termsType; - String? get termsType => _$this._termsType; - set termsType(String? termsType) => _$this._termsType = termsType; - - bool? _passive; - bool? get passive => _$this._passive; - set passive(bool? passive) => _$this._passive = passive; - - String? _accountId; - String? get accountId => _$this._accountId; - set accountId(String? accountId) => _$this._accountId = accountId; - - String? _content; - String? get content => _$this._content; - set content(String? content) => _$this._content = content; - - TermsOfServiceBuilder(); - - TermsOfServiceBuilder get _$this { - final $v = _$v; - if ($v != null) { - _id = $v.id; - _termsType = $v.termsType; - _passive = $v.passive; - _accountId = $v.accountId; - _content = $v.content; - _$v = null; - } - return this; - } - - @override - void replace(TermsOfService other) { - ArgumentError.checkNotNull(other, 'other'); - _$v = other as _$TermsOfService; - } - - @override - void update(void Function(TermsOfServiceBuilder)? updates) { - if (updates != null) updates(this); - } - - @override - TermsOfService build() => _build(); - - _$TermsOfService _build() { - final _$result = _$v ?? - new _$TermsOfService._( - id: BuiltValueNullFieldError.checkNotNull( - id, r'TermsOfService', 'id'), - termsType: termsType, - passive: BuiltValueNullFieldError.checkNotNull( - passive, r'TermsOfService', 'passive'), - accountId: BuiltValueNullFieldError.checkNotNull( - accountId, r'TermsOfService', 'accountId'), - content: content); - replace(_$result); - return _$result; - } -} - -// ignore_for_file: deprecated_member_use_from_same_package,type=lint diff --git a/apps/flutter_parent/lib/models/unread_count.dart b/apps/flutter_parent/lib/models/unread_count.dart deleted file mode 100644 index 1ec25c73e2..0000000000 --- a/apps/flutter_parent/lib/models/unread_count.dart +++ /dev/null @@ -1,34 +0,0 @@ -// Copyright (C) 2019 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:built_value/built_value.dart'; -import 'package:built_value/json_object.dart'; -import 'package:built_value/serializer.dart'; - -part 'unread_count.g.dart'; - -/// To have this built_value be generated, run this command from the project root: -/// flutter pub run build_runner build -abstract class UnreadCount implements Built { - @BuiltValueSerializer(serializeNulls: true) // Add this line to get nulls to serialize when we convert to JSON - static Serializer get serializer => _$unreadCountSerializer; - - // Returned as a String from the conversation count - // Returned as a num from the alerts count - @BuiltValueField(wireName: 'unread_count') - JsonObject get count; - - UnreadCount._(); - factory UnreadCount([void Function(UnreadCountBuilder) updates]) = _$UnreadCount; -} diff --git a/apps/flutter_parent/lib/models/unread_count.g.dart b/apps/flutter_parent/lib/models/unread_count.g.dart deleted file mode 100644 index 4de0ec9265..0000000000 --- a/apps/flutter_parent/lib/models/unread_count.g.dart +++ /dev/null @@ -1,132 +0,0 @@ -// GENERATED CODE - DO NOT MODIFY BY HAND - -part of 'unread_count.dart'; - -// ************************************************************************** -// BuiltValueGenerator -// ************************************************************************** - -Serializer _$unreadCountSerializer = new _$UnreadCountSerializer(); - -class _$UnreadCountSerializer implements StructuredSerializer { - @override - final Iterable types = const [UnreadCount, _$UnreadCount]; - @override - final String wireName = 'UnreadCount'; - - @override - Iterable serialize(Serializers serializers, UnreadCount object, - {FullType specifiedType = FullType.unspecified}) { - final result = [ - 'unread_count', - serializers.serialize(object.count, - specifiedType: const FullType(JsonObject)), - ]; - - return result; - } - - @override - UnreadCount deserialize(Serializers serializers, Iterable serialized, - {FullType specifiedType = FullType.unspecified}) { - final result = new UnreadCountBuilder(); - - final iterator = serialized.iterator; - while (iterator.moveNext()) { - final key = iterator.current! as String; - iterator.moveNext(); - final Object? value = iterator.current; - switch (key) { - case 'unread_count': - result.count = serializers.deserialize(value, - specifiedType: const FullType(JsonObject))! as JsonObject; - break; - } - } - - return result.build(); - } -} - -class _$UnreadCount extends UnreadCount { - @override - final JsonObject count; - - factory _$UnreadCount([void Function(UnreadCountBuilder)? updates]) => - (new UnreadCountBuilder()..update(updates))._build(); - - _$UnreadCount._({required this.count}) : super._() { - BuiltValueNullFieldError.checkNotNull(count, r'UnreadCount', 'count'); - } - - @override - UnreadCount rebuild(void Function(UnreadCountBuilder) updates) => - (toBuilder()..update(updates)).build(); - - @override - UnreadCountBuilder toBuilder() => new UnreadCountBuilder()..replace(this); - - @override - bool operator ==(Object other) { - if (identical(other, this)) return true; - return other is UnreadCount && count == other.count; - } - - @override - int get hashCode { - var _$hash = 0; - _$hash = $jc(_$hash, count.hashCode); - _$hash = $jf(_$hash); - return _$hash; - } - - @override - String toString() { - return (newBuiltValueToStringHelper(r'UnreadCount')..add('count', count)) - .toString(); - } -} - -class UnreadCountBuilder implements Builder { - _$UnreadCount? _$v; - - JsonObject? _count; - JsonObject? get count => _$this._count; - set count(JsonObject? count) => _$this._count = count; - - UnreadCountBuilder(); - - UnreadCountBuilder get _$this { - final $v = _$v; - if ($v != null) { - _count = $v.count; - _$v = null; - } - return this; - } - - @override - void replace(UnreadCount other) { - ArgumentError.checkNotNull(other, 'other'); - _$v = other as _$UnreadCount; - } - - @override - void update(void Function(UnreadCountBuilder)? updates) { - if (updates != null) updates(this); - } - - @override - UnreadCount build() => _build(); - - _$UnreadCount _build() { - final _$result = _$v ?? - new _$UnreadCount._( - count: BuiltValueNullFieldError.checkNotNull( - count, r'UnreadCount', 'count')); - replace(_$result); - return _$result; - } -} - -// ignore_for_file: deprecated_member_use_from_same_package,type=lint diff --git a/apps/flutter_parent/lib/models/user.dart b/apps/flutter_parent/lib/models/user.dart deleted file mode 100644 index 53626e996a..0000000000 --- a/apps/flutter_parent/lib/models/user.dart +++ /dev/null @@ -1,84 +0,0 @@ -// Copyright (C) 2019 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -library user; - -import 'package:built_value/built_value.dart'; -import 'package:built_value/serializer.dart'; - -part 'user.g.dart'; - -/// To have this built_value be generated, run this command from the project root: -/// flutter packages pub run build_runner build --delete-conflicting-outputs -abstract class User implements Built { - @BuiltValueSerializer(serializeNulls: true) - static Serializer get serializer => _$userSerializer; - - User._(); - factory User([void Function(UserBuilder) updates]) = _$User; - - String get id; - - String get name; - - @BuiltValueField(wireName: 'sortable_name') - String? get sortableName; - - @BuiltValueField(wireName: 'short_name') - String? get shortName; - - String? get pronouns; - - @BuiltValueField(wireName: 'avatar_url') - String? get avatarUrl; - - @BuiltValueField(wireName: 'primary_email') - String? get primaryEmail; - - String? get locale; - - @BuiltValueField(wireName: 'effective_locale') - String? get effectiveLocale; - - UserPermission? get permissions; - - @BuiltValueField(wireName: 'login_id') - String? get loginId; - - static void _initializeBuilder(UserBuilder b) => b - ..id = '' - ..name = ''; -} - -abstract class UserPermission implements Built { - @BuiltValueSerializer(serializeNulls: true) - static Serializer get serializer => _$userPermissionSerializer; - - UserPermission._(); - factory UserPermission([void Function(UserPermissionBuilder) updates]) = _$UserPermission; - - @BuiltValueField(wireName: 'become_user') - bool get become_user; - @BuiltValueField(wireName: 'can_update_name') - bool get canUpdateName; - @BuiltValueField(wireName: 'can_update_avatar') - bool get canUpdateAvatar; - @BuiltValueField(wireName: 'limit_parent_app_web_access') - bool get limitParentAppWebAccess; - - static void _initializeBuilder(UserPermissionBuilder b) => b - ..become_user = false - ..canUpdateName = false - ..canUpdateAvatar = false - ..limitParentAppWebAccess = false; -} diff --git a/apps/flutter_parent/lib/models/user.g.dart b/apps/flutter_parent/lib/models/user.g.dart deleted file mode 100644 index 827499fda0..0000000000 --- a/apps/flutter_parent/lib/models/user.g.dart +++ /dev/null @@ -1,577 +0,0 @@ -// GENERATED CODE - DO NOT MODIFY BY HAND - -part of 'user.dart'; - -// ************************************************************************** -// BuiltValueGenerator -// ************************************************************************** - -Serializer _$userSerializer = new _$UserSerializer(); -Serializer _$userPermissionSerializer = - new _$UserPermissionSerializer(); - -class _$UserSerializer implements StructuredSerializer { - @override - final Iterable types = const [User, _$User]; - @override - final String wireName = 'User'; - - @override - Iterable serialize(Serializers serializers, User object, - {FullType specifiedType = FullType.unspecified}) { - final result = [ - 'id', - serializers.serialize(object.id, specifiedType: const FullType(String)), - 'name', - serializers.serialize(object.name, specifiedType: const FullType(String)), - ]; - Object? value; - value = object.sortableName; - - result - ..add('sortable_name') - ..add( - serializers.serialize(value, specifiedType: const FullType(String))); - value = object.shortName; - - result - ..add('short_name') - ..add( - serializers.serialize(value, specifiedType: const FullType(String))); - value = object.pronouns; - - result - ..add('pronouns') - ..add( - serializers.serialize(value, specifiedType: const FullType(String))); - value = object.avatarUrl; - - result - ..add('avatar_url') - ..add( - serializers.serialize(value, specifiedType: const FullType(String))); - value = object.primaryEmail; - - result - ..add('primary_email') - ..add( - serializers.serialize(value, specifiedType: const FullType(String))); - value = object.locale; - - result - ..add('locale') - ..add( - serializers.serialize(value, specifiedType: const FullType(String))); - value = object.effectiveLocale; - - result - ..add('effective_locale') - ..add( - serializers.serialize(value, specifiedType: const FullType(String))); - value = object.permissions; - - result - ..add('permissions') - ..add(serializers.serialize(value, - specifiedType: const FullType(UserPermission))); - value = object.loginId; - - result - ..add('login_id') - ..add( - serializers.serialize(value, specifiedType: const FullType(String))); - - return result; - } - - @override - User deserialize(Serializers serializers, Iterable serialized, - {FullType specifiedType = FullType.unspecified}) { - final result = new UserBuilder(); - - final iterator = serialized.iterator; - while (iterator.moveNext()) { - final key = iterator.current! as String; - iterator.moveNext(); - final Object? value = iterator.current; - switch (key) { - case 'id': - result.id = serializers.deserialize(value, - specifiedType: const FullType(String))! as String; - break; - case 'name': - result.name = serializers.deserialize(value, - specifiedType: const FullType(String))! as String; - break; - case 'sortable_name': - result.sortableName = serializers.deserialize(value, - specifiedType: const FullType(String)) as String?; - break; - case 'short_name': - result.shortName = serializers.deserialize(value, - specifiedType: const FullType(String)) as String?; - break; - case 'pronouns': - result.pronouns = serializers.deserialize(value, - specifiedType: const FullType(String)) as String?; - break; - case 'avatar_url': - result.avatarUrl = serializers.deserialize(value, - specifiedType: const FullType(String)) as String?; - break; - case 'primary_email': - result.primaryEmail = serializers.deserialize(value, - specifiedType: const FullType(String)) as String?; - break; - case 'locale': - result.locale = serializers.deserialize(value, - specifiedType: const FullType(String)) as String?; - break; - case 'effective_locale': - result.effectiveLocale = serializers.deserialize(value, - specifiedType: const FullType(String)) as String?; - break; - case 'permissions': - result.permissions.replace(serializers.deserialize(value, - specifiedType: const FullType(UserPermission))! - as UserPermission); - break; - case 'login_id': - result.loginId = serializers.deserialize(value, - specifiedType: const FullType(String)) as String?; - break; - } - } - - return result.build(); - } -} - -class _$UserPermissionSerializer - implements StructuredSerializer { - @override - final Iterable types = const [UserPermission, _$UserPermission]; - @override - final String wireName = 'UserPermission'; - - @override - Iterable serialize(Serializers serializers, UserPermission object, - {FullType specifiedType = FullType.unspecified}) { - final result = [ - 'become_user', - serializers.serialize(object.become_user, - specifiedType: const FullType(bool)), - 'can_update_name', - serializers.serialize(object.canUpdateName, - specifiedType: const FullType(bool)), - 'can_update_avatar', - serializers.serialize(object.canUpdateAvatar, - specifiedType: const FullType(bool)), - 'limit_parent_app_web_access', - serializers.serialize(object.limitParentAppWebAccess, - specifiedType: const FullType(bool)), - ]; - - return result; - } - - @override - UserPermission deserialize( - Serializers serializers, Iterable serialized, - {FullType specifiedType = FullType.unspecified}) { - final result = new UserPermissionBuilder(); - - final iterator = serialized.iterator; - while (iterator.moveNext()) { - final key = iterator.current! as String; - iterator.moveNext(); - final Object? value = iterator.current; - switch (key) { - case 'become_user': - result.become_user = serializers.deserialize(value, - specifiedType: const FullType(bool))! as bool; - break; - case 'can_update_name': - result.canUpdateName = serializers.deserialize(value, - specifiedType: const FullType(bool))! as bool; - break; - case 'can_update_avatar': - result.canUpdateAvatar = serializers.deserialize(value, - specifiedType: const FullType(bool))! as bool; - break; - case 'limit_parent_app_web_access': - result.limitParentAppWebAccess = serializers.deserialize(value, - specifiedType: const FullType(bool))! as bool; - break; - } - } - - return result.build(); - } -} - -class _$User extends User { - @override - final String id; - @override - final String name; - @override - final String? sortableName; - @override - final String? shortName; - @override - final String? pronouns; - @override - final String? avatarUrl; - @override - final String? primaryEmail; - @override - final String? locale; - @override - final String? effectiveLocale; - @override - final UserPermission? permissions; - @override - final String? loginId; - - factory _$User([void Function(UserBuilder)? updates]) => - (new UserBuilder()..update(updates))._build(); - - _$User._( - {required this.id, - required this.name, - this.sortableName, - this.shortName, - this.pronouns, - this.avatarUrl, - this.primaryEmail, - this.locale, - this.effectiveLocale, - this.permissions, - this.loginId}) - : super._() { - BuiltValueNullFieldError.checkNotNull(id, r'User', 'id'); - BuiltValueNullFieldError.checkNotNull(name, r'User', 'name'); - } - - @override - User rebuild(void Function(UserBuilder) updates) => - (toBuilder()..update(updates)).build(); - - @override - UserBuilder toBuilder() => new UserBuilder()..replace(this); - - @override - bool operator ==(Object other) { - if (identical(other, this)) return true; - return other is User && - id == other.id && - name == other.name && - sortableName == other.sortableName && - shortName == other.shortName && - pronouns == other.pronouns && - avatarUrl == other.avatarUrl && - primaryEmail == other.primaryEmail && - locale == other.locale && - effectiveLocale == other.effectiveLocale && - permissions == other.permissions && - loginId == other.loginId; - } - - @override - int get hashCode { - var _$hash = 0; - _$hash = $jc(_$hash, id.hashCode); - _$hash = $jc(_$hash, name.hashCode); - _$hash = $jc(_$hash, sortableName.hashCode); - _$hash = $jc(_$hash, shortName.hashCode); - _$hash = $jc(_$hash, pronouns.hashCode); - _$hash = $jc(_$hash, avatarUrl.hashCode); - _$hash = $jc(_$hash, primaryEmail.hashCode); - _$hash = $jc(_$hash, locale.hashCode); - _$hash = $jc(_$hash, effectiveLocale.hashCode); - _$hash = $jc(_$hash, permissions.hashCode); - _$hash = $jc(_$hash, loginId.hashCode); - _$hash = $jf(_$hash); - return _$hash; - } - - @override - String toString() { - return (newBuiltValueToStringHelper(r'User') - ..add('id', id) - ..add('name', name) - ..add('sortableName', sortableName) - ..add('shortName', shortName) - ..add('pronouns', pronouns) - ..add('avatarUrl', avatarUrl) - ..add('primaryEmail', primaryEmail) - ..add('locale', locale) - ..add('effectiveLocale', effectiveLocale) - ..add('permissions', permissions) - ..add('loginId', loginId)) - .toString(); - } -} - -class UserBuilder implements Builder { - _$User? _$v; - - String? _id; - String? get id => _$this._id; - set id(String? id) => _$this._id = id; - - String? _name; - String? get name => _$this._name; - set name(String? name) => _$this._name = name; - - String? _sortableName; - String? get sortableName => _$this._sortableName; - set sortableName(String? sortableName) => _$this._sortableName = sortableName; - - String? _shortName; - String? get shortName => _$this._shortName; - set shortName(String? shortName) => _$this._shortName = shortName; - - String? _pronouns; - String? get pronouns => _$this._pronouns; - set pronouns(String? pronouns) => _$this._pronouns = pronouns; - - String? _avatarUrl; - String? get avatarUrl => _$this._avatarUrl; - set avatarUrl(String? avatarUrl) => _$this._avatarUrl = avatarUrl; - - String? _primaryEmail; - String? get primaryEmail => _$this._primaryEmail; - set primaryEmail(String? primaryEmail) => _$this._primaryEmail = primaryEmail; - - String? _locale; - String? get locale => _$this._locale; - set locale(String? locale) => _$this._locale = locale; - - String? _effectiveLocale; - String? get effectiveLocale => _$this._effectiveLocale; - set effectiveLocale(String? effectiveLocale) => - _$this._effectiveLocale = effectiveLocale; - - UserPermissionBuilder? _permissions; - UserPermissionBuilder get permissions => - _$this._permissions ??= new UserPermissionBuilder(); - set permissions(UserPermissionBuilder? permissions) => - _$this._permissions = permissions; - - String? _loginId; - String? get loginId => _$this._loginId; - set loginId(String? loginId) => _$this._loginId = loginId; - - UserBuilder() { - User._initializeBuilder(this); - } - - UserBuilder get _$this { - final $v = _$v; - if ($v != null) { - _id = $v.id; - _name = $v.name; - _sortableName = $v.sortableName; - _shortName = $v.shortName; - _pronouns = $v.pronouns; - _avatarUrl = $v.avatarUrl; - _primaryEmail = $v.primaryEmail; - _locale = $v.locale; - _effectiveLocale = $v.effectiveLocale; - _permissions = $v.permissions?.toBuilder(); - _loginId = $v.loginId; - _$v = null; - } - return this; - } - - @override - void replace(User other) { - ArgumentError.checkNotNull(other, 'other'); - _$v = other as _$User; - } - - @override - void update(void Function(UserBuilder)? updates) { - if (updates != null) updates(this); - } - - @override - User build() => _build(); - - _$User _build() { - _$User _$result; - try { - _$result = _$v ?? - new _$User._( - id: BuiltValueNullFieldError.checkNotNull(id, r'User', 'id'), - name: - BuiltValueNullFieldError.checkNotNull(name, r'User', 'name'), - sortableName: sortableName, - shortName: shortName, - pronouns: pronouns, - avatarUrl: avatarUrl, - primaryEmail: primaryEmail, - locale: locale, - effectiveLocale: effectiveLocale, - permissions: _permissions?.build(), - loginId: loginId); - } catch (_) { - late String _$failedField; - try { - _$failedField = 'permissions'; - _permissions?.build(); - } catch (e) { - throw new BuiltValueNestedFieldError( - r'User', _$failedField, e.toString()); - } - rethrow; - } - replace(_$result); - return _$result; - } -} - -class _$UserPermission extends UserPermission { - @override - final bool become_user; - @override - final bool canUpdateName; - @override - final bool canUpdateAvatar; - @override - final bool limitParentAppWebAccess; - - factory _$UserPermission([void Function(UserPermissionBuilder)? updates]) => - (new UserPermissionBuilder()..update(updates))._build(); - - _$UserPermission._( - {required this.become_user, - required this.canUpdateName, - required this.canUpdateAvatar, - required this.limitParentAppWebAccess}) - : super._() { - BuiltValueNullFieldError.checkNotNull( - become_user, r'UserPermission', 'become_user'); - BuiltValueNullFieldError.checkNotNull( - canUpdateName, r'UserPermission', 'canUpdateName'); - BuiltValueNullFieldError.checkNotNull( - canUpdateAvatar, r'UserPermission', 'canUpdateAvatar'); - BuiltValueNullFieldError.checkNotNull( - limitParentAppWebAccess, r'UserPermission', 'limitParentAppWebAccess'); - } - - @override - UserPermission rebuild(void Function(UserPermissionBuilder) updates) => - (toBuilder()..update(updates)).build(); - - @override - UserPermissionBuilder toBuilder() => - new UserPermissionBuilder()..replace(this); - - @override - bool operator ==(Object other) { - if (identical(other, this)) return true; - return other is UserPermission && - become_user == other.become_user && - canUpdateName == other.canUpdateName && - canUpdateAvatar == other.canUpdateAvatar && - limitParentAppWebAccess == other.limitParentAppWebAccess; - } - - @override - int get hashCode { - var _$hash = 0; - _$hash = $jc(_$hash, become_user.hashCode); - _$hash = $jc(_$hash, canUpdateName.hashCode); - _$hash = $jc(_$hash, canUpdateAvatar.hashCode); - _$hash = $jc(_$hash, limitParentAppWebAccess.hashCode); - _$hash = $jf(_$hash); - return _$hash; - } - - @override - String toString() { - return (newBuiltValueToStringHelper(r'UserPermission') - ..add('become_user', become_user) - ..add('canUpdateName', canUpdateName) - ..add('canUpdateAvatar', canUpdateAvatar) - ..add('limitParentAppWebAccess', limitParentAppWebAccess)) - .toString(); - } -} - -class UserPermissionBuilder - implements Builder { - _$UserPermission? _$v; - - bool? _become_user; - bool? get become_user => _$this._become_user; - set become_user(bool? become_user) => _$this._become_user = become_user; - - bool? _canUpdateName; - bool? get canUpdateName => _$this._canUpdateName; - set canUpdateName(bool? canUpdateName) => - _$this._canUpdateName = canUpdateName; - - bool? _canUpdateAvatar; - bool? get canUpdateAvatar => _$this._canUpdateAvatar; - set canUpdateAvatar(bool? canUpdateAvatar) => - _$this._canUpdateAvatar = canUpdateAvatar; - - bool? _limitParentAppWebAccess; - bool? get limitParentAppWebAccess => _$this._limitParentAppWebAccess; - set limitParentAppWebAccess(bool? limitParentAppWebAccess) => - _$this._limitParentAppWebAccess = limitParentAppWebAccess; - - UserPermissionBuilder() { - UserPermission._initializeBuilder(this); - } - - UserPermissionBuilder get _$this { - final $v = _$v; - if ($v != null) { - _become_user = $v.become_user; - _canUpdateName = $v.canUpdateName; - _canUpdateAvatar = $v.canUpdateAvatar; - _limitParentAppWebAccess = $v.limitParentAppWebAccess; - _$v = null; - } - return this; - } - - @override - void replace(UserPermission other) { - ArgumentError.checkNotNull(other, 'other'); - _$v = other as _$UserPermission; - } - - @override - void update(void Function(UserPermissionBuilder)? updates) { - if (updates != null) updates(this); - } - - @override - UserPermission build() => _build(); - - _$UserPermission _build() { - final _$result = _$v ?? - new _$UserPermission._( - become_user: BuiltValueNullFieldError.checkNotNull( - become_user, r'UserPermission', 'become_user'), - canUpdateName: BuiltValueNullFieldError.checkNotNull( - canUpdateName, r'UserPermission', 'canUpdateName'), - canUpdateAvatar: BuiltValueNullFieldError.checkNotNull( - canUpdateAvatar, r'UserPermission', 'canUpdateAvatar'), - limitParentAppWebAccess: BuiltValueNullFieldError.checkNotNull( - limitParentAppWebAccess, - r'UserPermission', - 'limitParentAppWebAccess')); - replace(_$result); - return _$result; - } -} - -// ignore_for_file: deprecated_member_use_from_same_package,type=lint diff --git a/apps/flutter_parent/lib/models/user_color.dart b/apps/flutter_parent/lib/models/user_color.dart deleted file mode 100644 index 0ae4a75b3b..0000000000 --- a/apps/flutter_parent/lib/models/user_color.dart +++ /dev/null @@ -1,43 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'dart:ui'; - -import 'package:built_collection/built_collection.dart'; -import 'package:built_value/built_value.dart'; - -part 'user_color.g.dart'; - -/// To have this built_value be generated, run this command from the project root: -/// flutter pub run build_runner build --delete-conflicting-outputs -abstract class UserColor implements Built { - int? get id; - - String get userDomain; - - String get userId; - - String get canvasContext; - - Color get color; - - UserColor._(); - factory UserColor([void Function(UserColorBuilder) updates]) = _$UserColor; - - static void _initializeBuilder(UserColorBuilder b) => b - ..userDomain = '' - ..userId = '' - ..canvasContext = '' - ..color = Color(0); -} diff --git a/apps/flutter_parent/lib/models/user_color.g.dart b/apps/flutter_parent/lib/models/user_color.g.dart deleted file mode 100644 index 92d496e17f..0000000000 --- a/apps/flutter_parent/lib/models/user_color.g.dart +++ /dev/null @@ -1,153 +0,0 @@ -// GENERATED CODE - DO NOT MODIFY BY HAND - -part of 'user_color.dart'; - -// ************************************************************************** -// BuiltValueGenerator -// ************************************************************************** - -class _$UserColor extends UserColor { - @override - final int? id; - @override - final String userDomain; - @override - final String userId; - @override - final String canvasContext; - @override - final Color color; - - factory _$UserColor([void Function(UserColorBuilder)? updates]) => - (new UserColorBuilder()..update(updates))._build(); - - _$UserColor._( - {this.id, - required this.userDomain, - required this.userId, - required this.canvasContext, - required this.color}) - : super._() { - BuiltValueNullFieldError.checkNotNull( - userDomain, r'UserColor', 'userDomain'); - BuiltValueNullFieldError.checkNotNull(userId, r'UserColor', 'userId'); - BuiltValueNullFieldError.checkNotNull( - canvasContext, r'UserColor', 'canvasContext'); - BuiltValueNullFieldError.checkNotNull(color, r'UserColor', 'color'); - } - - @override - UserColor rebuild(void Function(UserColorBuilder) updates) => - (toBuilder()..update(updates)).build(); - - @override - UserColorBuilder toBuilder() => new UserColorBuilder()..replace(this); - - @override - bool operator ==(Object other) { - if (identical(other, this)) return true; - return other is UserColor && - id == other.id && - userDomain == other.userDomain && - userId == other.userId && - canvasContext == other.canvasContext && - color == other.color; - } - - @override - int get hashCode { - var _$hash = 0; - _$hash = $jc(_$hash, id.hashCode); - _$hash = $jc(_$hash, userDomain.hashCode); - _$hash = $jc(_$hash, userId.hashCode); - _$hash = $jc(_$hash, canvasContext.hashCode); - _$hash = $jc(_$hash, color.hashCode); - _$hash = $jf(_$hash); - return _$hash; - } - - @override - String toString() { - return (newBuiltValueToStringHelper(r'UserColor') - ..add('id', id) - ..add('userDomain', userDomain) - ..add('userId', userId) - ..add('canvasContext', canvasContext) - ..add('color', color)) - .toString(); - } -} - -class UserColorBuilder implements Builder { - _$UserColor? _$v; - - int? _id; - int? get id => _$this._id; - set id(int? id) => _$this._id = id; - - String? _userDomain; - String? get userDomain => _$this._userDomain; - set userDomain(String? userDomain) => _$this._userDomain = userDomain; - - String? _userId; - String? get userId => _$this._userId; - set userId(String? userId) => _$this._userId = userId; - - String? _canvasContext; - String? get canvasContext => _$this._canvasContext; - set canvasContext(String? canvasContext) => - _$this._canvasContext = canvasContext; - - Color? _color; - Color? get color => _$this._color; - set color(Color? color) => _$this._color = color; - - UserColorBuilder() { - UserColor._initializeBuilder(this); - } - - UserColorBuilder get _$this { - final $v = _$v; - if ($v != null) { - _id = $v.id; - _userDomain = $v.userDomain; - _userId = $v.userId; - _canvasContext = $v.canvasContext; - _color = $v.color; - _$v = null; - } - return this; - } - - @override - void replace(UserColor other) { - ArgumentError.checkNotNull(other, 'other'); - _$v = other as _$UserColor; - } - - @override - void update(void Function(UserColorBuilder)? updates) { - if (updates != null) updates(this); - } - - @override - UserColor build() => _build(); - - _$UserColor _build() { - final _$result = _$v ?? - new _$UserColor._( - id: id, - userDomain: BuiltValueNullFieldError.checkNotNull( - userDomain, r'UserColor', 'userDomain'), - userId: BuiltValueNullFieldError.checkNotNull( - userId, r'UserColor', 'userId'), - canvasContext: BuiltValueNullFieldError.checkNotNull( - canvasContext, r'UserColor', 'canvasContext'), - color: BuiltValueNullFieldError.checkNotNull( - color, r'UserColor', 'color')); - replace(_$result); - return _$result; - } -} - -// ignore_for_file: deprecated_member_use_from_same_package,type=lint diff --git a/apps/flutter_parent/lib/models/user_colors.dart b/apps/flutter_parent/lib/models/user_colors.dart deleted file mode 100644 index a489f71e3c..0000000000 --- a/apps/flutter_parent/lib/models/user_colors.dart +++ /dev/null @@ -1,33 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:built_collection/built_collection.dart'; -import 'package:built_value/built_value.dart'; -import 'package:built_value/serializer.dart'; - -part 'user_colors.g.dart'; - -/// To have this built_value be generated, run this command from the project root: -/// flutter pub run build_runner build --delete-conflicting-outputs -abstract class UserColors implements Built { - static Serializer get serializer => _$userColorsSerializer; - - @BuiltValueField(wireName: 'custom_colors') - BuiltMap get customColors; - - UserColors._(); - factory UserColors([void Function(UserColorsBuilder) updates]) = _$UserColors; - - static void _initializeBuilder(UserColorsBuilder b) => b..customColors = MapBuilder(); -} diff --git a/apps/flutter_parent/lib/models/user_colors.g.dart b/apps/flutter_parent/lib/models/user_colors.g.dart deleted file mode 100644 index 289883dcfc..0000000000 --- a/apps/flutter_parent/lib/models/user_colors.g.dart +++ /dev/null @@ -1,150 +0,0 @@ -// GENERATED CODE - DO NOT MODIFY BY HAND - -part of 'user_colors.dart'; - -// ************************************************************************** -// BuiltValueGenerator -// ************************************************************************** - -Serializer _$userColorsSerializer = new _$UserColorsSerializer(); - -class _$UserColorsSerializer implements StructuredSerializer { - @override - final Iterable types = const [UserColors, _$UserColors]; - @override - final String wireName = 'UserColors'; - - @override - Iterable serialize(Serializers serializers, UserColors object, - {FullType specifiedType = FullType.unspecified}) { - final result = [ - 'custom_colors', - serializers.serialize(object.customColors, - specifiedType: const FullType(BuiltMap, - const [const FullType(String), const FullType(String)])), - ]; - - return result; - } - - @override - UserColors deserialize(Serializers serializers, Iterable serialized, - {FullType specifiedType = FullType.unspecified}) { - final result = new UserColorsBuilder(); - - final iterator = serialized.iterator; - while (iterator.moveNext()) { - final key = iterator.current! as String; - iterator.moveNext(); - final Object? value = iterator.current; - switch (key) { - case 'custom_colors': - result.customColors.replace(serializers.deserialize(value, - specifiedType: const FullType(BuiltMap, - const [const FullType(String), const FullType(String)]))!); - break; - } - } - - return result.build(); - } -} - -class _$UserColors extends UserColors { - @override - final BuiltMap customColors; - - factory _$UserColors([void Function(UserColorsBuilder)? updates]) => - (new UserColorsBuilder()..update(updates))._build(); - - _$UserColors._({required this.customColors}) : super._() { - BuiltValueNullFieldError.checkNotNull( - customColors, r'UserColors', 'customColors'); - } - - @override - UserColors rebuild(void Function(UserColorsBuilder) updates) => - (toBuilder()..update(updates)).build(); - - @override - UserColorsBuilder toBuilder() => new UserColorsBuilder()..replace(this); - - @override - bool operator ==(Object other) { - if (identical(other, this)) return true; - return other is UserColors && customColors == other.customColors; - } - - @override - int get hashCode { - var _$hash = 0; - _$hash = $jc(_$hash, customColors.hashCode); - _$hash = $jf(_$hash); - return _$hash; - } - - @override - String toString() { - return (newBuiltValueToStringHelper(r'UserColors') - ..add('customColors', customColors)) - .toString(); - } -} - -class UserColorsBuilder implements Builder { - _$UserColors? _$v; - - MapBuilder? _customColors; - MapBuilder get customColors => - _$this._customColors ??= new MapBuilder(); - set customColors(MapBuilder? customColors) => - _$this._customColors = customColors; - - UserColorsBuilder() { - UserColors._initializeBuilder(this); - } - - UserColorsBuilder get _$this { - final $v = _$v; - if ($v != null) { - _customColors = $v.customColors.toBuilder(); - _$v = null; - } - return this; - } - - @override - void replace(UserColors other) { - ArgumentError.checkNotNull(other, 'other'); - _$v = other as _$UserColors; - } - - @override - void update(void Function(UserColorsBuilder)? updates) { - if (updates != null) updates(this); - } - - @override - UserColors build() => _build(); - - _$UserColors _build() { - _$UserColors _$result; - try { - _$result = _$v ?? new _$UserColors._(customColors: customColors.build()); - } catch (_) { - late String _$failedField; - try { - _$failedField = 'customColors'; - customColors.build(); - } catch (e) { - throw new BuiltValueNestedFieldError( - r'UserColors', _$failedField, e.toString()); - } - rethrow; - } - replace(_$result); - return _$result; - } -} - -// ignore_for_file: deprecated_member_use_from_same_package,type=lint diff --git a/apps/flutter_parent/lib/network/api/accounts_api.dart b/apps/flutter_parent/lib/network/api/accounts_api.dart deleted file mode 100644 index ec93faca64..0000000000 --- a/apps/flutter_parent/lib/network/api/accounts_api.dart +++ /dev/null @@ -1,81 +0,0 @@ -// Copyright (C) 2019 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'dart:convert'; - -import 'package:dio/dio.dart'; -import 'package:flutter_parent/models/account_creation_models/create_account_post_body.dart'; -import 'package:flutter_parent/models/account_creation_models/post_pairing_code.dart'; -import 'package:flutter_parent/models/account_creation_models/post_pseudonym.dart'; -import 'package:flutter_parent/models/account_creation_models/post_user.dart'; -import 'package:flutter_parent/models/account_permissions.dart'; -import 'package:flutter_parent/models/school_domain.dart'; -import 'package:flutter_parent/models/serializers.dart'; -import 'package:flutter_parent/models/terms_of_service.dart'; -import 'package:flutter_parent/network/utils/dio_config.dart'; -import 'package:flutter_parent/network/utils/fetch.dart'; - -class AccountsApi { - Future?> searchDomains(String query) async { - var dio = DioConfig.core(cacheMaxAge: Duration(minutes: 5)).dio; - return fetchList(dio.get('accounts/search', queryParameters: {'search_term': query})); - } - - Future getTermsOfService() async { - var dio = canvasDio(); - return fetch(dio.get('accounts/self/terms_of_service')); - } - - Future getTermsOfServiceForAccount(String accountId, String domain) async { - var dio = DioConfig(baseUrl: 'https://$domain/api/v1/', forceRefresh: true).dio; - return fetch(dio.get('accounts/$accountId/terms_of_service')); - } - - Future getAccountPermissions() async { - var dio = canvasDio(); - return fetch(dio.get('accounts/self/permissions')); - } - - /** - * Currently not used. - * - * Awaiting api changes to make this call w/o authentication prior to user account creation - */ - Future getPairingAllowed() async { - var dio = canvasDio(); - var response = await dio.get('accounts/self/authentication_providers/canvas'); - var selfRegistration = response.data['self_registration']; - return selfRegistration == 'observer' || selfRegistration == 'all'; - } - - Future createNewAccount( - String accountId, String pairingCode, String fullname, String email, String password, String domain) async { - var dio = DioConfig(baseUrl: 'https://$domain/api/v1/', forceRefresh: true).dio; - - var pairingCodeBody = PostPairingCode((b) => b..code = pairingCode); - var userBody = PostUser((b) => b - ..name = fullname - ..initialEnrollmentType = 'observer' - ..termsOfUse = true); - var pseudonymBody = PostPseudonym((b) => b - ..uniqueId = email - ..password = password); - var postBody = CreateAccountPostBody((b) => b - ..pairingCode = pairingCodeBody.toBuilder() - ..user = userBody.toBuilder() - ..pseudonym = pseudonymBody.toBuilder()); - - return dio.post('accounts/$accountId/users', data: json.encode(serialize(postBody))); - } -} diff --git a/apps/flutter_parent/lib/network/api/alert_api.dart b/apps/flutter_parent/lib/network/api/alert_api.dart deleted file mode 100644 index 9f9355da48..0000000000 --- a/apps/flutter_parent/lib/network/api/alert_api.dart +++ /dev/null @@ -1,64 +0,0 @@ -// Copyright (C) 2019 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:flutter_parent/models/alert.dart'; -import 'package:flutter_parent/models/alert_threshold.dart'; -import 'package:flutter_parent/models/unread_count.dart'; -import 'package:flutter_parent/network/utils/dio_config.dart'; -import 'package:flutter_parent/network/utils/fetch.dart'; - -const String _alertThresholdsEndpoint = 'users/self/observer_alert_thresholds'; - -class AlertsApi { - /// Alerts were depaginated in the original parent app, then sorted by date. Depaginating here to follow suite. - Future?> getAlertsDepaginated(String studentId, bool forceRefresh) async { - var dio = canvasDio(forceRefresh: forceRefresh); - return fetchList(dio.get('users/self/observer_alerts/$studentId'), depaginateWith: dio); - } - - Future updateAlertWorkflow(String studentId, String alertId, String workflowState) async { - final config = DioConfig.canvas(); - // Read/dismissed data has changed and makes the cache stale - config.clearCache(path: 'users/self/observer_alerts/$studentId'); - var dio = config.dio; - return fetch(dio.put('users/self/observer_alerts/$alertId/$workflowState')); - } - - // Always force a refresh when retrieving this data - Future getUnreadCount(String studentId) async { - var dio = canvasDio(forceRefresh: true); - return fetch(dio.get('users/self/observer_alerts/unread_count', queryParameters: {'student_id': studentId})); - } - - Future?> getAlertThresholds(String studentId, bool forceRefresh) async { - var dio = canvasDio(forceRefresh: forceRefresh); - return fetchList(dio.get(_alertThresholdsEndpoint, queryParameters: {'student_id': studentId})); - } - - Future deleteAlert(AlertThreshold threshold) async { - var dio = canvasDio(); - return fetch(dio.delete('$_alertThresholdsEndpoint/${threshold.id}')); - } - - Future createThreshold(AlertType type, String studentId, {String? value}) async { - var dio = canvasDio(); - return fetch(dio.post(_alertThresholdsEndpoint, data: { - 'observer_alert_threshold': { - 'alert_type': type.toApiString(), - 'user_id': studentId, - if (value != null) 'threshold': value, - } - })); - } -} diff --git a/apps/flutter_parent/lib/network/api/announcement_api.dart b/apps/flutter_parent/lib/network/api/announcement_api.dart deleted file mode 100644 index 3fcab50f4f..0000000000 --- a/apps/flutter_parent/lib/network/api/announcement_api.dart +++ /dev/null @@ -1,30 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:flutter_parent/models/account_notification.dart'; -import 'package:flutter_parent/models/announcement.dart'; -import 'package:flutter_parent/network/utils/dio_config.dart'; -import 'package:flutter_parent/network/utils/fetch.dart'; - -class AnnouncementApi { - Future getCourseAnnouncement(String courseId, String announcementId, bool forceRefresh) async { - var dio = canvasDio(forceRefresh: forceRefresh); - return fetch(dio.get('courses/$courseId/discussion_topics/$announcementId')); - } - - Future getAccountNotification(String accountNotificationId, bool forceRefresh) async { - var dio = canvasDio(forceRefresh: forceRefresh); - return fetch(dio.get('accounts/self/users/self/account_notifications/$accountNotificationId')); - } -} diff --git a/apps/flutter_parent/lib/network/api/assignment_api.dart b/apps/flutter_parent/lib/network/api/assignment_api.dart deleted file mode 100644 index aaa920bf40..0000000000 --- a/apps/flutter_parent/lib/network/api/assignment_api.dart +++ /dev/null @@ -1,73 +0,0 @@ -// Copyright (C) 2019 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:flutter_parent/models/assignment.dart'; -import 'package:flutter_parent/models/assignment_group.dart'; -import 'package:flutter_parent/network/utils/dio_config.dart'; -import 'package:flutter_parent/network/utils/fetch.dart'; -import 'package:flutter_parent/network/utils/paged_list.dart'; - -class AssignmentApi { - Future?> getAssignmentsWithSubmissionsDepaginated(int courseId, int studentId) async { - var dio = canvasDio(); - var params = { - 'include[]': ['all_dates', 'overrides', 'rubric_assessment', 'submission'], - 'order_by': 'due_at', - 'override_assignment_dates': 'true', - 'needs_grading_count_by_section': 'true', - }; - return fetchList(dio.get('courses/$courseId/assignments', queryParameters: params), depaginateWith: dio); - } - - Future?> getAssignmentGroupsWithSubmissionsDepaginated( - String courseId, String? studentId, String? gradingPeriodId, - {bool forceRefresh = false}) async { - var dio = canvasDio(forceRefresh: forceRefresh); - var params = { - 'include[]': [ - 'assignments', - 'discussion_topic', - 'submission', - 'all_dates', - 'overrides', - 'observed_users', - ], - 'override_assignment_dates': 'true', - if (gradingPeriodId?.isNotEmpty == true) 'grading_period_id': gradingPeriodId, - }; - return fetchList(dio.get('courses/$courseId/assignment_groups', queryParameters: params), depaginateWith: dio); - } - - Future?> getAssignmentsWithSubmissionsPaged(String courseId, String studentId) async { - var params = { - 'include[]': ['all_dates', 'overrides', 'rubric_assessment', 'submission'], - 'order_by': 'due_at', - 'override_assignment_dates': 'true', - 'needs_grading_count_by_section': 'true', - }; - var dio = canvasDio(); - return fetchFirstPage(dio.get('courses/$courseId/assignments', queryParameters: params)); - } - - Future getAssignment(String courseId, String assignmentId, {bool forceRefresh = false}) async { - var params = { - 'include[]': ['overrides', 'rubric_assessment', 'submission', 'observed_users'], - 'all_dates': 'true', - 'override_assignment_dates': 'true', - 'needs_grading_count_by_section': 'true', - }; - var dio = canvasDio(forceRefresh: forceRefresh); - return fetch(dio.get('courses/$courseId/assignments/$assignmentId', queryParameters: params)); - } -} diff --git a/apps/flutter_parent/lib/network/api/auth_api.dart b/apps/flutter_parent/lib/network/api/auth_api.dart deleted file mode 100644 index dbfbc62faf..0000000000 --- a/apps/flutter_parent/lib/network/api/auth_api.dart +++ /dev/null @@ -1,76 +0,0 @@ -// Copyright (C) 2019 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:dio/dio.dart'; -import 'package:flutter_parent/models/canvas_token.dart'; -import 'package:flutter_parent/models/mobile_verify_result.dart'; -import 'package:flutter_parent/network/utils/api_prefs.dart'; -import 'package:flutter_parent/network/utils/dio_config.dart'; -import 'package:flutter_parent/network/utils/fetch.dart'; -import 'package:flutter_parent/utils/remote_config_utils.dart'; - -class AuthApi { - Future refreshToken() async { - var dio = DioConfig.canvas(includeApiPath: false).dio; - var params = { - 'client_id': ApiPrefs.getClientId(), - 'client_secret': ApiPrefs.getClientSecret(), - 'redirect_uri': 'urn:ietf:wg:oauth:2.0:oob', - 'grant_type': 'refresh_token', - 'refresh_token': ApiPrefs.getRefreshToken(), - }; - return fetch(dio.post('login/oauth2/token', data: params)); - } - - Future getTokens(MobileVerifyResult? verifyResult, String requestCode) async { - var dio = DioConfig().dio; - var params = { - 'client_id': verifyResult?.clientId, - 'client_secret': verifyResult?.clientSecret, - 'code': requestCode, - 'redirect_uri': 'urn:ietf:wg:oauth:2.0:oob', - }; - return fetch(dio.post('${verifyResult?.baseUrl}/login/oauth2/token', data: params)); - } - - Future mobileVerify(String domain, {bool forceBetaDomain = false}) async { - // We only want to switch over to the beta mobile verify domain if either: - // (1) we are forcing the beta domain (typically in UI tests) OR - // (2) the remote firebase config setting for MOBILE_VERIFY_BETA_ENABLED is true - // AND we are trying to use a beta domain - var mobileVerifyBetaEnabled = (forceBetaDomain || - RemoteConfigUtils.getStringValue(RemoteConfigParams.MOBILE_VERIFY_BETA_ENABLED)?.toLowerCase() == 'true') && - domain.contains('.beta.'); - - Dio dio = DioConfig.core(useBetaDomain: mobileVerifyBetaEnabled).dio; - - String userAgent = ApiPrefs.getUserAgent(); - return fetch( - dio.get( - 'mobile_verify.json', - queryParameters: { - 'domain': domain, - 'user_agent': userAgent, - }, - options: Options(headers: {'User-Agent': userAgent}), - ), - ); - } - - Future deleteToken(String domain, String token) async { - Dio dio = DioConfig().dio; - var params = {'access_token': token}; - await dio.delete('$domain/login/oauth2/token', data: params); - } -} diff --git a/apps/flutter_parent/lib/network/api/calendar_events_api.dart b/apps/flutter_parent/lib/network/api/calendar_events_api.dart deleted file mode 100644 index e9e70143a5..0000000000 --- a/apps/flutter_parent/lib/network/api/calendar_events_api.dart +++ /dev/null @@ -1,70 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:flutter_parent/models/schedule_item.dart'; -import 'package:flutter_parent/network/utils/dio_config.dart'; -import 'package:flutter_parent/network/utils/fetch.dart'; - -class CalendarEventsApi { - Future?> getAllCalendarEvents({ - bool allEvents = false, - String type = ScheduleItem.apiTypeCalendar, - String? startDate = null, - String? endDate = null, - List contexts = const [], - bool forceRefresh = false, - }) async { - var dio = canvasDio(forceRefresh: forceRefresh, pageSize: PageSize.canvasMax); - var params = { - 'all_events': allEvents, - 'type': type, - 'start_date': startDate, - 'end_date': endDate, - 'context_codes[]': contexts, - }; - return fetchList(dio.get('calendar_events', queryParameters: params), depaginateWith: dio); - } - - Future getEvent(String? eventId, bool forceRefresh) async { - var dio = canvasDio(forceRefresh: forceRefresh); - return fetch(dio.get('calendar_events/$eventId')); - } - - Future?> getUserCalendarItems( - String userId, - DateTime startDay, - DateTime endDay, - String type, { - Set contexts = const {}, - bool forceRefresh = false, - }) async { - var dio = canvasDio(forceRefresh: forceRefresh, pageSize: PageSize.canvasMax); - - return fetchList( - dio.get('users/$userId/calendar_events', - queryParameters: getQueryParams(startDay, endDay, type, contexts: contexts)), - depaginateWith: dio); - } - - Map getQueryParams(DateTime startDay, DateTime endDay, String type, - {Set contexts = const {}, bool includeSubmissions = false}) { - return { - 'start_date': startDay.toUtc().toIso8601String(), - 'end_date': endDay.toUtc().toIso8601String(), - 'type': type, - 'context_codes[]': contexts.toList()..sort(), // Sort for cache consistency - 'include[]': ['submission'], - }; - } -} diff --git a/apps/flutter_parent/lib/network/api/course_api.dart b/apps/flutter_parent/lib/network/api/course_api.dart deleted file mode 100644 index 48368e0b89..0000000000 --- a/apps/flutter_parent/lib/network/api/course_api.dart +++ /dev/null @@ -1,94 +0,0 @@ -// Copyright (C) 2019 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:flutter_parent/models/course.dart'; -import 'package:flutter_parent/models/course_permissions.dart'; -import 'package:flutter_parent/models/course_settings.dart'; -import 'package:flutter_parent/models/course_tab.dart'; -import 'package:flutter_parent/models/grading_period_response.dart'; -import 'package:flutter_parent/network/utils/dio_config.dart'; -import 'package:flutter_parent/network/utils/fetch.dart'; - -class CourseApi { - Future?> getObserveeCourses({bool forceRefresh = false}) async { - final dio = canvasDio(forceRefresh: forceRefresh, pageSize: PageSize.canvasMax); - final params = { - 'include[]': [ - 'term', - 'syllabus_body', - 'total_scores', - 'license', - 'is_public', - 'needs_grading_count', - 'permissions', - 'favorites', - 'current_grading_period_scores', - 'course_image', - 'sections', - 'observed_users', - 'settings', - 'grading_scheme' - ], - 'enrollment_state': 'active', - }; - return fetchList(dio.get('courses', queryParameters: params), depaginateWith: dio); - } - - Future getCourse(String courseId, {bool forceRefresh = false}) async { - final params = { - 'include[]': [ - 'syllabus_body', - 'term', - 'permissions', - 'license', - 'is_public', - 'needs_grading_count', - 'total_scores', - 'current_grading_period_scores', - 'course_image', - 'observed_users', - 'settings', - 'grading_scheme' - ] - }; - var dio = canvasDio(forceRefresh: forceRefresh); - return fetch(dio.get('courses/${courseId}', queryParameters: params)); - } - - // TODO: Set up pagination when API is fixed (no header link) and remove per_page query parameter - Future getGradingPeriods(String courseId, {bool forceRefresh = false}) async { - var dio = canvasDio(forceRefresh: forceRefresh); - return fetch(dio.get('courses/$courseId/grading_periods?per_page=100')); - } - - Future?> getCourseTabs(String courseId, {bool forceRefresh = false}) async { - var dio = canvasDio(forceRefresh: forceRefresh); - return fetchList(dio.get('courses/$courseId/tabs')); - } - - Future getCourseSettings(String courseId, {bool forceRefresh = false}) async { - var dio = canvasDio(forceRefresh: forceRefresh); - return fetch(dio.get('courses/$courseId/settings')); - } - - Future getCoursePermissions(String courseId, {bool forceRefresh = false}) async { - var dio = canvasDio(forceRefresh: forceRefresh); - return fetch(dio.get('courses/$courseId/permissions')); - } - - Future?> getEnabledCourseFeatures(String courseId, {bool forceRefresh = false}) async { - var dio = canvasDio(forceRefresh: forceRefresh); - return fetchList(dio.get('courses/$courseId/features/enabled')); - } -} diff --git a/apps/flutter_parent/lib/network/api/enrollments_api.dart b/apps/flutter_parent/lib/network/api/enrollments_api.dart deleted file mode 100644 index 230385bb58..0000000000 --- a/apps/flutter_parent/lib/network/api/enrollments_api.dart +++ /dev/null @@ -1,95 +0,0 @@ -// Copyright (C) 2019 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:dio/dio.dart'; -import 'package:flutter_parent/models/enrollment.dart'; -import 'package:flutter_parent/network/utils/api_prefs.dart'; -import 'package:flutter_parent/network/utils/dio_config.dart'; -import 'package:flutter_parent/network/utils/fetch.dart'; - -class EnrollmentsApi { - Future?> getObserveeEnrollments({bool forceRefresh = false}) async { - var dio = canvasDio(pageSize: PageSize.canvasMax, forceRefresh: forceRefresh); - var params = { - 'include[]': ['observed_users', 'avatar_url'], - 'state[]': ['creation_pending', 'invited', 'active', 'completed', 'current_and_future'] - }; - return fetchList(dio.get('users/self/enrollments', queryParameters: params), depaginateWith: dio); - } - - Future?> getSelfEnrollments({bool forceRefresh = false}) async { - var dio = canvasDio(pageSize: PageSize.canvasMax, forceRefresh: forceRefresh); - var params = { - 'state[]': ['creation_pending', 'invited', 'active', 'completed'] - }; - return fetchList(dio.get('users/self/enrollments', queryParameters: params), depaginateWith: dio); - } - - Future?> getEnrollmentsByGradingPeriod(String courseId, String? studentId, String? gradingPeriodId, - {bool forceRefresh = false}) async { - final dio = canvasDio(forceRefresh: forceRefresh); - final params = { - 'state[]': ['active', 'completed'], // current_and_concluded state not supported for observers - 'user_id': studentId, - if (gradingPeriodId?.isNotEmpty == true) - 'grading_period_id': gradingPeriodId, - }; - return fetchList( - dio.get( - 'courses/$courseId/enrollments', - queryParameters: params, - options: Options(validateStatus: (status) => status != null && status < 500)), // Workaround, because this request fails for some legacy users, but we can't catch the error. - depaginateWith: dio, - ); - } - - /// Attempts to pair a student and observer using the given pairing code. The returned future will produce true if - /// successful, false if the code is invalid or expired, and null if there was a network issue. - Future pairWithStudent(String pairingCode) async { - try { - var dio = canvasDio(); - var pairingResponse = await dio.post(ApiPrefs.getApiUrl(path: 'users/${ApiPrefs.getUser()?.id}/observees'), - queryParameters: {'pairing_code': pairingCode}); - return (pairingResponse.statusCode == 200 || pairingResponse.statusCode == 201); - } on DioError catch (e) { - // The API returns status code 422 on pairing failure - if (e.response?.statusCode == 422) return false; - return null; - } - } - - Future unpairStudent(String studentId) async { - try { - var dio = canvasDio(); - var response = await dio.delete( - ApiPrefs.getApiUrl(path: 'users/${ApiPrefs.getUser()?.id}/observees/$studentId'), - ); - return (response.statusCode == 200 || response.statusCode == 201); - } on DioError { - return false; - } - } - - Future canUnpairStudent(String studentId) async { - try { - var dio = canvasDio(); - var response = await dio.get( - ApiPrefs.getApiUrl(path: 'users/${ApiPrefs.getUser()?.id}/observees/$studentId'), - ); - return response.statusCode == 200; - } on DioError { - return false; - } - } -} diff --git a/apps/flutter_parent/lib/network/api/error_report_api.dart b/apps/flutter_parent/lib/network/api/error_report_api.dart deleted file mode 100644 index 1b7650dbbf..0000000000 --- a/apps/flutter_parent/lib/network/api/error_report_api.dart +++ /dev/null @@ -1,50 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:flutter_parent/network/utils/dio_config.dart'; - -class ErrorReportApi { - static const DEFAULT_DOMAIN = 'https://canvas.instructure.com'; - - Future submitErrorReport({ - String? subject, - String? description, - String? email, - String? severity, - String? stacktrace, - String? domain, - String? name, - String? becomeUser, - String? userRoles, - }) async { - var config = domain == DEFAULT_DOMAIN ? DioConfig.core() : DioConfig.canvas(); - - var dio = config.dio; - - await dio.post( - '/error_reports.json', - queryParameters: { - 'error[subject]': subject, - 'error[url]': domain, - 'error[email]': email, - 'error[comments]': description, - 'error[user_perceived_severity]': severity, - 'error[name]': name, - 'error[user_roles]': userRoles, - 'error[become_user]': becomeUser, - if (stacktrace != null) 'error[backtrace]': stacktrace, - }, - ); - } -} diff --git a/apps/flutter_parent/lib/network/api/features_api.dart b/apps/flutter_parent/lib/network/api/features_api.dart deleted file mode 100644 index 229615d53f..0000000000 --- a/apps/flutter_parent/lib/network/api/features_api.dart +++ /dev/null @@ -1,27 +0,0 @@ -// Copyright (C) 2023 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - - -import 'package:flutter_parent/models/feature_flags.dart'; -import 'package:flutter_parent/network/utils/dio_config.dart'; -import 'package:flutter_parent/network/utils/fetch.dart'; - -class FeaturesApi { - - Future getFeatureFlags() async { - var dio = canvasDio(forceRefresh: true); - - return fetch(dio.get('/features/environment')); - } -} \ No newline at end of file diff --git a/apps/flutter_parent/lib/network/api/file_api.dart b/apps/flutter_parent/lib/network/api/file_api.dart deleted file mode 100644 index 8e6139ce9d..0000000000 --- a/apps/flutter_parent/lib/network/api/file_api.dart +++ /dev/null @@ -1,95 +0,0 @@ -// Copyright (C) 2019 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'dart:io'; - -import 'package:dio/dio.dart'; -import 'package:flutter_parent/models/attachment.dart'; -import 'package:flutter_parent/models/file_upload_config.dart'; -import 'package:flutter_parent/network/utils/dio_config.dart'; -import 'package:flutter_parent/network/utils/fetch.dart'; -import 'package:mime/mime.dart'; -import 'package:path/path.dart'; - -class FileApi { - /// Uploads the given [file] to the user's 'conversation attachment's directory. The [progressCallback] will be - /// called intermittently with two values - a 'count' of the currently uploaded bytes and a 'total' byte count. A - /// 'total' value of -1 is considered to represent indeterminate progress, and means either the file size is unknown - /// or the upload is at a stage where progress cannot be determined. In either case, user-facing progress indicators - /// should be aware of this and show 'indeterminate' progress as needed. - Future uploadConversationFile(File file, ProgressCallback progressCallback) async { - progressCallback(0, -1); // Indeterminate - final name = basename(file.path); - final size = await file.length(); - final contentType = lookupMimeType(file.path); - - var dio = canvasDio(); - final params = ({ - 'name': name, - 'size': size, - 'content_type': contentType, - 'parent_folder_path': 'conversation attachments', - 'on_duplicate': 'rename' - }); - - // Get the upload configuration - FileUploadConfig? uploadConfig; - try { - uploadConfig = await fetch(dio.post('users/self/files', queryParameters: params)); - } catch (e) { - print(e); - return Future.error(e); - } - - // Build the form data for upload - FormData formData = FormData.fromMap(uploadConfig?.params?.toMap() ?? {}); - formData.files.add(MapEntry('file', await MultipartFile.fromFile(file.path, filename: name))); - - // Perform upload with progress - return fetch(Dio().post( - uploadConfig?.url ?? '', - data: formData, - onSendProgress: (count, total) { - if (total > 0 && count >= total) { - // After 100% it still takes a bit for the request to complete, so we'll push 'indeterminate' progress - progressCallback(0, -1); - } else { - progressCallback(count, total); - } - }, - )); - } - - /// Downloads a file located at [url] to the specified [savePath] - Future downloadFile( - String url, - String savePath, { - CancelToken? cancelToken, - ProgressCallback? onProgress, - }) async { - var dio = DioConfig.core(forceRefresh: true).dio; - await dio.download( - url, - savePath, - cancelToken: cancelToken, - onReceiveProgress: onProgress, - ); - return File(savePath); - } - - Future deleteFile(String fileId) async { - var dio = canvasDio(); - await dio.delete('files/$fileId'); - } -} diff --git a/apps/flutter_parent/lib/network/api/heap_api.dart b/apps/flutter_parent/lib/network/api/heap_api.dart deleted file mode 100644 index 7fb61d389e..0000000000 --- a/apps/flutter_parent/lib/network/api/heap_api.dart +++ /dev/null @@ -1,48 +0,0 @@ -// Copyright (C) 2023 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'dart:convert'; - -import 'package:encrypt/encrypt.dart' as encrypt; -import 'package:flutter_parent/network/utils/api_prefs.dart'; -import 'package:flutter_parent/network/utils/dio_config.dart'; -import 'package:flutter_parent/network/utils/private_consts.dart'; - -class HeapApi { - Future track(String event, {Map extras = const {}}) async { - final heapDio = DioConfig.heap(); - final currentLogin = ApiPrefs.getCurrentLogin(); - if (currentLogin == null) return false; - - final userId = ApiPrefs.getCurrentLogin()?.user.id; - if (userId == null) return false; - - final encrypter = encrypt.Encrypter(encrypt.AES(encrypt.Key.fromUtf8(ENCRYPT_KEY))); - final encryptedId = encrypter.encrypt(userId, iv: encrypt.IV.fromUtf8(ENCRYPT_IV)).base64; - - var data = { - 'app_id' : HEAP_PRODUCTION_ID, - 'identity' : encryptedId, - 'event' : event - }; - - if (extras.isNotEmpty) { - data['properties'] = json.encode(extras); - } - - var dio = heapDio.dio; - final response = await dio.post('/track', data: data); - return response.statusCode == 200; - } -} \ No newline at end of file diff --git a/apps/flutter_parent/lib/network/api/help_links_api.dart b/apps/flutter_parent/lib/network/api/help_links_api.dart deleted file mode 100644 index 6d33f44659..0000000000 --- a/apps/flutter_parent/lib/network/api/help_links_api.dart +++ /dev/null @@ -1,26 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:flutter_parent/models/help_links.dart'; -import 'package:flutter_parent/network/utils/dio_config.dart'; -import 'package:flutter_parent/network/utils/fetch.dart'; - -const String _helpLinksEndpoint = 'accounts/self/help_links'; - -class HelpLinksApi { - Future getHelpLinks({forceRefresh = false}) async { - var dio = canvasDio(forceRefresh: forceRefresh, pageSize: PageSize.canvasMax); - return fetch(dio.get(_helpLinksEndpoint)); - } -} diff --git a/apps/flutter_parent/lib/network/api/inbox_api.dart b/apps/flutter_parent/lib/network/api/inbox_api.dart deleted file mode 100644 index ac5ab649b9..0000000000 --- a/apps/flutter_parent/lib/network/api/inbox_api.dart +++ /dev/null @@ -1,96 +0,0 @@ -// Copyright (C) 2019 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:flutter_parent/models/conversation.dart'; -import 'package:flutter_parent/models/recipient.dart'; -import 'package:flutter_parent/models/unread_count.dart'; -import 'package:flutter_parent/network/utils/dio_config.dart'; -import 'package:flutter_parent/network/utils/fetch.dart'; - -class InboxApi { - Future?> getConversations({String? scope = null, bool forceRefresh = false}) async { - final dio = canvasDio(forceRefresh: forceRefresh, pageSize: PageSize.canvasMax); - final params = { - 'scope': scope, - 'include[]': ['participant_avatars'], - }; - return fetchList(dio.get('conversations', queryParameters: params), depaginateWith: dio); - } - - Future getConversation(String id, {bool refresh = false}) async { - var dio = canvasDio(forceRefresh: refresh); - return fetch(dio.get('conversations/$id')); - } - - Future getUnreadCount() async { - var dio = canvasDio(forceRefresh: true); - return fetch(dio.get('conversations/unread_count')); - } - - Future addMessage( - String? conversationId, - String body, - List recipientIds, - List attachmentIds, - List includeMessageIds, - ) async { - var config = DioConfig.canvas(); - var dio = config.dio; - Conversation? conversation = await fetch( - dio.post( - 'conversations/$conversationId/add_message', - queryParameters: { - 'body': body, - 'recipients[]': recipientIds, - 'attachment_ids[]': attachmentIds, - 'included_messages[]': includeMessageIds, - }, - ), - ); - config.clearCache(path: 'conversations'); - config.clearCache(path: 'conversations/$conversationId'); - return conversation; - } - - Future?> getRecipients(String courseId, {bool forceRefresh = false}) async { - var dio = canvasDio(forceRefresh: forceRefresh, pageSize: PageSize.canvasMax); - var params = { - 'permissions[]': ['send_messages_all'], - 'messageable_only': true, - 'context': 'course_$courseId', - }; - return fetchList(dio.get('search/recipients', queryParameters: params), depaginateWith: dio); - } - - Future createConversation( - String courseId, - List recipientIds, - String subject, - String body, - List? attachmentIds, - ) async { - var dio = canvasDio(); - var params = { - 'group_conversation': 'true', - 'recipients[]': recipientIds, - 'context_code': 'course_$courseId', - 'subject': subject, - 'body': body, - 'attachment_ids[]': attachmentIds, - }; - List? result = await fetchList(dio.post('conversations', queryParameters: params)); - DioConfig.canvas().clearCache(path: 'conversations'); - return result?[0]; - } - } diff --git a/apps/flutter_parent/lib/network/api/oauth_api.dart b/apps/flutter_parent/lib/network/api/oauth_api.dart deleted file mode 100644 index f6e8c06d09..0000000000 --- a/apps/flutter_parent/lib/network/api/oauth_api.dart +++ /dev/null @@ -1,25 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:flutter_parent/models/authenticated_url.dart'; -import 'package:flutter_parent/network/utils/dio_config.dart'; -import 'package:flutter_parent/network/utils/fetch.dart'; - -class OAuthApi { - Future getAuthenticatedUrl(String targetUrl) async { - final dio = canvasDio(forceRefresh: true, includeApiPath: false); - final params = {'return_to': targetUrl}; - return fetch(dio.get('login/session_token', queryParameters: params)); - } -} diff --git a/apps/flutter_parent/lib/network/api/page_api.dart b/apps/flutter_parent/lib/network/api/page_api.dart deleted file mode 100644 index d5048187eb..0000000000 --- a/apps/flutter_parent/lib/network/api/page_api.dart +++ /dev/null @@ -1,24 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:flutter_parent/models/canvas_page.dart'; -import 'package:flutter_parent/network/utils/dio_config.dart'; -import 'package:flutter_parent/network/utils/fetch.dart'; - -class PageApi { - Future getCourseFrontPage(String courseId, {bool forceRefresh = false}) async { - var dio = canvasDio(forceRefresh: forceRefresh); - return fetch(dio.get('courses/$courseId/front_page')); - } -} diff --git a/apps/flutter_parent/lib/network/api/planner_api.dart b/apps/flutter_parent/lib/network/api/planner_api.dart deleted file mode 100644 index a5dfd46344..0000000000 --- a/apps/flutter_parent/lib/network/api/planner_api.dart +++ /dev/null @@ -1,35 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:flutter_parent/models/planner_item.dart'; -import 'package:flutter_parent/network/utils/dio_config.dart'; -import 'package:flutter_parent/network/utils/fetch.dart'; - -class PlannerApi { - Future?> getUserPlannerItems( - String userId, - DateTime startDay, - DateTime endDay, { - Set contexts = const {}, - bool forceRefresh = false, - }) async { - var dio = canvasDio(forceRefresh: forceRefresh, pageSize: PageSize.canvasMax); - var queryParams = { - 'start_date': startDay.toUtc().toIso8601String(), - 'end_date': endDay.toUtc().toIso8601String(), - 'context_codes[]': contexts.toList()..sort(), // Sort for cache consistency - }; - return fetchList(dio.get('users/$userId/planner/items', queryParameters: queryParams), depaginateWith: dio); - } -} diff --git a/apps/flutter_parent/lib/network/api/user_api.dart b/apps/flutter_parent/lib/network/api/user_api.dart deleted file mode 100644 index 2fcd2eded2..0000000000 --- a/apps/flutter_parent/lib/network/api/user_api.dart +++ /dev/null @@ -1,60 +0,0 @@ -// Copyright (C) 2019 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'dart:ui'; - -import 'package:dio/dio.dart'; -import 'package:flutter_parent/models/color_change_response.dart'; -import 'package:flutter_parent/models/user.dart'; -import 'package:flutter_parent/models/user_colors.dart'; -import 'package:flutter_parent/network/utils/dio_config.dart'; -import 'package:flutter_parent/network/utils/fetch.dart'; - -class UserApi { - Future getSelf() async { - var dio = canvasDio(forceDeviceLanguage: true, forceRefresh: true); - return fetch(dio.get('users/self/profile')); - } - - Future getUserForDomain(String domain, String userId) async { - var dio = DioConfig.canvas().copyWith(baseUrl: '$domain/api/v1/').dio; - return fetch(dio.get('users/$userId/profile')); - } - - Future getSelfPermissions() async { - var dio = canvasDio(forceRefresh: true); - return fetch(dio.get('users/self')).then((user) => user?.permissions); - } - - Future getUserColors({bool refresh = false}) async { - var dio = canvasDio(forceRefresh: refresh); - return fetch(dio.get('users/self/colors')); - } - - Future acceptUserTermsOfUse() async { - final queryParams = {'user[terms_of_use]': 1}; - var dio = canvasDio(); - return fetch(dio.put('users/self', queryParameters: queryParams)); - } - - Future setUserColor(String contextId, Color color) async { - var hexCode = '#' + color.value.toRadixString(16).substring(2); - var queryParams = {'hexcode': hexCode}; - var dio = canvasDio(); - return fetch(dio.put( - 'users/self/colors/$contextId', - queryParameters: queryParams, - options: Options(validateStatus: (status) => status != null && status < 500))); // Workaround, because this request fails for some legacy users, but we can't catch the error.)); - } -} diff --git a/apps/flutter_parent/lib/network/utils/analytics.dart b/apps/flutter_parent/lib/network/utils/analytics.dart deleted file mode 100644 index c9eeb47f20..0000000000 --- a/apps/flutter_parent/lib/network/utils/analytics.dart +++ /dev/null @@ -1,130 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -import 'package:firebase_crashlytics/firebase_crashlytics.dart'; -import 'package:flutter/foundation.dart'; -import 'package:flutter_parent/network/api/heap_api.dart'; -import 'package:flutter_parent/utils/debug_flags.dart'; -import 'package:flutter_parent/utils/features_utils.dart'; - -/// Event names -/// The naming scheme for the majority of these is found in a google doc so that we can be consistent -/// across the platforms. -class AnalyticsEventConstants { - static const ADD_STUDENT_DASHBOARD = 'add_student_dashboard'; - static const ADD_STUDENT_FAILURE = 'add_student_failure'; - static const ADD_STUDENT_MANAGE_STUDENTS = 'add_student_manage_students'; - static const ADD_STUDENT_SUCCESS = 'add_student_success'; - static const DARK_MODE_OFF = 'dark_mode_off'; - static const DARK_MODE_ON = 'dark_mode_on'; - static const DARK_WEB_MODE_OFF = 'dark_web_mode_off'; - static const DARK_WEB_MODE_ON = 'dark_web_mode_on'; - static const HC_MODE_OFF = 'hc_mode_off'; - static const HC_MODE_ON = 'hc_mode_on'; - static const HELP_DOMAIN_SEARCH = 'help_domain_search'; - static const HELP_LOGIN = 'help_login'; - static const LOGIN_FAILURE = 'login_failure'; - static const LOGIN_SUCCESS = 'login_success'; - static const LOGOUT = 'logout'; - static const QR_ACCOUNT_CREATION_CLICKED = 'qr_account_creation_clicked'; - static const QR_LOGIN_CLICKED = 'qr_code_login_clicked'; - static const QR_LOGIN_FAILURE = 'qr_code_login_failure'; - static const QR_LOGIN_SUCCESS = 'qr_code_login_success'; - static const QR_ACCOUNT_FAILURE = 'qr_account_creation_failure'; - static const QR_ACCOUNT_SUCCESS = 'qr_account_creation_success'; - static const RATING_DIALOG = 'rating_dialog'; - static const RATING_DIALOG_SHOW = 'rating_dialog_show'; - static const RATING_DIALOG_DONT_SHOW_AGAIN = 'rating_dialog_dont_show_again'; - static const REMINDER_ASSIGNMENT_CREATE = 'reminder_assignment'; - static const REMINDER_EVENT_CREATE = 'reminder_event'; - static const SWITCH_USERS = 'switch_users'; - static const TOKEN_REFRESH_FAILURE = 'token_refresh_failure'; - static const TOKEN_REFRESH_FAILURE_NO_SECRET = 'token_refresh_failure_no_secret'; - static const TOKEN_REFRESH_FAILURE_TOKEN_NOT_VALID = 'token_refresh_failure_token_not_valid'; - static const USER_PROPERTY_BUILD_TYPE = 'build_type'; - static const USER_PROPERTY_OS_VERSION = 'os_version'; - static const VIEWED_OLD_REMINDER_MESSAGE = 'viewed_old_reminder_message'; - static const SUBMISSION_AND_RUBRIC_INTERACTION = 'submission_and_rubric_interaction'; -} - -/// (Copied from canvas-api-2, make sure to stay in sync) -/// -/// PARAMS -/// Due to the limits on custom params, we will mostly be using a mapping of the pre-defined params, -/// mappings will be recorded below. Make sure we are only using params where the data is relevant. -/// -/// [ASSIGNMENT_ID]/DISCUSSION/ETC ID -> ITEM_ID There is also ITEM_CATEGORY if the event is vague regarding the type of item -/// [CANVAS_CONTEXT_ID] -> GROUP_ID -/// [DOMAIN_PARAM] -> AFFILIATION -/// [SCREEN_OF_ORIGIN] -> ORIGIN Used when events can originate from multiple locations -/// [STAR_RATING] -> The star rating a user gave in the rating dialog -/// [USER_CONTEXT_ID] -> CHARACTER -/// -class AnalyticsParamConstants { - static const ASSIGNMENT_ID = 'item_id'; - static const CANVAS_CONTEXT_ID = 'group_id'; - static const DOMAIN_PARAM = 'affiliation'; - static const SCREEN_OF_ORIGIN = 'origin'; - static const STAR_RATING = 'star_rating'; - static const USER_CONTEXT_ID = 'character'; -} - -class Analytics { - - HeapApi get _heap => HeapApi(); - /// Set the current screen in analytics - void setCurrentScreen(String screenName) async { - final usageMetricsEnabled = await FeaturesUtils.getUsageMetricFeatureFlag(); - if (kReleaseMode && usageMetricsEnabled) { - await _heap.track(screenName); - } - - if (DebugFlags.isDebug) { - print('currentScreen: $screenName'); - } - } - - /// Log an event to analytics (only in release mode). - /// If isDebug, it will also print to the console - /// - /// Params - /// * [event] should be one of [AnalyticsEventConstants] - /// * [extras] a map of keys [AnalyticsParamConstants] to values. Use sparingly, we only get 25 unique parameters - void logEvent(String event, {Map extras = const {}}) async { - final usageMetricsEnabled = await FeaturesUtils.getUsageMetricFeatureFlag(); - if (kReleaseMode && usageMetricsEnabled) { - await _heap.track(event, extras: extras); - } - - if (DebugFlags.isDebug) { - print('logEvent: $event - $extras'); - } - } - - /// Logs a message to crashlytics to help when looking over crash logs (only in release mode). - /// If isDebug, it will also print to the console - void logMessage(String message) { - if (kReleaseMode) { - FirebaseCrashlytics.instance.log(message); - } - - if (DebugFlags.isDebug) { - print(message); - } - } - - /// Sets environment properties such as the build type and SDK int. This only needs to be called once per session. - void setEnvironmentProperties() async { - - } -} diff --git a/apps/flutter_parent/lib/network/utils/analytics_observer.dart b/apps/flutter_parent/lib/network/utils/analytics_observer.dart deleted file mode 100644 index 5ab9609671..0000000000 --- a/apps/flutter_parent/lib/network/utils/analytics_observer.dart +++ /dev/null @@ -1,57 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -import 'package:flutter/material.dart'; -import 'package:flutter_parent/network/utils/analytics.dart'; -import 'package:flutter_parent/router/panda_router.dart'; -import 'package:flutter_parent/utils/service_locator.dart'; - -/// A simple observer that reports to analytics and crashlytics each time a screen changes -/// Only handles PageRoute transitions. Dialogs won't be covered as there is typically no useful information in it's route for logging. -class AnalyticsObserver extends NavigatorObserver { - void _sendScreenView(PageRoute route) { - if (route.settings.name == null) return; // No name means we can't match it, should be logged by QuickNav.push - final match = PandaRouter.router.match(route.settings.name!); - final String? screenName = match?.route.route; - if (screenName != null) { - final message = - 'Pushing widget: $screenName ${match!.parameters.isNotEmpty ? 'with params: ${match.parameters}' : ''}'; - locator().logMessage(message); // Log message for crashlytics debugging - locator().setCurrentScreen(screenName); // Log current screen for analytics - } - } - - @override - void didPush(Route route, Route? previousRoute) { - super.didPush(route, previousRoute); - if (route is PageRoute) { - _sendScreenView(route); - } - } - - @override - void didReplace({Route? newRoute, Route? oldRoute}) { - super.didReplace(newRoute: newRoute, oldRoute: oldRoute); - if (newRoute is PageRoute) { - _sendScreenView(newRoute); - } - } - - @override - void didPop(Route route, Route? previousRoute) { - super.didPop(route, previousRoute); - if (previousRoute is PageRoute && route is PageRoute) { - _sendScreenView(previousRoute); - } - } -} diff --git a/apps/flutter_parent/lib/network/utils/api_prefs.dart b/apps/flutter_parent/lib/network/utils/api_prefs.dart deleted file mode 100644 index ae40d47d5e..0000000000 --- a/apps/flutter_parent/lib/network/utils/api_prefs.dart +++ /dev/null @@ -1,400 +0,0 @@ -// Copyright (C) 2019 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'dart:convert'; -import 'dart:math'; -import 'dart:ui' as ui; - -import 'package:collection/collection.dart'; -import 'package:encrypted_shared_preferences/encrypted_shared_preferences.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_parent/models/login.dart'; -import 'package:flutter_parent/models/school_domain.dart'; -import 'package:flutter_parent/models/serializers.dart'; -import 'package:flutter_parent/models/user.dart'; -import 'package:flutter_parent/network/api/auth_api.dart'; -import 'package:flutter_parent/screens/web_login/web_login_screen.dart'; -import 'package:flutter_parent/utils/db/calendar_filter_db.dart'; -import 'package:flutter_parent/utils/db/reminder_db.dart'; -import 'package:flutter_parent/utils/notification_util.dart'; -import 'package:flutter_parent/utils/service_locator.dart'; -import 'package:intl/intl.dart'; -import 'package:package_info_plus/package_info_plus.dart'; -import 'package:shared_preferences/shared_preferences.dart'; -import 'package:tuple/tuple.dart'; - -import 'dio_config.dart'; - -class ApiPrefs { - static const String KEY_CAMERA_COUNT = 'camera_count'; - static const String KEY_CURRENT_LOGIN_UUID = 'current_login_uuid'; - static const String KEY_CURRENT_STUDENT = 'current_student'; - static const String KEY_HAS_MIGRATED = 'has_migrated_from_old_app'; - static const String KEY_HAS_CHECKED_OLD_REMINDERS = 'has_checked_old_reminders'; - static const String KEY_HAS_MIGRATED_TO_ENCRYPTED_PREFS = 'has_migrated_to_encrypted_prefs'; - static const String KEY_LOGINS = 'logins'; - static const String KEY_RATING_DONT_SHOW_AGAIN = 'dont_show_again'; - static const String KEY_RATING_NEXT_SHOW_DATE = 'next_show_date'; - static const String KEY_LAST_ACCOUNT = 'last_account'; - static const String KEY_LAST_ACCOUNT_LOGIN_FLOW = 'last_account_login_flow'; - - static EncryptedSharedPreferences? _prefs; - static PackageInfo? _packageInfo; - static Login? _currentLogin; - - static Future init() async { - if (_prefs == null) _prefs = await EncryptedSharedPreferences.getInstance(); - _packageInfo = await PackageInfo.fromPlatform(); - await _migrateToEncryptedPrefs(); - } - - static Future _migrateToEncryptedPrefs() async { - if (_prefs?.getBool(KEY_HAS_MIGRATED_TO_ENCRYPTED_PREFS) ?? false) { - return; - } - - // Set the bool flag so we don't migrate multiple times - await _prefs?.setBool(KEY_HAS_MIGRATED_TO_ENCRYPTED_PREFS, true); - - final oldPrefs = await SharedPreferences.getInstance(); - - await _prefs?.setStringList(KEY_LOGINS, oldPrefs.getStringList(KEY_LOGINS)); - await oldPrefs.remove(KEY_LOGINS); - - await _prefs?.setBool(KEY_HAS_MIGRATED, oldPrefs.getBool(KEY_HAS_MIGRATED)); - await oldPrefs.remove(KEY_HAS_MIGRATED); - - await _prefs?.setBool(KEY_HAS_CHECKED_OLD_REMINDERS, oldPrefs.getBool(KEY_HAS_CHECKED_OLD_REMINDERS)); - await oldPrefs.remove(KEY_HAS_CHECKED_OLD_REMINDERS); - - await _prefs?.setString(KEY_CURRENT_LOGIN_UUID, oldPrefs.getString(KEY_CURRENT_LOGIN_UUID)); - await oldPrefs.remove(KEY_CURRENT_LOGIN_UUID); - - await _prefs?.setString(KEY_CURRENT_STUDENT, oldPrefs.getString(KEY_CURRENT_STUDENT)); - await oldPrefs.remove(KEY_CURRENT_STUDENT); - } - - static Future clean() async { - _prefs?.clear(); - _prefs = null; - _packageInfo = null; - _currentLogin = null; - } - - static void _checkInit() { - if (_prefs == null || _packageInfo == null) throw StateError('ApiPrefs has not been initialized'); - } - - // Login - - static bool isLoggedIn() { - _checkInit(); - final token = getAuthToken() ?? ''; - final domain = getDomain() ?? ''; - return token.isNotEmpty && domain.isNotEmpty; - } - - static Login? getCurrentLogin() { - _checkInit(); - if (_currentLogin == null) { - final currentLoginUuid = getCurrentLoginUuid(); - _currentLogin = getLogins().firstWhereOrNull((it) => it.uuid == currentLoginUuid); - } - return _currentLogin; - } - - static Future switchLogins(Login login) async { - _checkInit(); - _currentLogin = login; - await _prefs?.setString(KEY_CURRENT_LOGIN_UUID, login.uuid); - } - - static bool isMasquerading() { - _checkInit(); - return getCurrentLogin()?.isMasquerading == true; - } - - /// Optionally provide ParentApp (ParentApp.of(context)) as app to rebuild the application for any language changes - static Future performLogout({bool switchingLogins = false, app}) async { - _checkInit(); - - // Clear network cache - await DioConfig().clearCache(); - - // Perform full-logout tasks if we're not just switching users - if (!switchingLogins) { - // Remove reminders - ReminderDb reminderDb = locator(); - final reminders = await reminderDb.getAllForUser(getDomain(), getUser()?.id); - final reminderIds = reminders?.map((it) => it.id).toList().nonNulls.toList() ?? []; - await locator().deleteNotifications(reminderIds); - await reminderDb.deleteAllForUser(getDomain(), getUser()?.id); - - // Remove calendar filters - locator().deleteAllForUser(getDomain(), getUser()?.id); - - // Remove saved Login data - await removeLoginByUuid(getCurrentLoginUuid()); - } - - // Clear current Login - await _prefs!.remove(KEY_CURRENT_LOGIN_UUID); - _currentLogin = null; - app?.rebuild(effectiveLocale()); - } - - static Future saveLogins(List logins) async { - _checkInit(); - List jsonList = logins.map((it) => json.encode(serialize(it))).toList(); - await _prefs!.setStringList(KEY_LOGINS, jsonList); - } - - static Future addLogin(Login login) async { - _checkInit(); - var logins = getLogins(); - logins.removeWhere((it) => it.domain == login.domain && it.user.id == login.user.id); // Remove duplicates - logins.insert(0, login); - await saveLogins(logins); - } - - static List getLogins() { - _checkInit(); - var list = _prefs!.getStringList(KEY_LOGINS); - return list.map((it) => deserialize(json.decode(it))).nonNulls.toList(); - } - - static setLastAccount(SchoolDomain lastAccount, LoginFlow loginFlow) { - _checkInit(); - final lastAccountJson = json.encode(serialize(lastAccount)); - _prefs!.setString(KEY_LAST_ACCOUNT, lastAccountJson); - _prefs!.setInt(KEY_LAST_ACCOUNT_LOGIN_FLOW, loginFlow.index); - } - - static Tuple2? getLastAccount() { - _checkInit(); - if (!_prefs!.containsKey(KEY_LAST_ACCOUNT)) return null; - - final accountJson = _prefs!.getString(KEY_LAST_ACCOUNT); - if (accountJson == null || accountJson.isEmpty == true) return null; - - final lastAccount = deserialize(json.decode(accountJson)); - int? lastLogin = _prefs!.getInt(KEY_LAST_ACCOUNT_LOGIN_FLOW); - if (lastLogin == null) return null; - final loginFlow = _prefs!.containsKey(KEY_LAST_ACCOUNT_LOGIN_FLOW) ? LoginFlow.values[lastLogin] : LoginFlow.normal; - - return Tuple2(lastAccount!, loginFlow); - } - - static Future removeLogin(Login login) => removeLoginByUuid(login.uuid); - - static Future removeLoginByUuid(String? uuid) async { - _checkInit(); - var logins = getLogins(); - Login? login = logins.firstWhereOrNull((it) => it.uuid == uuid); - if (login != null) { - // Delete token (fire and forget - no need to await) - locator().deleteToken(login.domain, login.accessToken); - logins.retainWhere((it) => it.uuid != uuid); - await saveLogins(logins); - } - } - - /// Updates the current login. If passing in the root app, it will be rebuilt on locale change. - static Future updateCurrentLogin(dynamic Function(LoginBuilder) updates, {app}) async { - _checkInit(); - final login = getCurrentLogin(); - if (login == null) return; - final updatedLogin = login.rebuild(updates); - - // Save in-memory login - _currentLogin = updatedLogin; - - // Save persisted login - List allLogins = getLogins(); - int currentLoginIndex = allLogins.indexWhere((it) => it.uuid == updatedLogin.uuid); - if (currentLoginIndex != -1) { - allLogins[currentLoginIndex] = updatedLogin; - saveLogins(allLogins); - } - - // Update locale - return await new Future.sync(() { - var newLocale = effectiveLocale(); - if (Intl.defaultLocale != newLocale) { - app?.rebuild(newLocale); - } - }); - } - - static Future setUser(User user, {app}) async { - if (isMasquerading()) { - await updateCurrentLogin((b) => b..masqueradeUser = user.toBuilder(), app: app); - } else { - await updateCurrentLogin((b) => b..user = user.toBuilder(), app: app); - } - } - - static Locale? effectiveLocale() { - _checkInit(); - User? user = getUser(); - List userLocale = (user?.effectiveLocale ?? user?.locale ?? ui.window.locale.toLanguageTag()).split('-x-'); - - if (userLocale[0].isEmpty) { - return null; - } - - List localeParts = userLocale[0].split('-'); - final countryCode = localeParts.length > 1 ? localeParts.last : null; - - if (userLocale.length == 1) { - return Locale(localeParts.first, countryCode); - } else { - // Custom language pack - return Locale.fromSubtags( - languageCode: localeParts.first, - scriptCode: userLocale[1].length < 5 - ? 'inst${userLocale[1]}' // da-k12 -> da-instk12 (can't be less than 4 characters) - : userLocale[1].substring(0, min(8, userLocale[1].length)), // en-unimelb -> en-unimelb (no more than 8) - countryCode: countryCode, - ); - } - } - - /// Prefs - - static String? getCurrentLoginUuid() => _getPrefString(KEY_CURRENT_LOGIN_UUID); - - static User? getUser() => getCurrentLogin()?.currentUser; - - static String getUserAgent() => 'androidParent/${_packageInfo?.version} (${_packageInfo?.buildNumber})'; - - static String getApiUrl({String path = ''}) => '${getDomain()}/api/v1/$path'; - - static String? getDomain() => getCurrentLogin()?.currentDomain; - - static String? getAuthToken() => getCurrentLogin()?.accessToken; - - static String? getRefreshToken() => getCurrentLogin()?.refreshToken; - - static String? getClientId() => getCurrentLogin()?.clientId; - - static String? getClientSecret() => getCurrentLogin()?.clientSecret; - - static bool getHasMigrated() => _getPrefBool(KEY_HAS_MIGRATED) ?? false; - - static Future setHasMigrated(bool? hasMigrated) => _setPrefBool(KEY_HAS_MIGRATED, hasMigrated); - - static bool getHasCheckedOldReminders() => _getPrefBool(KEY_HAS_CHECKED_OLD_REMINDERS) ?? false; - - static Future setHasCheckedOldReminders(bool checked) => _setPrefBool(KEY_HAS_CHECKED_OLD_REMINDERS, checked); - - static int? getCameraCount() => _getPrefInt(KEY_CAMERA_COUNT); - - static Future setCameraCount(int? count) => _setPrefInt(KEY_CAMERA_COUNT, count); - - static DateTime? getRatingNextShowDate() { - final nextShow = _getPrefString(KEY_RATING_NEXT_SHOW_DATE); - if (nextShow == null) return null; - return DateTime.parse(nextShow); - } - - static Future setRatingNextShowDate(DateTime? nextShowDate) => - _setPrefString(KEY_RATING_NEXT_SHOW_DATE, nextShowDate?.toIso8601String()); - - static bool? getRatingDontShowAgain() => _getPrefBool(KEY_RATING_DONT_SHOW_AGAIN); - - static Future setRatingDontShowAgain(bool? dontShowAgain) => - _setPrefBool(KEY_RATING_DONT_SHOW_AGAIN, dontShowAgain); - - /// Pref helpers - - static Future _setPrefBool(String key, bool? value) async { - _checkInit(); - if (value == null) return _prefs!.remove(key); - return _prefs!.setBool(key, value); - } - - static bool? _getPrefBool(String key) { - _checkInit(); - return _prefs?.getBool(key); - } - - static Future _setPrefString(String key, String? value) async { - _checkInit(); - if (value == null) return _prefs!.remove(key); - - return _prefs!.setString(key, value); - } - - static String? _getPrefString(String key) { - _checkInit(); - return _prefs?.getString(key); - } - - static int? _getPrefInt(String key) { - _checkInit(); - return _prefs?.getInt(key); - } - - static Future _setPrefInt(String key, int? value) async { - _checkInit(); - if (value == null) return _prefs!.remove(key); - return _prefs!.setInt(key, value); - } - - static Future _removeKey(String key) async { - _checkInit(); - return _prefs!.remove(key); - } - - /// Utility functions - - static Map getHeaderMap({ - bool forceDeviceLanguage = false, - String? token = null, - Map? extraHeaders = null, - }) { - if (token == null) { - token = getAuthToken(); - } - - var headers = { - 'Authorization': 'Bearer $token', - 'accept-language': (forceDeviceLanguage ? ui.window.locale.toLanguageTag() : effectiveLocale()?.toLanguageTag())?.replaceAll('-', ',').replaceAll('_', '-') ?? '', - 'User-Agent': getUserAgent(), - }; - - if (extraHeaders != null) { - headers.addAll(extraHeaders); - } - - return headers; - } - - static setCurrentStudent(User? currentStudent) { - _checkInit(); - if (currentStudent == null) { - _prefs!.remove(KEY_CURRENT_STUDENT); - } else { - _prefs!.setString(KEY_CURRENT_STUDENT, json.encode(serialize(currentStudent))); - } - } - - static User? getCurrentStudent() { - _checkInit(); - final studentJson = _prefs?.getString(KEY_CURRENT_STUDENT); - if (studentJson == null || studentJson.isEmpty) return null; - return deserialize(json.decode(studentJson)); - } -} diff --git a/apps/flutter_parent/lib/network/utils/authentication_interceptor.dart b/apps/flutter_parent/lib/network/utils/authentication_interceptor.dart deleted file mode 100644 index 25a83cf5a7..0000000000 --- a/apps/flutter_parent/lib/network/utils/authentication_interceptor.dart +++ /dev/null @@ -1,99 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:dio/dio.dart'; -import 'package:flutter_parent/models/canvas_token.dart'; -import 'package:flutter_parent/models/login.dart'; -import 'package:flutter_parent/network/api/auth_api.dart'; -import 'package:flutter_parent/network/utils/analytics.dart'; -import 'package:flutter_parent/utils/service_locator.dart'; - -import 'api_prefs.dart'; - -class AuthenticationInterceptor extends InterceptorsWrapper { - final String _RETRY_HEADER = 'mobile_refresh'; - - final Dio _dio; - - AuthenticationInterceptor(this._dio); - - @override - Future onError(DioError error, ErrorInterceptorHandler handler) async { - // Only proceed if it was an authentication error - if (error.response?.statusCode != 401) return handler.next(error); - - final currentLogin = ApiPrefs.getCurrentLogin(); - - // Check for any errors - if (error.requestOptions.path.contains('accounts/self') == true) { - // We are likely just checking if the user can masquerade or not, which happens on login - don't try to re-auth here - return handler.next(error); - } else if (error.requestOptions.headers[_RETRY_HEADER] != null) { - _logAuthAnalytics(AnalyticsEventConstants.TOKEN_REFRESH_FAILURE); - return handler.next(error); - } else if (currentLogin == null || - (currentLogin.clientId?.isEmpty ?? true) || - (currentLogin.clientSecret?.isEmpty ?? true)) { - _logAuthAnalytics(AnalyticsEventConstants.TOKEN_REFRESH_FAILURE_NO_SECRET); - return handler.next(error); - } - - // Lock new requests from being processed while refreshing the token - _dio.interceptors.requestLock.lock(); - _dio.interceptors.responseLock.lock(); - - // Refresh the token and update the login - CanvasToken? tokens; - - tokens = await locator().refreshToken().catchError((e) => null); - - if (tokens == null) { - _logAuthAnalytics(AnalyticsEventConstants.TOKEN_REFRESH_FAILURE_TOKEN_NOT_VALID); - - _dio.interceptors.requestLock.unlock(); - _dio.interceptors.responseLock.unlock(); - - return handler.next(error); - } else { - Login login = currentLogin.rebuild((b) => b..accessToken = tokens?.accessToken); - ApiPrefs.addLogin(login); - ApiPrefs.switchLogins(login); - - // Update the header and make the request again - RequestOptions requestOptions = error.requestOptions; - - requestOptions.headers['Authorization'] = 'Bearer ${tokens.accessToken}'; - requestOptions.headers[_RETRY_HEADER] = _RETRY_HEADER; // Mark retry to prevent infinite recursion - - _dio.interceptors.requestLock.unlock(); - _dio.interceptors.responseLock.unlock(); - - final response = await _dio.fetch(requestOptions); - if (response.statusCode == 200 || response.statusCode == 201) { - return handler.resolve(response); - } else { - return handler.next(error); - } - } - } - - _logAuthAnalytics(String eventString) { - final userId = ApiPrefs.getUser()?.id; - final bundle = { - AnalyticsParamConstants.DOMAIN_PARAM: ApiPrefs.getDomain(), - AnalyticsParamConstants.USER_CONTEXT_ID: userId != null ? 'user_$userId' : null, - }; - locator().logEvent(eventString, extras: bundle); - } -} \ No newline at end of file diff --git a/apps/flutter_parent/lib/network/utils/canvas_graphql.dart b/apps/flutter_parent/lib/network/utils/canvas_graphql.dart deleted file mode 100644 index c166c0f6ee..0000000000 --- a/apps/flutter_parent/lib/network/utils/canvas_graphql.dart +++ /dev/null @@ -1,85 +0,0 @@ -// Copyright (C) 2019 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -/* - * A starting place for graph ql, once it is in a place where we can use it for parent. Currently, courses don't return - * their syllabus, and assignments don't return any submission data for observers. The other areas of the app are not - * available at all for graph ql (alerts, managing children, inbox). For now, all requests will need to be made via REST. - -import 'package:graphql/client.dart'; - -/// A class to handle headers and authentication for talking to Canvas via Graph QL -class CanvasGraphQl { - static String _authToken() { -// return ApiPrefs.accessToken; - } - - static String _baseDomain() { -// return ApiPrefs.getDomain(); - } - -// region fields - - static final AuthLink _authLink = AuthLink( - // getToken is called every time a request is made, so a dynamic lookup here will work. - // Instead of _tokenToUse, could be ApiPrefs.accessToken - getToken: () => "Bearer ${_authToken()}", - ); - - static final HttpLink _baseUrl = HttpLink( - uri: "https://${_baseDomain()}/api/graphql/", - headers: { - "GraphQL-Metrics": "true", // Copied from canvas-android - "User-Agent": ApiPrefs.getUserAgent(), - }, - ); - - static final GraphQLClient _client = GraphQLClient( - link: _authLink.concat(_baseUrl), - cache: NormalizedInMemoryCache( - dataIdFromObject: typenameDataIdFromObject, - ), - ); - - static bool _isAuthError(QueryResult result) { - // There don't seem to get any headers in result, so can't check status code - return result.errors?.isNotEmpty == true && result.errors.first.message == "Invalid access token."; - } - - /// A private method to handle refreshing the access token using the refresh token. - static Future _refreshAuth() { - // Update the token to work - return AuthApi.refreshToken(_baseDomain, _refreshToken).then((token) { - _tokenToUse = token; - return token; - }); - } - - /// Query a GraphQl endpoint, also handles any authentication refresh appropriately - static Future query(QueryOptions options) { - return _client.query(options).then((result) async { - if (!_isAuthError(result)) { - return result; // No error, just return the result - } else { - // We need to refresh auth and then perform the query again - await _refreshAuth(); - return _client.query(options); - } - }); - } - - /// We don't need to be able to mutate anything for parents, so no implementation for now -// static Future mutate(QueryOptions options) {} -} -*/ diff --git a/apps/flutter_parent/lib/network/utils/dio_config.dart b/apps/flutter_parent/lib/network/utils/dio_config.dart deleted file mode 100644 index 7265d0b9fb..0000000000 --- a/apps/flutter_parent/lib/network/utils/dio_config.dart +++ /dev/null @@ -1,269 +0,0 @@ -// Copyright (C) 2019 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'dart:io'; - -import 'package:dio/adapter.dart'; -import 'package:dio/dio.dart'; -import 'package:dio_http_cache_lts/dio_http_cache_lts.dart'; -import 'package:dio_smart_retry/dio_smart_retry.dart'; -import 'package:flutter/widgets.dart'; -import 'package:flutter_parent/network/utils/api_prefs.dart'; -import 'package:flutter_parent/network/utils/authentication_interceptor.dart'; -import 'package:flutter_parent/utils/debug_flags.dart'; - -import 'private_consts.dart'; - -/// Class that helps to create and configure [Dio] instances for common use cases -class DioConfig { - final String baseUrl; - final Map baseHeaders; - final Duration cacheMaxAge; - final bool forceRefresh; - final PageSize pageSize; - final Map? extraQueryParams; - final int retries; - - DioConfig({ - this.baseUrl = '', - baseHeaders = null, - this.cacheMaxAge = Duration.zero, - this.forceRefresh = false, - this.pageSize = PageSize.none, - this.extraQueryParams, - this.retries = 0, - }) : this.baseHeaders = baseHeaders ?? {}; - - /// Creates a copy of this configuration with the given fields replaced with the new values - DioConfig copyWith({ - String? baseUrl, - Map? baseHeaders, - Duration? cacheMaxAge, - bool? forceRefresh, - PageSize? pageSize, - Map? extraQueryParams, - int? retries, - }) { - return DioConfig( - baseUrl: baseUrl ?? this.baseUrl, - baseHeaders: baseHeaders ?? this.baseHeaders, - cacheMaxAge: cacheMaxAge ?? this.cacheMaxAge, - forceRefresh: forceRefresh ?? this.forceRefresh, - pageSize: pageSize ?? this.pageSize, - extraQueryParams: extraQueryParams ?? this.extraQueryParams, - retries: retries ?? this.retries); - } - - /// Creates a [Dio] instance using this configuration - Dio get dio { - // Add canvas-string-ids header to ensure Canvas IDs are returned as Strings - baseHeaders[HttpHeaders.acceptHeader] = 'application/json+canvas-string-ids'; - - // Configure base options - var options = BaseOptions(baseUrl: baseUrl, headers: baseHeaders); - - // Add per_page query param if requested - Map extraParams = extraQueryParams ?? {}; - if (pageSize.size > 0) extraParams['per_page'] = pageSize.size; - - // Set extra query params - options.queryParameters = extraParams; - - // Add cache configuration to base options - if (cacheMaxAge != Duration.zero) { - var extras = buildCacheOptions(cacheMaxAge, forceRefresh: forceRefresh).extra; - if (extras != null) options.extra.addAll(extras); - } - - // Create Dio instance and add interceptors - final dio = Dio(options); - - // Authentication refresh interceptor - dio.interceptors.add(AuthenticationInterceptor(dio)); - - // Handle retries if desired - if (retries > 0) { - dio.interceptors.add(RetryInterceptor( - dio: dio, - retries: retries)); - } - - // Cache manager - if (cacheMaxAge != Duration.zero) { - dio.interceptors.add(_cacheInterceptor()); - } - - bool debug = DebugFlags.isDebugApi; - - // Log interceptor - dio.interceptors.add(LogInterceptor( - request: debug, - requestHeader: debug, - requestBody: debug, - responseHeader: debug, - responseBody: debug, - error: debug, - )); - - if (DebugFlags.isDebug) { - _configureDebugProxy(dio); - } - - return dio; - } - - // To use proxy add the following run args to run configuration: --dart-define=PROXY={your proxy io}:{proxy port} - void _configureDebugProxy(Dio dio) { - const proxy = String.fromEnvironment('PROXY', defaultValue: ""); - if (proxy == "") return; - - (dio.httpClientAdapter as DefaultHttpClientAdapter).onHttpClientCreate = (client) { - client.findProxy = (uri) => "PROXY $proxy;"; - client.badCertificateCallback = (X509Certificate cert, String host, int port) => true; - return client; - }; - } - - Interceptor _cacheInterceptor() { - Interceptor interceptor = DioCacheManager(CacheConfig(baseUrl: baseUrl)).interceptor; - return InterceptorsWrapper( - onRequest: (RequestOptions options, RequestInterceptorHandler handler) => options.method == 'GET' ? interceptor.onRequest(options, handler) : handler.next(options), - onResponse: (Response response, ResponseInterceptorHandler handler) => response.requestOptions.method == 'GET' ? interceptor.onResponse(response, handler) : handler.next(response), - onError: (DioError e, ErrorInterceptorHandler handler) => handler.next(e), // interceptor falls back to cache on error, a behavior we currently don't want - ); - } - - /// Creates a [DioConfig] targeted at typical Canvas API usage - static DioConfig canvas({ - bool includeApiPath = true, - bool forceRefresh = false, - bool forceDeviceLanguage = false, - String? overrideToken = null, - Map? extraHeaders = null, - PageSize pageSize = PageSize.none, - bool disableFileVerifiers = true, - }) { - Map? extraParams = ApiPrefs.isMasquerading() ? {'as_user_id': ApiPrefs.getUser()?.id} : null; - - if (disableFileVerifiers) { - extraParams ??= {}; - extraParams['no_verifiers'] = 1; - } - - return DioConfig( - baseUrl: includeApiPath ? ApiPrefs.getApiUrl() : '${ApiPrefs.getDomain()}/', - baseHeaders: ApiPrefs.getHeaderMap( - forceDeviceLanguage: forceDeviceLanguage, - token: overrideToken, - extraHeaders: extraHeaders, - ), - cacheMaxAge: const Duration(hours: 1), - forceRefresh: forceRefresh, - pageSize: pageSize, - extraQueryParams: extraParams, - ); - } - - /// Creates a [DioConfig] targeted at core/free-for-teacher API usage (i.e. canvas.instructure.com) - static DioConfig core({ - bool includeApiPath = true, - Map? headers = null, - Duration cacheMaxAge = Duration.zero, - bool forceRefresh = false, - PageSize pageSize = PageSize.none, - bool useBetaDomain = false, - }) { - var baseUrl = useBetaDomain ? 'https://canvas.beta.instructure.com/' : 'https://canvas.instructure.com/'; - if (includeApiPath) baseUrl += 'api/v1/'; - - return DioConfig( - baseUrl: baseUrl, - baseHeaders: headers, - cacheMaxAge: cacheMaxAge, - forceRefresh: forceRefresh, - pageSize: pageSize); - } - - static DioConfig heap() { - final baseUrl = "https://heapanalytics.com/api/"; - final headers = { - 'accept': 'application/json', - 'content-type': 'application/json' - }; - return DioConfig(baseUrl: baseUrl, baseHeaders: headers); - } - - /// Clears the cache, deleting only the entries related to path OR clearing everything if path is null - Future clearCache({String? path}) { - // The methods below are currently broken in unit tests due to sqflite (even when the sqflite MethodChannel has been - // mocked) so we'll just return 'true' for tests. See https://github.com/tekartik/sqflite/issues/83. - if (WidgetsBinding.instance.runtimeType != WidgetsFlutterBinding) return Future.value(true); - - if (path == null) { - return DioCacheManager(CacheConfig(baseUrl: baseUrl)).clearAll(); - } else { - return DioCacheManager(CacheConfig(baseUrl: baseUrl)).deleteByPrimaryKey(path, requestMethod: 'GET'); - } - } -} - -/// Class for configuring paging parameters -class PageSize { - final int size; - - const PageSize(this.size); - - static const PageSize none = const PageSize(0); - - static const PageSize canvasDefault = const PageSize(10); - - static const PageSize canvasMax = const PageSize(100); - - @override - bool operator ==(Object other) => identical(this, other) || other is PageSize && this.size == other.size; -} - -/// Convenience method that returns a [Dio] instance configured by calling through to [DioConfig.canvas] -Dio canvasDio({ - bool includeApiPath = true, - bool forceRefresh = false, - bool forceDeviceLanguage = false, - String? overrideToken = null, - Map? extraHeaders = null, - PageSize pageSize = PageSize.none, - bool disableFileVerifiers = true, -}) { - return DioConfig.canvas( - forceRefresh: forceRefresh, - forceDeviceLanguage: forceDeviceLanguage, - overrideToken: overrideToken, - extraHeaders: extraHeaders, - pageSize: pageSize, - includeApiPath: includeApiPath, - disableFileVerifiers: disableFileVerifiers) - .dio; -} - -const baseSeedingUrl = "https://mobileqa.beta.instructure.com/api/v1/"; - -// Convenience method that returns a [Dio] instance for data-seeding -Dio seedingDio({String baseUrl = baseSeedingUrl}) { - return DioConfig( - baseUrl: baseUrl, - retries: 3, // Allow for retries in our seeding calls, because they can return 500s - baseHeaders: ApiPrefs.getHeaderMap( - forceDeviceLanguage: true, - token: DATA_SEEDING_ADMIN_TOKEN, - extraHeaders: {'Content-type': 'application/json', 'Accept': 'application/json'})).dio; -} diff --git a/apps/flutter_parent/lib/network/utils/fetch.dart b/apps/flutter_parent/lib/network/utils/fetch.dart deleted file mode 100644 index 69bb1b102b..0000000000 --- a/apps/flutter_parent/lib/network/utils/fetch.dart +++ /dev/null @@ -1,74 +0,0 @@ -// Copyright (C) 2019 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:dio/dio.dart'; -import 'package:flutter_parent/models/serializers.dart'; -import 'package:flutter_parent/network/utils/dio_config.dart'; -import 'package:flutter_parent/network/utils/paged_list.dart'; - -/// Fetches and deserializes a response using the given [request]. -Future fetch(Future> request) async { - try { - final response = await request; - return deserialize(response.data); - } catch (e) { - print(e); - return Future.error(e); - } -} - -Future?> fetchFirstPage(Future> request) async { - try { - final response = await request; - return PagedList(response); - } catch (e) { - print(e); - return Future.error(e); - } -} - -Future?> fetchNextPage(String? nextUrl) async { - try { - var dio = DioConfig.canvas().copyWith(baseUrl: nextUrl).dio; - var response = await dio.get(''); - return PagedList(response); - } catch (e) { - print(e); - return Future.error(e); - } -} - -/// Fetches and deserializes a list of items using the given [request]. To depaginate the list (i.e. perform multiple -/// requests to exhaust pagination), provide a [Dio] instance for [depaginateWith] that is configured for use -/// with subsequent page requests (cache behavior, authentications headers, etc). -Future?> fetchList( - Future> request, { - Dio? depaginateWith = null, -}) async { - try { - var response = await request; - if (depaginateWith == null) return deserializeList(response.data); - depaginateWith.options.baseUrl = ''; - depaginateWith.options.queryParameters.remove('per_page'); - var pagedList = PagedList(response); - while (pagedList.nextUrl != null) { - response = await depaginateWith.get(pagedList.nextUrl ?? ''); - pagedList.updateWithResponse(response); - } - return pagedList.data; - } catch (e) { - print(e); - return Future.error(e); - } -} diff --git a/apps/flutter_parent/lib/network/utils/paged_list.dart b/apps/flutter_parent/lib/network/utils/paged_list.dart deleted file mode 100644 index 0a84cba8d4..0000000000 --- a/apps/flutter_parent/lib/network/utils/paged_list.dart +++ /dev/null @@ -1,43 +0,0 @@ -// Copyright (C) 2019 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:dio/dio.dart'; -import 'package:flutter_parent/models/serializers.dart'; -import 'package:collection/collection.dart'; - -/// A helper class to communicate back to api callers what the data and next url is for paged lists. -class PagedList { - String? nextUrl; - List data; - - PagedList(Response response) - : data = deserializeList(response.data), - nextUrl = _parseNextUrl(response.headers); - - void updateWithResponse(Response response) => updateWithPagedList(PagedList(response)); - - void updateWithPagedList(PagedList pagedList) { - data.addAll(pagedList.data); - nextUrl = pagedList.nextUrl; - } - - static String? _parseNextUrl(Headers? headers) { - if (headers == null) return null; - - final links = headers['link']?.first.split(','); - final next = links?.firstWhereOrNull((link) => link.contains('rel="next"')); - - return next?.substring(1, next.lastIndexOf('>')); - } -} diff --git a/apps/flutter_parent/lib/parent_app.dart b/apps/flutter_parent/lib/parent_app.dart deleted file mode 100644 index e7fe9a1e9b..0000000000 --- a/apps/flutter_parent/lib/parent_app.dart +++ /dev/null @@ -1,107 +0,0 @@ -// Copyright (C) 2019 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'dart:async'; -import 'dart:ui'; - -import 'package:flutter/material.dart'; -import 'package:flutter/scheduler.dart'; -import 'package:flutter_localizations/flutter_localizations.dart'; -import 'package:flutter_parent/l10n/app_localizations.dart'; -import 'package:flutter_parent/network/utils/analytics_observer.dart'; -import 'package:flutter_parent/network/utils/api_prefs.dart'; -import 'package:flutter_parent/router/panda_router.dart'; -import 'package:flutter_parent/utils/common_widgets/masquerade_ui.dart'; -import 'package:flutter_parent/utils/common_widgets/respawn.dart'; -import 'package:flutter_parent/utils/design/parent_theme.dart'; - -import 'l10n/fallback_material_localizations_delegate.dart'; - -class ParentApp extends StatefulWidget { - final Completer _appCompleter; - - @override - _ParentAppState createState() => _ParentAppState(); - - ParentApp(this._appCompleter, {super.key}); - - static _ParentAppState? of(BuildContext context) { - return context.findAncestorStateOfType<_ParentAppState>(); - } -} - -class _ParentAppState extends State { - late Locale? _locale; - GlobalKey _navKey = GlobalKey(); - - rebuild(locale) { - setState(() => _locale = locale); - } - - @override - void initState() { - super.initState(); - - _locale = ApiPrefs.effectiveLocale(); - } - - @override - Widget build(BuildContext context) { - return Respawn( - child: ParentTheme( - builder: (context, themeData) => MaterialApp( - builder: (context, child) { - if (!widget._appCompleter.isCompleted) { - widget._appCompleter.complete(); - } - return MasqueradeUI(navKey: _navKey, child: child!); - }, - title: 'Canvas Parent', - locale: _locale, - navigatorKey: _navKey, - localizationsDelegates: const [ - AppLocalizations.delegate, - // Material components use these delegate to provide default localization - FallbackMaterialLocalizationsDelegate(), - GlobalWidgetsLocalizations.delegate, - ], - supportedLocales: AppLocalizations.delegate.supportedLocales, - localeResolutionCallback: _localeCallback(), - theme: themeData, - navigatorObservers: [AnalyticsObserver()], - onGenerateRoute: PandaRouter.router.generator, - ), - ), - ); - } - - // Get notified when there's a new system locale so we can rebuild the app with the new language - LocaleResolutionCallback _localeCallback() => (locale, supportedLocales) { - // If there is no user locale, they want the system locale. If there is a user locale, we should use it over the system locale - Locale newLocale = ApiPrefs.getUser()?.locale == null ? locale! : _locale!; - - const fallback = Locale('en'); - Locale? resolvedLocale = - AppLocalizations.delegate.resolution(fallback: fallback, matchCountry: false)(newLocale, supportedLocales); - - // Update the state if the locale changed - if (_locale != resolvedLocale) { - SchedulerBinding.instance.addPostFrameCallback((_) { - rebuild(resolvedLocale); - }); - } - - return resolvedLocale; - }; -} diff --git a/apps/flutter_parent/lib/router/panda_router.dart b/apps/flutter_parent/lib/router/panda_router.dart deleted file mode 100644 index b4ea35148d..0000000000 --- a/apps/flutter_parent/lib/router/panda_router.dart +++ /dev/null @@ -1,552 +0,0 @@ -/* - * Copyright (C) 2020 - present Instructure, Inc. - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, version 3 of the License. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -import 'dart:convert'; -import 'dart:core'; - -import 'package:fluro/fluro.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_parent/l10n/app_localizations.dart'; -import 'package:flutter_parent/network/utils/analytics.dart'; -import 'package:flutter_parent/network/utils/api_prefs.dart'; -import 'package:flutter_parent/router/router_error_screen.dart'; -import 'package:flutter_parent/screens/account_creation/account_creation_screen.dart'; -import 'package:flutter_parent/screens/announcements/announcement_details_screen.dart'; -import 'package:flutter_parent/screens/assignments/assignment_details_screen.dart'; -import 'package:flutter_parent/screens/aup/acceptable_use_policy_screen.dart'; -import 'package:flutter_parent/screens/calendar/calendar_screen.dart'; -import 'package:flutter_parent/screens/calendar/calendar_widget/calendar_widget.dart'; -import 'package:flutter_parent/screens/courses/details/course_details_screen.dart'; -import 'package:flutter_parent/screens/courses/routing_shell/course_routing_shell_screen.dart'; -import 'package:flutter_parent/screens/dashboard/dashboard_screen.dart'; -import 'package:flutter_parent/screens/domain_search/domain_search_screen.dart'; -import 'package:flutter_parent/screens/events/event_details_screen.dart'; -import 'package:flutter_parent/screens/help/help_screen.dart'; -import 'package:flutter_parent/screens/help/terms_of_use_screen.dart'; -import 'package:flutter_parent/screens/inbox/conversation_list/conversation_list_screen.dart'; -import 'package:flutter_parent/screens/login_landing_screen.dart'; -import 'package:flutter_parent/screens/not_a_parent_screen.dart'; -import 'package:flutter_parent/screens/pairing/qr_pairing_screen.dart'; -import 'package:flutter_parent/screens/qr_login/qr_login_tutorial_screen.dart'; -import 'package:flutter_parent/screens/settings/legal_screen.dart'; -import 'package:flutter_parent/screens/settings/settings_screen.dart'; -import 'package:flutter_parent/screens/splash/splash_screen.dart'; -import 'package:flutter_parent/screens/web_login/web_login_screen.dart'; -import 'package:flutter_parent/utils/common_widgets/web_view/simple_web_view_screen.dart'; -import 'package:flutter_parent/utils/common_widgets/web_view/web_content_interactor.dart'; -import 'package:flutter_parent/utils/qr_utils.dart'; -import 'package:flutter_parent/utils/quick_nav.dart'; -import 'package:flutter_parent/utils/service_locator.dart'; -import 'package:flutter_parent/utils/url_launcher.dart'; -import 'package:flutter_parent/utils/veneers/flutter_snackbar_veneer.dart'; - -/// -/// Debug note: Getting the deep link route from an external source (via the Android Activity's onCreate intent) can be -/// viewed by calling `WidgetsBinding.instance.window.defaultRouteName`, though we don't have to manually do this -/// as flutter sets this up for us. -class PandaRouter { - static WebContentInteractor get _interactor => locator(); - - static final FluroRouter router = FluroRouter(); - - static bool _isInitialized = false; - - static final _accountCreation = '/account_creation'; - - static String accountCreation(String code, String domain, String accountId) { - return '$_accountCreation?${_RouterKeys.pairingCode}=${Uri.encodeQueryComponent(code)}&${_RouterKeys.domain}=${Uri.encodeQueryComponent(domain)}&${_RouterKeys.accountId}=${Uri.encodeQueryComponent(accountId)}'; - } - - static final String alerts = '/alerts'; - - static String assignmentDetails(String courseId, String assignmentId) => - '/courses/$courseId/assignments/$assignmentId'; - - static final String calendar = '/calendar'; - - static String conversations() => '/conversations'; - - static String courseAnnouncementDetails(String courseId, String announcementId) => - '/courses/$courseId/discussion_topics/$announcementId'; - - static String courseDetails(String courseId) => '/courses/$courseId'; - - static String courses() => '/courses'; - - static String dashboard() => '/dashboard'; - - static String discussionDetails(String courseId, String assignmentId) => assignmentDetails(courseId, assignmentId); - - static String _domainSearch = '/domainSearch'; - - static String domainSearch({LoginFlow loginFlow = LoginFlow.normal}) => - '$_domainSearch?${_RouterKeys.loginFlow}=${loginFlow.toString()}'; - - static String eventDetails(String courseId, String eventId) => 'courses/$courseId/calendar_events/$eventId'; - - static String frontPage(String courseId) => '/courses/$courseId/pages/first-page'; - - static String frontPageWiki(String courseId) => '/courses/$courseId/wiki'; - - static String gradesPage(String courseId) => '/courses/$courseId/grades'; - - static String help() => '/help'; - - static String institutionAnnouncementDetails(String accountNotificationId) => - '/account_notifications/$accountNotificationId'; - - static String legal() => '/legal'; - - static String login() => '/login'; - - static final String _loginWeb = '/loginWeb'; - - static String loginWeb( - String domain, { - String accountName = '', - String? authenticationProvider = null, - LoginFlow loginFlow = LoginFlow.normal, - }) => - '$_loginWeb?${_RouterKeys.domain}=${Uri.encodeQueryComponent(domain)}&${_RouterKeys.accountName}=${Uri.encodeQueryComponent(accountName)}&${_RouterKeys.authenticationProvider}=$authenticationProvider&${_RouterKeys.loginFlow}=${loginFlow.toString()}'; - - static String notParent() => '/not_parent'; - - static String quizAssignmentDetails(String courseId, String quizId) => assignmentDetails(courseId, quizId); - - static String _qrLogin = '/qr_login'; - - static String qrLogin(String qrLoginUrl) => - '/qr_login?${_RouterKeys.qrLoginUrl}=${Uri.encodeQueryComponent(qrLoginUrl)}'; - - static String qrTutorial() => '/qr_tutorial'; - - static String _qrPairing = '/qr_pairing'; - - static String qrPairing({String? pairingUri, bool isCreatingAccount = false}) { - if (isCreatingAccount) return '$_qrPairing?${_RouterKeys.isCreatingAccount}=${isCreatingAccount}'; - if (pairingUri == null) return _qrPairing; - return '$_qrPairing?${_RouterKeys.qrPairingInfo}=${Uri.encodeQueryComponent(pairingUri)}'; - } - - static final String _rootWithExternalUrl = 'external'; - - static final String _routerError = '/error'; - - static String _routerErrorRoute(String url) => '/error?${_RouterKeys.url}=${Uri.encodeQueryComponent(url)}'; - - static String rootSplash() => '/'; - - static String aup() => '/aup'; - - static final String _simpleWebView = '/internal'; - - static String simpleWebViewRoute(String url, String infoText, bool limitWebAccess) => - '/internal?${_RouterKeys.url}=${Uri.encodeQueryComponent(url)}&${_RouterKeys.infoText}=${Uri.encodeQueryComponent(infoText)}&${_RouterKeys.limitWebAccess}=${limitWebAccess}'; - - static String submissionWebViewRoute(String url, String title, Map cookies, bool limitWebAccess) => - '/internal?${_RouterKeys.url}=${Uri.encodeQueryComponent(url)}&${_RouterKeys.title}=${Uri.encodeQueryComponent(title)}&${_RouterKeys.cookies}=${jsonEncode(cookies)}&${_RouterKeys.limitWebAccess}=${limitWebAccess}'; - - static String settings() => '/settings'; - - static String syllabus(String courseId) => '/courses/$courseId/assignments/syllabus'; - - static String termsOfUse({String? accountId, String? domain}) { - if (accountId != null && domain != null) { - return '/terms_of_use?${_RouterKeys.accountId}=${Uri.encodeQueryComponent(accountId)}&${_RouterKeys.url}=${Uri.encodeQueryComponent(domain)}'; - } else { - return '/terms_of_use'; - } - } - - static void init() { - if (!_isInitialized) { - _isInitialized = true; - router.define(conversations(), handler: _conversationsHandler); - router.define(dashboard(), handler: _dashboardHandler); - router.define(_domainSearch, handler: _domainSearchHandler); - router.define(_loginWeb, handler: _loginWebHandler); - router.define(login(), handler: _loginHandler); - router.define(notParent(), handler: _notParentHandler); - router.define(rootSplash(), handler: _rootSplashHandler); - - // INTERNAL - router.define(_accountCreation, handler: _accountCreationHandler); - router.define(alerts, handler: _alertHandler); - // RIP Alphabetical Order, syllabus needs to appear before assignment details, otherwise they conflict - router.define(syllabus(':${_RouterKeys.courseId}'), handler: _syllabusHandler); - router.define(assignmentDetails(':${_RouterKeys.courseId}', ':${_RouterKeys.assignmentId}'), - handler: _assignmentDetailsHandler); - router.define(calendar, handler: _calendarHandler); - router.define(courseAnnouncementDetails(':${_RouterKeys.courseId}', ':${_RouterKeys.announcementId}'), - handler: _courseAnnouncementDetailsHandler); - router.define(courseDetails(':${_RouterKeys.courseId}'), handler: _courseDetailsHandler); - router.define(courses(), handler: _coursesHandler); - router.define(eventDetails(':${_RouterKeys.courseId}', ':${_RouterKeys.eventId}'), handler: _eventDetailsHandler); - router.define(frontPage(':${_RouterKeys.courseId}'), handler: _frontPageHandler); - router.define(frontPageWiki(':${_RouterKeys.courseId}'), handler: _frontPageHandler); - router.define(gradesPage(':${_RouterKeys.courseId}'), handler: _gradesPageHandler); - router.define(help(), handler: _helpHandler); - router.define(institutionAnnouncementDetails(':${_RouterKeys.accountNotificationId}'), - handler: _institutionAnnouncementDetailsHandler); - router.define(legal(), handler: _legalHandler); - router.define(quizAssignmentDetails(':${_RouterKeys.courseId}', ':${_RouterKeys.quizId}'), - handler: _assignmentDetailsHandler); - router.define(_qrLogin, handler: _qrLoginHandler); - router.define(qrTutorial(), handler: _qrTutorialHandler); - router.define(_qrPairing, handler: _qrPairingHandler); - router.define(_routerError, handler: _routerErrorHandler); - router.define(settings(), handler: _settingsHandler); - router.define(_simpleWebView, handler: _simpleWebViewHandler); - router.define(termsOfUse(), handler: _termsOfUseHandler); - router.define(aup(), handler: _aupHandler); - - // EXTERNAL - router.define(_rootWithExternalUrl, handler: _rootWithExternalUrlHandler); - } - } - - // Handlers - static Handler _accountCreationHandler = - Handler(handlerFunc: (BuildContext? context, Map> params) { - var pairingInfo = QRPairingScanResult.success( - params[_RouterKeys.pairingCode]![0], params[_RouterKeys.domain]![0], params[_RouterKeys.accountId]![0]); - return AccountCreationScreen(pairingInfo as QRPairingInfo); - }); - - static Handler _alertHandler = Handler(handlerFunc: (BuildContext? context, Map> params) { - return DashboardScreen( - startingPage: DashboardContentScreens.Alerts, - ); - }); - - static Handler _assignmentDetailsHandler = - Handler(handlerFunc: (BuildContext? context, Map> params) { - return AssignmentDetailsScreen( - courseId: params[_RouterKeys.courseId]![0], - assignmentId: params[_RouterKeys.assignmentId]![0], - ); - }); - - static Handler _calendarHandler = Handler(handlerFunc: (BuildContext? context, Map> params) { - var calendarParams = { - CalendarScreen.startDateKey: - DateTime.tryParse(params[_RouterKeys.calendarStart]?.elementAt(0) ?? '') ?? DateTime.now(), - CalendarScreen.startViewKey: - params[_RouterKeys.calendarView]?.elementAt(0) == 'month' ? CalendarView.Month : CalendarView.Week, - }; - - var widget = DashboardScreen( - startingPage: DashboardContentScreens.Calendar, - deepLinkParams: calendarParams, - ); - - return widget; - }); - - static Handler _conversationsHandler = Handler(handlerFunc: (BuildContext? context, Map> params) { - return ConversationListScreen(); - }); - - static Handler _courseAnnouncementDetailsHandler = - Handler(handlerFunc: (BuildContext? context, Map> params) { - return AnnouncementDetailScreen( - params[_RouterKeys.announcementId]![0], AnnouncementType.COURSE, params[_RouterKeys.courseId]![0], context); - }); - - static Handler _courseDetailsHandler = Handler(handlerFunc: (BuildContext? context, Map> params) { - return CourseDetailsScreen(params[_RouterKeys.courseId]![0]); - }); - - static Handler _coursesHandler = Handler(handlerFunc: (BuildContext? context, Map> params) { - return DashboardScreen( - startingPage: DashboardContentScreens.Courses, - ); - }); - - static Handler _dashboardHandler = Handler(handlerFunc: (BuildContext? context, Map> params) { - return DashboardScreen(); - }); - - static Handler _domainSearchHandler = Handler(handlerFunc: (BuildContext? context, Map> params) { - // Login flow - String loginFlowString = params[_RouterKeys.loginFlow]?.elementAt(0) ?? LoginFlow.normal.toString(); - LoginFlow loginFlow = LoginFlow.values.firstWhere((e) => e.toString() == loginFlowString); - - return DomainSearchScreen(loginFlow: loginFlow); - }); - - static Handler _eventDetailsHandler = Handler(handlerFunc: (BuildContext? context, Map> params) { - return EventDetailsScreen.withId( - eventId: params[_RouterKeys.eventId]![0], - courseId: params[_RouterKeys.courseId]![0], - ); - }); - - static Handler _frontPageHandler = Handler(handlerFunc: (BuildContext? context, Map> params) { - return CourseRoutingShellScreen(params[_RouterKeys.courseId]![0], CourseShellType.frontPage); - }); - - static Handler _gradesPageHandler = Handler(handlerFunc: (BuildContext? context, Map> params) { - return CourseDetailsScreen(params[_RouterKeys.courseId]![0]); - }); - - static Handler _helpHandler = Handler(handlerFunc: (BuildContext? context, Map> params) { - return HelpScreen(); - }); - - static Handler _institutionAnnouncementDetailsHandler = - Handler(handlerFunc: (BuildContext? context, Map> params) { - return AnnouncementDetailScreen( - params[_RouterKeys.accountNotificationId]![0], AnnouncementType.INSTITUTION, '', context); - }); - - static Handler _legalHandler = Handler(handlerFunc: (BuildContext? context, Map> params) { - return LegalScreen(); - }); - - static Handler _loginHandler = Handler(handlerFunc: (BuildContext? context, Map> params) { - return LoginLandingScreen(); - }); - - static Handler _loginWebHandler = Handler(handlerFunc: (BuildContext? context, Map> params) { - // Auth provider - String? authProvider = params[_RouterKeys.authenticationProvider]?.elementAt(0); - if ('null' == authProvider) authProvider = null; - - // Login flow - String? loginFlowString = params[_RouterKeys.loginFlow]?.elementAt(0); - if (loginFlowString == null || loginFlowString == 'null') loginFlowString = LoginFlow.normal.toString(); - LoginFlow loginFlow = LoginFlow.values.firstWhere((e) => e.toString() == loginFlowString); - - return WebLoginScreen( - params[_RouterKeys.domain]![0], - accountName: params[_RouterKeys.accountName]![0], - authenticationProvider: authProvider, - loginFlow: loginFlow, - ); - }); - - static Handler _notParentHandler = Handler(handlerFunc: (BuildContext? context, Map> params) { - return NotAParentScreen(); - }); - - static Handler _qrLoginHandler = Handler(handlerFunc: (BuildContext? context, Map> params) { - String? qrLoginUrl = params[_RouterKeys.qrLoginUrl]?.elementAt(0); - return SplashScreen(qrLoginUrl: qrLoginUrl); - }); - - static Handler _qrTutorialHandler = Handler(handlerFunc: (BuildContext? context, Map> params) { - return QRLoginTutorialScreen(); - }); - - static Handler _qrPairingHandler = Handler(handlerFunc: (BuildContext? context, Map> params) { - var pairingInfo = QRUtils.parsePairingInfo(params[_RouterKeys.qrPairingInfo]?.elementAt(0)); - var isCreatingAccount = params[_RouterKeys.isCreatingAccount]?.elementAt(0) == 'true'; - if (pairingInfo is QRPairingInfo) { - return QRPairingScreen(pairingInfo: pairingInfo); - } else if (isCreatingAccount) { - return QRPairingScreen(isCreatingAccount: isCreatingAccount); - } else { - return QRPairingScreen(); - } - }); - - static Handler _rootSplashHandler = Handler(handlerFunc: (BuildContext? context, Map> params) { - return SplashScreen(); - }); - - static Handler _routerErrorHandler = Handler(handlerFunc: (BuildContext? context, Map> params) { - final url = params[_RouterKeys.url]![0]; - return RouterErrorScreen(url); - }); - - static Handler _settingsHandler = Handler(handlerFunc: (BuildContext? context, Map> params) { - return SettingsScreen(); - }); - - static Handler _simpleWebViewHandler = Handler(handlerFunc: (BuildContext? context, Map> params) { - final url = params[_RouterKeys.url]![0]; - final infoText = params[_RouterKeys.infoText]?.elementAt(0); - final titleParam = params[_RouterKeys.title]?.firstOrNull; - final title = (titleParam == null || titleParam.isEmpty) ? url : titleParam; - final cookiesParam = params[_RouterKeys.cookies]?.firstOrNull; - final cookies = (cookiesParam == null || cookiesParam.isEmpty) ? {} : jsonDecode(cookiesParam); - final limitWebAccess = params[_RouterKeys.limitWebAccess]?.firstOrNull == 'true'; - return SimpleWebViewScreen(url, title, limitWebAccess, - infoText: infoText == null || infoText == 'null' ? null : infoText, initialCookies: cookies); - }); - - static Handler _syllabusHandler = Handler(handlerFunc: (BuildContext? context, Map> params) { - return CourseRoutingShellScreen(params[_RouterKeys.courseId]![0], CourseShellType.syllabus); - }); - - static Handler _termsOfUseHandler = Handler(handlerFunc: (BuildContext? context, Map> params) { - final domain = params[_RouterKeys.url]?.elementAt(0); - final accountId = params[_RouterKeys.accountId]?.elementAt(0); - - if ((domain != null && domain.isNotEmpty) && (accountId != null && accountId.isNotEmpty)) { - return TermsOfUseScreen(accountId: accountId, domain: domain); - } else { - return TermsOfUseScreen(); - } - }); - - static Handler _aupHandler = Handler(handlerFunc: (BuildContext? context, Map> params) { - return AcceptableUsePolicyScreen(); - }); - - /// Used to handled external urls routed by the intent-filter -> MainActivity.kt - static Handler _rootWithExternalUrlHandler = - Handler(handlerFunc: (BuildContext? context, Map> params) { - var link = params[_RouterKeys.url]![0]; - - // QR Login: we need to modify the url slightly - var qrUri = QRUtils.verifySSOLogin(link); - if (qrUri != null) { - link = qrLogin(link); - } - - // QR Pairing - var pairingParseResult = QRUtils.parsePairingInfo(link); - QRPairingInfo? pairingInfo = pairingParseResult is QRPairingInfo ? pairingParseResult : null; - if (pairingInfo != null) { - link = qrPairing(pairingUri: link); - } - - final urlRouteWrapper = getRouteWrapper(link); - - locator().logMessage('Attempting to route EXTERNAL url: $link'); - - // We only care about valid app routes if they are already signed in or performing a qr login - if (urlRouteWrapper.appRouteMatch != null && (ApiPrefs.isLoggedIn() || qrUri != null)) { - if (urlRouteWrapper.validHost) { - // Before deep linking, we need to make sure a current student is set - if (ApiPrefs.getCurrentStudent() != null || qrUri != null) { - // If its a link we can handle natively and within our domain, route - return (urlRouteWrapper.appRouteMatch?.route.handler as Handler) - .handlerFunc(context, urlRouteWrapper.appRouteMatch!.parameters); - } else { - // This might be a migrated user or an error case, let's route them to the dashboard - return _dashboardHandler.handlerFunc(context, {}); - } - } else { - // Otherwise, we want to route to the error page if they are already logged in - return _routerErrorHandler.handlerFunc(context, params); - } - } - - // We don't support the link or the user isn't signed in, default to the splash screen for now - return _rootSplashHandler.handlerFunc(context, {}); - }); - - /// Used to handle links clicked within web content - static Future routeInternally(BuildContext context, String link) async { - final urlRouteWrapper = getRouteWrapper(link); - - locator().logMessage('Attempting to route INTERNAL url: $link'); - - // Check to see if the route can be handled internally, isn't to root, and matches our current domain - if (urlRouteWrapper.appRouteMatch != null) { - if (urlRouteWrapper.validHost) { - // Its a match, so we can route internally - locator().pushRoute(context, urlRouteWrapper.path); - } else { - // Show an error screen for non-matching domain - locator().pushRoute(context, _routerErrorRoute(link)); - } - } else { - final url = await _interactor.getAuthUrl(link); - if (limitWebAccess) { - // Special case for limit webview access flag (We don't want them to be able to navigate within the webview) - locator().pushRoute(context, simpleWebViewRoute(url, L10n(context).webAccessLimitedMessage, true)); - } else if (await locator().canLaunch(link) ?? false) { - // No native route found, let's launch the url if possible, or show an error toast - locator().launch(url); - } else { - locator().showSnackBar(context, L10n(context).routerLaunchErrorMessage); - } - } - } - - static bool get limitWebAccess => ApiPrefs.getUser()?.permissions?.limitParentAppWebAccess ?? false; - - /// Simple helper method to determine if the router can handle a url - /// returns a RouteWrapper - /// _RouteWrapper.appRouteMatch will be null when there is no match or path is root - static _UrlRouteWrapper getRouteWrapper(String link) { - Uri uri; - - try { - uri = Uri.parse(link); - } catch (e) { - return _UrlRouteWrapper(link, false, null); - } - - // Add any fragment parameters, e.g. '/...#view_name=month&view_start=12-12-2020' as query params to the uri - var frags = Uri.parse(link).fragment; - - uri = uri.replace( - queryParameters: Uri.splitQueryString(frags)..addAll(uri.queryParameters), - fragment: '', // Remove the fragment - ); - - // Determine if we can handle the url natively - final path = '/${uri.pathSegments.join('/')}${uri.query.isNotEmpty ? '?${uri.query}' : ''}'; - final match = router.match(path); - final currentDomain = ApiPrefs.getDomain(); - - // Check to see if the route can be handled internally, isn't to root, and matches our current domain - return _UrlRouteWrapper( - path, currentDomain == null ? true : currentDomain.contains(uri.host), path == '/' ? null : match); - } -} - -/// Simple helper class to keep route keys/params consistently named -class _RouterKeys { - static final accountId = 'accountId'; - static final accountNotificationId = 'accountNotificationId'; - static final announcementId = 'announcementId'; - static final assignmentId = 'assignmentId'; - static final authenticationProvider = 'authenticationProvider'; - static final pairingCode = 'pairing_code'; - static final calendarStart = 'view_start'; - static final calendarView = 'view_name'; - static final courseId = 'courseId'; - static final domain = 'domain'; - static final accountName = 'accountName'; - static final eventId = 'eventId'; - static final infoText = 'infoText'; - static final title = 'title'; - static final cookies = 'cookies'; - static final limitWebAccess = 'limitWebAccess'; - static final isCreatingAccount = 'isCreatingAccount'; - static final loginFlow = 'loginFlow'; - static final qrLoginUrl = 'qrLoginUrl'; - static final qrPairingInfo = 'qrPairingInfo'; - static final quizId = 'quizId'; - static final topicId = 'topicId'; - static final url = 'url'; // NOTE: This has to match MainActivity.kt in the Android code - -} - -/// Simple helper class to manage the repeated data extracted from a link to be routed -class _UrlRouteWrapper { - final String path; - final bool validHost; - final AppRouteMatch? appRouteMatch; - - _UrlRouteWrapper(this.path, this.validHost, this.appRouteMatch); -} diff --git a/apps/flutter_parent/lib/router/router_error_screen.dart b/apps/flutter_parent/lib/router/router_error_screen.dart deleted file mode 100644 index ca05fa58a2..0000000000 --- a/apps/flutter_parent/lib/router/router_error_screen.dart +++ /dev/null @@ -1,101 +0,0 @@ -/* - * Copyright (C) 2020 - present Instructure, Inc. - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, version 3 of the License. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -import 'package:flutter/material.dart'; -import 'package:flutter_parent/l10n/app_localizations.dart'; -import 'package:flutter_parent/network/utils/api_prefs.dart'; -import 'package:flutter_parent/parent_app.dart'; -import 'package:flutter_parent/router/panda_router.dart'; -import 'package:flutter_parent/utils/design/canvas_icons.dart'; -import 'package:flutter_parent/utils/design/parent_colors.dart'; -import 'package:flutter_parent/utils/design/parent_theme.dart'; -import 'package:flutter_parent/utils/features_utils.dart'; -import 'package:flutter_parent/utils/quick_nav.dart'; -import 'package:flutter_parent/utils/service_locator.dart'; -import 'package:flutter_parent/utils/url_launcher.dart'; - -/// Displays an error page for routes that we can handle internally but don't match the current domain -/// Could also be used for failed routes and other route related errors. -/// -/// _route -> is the url we attempted to route with, used to launch to a browser -class RouterErrorScreen extends StatelessWidget { - final String _route; - - RouterErrorScreen(this._route); - - @override - Widget build(BuildContext context) { - return Scaffold( - appBar: AppBar( - title: Text(L10n(context).routerErrorTitle), - ), - body: Column( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.stretch, - children: [ - Icon(CanvasIcons.warning, size: 40, color: ParentColors.failure), - Padding( - padding: const EdgeInsets.fromLTRB(48, 28, 48, 32), - child: Text( - L10n(context).routerErrorMessage, - textAlign: TextAlign.center, - style: Theme.of(context).textTheme.bodySmall?.copyWith(fontSize: 16), - ), - ), - Padding( - padding: const EdgeInsets.fromLTRB(48, 0, 48, 0), - child: TextButton( - onPressed: () { - locator().launch(_route); - }, - child: Text(L10n(context).openInBrowser, - style: Theme.of(context).textTheme.bodySmall?.copyWith(fontSize: 16)), - style: TextButton.styleFrom( - shape: RoundedRectangleBorder( - borderRadius: new BorderRadius.circular(4.0), - side: BorderSide(color: ParentColors.tiara), - ), - ), - ), - ), - SizedBox(height: 28), - Padding( - padding: const EdgeInsets.fromLTRB(48, 0, 48, 0), - child: TextButton( - onPressed: () { - _switchUsers(context); - }, - child: - Text(L10n(context).switchUsers, style: Theme.of(context).textTheme.bodySmall?.copyWith(fontSize: 16)), - style: TextButton.styleFrom( - shape: RoundedRectangleBorder( - borderRadius: new BorderRadius.circular(4.0), - side: BorderSide(color: ParentColors.tiara), - ), - ), - ), - ), - ]), - ); - } - - Future _switchUsers(BuildContext context) async { - await ParentTheme.of(context)?.setSelectedStudent(null); // TODO - Test this, do we need it here? - await ApiPrefs.performLogout(switchingLogins: true, app: ParentApp.of(context)); - await FeaturesUtils.performLogout(); - await locator().pushRouteAndClearStack(context, PandaRouter.login()); - } -} diff --git a/apps/flutter_parent/lib/screens/account_creation/account_creation_interactor.dart b/apps/flutter_parent/lib/screens/account_creation/account_creation_interactor.dart deleted file mode 100644 index e042eeba79..0000000000 --- a/apps/flutter_parent/lib/screens/account_creation/account_creation_interactor.dart +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Copyright (C) 2020 - present Instructure, Inc. - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, version 3 of the License. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -import 'package:dio/dio.dart'; -import 'package:flutter_parent/models/terms_of_service.dart'; -import 'package:flutter_parent/network/api/accounts_api.dart'; -import 'package:flutter_parent/utils/service_locator.dart'; -import 'package:flutter_parent/utils/url_launcher.dart'; - -class AccountCreationInteractor { - Future getToSForAccount(String accountId, String domain) { - return locator().getTermsOfServiceForAccount(accountId, domain); - } - - Future createNewAccount( - String accountId, String pairingCode, String fullname, String email, String password, String domain) { - return locator().createNewAccount(accountId, pairingCode, fullname, email, password, domain); - } - - launchDefaultToS() { - locator().launch('https://www.instructure.com/policies/terms-of-use-canvas/'); - } - - launchPrivacyPolicy() { - locator().launch('https://www.instructure.com/policies/product-privacy-policy'); - } -} diff --git a/apps/flutter_parent/lib/screens/account_creation/account_creation_screen.dart b/apps/flutter_parent/lib/screens/account_creation/account_creation_screen.dart deleted file mode 100644 index b4111ae745..0000000000 --- a/apps/flutter_parent/lib/screens/account_creation/account_creation_screen.dart +++ /dev/null @@ -1,482 +0,0 @@ -/* - * Copyright (C) 2020 - present Instructure, Inc. - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, version 3 of the License. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -import 'package:dio/dio.dart'; -import 'package:email_validator/email_validator.dart'; -import 'package:flutter/cupertino.dart'; -import 'package:flutter/gestures.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_parent/l10n/app_localizations.dart'; -import 'package:flutter_parent/models/terms_of_service.dart'; -import 'package:flutter_parent/network/utils/analytics.dart'; -import 'package:flutter_parent/router/panda_router.dart'; -import 'package:flutter_parent/screens/account_creation/account_creation_interactor.dart'; -import 'package:flutter_parent/utils/common_widgets/loading_indicator.dart'; -import 'package:flutter_parent/utils/design/canvas_icons.dart'; -import 'package:flutter_parent/utils/design/parent_colors.dart'; -import 'package:flutter_parent/utils/design/parent_theme.dart'; -import 'package:flutter_parent/utils/qr_utils.dart'; -import 'package:flutter_parent/utils/quick_nav.dart'; -import 'package:flutter_parent/utils/service_locator.dart'; -import 'package:flutter_svg/svg.dart'; - -class AccountCreationScreen extends StatefulWidget { - @visibleForTesting - static final GlobalKey accountCreationTextSpanKey = GlobalKey(); - - final QRPairingInfo pairingInfo; - - const AccountCreationScreen(this.pairingInfo, {super.key}); - - @override - _AccountCreationScreenState createState() => _AccountCreationScreenState(); -} - -class _AccountCreationScreenState extends State { - TextStyle _defaultSpanStyle = TextStyle(color: ParentColors.ash, fontSize: 14.0, fontWeight: FontWeight.normal); - TextStyle _linkSpanStyle = TextStyle(color: ParentColors.parentApp, fontSize: 14.0, fontWeight: FontWeight.normal); - - Future? _tosFuture; - - Future _getToS() { - return locator() - .getToSForAccount(widget.pairingInfo.accountId, widget.pairingInfo.domain); - } - - final FocusNode _nameFocus = FocusNode(); - final _nameController = TextEditingController(); - - final FocusNode _emailFocus = FocusNode(); - final _emailController = TextEditingController(); - String? _emailErrorText = null; - - final FocusNode _passwordFocus = FocusNode(); - final _passwordController = TextEditingController(); - - final _formKey = GlobalKey(); - final _scaffoldKey = GlobalKey(); - - bool _isLoading = false; - bool _obscurePassword = true; - - @override - Widget build(BuildContext context) { - if (_tosFuture == null) { - _tosFuture = _getToS(); - } - - return DefaultParentTheme( - builder: (context) => Scaffold( - key: _scaffoldKey, - body: SafeArea( - child: ListView( - padding: EdgeInsets.fromLTRB(16, 0, 16, 0), - children: [ - SizedBox(height: 64), - SvgPicture.asset( - 'assets/svg/canvas-parent-login-logo.svg', - semanticsLabel: L10n(context).canvasLogoLabel, - ), - SizedBox(height: 56), - _accountCreationForm(), - SizedBox(height: 16), - _createAccountTOS(), - SizedBox(height: 8), - _createAccountButton(), - SizedBox(height: 24), - _alreadyHaveAnAccount(), - SizedBox(height: 8), - ], - ), - )), - ); - } - - Widget _accountCreationForm() { - return Form( - key: _formKey, - child: Column( - children: [ - _formFieldLabel(L10n(context).qrCreateAccountLabelName), - _nameFormField(), - _formFieldLabel(L10n(context).qrCreateAccountLabelEmail), - _emailFormField(), - _formFieldLabel(L10n(context).qrCreateAccountLabelPassword), - _passwordFormField(), - ], - ), - ); - } - - Widget _formFieldLabel(String text) { - return Align( - alignment: Alignment.centerLeft, - child: Padding( - padding: const EdgeInsets.fromLTRB(0, 12, 0, 8), - child: Text(text, style: TextStyle(color: ParentColors.licorice, fontSize: 16, fontWeight: FontWeight.w500)), - )); - } - - Widget _nameFormField() { - return TextFormField( - focusNode: _nameFocus, - textInputAction: TextInputAction.next, - autocorrect: false, - controller: _nameController, - decoration: InputDecoration( - errorStyle: TextStyle(color: ParentColors.failure, fontSize: 14, fontWeight: FontWeight.w500), - errorBorder: OutlineInputBorder( - borderRadius: new BorderRadius.circular(4.0), - borderSide: new BorderSide(color: ParentColors.failure), - ), - hintText: L10n(context).qrCreateAccountHintName, - hintStyle: TextStyle(color: ParentColors.tiara, fontSize: 16, fontWeight: FontWeight.normal), - border: OutlineInputBorder( - borderRadius: new BorderRadius.circular(4.0), - borderSide: new BorderSide(), - )), - onFieldSubmitted: (term) { - _fieldFocusChange(_nameFocus, _emailFocus); - }, - validator: (value) { - if (value == null || value.isEmpty) { - return L10n(context).qrCreateAccountNameError; - } else { - return null; - } - }, - ); - } - - Widget _emailFormField() { - return TextFormField( - focusNode: _emailFocus, - keyboardType: TextInputType.emailAddress, - textInputAction: TextInputAction.next, - autocorrect: false, - controller: _emailController, - decoration: InputDecoration( - errorText: _emailErrorText, - errorStyle: TextStyle(color: ParentColors.failure, fontSize: 14, fontWeight: FontWeight.w500), - errorBorder: OutlineInputBorder( - borderRadius: new BorderRadius.circular(4.0), - borderSide: new BorderSide(color: ParentColors.failure), - ), - hintText: L10n(context).qrCreateAccountHintEmail, - hintStyle: TextStyle(color: ParentColors.tiara, fontSize: 16, fontWeight: FontWeight.normal), - border: OutlineInputBorder( - borderRadius: new BorderRadius.circular(4.0), - borderSide: new BorderSide(), - )), - onFieldSubmitted: (term) { - _fieldFocusChange(_emailFocus, _passwordFocus); - }, - validator: (value) => _validateEmail(value)); - } - - String? _validateEmail(String? value, {bool apiError = false}) { - if (apiError) { - return L10n(context).qrCreateAccountInvalidEmailError; - } else if (value == null || value.isEmpty) { - return L10n(context).qrCreateAccountEmailError; - } else if (!EmailValidator.validate(value)) { - return L10n(context).qrCreateAccountInvalidEmailError; - } else { - _emailErrorText = null; - return _emailErrorText; - } - } - - Widget _passwordFormField() { - return TextFormField( - focusNode: _passwordFocus, - obscureText: _obscurePassword, - autocorrect: false, - controller: _passwordController, - textInputAction: TextInputAction.done, - decoration: InputDecoration( - suffixIcon: GestureDetector( - child: _passwordIcon(_obscurePassword), - onTap: () { - setState(() { - if (_obscurePassword) { - _obscurePassword = false; - } else { - _obscurePassword = true; - } - }); - }, - ), - errorStyle: TextStyle(color: ParentColors.failure, fontSize: 14, fontWeight: FontWeight.w500), - errorBorder: OutlineInputBorder( - borderRadius: new BorderRadius.circular(4.0), - borderSide: new BorderSide(color: ParentColors.failure), - ), - hintText: L10n(context).qrCreateAccountHintPassword, - hintStyle: TextStyle(color: ParentColors.tiara, fontSize: 16, fontWeight: FontWeight.normal), - border: OutlineInputBorder( - borderRadius: new BorderRadius.circular(4.0), - borderSide: new BorderSide(), - )), - onFieldSubmitted: (term) { - _clearFieldFocus(); - _formKey.currentState?.validate(); - }, - validator: (value) { - if (value == null || value.isEmpty) { - return L10n(context).qrCreateAccountPasswordError; - } else if (value.length < 8) { - return L10n(context).qrCreateAccountPasswordLengthError; - } else { - return null; - } - }, - ); - } - - Widget _passwordIcon(bool obscurePassword) { - if (obscurePassword) { - return Icon(CanvasIcons.eye, semanticLabel: L10n(context).qrCreateAccountEyeSemantics); - } else { - return Padding( - padding: const EdgeInsets.fromLTRB(12, 10, 12, 10), - child: SvgPicture.asset( - 'assets/svg/eye_off.svg', - semanticsLabel: L10n(context).qrCreateAccountEyeOffSemantics, - ), - ); - } - } - - _fieldFocusChange(FocusNode currentFocus, FocusNode nextFocus) { - currentFocus.unfocus(); - FocusScope.of(context).requestFocus(nextFocus); - } - - _clearFieldFocus() { - _nameFocus.unfocus(); - _emailFocus.unfocus(); - _passwordFocus.unfocus(); - } - - Widget _createAccountTOS() { - return FutureBuilder( - future: _tosFuture, - builder: (context, AsyncSnapshot snapshot) { - if (snapshot.connectionState == ConnectionState.waiting) { - return Container(color: Theme.of(context).scaffoldBackgroundColor, child: LoadingIndicator()); - } - - if (snapshot.hasError || snapshot.data == null) { - return _getTosSpan(null); - } else { - var terms = snapshot.data; - if (terms == null || terms.passive) { - return _getPrivacyPolicySpan(); - } else { - return _getTosSpan(snapshot.data); - } - } - }); - } - - Widget _getPrivacyPolicySpan() { - return Align( - child: RichText( - text: TextSpan( - text: L10n(context).qrCreateAccountViewPrivacy, - style: _linkSpanStyle, - recognizer: TapGestureRecognizer() - ..onTap = () { - locator().launchPrivacyPolicy(); - }), - ), - ); - } - - TextSpan _getTosSpanHelper({required String text, required List inputSpans}) { - var indexedSpans = inputSpans.map((it) => MapEntry(text.indexOf(it.text!), it)).toList(); - indexedSpans.sort((a, b) => a.key.compareTo(b.key)); - - int index = 0; - List spans = []; - - for (var indexedSpan in indexedSpans) { - spans.add(TextSpan(text: text.substring(index, indexedSpan.key))); - spans.add(indexedSpan.value); - index = indexedSpan.key + indexedSpan.value.text!.length; - } - spans.add(TextSpan(text: text.substring(index))); - - return TextSpan(children: spans); - } - - Widget _getTosSpan(TermsOfService? terms) { - var termsOfService = L10n(context).qrCreateAccountTermsOfService; - var privacyPolicy = L10n(context).qrCreateAccountPrivacyPolicy; - var body = L10n(context).qrCreateAccountTos(termsOfService, privacyPolicy); - - return Center( - child: Text.rich( - _getTosSpanHelper(text: body, inputSpans: [ - TextSpan( - text: termsOfService, - style: _linkSpanStyle, - recognizer: TapGestureRecognizer() - ..onTap = () { - if (terms == null) { - locator().launchDefaultToS(); - } else { - locator().pushRoute( - context, - PandaRouter.termsOfUse( - accountId: widget.pairingInfo.accountId, domain: widget.pairingInfo.domain)); - } - }, - ), - TextSpan( - text: privacyPolicy, - style: _linkSpanStyle, - recognizer: TapGestureRecognizer() - ..onTap = () => locator().launchPrivacyPolicy()), - ]), - style: _defaultSpanStyle, - key: AccountCreationScreen.accountCreationTextSpanKey)); - } - - Widget _createAccountButton() { - return ButtonTheme( - child: ElevatedButton( - child: Padding( - padding: const EdgeInsets.all(16.0), - child: _isLoading - ? Center(child: CircularProgressIndicator(valueColor: AlwaysStoppedAnimation(Colors.white))) - : Text( - L10n(context).qrCreateAccount, - style: Theme.of(context).textTheme.titleMedium?.copyWith(fontSize: 16, color: Colors.white), - ), - ), - style: ElevatedButton.styleFrom( - backgroundColor: Theme.of(context).colorScheme.secondary, - foregroundColor: Colors.white, - shape: RoundedRectangleBorder(borderRadius: BorderRadius.all(Radius.circular(4))), - ), - onPressed: () { - if (!_isLoading) _handleCreateAccount(); - }, - ), - ); - } - - Widget _alreadyHaveAnAccount() { - // Since this one is always alone, the touch target size has been boosted - return GestureDetector( - onTap: () => locator().pushRoute(context, PandaRouter.loginWeb(widget.pairingInfo.domain)), - child: Padding( - padding: const EdgeInsets.fromLTRB(0, 14, 0, 14), - child: ConstrainedBox( - constraints: BoxConstraints(minHeight: 48), - child: Center( - child: RichText( - text: TextSpan( - style: _defaultSpanStyle, - children: [ - TextSpan(text: L10n(context).qrCreateAccountSignIn1), - TextSpan(text: L10n(context).qrCreateAccountSignIn2, style: _linkSpanStyle) - ], - ), - ), - ), - ), - ), - ); - } - - void _handleCreateAccount() async { - if (_formKey.currentState?.validate() == true) { - setState(() => _isLoading = true); - try { - var response = await locator().createNewAccount( - widget.pairingInfo.accountId, - widget.pairingInfo.code, - _nameController.text, - _emailController.text, - _passwordController.text, - widget.pairingInfo.domain); - - if (response.statusCode == 200) { - setState(() => _isLoading = false); - - locator().logEvent( - AnalyticsEventConstants.QR_ACCOUNT_SUCCESS, - extras: {AnalyticsParamConstants.DOMAIN_PARAM: widget.pairingInfo.domain}, - ); - - // Route them to the login page with their domain - locator().pushRoute(context, PandaRouter.loginWeb(widget.pairingInfo.domain)); - } - } catch (e) { - setState(() => _isLoading = false); - - locator().logEvent( - AnalyticsEventConstants.QR_ACCOUNT_FAILURE, - extras: {AnalyticsParamConstants.DOMAIN_PARAM: widget.pairingInfo.domain}, - ); - - if (e is DioError) { - _handleDioError(e); - } else { - ScaffoldMessenger.of(context).showSnackBar( - SnackBar(content: Text(L10n(context).unexpectedError)), - ); - } - } - } - } - - _handleDioError(DioError e) { - String emailError = ''; - String pairingError = ''; - try { - emailError = e.response?.data['errors']['user']['pseudonyms'][0]['message']; - if (emailError.isNotEmpty) { - setState(() { - _emailErrorText = _validateEmail('', apiError: true); - }); - } - } catch (e) { - // If we catch it means the error isn't present - } - - try { - pairingError = e.response?.data['errors']['pairing_code']['code'][0]['message']; - if (pairingError.isNotEmpty) { - ScaffoldMessenger.of(context).showSnackBar( - SnackBar(content: Text(L10n(context).errorPairingFailed)), - ); - } - } catch (e) { - // If we catch it means the error isn't present - } - - if (pairingError.isEmpty && emailError.isEmpty) { - // Show generic error case - ScaffoldMessenger.of(context).showSnackBar( - SnackBar(content: Text(L10n(context).errorGenericPairingFailed)), - ); - } - } -} diff --git a/apps/flutter_parent/lib/screens/alert_thresholds/alert_thresholds_extensions.dart b/apps/flutter_parent/lib/screens/alert_thresholds/alert_thresholds_extensions.dart deleted file mode 100644 index 5d84a00c8d..0000000000 --- a/apps/flutter_parent/lib/screens/alert_thresholds/alert_thresholds_extensions.dart +++ /dev/null @@ -1,79 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:flutter/material.dart'; -import 'package:flutter_parent/l10n/app_localizations.dart'; -import 'package:flutter_parent/models/alert.dart'; -import 'package:flutter_parent/models/alert_threshold.dart'; - -extension GetTitleFromAlert on AlertType { - String getTitle(BuildContext context) { - String title; - switch (this) { - case AlertType.courseGradeLow: - title = L10n(context).courseGradeBelow; - break; - case AlertType.courseGradeHigh: - title = L10n(context).courseGradeAbove; - break; - case AlertType.assignmentGradeLow: - title = L10n(context).assignmentGradeBelow; - break; - case AlertType.assignmentGradeHigh: - title = L10n(context).assignmentGradeAbove; - break; - case AlertType.assignmentMissing: - title = L10n(context).assignmentMissing; - break; - case AlertType.courseAnnouncement: - title = L10n(context).courseAnnouncements; - break; - case AlertType.institutionAnnouncement: - title = L10n(context).globalAnnouncements; - break; - default: - title = L10n(context).unexpectedError; - } - return title; - } -} - -extension GetThresholdFromType on List? { - AlertThreshold? getThreshold(AlertType type) { - var index = this?.indexWhere((threshold) => threshold?.alertType == type); - if (index == null || index == -1) - return null; - else - return this?[index]; - } -} - -extension GetThresholdMinMax on AlertType { - List getMinMax(List? thresholds) { - String? max; - String? min; - - if (this == AlertType.courseGradeLow) { - max = thresholds.getThreshold(AlertType.courseGradeHigh)?.threshold; - } else if (this == AlertType.courseGradeHigh) { - min = thresholds.getThreshold(AlertType.courseGradeLow)?.threshold; - } else if (this == AlertType.assignmentGradeLow) { - max = thresholds.getThreshold(AlertType.assignmentGradeHigh)?.threshold; - } else if (this == AlertType.assignmentGradeHigh) { - min = thresholds.getThreshold(AlertType.assignmentGradeLow)?.threshold; - } - - return [min, max]; - } -} diff --git a/apps/flutter_parent/lib/screens/alert_thresholds/alert_thresholds_interactor.dart b/apps/flutter_parent/lib/screens/alert_thresholds/alert_thresholds_interactor.dart deleted file mode 100644 index 40c544d385..0000000000 --- a/apps/flutter_parent/lib/screens/alert_thresholds/alert_thresholds_interactor.dart +++ /dev/null @@ -1,59 +0,0 @@ -// Copyright (C) 2019 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:flutter_parent/models/alert.dart'; -import 'package:flutter_parent/models/alert_threshold.dart'; -import 'package:flutter_parent/network/api/alert_api.dart'; -import 'package:flutter_parent/network/api/enrollments_api.dart'; -import 'package:flutter_parent/utils/service_locator.dart'; - -class AlertThresholdsInteractor { - Future?> getAlertThresholdsForStudent(String studentId, {bool forceRefresh = true}) async { - return locator().getAlertThresholds(studentId, forceRefresh); - } - - /// - /// Switches are created when turned on - /// Switches disable/delete when [threshold] is null - /// - /// Percentages disable/delete when [value] is '-1' - /// [value] is only used when creating percentages - /// - /// - Future updateAlertThreshold(AlertType type, String studentId, AlertThreshold? threshold, - {String? value}) { - var api = locator(); - if (type.isSwitch()) { - if (threshold == null) { - // Create threshold, effectively putting it into the 'on' state - return api.createThreshold(type, studentId); - } else { - // Delete switch threshold, effectively putting it into the 'off' state - return api.deleteAlert(threshold); - } - } else { - // For the percentage thresholds - if (value != '-1') { - // Create/update the threshold - return api.createThreshold(type, studentId, value: value); - } else - // Disable the threshold - return api.deleteAlert(threshold!); - } - } - - Future deleteStudent(String studentId) => locator().unpairStudent(studentId); - - Future canDeleteStudent(String studentId) => locator().canUnpairStudent(studentId); -} diff --git a/apps/flutter_parent/lib/screens/alert_thresholds/alert_thresholds_percentage_dialog.dart b/apps/flutter_parent/lib/screens/alert_thresholds/alert_thresholds_percentage_dialog.dart deleted file mode 100644 index 184f345913..0000000000 --- a/apps/flutter_parent/lib/screens/alert_thresholds/alert_thresholds_percentage_dialog.dart +++ /dev/null @@ -1,217 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:flutter/material.dart'; -import 'package:flutter/services.dart'; -import 'package:flutter_parent/l10n/app_localizations.dart'; -import 'package:flutter_parent/models/alert.dart'; -import 'package:flutter_parent/models/alert_threshold.dart'; -import 'package:flutter_parent/screens/alert_thresholds/alert_thresholds_extensions.dart'; -import 'package:flutter_parent/screens/alert_thresholds/alert_thresholds_interactor.dart'; -import 'package:flutter_parent/utils/common_widgets/arrow_aware_focus_scope.dart'; -import 'package:flutter_parent/utils/design/parent_colors.dart'; -import 'package:flutter_parent/utils/design/parent_theme.dart'; -import 'package:flutter_parent/utils/service_locator.dart'; - -class AlertThresholdsPercentageDialog extends StatefulWidget { - final AlertType _alertType; - final List? thresholds; - final String _studentId; - - AlertThresholdsPercentageDialog(this.thresholds, this._alertType, this._studentId); - - @override - State createState() => AlertThresholdsPercentageDialogState(); -} - -class AlertThresholdsPercentageDialogState extends State { - bool _disableButtons = false; - AlertThreshold? _threshold; - bool _networkError = false; - bool _neverClicked = false; - - String? maxValue; - String? minValue; - - final int _disabledAlpha = 90; - - static final UniqueKey okButtonKey = UniqueKey(); // For testing - - String? errorMsg; - - final GlobalKey _formKey = GlobalKey(); - - FocusScopeNode _focusScopeNode = FocusScopeNode(); - - @override - void initState() { - _threshold = widget.thresholds.getThreshold(widget._alertType); - - var values = widget._alertType.getMinMax(widget.thresholds); - minValue = values[0]; - maxValue = values[1]; - - super.initState(); - } - - @override - void dispose() { - _focusScopeNode.dispose(); - super.dispose(); - } - - @override - Widget build(BuildContext context) { - return DefaultParentTheme( - builder: (context) => ArrowAwareFocusScope( - node: _focusScopeNode, - child: AlertDialog( - scrollable: true, - shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8.0)), - title: Text(widget._alertType.getTitle(context)), - content: TextFormField( - key: _formKey, - autofocus: true, - autovalidateMode: AutovalidateMode.always, - keyboardType: TextInputType.number, - initialValue: _threshold?.threshold, - maxLength: 3, - buildCounter: (_, {required currentLength, maxLength, required isFocused}) => null, // Don't show the counter - inputFormatters: [ - // Only accept numbers, no other characters (including '-') - FilteringTextInputFormatter.deny(RegExp('[^0-9]')), - ], - onChanged: (input) { - errorMsg = null; - // Check if we had a network error - if (input.isEmpty) { - // Don't validate when there's no input (no error) - errorMsg = null; - } else { - var inputParsed = int.tryParse(input); - var maxParsed = maxValue != null ? int.tryParse(maxValue!) ?? 100 : 100; - var minParsed = minValue != null ? int.tryParse(minValue!) ?? 0 : 0; - - if (inputParsed != null) { - if (maxParsed == 100 && inputParsed > 100) { - errorMsg = L10n(context).mustBeBelow100; - } else if (maxParsed != 100 && inputParsed >= maxParsed) { - errorMsg = L10n(context).mustBeBelowN(maxParsed); - } else if (inputParsed <= minParsed) { - errorMsg = L10n(context).mustBeAboveN(minParsed); - } - } - } - - setState(() { - if (errorMsg != null) { - // We had an error, disable the buttons - _disableButtons = true; - } else { - _disableButtons = false; - } - }); - }, - validator: (input) { - if (_networkError) { - errorMsg = L10n(context).genericNetworkError; - } - return errorMsg; - }, - onSaved: (input) async { - // Don't do anything if there are existing validation errors and the user didn't click 'Never' - if (_formKey.currentState?.validate() == false && !_neverClicked) return; - - if (_threshold == null && (input == null || input.isEmpty)) { - // Threshold is already disabled - Navigator.of(context).pop(null); - } - - _showNetworkError(false); - - var result = await locator() - .updateAlertThreshold(widget._alertType, widget._studentId, _threshold, - value: ((input == null || input.isNotEmpty) && !_neverClicked) ? input : '-1') - .catchError((_) => null); - - if (result != null) { - // Threshold was updated/deleted successfully - if (input == null || input.isEmpty || _neverClicked) { - // Deleted a threshold - Navigator.of(context).pop(_threshold?.rebuild((b) => b.threshold = '-1')); - } else { - // Updated a threshold - Navigator.of(context).pop(result); - } - } else { - // There was a network error - _showNetworkError(true); - } - - _neverClicked = false; - }, - onFieldSubmitted: (input) async { - _formKey.currentState?.save(); - }, - decoration: InputDecoration( - hintText: L10n(context).gradePercentage, - hintStyle: TextStyle(color: ParentColors.ash), - contentPadding: EdgeInsets.only(bottom: 2), - ), - ), - actions: [ - TextButton( - child: Text(L10n(context).cancel.toUpperCase()), - style: TextButton.styleFrom(disabledForegroundColor: ParentColors.parentApp.withAlpha(_disabledAlpha)), - onPressed: () { - Navigator.of(context).pop(null); - }), - TextButton( - child: Text(L10n(context).never.toUpperCase()), - style: TextButton.styleFrom(disabledForegroundColor: ParentColors.parentApp.withAlpha(_disabledAlpha)), - onPressed: () async { - if (_threshold == null) { - // Threshold is already disabled - Navigator.of(context).pop(null); - return; - } - _threshold = _threshold?.rebuild((b) => b.threshold = '-1'); - _neverClicked = true; - _showNetworkError(false); - _formKey.currentState?.save(); - }), - TextButton( - key: okButtonKey, - child: Text(L10n(context).ok), - style: TextButton.styleFrom(disabledForegroundColor: ParentColors.parentApp.withAlpha(_disabledAlpha)), - onPressed: _disableButtons - ? null - : () async { - _showNetworkError(false); - _formKey.currentState?.save(); - }, - ), - ], - ), - ), - ); - } - - void _showNetworkError(bool show) { - _formKey.currentState?.validate(); - setState(() { - _networkError = show; - }); - } -} diff --git a/apps/flutter_parent/lib/screens/alert_thresholds/alert_thresholds_screen.dart b/apps/flutter_parent/lib/screens/alert_thresholds/alert_thresholds_screen.dart deleted file mode 100644 index 1071d778e3..0000000000 --- a/apps/flutter_parent/lib/screens/alert_thresholds/alert_thresholds_screen.dart +++ /dev/null @@ -1,346 +0,0 @@ -// Copyright (C) 2019 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:flutter/material.dart'; -import 'package:flutter_parent/l10n/app_localizations.dart'; -import 'package:flutter_parent/models/alert.dart'; -import 'package:flutter_parent/models/alert_threshold.dart'; -import 'package:flutter_parent/models/user.dart'; -import 'package:flutter_parent/screens/alert_thresholds/alert_thresholds_interactor.dart'; -import 'package:flutter_parent/utils/common_widgets/avatar.dart'; -import 'package:flutter_parent/utils/common_widgets/error_panda_widget.dart'; -import 'package:flutter_parent/utils/common_widgets/loading_indicator.dart'; -import 'package:flutter_parent/utils/common_widgets/user_name.dart'; -import 'package:flutter_parent/utils/design/parent_colors.dart'; -import 'package:flutter_parent/utils/design/parent_theme.dart'; -import 'package:flutter_parent/utils/design/student_color_set.dart'; -import 'package:flutter_parent/utils/service_locator.dart'; -import 'package:intl/intl.dart'; - -import 'alert_thresholds_extensions.dart'; -import 'alert_thresholds_percentage_dialog.dart'; - -class AlertThresholdsScreen extends StatefulWidget { - final User _student; - - AlertThresholdsScreen(this._student); - - @override - State createState() => AlertThresholdsState(); -} - -class AlertThresholdsState extends State { - late Future?> _thresholdsFuture; - late Future _canDeleteStudentFuture; - - Future?> _loadThresholds() => - locator().getAlertThresholdsForStudent(widget._student.id); - List? _thresholds = []; - - @override - void initState() { - _thresholdsFuture = _loadThresholds(); - _canDeleteStudentFuture = locator().canDeleteStudent(widget._student.id); - super.initState(); - } - - @override - Widget build(BuildContext context) { - return DefaultParentTheme( - useNonPrimaryAppBar: false, - builder: (context) => Scaffold( - appBar: AppBar( - title: Text(L10n(context).alertSettings), - bottom: ParentTheme.of(context)?.appBarDivider(), - actions: [_deleteOption()], - ), - body: FutureBuilder( - future: _thresholdsFuture, - builder: (context, AsyncSnapshot?> snapshot) { - Widget view; - if (snapshot.hasError) { - view = _error(context); - } else if (snapshot.connectionState == ConnectionState.waiting) { - view = LoadingIndicator(); - } else { - if (snapshot.hasData) { - _thresholds = snapshot.data!; - } - view = _body(); - } - return view; - }, - ), - ), - ); - } - - Widget _deleteOption() { - return FutureBuilder( - future: _canDeleteStudentFuture, - builder: (context, snapshot) { - if (snapshot.data != true) return Container(); - return PopupMenuButton( - key: Key('overflow-menu'), - onSelected: (_) { - showDeleteDialog(context); - }, - itemBuilder: (_) => [PopupMenuItem(value: 0, child: Text(L10n(context).delete))], - ); - }, - ); - } - - void showDeleteDialog(BuildContext context) { - bool busy = false; - bool error = false; - showDialog( - context: context, - barrierDismissible: false, - builder: (_) { - return StatefulBuilder( - builder: (BuildContext context, void Function(void Function()) setState) { - return AlertDialog( - title: Text(L10n(context).delete), - content: Column( - mainAxisSize: MainAxisSize.min, - children: [ - Text(L10n(context).confirmDeleteStudentMessage), - if (error) - Padding( - padding: const EdgeInsets.only(top: 16), - child: Text( - L10n(context).deleteStudentFailure, - style: Theme.of(context).textTheme.bodyLarge?.copyWith(color: ParentColors.failure), - ), - ) - ], - ), - actions: [ - if (!busy) - TextButton( - child: Text(L10n(context).cancel.toUpperCase()), - onPressed: () => Navigator.of(context).pop() - ), - if (!busy) - TextButton( - child: Text(L10n(context).delete.toUpperCase()), - onPressed: () async { - setState(() { - busy = true; - error = false; - }); - var success = await locator().deleteStudent(widget._student.id); - if (success) { - // Pop dialog - Navigator.of(context).pop(); - // Pop screen with 'true' so ManageStudentScreen knows to refresh itself - Navigator.of(context).pop(true); - } else { - setState(() { - busy = false; - error = true; - }); - } - }, - ), - if (busy) - Padding( - padding: const EdgeInsets.all(16), - child: Container(width: 16, height: 16, child: CircularProgressIndicator(strokeWidth: 2)), - ), - ], - ); - }, - ); - }, - ); - } - - Widget _body() { - return Column( - children: [ - SizedBox( - height: 16, - ), - ListTile( - leading: Avatar.fromUser( - widget._student, - radius: 26, - ), - title: UserName.fromUser( - widget._student, - style: Theme.of(context).textTheme.titleMedium, - ), - ), - SizedBox( - height: 12, - ), - Container( - alignment: Alignment.centerLeft, - child: Padding( - padding: const EdgeInsets.symmetric( - horizontal: 16, - vertical: 6, - ), - child: Text( - L10n(context).alertMeWhen, - style: Theme.of(context).textTheme.bodyMedium, - ), - )), - Expanded( - child: SingleChildScrollView( - child: _thresholdWidgetList(), - ), - ) - ], - ); - } - - Widget _thresholdWidgetList() { - return Column( - children: [ - _generateAlertThresholdTile(AlertType.courseGradeLow), - _generateAlertThresholdTile(AlertType.courseGradeHigh), - _generateAlertThresholdTile(AlertType.assignmentMissing), - _generateAlertThresholdTile(AlertType.assignmentGradeLow), - _generateAlertThresholdTile(AlertType.assignmentGradeHigh), - _generateAlertThresholdTile(AlertType.courseAnnouncement), - _generateAlertThresholdTile(AlertType.institutionAnnouncement), - ], - ); - } - - Widget _error(BuildContext context) { - return ErrorPandaWidget(L10n(context).alertThresholdsLoadingError, () { - setState(() { - _thresholdsFuture = _loadThresholds(); - }); - }); - } - - Widget _generateAlertThresholdTile(AlertType type) => type.isPercentage() ? _percentageTile(type) : _switchTile(type); - - Widget _percentageTile(AlertType type) { - int? value = int.tryParse(_thresholds?.getThreshold(type)?.threshold ?? ''); - return ListTile( - title: Text( - type.getTitle(context), - style: Theme.of(context).textTheme.titleMedium, - ), - trailing: Text( - value != null ? NumberFormat.percentPattern().format(value / 100) : L10n(context).never, - style: Theme.of(context).textTheme.titleMedium?.copyWith(color: StudentColorSet.electric.light), - ), - onTap: () async { - AlertThreshold? update = await showDialog( - context: context, builder: (context) => AlertThresholdsPercentageDialog(_thresholds, type, widget._student.id)); - - if (update == null) { - // User hit cancel - do nothing - return; - } - - // Grab the index of the threshold, if it exists - var idx = _thresholds?.indexWhere((threshold) => threshold?.alertType == type); - - // Update the UI - setState(() { - if (update.threshold != '-1') { - // Threshold was created or updated - if (idx == null || idx == -1) { - // Threshold got created - _thresholds?.add(update); - } else { - // Existing threshold was updated - _thresholds?[idx] = update; - } - } else { - // Threshold was either deleted or left at 'never' - if (idx != null && idx != -1) { - // Threshold exists but was deleted - _thresholds?.removeAt(idx); - } - } - }); - }, - ); - } - - Widget _switchTile(AlertType type) { - AlertThreshold? threshold = _thresholds?.getThreshold(type); - bool value = threshold != null; - return _TalkbackSwitchTile( - title: type.getTitle(context), - initValue: value, - onChange: (changed) { - _updateThreshold(type, threshold); - }, - ); - } - - Future _updateThreshold(AlertType type, AlertThreshold? threshold) async { - var update = await locator().updateAlertThreshold(type, widget._student.id, threshold); - - // Grab the index of the threshold, if it exists - var idx = _thresholds?.indexWhere((t) => t?.alertType == type); - setState(() { - if (idx == null || idx == -1) { - // Threshold got created - _thresholds?.add(update); - } else { - // Existing threshold was deleted - _thresholds?[idx] = null; - } - }); - } -} - -/// Create a switch tile that can set it's state to have talkback read correctly. Having onChanged be a future seems to -/// update the value too late for talkback, so it reads the previous value. -class _TalkbackSwitchTile extends StatefulWidget { - final String title; - final bool? initValue; - final ValueChanged onChange; - - const _TalkbackSwitchTile({required this.title, this.initValue, required this.onChange, super.key}); - - @override - _TalkbackSwitchTileState createState() => _TalkbackSwitchTileState(); -} - -class _TalkbackSwitchTileState extends State<_TalkbackSwitchTile> { - late bool _value; - - @override - void initState() { - _value = widget.initValue ?? false; - super.initState(); - } - - @override - Widget build(BuildContext context) { - return SwitchListTile( - title: Text(widget.title, style: Theme.of(context).textTheme.titleMedium), - value: _value, - contentPadding: const EdgeInsets.fromLTRB(16, 0, 7, 0), - onChanged: (bool state) { - setState(() { - _value = state; - }); - widget.onChange(state); - }, - ); - } -} diff --git a/apps/flutter_parent/lib/screens/alerts/alerts_interactor.dart b/apps/flutter_parent/lib/screens/alerts/alerts_interactor.dart deleted file mode 100644 index 303a2a0b8c..0000000000 --- a/apps/flutter_parent/lib/screens/alerts/alerts_interactor.dart +++ /dev/null @@ -1,57 +0,0 @@ -// Copyright (C) 2019 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:flutter_parent/models/alert.dart'; -import 'package:flutter_parent/models/alert_threshold.dart'; -import 'package:flutter_parent/network/api/alert_api.dart'; -import 'package:flutter_parent/screens/dashboard/alert_notifier.dart'; -import 'package:flutter_parent/utils/alert_helper.dart'; -import 'package:flutter_parent/utils/service_locator.dart'; - -class AlertsInteractor { - Future getAlertsForStudent(String studentId, bool forceRefresh) async { - final alertsFuture = _alertsApi().getAlertsDepaginated(studentId, forceRefresh)?.then((List? list) async { - return locator().filterAlerts(list); - }).then((list) => list - ?..sort((a, b) { - if (a.actionDate == null && b.actionDate == null) return 0; - if (a.actionDate == null && b.actionDate != null) return -1; - if (a.actionDate != null && b.actionDate == null) return 1; - return b.actionDate!.compareTo(a.actionDate!); - })); - - final thresholdsFuture = _alertsApi().getAlertThresholds(studentId, forceRefresh); - - // If forcing a refresh, also update the alert count - if (forceRefresh) locator().update(studentId); - return AlertsList(await alertsFuture, await thresholdsFuture); - } - - Future markAlertRead(String studentId, String alertId) { - return _alertsApi().updateAlertWorkflow(studentId, alertId, AlertWorkflowState.read.name); - } - - Future markAlertDismissed(String studentId, String alertId) { - return _alertsApi().updateAlertWorkflow(studentId, alertId, AlertWorkflowState.dismissed.name); - } - - AlertsApi _alertsApi() => locator(); -} - -class AlertsList { - final List? alerts; - final List? thresholds; - - AlertsList(this.alerts, this.thresholds); -} diff --git a/apps/flutter_parent/lib/screens/alerts/alerts_screen.dart b/apps/flutter_parent/lib/screens/alerts/alerts_screen.dart deleted file mode 100644 index d8ff0af4b1..0000000000 --- a/apps/flutter_parent/lib/screens/alerts/alerts_screen.dart +++ /dev/null @@ -1,301 +0,0 @@ -// Copyright (C) 2019 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:flutter/material.dart'; -import 'package:flutter_parent/l10n/app_localizations.dart'; -import 'package:flutter_parent/models/alert.dart'; -import 'package:flutter_parent/models/user.dart'; -import 'package:flutter_parent/router/panda_router.dart'; -import 'package:flutter_parent/screens/alert_thresholds/alert_thresholds_extensions.dart'; -import 'package:flutter_parent/screens/alerts/alerts_interactor.dart'; -import 'package:flutter_parent/screens/dashboard/alert_notifier.dart'; -import 'package:flutter_parent/screens/dashboard/selected_student_notifier.dart'; -import 'package:flutter_parent/utils/common_widgets/badges.dart'; -import 'package:flutter_parent/utils/common_widgets/empty_panda_widget.dart'; -import 'package:flutter_parent/utils/common_widgets/full_screen_scroll_container.dart'; -import 'package:flutter_parent/utils/common_widgets/loading_indicator.dart'; -import 'package:flutter_parent/utils/core_extensions/date_time_extensions.dart'; -import 'package:flutter_parent/utils/design/canvas_icons.dart'; -import 'package:flutter_parent/utils/design/parent_colors.dart'; -import 'package:flutter_parent/utils/design/parent_theme.dart'; -import 'package:flutter_parent/utils/quick_nav.dart'; -import 'package:flutter_parent/utils/service_locator.dart'; -import 'package:provider/provider.dart'; - -class AlertsScreen extends StatefulWidget { - final _interactor = locator(); - - @override - _AlertsScreenState createState() => _AlertsScreenState(); -} - -class _AlertsScreenState extends State { - Future? _alertsFuture; - late User _student; - - Future _loadAlerts({bool forceRefresh = false}) => - widget._interactor.getAlertsForStudent(_student.id, forceRefresh); - - GlobalKey _refreshKey = GlobalKey(); - - @override - void didChangeDependencies() { - super.didChangeDependencies(); - var _selectedStudent = Provider.of(context, listen: true).value!; - if (_alertsFuture == null) { - // First time - _student = _selectedStudent; - _alertsFuture = _loadAlerts(); - } - - if (_student != _selectedStudent) { - // The student was changed by the user, get the new alerts - _student = _selectedStudent; - _alertsFuture = _loadAlerts(forceRefresh: true); - } - } - - @override - Widget build(BuildContext context) { - return FutureBuilder( - key: _refreshKey, - future: _alertsFuture, - builder: (context, AsyncSnapshot snapshot) { - // Show loading if we're waiting for data, not inside the refresh indicator as it's unnecessary - if (snapshot.connectionState == ConnectionState.waiting) { - return LoadingIndicator(); - } - - // Get the child widget to show in the refresh indicator - Widget child; - if (snapshot.hasError) { - child = _error(context); - } else { - child = _AlertsList(_student, snapshot.data); - } - - return RefreshIndicator( - onRefresh: () async { - _alertsFuture = _loadAlerts(forceRefresh: true); - setState(() {}); - await _alertsFuture; - }, - child: child, - ); - }, - ); - } - - Widget _error(BuildContext context) { - return FullScreenScrollContainer(children: [Text(L10n(context).unexpectedError)]); - } -} - -/// A helper widget to handle updating read status of alerts, and displaying as a list -class _AlertsList extends StatefulWidget { - final _interactor = locator(); - final AlertsList? _data; - final User _student; - - _AlertsList(this._student, this._data, {super.key}); - - @override - __AlertsListState createState() => __AlertsListState(); -} - -class __AlertsListState extends State<_AlertsList> { - GlobalKey _listKey = GlobalKey(); - AlertsList? _data; - - @override - void initState() { - super.initState(); - _data = widget._data; - } - - @override - Widget build(BuildContext context) { - if (_data == null || _data?.alerts == null || _data?.alerts?.isEmpty == true) { - return _empty(context); - } else { - return AnimatedList( - key: _listKey, - initialItemCount: _data!.alerts!.length, - itemBuilder: (context, index, animation) => _alertTile(context, _data!.alerts![index], index), - ); - } - } - - Widget _alertTile(BuildContext context, Alert alert, int index, {Animation? animation = null}) { - final textTheme = Theme.of(context).textTheme; - final alertColor = _alertColor(context, alert); - Widget tile = InkWell( - onTap: () => _routeAlert(alert, index), - child: Row( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - SizedBox(width: 18), - Padding( - padding: const EdgeInsets.only(top: 12), - child: Icon(_alertIcon(alert), color: alertColor, size: 20), - ), - SizedBox(width: 34), - Expanded( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - SizedBox(height: 16), - Text(_alertTitle(context, alert), style: textTheme.titleSmall?.copyWith(color: alertColor)), - SizedBox(height: 4), - Text(alert.title, style: textTheme.titleMedium), - SizedBox(height: 4), - Text(_formatDate(context, alert.actionDate!) ?? '', style: textTheme.titleSmall), - SizedBox(height: 12), - ], - ), - ), - SizedBox(width: 16), - IconButton( - tooltip: L10n(context).dismissAlertLabel(alert.title), - color: ParentColors.ash, - padding: EdgeInsets.all(0), // No extra padding, we're already padded enough with min touch size - icon: Icon(Icons.clear, size: 20), - onPressed: () => _dismissAlert(alert), - ), - ], - ), - ); - - if (alert.workflowState == AlertWorkflowState.unread) { - tile = WidgetBadge(tile); - } - - if (animation != null) { - tile = SizeTransition( - sizeFactor: animation as Animation, - axis: Axis.vertical, - child: tile, - ); - } - - return tile; - } - - /// Utilities - - Widget _empty(BuildContext context) { - return EmptyPandaWidget( - svgPath: 'assets/svg/panda-no-alerts.svg', - title: L10n(context).noAlertsTitle, - subtitle: L10n(context).noAlertsMessage, - ); - } - - IconData _alertIcon(Alert alert) { - if (alert.lockedForUser) return CanvasIcons.lock; - if (alert.isAlertInfo() || alert.isAlertPositive()) return CanvasIcons.info; - if (alert.isAlertNegative()) return CanvasIcons.warning; - - return CanvasIcons.warning; - } - - Color _alertColor(BuildContext context, Alert alert) { - if (alert.isAlertInfo()) return ParentColors.ash; - if (alert.isAlertPositive()) return ParentTheme.of(context)!.defaultTheme.colorScheme.secondary; - if (alert.isAlertNegative()) return ParentColors.failure; - - return ParentColors.failure; - } - - String _alertTitle(BuildContext context, Alert alert) { - final l10n = L10n(context); - final threshold = _data?.thresholds?.getThreshold(alert.alertType)?.threshold ?? ''; - String title = ''; - switch (alert.alertType) { - case AlertType.institutionAnnouncement: - title = l10n.globalAnnouncement; - break; - case AlertType.courseAnnouncement: - title = l10n.courseAnnouncement; - break; - case AlertType.assignmentMissing: - title = l10n.assignmentMissing; - break; - case AlertType.courseGradeHigh: - title = l10n.courseGradeAboveThreshold(threshold); - break; - case AlertType.courseGradeLow: - title = l10n.courseGradeBelowThreshold(threshold); - break; - case AlertType.assignmentGradeHigh: - title = l10n.assignmentGradeAboveThreshold(threshold); - break; - case AlertType.assignmentGradeLow: - title = l10n.assignmentGradeBelowThreshold(threshold); - break; - } - - if (alert.lockedForUser) { - title = '$title • ${L10n(context).lockedForUserTitle}'; - } - return title; - } - - String? _formatDate(BuildContext context, DateTime date) { - return date.l10nFormat(L10n(context).dateAtTime); - } - - void _routeAlert(Alert alert, int index) async { - if (alert.lockedForUser) { - final snackBar = SnackBar(content: Text(L10n(context).lockedForUserError)); - ScaffoldMessenger.of(context).showSnackBar(snackBar); - } else { - if (alert.alertType == AlertType.institutionAnnouncement) { - locator().pushRoute(context, - PandaRouter.institutionAnnouncementDetails(alert.contextId)); - } else { - locator().routeInternally(context, alert.htmlUrl); - } - - // We're done if the alert was already read, otherwise mark it read - if (alert.workflowState == AlertWorkflowState.read) return; - - final readAlert = await widget._interactor.markAlertRead( - widget._student.id, alert.id); - setState(() => _data!.alerts!.setRange(index, index + 1, [readAlert!])); - locator().update(widget._student.id); - } - } - - void _dismissAlert(Alert alert) async { - _markAlertDismissed(alert); - - int itemIndex = _data!.alerts!.indexOf(alert); - - _listKey.currentState?.removeItem( - itemIndex, (context, animation) => _alertTile(context, alert, itemIndex, animation: animation), - duration: const Duration(milliseconds: 200)); - - setState(() => _data!.alerts!.remove(alert)); - } - - void _markAlertDismissed(Alert alert) async { - await widget._interactor.markAlertDismissed(widget._student.id, alert.id); - - // Update the unread count if the alert was unread - if (alert.workflowState == AlertWorkflowState.unread) { - locator().update(widget._student.id); - } - } -} diff --git a/apps/flutter_parent/lib/screens/announcements/announcement_details_interactor.dart b/apps/flutter_parent/lib/screens/announcements/announcement_details_interactor.dart deleted file mode 100644 index 191e1645db..0000000000 --- a/apps/flutter_parent/lib/screens/announcements/announcement_details_interactor.dart +++ /dev/null @@ -1,76 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:flutter/widgets.dart'; -import 'package:flutter_parent/models/account_notification.dart'; -import 'package:flutter_parent/models/announcement.dart'; -import 'package:flutter_parent/models/attachment.dart'; -import 'package:flutter_parent/models/course.dart'; -import 'package:flutter_parent/network/api/announcement_api.dart'; -import 'package:flutter_parent/network/api/course_api.dart'; -import 'package:flutter_parent/screens/announcements/announcement_details_screen.dart'; -import 'package:flutter_parent/screens/announcements/announcement_view_state.dart'; -import 'package:flutter_parent/utils/common_widgets/view_attachment/view_attachment_screen.dart'; -import 'package:flutter_parent/utils/quick_nav.dart'; -import 'package:flutter_parent/utils/service_locator.dart'; - -class AnnouncementDetailsInteractor { - AnnouncementApi _announcementApi() => locator(); - - CourseApi _courseApi() => locator(); - - Future getAnnouncement( - String announcementId, - AnnouncementType type, - String courseId, - String institutionToolbarTitle, - bool forceRefresh, - ) async { - if (type == AnnouncementType.COURSE) { - Announcement? announcement = - await _announcementApi().getCourseAnnouncement(courseId, announcementId, forceRefresh); - - Course? course = await _courseApi().getCourse(courseId); - if (announcement == null || course == null) { - return null; - } - - return AnnouncementViewState( - course.name, - announcement.title, - announcement.message, - announcement.postedAt, - announcement.attachments.isNotEmpty ? announcement.attachments.first.toAttachment() : null, - ); - } else { - AccountNotification? accountNotification = - await _announcementApi().getAccountNotification(announcementId, forceRefresh); - - if (accountNotification == null) - return null; - - return AnnouncementViewState( - institutionToolbarTitle, - accountNotification.subject, - accountNotification.message, - DateTime.parse(accountNotification.startAt), - null, // Account notifications can't have attachments - ); - } - } - - void viewAttachment(BuildContext context, Attachment attachment) { - locator().push(context, ViewAttachmentScreen(attachment)); - } -} diff --git a/apps/flutter_parent/lib/screens/announcements/announcement_details_screen.dart b/apps/flutter_parent/lib/screens/announcements/announcement_details_screen.dart deleted file mode 100644 index 300018f004..0000000000 --- a/apps/flutter_parent/lib/screens/announcements/announcement_details_screen.dart +++ /dev/null @@ -1,134 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:flutter/material.dart'; -import 'package:flutter_parent/l10n/app_localizations.dart'; -import 'package:flutter_parent/models/attachment.dart'; -import 'package:flutter_parent/screens/announcements/announcement_view_state.dart'; -import 'package:flutter_parent/utils/common_widgets/attachment_indicator_widget.dart'; -import 'package:flutter_parent/utils/common_widgets/error_panda_widget.dart'; -import 'package:flutter_parent/utils/common_widgets/loading_indicator.dart'; -import 'package:flutter_parent/utils/common_widgets/web_view/html_description_tile.dart'; -import 'package:flutter_parent/utils/core_extensions/date_time_extensions.dart'; -import 'package:flutter_parent/utils/service_locator.dart'; - -import 'announcement_details_interactor.dart'; - -enum AnnouncementType { INSTITUTION, COURSE } - -class AnnouncementDetailScreen extends StatefulWidget { - final String announcementId; - final String courseId; - final AnnouncementType announcementType; - - AnnouncementDetailScreen(this.announcementId, this.announcementType, this.courseId, BuildContext? context, {super.key}); - - @override - State createState() => _AnnouncementDetailScreenState(); -} - -class _AnnouncementDetailScreenState extends State { - Future? _announcementFuture; - - Future _loadAnnouncement(BuildContext context, {bool forceRefresh = false}) => - _interactor.getAnnouncement( - widget.announcementId, - widget.announcementType, - widget.courseId, - L10n(context).globalAnnouncementTitle, - forceRefresh, - ); - - get _interactor => locator(); - - @override - Widget build(BuildContext context) { - if (_announcementFuture == null) { - _announcementFuture = _loadAnnouncement(context); - } - return FutureBuilder( - future: _announcementFuture, - builder: (context, AsyncSnapshot snapshot) { - if (snapshot.connectionState == ConnectionState.waiting) { - return Container(color: Theme.of(context).scaffoldBackgroundColor, child: LoadingIndicator()); - } - - if (snapshot.hasError || snapshot.data == null) { - return _error(); - } else { - return _announcementScaffold(snapshot.data!); - } - }, - ); - } - - Widget _announcementScaffold(AnnouncementViewState announcementViewState) { - return Scaffold( - appBar: AppBar( - title: Text(announcementViewState.toolbarTitle), - ), - body: RefreshIndicator( - onRefresh: () async { - setState(() { - _announcementFuture = _loadAnnouncement(context, forceRefresh: true); - }); - await _announcementFuture?.catchError((_) { return Future.value(null); }); - }, - child: _announcementBody(announcementViewState)), - ); - } - - Widget _announcementBody(AnnouncementViewState announcementViewState) { - return ListView( - padding: const EdgeInsets.all(16), - children: [ - Text( - announcementViewState.announcementTitle, - style: Theme.of(context).textTheme.headlineMedium, - ), - SizedBox(height: 4), - Text( - announcementViewState.postedAt.l10nFormat(L10n(context).dateAtTime) ?? '', - style: Theme.of(context).textTheme.bodySmall, - ), - SizedBox(height: 16), - Divider(), - HtmlDescriptionTile(html: announcementViewState.announcementMessage), - Divider(), - SizedBox(height: 16), - _attachmentsWidget(context, announcementViewState.attachment), - ], - ); - } - - Widget _error() { - return Container( - color: Theme.of(context).scaffoldBackgroundColor, - child: ErrorPandaWidget(L10n(context).errorLoadingAnnouncement, () { - setState(() { - _announcementFuture = _loadAnnouncement(context, forceRefresh: true); - }); - })); - } - - Widget _attachmentsWidget(BuildContext context, Attachment? attachment) { - if (attachment == null) return Container(); - return Container( - height: 108, - padding: EdgeInsets.only(top: 12), - child: AttachmentIndicatorWidget( - attachment: attachment, - onAttachmentClicked: (attachment) => {_interactor.viewAttachment(context, attachment)})); - } -} diff --git a/apps/flutter_parent/lib/screens/announcements/announcement_view_state.dart b/apps/flutter_parent/lib/screens/announcements/announcement_view_state.dart deleted file mode 100644 index 4e9d320725..0000000000 --- a/apps/flutter_parent/lib/screens/announcements/announcement_view_state.dart +++ /dev/null @@ -1,43 +0,0 @@ -/* - * Copyright (C) 2020 - present Instructure, Inc. - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, version 3 of the License. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -import 'package:flutter_parent/models/attachment.dart'; - -class AnnouncementViewState { - final String _toolbarTitle; - final String _announcementTitle; - final String _announcementMessage; - final DateTime? _postedAt; - final Attachment? _attachment; - - AnnouncementViewState( - this._toolbarTitle, - this._announcementTitle, - this._announcementMessage, - this._postedAt, - this._attachment, - ); - - String get toolbarTitle => _toolbarTitle; - - String get announcementTitle => _announcementTitle; - - String get announcementMessage => _announcementMessage; - - DateTime? get postedAt => _postedAt; - - Attachment? get attachment => _attachment; -} diff --git a/apps/flutter_parent/lib/screens/assignments/assignment_details_interactor.dart b/apps/flutter_parent/lib/screens/assignments/assignment_details_interactor.dart deleted file mode 100644 index fd0a1a177e..0000000000 --- a/apps/flutter_parent/lib/screens/assignments/assignment_details_interactor.dart +++ /dev/null @@ -1,122 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -import 'package:flutter_parent/l10n/app_localizations.dart'; -import 'package:flutter_parent/models/assignment.dart'; -import 'package:flutter_parent/models/course.dart'; -import 'package:flutter_parent/models/reminder.dart'; -import 'package:flutter_parent/network/api/assignment_api.dart'; -import 'package:flutter_parent/network/api/course_api.dart'; -import 'package:flutter_parent/network/utils/api_prefs.dart'; -import 'package:flutter_parent/utils/db/reminder_db.dart'; -import 'package:flutter_parent/utils/notification_util.dart'; -import 'package:flutter_parent/utils/service_locator.dart'; - -class AssignmentDetailsInteractor { - final String _ASSIGNMENT_ENHANCEMENT_KEY = "assignments_2_student"; - - Future loadAssignmentDetails( - bool forceRefresh, - String courseId, - String assignmentId, - String? studentId, - ) async { - final course = locator().getCourse(courseId, forceRefresh: forceRefresh); - final enabledCourseFeatures = locator().getEnabledCourseFeatures(courseId, forceRefresh: forceRefresh); - final assignment = locator().getAssignment(courseId, assignmentId, forceRefresh: forceRefresh); - - return AssignmentDetails( - assignment: (await assignment), - course: (await course), - assignmentEnhancementEnabled: (await enabledCourseFeatures)?.contains(_ASSIGNMENT_ENHANCEMENT_KEY)); - } - - Future loadQuizDetails( - bool forceRefresh, - String courseId, - String assignmentId, - String studentId, - ) async { - final course = locator().getCourse(courseId, forceRefresh: forceRefresh); - final enabledCourseFeatures = locator().getEnabledCourseFeatures(courseId, forceRefresh: forceRefresh); - final quiz = locator().getAssignment(courseId, assignmentId, forceRefresh: forceRefresh); - - return AssignmentDetails( - assignment: (await quiz), - course: (await course), - assignmentEnhancementEnabled: (await enabledCourseFeatures)?.contains(_ASSIGNMENT_ENHANCEMENT_KEY)); - } - - Future loadReminder(String assignmentId) async { - Reminder? reminder = null; - String? domain = ApiPrefs.getDomain(); - String? id = ApiPrefs.getUser()?.id; - if (domain != null && id != null) { - reminder = await locator().getByItem( - domain, - id, - Reminder.TYPE_ASSIGNMENT, - assignmentId, - ); - } - - /* If the user dismisses a reminder notification without tapping it, then NotificationUtil won't have a chance - to remove it from the database. Given that we cannot time travel (yet), if the reminder we just retrieved - has a date set in the past then we will opt to delete it here. */ - if (reminder?.date?.isBefore(DateTime.now()) == true) { - await deleteReminder(reminder!); - return null; - } - - return reminder; - } - - Future createReminder( - AppLocalizations l10n, - DateTime date, - String assignmentId, - String courseId, - String? title, - String body, - ) async { - var reminder = Reminder((b) => b - ..userDomain = ApiPrefs.getDomain() - ..userId = ApiPrefs.getUser()?.id - ..type = Reminder.TYPE_ASSIGNMENT - ..itemId = assignmentId - ..courseId = courseId - ..date = date.toUtc() // built_value complains about non-utc timestamps - ); - - // Saving to the database will generate an ID for this reminder - var insertedReminder = await locator().insert(reminder); - if (insertedReminder != null) { - reminder = insertedReminder; - await locator().scheduleReminder(l10n, title, body, reminder); - } - } - - Future deleteReminder(Reminder? reminder) async { - if (reminder == null) return; - await locator().deleteNotification(reminder.id!); - await locator().deleteById(reminder.id!); - } -} - -class AssignmentDetails { - final Course? course; - final Assignment? assignment; - final bool? assignmentEnhancementEnabled; - - AssignmentDetails({this.course, this.assignment, this.assignmentEnhancementEnabled}); -} diff --git a/apps/flutter_parent/lib/screens/assignments/assignment_details_screen.dart b/apps/flutter_parent/lib/screens/assignments/assignment_details_screen.dart deleted file mode 100644 index a68e7b162b..0000000000 --- a/apps/flutter_parent/lib/screens/assignments/assignment_details_screen.dart +++ /dev/null @@ -1,435 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -import 'package:flutter/material.dart'; -import 'package:flutter_parent/l10n/app_localizations.dart'; -import 'package:flutter_parent/models/assignment.dart'; -import 'package:flutter_parent/models/reminder.dart'; -import 'package:flutter_parent/models/user.dart'; -import 'package:flutter_parent/network/utils/api_prefs.dart'; -import 'package:flutter_parent/router/panda_router.dart'; -import 'package:flutter_parent/screens/assignments/assignment_details_interactor.dart'; -import 'package:flutter_parent/screens/assignments/grade_cell.dart'; -import 'package:flutter_parent/screens/inbox/create_conversation/create_conversation_screen.dart'; -import 'package:flutter_parent/utils/common_widgets/error_panda_widget.dart'; -import 'package:flutter_parent/utils/common_widgets/loading_indicator.dart'; -import 'package:flutter_parent/utils/common_widgets/web_view/html_description_tile.dart'; -import 'package:flutter_parent/utils/common_widgets/web_view/web_content_interactor.dart'; -import 'package:flutter_parent/utils/core_extensions/date_time_extensions.dart'; -import 'package:flutter_parent/utils/design/canvas_icons_solid.dart'; -import 'package:flutter_parent/utils/design/parent_theme.dart'; -import 'package:flutter_parent/utils/notification_util.dart'; -import 'package:flutter_parent/utils/permission_handler.dart'; -import 'package:flutter_parent/utils/quick_nav.dart'; -import 'package:flutter_parent/utils/service_locator.dart'; -import 'package:flutter_svg/svg.dart'; -import 'package:permission_handler/permission_handler.dart'; - -import '../../network/utils/analytics.dart'; -import '../../utils/veneers/flutter_snackbar_veneer.dart'; - -class AssignmentDetailsScreen extends StatefulWidget { - final String courseId; - final String assignmentId; - - const AssignmentDetailsScreen({ - required this.courseId, - required this.assignmentId, - super.key - }); - - @override - _AssignmentDetailsScreenState createState() => _AssignmentDetailsScreenState(); -} - -class _AssignmentDetailsScreenState extends State { - GlobalKey _refreshKey = GlobalKey(); - - // State variables - late Future _assignmentFuture; - late Future _reminderFuture; - Future? _animationFuture; - User? _currentStudent; - - @override - void initState() { - _currentStudent = ApiPrefs.getCurrentStudent(); - _reminderFuture = _loadReminder(); - _assignmentFuture = _loadAssignment(); - super.initState(); - } - - AssignmentDetailsInteractor get _interactor => locator(); - - Future _loadAssignment({bool forceRefresh = false}) => _interactor.loadAssignmentDetails( - forceRefresh, - widget.courseId, - widget.assignmentId, - _currentStudent?.id, - ); - - Future _loadReminder() => _interactor.loadReminder(widget.assignmentId); - - PermissionHandler get _permissionHandler => locator(); - - @override - Widget build(BuildContext context) { - return FutureBuilder( - future: _assignmentFuture, - builder: (context, AsyncSnapshot snapshot) => Scaffold( - appBar: _appBar(snapshot), - floatingActionButton: snapshot.hasData && snapshot.data?.assignment != null ? _fab(snapshot) : null, - body: RefreshIndicator( - key: _refreshKey, - child: _body(snapshot), - onRefresh: () { - setState(() { - _assignmentFuture = _loadAssignment(forceRefresh: true); - _reminderFuture = _loadReminder(); - }); - return _assignmentFuture.catchError((_) {}); // Catch errors so they don't crash the app - }, - ), - ), - ); - } - - AppBar _appBar(AsyncSnapshot snapshot) => AppBar( - bottom: ParentTheme.of(context)?.appBarDivider(), - title: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text(L10n(context).assignmentDetailsTitle), - if (snapshot.hasData) - Text(snapshot.data?.course?.name ?? '', - style: Theme.of(context).primaryTextTheme.bodySmall?.copyWith(color: Colors.white), key: Key("assignment_details_coursename")), - ], - ), - ); - - Widget _fab(AsyncSnapshot snapshot) { - return FloatingActionButton( - onPressed: () => _sendMessage(snapshot.data!), - tooltip: L10n(context).assignmentMessageHint, - child: Padding(padding: const EdgeInsets.only(left: 4, top: 4), child: Icon(CanvasIconsSolid.comment)), - ); - } - - Widget _body(AsyncSnapshot snapshot) { - if (snapshot.hasError) { - return ErrorPandaWidget( - L10n(context).unexpectedError, - () => _refreshKey.currentState?.show(), - ); - } - - if (!snapshot.hasData) return LoadingIndicator(); - - // Load the content - if (_animationFuture == null) _animationFuture = Future.delayed(Duration(milliseconds: 1000)); - final textTheme = Theme.of(context).textTheme; - - final l10n = L10n(context); - final course = snapshot.data?.course; - final restrictQuantitativeData = course?.settings?.restrictQuantitativeData ?? false; - final assignment = snapshot.data!.assignment!; - final assignmentEnhancementEnabled = snapshot.data?.assignmentEnhancementEnabled ?? false; - final submission = assignment.submission(_currentStudent?.id); - final fullyLocked = assignment.isFullyLocked; - final missing = submission?.missing == true; - final showStatus = missing || assignment.isSubmittable() || submission?.isGraded() == true; - final submitted = submission?.submittedAt != null; - final graded = submission?.isGraded() == true; - final submittedColor = submitted || graded ? ParentTheme.of(context)?.successColor : textTheme.bodySmall?.color; - - final points = (assignment.pointsPossible.toInt() == assignment.pointsPossible) - ? assignment.pointsPossible.toInt().toString() - : assignment.pointsPossible.toString(); - - return SingleChildScrollView( - physics: AlwaysScrollableScrollPhysics(), - padding: EdgeInsets.symmetric(horizontal: 16), - child: Column( - mainAxisSize: MainAxisSize.min, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - ..._rowTile( - title: assignment.name ?? '', - titleStyle: textTheme.headlineMedium!, - child: Row( - children: [ - if (!restrictQuantitativeData) - Text(l10n.assignmentTotalPoints(points), - style: textTheme.bodySmall, - semanticsLabel: l10n.assignmentTotalPointsAccessible(points), - key: Key("assignment_details_total_points")), - if (showStatus && !restrictQuantitativeData) SizedBox(width: 16), - if (showStatus) _statusIcon(submitted || graded, submittedColor!), - if (showStatus) SizedBox(width: 8), - if (showStatus) - Text( - missing ? l10n.assignmentMissingSubmittedLabel : - graded ? l10n.assignmentGradedLabel : - submitted ? l10n.assignmentSubmittedLabel : l10n.assignmentNotSubmittedLabel, - style: textTheme.bodySmall?.copyWith( - color: submittedColor, - ), - key: Key("assignment_details_status")), - ], - ), - ), - Divider(), - Padding( - padding: const EdgeInsets.only(top: 16.0, bottom: 16.0), - child: OutlinedButton( - onPressed: () { - _onSubmissionAndRubricClicked( - assignment.htmlUrl, - assignmentEnhancementEnabled, - l10n.submission, - ); - }, - child: Align( - alignment: Alignment.center, - child: Row(mainAxisSize: MainAxisSize.min, children: [ - Text( - l10n.submissionAndRubric, - style: textTheme.titleMedium?.copyWith(color: ParentTheme.of(context)?.studentColor), - ), - SizedBox(width: 6), - Icon(CanvasIconsSolid.arrow_open_right, color: ParentTheme.of(context)?.studentColor, size: 14) - ])), - style: OutlinedButton.styleFrom( - minimumSize: Size(double.infinity, 48), - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(6.0), - ), - side: BorderSide(width: 0.5, color: ParentTheme.of(context)?.onSurfaceColor ?? Colors.grey), - ))), - if (!fullyLocked) ...[ - Divider(), - ..._rowTile( - title: l10n.assignmentDueLabel, - child: Text(_dateFormat(assignment.dueAt?.toLocal()) ?? l10n.noDueDate, - style: textTheme.titleMedium, key: Key("assignment_details_due_date")), - ), - ], - GradeCell.forSubmission(context, course, assignment, submission), - ..._lockedRow(assignment), - Divider(), - ..._rowTile( - title: l10n.assignmentRemindMeLabel, - child: FutureBuilder( - future: _reminderFuture, - builder: (BuildContext context, AsyncSnapshot snapshot) { - Reminder? reminder = snapshot.data; - return SwitchListTile( - contentPadding: EdgeInsets.zero, - value: reminder != null, - title: Text( - reminder?.date == null - ? L10n(context).assignmentRemindMeDescription - : L10n(context).assignmentRemindMeSet, - style: textTheme.titleMedium, - ), - subtitle: reminder == null - ? null - : Padding( - padding: const EdgeInsets.only(top: 8), - child: Text( - _dateFormat(reminder.date?.toLocal()) ?? '', - style: textTheme.titleMedium?.copyWith(color: ParentTheme.of(context)?.studentColor), - ), - ), - onChanged: (checked) => _handleAlarmSwitch(context, assignment, checked, reminder), - ); - }, - ), - ), - Divider(), - _descriptionContent(assignment, fullyLocked), - if (!fullyLocked) - Divider(), - // TODO: Add in 'Learn more' feature -// ..._rowTile( -// title: l10n.assignmentLearnMoreLabel, -// child: Text('nothing to learn here'), -// ), - SizedBox(height: 48), // Fab size at bottom to see whole description - ], - ), - ); - } - - Widget _descriptionContent(Assignment assignment, bool fullyLocked) { - final l10n = L10n(context); - - if (fullyLocked) { - return FutureBuilder( - future: _animationFuture, - builder: (context, snapshot) { - if (snapshot.connectionState == ConnectionState.waiting) { - return Padding( - padding: const EdgeInsets.only(top: 16.0), - child: LoadingIndicator(), - ); - } - - // No good way to center this image vertically in a scrollable view's remaining space. Settling for padding for now - return Padding( - padding: const EdgeInsets.only(top: 32), - child: Center(child: SvgPicture.asset('assets/svg/panda-locked.svg', excludeFromSemantics: true)), - ); - }, - ); - } else { - return HtmlDescriptionTile( - html: assignment.description, - emptyDescription: l10n.noDescriptionBody, - descriptionTitle: assignment.submissionTypes?.contains(SubmissionTypes.onlineQuiz) == true - ? l10n.assignmentInstructionsLabel - : l10n.descriptionTitle, - ); - } - } - - Widget _statusIcon(bool submitted, Color submittedColor) { - if (!submitted) return Icon(Icons.do_not_disturb, color: submittedColor, size: 18); - return Container( - width: 18, - height: 18, - decoration: BoxDecoration(shape: BoxShape.circle, color: submittedColor), - child: Icon(CanvasIconsSolid.check, color: Theme.of(context).colorScheme.onPrimary, size: 8), - ); - } - - List _rowTile({String? title, TextStyle? titleStyle, Widget? child}) { - return [ - SizedBox(height: 16), - Text(title ?? '', style: titleStyle ?? Theme.of(context).textTheme.labelSmall), - SizedBox(height: 8), - if (child != null) child, - SizedBox(height: 16), - ]; - } - - List _lockedRow(Assignment assignment) { - String? message = null; - if (assignment.lockInfo?.hasModuleName == true) { - message = L10n(context).assignmentLockedModule(assignment.lockInfo!.contextModule!.name!); - } else if (assignment.isFullyLocked || - (assignment.lockExplanation?.isNotEmpty == true && assignment.lockAt?.isBefore(DateTime.now()) == true)) { - message = assignment.lockExplanation; - } - - if (message?.isNotEmpty != true) return []; - - return [ - Divider(), - ..._rowTile( - title: L10n(context).assignmentLockLabel, - child: Text(message!, style: Theme.of(context).textTheme.titleMedium), - ), - ]; - } - - String? _dateFormat(DateTime? time) => time?.l10nFormat(L10n(context).dateAtTime); - - _handleAlarmSwitch(BuildContext context, Assignment assignment, bool checked, Reminder? reminder) async { - if (reminder != null) await _interactor.deleteReminder(reminder); - if (checked) { - var now = DateTime.now(); - var initialDate = assignment.dueAt?.isAfter(now) == true ? assignment.dueAt!.toLocal() : now; - - DateTime? date; - TimeOfDay? time; - - final permissionResult = await _permissionHandler.checkPermissionStatus(Permission.scheduleExactAlarm); - if (permissionResult != PermissionStatus.granted) { - final permissionGranted = await locator().requestScheduleExactAlarmPermission(); - if (permissionGranted != true) { - locator().showSnackBar(context, L10n(context).needToEnablePermission); - return; - } - } - - date = await showDatePicker( - context: context, - initialDate: initialDate, - firstDate: now, - lastDate: initialDate.add(Duration(days: 365)), - builder: (context, child) { - return Theme( - data: ParentTheme.of(context)?.defaultLightTheme ?? ThemeData.light(), - child: child!, - ); - }, - ); - - if (date != null) { - time = await showTimePicker(context: context, initialTime: TimeOfDay.fromDateTime(initialDate), - builder: (context, child) { - return Theme( - data: ParentTheme.of(context)?.defaultLightTheme ?? ThemeData.light(), - child: child!, - ); - }, - ); - } - - if (date != null && time != null) { - DateTime reminderDate = DateTime(date.year, date.month, date.day, time.hour, time.minute); - var body = assignment.dueAt?.l10nFormat(L10n(context).dueDateAtTime) ?? L10n(context).noDueDate; - await _interactor.createReminder( - L10n(context), - reminderDate, - assignment.id, - assignment.courseId, - assignment.name ?? '', - body, - ); - } - } - - // Perform refresh - setState(() { - _reminderFuture = _loadReminder(); - }); - } - - _sendMessage(AssignmentDetails details) { - if (_currentStudent != null) { - String subject = L10n(context).assignmentSubjectMessage( - _currentStudent?.name ?? '', details.assignment?.name ?? ''); - String postscript = L10n(context).messageLinkPostscript( - _currentStudent?.name ?? '', details.assignment?.htmlUrl ?? ''); - Widget screen = CreateConversationScreen( - widget.courseId, _currentStudent!.id, subject, postscript); - locator.get().push(context, screen); - } - } - - _onSubmissionAndRubricClicked(String? assignmentUrl, bool assignmentEnhancementEnabled, String title) async { - if (assignmentUrl == null) return; - final parentId = ApiPrefs.getUser()?.id ?? 0; - final currentStudentId = _currentStudent?.id ?? 0; - final url = assignmentEnhancementEnabled ? assignmentUrl : assignmentUrl + "/submissions/$currentStudentId"; - locator().pushRoute(context, PandaRouter.submissionWebViewRoute( - await locator().getAuthUrl(url), - title, - {"k5_observed_user_for_$parentId": "$currentStudentId"}, - false - )); - locator().logEvent(AnalyticsEventConstants.SUBMISSION_AND_RUBRIC_INTERACTION); - } -} diff --git a/apps/flutter_parent/lib/screens/assignments/grade_cell.dart b/apps/flutter_parent/lib/screens/assignments/grade_cell.dart deleted file mode 100644 index d8bac77e11..0000000000 --- a/apps/flutter_parent/lib/screens/assignments/grade_cell.dart +++ /dev/null @@ -1,184 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:flutter/material.dart'; -import 'package:flutter_parent/l10n/app_localizations.dart'; -import 'package:flutter_parent/models/assignment.dart'; -import 'package:flutter_parent/models/course.dart'; -import 'package:flutter_parent/models/grade_cell_data.dart'; -import 'package:flutter_parent/models/submission.dart'; -import 'package:flutter_parent/utils/design/parent_colors.dart'; -import 'package:flutter_parent/utils/design/parent_theme.dart'; -import 'package:percent_indicator/circular_percent_indicator.dart'; - -class GradeCell extends StatelessWidget { - final GradeCellData data; - - const GradeCell(this.data, {super.key}); - - GradeCell.forSubmission( - BuildContext context, - Course? course, - Assignment? assignment, - Submission? submission, { - super.key, - }) : data = GradeCellData.forSubmission( - course, - assignment, - submission, - Theme.of(context), - L10n(context), - ); - - @override - Widget build(BuildContext context) { - if (data.state == GradeCellState.empty) - return Container( - key: Key('grade-cell-empty-container'), - ); - return MergeSemantics( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Divider(), - SizedBox(height: 8), - Text(L10n(context).assignmentGradeLabel, style: Theme.of(context).textTheme.labelSmall), - SizedBox(height: 8), - data.state == GradeCellState.submitted ? _submitted(context, data) : _graded(context, data), - SizedBox(height: 8), - ], - ), - ); - } - - Widget _submitted(BuildContext context, GradeCellData data) { - return Center( - key: Key('grade-cell-submitted-container'), - child: Column( - children: [ - Text(L10n(context).submissionStatusSuccessTitle, - style: Theme.of(context).textTheme.headlineSmall?.copyWith(color: ParentTheme.of(context)?.successColor), - key: Key("grade-cell-submit-status")), - SizedBox(height: 6), - Text(data.submissionText, textAlign: TextAlign.center), - ], - ), - ); - } - - Widget _graded(BuildContext context, GradeCellData data) { - final bool _isGradedRestrictQuantitativeData = data.state == GradeCellState.gradedRestrictQuantitativeData; - return Row( - mainAxisAlignment: MainAxisAlignment.spaceEvenly, - key: Key('grade-cell-graded-container'), - children: [ - Stack( - alignment: Alignment.center, - children: [ - CircularPercentIndicator( - radius: 64, - progressColor: data.accentColor, - backgroundColor: ParentTheme.of(context)!.nearSurfaceColor, - percent: data.graphPercent, - lineWidth: 3, - animation: true, - ), - Column( - children: [ - if (data.score.isNotEmpty) - Container( - constraints: BoxConstraints(maxWidth: 96), - child: FittedBox( - fit: BoxFit.contain, - child: Text( - data.score, - key: Key('grade-cell-score'), - style: TextStyle(fontSize: 32, fontWeight: FontWeight.bold), - ), - ), - ), - if (data.showPointsLabel) - Padding( - padding: const EdgeInsets.only(top: 2), - child: Text( - 'Points', - key: Key('grade-cell-points-label'), - ), - ), - ], - ), - if (data.showCompleteIcon) - Icon( - Icons.check, - key: Key('grade-cell-complete-icon'), - size: 64, - color: data.accentColor, - ), - if (data.showIncompleteIcon) - Icon( - Icons.clear, - key: Key('grade-cell-incomplete-icon'), - size: 64, - color: data.accentColor, - ), - ], - ), - if (!_isGradedRestrictQuantitativeData) SizedBox(width: 16), - if (!_isGradedRestrictQuantitativeData) - Expanded( - child: Column( - mainAxisSize: MainAxisSize.min, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - if (data.grade.isNotEmpty) - Text( - data.grade, - key: Key('grade-cell-grade'), - style: Theme.of(context).textTheme.headlineMedium, - semanticsLabel: data.gradeContentDescription, - ), - if (data.outOf.isNotEmpty) Text(data.outOf, key: Key('grade-cell-out-of')), - if (data.yourGrade.isNotEmpty) - Padding( - padding: const EdgeInsets.only(top: 4), - child: Text( - data.yourGrade, - key: Key('grade-cell-your-grade'), - ), - ), - if (data.latePenalty.isNotEmpty) - Padding( - padding: const EdgeInsets.only(top: 4), - child: Text( - data.latePenalty, - style: TextStyle(color: ParentColors.failure), - key: Key('grade-cell-late-penalty'), - ), - ), - if (data.finalGrade.isNotEmpty) - Padding( - padding: const EdgeInsets.only(top: 4), - child: Text( - data.finalGrade, - key: Key('grade-cell-final-grade'), - style: Theme.of(context).textTheme.titleMedium, - ), - ), - ], - ), - ), - ], - ); - } -} diff --git a/apps/flutter_parent/lib/screens/aup/acceptable_use_policy_interactor.dart b/apps/flutter_parent/lib/screens/aup/acceptable_use_policy_interactor.dart deleted file mode 100644 index 7c9dc297ab..0000000000 --- a/apps/flutter_parent/lib/screens/aup/acceptable_use_policy_interactor.dart +++ /dev/null @@ -1,29 +0,0 @@ -// Copyright (C) 2023 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:flutter_parent/models/terms_of_service.dart'; -import 'package:flutter_parent/models/user.dart'; -import 'package:flutter_parent/network/api/accounts_api.dart'; -import 'package:flutter_parent/network/api/user_api.dart'; -import 'package:flutter_parent/utils/service_locator.dart'; - -class AcceptableUsePolicyInteractor { - Future getTermsOfService() { - return locator().getTermsOfService(); - } - - Future acceptTermsOfUse() { - return locator().acceptUserTermsOfUse(); - } -} \ No newline at end of file diff --git a/apps/flutter_parent/lib/screens/aup/acceptable_use_policy_screen.dart b/apps/flutter_parent/lib/screens/aup/acceptable_use_policy_screen.dart deleted file mode 100644 index 6c4b2714fd..0000000000 --- a/apps/flutter_parent/lib/screens/aup/acceptable_use_policy_screen.dart +++ /dev/null @@ -1,139 +0,0 @@ -// Copyright (C) 2023 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:flutter/material.dart'; -import 'package:flutter_parent/l10n/app_localizations.dart'; -import 'package:flutter_parent/network/utils/analytics.dart'; -import 'package:flutter_parent/network/utils/api_prefs.dart'; -import 'package:flutter_parent/router/panda_router.dart'; -import 'package:flutter_parent/screens/aup/acceptable_use_policy_interactor.dart'; -import 'package:flutter_parent/utils/common_widgets/masquerade_ui.dart'; -import 'package:flutter_parent/utils/common_widgets/web_view/html_description_screen.dart'; -import 'package:flutter_parent/utils/design/canvas_icons.dart'; -import 'package:flutter_parent/utils/design/parent_theme.dart'; -import 'package:flutter_parent/utils/features_utils.dart'; -import 'package:flutter_parent/utils/quick_nav.dart'; -import 'package:flutter_parent/utils/service_locator.dart'; - -import '../../parent_app.dart'; - -class AcceptableUsePolicyScreen extends StatefulWidget { - @override - State createState() => _AcceptableUsePolicyState(); -} - -class _AcceptableUsePolicyState extends State { - AcceptableUsePolicyInteractor _interactor = - locator(); - bool _isAccepted = false; - - @override - Widget build(BuildContext context) { - return DefaultParentTheme( - builder: (context) => Scaffold( - appBar: AppBar( - title: Text(L10n(context).acceptableUsePolicyTitle), - leading: IconButton( - icon: Icon(CanvasIcons.x), - onPressed: () => _close(), - ), - actions: [ - TextButton( - onPressed: _isAccepted ? () => _confirm() : null, - child: Text(L10n(context).acceptableUsePolicyConfirm)) - ], - ), - body: Column( - children: [ - Divider(), - Container( - padding: - EdgeInsets.symmetric(horizontal: 16, vertical: 12), - child: Text( - L10n(context).acceptableUsePolicyDescription, - style: TextStyle(fontSize: 16), - )), - Divider(), - TextButton( - onPressed: _readPolicy, - style: TextButton.styleFrom(padding: EdgeInsets.symmetric(horizontal: 16, vertical: 12)), - child: Row( - children: [ - Text(L10n(context).acceptableUsePolicyTitle, - style: Theme.of(context).textTheme.titleMedium?.copyWith(fontSize: 16)), - Spacer(), - Icon( - CanvasIcons.arrow_open_right, - color: Theme.of(context).iconTheme.color, - size: 12, - ) - ], - )), - Divider(), - Container( - padding: EdgeInsets.symmetric(horizontal: 16, vertical: 12), - child: Row( - children: [ - Text( - L10n(context).acceptableUsePolicyAgree, - style: TextStyle(fontSize: 16), - ), - Spacer(), - Switch( - value: _isAccepted, - onChanged: (isEnabled) => - _onSwitchChanged(isEnabled)) - ], - ), - ), - Divider() - ], - ), - )); - } - - _close() async { - try { - locator().logEvent(AnalyticsEventConstants.LOGOUT); - await ParentTheme.of(context)?.setSelectedStudent(null); - await ApiPrefs.performLogout(app: ParentApp.of(context)); - MasqueradeUI.of(context)?.refresh(); - await FeaturesUtils.performLogout(); - locator().pushRouteAndClearStack(context, PandaRouter.login()); - } catch (e) { - // Just in case we experience any error we still need to go back to the login screen. - locator().pushRouteAndClearStack(context, PandaRouter.login()); - } - } - - _confirm() async { - await _interactor.acceptTermsOfUse(); - locator().pushRouteAndClearStack( - context, PandaRouter.rootSplash()); - } - - _readPolicy() { - _interactor.getTermsOfService().then((termsOfService) => locator() - .push( - context, - HtmlDescriptionScreen(termsOfService?.content, - L10n(context).acceptableUsePolicyTitle))); - } - - _onSwitchChanged(bool isEnabled) { - setState(() { - _isAccepted = isEnabled; - }); - } -} diff --git a/apps/flutter_parent/lib/screens/calendar/calendar_day_list_tile.dart b/apps/flutter_parent/lib/screens/calendar/calendar_day_list_tile.dart deleted file mode 100644 index cba1d87470..0000000000 --- a/apps/flutter_parent/lib/screens/calendar/calendar_day_list_tile.dart +++ /dev/null @@ -1,197 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:flutter/material.dart'; -import 'package:flutter_parent/l10n/app_localizations.dart'; -import 'package:flutter_parent/models/planner_item.dart'; -import 'package:flutter_parent/router/panda_router.dart'; -import 'package:flutter_parent/utils/core_extensions/date_time_extensions.dart'; -import 'package:flutter_parent/utils/design/canvas_icons.dart'; -import 'package:flutter_parent/utils/quick_nav.dart'; -import 'package:flutter_parent/utils/service_locator.dart'; -import 'package:intl/intl.dart'; - -class CalendarDayListTile extends StatelessWidget { - final PlannerItem _item; - - CalendarDayListTile(this._item); - - @override - Widget build(BuildContext context) { - final textTheme = Theme.of(context).textTheme; - Widget tile = InkWell( - onTap: () { - switch (_item.plannableType) { - case 'assignment': - if (_item.courseId != null && _item.plannable.assignmentId != null) { - locator().pushRoute(context, PandaRouter.assignmentDetails(_item.courseId!, _item.plannable.assignmentId!)); - } - break; - case 'calendar_event': - // Case where the observed user has a personal calendar event - if (_item.courseId != null) { - locator().pushRoute(context, PandaRouter.eventDetails(_item.courseId!, _item.plannable.id)); - } - break; - case 'quiz': - // This is a quiz assignment, go to the assignment page - if (_item.courseId != null && _item.plannable.assignmentId != null) { - locator().pushRoute(context, PandaRouter.quizAssignmentDetails(_item.courseId!, _item.plannable.assignmentId!)); - } - break; - case 'discussion_topic': - // This is a discussion assignment, go to the assignment page - if (_item.courseId != null && _item.plannable.assignmentId != null) { - locator().pushRoute(context, PandaRouter.discussionDetails(_item.courseId!, _item.plannable.assignmentId!)); - } - break; -// case 'quiz': TODO - keep in place for potentially moving back to planner api -// if (_item.plannable.assignmentId != null) { - // This is a quiz assignment, go to the assignment page -// locator() -// .pushRoute(context, PandaRouter.quizAssignmentDetails(_item.courseId, _item.plannable.assignmentId)); -// } else { - // No routes will match this url currently, so routing internally will throw it in an implicit intent -// PandaRouter.routeInternally(context, ApiPrefs.getDomain() + _item.htmlUrl); -// } -// break; -// case 'discussion_topic': -// locator() -// .pushRoute(context, PandaRouter.discussionDetails(_item.courseId, _item.plannable.assignmentId)); -// break; -// case 'announcement': -// Observers don't get institutional announcements, so we're only dealing with course announcements -// locator() -// .pushRoute(context, PandaRouter.courseAnnouncementDetails(_item.courseId, _item.plannable.id)); -// break; - default: - // This is a type that we don't handle - do nothing - break; - } - }, - child: Row( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - SizedBox(width: 18), - Padding( - padding: const EdgeInsets.only(top: 14), - child: _getIcon(context, _item), - ), - SizedBox(width: 34), - Expanded( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - SizedBox(height: 16), - Text(_getContextName(context, _item), style: textTheme.bodySmall), - SizedBox(height: 2), - Text(_item.plannable.title, style: textTheme.titleMedium), - ..._getDueDate(context, _item), - ..._getPointsOrStatus(context, _item), - SizedBox(height: 12), - ], - ), - ), - SizedBox(width: 16), - ], - ), - ); - - return tile; - } - - String _getContextName(BuildContext context, PlannerItem item) { - if (item.contextName != null) return item.contextName!; - - // Planner notes don't have a context name so we'll use 'Planner Note' - // TODO - Keep in place for potentially moving back to planner api -// if (item.plannableType == 'planner_note') return L10n(context).plannerNote; - - return ''; - } - - Widget _getIcon(BuildContext context, PlannerItem item) { - IconData? icon = null; - switch (item.plannableType) { - case 'assignment': - icon = CanvasIcons.assignment; - break; - case 'quiz': - icon = CanvasIcons.quiz; - break; - case 'calendar_event': - icon = CanvasIcons.calendar_day; - break; - case 'discussion_topic': - icon = CanvasIcons.discussion; - break; -// TODO - keep in place for potentially moving back to planner api -// case 'announcement': -// icon = CanvasIcons.announcement; -// break; -// case 'planner_note': -// icon = CanvasIcons.note; -// break; - } - return Icon(icon, size: 20, semanticLabel: '', color: Theme.of(context).colorScheme.secondary); - } - - List _getDueDate(BuildContext context, PlannerItem plannerItem) { - if (plannerItem.plannable.dueAt != null) { - return [ - SizedBox(height: 4), - Text(plannerItem.plannable.dueAt!.l10nFormat(L10n(context).dueDateAtTime) ?? '', - style: Theme.of(context).textTheme.bodySmall), - ]; - } - return []; - } - - List _getPointsOrStatus(BuildContext context, PlannerItem plannerItem) { - var submissionStatus = plannerItem.submissionStatus; - String? pointsOrStatus = null; - String? semanticLabel = null; - // Submission status can be null for non-assignment contexts like announcements - if (submissionStatus != null) { - if (submissionStatus.excused) { - pointsOrStatus = L10n(context).excused; - } else if (submissionStatus.missing) { - pointsOrStatus = L10n(context).missing; - } else if (submissionStatus.graded) { - pointsOrStatus = L10n(context).assignmentGradedLabel; - } else if (submissionStatus.needsGrading) { - pointsOrStatus = L10n(context).assignmentSubmittedLabel; - } else if (plannerItem.plannable.pointsPossible != null) { - // We don't have a status, but we should have points - String score = NumberFormat.decimalPattern().format(plannerItem.plannable.pointsPossible); - pointsOrStatus = L10n(context).assignmentTotalPoints(score); - semanticLabel = L10n(context).pointsPossible(score); - } - } - - // Don't show this row if it doesn't have a score or status (e.g. announcement) - if (pointsOrStatus != null) { - return [ - SizedBox(height: 4), - Text( - pointsOrStatus, - style: Theme.of(context).textTheme.bodySmall?.copyWith(color: Theme.of(context).colorScheme.secondary), - semanticsLabel: semanticLabel, - ), - ]; - } - - return []; - } -} diff --git a/apps/flutter_parent/lib/screens/calendar/calendar_day_planner.dart b/apps/flutter_parent/lib/screens/calendar/calendar_day_planner.dart deleted file mode 100644 index 8599c3ab50..0000000000 --- a/apps/flutter_parent/lib/screens/calendar/calendar_day_planner.dart +++ /dev/null @@ -1,84 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:flutter/cupertino.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_parent/l10n/app_localizations.dart'; -import 'package:flutter_parent/models/planner_item.dart'; -import 'package:flutter_parent/screens/calendar/calendar_day_list_tile.dart'; -import 'package:flutter_parent/screens/calendar/planner_fetcher.dart'; -import 'package:flutter_parent/utils/common_widgets/empty_panda_widget.dart'; -import 'package:flutter_parent/utils/common_widgets/error_panda_widget.dart'; -import 'package:flutter_parent/utils/common_widgets/loading_indicator.dart'; -import 'package:provider/provider.dart'; - -class CalendarDayPlanner extends StatefulWidget { - final DateTime _day; - - CalendarDayPlanner(this._day); - - @override - State createState() => CalendarDayPlannerState(); -} - -class CalendarDayPlannerState extends State { - @override - Widget build(BuildContext context) { - return Selector>>( - selector: (_, fetcher) => fetcher.getSnapshotForDate(widget._day), - builder: (_, snapshot, __) { - Widget body; - if (snapshot.hasError) { - body = ErrorPandaWidget(L10n(context).errorLoadingEvents, _refresh, header: SizedBox(height: 32)); - } else if (!snapshot.hasData) { - body = LoadingIndicator(); - } else { - if (snapshot.data!.isEmpty) { - body = EmptyPandaWidget( - svgPath: 'assets/svg/panda-no-events.svg', - title: L10n(context).noEventsTitle, - subtitle: L10n(context).noEventsMessage, - header: SizedBox(height: 32), - ); - } else { - body = CalendarDayList(snapshot.data!); - } - } - - return RefreshIndicator( - child: body, - onRefresh: _refresh, - ); - }, - ); - } - - Future _refresh() => Provider.of(context, listen: false).refreshItemsForDate(widget._day); -} - -class CalendarDayList extends StatelessWidget { - final List _plannerItems; - - CalendarDayList(this._plannerItems); - - @override - Widget build(BuildContext context) { - return ListView.builder( - itemCount: _plannerItems.length, - itemBuilder: (context, index) => _dayTile(context, _plannerItems[index], index), - ); - } - - Widget _dayTile(BuildContext context, PlannerItem plannerItem, int index) => CalendarDayListTile(plannerItem); -} diff --git a/apps/flutter_parent/lib/screens/calendar/calendar_screen.dart b/apps/flutter_parent/lib/screens/calendar/calendar_screen.dart deleted file mode 100644 index 278abb9b1b..0000000000 --- a/apps/flutter_parent/lib/screens/calendar/calendar_screen.dart +++ /dev/null @@ -1,88 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:collection/collection.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter/widgets.dart'; -import 'package:flutter_parent/models/user.dart'; -import 'package:flutter_parent/network/utils/api_prefs.dart'; -import 'package:flutter_parent/screens/calendar/calendar_day_planner.dart'; -import 'package:flutter_parent/screens/calendar/calendar_widget/calendar_filter_screen/calendar_filter_list_screen.dart'; -import 'package:flutter_parent/screens/calendar/calendar_widget/calendar_widget.dart'; -import 'package:flutter_parent/screens/calendar/planner_fetcher.dart'; -import 'package:flutter_parent/screens/dashboard/selected_student_notifier.dart'; -import 'package:flutter_parent/utils/quick_nav.dart'; -import 'package:flutter_parent/utils/service_locator.dart'; -import 'package:provider/provider.dart'; - -class CalendarScreen extends StatefulWidget { - final DateTime? startDate; - final CalendarView? startView; - - // Keys for the deep link parameter map passed in via DashboardScreen - static final startDateKey = 'startDate'; - static final startViewKey = 'startView'; - - CalendarScreen({this.startDate, this.startView = CalendarView.Week, super.key}); - - @override - State createState() => CalendarScreenState(); -} - -class CalendarScreenState extends State { - User? _student; - PlannerFetcher? _fetcher; - - @override - void didChangeDependencies() { - super.didChangeDependencies(); - var _selectedStudent = Provider.of(context, listen: true).value; - if (_student != _selectedStudent) { - // The student was changed by the user, create/reset the fetcher - _student = _selectedStudent; - if (_fetcher == null) { - _fetcher = PlannerFetcher( - userId: ApiPrefs.getUser()!.id, - userDomain: ApiPrefs.getDomain()!, - observeeId: _student!.id, - ); - } else { - _fetcher!.setObserveeId(_student!.id); - } - } - } - - @override - Widget build(BuildContext context) { - return CalendarWidget( - fetcher: _fetcher!, - startingDate: widget.startDate, - startingView: widget.startView, - onFilterTap: () async { - Set currentContexts = await _fetcher!.getContexts(); - Set updatedContexts = await locator.get().push( - context, - CalendarFilterListScreen(currentContexts), - ); - if (!SetEquality().equals(currentContexts, updatedContexts)) { - // Sets are different - update - _fetcher?.setContexts(updatedContexts); - } - }, - dayBuilder: (BuildContext context, DateTime day) { - return CalendarDayPlanner(day); - }, - ); - } -} diff --git a/apps/flutter_parent/lib/screens/calendar/calendar_today_click_notifier.dart b/apps/flutter_parent/lib/screens/calendar/calendar_today_click_notifier.dart deleted file mode 100644 index 65a40f946f..0000000000 --- a/apps/flutter_parent/lib/screens/calendar/calendar_today_click_notifier.dart +++ /dev/null @@ -1,21 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:flutter/material.dart'; - -class CalendarTodayClickNotifier extends ValueNotifier { - CalendarTodayClickNotifier() : super(false); - - trigger() => notifyListeners(); -} diff --git a/apps/flutter_parent/lib/screens/calendar/calendar_today_notifier.dart b/apps/flutter_parent/lib/screens/calendar/calendar_today_notifier.dart deleted file mode 100644 index 6c77bde3de..0000000000 --- a/apps/flutter_parent/lib/screens/calendar/calendar_today_notifier.dart +++ /dev/null @@ -1,19 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:flutter/material.dart'; - -class CalendarTodayNotifier extends ValueNotifier { - CalendarTodayNotifier() : super(false); -} diff --git a/apps/flutter_parent/lib/screens/calendar/calendar_widget/calendar_day.dart b/apps/flutter_parent/lib/screens/calendar/calendar_widget/calendar_day.dart deleted file mode 100644 index c890faf5df..0000000000 --- a/apps/flutter_parent/lib/screens/calendar/calendar_widget/calendar_day.dart +++ /dev/null @@ -1,190 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'dart:math'; - -import 'package:flutter/material.dart'; -import 'package:flutter_parent/l10n/app_localizations.dart'; -import 'package:flutter_parent/models/planner_item.dart'; -import 'package:flutter_parent/screens/calendar/planner_fetcher.dart'; -import 'package:flutter_parent/utils/core_extensions/date_time_extensions.dart'; -import 'package:flutter_parent/utils/design/parent_colors.dart'; -import 'package:intl/intl.dart'; -import 'package:provider/provider.dart'; - -typedef DaySelectedCallback(DateTime day); - -class CalendarDay extends StatelessWidget { - static const double dayHeight = 50; - - final DateTime date; - final DateTime selectedDay; - final DaySelectedCallback onDaySelected; - - const CalendarDay({ - required this.date, - required this.selectedDay, - required this.onDaySelected, - super.key - }); - - @override - Widget build(BuildContext context) { - final theme = Theme.of(context); - - final isToday = date.isSameDayAs(DateTime.now()); - final isSelected = date.isSameDayAs(selectedDay); - - TextStyle textStyle = theme.textTheme.headlineSmall!; - if (date.isWeekend() || date.month != selectedDay.month) textStyle = textStyle.copyWith(color: ParentColors.ash); - BoxDecoration? decoration = null; - - if (isToday) { - textStyle = Theme.of(context).textTheme.headlineSmall!.copyWith(color: theme.colorScheme.onPrimary); - decoration = BoxDecoration(color: theme.colorScheme.secondary, shape: BoxShape.circle); - } else if (isSelected) { - textStyle = textStyle.copyWith(color: Theme.of(context).colorScheme.secondary); - decoration = BoxDecoration( - borderRadius: BorderRadius.circular(16), - border: Border.all( - color: theme.colorScheme.secondary, - width: 2, - ), - ); - } - - return Selector>>( - selector: (_, fetcher) => fetcher.getSnapshotForDate(date), - builder: (_, snapshot, __) { - int eventCount = snapshot.hasData ? snapshot.data!.length : 0; - return InkResponse( - enableFeedback: true, - highlightColor: theme.colorScheme.secondary.withOpacity(0.35), - splashColor: theme.colorScheme.secondary.withOpacity(0.35), - onTap: () => onDaySelected(date), - child: Container( - height: dayHeight, - child: Column( - children: [ - SizedBox(height: 6), - Container( - height: 32, - width: 32, - decoration: decoration, - child: Center( - child: AnimatedDefaultTextStyle( - style: textStyle, - duration: Duration(milliseconds: 300), - child: Text( - date.day.toString(), - semanticsLabel: L10n(context).calendarDaySemanticsLabel(DateFormat.MMMMEEEEd(supportedDateLocale).format(date), eventCount), - key: ValueKey('day_of_month_${date.day}'), - ), - ), - ), - ), - SizedBox(height: 4), - _eventIndicator(context, snapshot), - ], - ), - ), - ); - }); - } - - Widget _eventIndicator(BuildContext context, AsyncSnapshot> snapshot) { - /// On error, show nothing - if (snapshot.hasError) return Container(); - - /// On success, show dots for activities - if (snapshot.hasData && snapshot.connectionState == ConnectionState.done) { - // Show at most three dots for events - int count = min(snapshot.data!.length, 3); - int itemCount = count < 1 ? count : (count * 2) - 1; - if (count == 0) return Container(); - return Row( - mainAxisAlignment: MainAxisAlignment.center, - children: List.generate(itemCount, (index) { - if (index % 2 == 1) return SizedBox(width: 4); - return Container( - width: 4, - height: 4, - decoration: BoxDecoration(color: Theme.of(context).colorScheme.secondary, shape: BoxShape.circle), - ); - }), - ); - } - - /// Otherwise, show loading - return Container( - width: 4, - height: 4, - child: _RepeatTween( - duration: Duration(milliseconds: 350), - delay: Duration(milliseconds: 100 * (date.localDayOfWeek!)), - builder: (BuildContext context, Animation animation) { - return ScaleTransition( - scale: animation as Animation, - child: Container( - width: 4, - height: 4, - decoration: BoxDecoration(color: ParentColors.ash, shape: BoxShape.circle), - ), - ); - }, - ), - ); - } -} - -class _RepeatTween extends StatefulWidget { - final Duration duration; - - final Duration? delay; - - final Widget Function(BuildContext context, Animation animation) builder; - - const _RepeatTween({required this.duration, this.delay = null, required this.builder, super.key}); - - @override - __RepeatTweenState createState() => __RepeatTweenState(); -} - -class __RepeatTweenState extends State<_RepeatTween> with SingleTickerProviderStateMixin { - late AnimationController _controller; - Tween tween = Tween(begin: 0.0, end: 1.0); - - @override - void initState() { - _controller = AnimationController(duration: widget.duration, vsync: this); - _startWithDelay(); - super.initState(); - } - - _startWithDelay() async { - if (widget.delay != null) await Future.delayed(widget.delay!); - if (mounted) _controller.repeat(reverse: true); - } - - @override - void dispose() { - if (_controller.isAnimating) _controller.dispose(); - super.dispose(); - } - - @override - Widget build(BuildContext context) { - return widget.builder(context, tween.animate(CurvedAnimation(parent: _controller, curve: Curves.easeInOutCubic))); - } -} diff --git a/apps/flutter_parent/lib/screens/calendar/calendar_widget/calendar_day_of_week_headers.dart b/apps/flutter_parent/lib/screens/calendar/calendar_widget/calendar_day_of_week_headers.dart deleted file mode 100644 index d590941ef5..0000000000 --- a/apps/flutter_parent/lib/screens/calendar/calendar_widget/calendar_day_of_week_headers.dart +++ /dev/null @@ -1,50 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:flutter/material.dart'; -import 'package:flutter_parent/utils/core_extensions/date_time_extensions.dart'; -import 'package:flutter_parent/utils/design/parent_theme.dart'; -import 'package:intl/intl.dart'; - -class DayOfWeekHeaders extends StatelessWidget { - static const double headerHeight = 16; - - @override - Widget build(BuildContext context) { - final weekendTheme = Theme.of(context).textTheme.titleSmall; - final weekdayTheme = weekendTheme?.copyWith(color: ParentTheme.of(context)?.onSurfaceColor); - - final symbols = DateFormat(null, supportedDateLocale).dateSymbols; - final firstDayOfWeek = symbols.FIRSTDAYOFWEEK; - - return ExcludeSemantics( - child: Container( - height: headerHeight, - child: Row( - mainAxisSize: MainAxisSize.max, - children: List.generate(7, (index) { - final day = (firstDayOfWeek + index + 1) % 7; - return Expanded( - child: Text( - symbols.STANDALONESHORTWEEKDAYS[day], - textAlign: TextAlign.center, - style: symbols.WEEKENDRANGE.contains((day - 1) % 7) ? weekendTheme : weekdayTheme, - ), - ); - }), - ), - ), - ); - } -} diff --git a/apps/flutter_parent/lib/screens/calendar/calendar_widget/calendar_filter_screen/calendar_filter_list_interactor.dart b/apps/flutter_parent/lib/screens/calendar/calendar_widget/calendar_filter_screen/calendar_filter_list_interactor.dart deleted file mode 100644 index d98a11505b..0000000000 --- a/apps/flutter_parent/lib/screens/calendar/calendar_widget/calendar_filter_screen/calendar_filter_list_interactor.dart +++ /dev/null @@ -1,25 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:flutter_parent/models/course.dart'; -import 'package:flutter_parent/network/api/course_api.dart'; -import 'package:flutter_parent/network/utils/api_prefs.dart'; -import 'package:flutter_parent/utils/service_locator.dart'; - -class CalendarFilterListInteractor { - Future?> getCoursesForSelectedStudent({bool isRefresh = false}) async { - var courses = await locator().getObserveeCourses(forceRefresh: isRefresh); - return courses?.where((course) => course.isValidForCurrentStudent(ApiPrefs.getCurrentStudent()?.id)).toList(); - } -} diff --git a/apps/flutter_parent/lib/screens/calendar/calendar_widget/calendar_filter_screen/calendar_filter_list_screen.dart b/apps/flutter_parent/lib/screens/calendar/calendar_widget/calendar_filter_screen/calendar_filter_list_screen.dart deleted file mode 100644 index ec5e4626b4..0000000000 --- a/apps/flutter_parent/lib/screens/calendar/calendar_widget/calendar_filter_screen/calendar_filter_list_screen.dart +++ /dev/null @@ -1,214 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:flutter/material.dart'; -import 'package:flutter_parent/l10n/app_localizations.dart'; -import 'package:flutter_parent/models/course.dart'; -import 'package:flutter_parent/screens/calendar/calendar_widget/calendar_filter_screen/calendar_filter_list_interactor.dart'; -import 'package:flutter_parent/utils/common_widgets/empty_panda_widget.dart'; -import 'package:flutter_parent/utils/common_widgets/error_panda_widget.dart'; -import 'package:flutter_parent/utils/common_widgets/loading_indicator.dart'; -import 'package:flutter_parent/utils/design/parent_theme.dart'; -import 'package:flutter_parent/utils/service_locator.dart'; - -class CalendarFilterListScreen extends StatefulWidget { - final Set _selectedCourses; - - CalendarFilterListScreen(this._selectedCourses); - - @override - State createState() => CalendarFilterListScreenState(); -} - -class CalendarFilterListScreenState extends State { - late Future?> _coursesFuture; - Set selectedContextIds = {}; // Public, to allow for testing - final GlobalKey _refreshCoursesKey = new GlobalKey(); - final GlobalKey _scaffoldKey = GlobalKey(); - bool selectAllIfEmpty = true; - int courseLength = -1; - - @override - void initState() { - _coursesFuture = locator.get().getCoursesForSelectedStudent(isRefresh: false); - super.initState(); - } - - @override - Widget build(BuildContext context) { - return WillPopScope( - onWillPop: () async { - // An empty list is interpreted as all courses selected TODO - change back for planner api - //Navigator.pop(context, courseLength == selectedContextIds.length ? {} : selectedContextIds); - Navigator.pop(context, selectedContextIds); - return false; - }, - child: DefaultParentTheme( - builder: (context) => Scaffold( - key: _scaffoldKey, - appBar: AppBar( - title: Text(L10n(context).calendars), - bottom: ParentTheme.of(context)?.appBarDivider(shadowInLightMode: false), - ), - body: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - SizedBox(height: 16.0), - Padding( - padding: const EdgeInsets.symmetric(horizontal: 16.0), - child: Text(L10n(context).calendarTapToFavoriteDesc, style: Theme.of(context).textTheme.bodyMedium), - ), - SizedBox(height: 24.0), - Expanded(child: _body()) - ], - ), - ), - ), - ); - } - - Widget _body() { - return FutureBuilder( - future: _coursesFuture, - builder: (context, snapshot) { - Widget _body; - List?_courses; - if (snapshot.hasError) { - _body = ErrorPandaWidget(L10n(context).errorLoadingCourses, () => _refreshCoursesKey.currentState?.show()); - } else if (snapshot.hasData) { - _courses = snapshot.data!; - courseLength = _courses.length; - if (selectedContextIds.isEmpty && selectAllIfEmpty) { - // We only want to do this the first time we load, otherwise if the user ever deselects all the - // contexts, then they will all automatically be put into the selected list - // Note: As unlikely as it is, if the user deselects all contexts then all contexts will be returned in the calendar - - // List will be empty when all courses are selected (on first load) - final tempList = _courses.map((c) => 'course_${c.id}').toList(); - selectedContextIds.addAll(tempList); - selectAllIfEmpty = false; - } - _body = (_courses.isEmpty) - ? EmptyPandaWidget( - svgPath: 'assets/svg/panda-book.svg', - title: L10n(context).noCoursesTitle, - subtitle: L10n(context).noCoursesMessage, - ) - : _courseList(_courses); - } else { - // This is a user with a filter from before the api migration, make sure we trim their list down. - selectedContextIds.addAll(widget._selectedCourses); - if (selectedContextIds.isNotEmpty) { - // The list isn't empty so we don't want to continue checking if the list is empty above, and - // select everything again (though if the user doesn't select anything and they go back, everything will be - // selected). - selectAllIfEmpty = false; - } - return LoadingIndicator(); - } - - return RefreshIndicator( - key: _refreshCoursesKey, - onRefresh: () { - _coursesFuture = - locator.get().getCoursesForSelectedStudent(isRefresh: true); - setState(() {}); - return _coursesFuture; - }, - child: _body, - ); - }); - } - - ListView _courseList(List courses) { - List _listItems = [ - _listHeader(L10n(context).coursesLabel), - ...courses.map((c) => MergeSemantics( - child: LabeledCheckbox( - label: c.name, - padding: const EdgeInsets.only(left: 2.0, right: 16.0), - value: selectedContextIds.contains(c.contextFilterId()), - onChanged: (bool newValue) { - setState(() { - if (newValue) { - selectedContextIds.add(c.contextFilterId()); - } else { - if (selectedContextIds.length == 1) { - // The list cannot be empty, the calendar wouldn't do anything! - ScaffoldMessenger.of(context).removeCurrentSnackBar(); - ScaffoldMessenger.of(context).showSnackBar(SnackBar(content: Text(L10n(context).minimumCalendarsError))); - } else { - selectedContextIds.remove(c.contextFilterId()); - } - } - }); - }), - )) - ]; - return ListView.builder( - key: Key('calendar_filter_list_key'), - physics: AlwaysScrollableScrollPhysics(), - itemCount: _listItems.length, // Add one for the Courses header - itemBuilder: (context, index) { - return _listItems[index]; - }); - } - - Widget _listHeader(String title) => Padding( - padding: const EdgeInsets.only(left: 16.0, right: 16.0), - child: Text( - title, - style: Theme.of(context).textTheme.bodyMedium, - ), - ); -} - -// Custom checkbox to better control the padding at the start -class LabeledCheckbox extends StatelessWidget { - const LabeledCheckbox({ - required this.label, - required this.padding, - required this.value, - required this.onChanged, - }); - - final String label; - final EdgeInsets padding; - final bool value; - final Function onChanged; - - @override - Widget build(BuildContext context) { - return InkWell( - onTap: () { - onChanged(!value); - }, - child: Padding( - padding: padding, - child: Row( - children: [ - Checkbox( - value: value, - onChanged: (bool? newValue) { - onChanged(newValue); - }, - ), - SizedBox(width: 21.0), - Expanded(child: Text(label, style: Theme.of(context).textTheme.titleMedium)), - ], - ), - ), - ); - } -} diff --git a/apps/flutter_parent/lib/screens/calendar/calendar_widget/calendar_month.dart b/apps/flutter_parent/lib/screens/calendar/calendar_widget/calendar_month.dart deleted file mode 100644 index e0cd2d5c75..0000000000 --- a/apps/flutter_parent/lib/screens/calendar/calendar_widget/calendar_month.dart +++ /dev/null @@ -1,116 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:flutter/material.dart'; -import 'package:flutter_parent/utils/core_extensions/date_time_extensions.dart'; -import 'package:flutter_parent/utils/core_extensions/list_extensions.dart'; - -import 'calendar_day.dart'; -import 'calendar_day_of_week_headers.dart'; -import 'calendar_week.dart'; - -class CalendarMonth extends StatefulWidget { - final int year; - final int month; - final DateTime selectedDay; - final DaySelectedCallback onDaySelected; - final MonthExpansionNotifier monthExpansionListener; - - CalendarMonth({ - required this.year, - required this.month, - required this.selectedDay, - required this.onDaySelected, - required this.monthExpansionListener, - super.key, - }); - - /// The maximum possible height of this widget - static double maxHeight = DayOfWeekHeaders.headerHeight + (6 * CalendarDay.dayHeight); - - static List generateWeekStarts(int year, int month) { - DateTime firstDayOfMonth = DateTime(year, month); - DateTime firstDayOfWeek = firstDayOfMonth.withFirstDayOfWeek()!; - - List weekStarts = [firstDayOfWeek]; - - while (true) { - var last = weekStarts.last; - var weekStart = DateTime(last.year, last.month, last.day + 7); - if (weekStart.month == month) { - weekStarts.add(weekStart); - } else { - break; - } - } - return weekStarts; - } - - @override - _CalendarMonthState createState() => _CalendarMonthState(); -} - -class _CalendarMonthState extends State { - late List weekStarts; - - @override - void initState() { - weekStarts = CalendarMonth.generateWeekStarts(widget.year, widget.month); - super.initState(); - } - - @override - Widget build(BuildContext context) { - final weekWidgets = weekStarts.mapIndexed((index, weekStart) { - final weekWidget = CalendarWeek( - firstDay: weekStart!, - selectedDay: widget.selectedDay, - onDaySelected: widget.onDaySelected, - displayDayOfWeekHeader: false, - ); - - return ValueListenableBuilder( - child: weekWidget, - valueListenable: widget.monthExpansionListener, - builder: (BuildContext context, double value, Widget? child) { - final top = DayOfWeekHeaders.headerHeight + (value * index * CalendarDay.dayHeight); - return Positioned( - top: top, - left: 0, - right: 0, - child: Opacity( - opacity: weekWidget.days.any((it) => it.isSameDayAs(widget.selectedDay)) - ? 1.0 - : Curves.easeInCubic.transform(value), - child: child, - ), - ); - }, - ); - }); - - return Stack( - children: [ - DayOfWeekHeaders(), - ...weekWidgets!, - ], - ); - } -} - -class MonthExpansionNotifier extends ValueNotifier { - MonthExpansionNotifier(double value) : super(value); - - void notify() => notifyListeners(); -} diff --git a/apps/flutter_parent/lib/screens/calendar/calendar_widget/calendar_week.dart b/apps/flutter_parent/lib/screens/calendar/calendar_widget/calendar_week.dart deleted file mode 100644 index b2c3094a4b..0000000000 --- a/apps/flutter_parent/lib/screens/calendar/calendar_widget/calendar_week.dart +++ /dev/null @@ -1,65 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:flutter/material.dart'; - -import 'calendar_day.dart'; -import 'calendar_day_of_week_headers.dart'; - -class CalendarWeek extends StatelessWidget { - static double weekHeight = DayOfWeekHeaders.headerHeight + CalendarDay.dayHeight; - - final DateTime firstDay; - final DateTime selectedDay; - final DaySelectedCallback onDaySelected; - final bool displayDayOfWeekHeader; - final List days; - - CalendarWeek({ - required this.firstDay, - required this.selectedDay, - required this.onDaySelected, - required this.displayDayOfWeekHeader, - super.key - }) : days = generateDays(firstDay); - - static List generateDays(DateTime firstDay) { - return List.generate(7, (index) => DateTime(firstDay.year, firstDay.month, firstDay.day + index)); - } - - @override - Widget build(BuildContext context) { - return Column( - children: [ - if (displayDayOfWeekHeader) DayOfWeekHeaders(), - Container( - height: CalendarDay.dayHeight, - child: Row( - mainAxisSize: MainAxisSize.max, - children: [ - for (DateTime day in days) - Expanded( - child: CalendarDay( - date: day, - selectedDay: selectedDay, - onDaySelected: onDaySelected, - ), - ) - ], - ), - ), - ], - ); - } -} diff --git a/apps/flutter_parent/lib/screens/calendar/calendar_widget/calendar_widget.dart b/apps/flutter_parent/lib/screens/calendar/calendar_widget/calendar_widget.dart deleted file mode 100644 index 08e475fb87..0000000000 --- a/apps/flutter_parent/lib/screens/calendar/calendar_widget/calendar_widget.dart +++ /dev/null @@ -1,672 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'dart:math'; - -import 'package:flutter/cupertino.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_parent/l10n/app_localizations.dart'; -import 'package:flutter_parent/screens/calendar/calendar_today_click_notifier.dart'; -import 'package:flutter_parent/screens/calendar/calendar_today_notifier.dart'; -import 'package:flutter_parent/screens/calendar/calendar_widget/calendar_day.dart'; -import 'package:flutter_parent/screens/calendar/calendar_widget/calendar_month.dart'; -import 'package:flutter_parent/screens/calendar/calendar_widget/calendar_week.dart'; -import 'package:flutter_parent/screens/calendar/planner_fetcher.dart'; -import 'package:flutter_parent/utils/common_widgets/dropdown_arrow.dart'; -import 'package:flutter_parent/utils/core_extensions/date_time_extensions.dart'; -import 'package:flutter_parent/utils/design/canvas_icons.dart'; -import 'package:flutter_parent/utils/design/parent_theme.dart'; -import 'package:flutter_parent/utils/service_locator.dart'; -import 'package:intl/intl.dart' hide TextDirection; -import 'package:provider/provider.dart'; -import 'package:tuple/tuple.dart'; - -import 'calendar_day_of_week_headers.dart'; - -class CalendarWidget extends StatefulWidget { - /// The curve to be used by all calendar animations - static const Curve animCurve = Curves.easeInOutCubic; - - /// The duration to be used by all calendar animations - static const Duration animDuration = const Duration(milliseconds: 300); - - /// Called to obtain the child widget for the specified [day] - final Widget Function(BuildContext context, DateTime day) dayBuilder; - - /// A [PlannerFetcher] that handles fetching planner events from the API - final PlannerFetcher fetcher; - - final VoidCallback? onFilterTap; - - /// Starting DateTime, defaults to today's date - final DateTime? startingDate; - - /// Starting view, either 'week' or 'calendar' - final CalendarView? startingView; - - const CalendarWidget({ - required this.dayBuilder, - required this.fetcher, - this.onFilterTap, - this.startingDate, - this.startingView, - super.key - }); - - @override - CalendarWidgetState createState() => CalendarWidgetState(); -} - -@visibleForTesting -enum CalendarPageChangeBehavior { none, jump, animate } - -@visibleForTesting -class CalendarWidgetState extends State with TickerProviderStateMixin { - // Day, week, and month page indices for 'today'. - // - // Rather than track dates from the beginning of time/unix epoch/whatever, they are tracked - // from the current DateTime such that the 'center' of the calendar range will always be the current date. The indices - // here denote which page marks the center (i.e. initial page) of the respective PageViews for day, week, and month. - // - // The advantage of this approach is the ease of date tracking when constrained by the mechanics of PageView. The - // disadvantage is that behavior is undefined at the min/max page indices. This means that if a user chooses to - // manually swipe through 80+ years of calendar pages, they will discover a magical easter egg of sadness - // at the end of their journey. - static const int _todayDayIndex = 100000; - static const int _todayWeekIndex = 10000; - static const int _todayMonthIndex = 1000; - - // The max indices for the day, week, and month pagers. Because the 'today' indices represent the center of the - // calendar range, these indices are simply double that of the 'today' indices. - static const int _maxDayIndex = _todayDayIndex * 2; - static const int _maxWeekIndex = _todayWeekIndex * 2; - static const int _maxMonthIndex = _todayMonthIndex * 2; - - /// The currently-selected date - DateTime selectedDay = DateTime.now(); - - // Global keys for the PageViews - Key _dayKey = GlobalKey(); - Key _weekKey = GlobalKey(); - Key _monthKey = GlobalKey(); - - // Page controllers - late PageController _dayController; - late PageController _weekController; - late PageController _monthController; - - // Notifier that tracks the current month collapse/expand progress - MonthExpansionNotifier _monthExpansionNotifier = MonthExpansionNotifier(0.0); - - // Whether the calendar can be expanded to show the month view. This will only be false in cases where there - // is not enough vertical space available to display the entire month - bool _canExpandMonth = true; - - // Whether the month view is expanded, either partially or fully. This is updated by _monthExpansionNotifier - // when the expansion value changes to or from zero. - bool _isMonthExpanded = false; - - // The height of the fully-expanded month widget, which will vary depending on the number of week in the month. - double _fullMonthHeight = _calculateFullMonthHeight(_todayMonthIndex); - - // Returns the allowed expansion height of the month calendar, i.e. the difference between the height of the - // week widget and the height of the fully-expanded month widget. - double get _monthExpansionHeight => _fullMonthHeight - CalendarWeek.weekHeight; - - // Controller for animating the month expand/collapse progress when the user presses the expand/collapse button - late AnimationController _monthExpandAnimController; - - // Controller for animating the month expand/collapse progress when the user swipes vertically on the calendar - late AnimationController? _monthFlingAnimController; - - // Controller for animating the full month height when switching between months that have a different number of weeks - late AnimationController _monthHeightAdjustAnimController; - - // Returns the full month height for the month found at the specified month pager index - static double _calculateFullMonthHeight(int monthIndex) { - var yearMonth = _yearAndMonthForIndex(monthIndex); - var weeks = CalendarMonth.generateWeekStarts(yearMonth.item1, yearMonth.item2).length; - return DayOfWeekHeaders.headerHeight + (weeks * CalendarDay.dayHeight); - } - - // Returns the DateTime that represents the day associated with the specified day pager index - static DateTime _dayForIndex(int index) { - final today = DateTime.now(); - final diff = index - _todayDayIndex; - return DateTime(today.year, today.month, today.day).add(Duration(days: diff)).roundToMidnight()!; - } - - // Returns the DateTime that represents the first day of the week associated with the specified week pager index - static DateTime _weekStartForIndex(int index) { - final today = DateTime.now(); - int weekOffset = index - _todayWeekIndex; - return DateTime(today.year, today.month, today.day + (weekOffset * 7)).withFirstDayOfWeek()!; - } - - // Returns the year and month associated with the specified month pager index - static Tuple2 _yearAndMonthForIndex(int index) { - final today = DateTime.now(); - int monthOffset = index - _todayMonthIndex; - int monthOffsetFromYearStart = today.month - 1 + monthOffset; - int yearOffset = (monthOffsetFromYearStart / 12).floor(); - - var month = 1 + ((today.month - 1 + monthOffset) % 12); - var year = today.year + yearOffset; - - return Tuple2(year, month); - } - - // Returns the month pager index associated with the specified year and month - static int _indexForYearAndMonth(int year, int month) { - final today = DateTime.now(); - int yearOffset = year - today.year; - int monthOffset = month - today.month; - return _todayMonthIndex + monthOffset + (yearOffset * 12); - } - - // Returns the week pager index associated with the week in which the specified day falls - static int _weekIndexForDay(DateTime day) { - final weekStart = day.withFirstDayOfWeek(); - final thisWeekStart = DateTime.now().withFirstDayOfWeek(); - double weeksDiff = thisWeekStart!.difference(weekStart!).inDays / 7; - return _todayWeekIndex - weeksDiff.round(); - } - - // Returns the day pager index associated with the specified day - static int _dayIndexForDay(DateTime day) { - final todayNow = DateTime.now(); - final today = DateTime(todayNow.year, todayNow.month, todayNow.day); - final diff = today.difference(day).inMicroseconds / Duration.microsecondsPerDay; - return _todayDayIndex - diff.round(); - } - - @override - void initState() { - locator().addListener(_todayClicked); - - // Update _isMonthExpanded when expansion value changes to or from zero - _monthExpansionNotifier.addListener(() { - bool isExpanded = _monthExpansionNotifier.value > 0.0; - if (isExpanded != _isMonthExpanded) { - _isMonthExpanded = isExpanded; - setState(() {}); - } - }); - - if (_canExpandMonth) { - if (widget.startingView == CalendarView.Month) { - _isMonthExpanded = true; - _monthExpansionNotifier.value = 1.0; - } else - _isMonthExpanded = false; - } - - // Set up animation controller for tap-to-expand/collapse button - _monthExpandAnimController = AnimationController(duration: CalendarWidget.animDuration, vsync: this); - - // Set up animation controller for animating month height changes due to different week counts - _monthHeightAdjustAnimController = AnimationController(duration: CalendarWidget.animDuration, vsync: this); - - // Set up animation controller for expand/collapse fling animation - _monthFlingAnimController = AnimationController(duration: CalendarWidget.animDuration, vsync: this); - _monthFlingAnimController?.addListener(() { - _monthExpansionNotifier.value = _monthFlingAnimController!.value; - }); - - // Set up controllers for day, week, and month pagers - _dayController = PageController(initialPage: _todayDayIndex); - _weekController = PageController(initialPage: _todayWeekIndex); - _monthController = PageController(initialPage: _todayMonthIndex); - - if (widget.startingDate != null) { - WidgetsBinding.instance.addPostFrameCallback((_) { - selectDay( - widget.startingDate!, - dayPagerBehavior: CalendarPageChangeBehavior.jump, - weekPagerBehavior: CalendarPageChangeBehavior.jump, - monthPagerBehavior: CalendarPageChangeBehavior.jump, - ); - }); - } - - super.initState(); - } - - @override - Widget build(BuildContext context) { - return ChangeNotifierProvider( - create: (context) => widget.fetcher, - child: Column( - crossAxisAlignment: CrossAxisAlignment.stretch, - children: [ - _calendarHeader(), - Expanded( - child: Stack( - children: [ - _heightMonitor(), - Column( - children: [ - _calendar(), - Divider(height: 1), - Expanded(child: _dayPager()), - ], - ), - ], - ), - ), - ], - ), - ); - } - - Widget _calendarHeader() { - List a11yButtons = []; - if (MediaQuery.of(context).accessibleNavigation) { - if (_isMonthExpanded) { - a11yButtons = _a11yMonthButtons(); - } else { - a11yButtons = _a11yWeekButtons(); - } - } - - return Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - crossAxisAlignment: CrossAxisAlignment.end, - children: [ - InkWell( - key: Key('expand-button'), - onTap: _canExpandMonth ? _toggleExpanded : null, - child: Semantics( - label: L10n(context).selectedMonthLabel(DateFormat.yMMMM(supportedDateLocale).format(selectedDay)), - onTapHint: _isMonthExpanded ? L10n(context).monthTapCollapseHint : L10n(context).monthTapExpandHint, - excludeSemantics: true, - child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 12), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text( - DateFormat.y(supportedDateLocale).format(selectedDay), - style: Theme.of(context).textTheme.labelSmall, - ), - Row( - children: [ - Text( - DateFormat.MMMM(supportedDateLocale).format(selectedDay), - style: Theme.of(context).textTheme.headlineMedium, - ), - SizedBox(width: 10), - Visibility( - visible: _canExpandMonth, - child: ValueListenableBuilder( - builder: (BuildContext context, value, Widget? child) { - return DropdownArrow( - specificProgress: value, color: ParentTheme.of(context)!.onSurfaceColor); - }, - valueListenable: _monthExpansionNotifier, - ), - ), - ], - ), - ], - ), - ), - ), - ), - ...a11yButtons, - InkWell( - onTap: widget.onFilterTap, - child: Container( - height: 48, - alignment: Alignment.bottomRight, - child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 15), - child: Text( - L10n(context).calendars, - style: Theme.of(context).textTheme.bodyMedium?.copyWith(color: Theme.of(context).colorScheme.secondary), - ), - ), - ), - ) - ], - ); - } - - Widget _calendar() { - return GestureDetector( - onVerticalDragUpdate: _canExpandMonth - ? (details) { - var expansionDiff = details.primaryDelta! / _monthExpansionHeight; - _monthExpansionNotifier.value = (_monthExpansionNotifier.value + expansionDiff).clamp(0.0, 1.0); - } - : null, - onVerticalDragEnd: _canExpandMonth - ? (details) { - _monthFlingAnimController?.stop(); - if (_isMonthExpanded) { - _monthFlingAnimController?.value = _monthExpansionNotifier.value; - _monthFlingAnimController?.fling(velocity: details.primaryVelocity! / _monthExpansionHeight); - } - } - : null, - child: ValueListenableBuilder( - child: Stack( - children: [ - Offstage(offstage: _isMonthExpanded, child: _weekPager()), - Offstage(offstage: !_isMonthExpanded, child: _monthPager()), - ], - ), - valueListenable: _monthExpansionNotifier, - builder: (BuildContext context, double value, Widget? child) { - return Container( - height: CalendarWeek.weekHeight + (value * _monthExpansionHeight), - child: child, - ); - }, - ), - ); - } - - Widget _dayPager() { - final pager = PageView.builder( - key: _dayKey, - controller: _dayController, - itemCount: _maxDayIndex, - itemBuilder: (context, index) { - DateTime date = _dayForIndex(index); - return widget.dayBuilder(context, date); - }, - onPageChanged: (index) { - selectDay(_dayForIndex(index), dayPagerBehavior: CalendarPageChangeBehavior.none); - }, - ); - - GestureDragUpdateCallback? updateCallback = null; - GestureDragEndCallback? endCallback = null; - - if (_isMonthExpanded) { - updateCallback = (details) { - var expansionDiff = details.primaryDelta! / _monthExpansionHeight; - _monthExpansionNotifier.value = (_monthExpansionNotifier.value + expansionDiff).clamp(0.0, 1.0); - }; - endCallback = (details) { - _monthFlingAnimController?.stop(); - _monthFlingAnimController?.value = _monthExpansionNotifier.value; - _monthFlingAnimController?.fling(velocity: details.primaryVelocity! / _monthExpansionHeight); - }; - } - - return Stack( - fit: StackFit.expand, - children: [ - pager, - if (_isMonthExpanded) - GestureDetector( - excludeFromSemantics: true, - behavior: HitTestBehavior.translucent, - onVerticalDragUpdate: updateCallback, - onVerticalDragEnd: endCallback, - ), - ], - ); - } - - Widget _monthPager() { - return PageView.builder( - key: _monthKey, - itemCount: _maxMonthIndex, - controller: _monthController, - itemBuilder: (context, index) { - final yearMonth = _yearAndMonthForIndex(index); - return CalendarMonth( - year: yearMonth.item1, - month: yearMonth.item2, - selectedDay: selectedDay, - monthExpansionListener: _monthExpansionNotifier, - onDaySelected: (day) { - selectDay(day, dayPagerBehavior: CalendarPageChangeBehavior.jump); - }, - ); - }, - onPageChanged: (index) { - final oldHeight = _fullMonthHeight; - final newHeight = _calculateFullMonthHeight(index); - - var yearMonth = _yearAndMonthForIndex(index); - - var maxDays = DateTime(yearMonth.item1, yearMonth.item2 + 1, 0).day; - int dayOfMonth = min(maxDays, selectedDay.day); - selectDay(DateTime(yearMonth.item1, yearMonth.item2, dayOfMonth), - monthPagerBehavior: CalendarPageChangeBehavior.none, weekPagerBehavior: CalendarPageChangeBehavior.jump); - - if (oldHeight != newHeight) { - double begin = oldHeight / newHeight; - double end = 1.0; - _monthHeightAdjustAnimController.stop(); - _monthHeightAdjustAnimController.reset(); - Tween tween = Tween(begin: begin, end: end); - Animation anim = tween.animate( - CurvedAnimation(parent: _monthHeightAdjustAnimController, curve: CalendarWidget.animCurve), - ); - VoidCallback? listener = null; - listener = () { - if (anim.status == AnimationStatus.completed && listener != null) anim.removeListener(listener); - _fullMonthHeight = anim.value * newHeight; - _monthExpansionNotifier.notify(); - }; - anim.addListener(listener); - _monthHeightAdjustAnimController.forward(); - } - }, - ); - } - - void selectDay( - DateTime day, { - CalendarPageChangeBehavior dayPagerBehavior = CalendarPageChangeBehavior.jump, - CalendarPageChangeBehavior weekPagerBehavior = CalendarPageChangeBehavior.animate, - CalendarPageChangeBehavior monthPagerBehavior = CalendarPageChangeBehavior.animate, - }) { - // Do nothing if the day is already selected - if (selectedDay.isSameDayAs(day)) return; - - selectedDay = day; - - // Enable/disable the today button - Provider.of(context, listen: false).value = !DateTime.now().isSameDayAs(selectedDay); - - // Month change - if (monthPagerBehavior == CalendarPageChangeBehavior.animate) { - _monthController.animateToPage( - _indexForYearAndMonth(selectedDay.year, selectedDay.month), - duration: CalendarWidget.animDuration, - curve: CalendarWidget.animCurve, - ); - } else if (monthPagerBehavior == CalendarPageChangeBehavior.jump) { - _monthController.jumpToPage(_indexForYearAndMonth(selectedDay.year, selectedDay.month)); - } - - // Week change - if (weekPagerBehavior == CalendarPageChangeBehavior.animate) { - _weekController.animateToPage( - _weekIndexForDay(selectedDay), - duration: CalendarWidget.animDuration, - curve: CalendarWidget.animCurve, - ); - } else if (weekPagerBehavior == CalendarPageChangeBehavior.jump) { - _weekController.jumpToPage(_weekIndexForDay(selectedDay)); - } - - // Day change - if (dayPagerBehavior == CalendarPageChangeBehavior.animate) { - _dayController.animateToPage( - _dayIndexForDay(day), - duration: CalendarWidget.animDuration, - curve: CalendarWidget.animCurve, - ); - } else if (dayPagerBehavior == CalendarPageChangeBehavior.jump) { - _dayController.jumpToPage(_dayIndexForDay(day)); - } - setState(() {}); - } - - Widget _weekPager() { - return PageView.builder( - key: _weekKey, - itemCount: _maxWeekIndex, - controller: _weekController, - itemBuilder: (context, index) { - final weekStart = _weekStartForIndex(index); - return CalendarWeek( - selectedDay: selectedDay, - firstDay: weekStart, - displayDayOfWeekHeader: true, - onDaySelected: (day) { - selectDay(day, - dayPagerBehavior: CalendarPageChangeBehavior.jump, weekPagerBehavior: CalendarPageChangeBehavior.none); - }, - ); - }, - onPageChanged: (index) { - if (_isMonthExpanded) return; - var weekStart = _weekStartForIndex(index); - var selectedDayOffset = (selectedDay.weekday - weekStart.weekday) % 7; - var newSelectedDay = DateTime(weekStart.year, weekStart.month, weekStart.day + selectedDayOffset); - - selectDay( - newSelectedDay, - weekPagerBehavior: CalendarPageChangeBehavior.none, - monthPagerBehavior: CalendarPageChangeBehavior.jump, - ); - }, - ); - } - - List _a11yWeekButtons() { - int index = _todayWeekIndex; - if (_weekController.hasClients) { - index = _weekController.page?.toInt() ?? 0; - } - - final format = DateFormat.MMMMd(supportedDateLocale).add_y(); - - final previousWeek = _weekStartForIndex(index - 1); - final previousWeekName = format.format(previousWeek); - - final nextWeek = _weekStartForIndex(index + 1); - final nextWeekName = format.format(nextWeek); - - return [ - IconButton( - key: Key('calendar-a11y-previous-week'), - tooltip: L10n(context).previousWeek(previousWeekName), - icon: Icon(CanvasIcons.arrow_left), - onPressed: () { - _weekController.jumpToPage(index - 1); - }, - ), - IconButton( - key: Key('calendar-a11y-next-week'), - tooltip: L10n(context).nextWeek(nextWeekName), - icon: Icon(CanvasIcons.arrow_right), - onPressed: () { - _weekController.jumpToPage(index + 1); - }, - ), - ]; - } - - List _a11yMonthButtons() { - int index = _todayMonthIndex; - if (_monthController.hasClients) { - index = _monthController.page?.toInt() ?? 0; - } - - final format = DateFormat.MMMM(supportedDateLocale).add_y(); - - final previousMonth = _yearAndMonthForIndex(index - 1); - final previousMonthName = format.format(DateTime(previousMonth.item1, previousMonth.item2)); - - final nextMonth = _yearAndMonthForIndex(index + 1); - final nextMonthName = format.format(DateTime(nextMonth.item1, nextMonth.item2)); - - return [ - IconButton( - key: Key('calendar-a11y-previous-month'), - tooltip: L10n(context).previousMonth(previousMonthName), - icon: Icon(CanvasIcons.arrow_left), - onPressed: () { - _monthController.jumpToPage(index - 1); - }, - ), - IconButton( - key: Key('calendar-a11y-next-month'), - tooltip: L10n(context).nextMonth(nextMonthName), - icon: Icon(CanvasIcons.arrow_right), - onPressed: () { - _monthController.jumpToPage(index + 1); - }, - ), - ]; - } - - /// Builds a widget that monitors the available vertical space available for a fully-expanded month view. If the - /// space ever becomes insufficient, the month view will be collapsed and disabled. - Widget _heightMonitor() { - return LayoutBuilder( - builder: (context, constraints) { - bool expansionAllowed = constraints.maxHeight > CalendarMonth.maxHeight; - if (expansionAllowed != _canExpandMonth) { - if (!expansionAllowed && _isMonthExpanded) _toggleExpanded(); - WidgetsBinding.instance.addPostFrameCallback((_) { - setState(() { - _canExpandMonth = expansionAllowed; - }); - }); - } - return Container(width: double.infinity, height: double.infinity); - }, - ); - } - - _toggleExpanded() { - double begin = _monthExpansionNotifier.value; - double end = _isMonthExpanded ? 0.0 : 1.0; - _monthExpandAnimController.stop(); - _monthExpandAnimController.reset(); - Tween tween = Tween(begin: begin, end: end); - final Animation anim = tween.animate( - CurvedAnimation(parent: _monthExpandAnimController, curve: CalendarWidget.animCurve), - ); - VoidCallback? listener = null; - listener = () { - _monthExpansionNotifier.value = anim.value; - if (anim.status == AnimationStatus.completed && listener != null) anim.removeListener(listener); - }; - anim.addListener(listener); - _monthExpandAnimController.forward(); - } - - // Use a date without a time (default to midnight), otherwise the second call to selectDay() in the day/month pager - // will be off by one day - _todayClicked() => selectDay(DateTime(DateTime.now().year, DateTime.now().month, DateTime.now().day)); - - @override - void dispose() { - locator().removeListener(_todayClicked); - super.dispose(); - } -} - -enum CalendarView { Month, Week } diff --git a/apps/flutter_parent/lib/screens/calendar/planner_fetcher.dart b/apps/flutter_parent/lib/screens/calendar/planner_fetcher.dart deleted file mode 100644 index 3092680b07..0000000000 --- a/apps/flutter_parent/lib/screens/calendar/planner_fetcher.dart +++ /dev/null @@ -1,249 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'dart:async'; - -import 'package:built_collection/built_collection.dart'; -import 'package:flutter/cupertino.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_parent/models/calendar_filter.dart'; -import 'package:flutter_parent/models/course.dart'; -import 'package:flutter_parent/models/planner_item.dart'; -import 'package:flutter_parent/models/schedule_item.dart'; -import 'package:flutter_parent/network/api/calendar_events_api.dart'; -import 'package:flutter_parent/screens/courses/courses_interactor.dart'; -import 'package:flutter_parent/utils/core_extensions/date_time_extensions.dart'; -import 'package:flutter_parent/utils/db/calendar_filter_db.dart'; -import 'package:flutter_parent/utils/service_locator.dart'; - -class PlannerFetcher extends ChangeNotifier { - final Map>?> daySnapshots = {}; - - final Map failedMonths = {}; - - // Maps observee ids to a map of course ids to names - final Map> courseNameMap = {}; - - final String userDomain; - - final String userId; - - Future?>? courseListFuture; - bool firstFilterUpdateFlag = false; - - String _observeeId; - - String get observeeId => _observeeId; - - PlannerFetcher({DateTime? fetchFirst, required String observeeId, required this.userDomain, required this.userId}): _observeeId = observeeId { - if (fetchFirst != null) getSnapshotForDate(fetchFirst); - } - - Future> getContexts() async { - CalendarFilter? calendarFilter = await locator().getByObserveeId( - userDomain, - userId, - _observeeId, - ); - if (calendarFilter == null || (courseNameMap[_observeeId] == null || courseNameMap[_observeeId]!.isEmpty)) { - // We need to fetch the courses for a couple of reasons: - // First, scheduleItems don't have a context name. - // Second, calendar is opposite planner, in that 0 contexts means no calendar items. In order to deal with that - // case we have to load all courses and set the first ten as filters for the first load - if (courseListFuture == null) { - courseListFuture = locator().getCourses(isRefresh: true); - } - - var courses = await courseListFuture; - - if (courseNameMap[_observeeId] == null) { - courseNameMap[_observeeId] = {}; - } - - // Add the names to our map so we can fill those in later - // We have to handle the case where their filter is from before the api migration, so we trim it down. - courses?.forEach((course) => courseNameMap[_observeeId]![course.id] = course.name); - var tempCourseList = courses?.map((course) => course.contextFilterId()).toList(); - Set courseSet = Set.from(tempCourseList ?? []); - - if (calendarFilter != null) { - return calendarFilter.filters.toSet(); - } else if (firstFilterUpdateFlag == false) { - // This initial DB insert only needs to happen once for fresh users, - // prevent the multiple month loads from repeating it - CalendarFilter filter = CalendarFilter((b) => b - ..userDomain = userDomain - ..userId = userId - ..observeeId = _observeeId - ..filters = SetBuilder(courseSet)); - locator().insertOrUpdate(filter); - firstFilterUpdateFlag = true; - } - - return courseSet; - } else { - return calendarFilter.filters.toSet(); - } - } - - AsyncSnapshot> getSnapshotForDate(DateTime date) { - final dayKey = dayKeyForDate(date); - AsyncSnapshot>? daySnapshot = daySnapshots[dayKey]; - if (daySnapshot != null) return daySnapshot; - _beginMonthFetch(date); - return daySnapshots[dayKey]!; - } - - Future refreshItemsForDate(DateTime date) async { - String dayKey = dayKeyForDate(date); - bool hasError = daySnapshots[dayKey]?.hasError ?? true; - bool monthFailed = failedMonths[monthKeyForYearMonth(date.year, date.month)] ?? false; - if (hasError && monthFailed) { - // Previous fetch failed, retry the whole month - _beginMonthFetch(date, refresh: true); - notifyListeners(); - } else { - // Just retry the single day - if (hasError) { - daySnapshots[dayKey] = AsyncSnapshot>.nothing().inState(ConnectionState.waiting); - } else { - daySnapshots[dayKey] = daySnapshots[dayKey]!.inState(ConnectionState.waiting); - } - notifyListeners(); - try { - final contexts = await getContexts(); - List items = await fetchPlannerItems(date.withStartOfDay()!, date.withEndOfDay()!, contexts, true); - daySnapshots[dayKey] = AsyncSnapshot>.withData(ConnectionState.done, items); - } catch (e) { - daySnapshots[dayKey] = AsyncSnapshot>.withError(ConnectionState.done, e); - } finally { - notifyListeners(); - } - } - } - - _beginMonthFetch(DateTime date, {bool refresh = false}) { - final lastDayOfMonth = date.withEndOfMonth()!.day; - for (int i = 1; i <= lastDayOfMonth; i++) { - var dayKey = dayKeyForYearMonthDay(date.year, date.month, i); - daySnapshots[dayKey] = AsyncSnapshot>.nothing().inState(ConnectionState.waiting); - } - _fetchMonth(date, refresh); - } - - _fetchMonth(DateTime date, bool refresh) async { - try { - final contexts = await getContexts(); - List items = - await fetchPlannerItems(date.withStartOfMonth()!, date.withEndOfMonth()!, contexts, refresh); - _completeMonth(items, date); - } catch (e) { - _failMonth(e, date); - } - } - - @visibleForTesting - Future> fetchPlannerItems( - DateTime startDate, DateTime endDate, Set contexts, bool refresh) async { - List?> tempItems = await Future.wait([ - locator().getUserCalendarItems( - _observeeId, - startDate, - endDate, - ScheduleItem.apiTypeAssignment, - contexts: contexts, - forceRefresh: refresh, - ), - locator().getUserCalendarItems( - _observeeId, - startDate, - endDate, - ScheduleItem.apiTypeCalendar, - contexts: contexts, - forceRefresh: refresh, - ), - ]); - List? scheduleItems; - if (tempItems[0] == null || tempItems[1] == null) { - scheduleItems = []; - } - else { - scheduleItems = tempItems[0]! + tempItems[1]!; - } - scheduleItems.retainWhere((it) => it.isHidden != true); // Exclude hidden items - return scheduleItems.map((item) => item.toPlannerItem(courseNameMap[_observeeId]![item.getContextId()])).toList(); - } - - _completeMonth(List items, DateTime date) { - failedMonths[monthKeyForDate(date)] = false; - final Map> dayItems = {}; - final lastDayOfMonth = date.withEndOfMonth()!.day; - for (int i = 1; i <= lastDayOfMonth; i++) { - dayItems[dayKeyForYearMonthDay(date.year, date.month, i)] = []; - } - items.forEach((item) { - if (item.plannableDate != null) { - String dayKey = dayKeyForDate(item.plannableDate!.toLocal()); - dayItems[dayKey]?.add(item); - } - }); - - dayItems.forEach((dayKey, items) { - daySnapshots[dayKey] = AsyncSnapshot>.withData(ConnectionState.done, items); - }); - notifyListeners(); - } - - _failMonth(Object error, DateTime date) { - failedMonths[monthKeyForDate(date)] = true; - final lastDayOfMonth = date.withEndOfMonth()!.day; - for (int i = 1; i <= lastDayOfMonth; i++) { - daySnapshots[dayKeyForYearMonthDay(date.year, date.month, i)] = - AsyncSnapshot.withError(ConnectionState.done, error); - } - notifyListeners(); - } - - String dayKeyForDate(DateTime date) => dayKeyForYearMonthDay(date.year, date.month, date.day); - - String monthKeyForDate(DateTime date) => monthKeyForYearMonth(date.year, date.month); - - String dayKeyForYearMonthDay(int year, int month, int day) => '$year-$month-$day'; - - String monthKeyForYearMonth(int year, int month) => '$year-$month'; - - Future setContexts(Set contexts) async { - CalendarFilter filter = CalendarFilter((b) => b - ..userDomain = userDomain - ..userId = userId - ..observeeId = _observeeId - ..filters = SetBuilder(contexts)); - await locator().insertOrUpdate(filter); - reset(); - } - - void setObserveeId(String observeeId) { - this._observeeId = observeeId; - // Reset the flag for first time DB inserts - this.firstFilterUpdateFlag = false; - this.courseListFuture = null; - reset(); - } - - void reset() { - daySnapshots.clear(); - failedMonths.clear(); - notifyListeners(); - } -} diff --git a/apps/flutter_parent/lib/screens/courses/courses_interactor.dart b/apps/flutter_parent/lib/screens/courses/courses_interactor.dart deleted file mode 100644 index 2580a177f5..0000000000 --- a/apps/flutter_parent/lib/screens/courses/courses_interactor.dart +++ /dev/null @@ -1,27 +0,0 @@ -// Copyright (C) 2019 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:flutter_parent/models/course.dart'; -import 'package:flutter_parent/network/api/course_api.dart'; -import 'package:flutter_parent/network/utils/api_prefs.dart'; -import 'package:flutter_parent/utils/service_locator.dart'; - -class CoursesInteractor { - Future?> getCourses({bool isRefresh = false, String? studentId = null}) async { - var courses = await locator().getObserveeCourses(forceRefresh: isRefresh); - var currentStudentId = studentId; - if (currentStudentId == null) currentStudentId = ApiPrefs.getCurrentStudent()?.id; - return courses?.where((course) => course.isValidForCurrentStudent(currentStudentId)).toList(); - } -} diff --git a/apps/flutter_parent/lib/screens/courses/courses_screen.dart b/apps/flutter_parent/lib/screens/courses/courses_screen.dart deleted file mode 100644 index 36ab053186..0000000000 --- a/apps/flutter_parent/lib/screens/courses/courses_screen.dart +++ /dev/null @@ -1,163 +0,0 @@ -// Copyright (C) 2019 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:flutter/material.dart'; -import 'package:flutter_parent/l10n/app_localizations.dart'; -import 'package:flutter_parent/models/course.dart'; -import 'package:flutter_parent/models/course_grade.dart'; -import 'package:flutter_parent/models/user.dart'; -import 'package:flutter_parent/router/panda_router.dart'; -import 'package:flutter_parent/screens/dashboard/selected_student_notifier.dart'; -import 'package:flutter_parent/utils/common_widgets/empty_panda_widget.dart'; -import 'package:flutter_parent/utils/common_widgets/error_panda_widget.dart'; -import 'package:flutter_parent/utils/common_widgets/loading_indicator.dart'; -import 'package:flutter_parent/utils/quick_nav.dart'; -import 'package:flutter_parent/utils/service_locator.dart'; -import 'package:intl/intl.dart'; -import 'package:provider/provider.dart'; - -import 'courses_interactor.dart'; - -class CoursesScreen extends StatefulWidget { - @override - _CoursesScreenState createState() => _CoursesScreenState(); -} - -class _CoursesScreenState extends State { - User? _student; - - Future?>? _coursesFuture; - - CoursesInteractor _interactor = locator(); - - final GlobalKey _refreshKey = new GlobalKey(); - - @override - void didChangeDependencies() { - super.didChangeDependencies(); - var _selectedStudent = Provider.of(context, listen: true).value; - if (_student != _selectedStudent) { - // The student was changed by the user - _student = _selectedStudent; - // Update the courses - this is done in case a new user was added after the initial course grabbing - _coursesFuture = _loadCourses(forceRefresh: true); - } - } - - Future?> _loadCourses({bool forceRefresh = false}) => - _interactor.getCourses(isRefresh: forceRefresh, studentId: _student?.id.isEmpty == true ? null : _student!.id); - - @override - Widget build(BuildContext context) => _content(context); - - Widget _content(BuildContext context) { - return FutureBuilder( - future: _coursesFuture, - builder: (context, AsyncSnapshot?> snapshot) { - Widget _body; - if (snapshot.hasError) { - _body = ErrorPandaWidget(L10n(context).errorLoadingCourses, () => _refreshKey.currentState?.show()); - } else if (snapshot.hasData) { - _body = (snapshot.data!.isEmpty) - ? EmptyPandaWidget( - svgPath: 'assets/svg/panda-book.svg', - title: L10n(context).noCoursesTitle, - subtitle: L10n(context).noCoursesMessage, - ) - : _success(snapshot.data!); - } else { - return LoadingIndicator(); - } - - return RefreshIndicator( - key: _refreshKey, - onRefresh: () => _refresh(), - child: _body, - ); - }, - ); - } - - Widget _success(Iterable courses) { - return ListView.builder( - scrollDirection: Axis.vertical, - physics: const AlwaysScrollableScrollPhysics(), - itemCount: courses.length, - itemBuilder: (context, idx) { - var course = courses.toList()[idx]; - final grade = _courseGrade(context, course); - return ListTile( - onTap: () => _courseTapped(context, course), - contentPadding: const EdgeInsets.symmetric(horizontal: 16), - title: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - SizedBox(height: 8), - Text(course.name, - style: Theme.of(context).textTheme.titleMedium, key: Key("${course.courseCode}_name")), - SizedBox(height: 2), - Text(course.courseCode ?? '', - style: Theme.of(context).textTheme.bodySmall, key: Key("${course.courseCode}_code")), - if (grade != null) SizedBox(height: 4), - if (grade != null) grade, - SizedBox(height: 8), - ], - ), - ); - }); - } - - Widget? _courseGrade(context, Course course) { - CourseGrade grade = course.getCourseGrade(_student?.id); - var format = NumberFormat.percentPattern(); - format.maximumFractionDigits = 2; - - if (grade.isCourseGradeLocked(forAllGradingPeriods: course.enrollments?.any((enrollment) => enrollment.hasActiveGradingPeriod()) != true) || - (course.settings?.restrictQuantitativeData == true && grade.currentGrade() == null)) { - return null; - } - // If there is no current grade, return 'No grade' - // Otherwise, we have a grade, so check if we have the actual grade string - // or a score - var formattedScore = (grade.currentScore() != null && !(course.settings?.restrictQuantitativeData ?? false)) - ? format.format(grade.currentScore()! / 100) - : ''; - var text = grade.noCurrentGrade() - ? L10n(context).noGrade - : grade.currentGrade()?.isNotEmpty == true - ? "${grade.currentGrade()}${formattedScore.isNotEmpty ? ' $formattedScore' : ''}" - : formattedScore; - - return Text( - text, - key: Key("${course.courseCode}_grade"), - style: TextStyle( - color: Theme.of(context).colorScheme.secondary, - fontSize: 16, - fontWeight: FontWeight.w500, - ), - ); - } - - void _courseTapped(context, Course course) { - locator().pushRoute(context, PandaRouter.courseDetails(course.id)); - } - - Future _refresh() async { - setState(() { - _coursesFuture = _loadCourses(forceRefresh: true); - }); - await _coursesFuture; - } -} diff --git a/apps/flutter_parent/lib/screens/courses/details/course_details_interactor.dart b/apps/flutter_parent/lib/screens/courses/details/course_details_interactor.dart deleted file mode 100644 index 2d69f3d7da..0000000000 --- a/apps/flutter_parent/lib/screens/courses/details/course_details_interactor.dart +++ /dev/null @@ -1,68 +0,0 @@ -// Copyright (C) 2019 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:flutter_parent/models/assignment_group.dart'; -import 'package:flutter_parent/models/canvas_page.dart'; -import 'package:flutter_parent/models/course.dart'; -import 'package:flutter_parent/models/course_settings.dart'; -import 'package:flutter_parent/models/course_tab.dart'; -import 'package:flutter_parent/models/enrollment.dart'; -import 'package:flutter_parent/models/grading_period_response.dart'; -import 'package:flutter_parent/models/schedule_item.dart'; -import 'package:flutter_parent/network/api/assignment_api.dart'; -import 'package:flutter_parent/network/api/calendar_events_api.dart'; -import 'package:flutter_parent/network/api/course_api.dart'; -import 'package:flutter_parent/network/api/enrollments_api.dart'; -import 'package:flutter_parent/network/api/page_api.dart'; -import 'package:flutter_parent/utils/service_locator.dart'; - -class CourseDetailsInteractor { - Future loadCourse(String courseId, {bool forceRefresh = false}) { - return locator().getCourse(courseId, forceRefresh: forceRefresh); - } - - Future?> loadCourseTabs(String courseId, {bool forceRefresh = false}) => - locator().getCourseTabs(courseId, forceRefresh: forceRefresh); - - Future loadCourseSettings(String courseId, {bool forceRefresh = false}) => - locator().getCourseSettings(courseId, forceRefresh: forceRefresh); - - Future?> loadAssignmentGroups(String courseId, String? studentId, String? gradingPeriodId, - {bool forceRefresh = false}) { - return locator().getAssignmentGroupsWithSubmissionsDepaginated(courseId, studentId, gradingPeriodId, - forceRefresh: forceRefresh); - } - - Future loadGradingPeriods(String courseId, {bool forceRefresh = false}) { - return locator().getGradingPeriods(courseId, forceRefresh: forceRefresh); - } - - Future?> loadEnrollmentsForGradingPeriod(String courseId, String? studentId, String? gradingPeriodId, - {bool forceRefresh = false}) { - return locator() - .getEnrollmentsByGradingPeriod(courseId, studentId, gradingPeriodId, forceRefresh: forceRefresh); - } - - Future?> loadScheduleItems(String courseId, String type, bool refresh) { - return locator().getAllCalendarEvents( - allEvents: true, - type: type, - contexts: ['course_$courseId'], - forceRefresh: refresh, - ); - } - - Future loadFrontPage(String courseId, {bool forceRefresh = false}) => - locator().getCourseFrontPage(courseId, forceRefresh: forceRefresh); -} diff --git a/apps/flutter_parent/lib/screens/courses/details/course_details_model.dart b/apps/flutter_parent/lib/screens/courses/details/course_details_model.dart deleted file mode 100644 index 3e1148424b..0000000000 --- a/apps/flutter_parent/lib/screens/courses/details/course_details_model.dart +++ /dev/null @@ -1,198 +0,0 @@ -// Copyright (C) 2019 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'dart:async'; - -import 'package:flutter/foundation.dart'; -import 'package:flutter_parent/models/assignment_group.dart'; -import 'package:flutter_parent/models/course.dart'; -import 'package:flutter_parent/models/course_settings.dart'; -import 'package:flutter_parent/models/course_tab.dart'; -import 'package:flutter_parent/models/enrollment.dart'; -import 'package:flutter_parent/models/grading_period.dart'; -import 'package:flutter_parent/models/schedule_item.dart'; -import 'package:flutter_parent/models/user.dart'; -import 'package:flutter_parent/screens/courses/details/course_details_interactor.dart'; -import 'package:flutter_parent/utils/base_model.dart'; -import 'package:flutter_parent/utils/core_extensions/list_extensions.dart'; -import 'package:flutter_parent/utils/service_locator.dart'; -import 'package:tuple/tuple.dart'; -import 'package:collection/collection.dart'; - -class CourseDetailsModel extends BaseModel { - User? student; - String courseId; // Could be routed to without a full course, only the id may be known - Course? course; - CourseSettings? courseSettings; - List? tabs = []; - bool forceRefresh = true; - GradingPeriod? _currentGradingPeriod; - GradingPeriod? _nextGradingPeriod; - - CourseDetailsModel(this.student, this.courseId); - - // A convenience constructor when we already have the course data - CourseDetailsModel.withCourse(this.student, this.course) : this.courseId = course!.id; - - /// Used only be the skeleton to load the course data for creating tabs and the app bar - Future loadData({bool refreshCourse = false}) { - return work(() async { - // Declare the futures so we can let both run asynchronously - final courseFuture = (refreshCourse || course == null) - ? _interactor().loadCourse(courseId, forceRefresh: refreshCourse) - : Future.value(course); - - // Always force a refresh of tabs, it's small enough that we can do this every time - final tabsFuture = _interactor().loadCourseTabs(courseId, forceRefresh: true); - - // Get course settings to know if course summary is allowed - final settingsFuture = _interactor().loadCourseSettings(courseId, forceRefresh: true); - - // Await the results - course = await courseFuture; - tabs = await tabsFuture; - courseSettings = await settingsFuture; - - // Set the _nextGradingPeriod to the current enrollment period (if active and if not already set) - final enrollment = - course?.enrollments?.firstWhereOrNull((enrollment) => enrollment.userId == student?.id); - if (_nextGradingPeriod == null && enrollment?.hasActiveGradingPeriod() == true) { - _nextGradingPeriod = GradingPeriod((b) => b - ..id = enrollment?.currentGradingPeriodId - ..title = enrollment?.currentGradingPeriodTitle); - } - return Future.value(); - }); - } - - Future loadAssignments({bool forceRefresh = false}) async { - if (forceRefresh) { - course = await _interactor().loadCourse(courseId, forceRefresh: forceRefresh); - } - - final groupFuture = _interactor() - .loadAssignmentGroups(courseId, student?.id, _nextGradingPeriod?.id, forceRefresh: forceRefresh).then((groups) async { - // Remove unpublished assignments to match web - return groups?.map((group) => (group.toBuilder()..assignments.removeWhere((assignment) => !assignment.published || assignment.isHiddenInGradeBook == true)).build()).toList(); - }); - - final gradingPeriodsFuture = - _interactor().loadGradingPeriods(courseId, forceRefresh: forceRefresh).then((periods) { - return periods?.gradingPeriods.toList(); - }); - - // Get the grades for the term - final enrollmentsFuture = _interactor() - .loadEnrollmentsForGradingPeriod(courseId, student?.id, _nextGradingPeriod?.id, forceRefresh: forceRefresh).then((enrollments) { - return enrollments != null && enrollments.length > 0 ? enrollments.first : null; - }).catchError((_) => null); // Some 'legacy' parents can't read grades for students, so catch and return null - - final gradeDetails = GradeDetails( - assignmentGroups: await groupFuture, - gradingPeriods: await gradingPeriodsFuture, - termEnrollment: await enrollmentsFuture, - ); - - // Set the current grading period to the next one, this way all the selected data shows at the same time - if (_nextGradingPeriod != null) _currentGradingPeriod = _nextGradingPeriod; - - return gradeDetails; - } - - Future?> loadSummary({bool refresh = false}) async { - // Get all assignment and calendar events - List?> results = await Future.wait([ - _interactor().loadScheduleItems(courseId, ScheduleItem.apiTypeCalendar, refresh), - _interactor().loadScheduleItems(courseId, ScheduleItem.apiTypeAssignment, refresh), - ]); - - // Flutter does not spin up its isolates in flutter-driver test mode, so a - // call to compute() will never return. So make the processSummaryItems() call - // directly in debug builds. - if (kDebugMode) { - return Future(() { - return processSummaryItems(Tuple2(results, student?.id)); - }); - } else { - // Potentially heavy list operations going on here, so we'll use a background isolate - return compute(processSummaryItems, Tuple2(results, student?.id)); - } - } - - @visibleForTesting - static List processSummaryItems(Tuple2?>, String?> input) { - var results = input.item1.nonNulls; - var studentId = input.item2; - - // Flat map to a single list - List items = results.expand((it) => it).toList(); - - /* For assignments with one or more overrides, the API will return multiple items with the same ID - one with the - base dates and one for each override with the override dates. If one of the overrides applies to the current student, - we only want to keep that one. If none of the overrides apply, we only want to keep the item with the base dates. */ - var overrides = items.where((item) => item.assignmentOverrides != null).toList(); - overrides.forEach((item) { - if (item.assignmentOverrides?.any((it) => it.studentIds.contains(studentId)) == true) { - // This item applies to the current student. Remove all other items that have the same ID. - items.retainWhere((it) => it == item || it.id != item.id); - } else { - // This item doesn't apply to the current student. Remove it from the list. - items.remove(item); - } - }); - - // Sort by ascending date, using a future date as a fallback so that undated items appear at the end - // If dates match (which will be the case for undated items), then sort by title - return items.sortBySelector([ - (it) => it?.startAt ?? it?.allDayDate, - (it) => it?.title, - ])?.toList().nonNulls.toList() ?? []; - } - - CourseDetailsInteractor _interactor() => locator(); - - int tabCount() { - if (hasHomePageAsFrontPage) return 2; - if (hasHomePageAsSyllabus) return showSummary ? 3 : 2; // Summary is only shown with syllabus - return 1; // Just show the grades tab - } - - bool get hasHomePageAsFrontPage => course?.homePage == HomePage.wiki; - - bool get hasHomePageAsSyllabus => - course?.syllabusBody?.isNotEmpty == true && - (course?.homePage == HomePage.syllabus || - (course?.homePage != HomePage.wiki && tabs?.any((tab) => tab.id == HomePage.syllabus.name) == true)); - - bool get showSummary => hasHomePageAsSyllabus && (courseSettings?.courseSummary == true); - - bool get restrictQuantitativeData => courseSettings?.restrictQuantitativeData == true; - - GradingPeriod? currentGradingPeriod() => _currentGradingPeriod; - - /// This sets the next grading period to use when loadAssignments is called. [currentGradingPeriod] won't be updated - /// until the load call is finished, this way the grading period isn't updated in the ui until the rest of the data - /// updates to reflect the new grading period. - updateGradingPeriod(GradingPeriod? period) { - _nextGradingPeriod = period; - } -} - -class GradeDetails { - final List? assignmentGroups; - final List? gradingPeriods; - final Enrollment? termEnrollment; - - GradeDetails({this.assignmentGroups, this.gradingPeriods, this.termEnrollment}); -} diff --git a/apps/flutter_parent/lib/screens/courses/details/course_details_screen.dart b/apps/flutter_parent/lib/screens/courses/details/course_details_screen.dart deleted file mode 100644 index 0614d227d9..0000000000 --- a/apps/flutter_parent/lib/screens/courses/details/course_details_screen.dart +++ /dev/null @@ -1,180 +0,0 @@ -// Copyright (C) 2019 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:flutter/material.dart'; -import 'package:flutter_parent/l10n/app_localizations.dart'; -import 'package:flutter_parent/models/course.dart'; -import 'package:flutter_parent/network/utils/api_prefs.dart'; -import 'package:flutter_parent/network/utils/dio_config.dart'; -import 'package:flutter_parent/screens/courses/details/course_details_model.dart'; -import 'package:flutter_parent/screens/courses/details/course_front_page_screen.dart'; -import 'package:flutter_parent/screens/courses/details/course_grades_screen.dart'; -import 'package:flutter_parent/screens/courses/details/course_summary_screen.dart'; -import 'package:flutter_parent/screens/courses/details/course_syllabus_screen.dart'; -import 'package:flutter_parent/screens/inbox/create_conversation/create_conversation_screen.dart'; -import 'package:flutter_parent/utils/base_model.dart'; -import 'package:flutter_parent/utils/common_widgets/full_screen_scroll_container.dart'; -import 'package:flutter_parent/utils/common_widgets/loading_indicator.dart'; -import 'package:flutter_parent/utils/design/canvas_icons_solid.dart'; -import 'package:flutter_parent/utils/design/parent_theme.dart'; -import 'package:flutter_parent/utils/quick_nav.dart'; -import 'package:flutter_parent/utils/service_locator.dart'; -import 'package:provider/provider.dart'; - -class CourseDetailsScreen extends StatefulWidget { - final CourseDetailsModel _model; - - CourseDetailsScreen(String courseId, {super.key}) - : this._model = CourseDetailsModel(ApiPrefs.getCurrentStudent(), courseId); - - // A convenience constructor when we already have the course data, so we don't load something we already have - CourseDetailsScreen.withCourse(Course course, {super.key}) - : this._model = CourseDetailsModel.withCourse(ApiPrefs.getCurrentStudent()! , course); - - @override - _CourseDetailsScreenState createState() => _CourseDetailsScreenState(); -} - -class _CourseDetailsScreenState extends State with SingleTickerProviderStateMixin { - TabController? _tabController; - - @override - void initState() { - super.initState(); - widget._model.loadData(); - } - - @override - void dispose() { - _tabController?.dispose(); - super.dispose(); - } - - @override - Widget build(BuildContext context) { - return ChangeNotifierProvider( - create: (context) => widget._model, - child: Consumer( - builder: (context, model, _) { - // Show loading if we're waiting for data, not inside the refresh indicator as it's unnecessary - if (model.state == ViewState.Busy) { - return Material( - color: Theme.of(context).scaffoldBackgroundColor, - child: LoadingIndicator(), - ); - } - return _body(context, model); - }, - ), - ); - } - - Widget _body(BuildContext context, CourseDetailsModel model) { - if (_tabController == null) _tabController = TabController(initialIndex: 0, length: model.tabCount(), vsync: this); - return Scaffold( - appBar: _appBar(context, model), - body: _tabBody(context, model), - floatingActionButton: FloatingActionButton( - onPressed: () => _sendMessage(model.hasHomePageAsSyllabus), - child: Semantics( - label: L10n(context).courseMessageHint, - child: Padding( - padding: const EdgeInsets.only(left: 4, top: 4), - child: Icon(CanvasIconsSolid.comment), - ), - ), - ), - ); - } - - AppBar _appBar(BuildContext context, CourseDetailsModel model) { - final tabCount = model.tabCount(); - return AppBar( - title: Text(model.course?.name ?? ''), - actions: [ - if (tabCount > 1) - IconButton( - tooltip: L10n(context).refresh, - icon: Icon(CanvasIconsSolid.refresh, size: 18.0), - onPressed: () async { - // Clear cache for the front page of this course, as a workaround to force a refresh - await DioConfig.canvas().clearCache(path: 'courses/${model.courseId}/front_page'); - model.loadData(refreshCourse: true); - }, - ), - ], - bottom: ParentTheme.of(context)?.appBarDivider( - bottom: (tabCount <= 1) - ? null // Don't show the tab bar if we only have one tab - : TabBar( - controller: _tabController, - tabs: [ - Tab(text: L10n(context).courseGradesLabel.toUpperCase()), - if (model.hasHomePageAsFrontPage) Tab(text: L10n(context).courseFrontPageLabel.toUpperCase()), - if (model.hasHomePageAsSyllabus) Tab(text: L10n(context).courseSyllabusLabel.toUpperCase()), - if (model.showSummary) Tab(text: L10n(context).courseSummaryLabel.toUpperCase()), - ], - ), - ), - ); - } - - Widget _tabBody(BuildContext context, CourseDetailsModel model) { - // Get the child widget to show in the refresh indicator - if (model.state == ViewState.Error) { - return RefreshIndicator( - child: FullScreenScrollContainer(children: [Text(L10n(context).unexpectedError)]), - onRefresh: () async { - return model.loadData(refreshCourse: true); - }, - ); - } else { - return TabBarView( - controller: _tabController, - children: [ - CourseGradesScreen(), - if (model.hasHomePageAsFrontPage) CourseFrontPageScreen(courseId: model.courseId), - if (model.hasHomePageAsSyllabus) CourseSyllabusScreen(model.course!.syllabusBody!), - if (model.showSummary) CourseSummaryScreen(), - ], - ); - } - } - - void _sendMessage(bool hasSyllabus) { - String subject; - String urlLink = '${ApiPrefs.getDomain()}/courses/${widget._model.courseId}'; - if (_tabController?.index == 0) { - // Grades - subject = L10n(context).gradesSubjectMessage(widget._model.student?.name ?? ''); - urlLink += '/grades'; - } else if (hasSyllabus) { - // Syllabus - subject = L10n(context).syllabusSubjectMessage(widget._model.student?.name ?? ''); - urlLink += '/assignments/syllabus'; - } else { - // Front Page - subject = L10n(context).frontPageSubjectMessage(widget._model.student?.name ?? ''); - } - - String postscript = L10n(context).messageLinkPostscript(widget._model.student?.name ?? '', urlLink); - Widget screen = CreateConversationScreen( - widget._model.courseId, - widget._model.student?.id, - subject, - postscript, - ); - locator.get().push(context, screen); - } -} diff --git a/apps/flutter_parent/lib/screens/courses/details/course_front_page_screen.dart b/apps/flutter_parent/lib/screens/courses/details/course_front_page_screen.dart deleted file mode 100644 index 0b35844250..0000000000 --- a/apps/flutter_parent/lib/screens/courses/details/course_front_page_screen.dart +++ /dev/null @@ -1,74 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:flutter/material.dart'; -import 'package:flutter_parent/l10n/app_localizations.dart'; -import 'package:flutter_parent/models/canvas_page.dart'; -import 'package:flutter_parent/screens/courses/details/course_details_interactor.dart'; -import 'package:flutter_parent/utils/common_widgets/error_panda_widget.dart'; -import 'package:flutter_parent/utils/common_widgets/loading_indicator.dart'; -import 'package:flutter_parent/utils/common_widgets/web_view/canvas_web_view.dart'; -import 'package:flutter_parent/utils/service_locator.dart'; - -class CourseFrontPageScreen extends StatefulWidget { - final String courseId; - - CourseFrontPageScreen({required this.courseId, super.key}); - - @override - _CourseFrontPageScreenState createState() => _CourseFrontPageScreenState(); -} - -class _CourseFrontPageScreenState extends State with AutomaticKeepAliveClientMixin { - Future? _pageFuture; - - @override - bool get wantKeepAlive => true; - - Future? _refreshPage() { - setState(() { - _pageFuture = _interactor.loadFrontPage(widget.courseId, forceRefresh: true); - }); - return _pageFuture?.catchError((_) { return Future.value(null); }); - } - - CourseDetailsInteractor get _interactor => locator(); - - @override - void initState() { - _pageFuture = _interactor.loadFrontPage(widget.courseId); - super.initState(); - } - - @override - Widget build(BuildContext context) { - super.build(context); // Required super call for AutomaticKeepAliveClientMixin - return FutureBuilder( - future: _pageFuture, - builder: (context, AsyncSnapshot snapshot) { - if (snapshot.hasError) { - return ErrorPandaWidget(L10n(context).unexpectedError, () => _refreshPage()); - } else if (!snapshot.hasData) { - return LoadingIndicator(); - } else { - return CanvasWebView( - content: snapshot.data!.body!, - emptyDescription: snapshot.data!.lockExplanation ?? L10n(context).noPageFound, - horizontalPadding: 16, - ); - } - }, - ); - } -} diff --git a/apps/flutter_parent/lib/screens/courses/details/course_grades_screen.dart b/apps/flutter_parent/lib/screens/courses/details/course_grades_screen.dart deleted file mode 100644 index 4163980c2a..0000000000 --- a/apps/flutter_parent/lib/screens/courses/details/course_grades_screen.dart +++ /dev/null @@ -1,419 +0,0 @@ -// Copyright (C) 2019 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:flutter/material.dart'; -import 'package:flutter_parent/l10n/app_localizations.dart'; -import 'package:flutter_parent/models/assignment.dart'; -import 'package:flutter_parent/models/assignment_group.dart'; -import 'package:flutter_parent/models/course.dart'; -import 'package:flutter_parent/models/course_grade.dart'; -import 'package:flutter_parent/models/enrollment.dart'; -import 'package:flutter_parent/models/grading_period.dart'; -import 'package:flutter_parent/router/panda_router.dart'; -import 'package:flutter_parent/screens/courses/details/course_details_model.dart'; -import 'package:flutter_parent/screens/courses/details/grading_period_modal.dart'; -import 'package:flutter_parent/utils/common_widgets/empty_panda_widget.dart'; -import 'package:flutter_parent/utils/common_widgets/error_panda_widget.dart'; -import 'package:flutter_parent/utils/common_widgets/loading_indicator.dart'; -import 'package:flutter_parent/utils/core_extensions/date_time_extensions.dart'; -import 'package:flutter_parent/utils/design/canvas_icons.dart'; -import 'package:flutter_parent/utils/design/parent_colors.dart'; -import 'package:flutter_parent/utils/design/parent_theme.dart'; -import 'package:flutter_parent/utils/design/student_color_set.dart'; -import 'package:flutter_parent/utils/quick_nav.dart'; -import 'package:flutter_parent/utils/service_locator.dart'; -import 'package:intl/intl.dart'; -import 'package:provider/provider.dart'; - -class CourseGradesScreen extends StatefulWidget { - @override - _CourseGradesScreenState createState() => _CourseGradesScreenState(); -} - -class _CourseGradesScreenState extends State with AutomaticKeepAliveClientMixin { - late Set _collapsedGroupIds; - Future? _detailsFuture; - static final GlobalKey _refreshIndicatorKey = new GlobalKey(); - - @override - bool get wantKeepAlive => true; - - @override - void initState() { - super.initState(); - _collapsedGroupIds = Set(); - } - - @override - Widget build(BuildContext context) { - super.build(context); // Required super call for AutomaticKeepAliveClientMixin - return Consumer( - builder: (context, model, _) { - // Initialize the future here if it wasn't set (we need the model, otherwise could've been done in initState) - if (_detailsFuture == null) _detailsFuture = model.loadAssignments(); - return RefreshIndicator( - key: _refreshIndicatorKey, - onRefresh: () => _refresh(model)!, - child: FutureBuilder( - future: _detailsFuture, - builder: (context, AsyncSnapshot snapshot) => _body(snapshot, model), - ), - ); - }, - ); - } - - Future? _refresh(CourseDetailsModel model) { - setState(() { - _detailsFuture = model.loadAssignments(forceRefresh: model.forceRefresh); - model.forceRefresh = true; - }); - return _detailsFuture?.catchError((_) {}); - } - - Widget _body(AsyncSnapshot snapshot, CourseDetailsModel model) { - if (snapshot.connectionState == ConnectionState.waiting && !snapshot.hasData) { - return LoadingIndicator(); - } - - final gradingPeriods = snapshot.data?.gradingPeriods ?? []; - final header = _CourseGradeHeader(context, gradingPeriods, snapshot.data?.termEnrollment); - - if (snapshot.hasError) { - return ErrorPandaWidget( - L10n(context).unexpectedError, - () { - _refreshIndicatorKey.currentState?.show(); - }, - ); - } else if (!snapshot.hasData || - model.course == null || - snapshot.data?.assignmentGroups == null || - snapshot.data?.assignmentGroups?.isEmpty == true || - snapshot.data?.assignmentGroups?.every((group) => group.assignments.isEmpty) == true) { - return EmptyPandaWidget( - svgPath: 'assets/svg/panda-space-no-assignments.svg', - title: L10n(context).noAssignmentsTitle, - subtitle: L10n(context).noAssignmentsMessage, - // Don't show the header if we have no assignments at all (null grading period id corresponds to all grading periods) - header: (model.currentGradingPeriod()?.id == null && gradingPeriods.isEmpty) ? null : header, - ); - } - - return ListView( - children: [ - header, - ..._assignmentListChildren(context, snapshot.data!.assignmentGroups!, model.course!), - ], - ); - } - - List _assignmentListChildren(BuildContext context, List groups, Course course) { - List children = []; - - for (AssignmentGroup group in groups) { - if (group.assignments.length == 0) continue; // Don't show empty assignment groups - - final isCollapsed = _collapsedGroupIds.contains(group.id); - - final tile = Theme( - data: Theme.of(context).copyWith(dividerColor: Colors.transparent), - child: ListTileTheme( - contentPadding: EdgeInsets.all(0), - child: ExpansionTile( - key: Key('assignmentGroup ${group.id}'), - initiallyExpanded: !isCollapsed, - onExpansionChanged: (expanding) { - setState(() => expanding ? _collapsedGroupIds.remove(group.id) : _collapsedGroupIds.add(group.id)); - }, - title: Padding( - padding: const EdgeInsetsDirectional.only(top: 16, start: 16, end: 16), - child: Text(group.name, style: Theme.of(context).textTheme.labelSmall), - ), - trailing: Padding( - padding: const EdgeInsetsDirectional.only(top: 16, start: 16, end: 16), - child: Icon( - isCollapsed ? CanvasIcons.mini_arrow_down : CanvasIcons.mini_arrow_up, - color: Theme.of(context).textTheme.labelSmall!.color, - semanticLabel: isCollapsed ? L10n(context).allyCollapsed : L10n(context).allyExpanded, - ), - ), - children: [ - ...(group.assignments.toList()..sort((a, b) => a.position.compareTo(b.position))) - .map((assignment) => _AssignmentRow(assignment: assignment, course: course)) - ], - ), - ), - ); - - children.add(tile); - } - - children.add(SizedBox(height: 64)); // Add a fab height at the bottom so we can see all the content - - return children; - } -} - -class _CourseGradeHeader extends StatelessWidget { - final List gradingPeriods; - final Enrollment? termEnrollment; - - _CourseGradeHeader(BuildContext context, List gradingPeriods, this.termEnrollment, {super.key}) - : this.gradingPeriods = [GradingPeriod((b) => b..title = L10n(context).allGradingPeriods)] + gradingPeriods; - - @override - Widget build(BuildContext context) { - final model = Provider.of(context, listen: false); - final gradingPeriodHeader = _gradingPeriodHeader(context, model); - final gradeTotalHeader = _gradeTotal(context, model); - - return Column( - children: [ - if (gradingPeriodHeader != null || gradeTotalHeader != null) SizedBox(height: 16), - if (gradingPeriodHeader != null) gradingPeriodHeader, - if (gradingPeriodHeader != null && gradeTotalHeader != null) SizedBox(height: 4), - if (gradeTotalHeader != null) gradeTotalHeader, - if (gradingPeriodHeader != null || gradeTotalHeader != null) SizedBox(height: 8), - ], - ); - } - - Widget? _gradingPeriodHeader(BuildContext context, CourseDetailsModel model) { - // Don't show this if there's no grading periods (we always add 1 for 'All grading periods') - if (gradingPeriods.length <= 1) return null; - - final studentColor = ParentTheme.of(context)?.studentColor; - - final gradingPeriod = model.currentGradingPeriod() ?? gradingPeriods.first; - - return Padding( - // Only left padding, lets the filter button go past the margin for the ripple - padding: const EdgeInsetsDirectional.only(start: 16), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - textBaseline: TextBaseline.ideographic, - children: [ - Text(gradingPeriod.title!, style: Theme.of(context).textTheme.headlineMedium), - InkWell( - child: ConstrainedBox( - constraints: BoxConstraints(minHeight: 48, minWidth: 48), // For a11y - child: Align( - alignment: Alignment.bottomRight, - child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 8), - child: Text( - L10n(context).filter, - style: Theme.of(context).textTheme.bodySmall?.copyWith(color: studentColor), - ), - ), - ), - ), - onTap: () async { - final gradingPeriod = await GradingPeriodModal.asBottomSheet(context, gradingPeriods); - if (gradingPeriod != null) model.updateGradingPeriod(gradingPeriod); - - // Don't force refresh when switching grading periods - model.forceRefresh = false; - _CourseGradesScreenState._refreshIndicatorKey.currentState?.show(); - }, - ), - ], - ), - ); - } - - /// The total grade in the course/grading period - Widget? _gradeTotal(BuildContext context, CourseDetailsModel model) { - final grade = model.course?.getCourseGrade( - model.student?.id, - enrollment: termEnrollment, - gradingPeriodId: model.currentGradingPeriod()?.id, - forceAllPeriods: termEnrollment == null && model.currentGradingPeriod()?.id == null, - ); - - // Don't show the total if the grade is locked - if (grade == null || grade.isCourseGradeLocked(forAllGradingPeriods: model.currentGradingPeriod()?.id == null)) return null; - - if ((model.courseSettings?.restrictQuantitativeData ?? false) && (grade.currentGrade() == null || grade.currentGrade()?.isEmpty == true)) return null; - - final textTheme = Theme.of(context).textTheme; - return Padding( - padding: const EdgeInsets.symmetric(horizontal: 16), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Text(L10n(context).courseTotalGradeLabel, style: textTheme.bodyMedium), - Text(_courseGrade(context, grade, model.courseSettings?.restrictQuantitativeData ?? false), style: textTheme.bodyMedium, key: Key("total_grade")), - ], - ), - ); - } - - String _courseGrade(BuildContext context, CourseGrade grade, bool restrictQuantitativeData) { - final format = NumberFormat.percentPattern(); - format.maximumFractionDigits = 2; - - if (grade.noCurrentGrade()) { - return L10n(context).noGrade; - } else { - var formattedScore = (grade.currentScore() != null && restrictQuantitativeData == false) - ? format.format(grade.currentScore()! / 100) - : ''; - return grade.currentGrade()?.isNotEmpty == true - ? "${grade.currentGrade()}${formattedScore.isNotEmpty ? ' $formattedScore' : ''}" - : formattedScore; - } - } -} - -class _AssignmentRow extends StatelessWidget { - final Assignment assignment; - final Course course; - - const _AssignmentRow({required this.assignment, required this.course, super.key}); - - @override - Widget build(BuildContext context) { - final model = Provider.of(context, listen: false); - final studentId = model.student?.id; - - final textTheme = Theme.of(context).textTheme; - final assignmentStatus = _assignmentStatus(context, assignment, studentId); - - return InkWell( - onTap: () => - locator().pushRoute(context, PandaRouter.assignmentDetails(assignment.courseId, assignment.id)), - child: Padding( - padding: EdgeInsets.symmetric(horizontal: 16, vertical: 12), - child: Row( - key: Key("assignment_${assignment.id}_row"), - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Container( - padding: EdgeInsets.only(top: 4), - width: 20, - child: Icon(CanvasIcons.assignment, size: 20, color: ParentTheme.of(context)?.studentColor), - ), - SizedBox(width: 32), - Expanded( - child: Row( - mainAxisSize: MainAxisSize.min, - children: [ - Expanded( - child: Column( - mainAxisSize: MainAxisSize.min, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text(assignment.name!, style: textTheme.titleMedium, key: Key("assignment_${assignment.id}_name")), - SizedBox(height: 2), - Text(_formatDate(context, assignment.dueAt), - style: textTheme.bodySmall, key: Key("assignment_${assignment.id}_dueAt")), - if (assignmentStatus != null) SizedBox(height: 4), - if (assignmentStatus != null) assignmentStatus, - ], - ), - ), - SizedBox(width: 16), - _assignmentGrade(context, assignment, studentId), - ], - ), - ), - ], - ), - ), - ); - } - - Widget? _assignmentStatus(BuildContext context, Assignment assignment, String? studentId) { - final localizations = L10n(context); - final textTheme = Theme.of(context).textTheme; - final status = assignment.getStatus(studentId: studentId); - final key = Key("assignment_${assignment.id}_status"); - switch (status) { - case SubmissionStatus.NONE: - return null; // An 'invisible' status, just don't show anything - case SubmissionStatus.LATE: - return Text(localizations.assignmentLateSubmittedLabel, - style: textTheme.bodySmall?.copyWith( - // Late will be orange, regardless of the current student - color: ParentTheme.of(context)?.getColorVariantForCurrentState(StudentColorSet.fire), - ), - key: key); - case SubmissionStatus.MISSING: - return Text(localizations.assignmentMissingSubmittedLabel, - style: textTheme.bodySmall?.copyWith(color: ParentColors.failure), key: key); - case SubmissionStatus.SUBMITTED: - return Text(localizations.assignmentSubmittedLabel, style: textTheme.bodySmall, key: key); - case SubmissionStatus.NOT_SUBMITTED: - return Text(localizations.assignmentNotSubmittedLabel, style: textTheme.bodySmall, key: key); - default: - return null; - } - } - - Widget _assignmentGrade(BuildContext context, Assignment assignment, String? studentId) { - dynamic points = assignment.pointsPossible; - - // Store the points as an int if possible - if (points.toInt() == points) { - points = points.toInt().toString(); - } else { - points = points.toString(); - } - - String text, semantics; - final localizations = L10n(context); - - final submission = assignment.submission(studentId); - - final restrictQuantitativeData = course.settings?.restrictQuantitativeData ?? false; - - if (submission?.excused ?? false) { - text = restrictQuantitativeData - ? localizations.excused - : localizations.gradeFormatScoreOutOfPointsPossible(localizations.excused, points); - semantics = restrictQuantitativeData - ? localizations.excused - : localizations.contentDescriptionScoreOutOfPointsPossible(localizations.excused, points); - } else if (submission?.grade != null) { - String grade = restrictQuantitativeData && assignment.isGradingTypeQuantitative() - ? course.convertScoreToLetterGrade(submission!.score, assignment.pointsPossible) - : submission!.grade!; - text = restrictQuantitativeData - ? grade - : localizations.gradeFormatScoreOutOfPointsPossible(grade, points); - semantics = restrictQuantitativeData - ? grade - : localizations.contentDescriptionScoreOutOfPointsPossible(grade, points); - } else { - text = restrictQuantitativeData - ? localizations.assignmentNoScore - : localizations.gradeFormatScoreOutOfPointsPossible(localizations.assignmentNoScore, points); - semantics = restrictQuantitativeData - ? '' - : localizations.contentDescriptionScoreOutOfPointsPossible('', points); - } - - return Text(text, - semanticsLabel: semantics, - style: Theme.of(context).textTheme.titleMedium, - key: Key("assignment_${assignment.id}_grade")); - } - - String _formatDate(BuildContext context, DateTime? date) { - final l10n = L10n(context); - return date.l10nFormat(l10n.dueDateAtTime) ?? l10n.noDueDate; - } -} diff --git a/apps/flutter_parent/lib/screens/courses/details/course_summary_screen.dart b/apps/flutter_parent/lib/screens/courses/details/course_summary_screen.dart deleted file mode 100644 index ca1fbe174e..0000000000 --- a/apps/flutter_parent/lib/screens/courses/details/course_summary_screen.dart +++ /dev/null @@ -1,142 +0,0 @@ -// Copyright (C) 2019 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:flutter/material.dart'; -import 'package:flutter_parent/l10n/app_localizations.dart'; -import 'package:flutter_parent/models/schedule_item.dart'; -import 'package:flutter_parent/router/panda_router.dart'; -import 'package:flutter_parent/screens/courses/details/course_details_model.dart'; -import 'package:flutter_parent/utils/common_widgets/empty_panda_widget.dart'; -import 'package:flutter_parent/utils/common_widgets/error_panda_widget.dart'; -import 'package:flutter_parent/utils/common_widgets/loading_indicator.dart'; -import 'package:flutter_parent/utils/core_extensions/date_time_extensions.dart'; -import 'package:flutter_parent/utils/design/canvas_icons.dart'; -import 'package:flutter_parent/utils/quick_nav.dart'; -import 'package:flutter_parent/utils/service_locator.dart'; -import 'package:provider/provider.dart'; - -class CourseSummaryScreen extends StatelessWidget { - @override - Widget build(BuildContext context) { - return Consumer( - builder: (context, model, _) => _CourseSummary(model), - ); - } -} - -class _CourseSummary extends StatefulWidget { - final CourseDetailsModel model; - - const _CourseSummary(this.model, {super.key}); - - @override - __CourseSummaryState createState() => __CourseSummaryState(); -} - -class __CourseSummaryState extends State<_CourseSummary> with AutomaticKeepAliveClientMixin { - GlobalKey _refreshKey = GlobalKey(); - late Future?> _future; - - @override - bool get wantKeepAlive => true; // Retain this screen's state when switching tabs - - @override - void initState() { - _future = widget.model.loadSummary(refresh: false); - super.initState(); - } - - Future _refresh() async { - setState(() { - _future = widget.model.loadSummary(refresh: true); - }); - _future.catchError((_) { return Future.value(null); }); - } - - @override - Widget build(BuildContext context) { - super.build(context); // Required super call for AutomaticKeepAliveClientMixin - return RefreshIndicator( - key: _refreshKey, - onRefresh: _refresh, - child: FutureBuilder( - future: _future, - builder: (BuildContext context, AsyncSnapshot?> snapshot) { - if (snapshot.connectionState == ConnectionState.waiting && !snapshot.hasData) { - return LoadingIndicator(); - } else if (snapshot.hasError || !snapshot.hasData) { - return ErrorPandaWidget(L10n(context).errorLoadingCourseSummary, _refresh); - } else { - return _body(snapshot.data!); - } - }, - ), - ); - } - - Widget _body(List items) { - if (items.isEmpty) { - return EmptyPandaWidget( - svgPath: 'assets/svg/panda-space-no-assignments.svg', - title: L10n(context).noCourseSummaryTitle, - subtitle: L10n(context).noCourseSummaryMessage, - ); - } - return ListView.builder( - itemCount: items.length, - itemBuilder: (context, index) => _buildListItem(items[index]), - ); - } - - Widget _buildListItem(ScheduleItem item) { - String dateText; - var date = item.startAt ?? item.allDayDate; - if (item.isAllDay) { - date = item.allDayDate ?? item.startAt; - } - if (date == null) { - dateText = L10n(context).noDueDate; - } else { - dateText = date.l10nFormat(L10n(context).dateAtTime)!; - } - - // Compute itemId for use with key values, which are used for testing - String? itemId = item.id; - if (item.type == ScheduleItem.apiTypeAssignment && item.assignment != null) { - itemId = item.assignment!.isQuiz ? item.assignment!.quizId : item.assignment!.id; - } - - return ListTile( - title: Text(item.title!, key: ValueKey('summary_item_title_$itemId')), - subtitle: Text(dateText, key: ValueKey('summary_item_subtitle_$itemId')), - leading: Icon(_getIcon(item), color: Theme.of(context).colorScheme.secondary, key: ValueKey('summary_item_icon_$itemId')), - onTap: () { - if (item.type == ScheduleItem.apiTypeCalendar) { - locator().pushRoute(context, PandaRouter.eventDetails(widget.model.courseId, item.id)); - } else { - locator() - .pushRoute(context, PandaRouter.assignmentDetails(widget.model.courseId, item.assignment!.id)); - } - }, - ); - } - - IconData _getIcon(ScheduleItem item) { - if (item.type == ScheduleItem.apiTypeCalendar) return CanvasIcons.calendar_month; - if (item.assignment?.lockedForUser == true) return CanvasIcons.lock; - if (item.assignment?.isQuiz == true) return CanvasIcons.quiz; - if (item.assignment?.isDiscussion == true) return CanvasIcons.discussion; - return CanvasIcons.assignment; - } -} diff --git a/apps/flutter_parent/lib/screens/courses/details/course_syllabus_screen.dart b/apps/flutter_parent/lib/screens/courses/details/course_syllabus_screen.dart deleted file mode 100644 index 02ce019bc7..0000000000 --- a/apps/flutter_parent/lib/screens/courses/details/course_syllabus_screen.dart +++ /dev/null @@ -1,43 +0,0 @@ -// Copyright (C) 2019 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:flutter/material.dart'; -import 'package:flutter_parent/screens/courses/details/course_details_model.dart'; -import 'package:flutter_parent/utils/common_widgets/web_view/canvas_web_view.dart'; -import 'package:provider/provider.dart'; - -class CourseSyllabusScreen extends StatefulWidget { - final String _syllabus; - - CourseSyllabusScreen(this._syllabus); - - @override - _CourseSyllabusScreenState createState() => _CourseSyllabusScreenState(); -} - -class _CourseSyllabusScreenState extends State with AutomaticKeepAliveClientMixin { - @override - bool get wantKeepAlive => true; - - @override - Widget build(BuildContext context) { - super.build(context); // Required super call for AutomaticKeepAliveClientMixin - return Consumer( - builder: (context, model, _) => CanvasWebView( - content: widget._syllabus, - horizontalPadding: 10, - ), - ); - } -} diff --git a/apps/flutter_parent/lib/screens/courses/details/grading_period_modal.dart b/apps/flutter_parent/lib/screens/courses/details/grading_period_modal.dart deleted file mode 100644 index d09769c287..0000000000 --- a/apps/flutter_parent/lib/screens/courses/details/grading_period_modal.dart +++ /dev/null @@ -1,49 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -import 'package:flutter/material.dart'; -import 'package:flutter_parent/l10n/app_localizations.dart'; -import 'package:flutter_parent/models/grading_period.dart'; - -class GradingPeriodModal extends StatelessWidget { - final List gradingPeriods; - - const GradingPeriodModal._internal({required this.gradingPeriods, super.key}); - - static Future asBottomSheet(BuildContext context, List gradingPeriods) => - showModalBottomSheet( - context: context, - builder: (context) => GradingPeriodModal._internal(gradingPeriods: gradingPeriods), - ); - - @override - Widget build(BuildContext context) { - return ListView.builder( - shrinkWrap: true, - itemCount: gradingPeriods.length + 1, // Add one for the header - itemBuilder: (context, index) { - if (index == 0) { - return Padding( - padding: const EdgeInsets.symmetric(vertical: 12, horizontal: 16), - child: Text(L10n(context).filterBy, style: Theme.of(context).textTheme.bodySmall), - ); - } - final gradingPeriod = gradingPeriods[index - 1]; - return ListTile( - title: Text(gradingPeriod.title!, style: Theme.of(context).textTheme.titleMedium), - onTap: () => Navigator.of(context).pop(gradingPeriod), - ); - }, - ); - } -} diff --git a/apps/flutter_parent/lib/screens/courses/routing_shell/course_routing_shell_interactor.dart b/apps/flutter_parent/lib/screens/courses/routing_shell/course_routing_shell_interactor.dart deleted file mode 100644 index 5de0b6c682..0000000000 --- a/apps/flutter_parent/lib/screens/courses/routing_shell/course_routing_shell_interactor.dart +++ /dev/null @@ -1,58 +0,0 @@ -/* - * Copyright (C) 2020 - present Instructure, Inc. - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, version 3 of the License. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -import 'package:flutter/cupertino.dart'; -import 'package:flutter_parent/models/canvas_page.dart'; -import 'package:flutter_parent/models/course.dart'; -import 'package:flutter_parent/network/api/course_api.dart'; -import 'package:flutter_parent/network/api/page_api.dart'; -import 'package:flutter_parent/screens/courses/routing_shell/course_routing_shell_screen.dart'; -import 'package:flutter_parent/utils/service_locator.dart'; - -class CourseRoutingShellInteractor { - Future loadCourseShell(CourseShellType type, String courseId, {bool forceRefresh = false}) async { - var course = await _loadCourse(courseId, forceRefresh: forceRefresh); - CanvasPage? frontPage = null; - - if (type == CourseShellType.frontPage) { - frontPage = await _loadHomePage(courseId, forceRefresh: forceRefresh); - if (frontPage?.body == null) { - return Future.error(''); - } - } - - if (type == CourseShellType.syllabus && course?.syllabusBody == null) { - return Future.error(''); - } - - return CourseShellData(course, frontPage: frontPage); - } - - Future _loadCourse(String courseId, {bool forceRefresh = false}) { - return locator().getCourse(courseId, forceRefresh: forceRefresh); - } - - Future _loadHomePage(String courseId, {bool forceRefresh = false}) { - return locator().getCourseFrontPage(courseId, forceRefresh: forceRefresh); - } -} - -class CourseShellData { - final Course? course; - final CanvasPage? frontPage; - - CourseShellData(this.course, {this.frontPage}); -} diff --git a/apps/flutter_parent/lib/screens/courses/routing_shell/course_routing_shell_screen.dart b/apps/flutter_parent/lib/screens/courses/routing_shell/course_routing_shell_screen.dart deleted file mode 100644 index 4a0f388f13..0000000000 --- a/apps/flutter_parent/lib/screens/courses/routing_shell/course_routing_shell_screen.dart +++ /dev/null @@ -1,130 +0,0 @@ -/* - * Copyright (C) 2020 - present Instructure, Inc. - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, version 3 of the License. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -import 'package:flutter/material.dart'; -import 'package:flutter_parent/l10n/app_localizations.dart'; -import 'package:flutter_parent/screens/courses/routing_shell/course_routing_shell_interactor.dart'; -import 'package:flutter_parent/utils/common_widgets/error_panda_widget.dart'; -import 'package:flutter_parent/utils/common_widgets/loading_indicator.dart'; -import 'package:flutter_parent/utils/common_widgets/web_view/canvas_web_view.dart'; -import 'package:flutter_parent/utils/design/canvas_icons_solid.dart'; -import 'package:flutter_parent/utils/design/parent_theme.dart'; -import 'package:flutter_parent/utils/service_locator.dart'; - -enum CourseShellType { - frontPage, - syllabus, -} - -class CourseRoutingShellScreen extends StatefulWidget { - final String courseId; - final CourseShellType type; - - CourseRoutingShellScreen(this.courseId, this.type, {super.key}); - - @override - State createState() => _CourseRoutingShellScreenState(); -} - -class _CourseRoutingShellScreenState extends State { - Future? _dataFuture; - - Future? _refresh() { - setState(() { - _dataFuture = - locator().loadCourseShell(widget.type, widget.courseId, forceRefresh: true); - }); - return _dataFuture?.catchError((_) { return Future.value(null); }); - } - - @override - Widget build(BuildContext context) { - if (_dataFuture == null) { - _dataFuture = locator().loadCourseShell(widget.type, widget.courseId); - } - - return FutureBuilder( - future: _dataFuture, - builder: (context, AsyncSnapshot snapshot) { - if (snapshot.connectionState == ConnectionState.waiting) { - return Container(color: Theme.of(context).scaffoldBackgroundColor, child: LoadingIndicator()); - } - - if (snapshot.hasError || snapshot.data == null) { - return _error(); - } else { - return _scaffold(widget.type, snapshot.data!); - } - }, - ); - } - - Widget _scaffold(CourseShellType type, CourseShellData data) { - return Scaffold( - appBar: AppBar( - actions: [ - IconButton( - tooltip: L10n(context).refresh, - icon: Icon(CanvasIconsSolid.refresh, size: 18.0), - onPressed: () async { - _refresh(); - }, - ), - ], - title: _appBarTitle( - (widget.type == CourseShellType.frontPage) - ? L10n(context).courseFrontPageLabel.toUpperCase() - : L10n(context).courseSyllabusLabel.toUpperCase(), - data.course?.name ?? ''), - bottom: ParentTheme.of(context)?.appBarDivider(), - ), - body: _body(data)); - } - - Widget _body(CourseShellData data) { - return widget.type == CourseShellType.frontPage - ? _webView(data.frontPage!.body!, emptyDescription: data.frontPage?.lockExplanation ?? L10n(context).noPageFound) - : _webView(data.course?.syllabusBody ?? ''); - } - - Widget _webView(String html, {String? emptyDescription}) { - return Padding( - padding: const EdgeInsets.only(top: 16.0), - child: CanvasWebView( - content: html, - emptyDescription: emptyDescription, - horizontalPadding: 16, - fullScreen: true, - )); - } - - Widget _appBarTitle(String title, String subtitle) { - return Column( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text(title), - Text(subtitle, style: Theme.of(context).primaryTextTheme.bodySmall), - ], - ); - } - - Widget _error() { - return Container( - color: Theme.of(context).scaffoldBackgroundColor, - child: ErrorPandaWidget(L10n(context).unexpectedError, () => _refresh())); - } -} diff --git a/apps/flutter_parent/lib/screens/crash_screen.dart b/apps/flutter_parent/lib/screens/crash_screen.dart deleted file mode 100644 index e11ce87301..0000000000 --- a/apps/flutter_parent/lib/screens/crash_screen.dart +++ /dev/null @@ -1,188 +0,0 @@ -// Copyright (C) 2019 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:device_info_plus/device_info_plus.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_parent/l10n/app_localizations.dart'; -import 'package:flutter_parent/utils/common_widgets/error_report/error_report_dialog.dart'; -import 'package:flutter_parent/utils/common_widgets/respawn.dart'; -import 'package:flutter_parent/utils/design/parent_colors.dart'; -import 'package:flutter_parent/utils/design/parent_theme.dart'; -import 'package:flutter_svg/svg.dart'; -import 'package:package_info_plus/package_info_plus.dart'; - -class CrashScreen extends StatelessWidget { - final FlutterErrorDetails error; - - const CrashScreen(this.error, {super.key}); - - @override - Widget build(BuildContext context) { - return Scaffold( - appBar: ModalRoute.of(context)?.canPop ?? false - ? AppBar( - elevation: 0, - backgroundColor: Colors.transparent, - iconTheme: Theme.of(context).iconTheme, - bottom: ParentTheme.of(context)?.appBarDivider(shadowInLightMode: false), - ) - : null, - body: _body(context), - bottomNavigationBar: Row( - mainAxisAlignment: MainAxisAlignment.spaceEvenly, - children: [_errorDetailsButton(context), _restartButton(context)], - ), - ); - } - - Center _body(BuildContext context) { - return Center( - child: SingleChildScrollView( - child: Padding( - padding: const EdgeInsets.all(32), - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - SvgPicture.asset('assets/svg/panda-not-supported.svg'), - SizedBox(height: 64), - Text( - L10n(context).crashScreenTitle, - textAlign: TextAlign.center, - style: TextStyle(fontSize: 20, fontWeight: FontWeight.w600), - ), - SizedBox(height: 8), - Text( - L10n(context).crashScreenMessage, - style: TextStyle(fontSize: 16), - textAlign: TextAlign.center, - ), - SizedBox(height: 40), - Row( - mainAxisAlignment: MainAxisAlignment.spaceEvenly, - children: [ - TextButton( - onPressed: () => ErrorReportDialog.asDialog(context, error: error), - child: Text( - L10n(context).crashScreenContact, - style: Theme.of(context).textTheme.bodySmall?.copyWith(fontSize: 16), - ), - style: TextButton.styleFrom( - shape: RoundedRectangleBorder( - borderRadius: new BorderRadius.circular(4), - side: BorderSide(color: ParentColors.tiara), - ), - ), - ), - ], - ), - ], - ), - ), - ), - ); - } - - Widget _errorDetailsButton(BuildContext context) { - return FutureBuilder( - future: Future.wait([PackageInfo.fromPlatform(), DeviceInfoPlugin().androidInfo]), - builder: (context, snapshot) { - if (!snapshot.hasData) return Container(); - PackageInfo packageInfo = snapshot.data![0] as PackageInfo; - AndroidDeviceInfo deviceInfo = snapshot.data![1] as AndroidDeviceInfo; - return TextButton( - onPressed: () => _showDetailsDialog(context, packageInfo, deviceInfo), - child: Text( - L10n(context).crashScreenViewDetails, - style: Theme.of(context).textTheme.titleSmall, - ), - ); - }, - ); - } - - TextButton _restartButton(BuildContext context) { - return TextButton( - onPressed: () => Respawn.of(context)?.restart(), - child: Text( - L10n(context).crashScreenRestart, - style: Theme.of(context).textTheme.titleSmall, - ), - ); - } - - String _getFullErrorMessage() { - String message = ''; - try { - message = error.exception.toString(); - } catch (e) { - // Intentionally left blank - } - return '$message\n\n${error.stack.toString()}'; - } - - _showDetailsDialog(BuildContext context, PackageInfo packageInfo, AndroidDeviceInfo deviceInfo) { - showDialog( - context: context, - builder: (context) => AlertDialog( - contentPadding: EdgeInsets.all(0), - content: Container( - width: double.maxFinite, - child: ListView( - padding: EdgeInsets.all(8), - shrinkWrap: true, - children: [ - ListTile( - title: Text(L10n(context).crashDetailsAppVersion), - subtitle: Text('${packageInfo.version} (${packageInfo.buildNumber})'), - ), - ListTile( - title: Text(L10n(context).crashDetailsDeviceModel), - subtitle: Text('${deviceInfo.manufacturer} ${deviceInfo.model}'), - ), - ListTile( - title: Text(L10n(context).crashDetailsAndroidVersion), - subtitle: Text(deviceInfo.version.release), - ), - ExpansionTile( - title: Text(L10n(context).crashDetailsFullMessage), - children: [ - Padding( - padding: const EdgeInsets.fromLTRB(8, 0, 8, 16), - child: Container( - key: Key('full-error-message'), - padding: EdgeInsets.all(8), - decoration: BoxDecoration( - color: ParentTheme.of(context)?.nearSurfaceColor, - borderRadius: BorderRadius.all(Radius.circular(8))), - child: Text( - _getFullErrorMessage(), - style: TextStyle(fontSize: 12, fontWeight: FontWeight.normal), - ), - ), - ), - ], - ), - ], - ), - ), - actions: [ - TextButton( - child: Text(L10n(context).done), - onPressed: () => Navigator.of(context).pop(), - ), - ], - ), - ); - } -} diff --git a/apps/flutter_parent/lib/screens/dashboard/alert_notifier.dart b/apps/flutter_parent/lib/screens/dashboard/alert_notifier.dart deleted file mode 100644 index 9090b82e9e..0000000000 --- a/apps/flutter_parent/lib/screens/dashboard/alert_notifier.dart +++ /dev/null @@ -1,35 +0,0 @@ -// Copyright (C) 2019 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:flutter/material.dart'; -import 'package:flutter_parent/models/alert.dart'; -import 'package:flutter_parent/network/api/alert_api.dart'; -import 'package:flutter_parent/utils/alert_helper.dart'; -import 'package:flutter_parent/utils/core_extensions/list_extensions.dart'; -import 'package:flutter_parent/utils/service_locator.dart'; - -class AlertCountNotifier extends ValueNotifier { - AlertCountNotifier() : super(0); - - update(String studentId) async { - try { - final unreadAlerts = await locator().getAlertsDepaginated(studentId, true).then((List? list) async { - return await locator().filterAlerts(list?.where((element) => element.workflowState == AlertWorkflowState.unread).toList()); - }); - if (unreadAlerts != null) value = unreadAlerts.length; - } catch (e) { - print(e); - } - } -} diff --git a/apps/flutter_parent/lib/screens/dashboard/dashboard_interactor.dart b/apps/flutter_parent/lib/screens/dashboard/dashboard_interactor.dart deleted file mode 100644 index 98360d17a4..0000000000 --- a/apps/flutter_parent/lib/screens/dashboard/dashboard_interactor.dart +++ /dev/null @@ -1,54 +0,0 @@ -// Copyright (C) 2019 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:flutter_parent/models/enrollment.dart'; -import 'package:flutter_parent/models/user.dart'; -import 'package:flutter_parent/network/api/enrollments_api.dart'; -import 'package:flutter_parent/network/api/user_api.dart'; -import 'package:flutter_parent/network/utils/api_prefs.dart'; -import 'package:flutter_parent/screens/dashboard/alert_notifier.dart'; -import 'package:flutter_parent/screens/dashboard/inbox_notifier.dart'; -import 'package:flutter_parent/utils/old_app_migration.dart'; -import 'package:flutter_parent/utils/permission_handler.dart'; -import 'package:flutter_parent/utils/service_locator.dart'; -import 'package:permission_handler/permission_handler.dart'; - -class DashboardInteractor { - Future?> getStudents({bool forceRefresh = false}) async => - locator().getObserveeEnrollments(forceRefresh: forceRefresh).then>((enrollments) { - List? users = filterStudents(enrollments); - sortUsers(users); - return Future.value(users); - }); - - Future getSelf({app}) async => locator().getSelf().then((user) async { - UserPermission? permissions = (await locator().getSelfPermissions().catchError((_) => null)); - user = user?.rebuild((b) => b..permissions = permissions?.toBuilder()); - if (user != null) ApiPrefs.setUser(user, app: app); - return user; - }); - - List? filterStudents(List? enrollments) => - enrollments?.map((enrollment) => enrollment.observedUser).nonNulls.toSet().toList(); - - void sortUsers(List? users) => users?.sort((user1, user2) => user1.sortableName!.compareTo(user2.sortableName!)); - - InboxCountNotifier getInboxCountNotifier() => locator(); - - AlertCountNotifier getAlertCountNotifier() => locator(); - - Future shouldShowOldReminderMessage() => locator().hasOldReminders(); - - Future requestNotificationPermission() => locator().requestPermission(Permission.notification); -} diff --git a/apps/flutter_parent/lib/screens/dashboard/dashboard_screen.dart b/apps/flutter_parent/lib/screens/dashboard/dashboard_screen.dart deleted file mode 100644 index 02787a24d2..0000000000 --- a/apps/flutter_parent/lib/screens/dashboard/dashboard_screen.dart +++ /dev/null @@ -1,757 +0,0 @@ -// Copyright (C) 2019 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:flutter/material.dart'; -import 'package:flutter_parent/l10n/app_localizations.dart'; -import 'package:flutter_parent/models/user.dart'; -import 'package:flutter_parent/network/utils/analytics.dart'; -import 'package:flutter_parent/network/utils/api_prefs.dart'; -import 'package:flutter_parent/parent_app.dart'; -import 'package:flutter_parent/router/panda_router.dart'; -import 'package:flutter_parent/screens/alerts/alerts_screen.dart'; -import 'package:flutter_parent/screens/calendar/calendar_screen.dart'; -import 'package:flutter_parent/screens/calendar/calendar_today_click_notifier.dart'; -import 'package:flutter_parent/screens/calendar/calendar_today_notifier.dart'; -import 'package:flutter_parent/screens/calendar/calendar_widget/calendar_widget.dart'; -import 'package:flutter_parent/screens/courses/courses_screen.dart'; -import 'package:flutter_parent/screens/dashboard/selected_student_notifier.dart'; -import 'package:flutter_parent/screens/dashboard/student_expansion_widget.dart'; -import 'package:flutter_parent/screens/dashboard/student_horizontal_list_view.dart'; -import 'package:flutter_parent/screens/manage_students/manage_students_screen.dart'; -import 'package:flutter_parent/screens/masquerade/masquerade_screen.dart'; -import 'package:flutter_parent/screens/pairing/pairing_util.dart'; -import 'package:flutter_parent/utils/common_widgets/avatar.dart'; -import 'package:flutter_parent/utils/common_widgets/badges.dart'; -import 'package:flutter_parent/utils/common_widgets/dropdown_arrow.dart'; -import 'package:flutter_parent/utils/common_widgets/empty_panda_widget.dart'; -import 'package:flutter_parent/utils/common_widgets/loading_indicator.dart'; -import 'package:flutter_parent/utils/common_widgets/masquerade_ui.dart'; -import 'package:flutter_parent/utils/common_widgets/rating_dialog.dart'; -import 'package:flutter_parent/utils/common_widgets/user_name.dart'; -import 'package:flutter_parent/utils/design/canvas_icons.dart'; -import 'package:flutter_parent/utils/design/parent_colors.dart'; -import 'package:flutter_parent/utils/design/parent_theme.dart'; -import 'package:flutter_parent/utils/features_utils.dart'; -import 'package:flutter_parent/utils/quick_nav.dart'; -import 'package:flutter_parent/utils/service_locator.dart'; -import 'package:flutter_svg/flutter_svg.dart'; -import 'package:package_info_plus/package_info_plus.dart'; -import 'package:permission_handler/permission_handler.dart'; -import 'package:provider/provider.dart'; - -import 'dashboard_interactor.dart'; - -class DashboardScreen extends StatefulWidget { - DashboardScreen({this.students, this.startingPage, this.deepLinkParams, super.key}); - - final List? students; - - // Used when deep linking into the courses, calendar, or alert screen - final DashboardContentScreens? startingPage; - final Map? deepLinkParams; - - @override - State createState() => DashboardState(); -} - -class DashboardState extends State { - late GlobalKey scaffoldKey; - DashboardInteractor _interactor = locator(); - - // Dashboard State - List _students = []; - late User? _self; - - bool _studentsLoading = false; - bool _selfLoading = false; - - // This will likely be used when we have specs for the error state - // ignore: unused_field - bool _studentsError = false; - - User? _selectedStudent; - late DashboardContentScreens _currentIndex; - - bool expand = false; - - late SelectedStudentNotifier _selectedStudentNotifier; - late CalendarTodayNotifier _showTodayNotifier; - - @visibleForTesting - Map? currentDeepLinkParams; - - late Function() _onStudentAdded; - - @override - void initState() { - scaffoldKey = GlobalKey(); - currentDeepLinkParams = widget.deepLinkParams; - _currentIndex = widget.startingPage ?? DashboardContentScreens.Courses; - _selectedStudentNotifier = SelectedStudentNotifier(); - _showTodayNotifier = CalendarTodayNotifier(); - _loadSelf(); - if (widget.students?.isNotEmpty == true) { - _students = widget.students!; - String? selectedStudentId = ApiPrefs.getCurrentLogin()?.selectedStudentId; - _selectedStudent = _students.firstWhere((it) => it.id == selectedStudentId, orElse: () => _students.first); - _updateStudentColor(_selectedStudent!.id); - _selectedStudentNotifier.value = _selectedStudent!; - ApiPrefs.setCurrentStudent(_selectedStudent); - _interactor.getAlertCountNotifier().update(_selectedStudent!.id); - } else { - _loadStudents(); - } - _onStudentAdded = () => _addStudent(); - locator().addListener(_onStudentAdded); - super.initState(); - - _interactor.getInboxCountNotifier().update(); - _showOldReminderMessage(); - - // Try to show the rating dialog - WidgetsBinding.instance.addPostFrameCallback((_) async { - RatingDialog.asDialog(context); - }); - - _interactor.requestNotificationPermission(); - } - - @override - void dispose() { - locator().removeListener(_onStudentAdded); - super.dispose(); - } - - void _updateStudentColor(String studentId) { - WidgetsBinding.instance.scheduleFrameCallback((_) { - ParentTheme.of(context)?.setSelectedStudent(studentId); - }); - } - - void _loadSelf() { - setState(() { - _self = ApiPrefs.getUser(); - _selfLoading = true; - }); - - _interactor.getSelf(app: ParentApp.of(context)).then((user) { - _self = user!; - setState(() { - _selfLoading = false; - }); - }).catchError((error) { - print('Error loading user: $error'); - setState(() { - _selfLoading = false; - }); - }); - } - - void _loadStudents() { - setState(() { - _studentsLoading = true; - _studentsError = false; - }); - - _interactor.getStudents().then((users) { - _students = users!; - - if (_selectedStudent == null && _students.isNotEmpty) { - setState(() { - String? selectedStudentId = ApiPrefs.getCurrentLogin()?.selectedStudentId; - _selectedStudent = _students.firstWhere((it) => it.id == selectedStudentId, orElse: () => _students.first); - updateStudent(); - }); - } - - setState(() { - _studentsLoading = false; - }); - }).catchError((error) { - setState(() { - _studentsLoading = false; - _studentsError = true; - print('Error loading students: $error'); - }); - }); - } - - void _addStudent() { - setState(() { - _studentsLoading = true; - _studentsError = false; - }); - - _interactor.getStudents(forceRefresh: true).then((users) { - setState(() { - print('users: $users'); - - if (users != null && users.length > _students.length) { - var newStudents = users.toSet().difference(_students.toSet()); - _selectedStudent = newStudents.first; - updateStudent(); - } - _students = users!; - if (!users.map((e) => e.id).contains(_selectedStudent?.id)){ - _selectedStudent = _students.first; - updateStudent(); - } - _studentsLoading = false; - }); - }).catchError((error) { - setState(() { - _studentsLoading = false; - _studentsError = true; - print('Error loading students: $error'); - }); - }); - } - - void updateStudent() { - _selectedStudentNotifier.value = _selectedStudent!; - _updateStudentColor(_selectedStudent!.id); - ApiPrefs.setCurrentStudent(_selectedStudent); - _interactor.getAlertCountNotifier().update(_selectedStudent!.id); - } - - @override - Widget build(BuildContext context) { - if (_currentIndex != DashboardContentScreens.Calendar) { - _showTodayNotifier.value = false; - } - - return MultiProvider( - providers: [ - ChangeNotifierProvider(create: (context) => _selectedStudentNotifier), - ChangeNotifierProvider(create: (context) => _showTodayNotifier), - ], - child: Consumer( - builder: (context, model, _) { - return Scaffold( - key: scaffoldKey, - appBar: PreferredSize( - preferredSize: Size.fromHeight(107.0), - child: AppBar( - // Today button is only for the calendar and the notifier value is set in the calendar screen - actions: [ - Consumer(builder: (context, model, _) { - if (model.value) { - return Semantics( - label: L10n(context).gotoTodayButtonLabel, - child: InkResponse( - onTap: () => {locator().trigger()}, - child: Padding( - padding: EdgeInsets.symmetric(horizontal: 16.0), - child: SvgPicture.asset( - 'assets/svg/calendar-today.svg', - ), - ), - ), - ); - } else { - return SizedBox.shrink(); - } - }) - ], - - flexibleSpace: Semantics( - label: 'Tap to open the student selector', - child: _appBarStudents(_students, model.value), - ), - centerTitle: true, - bottom: ParentTheme.of(context)?.appBarDivider(), - leading: IconButton( - icon: WidgetBadge( - Icon( - Icons.menu, - key: Key("drawer_menu"), - ), - countListenable: _interactor.getInboxCountNotifier(), - options: BadgeOptions(includeBorder: true, onPrimarySurface: true), - ), - onPressed: () => scaffoldKey.currentState?.openDrawer(), - tooltip: MaterialLocalizations.of(context).openAppDrawerTooltip, - ), - ), - ), - drawer: SafeArea( - child: Drawer( - backgroundColor: Theme.of(context).scaffoldBackgroundColor, - child: SafeArea(child: _navDrawer(_self)), - ), - ), - body: Column(children: [ - StudentExpansionWidget( - expand: expand, - child: Column( - children: [ - Container( - height: 108, - child: StudentHorizontalListView( - _students, - onTap: () => setState(() => expand = !expand), - onAddStudent: () { - _addStudent(); - }, - ), - ), - PreferredSize( - preferredSize: Size.fromHeight(1), - child: Divider( - height: 1, - color: ParentTheme.of(context)?.isDarkMode == true - ? ParentColors.oxford - : ParentColors.appBarDividerLight), - ), - ], - ), - ), - Expanded(child: _currentPage()) - ]), - bottomNavigationBar: ParentTheme.of(context)?.bottomNavigationDivider( - _students.isEmpty - ? Container() - : BottomNavigationBar( - unselectedItemColor: ParentTheme.of(context)?.onSurfaceColor, - selectedFontSize: 12, - unselectedFontSize: 12, - backgroundColor: Theme.of(context).scaffoldBackgroundColor, - items: _bottomNavigationBarItems(), - currentIndex: this._currentIndex.index, - onTap: (item) => _handleBottomBarClick(item), - ), - ), - ); - }, - ), - ); - } - - Widget _appBarStudents(List students, User? selectedStudent) { - if (students.isEmpty) { - // No students yet, we are either still loading, or there was an error - if (_studentsLoading) { - // Still loading, don't show anything - return Text(''); - } else - // Done loading: no students returned - return Center( - child: Text( - L10n(context).noStudents, - ), - ); - } - - return SafeArea( - child: GestureDetector( - behavior: HitTestBehavior.translucent, - onTap: () => setState(() => expand = !expand), - child: Semantics( - label: L10n(context).tapToShowStudentSelector, - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Avatar(selectedStudent?.avatarUrl, - name: selectedStudent?.shortName ?? '', - radius: 24, - key: Key("student_expansion_touch_target")), - SizedBox(height: 8), - Row( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - UserName.fromUserShortName(selectedStudent!, style: TextStyle(color: Theme.of(context).primaryIconTheme.color ?? Colors.white)), - SizedBox(width: 6), - DropdownArrow(rotate: expand, color: Theme.of(context).primaryIconTheme.color ?? Colors.white), - ], - ) - ], - ), - ), - ), - ); - } - - List _bottomNavigationBarItems() { - return [ - BottomNavigationBarItem( - icon: _navBarIcon( - light: 'assets/svg/bottom-nav/courses-light.svg', - dark: 'assets/svg/bottom-nav/courses-dark.svg', - ), - activeIcon: _navBarIcon( - active: true, - light: 'assets/svg/bottom-nav/courses-light-selected.svg', - dark: 'assets/svg/bottom-nav/courses-dark-selected.svg', - ), - label: L10n(context).coursesLabel, - ), - BottomNavigationBarItem( - icon: _navBarIcon( - light: 'assets/svg/bottom-nav/calendar-light.svg', - dark: 'assets/svg/bottom-nav/calendar-dark.svg', - ), - activeIcon: _navBarIcon( - active: true, - light: 'assets/svg/bottom-nav/calendar-light-selected.svg', - dark: 'assets/svg/bottom-nav/calendar-dark-selected.svg', - ), - label: L10n(context).calendarLabel, - ), - BottomNavigationBarItem( - icon: WidgetBadge( - _navBarIcon( - light: 'assets/svg/bottom-nav/alerts-light.svg', - dark: 'assets/svg/bottom-nav/alerts-dark.svg', - ), - countListenable: _interactor.getAlertCountNotifier(), - options: BadgeOptions(includeBorder: true), - key: Key('alerts-count'), - ), - activeIcon: WidgetBadge( - _navBarIcon( - active: true, - light: 'assets/svg/bottom-nav/alerts-light-selected.svg', - dark: 'assets/svg/bottom-nav/alerts-dark-selected.svg', - ), - countListenable: _interactor.getAlertCountNotifier(), - options: BadgeOptions(includeBorder: true), - key: Key('alerts-count'), - ), - label: L10n(context).alertsLabel - ), - ]; - } - - Widget _navBarIcon({required String light, required String dark, bool active = false}) { - bool darkMode = ParentTheme.of(context)?.isDarkMode ?? false; - return SvgPicture.asset( - darkMode ? dark : light, - color: active? ParentTheme.of(context)?.studentColor : null, - width: 24, - height: 24, - ); - } - - Widget _navDrawer(User? user) { - if (_selfLoading) { - // Still loading... - return LoadingIndicator(); - } - - return Container( - color: Theme.of(context).scaffoldBackgroundColor, - child: ListTileTheme( - style: ListTileStyle.list, - child: Column(crossAxisAlignment: CrossAxisAlignment.start, children: [ - // Header - _navDrawerHeader(user), - Divider(), - // Tiles (Inbox, Manage Students, Sign Out, etc) - Expanded( - child: _navDrawerItemsList(), - ), - - // App version - if (ApiPrefs.getCurrentLogin()?.canMasquerade == true && !ApiPrefs.isMasquerading()) - _navDrawerActAsUser(), - if (ApiPrefs.isMasquerading()) - _navDrawerStopActingAsUser(), - _navDrawerAppVersion(), - ]), - ), - ); - } - - _handleBottomBarClick(item) { - setState(() { - _currentIndex = DashboardContentScreens.values[item]; - }); - } - - Widget _currentPage() { - if (_studentsLoading) { - // We're still loading students, just show a loading indicator for now - return LoadingIndicator(); - } - - if (_students.isEmpty) { - return EmptyPandaWidget( - svgPath: 'assets/svg/panda-manage-students.svg', - title: L10n(context).noStudents, - subtitle: L10n(context).emptyStudentList, - ); - } - - Widget _page; - - switch (_currentIndex) { - case DashboardContentScreens.Calendar: - _page = CalendarScreen( - startDate: currentDeepLinkParams != null - ? (currentDeepLinkParams?.containsKey(CalendarScreen.startDateKey) == true - ? currentDeepLinkParams![CalendarScreen.startDateKey] as DateTime? - : null) - : null, - startView: currentDeepLinkParams != null - ? (currentDeepLinkParams?.containsKey(CalendarScreen.startViewKey) == true - ? currentDeepLinkParams![CalendarScreen.startViewKey] as CalendarView - : null) - : null, - ); - break; - case DashboardContentScreens.Alerts: - _page = AlertsScreen(); - break; - case DashboardContentScreens.Courses: - default: - _page = CoursesScreen(); - break; - } - - // Deep link params are handled, set them to null so we don't use them again - currentDeepLinkParams = null; - - return _page; - } - - _showOldReminderMessage() async { - if ((await _interactor.shouldShowOldReminderMessage()) == true) { - WidgetsBinding.instance.addPostFrameCallback((_) { - showDialog( - context: context, - barrierDismissible: false, - builder: (context) { - return AlertDialog( - title: Text(L10n(context).oldReminderMessageTitle), - content: Text(L10n(context).oldReminderMessage), - actions: [ - TextButton( - child: Text(L10n(context).ok), - onPressed: () { - locator().logEvent(AnalyticsEventConstants.VIEWED_OLD_REMINDER_MESSAGE); - Navigator.of(context).pop(); - }, - ) - ], - ); - }); - }); - } - } - - _navigateToInbox(context) { - // Close the drawer, then push the inbox in - Navigator.of(context).pop(); - locator().pushRoute(context, PandaRouter.conversations()); - } - - _navigateToManageStudents(context) async { - // Close the drawer, then push the Manage Children screen in - Navigator.of(context).pop(); - await locator().push(context, ManageStudentsScreen(_students)); - _addStudent(); - } - - _navigateToSettings(context) { - // Close the drawer, then push the Settings screen in - Navigator.of(context).pop(); - locator().pushRoute(context, PandaRouter.settings()); - } - - _navigateToHelp(context) { - // Close the drawer, then push the Help screen in - Navigator.of(context).pop(); - locator().pushRoute(context, PandaRouter.help()); - } - - _performLogOut(BuildContext context, {bool switchingUsers = false}) async { - try { - await ParentTheme.of(context)?.setSelectedStudent(null); - locator().logEvent(switchingUsers ? AnalyticsEventConstants.SWITCH_USERS : AnalyticsEventConstants.LOGOUT); - await ApiPrefs.performLogout(switchingLogins: switchingUsers, app: ParentApp.of(context)); - MasqueradeUI.of(context)?.refresh(); - locator().pushRouteAndClearStack(context, PandaRouter.login()); - await FeaturesUtils.performLogout(); - } catch (e) { - // Just in case we experience any error we still need to go back to the login screen. - locator().pushRouteAndClearStack(context, PandaRouter.login()); - } - } - - _navDrawerHeader(User? user) => Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Padding( - padding: const EdgeInsets.fromLTRB(24, 16, 0, 8), - child: Avatar(user?.avatarUrl, name: user?.shortName, radius: 40), - ), - Padding( - padding: const EdgeInsets.symmetric(horizontal: 24), - child: UserName.fromUser(user!, style: TextStyle(fontSize: 16.0, fontWeight: FontWeight.bold)), - ), - Padding( - padding: const EdgeInsets.fromLTRB(24, 4, 24, 16), - child: Text( - user.primaryEmail ?? '', - style: Theme.of(context).textTheme.bodySmall, - overflow: TextOverflow.fade, - ), - ) - ], - ); - - Widget _navDrawerItemsList() { - var items = [ - _navDrawerInbox(), - _navDrawerManageStudents(), - _navDrawerSettings(), - Divider(), - _navDrawerHelp(), - _navDrawerSwitchUsers(), - _navDrawerLogOut(), - ]; - return ListView.builder( - itemCount: items.length, - itemBuilder: (context, index) => items[index], - ); - } - - // Create the inbox tile with an infinite badge count, since there's lots of space we don't need to limit the count to 99+ - _navDrawerInbox() => ListTile( - title: Text(L10n(context).inbox, style: Theme.of(context).textTheme.titleMedium), - onTap: () => _navigateToInbox(context), - leading: Padding( - padding: const EdgeInsets.only(left: 8.0), - child: SvgPicture.asset('assets/svg/ic_inbox.svg', height: 24, width: 24), - ), - trailing: NumberBadge( - listenable: _interactor.getInboxCountNotifier(), - options: BadgeOptions(maxCount: null), - key: Key('inbox-count'), - ), - ); - - _navDrawerManageStudents() => ListTile( - title: Text(L10n(context).manageStudents, style: Theme.of(context).textTheme.titleMedium), - onTap: () => _navigateToManageStudents(context), - leading: Padding( - padding: const EdgeInsets.only(left: 8.0), - child: SvgPicture.asset('assets/svg/ic_manage_student.svg', height: 24, width: 24), - ), - ); - - _navDrawerSettings() => ListTile( - title: Text(L10n(context).settings, style: Theme.of(context).textTheme.titleMedium), - onTap: () => _navigateToSettings(context), - leading: Padding( - padding: const EdgeInsets.only(left: 8.0), - child: SvgPicture.asset('assets/svg/ic_settings.svg', height: 24, width: 24), - ), - ); - - _navDrawerHelp() => ListTile( - title: Text(L10n(context).help, style: Theme.of(context).textTheme.titleMedium), - onTap: () => _navigateToHelp(context), - leading: Padding( - padding: const EdgeInsets.only(left: 8.0), - child: SvgPicture.asset('assets/svg/ic_help.svg', height: 24, width: 24), - ), - ); - - _navDrawerLogOut() => ListTile( - title: Text(L10n(context).logOut, style: Theme.of(context).textTheme.titleMedium), - leading: Padding( - padding: const EdgeInsets.only(left: 8.0), - child: SvgPicture.asset('assets/svg/ic_logout.svg', height: 24, width: 24,), - ), - onTap: () { - showDialog( - context: context, - builder: (context) { - return AlertDialog( - content: Text(L10n(context).logoutConfirmation), - actions: [ - TextButton( - child: Text( - MaterialLocalizations.of(context).cancelButtonLabel), - onPressed: () => Navigator.of(context).pop(), - ), - TextButton( - child: - Text(MaterialLocalizations.of(context).okButtonLabel), - onPressed: () => _performLogOut(context), - ) - ], - ); - }, - ); - }, - ); - - _navDrawerSwitchUsers() => ListTile( - title: Text(L10n(context).switchUsers, style: Theme.of(context).textTheme.titleMedium), - leading: Padding( - padding: const EdgeInsets.only(left: 8.0), - child: SvgPicture.asset('assets/svg/ic_change_user.svg', height: 24, width: 24), - ), - onTap: () => _performLogOut(context, switchingUsers: true), - ); - - _navDrawerActAsUser() => ListTile( - leading: Padding( - padding: const EdgeInsets.only(left: 8.0), - child: Icon(CanvasIcons.masquerade), - ), - title: Text(L10n(context).actAsUser, style: Theme.of(context).textTheme.titleMedium), - onTap: () { - Navigator.of(context).pop(); - locator().push(context, MasqueradeScreen()); - }, - ); - - _navDrawerStopActingAsUser() => ListTile( - leading: Padding( - padding: const EdgeInsets.only(left: 8.0), - child: Icon(CanvasIcons.masquerade), - ), - title: Text(L10n(context).stopActAsUser, style: Theme.of(context).textTheme.titleMedium), - onTap: () { - Navigator.of(context).pop(); - MasqueradeUI.showMasqueradeCancelDialog(GlobalKey(), context); - }, - ); - - _navDrawerAppVersion() => Column( - children: [ - Container( - alignment: AlignmentDirectional.bottomStart, - child: Padding( - padding: const EdgeInsets.all(16), - child: FutureBuilder( - future: PackageInfo.fromPlatform(), - builder: (BuildContext context, AsyncSnapshot snapshot) { - return Text( - L10n(context).appVersion(snapshot.data?.version ?? ''), - style: Theme.of(context).textTheme.titleSmall, - ); - }, - ), - ), - ) - ], - ); -} - -enum DashboardContentScreens { Courses, Calendar, Alerts } diff --git a/apps/flutter_parent/lib/screens/dashboard/inbox_notifier.dart b/apps/flutter_parent/lib/screens/dashboard/inbox_notifier.dart deleted file mode 100644 index 4d9e30a543..0000000000 --- a/apps/flutter_parent/lib/screens/dashboard/inbox_notifier.dart +++ /dev/null @@ -1,30 +0,0 @@ -// Copyright (C) 2019 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:flutter/material.dart'; -import 'package:flutter_parent/network/api/inbox_api.dart'; -import 'package:flutter_parent/utils/service_locator.dart'; - -class InboxCountNotifier extends ValueNotifier { - InboxCountNotifier() : super(0); - - update() async { - try { - var unreadCount = await locator().getUnreadCount(); - value = int.tryParse(unreadCount?.count.asString ?? ''); - } catch (e) { - print(e); - } - } -} diff --git a/apps/flutter_parent/lib/screens/dashboard/selected_student_notifier.dart b/apps/flutter_parent/lib/screens/dashboard/selected_student_notifier.dart deleted file mode 100644 index 87c7ddf7db..0000000000 --- a/apps/flutter_parent/lib/screens/dashboard/selected_student_notifier.dart +++ /dev/null @@ -1,27 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:flutter/foundation.dart'; -import 'package:flutter_parent/models/user.dart'; -import 'package:flutter_parent/screens/dashboard/alert_notifier.dart'; -import 'package:flutter_parent/utils/service_locator.dart'; - -class SelectedStudentNotifier extends ValueNotifier { - SelectedStudentNotifier() : super(null); - - update(User student) { - value = student; - locator().update(student.id); - } -} diff --git a/apps/flutter_parent/lib/screens/dashboard/student_expansion_widget.dart b/apps/flutter_parent/lib/screens/dashboard/student_expansion_widget.dart deleted file mode 100644 index 7c9c446242..0000000000 --- a/apps/flutter_parent/lib/screens/dashboard/student_expansion_widget.dart +++ /dev/null @@ -1,74 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:flutter/widgets.dart'; - -class StudentExpansionWidget extends StatefulWidget { - final Widget? child; - final bool expand; - - StudentExpansionWidget({this.expand = false, this.child}); - - @override - State createState() => StudentExpansionWidgetState(); -} - -class StudentExpansionWidgetState extends State with SingleTickerProviderStateMixin { - late AnimationController expandController; - late Animation animation; - - @override - void initState() { - super.initState(); - prepareAnimations(); - _runExpandCheck(); - } - - @override - Widget build(BuildContext context) { - return SizeTransition( - axisAlignment: 1.0, - sizeFactor: animation, - child: widget.child, - ); - } - - void prepareAnimations() { - expandController = AnimationController( - vsync: this, - duration: Duration(milliseconds: 300), - ); - animation = CurvedAnimation(parent: expandController, curve: Curves.ease); - } - - void _runExpandCheck() { - if (widget.expand) { - expandController.forward(); - } else { - expandController.reverse(); - } - } - - @override - void didUpdateWidget(StudentExpansionWidget oldWidget) { - super.didUpdateWidget(oldWidget); - _runExpandCheck(); - } - - @override - void dispose() { - expandController.dispose(); - super.dispose(); - } -} diff --git a/apps/flutter_parent/lib/screens/dashboard/student_horizontal_list_view.dart b/apps/flutter_parent/lib/screens/dashboard/student_horizontal_list_view.dart deleted file mode 100644 index c28b82014c..0000000000 --- a/apps/flutter_parent/lib/screens/dashboard/student_horizontal_list_view.dart +++ /dev/null @@ -1,141 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:flutter/material.dart'; -import 'package:flutter_parent/l10n/app_localizations.dart'; -import 'package:flutter_parent/models/user.dart'; -import 'package:flutter_parent/network/utils/api_prefs.dart'; -import 'package:flutter_parent/screens/dashboard/selected_student_notifier.dart'; -import 'package:flutter_parent/screens/pairing/pairing_util.dart'; -import 'package:flutter_parent/utils/common_widgets/avatar.dart'; -import 'package:flutter_parent/utils/design/parent_theme.dart'; -import 'package:flutter_parent/utils/service_locator.dart'; -import 'package:provider/provider.dart'; - -class StudentHorizontalListView extends StatefulWidget { - final List _students; - final Function? onTap; - final Function? onAddStudent; - - StudentHorizontalListView(this._students, {this.onTap, this.onAddStudent}); - - @override - State createState() => StudentHorizontalListViewState(); -} - -class StudentHorizontalListViewState extends State { - @override - Widget build(BuildContext context) { - return ListView.separated( - padding: EdgeInsets.symmetric(horizontal: 8), - scrollDirection: Axis.horizontal, - itemBuilder: (context, idx) => - idx < widget._students.length ? _studentWidget(widget._students[idx]) : _addWidget(), - separatorBuilder: (context, idx) { - return SizedBox(width: 8); - }, - itemCount: widget._students.length + 1); // Add one for the 'Add Student' button - } - - Widget _studentWidget(User student) { - return GestureDetector( - behavior: HitTestBehavior.translucent, - onTap: () { - ApiPrefs.updateCurrentLogin((b) => b..selectedStudentId = student.id); - ParentTheme.of(context)?.setSelectedStudent(student.id); - Provider.of(context, listen: false).update(student); - ApiPrefs.setCurrentStudent(student); - if (widget.onTap != null) widget.onTap!(); - }, - child: Semantics( - label: L10n(context).tapToSelectStudent, - child: Center( - child: Container( - width: 120, - height: 86, - child: Column( - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - SizedBox(height: 8), - Container( - child: Avatar.fromUser(student, radius: 24), - decoration: BoxDecoration( - boxShadow: [BoxShadow(color: const Color(0x1E000000), offset: Offset(1.5, 1.5), blurRadius: 4)], - borderRadius: BorderRadius.all(Radius.circular(40))), - ), - SizedBox(height: 8), - Text( - student.shortName ?? '', - key: Key("${student.shortName}_text"), - style: Theme.of(context).textTheme.titleSmall?.copyWith(color: ParentTheme.of(context)?.onSurfaceColor), - overflow: TextOverflow.ellipsis, - textAlign: TextAlign.center, - ), - ], - ), - ), - ), - ), - ); - } - - Widget _addWidget() { - return Center( - child: Container( - width: 120, - height: 92, - child: ListView( - children: [ - SizedBox(height: 12), - Container( - width: 48, - height: 48, - child: ElevatedButton( - child: Semantics( - label: L10n(context).tapToPairNewStudent, - child: Icon( - Icons.add, - color: Theme.of(context).colorScheme.secondary, - ), - ), - style: ElevatedButton.styleFrom( - padding: EdgeInsets.zero, - backgroundColor: Theme.of(context).scaffoldBackgroundColor, - surfaceTintColor: Theme.of(context).canvasColor, - shape: CircleBorder( - side: BorderSide( - color: ParentTheme.of(context)?.isDarkMode == true ? Theme.of(context).colorScheme.secondary : Colors.white, - width: 1), - ), - elevation: 8, - ), - onPressed: () { - locator().pairNewStudent(context, () => { if (widget.onAddStudent != null) widget.onAddStudent!() }); - }, - ), - ), - SizedBox(height: 8), - Align( - alignment: Alignment.center, - child: Text( - L10n(context).addStudent, - style: Theme.of(context).textTheme.titleSmall?.copyWith(color: ParentTheme.of(context)?.onSurfaceColor), - ), - ), - ], - ), - ), - ); - } -} diff --git a/apps/flutter_parent/lib/screens/domain_search/domain_search_interactor.dart b/apps/flutter_parent/lib/screens/domain_search/domain_search_interactor.dart deleted file mode 100644 index 6f419c7134..0000000000 --- a/apps/flutter_parent/lib/screens/domain_search/domain_search_interactor.dart +++ /dev/null @@ -1,33 +0,0 @@ -// Copyright (C) 2019 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:flutter_parent/models/school_domain.dart'; -import 'package:flutter_parent/network/api/accounts_api.dart'; -import 'package:flutter_parent/utils/service_locator.dart'; -import 'package:flutter_parent/utils/url_launcher.dart'; - -class DomainSearchInteractor { - Future?> performSearch(String query) { - return locator().searchDomains(query); - } - - openCanvasGuides() { - locator() - .launch('https://community.canvaslms.com/docs/DOC-9902-canvas-parent-android-guide-table-of-contents'); - } - - openCanvasSupport() { - locator().launch('https://community.canvaslms.com/docs/DOC-17624-how-to-contact-canvas-support'); - } -} diff --git a/apps/flutter_parent/lib/screens/domain_search/domain_search_screen.dart b/apps/flutter_parent/lib/screens/domain_search/domain_search_screen.dart deleted file mode 100644 index 6c8f8b31a5..0000000000 --- a/apps/flutter_parent/lib/screens/domain_search/domain_search_screen.dart +++ /dev/null @@ -1,292 +0,0 @@ -// Copyright (C) 2019 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:flutter/gestures.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_parent/l10n/app_localizations.dart'; -import 'package:flutter_parent/network/utils/analytics.dart'; -import 'package:flutter_parent/router/panda_router.dart'; -import 'package:flutter_parent/screens/web_login/web_login_screen.dart'; -import 'package:flutter_parent/utils/debouncer.dart'; -import 'package:flutter_parent/utils/design/parent_colors.dart'; -import 'package:flutter_parent/utils/design/parent_theme.dart'; -import 'package:flutter_parent/utils/quick_nav.dart'; -import 'package:flutter_parent/utils/service_locator.dart'; - -import 'domain_search_interactor.dart'; - -class DomainSearchScreen extends StatefulWidget { - @visibleForTesting - static final GlobalKey helpDialogBodyKey = GlobalKey(); - - const DomainSearchScreen({this.loginFlow, super.key}); - - final LoginFlow? loginFlow; - - @override - _DomainSearchScreenState createState() => _DomainSearchScreenState(); -} - -class _DomainSearchScreenState extends State { - var _interactor = locator(); - - var _schoolDomains = []; - - /// The minimum length of a trimmed query required to trigger a search - static const int _MIN_SEARCH_LENGTH = 2; - - /// The trimmed user input, used when the user taps the 'Next' button - String _query = ''; - - /// The loading state - bool _loading = false; - - /// Whether there was an error fetching the search results - bool _error = false; - - /// The current query, tracked to help prevent race conditions when a previous search completes after a more recent search - String? _currentQuery; - - Debouncer _debouncer = Debouncer(Duration(milliseconds: 500)); - - final TextEditingController _inputController = TextEditingController(); - - _searchDomains(String query) async { - if (query.length < _MIN_SEARCH_LENGTH) query = ''; - - if (query == _currentQuery) return; // Do nothing if the search query has not effectively changed - - _currentQuery = query; - - if (query.isEmpty) { - setState(() { - _loading = false; - _error = false; - _schoolDomains = []; - }); - } else { - setState(() { - _loading = true; - _error = false; - }); - await _interactor.performSearch(query).then((domains) { - if (_currentQuery != query) return; - setState(() { - _loading = false; - _error = false; - if (domains != null) _schoolDomains = domains; - }); - }).catchError((error) { - if (_currentQuery != query) return; - setState(() { - _loading = false; - _error = true; - _schoolDomains = []; - }); - }); - } - } - - @override - Widget build(BuildContext context) { - return DefaultParentTheme( - builder: (context) => Scaffold( - appBar: AppBar( - title: Text( - L10n(context).findSchool, - style: TextStyle(fontSize: 20, fontWeight: FontWeight.w500), - ), - bottom: ParentTheme.of(context)?.appBarDivider(shadowInLightMode: false), - actions: [ - MaterialButton( - minWidth: 20, - highlightColor: Colors.transparent, - splashColor: Theme.of(context).colorScheme.secondary.withAlpha(100), - textColor: Theme.of(context).colorScheme.secondary, - shape: CircleBorder(side: BorderSide(color: Colors.transparent)), - onPressed: _query.isEmpty ? null : () => _next(context), - child: Text( - L10n(context).next, - textAlign: TextAlign.end, - style: TextStyle( - fontSize: 18, - fontWeight: FontWeight.w500, - ), - ), - ), - ], - ), - body: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - TextField( - maxLines: 1, - autofocus: true, - key: Key("FindSchoolTextField"), - controller: _inputController, - style: TextStyle(fontSize: 18), - keyboardType: TextInputType.url, - textInputAction: TextInputAction.go, - onSubmitted: (_) => _query.isNotEmpty ? _next(context) : null, - decoration: InputDecoration( - contentPadding: EdgeInsets.all(16), - border: InputBorder.none, - hintText: L10n(context).domainSearchInputHint, - suffixIcon: _query.isEmpty - ? null - : IconButton( - key: Key('clear-query'), - icon: Icon( - Icons.clear, - color: ParentColors.ash, - ), - onPressed: () { - // Need to perform this post-frame due to bug while widget testing - // See https://github.com/flutter/flutter/issues/17647 - WidgetsBinding.instance.addPostFrameCallback((_) { - _inputController.text = ''; - _searchDomains(''); - }); - }, - ), - ), - onChanged: (query) { - // Update the state for the new query, then debounce the search request - var thisQuery = query.trim(); - setState(() => _query = thisQuery); - _debouncer.debounce(() => _searchDomains(query)); - }, - ), - SizedBox( - height: 2, - child: LinearProgressIndicator( - value: _loading ? null : 0, - backgroundColor: Colors.transparent, - ), - ), - Divider(height: 0), - Flexible( - flex: 10000, - child: ListView.separated( - shrinkWrap: true, - separatorBuilder: (context, index) => Divider( - height: 0, - ), - itemCount: _schoolDomains.length + (_error ? 1 : 0), - itemBuilder: (context, index) { - if (_error) - return Center( - child: Padding( - padding: const EdgeInsets.all(16.0), - child: Text(L10n(context).noDomainResults(_query)), - )); - var item = _schoolDomains[index]; - return ListTile( - title: Text(item.name), - onTap: () async { - final accountName = (item.name == null || item.name.isEmpty) ? item.domain : item.name; - return locator().pushRoute(context, - PandaRouter.loginWeb(item.domain, accountName: accountName, authenticationProvider: item.authenticationProvider)); - }, - ); - }, - ), - ), - if (_schoolDomains.isNotEmpty) Divider(height: 0), - Center( - child: TextButton( - key: Key('help-button'), - child: Text(L10n(context).domainSearchHelpLabel), - style: TextButton.styleFrom( - textStyle: TextStyle(color: Theme.of(context).colorScheme.secondary), - ), - onPressed: () { - _showHelpDialog(context); - }, - ), - ), - ], - ), - ), - ); - } - - _showHelpDialog(BuildContext context) { - var canvasGuidesText = L10n(context).canvasGuides; - var canvasSupportText = L10n(context).canvasSupport; - var body = L10n(context).domainSearchHelpBody(canvasGuidesText, canvasSupportText); - - locator().logEvent(AnalyticsEventConstants.HELP_DOMAIN_SEARCH); - showDialog( - context: context, - builder: (context) { - return AlertDialog( - title: Text(L10n(context).findSchool), - content: Text.rich( - _helpBodySpan( - text: body, - inputSpans: [ - TextSpan( - text: canvasGuidesText, - style: TextStyle(color: Theme.of(context).colorScheme.secondary), - recognizer: TapGestureRecognizer()..onTap = _interactor.openCanvasGuides, - ), - TextSpan( - text: canvasSupportText, - style: TextStyle(color: Theme.of(context).colorScheme.secondary), - recognizer: TapGestureRecognizer()..onTap = _interactor.openCanvasSupport, - ), - ], - ), - key: DomainSearchScreen.helpDialogBodyKey, - ), - actions: [ - TextButton( - child: Text(L10n(context).ok), - onPressed: () => Navigator.of(context).pop(), - ), - ], - ); - }); - } - - TextSpan _helpBodySpan({required String text, required List inputSpans}) { - var indexedSpans = inputSpans.map((it) => MapEntry(text.indexOf(it.text!), it)).toList(); - indexedSpans.sort((a, b) => a.key.compareTo(b.key)); - - int index = 0; - List spans = []; - - for (var indexedSpan in indexedSpans) { - spans.add(TextSpan(text: text.substring(index, indexedSpan.key))); - spans.add(indexedSpan.value); - index = indexedSpan.key + indexedSpan.value.text!.length; - } - spans.add(TextSpan(text: text.substring(index))); - - return TextSpan(children: spans); - } - - void _next(BuildContext context) { - String domain = _query; - RegExp regExp = new RegExp(r'(.*)([a-zA-Z0-9]){1}'); - if (regExp.hasMatch(domain)) domain = regExp.stringMatch(domain)!; - if (domain.startsWith('www.')) domain = domain.substring(4); // Strip off www. if they typed it - if (!domain.contains('.') || domain.endsWith('.beta')) domain += '.instructure.com'; - if (widget.loginFlow != null) - locator().pushRoute(context, PandaRouter.loginWeb(domain, accountName: domain, loginFlow: widget.loginFlow!)); - else - locator().pushRoute(context, PandaRouter.loginWeb(domain, accountName: domain)); - } -} diff --git a/apps/flutter_parent/lib/screens/events/event_details_interactor.dart b/apps/flutter_parent/lib/screens/events/event_details_interactor.dart deleted file mode 100644 index 18ecd22620..0000000000 --- a/apps/flutter_parent/lib/screens/events/event_details_interactor.dart +++ /dev/null @@ -1,77 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -import 'package:flutter_parent/l10n/app_localizations.dart'; -import 'package:flutter_parent/models/reminder.dart'; -import 'package:flutter_parent/models/schedule_item.dart'; -import 'package:flutter_parent/network/api/calendar_events_api.dart'; -import 'package:flutter_parent/network/utils/api_prefs.dart'; -import 'package:flutter_parent/utils/db/reminder_db.dart'; -import 'package:flutter_parent/utils/notification_util.dart'; -import 'package:flutter_parent/utils/service_locator.dart'; - -class EventDetailsInteractor { - Future loadEvent(String? eventId, bool forceRefresh) { - return locator().getEvent(eventId, forceRefresh); - } - - Future loadReminder(String? eventId) async { - final reminder = await locator().getByItem( - ApiPrefs.getDomain(), - ApiPrefs.getUser()?.id, - Reminder.TYPE_EVENT, - eventId, - ); - - /* If the user dismisses a reminder notification without tapping it, then NotificationUtil won't have a chance - to remove it from the database. Given that we cannot time travel (yet), if the reminder we just retrieved - has a date set in the past then we will opt to delete it here. */ - if (reminder?.date?.isBefore(DateTime.now()) == true) { - await deleteReminder(reminder!); - return null; - } - - return reminder; - } - - Future createReminder( - AppLocalizations l10n, - DateTime date, - String? eventId, - String? courseId, - String? title, - String body, - ) async { - var reminder = Reminder((b) => b - ..userDomain = ApiPrefs.getDomain() - ..userId = ApiPrefs.getUser()?.id - ..type = Reminder.TYPE_EVENT - ..itemId = eventId - ..courseId = courseId - ..date = date.toUtc() // built_value complains about non-utc timestamps - ); - - // Saving to the database will generate an ID for this reminder - var insertedReminder = await locator().insert(reminder); - if (insertedReminder != null) { - reminder = insertedReminder; - await locator().scheduleReminder(l10n, title, body, reminder); - } - } - - Future deleteReminder(Reminder? reminder) async { - if (reminder == null) return; - await locator().deleteNotification(reminder.id!); - await locator().deleteById(reminder.id!); - } -} diff --git a/apps/flutter_parent/lib/screens/events/event_details_screen.dart b/apps/flutter_parent/lib/screens/events/event_details_screen.dart deleted file mode 100644 index 7b2eb4700b..0000000000 --- a/apps/flutter_parent/lib/screens/events/event_details_screen.dart +++ /dev/null @@ -1,351 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -import 'package:collection/collection.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_parent/l10n/app_localizations.dart'; -import 'package:flutter_parent/models/reminder.dart'; -import 'package:flutter_parent/models/schedule_item.dart'; -import 'package:flutter_parent/models/user.dart'; -import 'package:flutter_parent/network/utils/api_prefs.dart'; -import 'package:flutter_parent/screens/events/event_details_interactor.dart'; -import 'package:flutter_parent/screens/inbox/create_conversation/create_conversation_screen.dart'; -import 'package:flutter_parent/utils/common_widgets/error_panda_widget.dart'; -import 'package:flutter_parent/utils/common_widgets/loading_indicator.dart'; -import 'package:flutter_parent/utils/common_widgets/web_view/html_description_tile.dart'; -import 'package:flutter_parent/utils/core_extensions/date_time_extensions.dart'; -import 'package:flutter_parent/utils/design/canvas_icons_solid.dart'; -import 'package:flutter_parent/utils/design/parent_theme.dart'; -import 'package:flutter_parent/utils/quick_nav.dart'; -import 'package:flutter_parent/utils/service_locator.dart'; -import 'package:intl/intl.dart'; - -class EventDetailsScreen extends StatefulWidget { - final ScheduleItem? event; - final String? eventId; - - // Course ID is used for messaging. The message FAB will not be shown if it or current student is null. - final String? courseId; - - EventDetailsScreen.withEvent({ - required this.event, - this.courseId, - super.key - }) : assert(event != null), - eventId = event!.id; - - EventDetailsScreen.withId({ - required this.eventId, - this.courseId, - super.key - }) : - assert(eventId != null), - event = null; - - @override - _EventDetailsScreenState createState() => _EventDetailsScreenState(); -} - -class _EventDetailsScreenState extends State { - GlobalKey _refreshKey = GlobalKey(); - - late Future _eventFuture; - - Future _loadEvent({bool forceRefresh = false}) => _interactor.loadEvent(widget.eventId, forceRefresh); - - EventDetailsInteractor get _interactor => locator(); - - @override - void initState() { - if (widget.event != null) { - _eventFuture = Future.value(widget.event); - } else { - _eventFuture = _loadEvent(); - } - super.initState(); - } - - @override - Widget build(BuildContext context) { - return FutureBuilder( - future: _eventFuture, - builder: (context, AsyncSnapshot snapshot) { - return Scaffold( - appBar: AppBar(title: Text(L10n(context).eventDetailsTitle)), - floatingActionButton: _fab(snapshot), - body: RefreshIndicator( - key: _refreshKey, - onRefresh: () { - setState(() { - _eventFuture = _loadEvent(forceRefresh: true); - }); - return _eventFuture.catchError((_) {}); - }, - child: _body(context, snapshot), - ), - ); - }, - ); - } - - Widget _body(BuildContext context, AsyncSnapshot snapshot) { - if (snapshot.hasError) { - return ErrorPandaWidget( - L10n(context).unexpectedError, - () => _refreshKey.currentState?.show(), - ); - } else if (!snapshot.hasData) { - return LoadingIndicator(); - } else { - return _EventDetails(snapshot.data, widget.courseId); - } - } - - Widget? _fab(AsyncSnapshot snapshot) { - User? student = ApiPrefs.getCurrentStudent(); - if (!snapshot.hasData || widget.courseId == null || student?.id == null || student?.name == null) { - // The data hasn't loaded, or course/student info is missing (e.g. if we deep linked to this page) - return null; - } - - return FloatingActionButton( - tooltip: L10n(context).assignmentMessageHint, - child: Padding(padding: const EdgeInsets.only(left: 4, top: 4), child: Icon(CanvasIconsSolid.comment)), - onPressed: () { - final event = snapshot.data!; - String subject = L10n(context).eventSubjectMessage(student!.name, event.title!); - String postscript = L10n(context).messageLinkPostscript(student.name, event.htmlUrl ?? ''); - Widget screen = CreateConversationScreen( - widget.courseId!, - student.id, - subject, - postscript, - ); - locator.get().push(context, screen); - }, - ); - } -} - -class _EventDetails extends StatelessWidget { - final ScheduleItem? event; - final String? courseId; - - const _EventDetails(this.event, this.courseId, {super.key}); - - @override - Widget build(BuildContext context) { - final l10n = L10n(context); - - // Get the date strings - String? dateLine1, dateLine2; - final date = event?.startAt ?? event?.endAt; - if (event?.isAllDay == true) { - dateLine1 = _dateFormat(date); - dateLine2 = ''; - } else if (event?.startAt != null && event?.endAt != null && event?.startAt != event?.endAt) { - dateLine1 = _dateFormat(date); - dateLine2 = l10n.eventTime(_timeFormat(event?.startAt!)!, _timeFormat(event?.endAt!)!); - } else { - dateLine1 = _dateFormat(date); - dateLine2 = _timeFormat(date); - } - - // Get the location strings - String? locationLine1, locationLine2; - if ((event?.locationAddress == null || event?.locationAddress?.isEmpty == true) && - (event?.locationName == null || event?.locationName?.isEmpty == true)) { - locationLine1 = l10n.eventNoLocation; - } else if (event?.locationName == null || event?.locationName?.isEmpty == true) { - locationLine1 = event?.locationAddress ?? ''; - } else { - locationLine1 = event?.locationName ?? ''; - locationLine2 = event?.locationAddress ?? ''; - } - - final textTheme = Theme.of(context).textTheme; - - return ListView( - padding: const EdgeInsets.symmetric(horizontal: 16.0), - children: [ - SizedBox(height: 16), - Text(event?.title ?? '', style: textTheme.headlineMedium, key: ValueKey('event_details_title')), - SizedBox(height: 16), - Divider(), - _SimpleTile(label: l10n.eventDateLabel, line1: dateLine1, line2: dateLine2, keyPrefix: 'event_details_date'), - Divider(), - _SimpleTile( - label: l10n.eventLocationLabel, - line1: locationLine1, - line2: locationLine2, - keyPrefix: 'event_details_location'), - Divider(), - _SimpleHeader(label: l10n.assignmentRemindMeLabel), - _RemindMe(event, courseId, [dateLine1, dateLine2].nonNulls.where((d) => d.isNotEmpty).join('\n')), - Divider(), - HtmlDescriptionTile(html: event?.description), - // Don't show the bottom divider if there's no content (no empty message shown either) - if (event?.description != null && event?.description?.isNotEmpty == true) - Divider(), - ], - ); - } - - String? _dateFormat(DateTime? time) { - return time == null ? null : DateFormat.EEEE(supportedDateLocale).add_yMMMd().format(time.toLocal()); - } - - String? _timeFormat(DateTime? time) { - return time == null ? null : DateFormat.jm(supportedDateLocale).format(time.toLocal()); - } -} - -class _RemindMe extends StatefulWidget { - final ScheduleItem? event; - final String? courseId; - final String formattedDate; - - const _RemindMe(this.event, this.courseId, this.formattedDate, {super.key}); - - @override - _RemindMeState createState() => _RemindMeState(); -} - -class _RemindMeState extends State<_RemindMe> { - late Future _reminderFuture; - - EventDetailsInteractor _interactor = locator(); - - Future _loadReminder() => _interactor.loadReminder(widget.event?.id); - - @override - void initState() { - _reminderFuture = _loadReminder(); - super.initState(); - } - - @override - Widget build(BuildContext context) { - TextTheme textTheme = Theme.of(context).textTheme; - return FutureBuilder( - future: _reminderFuture, - builder: (BuildContext context, AsyncSnapshot snapshot) { - Reminder? reminder = snapshot.data; - return SwitchListTile( - contentPadding: EdgeInsets.zero, - value: reminder != null, - title: Text( - reminder?.date == null ? L10n(context).eventRemindMeDescription : L10n(context).eventRemindMeSet, - style: textTheme.titleMedium, - ), - subtitle: reminder == null - ? null - : Padding( - padding: const EdgeInsets.only(top: 8), - child: Text( - reminder.date.l10nFormat(L10n(context).dateAtTime)!, - style: textTheme.titleMedium?.copyWith(color: ParentTheme.of(context)?.studentColor), - ), - ), - onChanged: (checked) => _handleAlarmSwitch(context, widget.event, checked, reminder, widget.formattedDate) - ); - }, - ); - } - - _handleAlarmSwitch( - BuildContext context, - ScheduleItem? event, - bool checked, - Reminder? reminder, - String formattedDate, - ) async { - if (reminder != null) _interactor.deleteReminder(reminder); - if (checked) { - var now = DateTime.now(); - var eventDate = event?.isAllDay == true ? event?.allDayDate?.toLocal() : event?.startAt?.toLocal(); - var initialDate = eventDate?.isAfter(now) == true ? eventDate! : now; - - DateTime? date; - TimeOfDay? time; - - date = await showDatePicker( - context: context, - initialDate: initialDate, - firstDate: now, - lastDate: initialDate.add(Duration(days: 365)), - ); - if (date != null) { - time = await showTimePicker(context: context, initialTime: TimeOfDay.fromDateTime(initialDate)); - } - - if (date != null && time != null) { - DateTime reminderDate = DateTime(date.year, date.month, date.day, time.hour, time.minute); - await _interactor.createReminder( - L10n(context), - reminderDate, - event?.id, - widget.courseId, - event?.title, - formattedDate, - ); - } - } - - // Perform refresh - setState(() { - _reminderFuture = _loadReminder(); - }); - } -} - -class _SimpleTile extends StatelessWidget { - final String label, keyPrefix; - final String? line1, line2; - - const _SimpleTile({required this.label, this.line1, this.line2, required this.keyPrefix, super.key}); - - @override - Widget build(BuildContext context) { - final textTheme = Theme.of(context).textTheme; - - return Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - _SimpleHeader(label: label), - Text(line1 ?? '', style: textTheme.titleMedium, key: ValueKey('${keyPrefix}_line1')), - if (line2 != null) SizedBox(height: 8), - if (line2 != null) Text(line2!, style: textTheme.titleMedium, key: ValueKey('${keyPrefix}_line2')), - SizedBox(height: 16), - ], - ); - } -} - -class _SimpleHeader extends StatelessWidget { - final String label; - - const _SimpleHeader({required this.label, super.key}); - - @override - Widget build(BuildContext context) { - return Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - SizedBox(height: 16), - Text(label, style: Theme.of(context).textTheme.labelSmall), - SizedBox(height: 8), - ], - ); - } -} diff --git a/apps/flutter_parent/lib/screens/help/help_screen.dart b/apps/flutter_parent/lib/screens/help/help_screen.dart deleted file mode 100644 index 4d2ca0edf1..0000000000 --- a/apps/flutter_parent/lib/screens/help/help_screen.dart +++ /dev/null @@ -1,148 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -import 'package:flutter/material.dart'; -import 'package:flutter_parent/l10n/app_localizations.dart'; -import 'package:flutter_parent/models/help_link.dart'; -import 'package:flutter_parent/network/utils/api_prefs.dart'; -import 'package:flutter_parent/utils/common_widgets/error_report/error_report_dialog.dart'; -import 'package:flutter_parent/utils/common_widgets/loading_indicator.dart'; -import 'package:flutter_parent/utils/design/parent_theme.dart'; -import 'package:flutter_parent/utils/service_locator.dart'; -import 'package:flutter_parent/utils/url_launcher.dart'; -import 'package:flutter_parent/utils/veneers/android_intent_veneer.dart'; -import 'package:package_info_plus/package_info_plus.dart'; - -import 'help_screen_interactor.dart'; - -class HelpScreen extends StatefulWidget { - @override - _HelpScreenState createState() => _HelpScreenState(); -} - -class _HelpScreenState extends State { - final _interactor = locator(); - late Future> _helpLinksFuture; - late AppLocalizations l10n; - - @override - void initState() { - _helpLinksFuture = _interactor.getObserverCustomHelpLinks(forceRefresh: true); - super.initState(); - } - - @override - Widget build(BuildContext context) { - l10n = L10n(context); - return FutureBuilder( - future: _helpLinksFuture, - builder: (context, snapshot) { - Widget _body; - _body = snapshot.connectionState == ConnectionState.waiting ? LoadingIndicator() : _success(snapshot.data); - return DefaultParentTheme( - builder: (context) => Scaffold( - appBar: AppBar( - title: Text(l10n.help), - bottom: ParentTheme.of(context)?.appBarDivider(shadowInLightMode: false), - ), - body: _body), - ); - }); - } - - Widget _success(List? links) => ListView(children: _generateLinks(links)); - - List _generateLinks(List? links) { - List helpLinks = List.from(links?.map( - (l) => ListTile( - title: Text(l.text ?? '', style: Theme.of(context).textTheme.titleMedium), - subtitle: Text(l.subtext ?? '', style: Theme.of(context).textTheme.bodySmall), - onTap: () => _linkClick(l), - ), - ) ?? []); - - // Add in the legal and share the love tiles - helpLinks.addAll([ - ListTile( - title: Text(l10n.helpShareLoveLabel, style: Theme.of(context).textTheme.titleMedium), - subtitle: Text(l10n.helpShareLoveDescription, style: Theme.of(context).textTheme.bodySmall), - onTap: _showShareLove, - ) - ]); - - return helpLinks; - } - - void _linkClick(HelpLink link) { - String url = link.url ?? ''; - if (url[0] == '#') { - // Internal link - if (url.contains('#create_ticket')) { - _showReportProblem(); - } else if (url.contains('#share_the_love')) { - // Custom for Android - _showShareLove(); - } - } else if (link.id?.contains('submit_feature_idea') == true) { - _showRequestFeature(); - } else if (url.startsWith('tel:+')) { - // Support phone links: https://community.canvaslms.com/docs/DOC-12664-4214610054 - locator().launchPhone(url); - } else if (url.startsWith('mailto:')) { - // Support mailto links: https://community.canvaslms.com/docs/DOC-12664-4214610054 - locator().launchEmail(url); - } else if (url.contains('cases.canvaslms.com/liveagentchat')) { - // Chat with Canvas Support - Doesn't seem work properly with WebViews, so we kick it out - // to the external browser - locator().launch(url); - } else if (link.id?.contains('search_the_canvas_guides') == true) { - // Send them to the mobile Canvas guides - _showSearch(); - } else { - // External url - locator().launch(url); - } - } - - void _showSearch() => locator().launch( - 'https://community.canvaslms.com/community/answers/guides/mobile-guide/content?filterID=contentstatus%5Bpublished%5D~category%5Btable-of-contents%5D'); - - void _showReportProblem() => ErrorReportDialog.asDialog(context); - - void _showRequestFeature() async { - final l10n = L10n(context); - - final parentId = ApiPrefs.getUser()?.id ?? 0; - final email = ApiPrefs.getUser()?.primaryEmail ?? ''; - final domain = ApiPrefs.getDomain() ?? ''; - final locale = ApiPrefs.effectiveLocale()?.toLanguageTag(); - - PackageInfo package = await PackageInfo.fromPlatform(); - - // Populate the email body with information about the user - String emailBody = '' + - '${l10n.featureRequestHeader}\r\n' + - '${l10n.helpUserId} $parentId\r\n' + - '${l10n.helpEmail} $email\r\n' + - '${l10n.helpDomain} $domain\r\n' + - '${l10n.versionNumber}: ${package.appName} v${package.version} (${package.buildNumber})\r\n' + - '${l10n.helpLocale} $locale\r\n' + - '----------------------------------------------\r\n'; - - final subject = l10n.featureRequestSubject; - - locator().launchEmailWithBody(subject, emailBody); - } - - void _showShareLove() => locator().launchAppStore(); -} diff --git a/apps/flutter_parent/lib/screens/help/help_screen_interactor.dart b/apps/flutter_parent/lib/screens/help/help_screen_interactor.dart deleted file mode 100644 index 3fdc29789b..0000000000 --- a/apps/flutter_parent/lib/screens/help/help_screen_interactor.dart +++ /dev/null @@ -1,42 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:built_collection/built_collection.dart'; -import 'package:flutter_parent/models/help_link.dart'; -import 'package:flutter_parent/models/help_links.dart'; -import 'package:flutter_parent/network/api/help_links_api.dart'; -import 'package:flutter_parent/utils/service_locator.dart'; - -class HelpScreenInteractor { - Future> getObserverCustomHelpLinks({bool forceRefresh = false}) async { - HelpLinks? links = await locator.get().getHelpLinks(forceRefresh: forceRefresh); - - if (links == null) return Future.value([]); - - // Filter observer custom links if we have any, otherwise return an empty list - return Future.value(filterObserverLinks( - containsObserverLinks(links.customHelpLinks) ? links.customHelpLinks : links.defaultHelpLinks)); - } - - bool containsObserverLinks(BuiltList links) => links.any((link) => - link.availableTo.contains(AvailableTo.observer) || - link.availableTo.contains(AvailableTo.user)); - - List filterObserverLinks(BuiltList list) => list - .where((link) => link.url != null && link.text != null) - .where((link) => - link.availableTo.contains(AvailableTo.observer) || - link.availableTo.contains(AvailableTo.user)) - .toList(); -} diff --git a/apps/flutter_parent/lib/screens/help/terms_of_use_screen.dart b/apps/flutter_parent/lib/screens/help/terms_of_use_screen.dart deleted file mode 100644 index 68756af170..0000000000 --- a/apps/flutter_parent/lib/screens/help/terms_of_use_screen.dart +++ /dev/null @@ -1,99 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:flutter/material.dart'; -import 'package:flutter_parent/l10n/app_localizations.dart'; -import 'package:flutter_parent/models/terms_of_service.dart'; -import 'package:flutter_parent/network/api/accounts_api.dart'; -import 'package:flutter_parent/utils/common_widgets/error_panda_widget.dart'; -import 'package:flutter_parent/utils/common_widgets/loading_indicator.dart'; -import 'package:flutter_parent/utils/design/parent_theme.dart'; -import 'package:flutter_parent/utils/service_locator.dart'; -import 'package:flutter_parent/utils/web_view_utils.dart'; -import 'package:webview_flutter/webview_flutter.dart'; -import '../../utils/veneers/android_intent_veneer.dart'; - -class TermsOfUseScreen extends StatefulWidget { - final String? accountId; - final String? domain; - - const TermsOfUseScreen({this.accountId, this.domain, super.key}); - - @override - _TermsOfUseScreenState createState() => _TermsOfUseScreenState(); -} - -class _TermsOfUseScreenState extends State { - late Future _tosFuture; - - @override - void initState() { - _tosFuture = getTosFuture(); - super.initState(); - } - - Future getTosFuture() { - return (widget.accountId != null && widget.domain != null) - ? locator().getTermsOfServiceForAccount(widget.accountId!, widget.domain!) - : locator().getTermsOfService(); - } - - @override - Widget build(BuildContext context) { - return DefaultParentTheme( - builder: (context) => Scaffold( - appBar: AppBar( - title: Text(L10n(context).termsOfUse), - bottom: ParentTheme.of(context)?.appBarDivider(shadowInLightMode: false), - ), - body: FutureBuilder( - future: _tosFuture, - builder: (BuildContext context, AsyncSnapshot snapshot) { - // Loading - if (snapshot.connectionState != ConnectionState.done) return LoadingIndicator(); - - // Error - if (snapshot.hasError) { - return ErrorPandaWidget( - L10n(context).errorLoadingTermsOfUse, - () => setState(() { - _tosFuture = getTosFuture(); - }), - ); - } - - // Content - return WebView( - onWebViewCreated: (controller) { - controller.loadHtml(snapshot.data!.content!, - horizontalPadding: 16, - darkMode: - ParentTheme.of(context)?.isWebViewDarkMode ?? false); - }, - navigationDelegate: _handleNavigation - ); - }, - ), - ), - ); - } - - NavigationDecision _handleNavigation(NavigationRequest request) { - if (request.url.contains("mailto:")) { - locator().launchEmail(request.url); - return NavigationDecision.prevent; - } - return NavigationDecision.navigate; - } -} diff --git a/apps/flutter_parent/lib/screens/inbox/attachment_utils/attachment_extensions.dart b/apps/flutter_parent/lib/screens/inbox/attachment_utils/attachment_extensions.dart deleted file mode 100644 index bf5e2d2acd..0000000000 --- a/apps/flutter_parent/lib/screens/inbox/attachment_utils/attachment_extensions.dart +++ /dev/null @@ -1,46 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:flutter/widgets.dart'; -import 'package:flutter_parent/models/attachment.dart'; -import 'package:flutter_parent/utils/design/canvas_icons.dart'; - -extension AttachmentIcons on Attachment { - IconData getIcon() { - String type = inferContentType() ?? ''; - - if (type.startsWith('video')) { - return CanvasIcons.video; - } else if (type.startsWith('audio')) { - return CanvasIcons.audio; - } else if (type.startsWith('image')) { - return CanvasIcons.image; - } else if (type == 'application/pdf') { - return CanvasIcons.pdf; - } else if (type.contains('powerpoint') || type.contains('presentation')) { - return CanvasIcons.ms_ppt; - } else if (type.contains('excel') || type.contains('spreadsheet') || type == 'text/csv') { - return CanvasIcons.ms_excel; - } else if (type.contains('word') || type.contains('opendocument.text') || type == 'application/rtf') { - return CanvasIcons.ms_word; - } else if (type.contains('zip') || - type.contains('archive') || - type.contains('compressed') || - type.contains('x-tar')) { - return CanvasIcons.zipped; - } else { - return CanvasIcons.document; - } - } -} diff --git a/apps/flutter_parent/lib/screens/inbox/attachment_utils/attachment_handler.dart b/apps/flutter_parent/lib/screens/inbox/attachment_utils/attachment_handler.dart deleted file mode 100644 index 383a4031b4..0000000000 --- a/apps/flutter_parent/lib/screens/inbox/attachment_utils/attachment_handler.dart +++ /dev/null @@ -1,114 +0,0 @@ -// Copyright (C) 2019 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'dart:io'; - -import 'package:flutter/foundation.dart'; -import 'package:flutter_parent/models/attachment.dart'; -import 'package:flutter_parent/network/api/file_api.dart'; -import 'package:flutter_parent/utils/service_locator.dart'; -import 'package:flutter_parent/utils/veneers/path_provider_veneer.dart'; -import 'package:path/path.dart'; - -enum AttachmentUploadStage { CREATED, UPLOADING, FAILED, FINISHED } - -class AttachmentHandler with ChangeNotifier { - AttachmentHandler(this._file); - - final File? _file; - Function(AttachmentUploadStage)? onStageChange; - double? progress = null; - Attachment? attachment; - AttachmentUploadStage _stage = AttachmentUploadStage.CREATED; - - AttachmentUploadStage get stage => _stage; - - set stage(AttachmentUploadStage stage) { - _stage = stage; - if (onStageChange != null) onStageChange!(_stage); - } - - String get displayName => attachment?.displayName ?? attachment?.filename ?? basename(_file?.path ?? ''); - - Future performUpload() async { - // Do nothing if the upload is finished or in progress - if (stage == AttachmentUploadStage.UPLOADING || stage == AttachmentUploadStage.FINISHED) return; - - // Move to Uploading stage - stage = AttachmentUploadStage.UPLOADING; - notifyListeners(); - - try { - // Upload the file and monitor progress - attachment = await locator().uploadConversationFile(_file!, (current, total) { - progress = total == -1 ? null : current.toDouble() / total; - notifyListeners(); - }); - - // Set progress to null (i.e. indeterminate) - progress = null; - notifyListeners(); - - // Clean up source file if appropriate - cleanUpFile(); - - // Give the server a short time to generate the thumbnail - await Future.delayed(Duration(milliseconds: 500), () { - stage = AttachmentUploadStage.FINISHED; - notifyListeners(); - }); - } catch (e) { - stage = AttachmentUploadStage.FAILED; - notifyListeners(); - } - } - - // Removes the file if it is located in this app's storage - @visibleForTesting - Future cleanUpFile() async { - try { - var pathProvider = locator(); - var dirs = await Future.wait([ - pathProvider.getTemporaryDirectory(), - pathProvider.getApplicationSupportDirectory(), - pathProvider.getExternalStorageDirectory(), - ]); - - var dirPaths = dirs.map((it) => it?.absolute.path); - var filePath = _file?.absolute.path; - - if (dirPaths.any((it) { - if (it == null) return false; - return (filePath?.startsWith(it) == true); - })) { - await _file?.delete(); - } - } on Error catch (e) { - print('Unable to clean up attachment source file'); - print(e.stackTrace); - } - } - - // Attempt to delete the file from Canvas - Future deleteAttachment() async { - if (attachment == null) return; - try { - await locator().deleteFile(attachment!.id); - print('Deleted attachment "${attachment!.displayName}"'); - } on Error catch (e) { - print('Unable to delete attachment'); - print(e.stackTrace); - } - } -} diff --git a/apps/flutter_parent/lib/screens/inbox/attachment_utils/attachment_picker.dart b/apps/flutter_parent/lib/screens/inbox/attachment_utils/attachment_picker.dart deleted file mode 100644 index f6c0deb0f4..0000000000 --- a/apps/flutter_parent/lib/screens/inbox/attachment_utils/attachment_picker.dart +++ /dev/null @@ -1,108 +0,0 @@ -// Copyright (C) 2019 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'dart:io'; - -import 'package:flutter/material.dart'; -import 'package:flutter_parent/l10n/app_localizations.dart'; -import 'package:flutter_parent/screens/inbox/attachment_utils/attachment_picker_interactor.dart'; -import 'package:flutter_parent/utils/design/canvas_icons.dart'; -import 'package:flutter_parent/utils/design/parent_theme.dart'; -import 'package:flutter_parent/utils/service_locator.dart'; -import 'package:flutter_svg/svg.dart'; - -import 'attachment_handler.dart'; - -class AttachmentPicker extends StatefulWidget { - @override - _AttachmentPickerState createState() => _AttachmentPickerState(); - - static Future asBottomSheet(BuildContext context) { - return showModalBottomSheet(context: context, builder: (context) => AttachmentPicker()); - } -} - -class _AttachmentPickerState extends State { - bool _importing = false; - - @override - Widget build(BuildContext context) { - return _importing ? _importingWidget(context) : _pickerWidget(context); - } - - Widget _pickerWidget(BuildContext context) { - final interactor = locator(); - final iconColor = ParentTheme.of(context)?.onSurfaceColor; - return ListView( - padding: EdgeInsets.symmetric(vertical: 8), - shrinkWrap: true, - children: [ - _item( - icon: SvgPicture.asset('assets/svg/camera.svg', color: iconColor), - title: L10n(context).useCamera, - onTap: () => _performImport(() => interactor.getImageFromCamera()), - ), - _item( - icon: Icon(CanvasIcons.paperclip, size: 20, color: iconColor), - title: L10n(context).uploadFile, - onTap: () => _performImport(() => interactor.getFileFromDevice()), - ), - _item( - icon: Icon(CanvasIcons.image, size: 20, color: iconColor), - title: L10n(context).chooseFromGallery, - onTap: () => _performImport(() => interactor.getImageFromGallery()), - ), - ], - ); - } - - Widget _item({required Widget icon, required String title, required GestureTapCallback onTap}) { - return ListTile( - leading: Container(width: 20, alignment: Alignment.center, child: icon), - title: Text(title), - onTap: onTap, - ); - } - - Widget _importingWidget(BuildContext context) { - return Container( - height: 184, // Match list height: 16 (padding top + bottom) + 56 (item height) * 3 items - width: double.infinity, - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Text(L10n(context).attachmentPreparing), - Padding( - padding: const EdgeInsets.symmetric(vertical: 16), - child: SizedBox( - width: 120, - height: 2, - child: LinearProgressIndicator(value: null), - ), - ), - ], - ), - ); - } - - _performImport(Future Function() import) async { - setState(() => _importing = true); - var file = await import(); - if (file != null) { - Navigator.of(context).pop(AttachmentHandler(file)); - } else { - setState(() => _importing = false); - } - } -} diff --git a/apps/flutter_parent/lib/screens/inbox/attachment_utils/attachment_picker_interactor.dart b/apps/flutter_parent/lib/screens/inbox/attachment_utils/attachment_picker_interactor.dart deleted file mode 100644 index fb4fa0a760..0000000000 --- a/apps/flutter_parent/lib/screens/inbox/attachment_utils/attachment_picker_interactor.dart +++ /dev/null @@ -1,41 +0,0 @@ -// Copyright (C) 2019 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'dart:io'; - -import 'package:file_picker/file_picker.dart'; -import 'package:image_picker/image_picker.dart'; - -/// Note: Currently excluded from code coverage. That may need to change if this file is updated with testable code. -class AttachmentPickerInteractor { - final ImagePicker _imagePicker = ImagePicker(); - - Future getImageFromCamera() { - return _imagePicker - .pickImage(source: ImageSource.camera) - .then((value) => File(value!.path)); - } - - Future getFileFromDevice() { - final result = FilePicker.platform.pickFiles(); - - return result.then((value) => File(value!.files.single.path!)).onError((error, stackTrace) => Future.error("")); - } - - Future getImageFromGallery() { - return _imagePicker - .pickImage(source: ImageSource.gallery) - .then((value) => File(value!.path)); - } -} diff --git a/apps/flutter_parent/lib/screens/inbox/conversation_details/conversation_details_interactor.dart b/apps/flutter_parent/lib/screens/inbox/conversation_details/conversation_details_interactor.dart deleted file mode 100644 index b40d383b50..0000000000 --- a/apps/flutter_parent/lib/screens/inbox/conversation_details/conversation_details_interactor.dart +++ /dev/null @@ -1,47 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:flutter/material.dart'; -import 'package:flutter_parent/models/attachment.dart'; -import 'package:flutter_parent/models/conversation.dart'; -import 'package:flutter_parent/models/message.dart'; -import 'package:flutter_parent/network/api/inbox_api.dart'; -import 'package:flutter_parent/network/utils/api_prefs.dart'; -import 'package:flutter_parent/screens/dashboard/inbox_notifier.dart'; -import 'package:flutter_parent/screens/inbox/reply/conversation_reply_screen.dart'; -import 'package:flutter_parent/utils/common_widgets/view_attachment/view_attachment_screen.dart'; -import 'package:flutter_parent/utils/quick_nav.dart'; -import 'package:flutter_parent/utils/service_locator.dart'; - -class ConversationDetailsInteractor { - Future getConversation(String id) async { - Conversation? conversation = await locator().getConversation(id, refresh: true); - - // Fetching a conversation automatically marks it as read, so we'll want to update the inbox count badge - locator().update(); - - return conversation; - } - - Future addReply(BuildContext context, Conversation? conversation, Message? message, bool replyAll) async { - Conversation? r = await locator().push(context, ConversationReplyScreen(conversation, message, replyAll)); - return r; - } - - String? getCurrentUserId() => ApiPrefs.getUser()?.id; - - Future viewAttachment(BuildContext context, Attachment attachment) async { - locator().push(context, ViewAttachmentScreen(attachment)); - } -} diff --git a/apps/flutter_parent/lib/screens/inbox/conversation_details/conversation_details_screen.dart b/apps/flutter_parent/lib/screens/inbox/conversation_details/conversation_details_screen.dart deleted file mode 100644 index beeca50256..0000000000 --- a/apps/flutter_parent/lib/screens/inbox/conversation_details/conversation_details_screen.dart +++ /dev/null @@ -1,222 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:flutter/material.dart'; -import 'package:flutter/rendering.dart'; -import 'package:flutter_parent/l10n/app_localizations.dart'; -import 'package:flutter_parent/models/conversation.dart'; -import 'package:flutter_parent/models/message.dart'; -import 'package:flutter_parent/screens/inbox/conversation_details/message_widget.dart'; -import 'package:flutter_parent/utils/common_widgets/error_panda_widget.dart'; -import 'package:flutter_parent/utils/common_widgets/loading_indicator.dart'; -import 'package:flutter_parent/utils/design/canvas_icons_solid.dart'; -import 'package:flutter_parent/utils/design/parent_colors.dart'; -import 'package:flutter_parent/utils/design/parent_theme.dart'; -import 'package:flutter_parent/utils/service_locator.dart'; -import 'package:flutter_slidable/flutter_slidable.dart'; - -import 'conversation_details_interactor.dart'; - -class ConversationDetailsScreen extends StatefulWidget { - final String conversationId; - final String? conversationSubject; - final String? courseName; - - const ConversationDetailsScreen({ - required this.conversationId, - this.conversationSubject, - this.courseName, - super.key - }); - - @override - _ConversationDetailsScreenState createState() => _ConversationDetailsScreenState(); -} - -class _ConversationDetailsScreenState extends State { - ConversationDetailsInteractor _interactor = locator(); - late Future _conversationFuture; - - bool _hasBeenUpdated = false; - - @override - void initState() { - _conversationFuture = _interactor.getConversation(widget.conversationId); - super.initState(); - } - - @override - Widget build(BuildContext context) { - return WillPopScope( - onWillPop: () async { - // Return true from this screen if the conversation has been updated - Navigator.pop(context, _hasBeenUpdated); - return false; - }, - child: DefaultParentTheme( - builder: (context) => FutureBuilder( - future: _conversationFuture, - builder: (BuildContext context, AsyncSnapshot snapshot) => Scaffold( - appBar: _appBar(context), - body: _body(context, snapshot), - floatingActionButton: _fab(context, snapshot), - ), - ), - ), - ); - } - - AppBar _appBar(BuildContext context) { - return AppBar( - title: Column( - crossAxisAlignment: CrossAxisAlignment.start, - mainAxisSize: MainAxisSize.min, - children: [ - Text( - widget.conversationSubject == null || widget.conversationSubject!.isEmpty - ? L10n(context).noSubject - : widget.conversationSubject!, - key: ValueKey('subjectText')), - if (widget.courseName != null && widget.courseName!.isNotEmpty) - Text(widget.courseName!, style: Theme.of(context).textTheme.bodySmall, key: ValueKey('courseText')), - ], - ), - bottom: ParentTheme.of(context)?.appBarDivider(shadowInLightMode: false), - ); - } - - Widget _fab(BuildContext context, AsyncSnapshot snapshot) { - if (!snapshot.hasData) return Container(); - Conversation conversation = snapshot.data!; - return FloatingActionButton( - child: Icon(CanvasIconsSolid.reply, size: 20), - tooltip: L10n(context).reply, - onPressed: () { - showModalBottomSheet( - context: context, - builder: (BuildContext bc) { - return Container( - child: Column( - mainAxisSize: MainAxisSize.min, - children: [ - ListTile( - leading: Icon(CanvasIconsSolid.reply, size: 20, color: Theme.of(context).iconTheme.color), - title: Text(L10n(context).reply, style: Theme.of(context).textTheme.bodyMedium), - onTap: () { - Navigator.of(context).pop(); - _reply(context, conversation, null, false); - }), - ListTile( - leading: Icon(CanvasIconsSolid.reply_all_2, size: 20, color: Theme.of(context).iconTheme.color), - title: Text(L10n(context).replyAll, style: Theme.of(context).textTheme.bodyMedium), - onTap: () { - Navigator.of(context).pop(); - _reply(context, conversation, null, true); - }), - ], - ), - ); - }); - }, - ); - } - - Widget _body(BuildContext context, AsyncSnapshot snapshot) { - if (snapshot.hasError) return _errorState(context); - if (snapshot.hasData) return _successState(context, snapshot.data!); - return LoadingIndicator(); - } - - Widget _errorState(BuildContext context) { - return ErrorPandaWidget(L10n(context).errorLoadingConversation, () { - setState(() { - _conversationFuture = _interactor.getConversation(widget.conversationId); - }); - }); - } - - Widget _successState(BuildContext context, Conversation conversation) { - return Container( - color: ParentTheme.of(context)?.nearSurfaceColor, - child: RefreshIndicator( - onRefresh: () { - setState(() { - _conversationFuture = _interactor.getConversation(widget.conversationId); - }); - return _conversationFuture.catchError((_) {}); - }, - child: ListView.separated( - padding: EdgeInsets.only(bottom: 84), // Bottom padding so FAB doesn't obscure messages - itemCount: conversation.messages?.length ?? 0, - separatorBuilder: (context, index) => SizedBox(height: 12), - itemBuilder: (context, index) { - var message = conversation.messages![index]; - return _message(context, conversation, message, index); - }, - ), - ), - ); - } - - Widget _message(BuildContext context, Conversation conversation, Message message, int index) { - return Semantics( - customSemanticsActions: { - CustomSemanticsAction(label: L10n(context).reply): () => _reply(context, conversation, message, false), - CustomSemanticsAction(label: L10n(context).replyAll): () => _reply(context, conversation, message, true), - }, - child: Slidable( - key: Key('message-${message.id}'), - endActionPane: ActionPane( - motion: const DrawerMotion(), - extentRatio: 0.5, - children: [ - SlidableAction( - label: L10n(context).replyAll, - backgroundColor: ParentTheme.of(context)?.isDarkMode == true ? ParentColors.tiara : ParentColors.oxford, - foregroundColor: ParentTheme.of(context)?.isDarkMode == true ? Colors.black : Colors.white, - icon: CanvasIconsSolid.reply_all_2, - onPressed: (context) => _reply(context, conversation, message, true), - ), - SlidableAction( - label: L10n(context).reply, - backgroundColor: Theme.of(context).colorScheme.secondary, - foregroundColor: ParentTheme.of(context)?.isDarkMode == true ? Colors.black : Colors.white, - icon: CanvasIconsSolid.reply, - onPressed: (context) => _reply(context, conversation, message, false), - ), - ], - ), - child: MessageWidget( - conversation: conversation, - message: message, - currentUserId: _interactor.getCurrentUserId(), - onAttachmentClicked: (attachment) { - _interactor.viewAttachment(context, attachment); - }, - key: ValueKey('conversation_message_index_$index'), - ), - ), - ); - } - - Future _reply(BuildContext context, Conversation? conversation, Message? message, bool replyAll) async { - var newConversation = await _interactor.addReply(context, conversation, message, replyAll); - if (newConversation != null) { - _hasBeenUpdated = true; - setState(() { - _conversationFuture = Future.value(newConversation); - }); - } - } -} diff --git a/apps/flutter_parent/lib/screens/inbox/conversation_details/message_widget.dart b/apps/flutter_parent/lib/screens/inbox/conversation_details/message_widget.dart deleted file mode 100644 index 329723032c..0000000000 --- a/apps/flutter_parent/lib/screens/inbox/conversation_details/message_widget.dart +++ /dev/null @@ -1,213 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:flutter/material.dart'; -import 'package:flutter_linkify/flutter_linkify.dart'; -import 'package:flutter_parent/l10n/app_localizations.dart'; -import 'package:flutter_parent/models/attachment.dart'; -import 'package:flutter_parent/models/basic_user.dart'; -import 'package:flutter_parent/models/conversation.dart'; -import 'package:flutter_parent/models/message.dart'; -import 'package:flutter_parent/utils/common_widgets/attachment_indicator_widget.dart'; -import 'package:flutter_parent/utils/common_widgets/avatar.dart'; -import 'package:flutter_parent/utils/common_widgets/user_name.dart'; -import 'package:flutter_parent/utils/core_extensions/date_time_extensions.dart'; -import 'package:flutter_parent/utils/design/parent_theme.dart'; -import 'package:flutter_parent/utils/quick_nav.dart'; -import 'package:flutter_parent/utils/service_locator.dart'; -import 'package:flutter_parent/utils/style_slicer.dart'; -import 'package:intl/intl.dart'; - -class MessageWidget extends StatefulWidget { - final Conversation? conversation; - final Message? message; - final String? currentUserId; - final Function(Attachment)? onAttachmentClicked; - - const MessageWidget({ - this.conversation, - required this.message, - required this.currentUserId, - this.onAttachmentClicked = null, - super.key, - }); - - @override - _MessageWidgetState createState() => _MessageWidgetState(); -} - -class _MessageWidgetState extends State { - bool _participantsExpanded = false; - - @override - Widget build(BuildContext context) { - var author = widget.conversation?.participants?.firstWhere( - (it) => it.id == widget.message?.authorId, - orElse: () => BasicUser((b) => b..name = L10n(context).unknownUser), - ); - var date = widget.message?.createdAt.l10nFormat(L10n(context).dateAtTime); - if (author == null || date == null) return Container(); - return Container( - padding: EdgeInsets.symmetric(vertical: 16), - color: Theme.of(context).scaffoldBackgroundColor, - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - _header(author, context, date), - Padding( - padding: EdgeInsets.symmetric(horizontal: 16), - child: Linkify( - text: widget.message?.body ?? '', - options: LinkifyOptions(humanize: false), - onOpen: (link) => locator().routeInternally(context, link.url), - ), - ), - _attachmentsWidget(context, widget.message) - ], - ), - ); - } - - Widget _header(BasicUser author, BuildContext context, String date) { - return Material( - key: Key('message-header'), - child: InkWell( - onTap: - widget.message?.participatingUserIds != null && widget.message!.participatingUserIds!.length > 1 // Only allow expansion if there are non-author participants - ? () => setState(() => _participantsExpanded = !_participantsExpanded) - : null, - child: Padding( - padding: EdgeInsets.symmetric(horizontal: 16), - child: Column( - children: [ - Row( - children: [ - Avatar(author.avatarUrl, name: author.name), - SizedBox(width: 12), - Expanded( - child: Column( - mainAxisSize: MainAxisSize.min, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - if (widget.message != null) _authorText(context, widget.conversation, widget.message!, author), - SizedBox(height: 2), - Text(date, key: Key('message-date'), style: Theme.of(context).textTheme.titleSmall), - ], - ), - ), - ], - ), - if (_participantsExpanded) _participants(author), - SizedBox(height: 16), - ], - ), - ), - ), - ); - } - - Widget _participants(BasicUser author) { - var participants = widget.message!.participatingUserIds! - .map((id) => widget.conversation?.participants!.firstWhere((it) => it.id == id)) - .toList() - ..retainWhere((it) => it?.id != author.id); - return Padding( - key: Key('participants'), - padding: const EdgeInsetsDirectional.only(top: 16, start: 52), - child: ListView.separated( - itemCount: participants.length, - shrinkWrap: true, - separatorBuilder: (context, index) => SizedBox(height: 8), - itemBuilder: (context, index) { - var user = participants[index]; - return Row( - children: [ - Avatar(user?.avatarUrl, name: user?.name ?? '', radius: 16), - SizedBox(width: 12), - Expanded( - child: Text(user?.name ?? '', - key: ValueKey('participant_id_${user?.id}'), - style: Theme.of(context).textTheme.titleMedium?.copyWith(fontSize: 14))) - ], - ); - }, - ), - ); - } - - Widget _authorText(BuildContext context, Conversation? conversation, Message message, BasicUser author) { - String authorInfo = ''; - List slicers = []; - Color? authorColor = ParentTheme.of(context)?.onSurfaceColor; - - if (message.authorId == widget.currentUserId) { - var authorName = toBeginningOfSentenceCase(L10n(context).userNameMe) ?? ''; - slicers.add(PatternSlice(authorName, style: TextStyle(color: authorColor), maxMatches: 1)); - if (message.participatingUserIds!.length == 2) { - var otherUser = conversation?.participants?.firstWhere( - (it) => it.id != message.authorId, - orElse: () => BasicUser((b) => b..name = L10n(context).unknownUser), - ); - var recipientName = UserName.fromBasicUser(otherUser!).text; - slicers.add(PronounSlice(otherUser.pronouns)); - authorInfo = L10n(context).authorToRecipient(authorName, recipientName); - } else if (message.participatingUserIds!.length > 2) { - authorInfo = L10n(context).authorToNOthers(authorName, message.participatingUserIds!.length - 1); - } else { - authorInfo = authorName; - } - } else { - // This is an 'incoming' message - String authorName = UserName.fromBasicUser(author).text; - slicers.add(PatternSlice(authorName, style: TextStyle(color: authorColor), maxMatches: 1)); - slicers.add(PronounSlice(author.pronouns)); - if (message.participatingUserIds!.length == 2) { - authorInfo = L10n(context).authorToRecipient(authorName, L10n(context).userNameMe); - } else if (message.participatingUserIds!.length > 2) { - authorInfo = L10n(context).authorToRecipientAndNOthers( - authorName, - L10n(context).userNameMe, - message.participatingUserIds!.length - 2, - ); - } else { - authorInfo == authorName; - } - } - - return Text.rich( - StyleSlicer.apply(authorInfo, slicers, baseStyle: Theme.of(context).textTheme.bodySmall), - key: Key('author-info'), - ); - } - - Widget _attachmentsWidget(BuildContext context, Message? message) { - List attachments = message?.attachments?.toList() ?? []; - if (message?.mediaComment != null) attachments.add(message!.mediaComment!.toAttachment()); - if (attachments.isEmpty) return Container(); - return Container( - height: 108, - padding: EdgeInsets.only(top: 12), - child: ListView.separated( - padding: EdgeInsets.symmetric(horizontal: 16), - key: Key('message_attachment_list'), - shrinkWrap: true, - itemCount: attachments.length, - scrollDirection: Axis.horizontal, - separatorBuilder: (context, index) => SizedBox(width: 12), - itemBuilder: (context, index) => - AttachmentIndicatorWidget(attachment: attachments[index], onAttachmentClicked: widget.onAttachmentClicked), - ), - ); - } -} diff --git a/apps/flutter_parent/lib/screens/inbox/conversation_list/conversation_list_interactor.dart b/apps/flutter_parent/lib/screens/inbox/conversation_list/conversation_list_interactor.dart deleted file mode 100644 index cc1b5a150c..0000000000 --- a/apps/flutter_parent/lib/screens/inbox/conversation_list/conversation_list_interactor.dart +++ /dev/null @@ -1,84 +0,0 @@ -// Copyright (C) 2019 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:collection/collection.dart'; -import 'package:flutter_parent/models/conversation.dart'; -import 'package:flutter_parent/models/course.dart'; -import 'package:flutter_parent/models/enrollment.dart'; -import 'package:flutter_parent/models/user.dart'; -import 'package:flutter_parent/network/api/course_api.dart'; -import 'package:flutter_parent/network/api/enrollments_api.dart'; -import 'package:flutter_parent/network/api/inbox_api.dart'; -import 'package:flutter_parent/utils/core_extensions/list_extensions.dart'; -import 'package:flutter_parent/utils/service_locator.dart'; -import 'package:tuple/tuple.dart'; - -class ConversationListInteractor { - Future> getConversations({bool forceRefresh = false}) async { - var api = locator(); - try { - // Get messages from both 'normal' scope 'sent' scopes - var results = (await Future.wait([ - api.getConversations(forceRefresh: forceRefresh), - api.getConversations(scope: 'sent', forceRefresh: forceRefresh) - ])).nonNulls.toList(); - - // Remove messages in the 'sent' scope that also exist in the normal scope - results[1].retainWhere((sent) => !results[0].any((it) => it.id == sent.id)); - - // Combine results - var conversations = results.expand((it) => it).toList(); - - // Sort by date (descending) - conversations.sort((a, b) { - var dateA = a.lastMessageAt ?? a.lastAuthoredMessageAt ?? DateTime.now(); - var dateB = b.lastMessageAt ?? b.lastAuthoredMessageAt ?? DateTime.now(); - return dateB.compareTo(dateA); - }); - return Future.value(conversations); - } catch (e) { - return Future.error(e); - } - } - - Future?> getCoursesForCompose() async { - return locator().getObserveeCourses(); - } - - Future?> getStudentEnrollments() async { - return locator().getObserveeEnrollments(); - } - - /// Create a List, where each tuple is ( : ), this tuple is then sorted by user name and also sorted by the students courses - List> combineEnrollmentsAndCourses(List courses, List enrollments) { - // Create tuple list - // Remove enrollments where the user is not observing anyone - enrollments.retainWhere((e) => e.observedUser != null); - List> thing = enrollments - .map((e) { - final course = courses.firstWhereOrNull((c) => c.id == e.courseId); - if (course == null) return null; - return Tuple2(e.observedUser!, course); - }) - .nonNulls - .toList(); - - // Sort users in alphabetical order and sort their courses alphabetically - thing.sortBySelector( - [(it) => it?.item1.shortName, (it) => it?.item2.name], - ); - - return thing; - } -} diff --git a/apps/flutter_parent/lib/screens/inbox/conversation_list/conversation_list_screen.dart b/apps/flutter_parent/lib/screens/inbox/conversation_list/conversation_list_screen.dart deleted file mode 100644 index 85cb5c8b13..0000000000 --- a/apps/flutter_parent/lib/screens/inbox/conversation_list/conversation_list_screen.dart +++ /dev/null @@ -1,336 +0,0 @@ -// Copyright (C) 2019 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:flutter/material.dart'; -import 'package:flutter_parent/l10n/app_localizations.dart'; -import 'package:flutter_parent/models/conversation.dart'; -import 'package:flutter_parent/models/course.dart'; -import 'package:flutter_parent/models/enrollment.dart'; -import 'package:flutter_parent/models/user.dart'; -import 'package:flutter_parent/network/utils/api_prefs.dart'; -import 'package:flutter_parent/screens/inbox/conversation_details/conversation_details_screen.dart'; -import 'package:flutter_parent/screens/inbox/create_conversation/create_conversation_screen.dart'; -import 'package:flutter_parent/utils/common_widgets/avatar.dart'; -import 'package:flutter_parent/utils/common_widgets/badges.dart'; -import 'package:flutter_parent/utils/common_widgets/empty_panda_widget.dart'; -import 'package:flutter_parent/utils/common_widgets/error_panda_widget.dart'; -import 'package:flutter_parent/utils/common_widgets/loading_indicator.dart'; -import 'package:flutter_parent/utils/core_extensions/date_time_extensions.dart'; -import 'package:flutter_parent/utils/design/canvas_icons.dart'; -import 'package:flutter_parent/utils/design/canvas_icons_solid.dart'; -import 'package:flutter_parent/utils/design/parent_colors.dart'; -import 'package:flutter_parent/utils/design/parent_theme.dart'; -import 'package:flutter_parent/utils/quick_nav.dart'; -import 'package:flutter_parent/utils/service_locator.dart'; -import 'package:intl/intl.dart'; -import 'package:tuple/tuple.dart'; - -import 'conversation_list_interactor.dart'; - -class ConversationListScreen extends StatefulWidget { - @override - State createState() { - return ConversationListState(); - } -} - -class ConversationListState extends State { - late Future> _conversationsFuture; - final GlobalKey _refreshIndicatorKey = new GlobalKey(); - - ConversationListInteractor interactor = locator(); - - @override - void initState() { - super.initState(); - _conversationsFuture = interactor.getConversations(); - } - - @override - Widget build(BuildContext context) { - return DefaultParentTheme( - builder: (context) => Scaffold( - appBar: AppBar( - title: Text(L10n(context).inbox), - bottom: ParentTheme.of(context)?.appBarDivider(shadowInLightMode: false), - ), - body: FutureBuilder( - future: _conversationsFuture, - builder: (BuildContext context, AsyncSnapshot> snapshot) { - Widget body; - if (snapshot.hasError) { - body = _errorState(context); - } else if (snapshot.hasData) { - if (snapshot.data!.isNotEmpty) { - body = _successState(context, snapshot.data!); - } else { - body = _emptyState(context); - } - } else { - body = _loadingState(context); - } - return RefreshIndicator( - key: _refreshIndicatorKey, - child: body, - onRefresh: () { - setState(() { - _conversationsFuture = interactor.getConversations(forceRefresh: true); - }); - return _conversationsFuture; - }, - ); - }, - ), - floatingActionButton: FloatingActionButton( - tooltip: L10n(context).newMessageTitle, - child: Padding( - padding: const EdgeInsets.only(left: 4, top: 4), - child: Icon(CanvasIconsSolid.comment), - ), - onPressed: () => _createMessage(context), - ), - ), - ); - } - - Widget _errorState(BuildContext context) { - return ErrorPandaWidget(L10n(context).errorLoadingMessages, () { - _refreshIndicatorKey.currentState?.show(); - }); - } - - Widget _loadingState(BuildContext context) => LoadingIndicator(); - - Widget _successState(BuildContext context, List data) { - return ListView.builder( - padding: EdgeInsets.symmetric(vertical: 8), - itemCount: data.length, - itemBuilder: (context, index) { - var item = data[index]; - final tile = ListTile( - contentPadding: EdgeInsets.fromLTRB(8, 8, 16, 8), - leading: _avatar(context, item), - title: Row( - textBaseline: TextBaseline.alphabetic, - mainAxisAlignment: MainAxisAlignment.spaceBetween, - crossAxisAlignment: CrossAxisAlignment.baseline, - children: [ - Flexible( - child: Padding( - padding: const EdgeInsets.only(right: 8.0), - child: Text( - item.subject.isEmpty ? L10n(context).noSubject : item.subject, - overflow: TextOverflow.ellipsis, - style: TextStyle(fontWeight: FontWeight.w500), - key: ValueKey('conversation_subject_$index'), - ), - ), - ), - Text( - _formatMessageDate(item.lastMessageAt ?? item.lastAuthoredMessageAt), - style: Theme.of(context).textTheme.bodySmall, - ), - ], - ), - subtitle: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - SizedBox(height: 2), - if (item.contextName?.isNotEmpty == true) - Text( - item.contextName!, - style: TextStyle(fontWeight: FontWeight.w500), - key: ValueKey('conversation_context_$index'), - ), - SizedBox(height: 4), - Text( - item.lastMessage ?? item.lastAuthoredMessage ?? '', - style: Theme.of(context).textTheme.bodyMedium, - maxLines: 2, - key: ValueKey('conversation_message_$index'), - ), - ], - ), - onTap: () async { - var refresh = await locator().push( - context, - ConversationDetailsScreen( - conversationId: item.id, - conversationSubject: item.subject, - courseName: item.contextName, - ), - ); - if (refresh == true || item.isUnread()) _refreshIndicatorKey.currentState?.show(); - }, - ); - return item.isUnread() ? WidgetBadge(tile) : tile; - }, - ); - } - - Widget _emptyState(BuildContext context) { - return EmptyPandaWidget( - svgPath: 'assets/svg/panda-inbox-zero.svg', - title: L10n(context).emptyInboxTitle, - subtitle: L10n(context).emptyInboxSubtitle, - ); - } - - String _formatMessageDate(DateTime? date) { - if (date == null) return ''; - date = date.toLocal(); - var format = DateFormat.MMM(supportedDateLocale).add_d(); - var now = DateTime.now(); - if (date.year != now.year) { - format = format.add_y(); - } else if (date.month == now.month && date.day == now.day) { - format = DateFormat.jm(supportedDateLocale); - } - return format.format(date); - } - - Widget _avatar(BuildContext context, Conversation conversation) { - Widget avatar; - - var users = conversation.participants?.toList() ?? []; - users.retainWhere((user) => conversation.audience?.contains(user.id) == true); - - if (users.length == 2) { - avatar = SizedBox( - width: 40, - height: 40, - child: Stack( - children: [ - Avatar(users[0].avatarUrl, name: users[0].name, radius: 12), - Positioned( - bottom: 0, - right: 0, - child: CircleAvatar( - radius: 14, - backgroundColor: Theme.of(context).scaffoldBackgroundColor, - child: Avatar(users[1].avatarUrl, name: users[1].name, radius: 12), - ), - ) - ], - ), - ); - } else if (users.length > 2) { - avatar = Avatar(null, showInitials: false, overlay: Icon(CanvasIcons.group)); - } else { - avatar = Avatar(conversation.avatarUrl); - } - - avatar = Container( - width: 48, - alignment: Alignment.topRight, - child: avatar, - ); - - return avatar; - } - - _createMessage(BuildContext context) { - var coursesFuture = interactor.getCoursesForCompose(); - var studentsFuture = interactor.getStudentEnrollments(); - showModalBottomSheet( - context: context, - builder: (context) { - return FutureBuilder( - future: Future.wait([coursesFuture, studentsFuture]) - .then((response) => _CoursesAndStudents(response[0] as List, response[1] as List)), - builder: (BuildContext context, AsyncSnapshot<_CoursesAndStudents> snapshot) { - if (snapshot.hasError) { - return Padding( - padding: const EdgeInsets.all(16.0), - child: Row( - children: [ - Icon( - CanvasIcons.warning, - color: ParentColors.failure, - ), - SizedBox(width: 12), - Expanded( - child: Text(L10n(context).errorFetchingCourses), - ), - ], - ), - ); - } else if (snapshot.hasData) { - return ListView( - padding: EdgeInsets.symmetric(vertical: 8), - shrinkWrap: true, - children: [ - Padding( - padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 12), - child: Text( - L10n(context).messageChooseCourse, - style: Theme.of(context).textTheme.bodySmall, - ), - ), - ..._courseList(snapshot.data!), - ], - ); - } else { - return Container( - height: 120, - child: LoadingIndicator(), - ); - } - }, - ); - }, - ); - } - - List _courseList(_CoursesAndStudents coursesAndStudents) { - List> _combined = - interactor.combineEnrollmentsAndCourses(coursesAndStudents.courses, coursesAndStudents.enrollments); - - List widgets = []; - - _combined.forEach((t) { - User user = t.item1; - Course course = t.item2; - var w = ListTile( - title: Text(course.name, key: ValueKey('course_list_course_${course.id}')), - subtitle: Text(L10n(context).courseForWhom(user.shortName!)), - onTap: () async { - String postscript = L10n(context).messageLinkPostscript( - user.shortName!, - '${ApiPrefs.getDomain()}/courses/${course.id}', - ); - Navigator.pop(context); // Dismisses the bottom sheet - var refresh = await locator().push( - context, - CreateConversationScreen( - course.id, - user.id, - course.name, - postscript, - )); - if (refresh == true) _refreshIndicatorKey.currentState?.show(); - }, - ); - widgets.add(w); - }); - return widgets; - } -} - -// Helper class for combining two futures for use in a FutureBuilder -class _CoursesAndStudents { - _CoursesAndStudents(this.courses, this.enrollments); - List courses; - List enrollments; -} diff --git a/apps/flutter_parent/lib/screens/inbox/create_conversation/create_conversation_interactor.dart b/apps/flutter_parent/lib/screens/inbox/create_conversation/create_conversation_interactor.dart deleted file mode 100644 index 1a3278d89e..0000000000 --- a/apps/flutter_parent/lib/screens/inbox/create_conversation/create_conversation_interactor.dart +++ /dev/null @@ -1,70 +0,0 @@ -// Copyright (C) 2019 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:flutter/widgets.dart'; -import 'package:flutter_parent/models/conversation.dart'; -import 'package:flutter_parent/models/course.dart'; -import 'package:flutter_parent/models/recipient.dart'; -import 'package:flutter_parent/network/api/course_api.dart'; -import 'package:flutter_parent/network/api/inbox_api.dart'; -import 'package:flutter_parent/network/utils/api_prefs.dart'; -import 'package:flutter_parent/screens/inbox/attachment_utils/attachment_handler.dart'; -import 'package:flutter_parent/utils/service_locator.dart'; - -import '../attachment_utils/attachment_picker.dart'; - -class CreateConversationInteractor { - Future loadData(String courseId, String? studentId) async { - final courseFuture = locator().getCourse(courseId); - final recipientFuture = locator().getRecipients(courseId); - final permissionsFuture = locator().getCoursePermissions(courseId); - - final permissions = await permissionsFuture; - final recipients = await recipientFuture; - final userId = ApiPrefs.getUser()?.id; - - recipients?.retainWhere((recipient) { - // Allow self and specified student as recipients if the sendMessages permission is granted - if (permissions?.sendMessages == true && (recipient.id == studentId || recipient.id == userId)) return true; - - // Always allow instructors (teachers and TAs) as recipients - var enrollments = recipient.commonCourses?[courseId]; - if (enrollments == null) return false; - return enrollments.contains('TeacherEnrollment') || enrollments.contains('TaEnrollment'); - }); - - return CreateConversationData(await courseFuture, recipients); - } - - Future createConversation( - String courseId, - List recipientIds, - String subject, - String body, - List attachmentIds, - ) { - return locator().createConversation(courseId, recipientIds, subject, body, attachmentIds); - } - - FutureaddAttachment(BuildContext context) async { - return AttachmentPicker.asBottomSheet(context); - } -} - -class CreateConversationData { - final Course? course; - final List? recipients; - - CreateConversationData(this.course, this.recipients); -} diff --git a/apps/flutter_parent/lib/screens/inbox/create_conversation/create_conversation_screen.dart b/apps/flutter_parent/lib/screens/inbox/create_conversation/create_conversation_screen.dart deleted file mode 100644 index 0ca0ffe4dc..0000000000 --- a/apps/flutter_parent/lib/screens/inbox/create_conversation/create_conversation_screen.dart +++ /dev/null @@ -1,726 +0,0 @@ -// Copyright (C) 2019 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:flutter/material.dart'; -import 'package:flutter/rendering.dart'; -import 'package:flutter/services.dart'; -import 'package:flutter_parent/l10n/app_localizations.dart'; -import 'package:flutter_parent/models/course.dart'; -import 'package:flutter_parent/models/recipient.dart'; -import 'package:flutter_parent/screens/inbox/attachment_utils/attachment_extensions.dart'; -import 'package:flutter_parent/screens/inbox/attachment_utils/attachment_handler.dart'; -import 'package:flutter_parent/utils/common_widgets/arrow_aware_focus_scope.dart'; -import 'package:flutter_parent/utils/common_widgets/avatar.dart'; -import 'package:flutter_parent/utils/common_widgets/loading_indicator.dart'; -import 'package:flutter_parent/utils/common_widgets/user_name.dart'; -import 'package:flutter_parent/utils/design/canvas_icons.dart'; -import 'package:flutter_parent/utils/design/parent_colors.dart'; -import 'package:flutter_parent/utils/design/parent_theme.dart'; -import 'package:flutter_parent/utils/service_locator.dart'; -import 'package:intl/intl.dart'; -import 'package:provider/provider.dart'; -import 'package:transparent_image/transparent_image.dart'; - -import 'create_conversation_interactor.dart'; - -class CreateConversationScreen extends StatefulWidget { - CreateConversationScreen( - this.courseId, - this.studentId, - this.subjectTemplate, - this.postscript, - ); - - final String courseId; - final String? studentId; - final String subjectTemplate; - final String? postscript; - - static final sendKey = Key('sendButton'); - static final attachmentKey = Key('attachmentButton'); - static final messageKey = Key('messageText'); - static final subjectKey = Key('subjectText'); - static final recipientsKey = Key('participantsContainer'); - static final recipientsAddKey = Key('participantsAddButton'); - - @override - _CreateConversationScreenState createState() => _CreateConversationScreenState(subjectTemplate); -} - -class _CreateConversationScreenState extends State with SingleTickerProviderStateMixin { - _CreateConversationScreenState(this._subjectText); - - String _subjectText = ''; - String _bodyText = ''; - - late TextEditingController _subjectController; - TextEditingController _bodyController = TextEditingController(); - - List _allRecipients = []; - List _selectedRecipients = []; - List _attachments = []; - Course? course; - - bool _loading = false; - bool _error = false; - bool _sending = false; - bool _recipientsExpanded = false; - - CreateConversationInteractor _interactor = locator(); - - // Focus nodes to aid us in supporting dpad navigation through TextFields. - FocusScopeNode _focusScopeNode = FocusScopeNode(); - - final _scaffoldKey = GlobalKey(); - - bool _canSend() => - _selectedRecipients.isNotEmpty && - _subjectText.isNotEmpty && - _bodyText.isNotEmpty && - !_sending && - _attachments.every((it) => it.stage == AttachmentUploadStage.FINISHED); - - @override - void initState() { - _setupTextControllers(); - _loadRecipients(); - super.initState(); - } - - // Make sure that we dispose of our focus-related nodes when we dispose this widget. - @override - void dispose() { - _focusScopeNode.dispose(); - super.dispose(); - } - - _setupTextControllers() { - _subjectController = TextEditingController(text: _subjectText); - _subjectController.addListener(() { - setState(() => _subjectText = _subjectController.text); - }); - _bodyController.addListener(() { - setState(() => _bodyText = _bodyController.text); - }); - } - - _loadRecipients() { - setState(() { - _loading = true; - _error = false; - }); - _interactor.loadData(widget.courseId, widget.studentId).then((data) { - course = data.course; - _allRecipients = data.recipients ?? []; - String courseId = widget.courseId; - _selectedRecipients = - _allRecipients.where((it) => it.commonCourses?[courseId]?.contains('TeacherEnrollment') == true).toList(); - setState(() { - _loading = false; - }); - }).catchError((error) { - print(error); - setState(() { - _loading = false; - _error = true; - }); - }); - } - - _send() async { - setState(() => _sending = true); - try { - var recipientIds = _selectedRecipients.map((it) => it.id).toList(); - var attachmentIds = _attachments.map((it) => it.attachment!.id).toList(); - if (widget.postscript != null) { - _bodyText += '\n\n${widget.postscript}'; - } - await _interactor.createConversation(widget.courseId, recipientIds, _subjectText, _bodyText, attachmentIds); - Navigator.of(context).pop(true); // 'true' indicates upload was successful - ScaffoldMessenger.of(context) - .showSnackBar(SnackBar(content: Text(L10n(context).messageSent))); - } catch (e) { - setState(() => _sending = false); - ScaffoldMessenger.of(context).showSnackBar( - SnackBar(content: Text(L10n(context).errorSendingMessage)), - ); - } - } - - Future _onWillPop(BuildContext context) async { - if (_sending) return Future.value(false); - if (_bodyText.isEmpty && _attachments.isEmpty) return Future.value(true); - return await showDialog( - context: context, - builder: (Bucontext) => new AlertDialog( - title: new Text(L10n(context).unsavedChangesDialogTitle), - content: new Text(L10n(context).unsavedChangesDialogBody), - actions: [ - new TextButton( - onPressed: () => Navigator.of(context).pop(false), - child: new Text(L10n(context).no), - ), - new TextButton( - onPressed: () { - _attachments.forEach((it) => it.deleteAttachment()); - Navigator.of(context).pop(true); - }, - child: new Text(L10n(context).yes), - ), - ], - ), - ) ?? - false; - } - - @override - Widget build(BuildContext context) { - return DefaultParentTheme( - builder: (context) => WillPopScope( - onWillPop: () => _onWillPop(context), - child: ArrowAwareFocusScope( - node: _focusScopeNode, - child: Scaffold( - key: _scaffoldKey, - appBar: _appBar(context), - body: _content(context), - ), - ), - ), - ); - } - - AppBar _appBar(BuildContext context) { - return AppBar( - bottom: ParentTheme.of(context)?.appBarDivider(shadowInLightMode: false), - title: Column( - crossAxisAlignment: CrossAxisAlignment.start, - mainAxisSize: MainAxisSize.min, - children: [ - Text(L10n(context).newMessageTitle), - Text(course?.courseCode ?? '', style: Theme.of(context).textTheme.bodySmall), - ], - ), - actions: [ - if (_sending) - Center( - child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 16), - child: Container( - width: 24, - height: 24, - child: CircularProgressIndicator( - strokeWidth: 3, - ), - ), - ), - ), - if (!_sending && !_error && !_loading) - IconButton( - tooltip: L10n(context).addAttachment, - key: CreateConversationScreen.attachmentKey, - icon: Icon(CanvasIcons.paperclip), - onPressed: _sending - ? null - : () { - _interactor.addAttachment(context).then((attachment) { - if (attachment != null) { - attachment.onStageChange = (_) { - setState(() {}); - }; - attachment.performUpload(); - setState(() => _attachments.add(attachment)); - } - }); - }, - ), - if (!_sending && !_error && !_loading) - IconButton( - tooltip: L10n(context).sendMessage, - key: CreateConversationScreen.sendKey, - icon: Icon(Icons.send), - color: Theme.of(context).colorScheme.secondary, - disabledColor: Theme.of(context).iconTheme.color?.withOpacity(0.25), - onPressed: _canSend() ? _send : null, - ) - ], - ); - } - - Widget _content(BuildContext context) { - if (_error) return _errorState(context); - if (_loading) return LoadingIndicator(); - return SingleChildScrollView( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - _recipientsWidget(context), - Divider(height: 1), - _subjectWidget(context), - Divider(height: 1), - _messageWidget(context), - _attachmentsWidget(context), - ], - ), - ); - } - - Widget _attachmentsWidget(BuildContext context) { - if (_attachments.isEmpty) return Container(); - return IgnorePointer( - ignoring: _sending, - child: Container( - height: 104, - padding: EdgeInsets.symmetric(vertical: 4), - child: ListView.separated( - shrinkWrap: true, - itemCount: _attachments.length, - padding: const EdgeInsets.symmetric(horizontal: 16), - scrollDirection: Axis.horizontal, - separatorBuilder: (context, index) => SizedBox(width: 12), - itemBuilder: (context, index) { - var handler = _attachments[index]; - return ChangeNotifierProvider.value( - value: handler, - child: AttachmentWidget( - onDelete: (handler) { - setState(() { - _attachments.remove(handler); - }); - }, - ), - ); - }, - ), - ), - ); - } - - Widget _errorState(BuildContext context) { - return LayoutBuilder( - builder: (context, constraints) { - return SingleChildScrollView( - physics: AlwaysScrollableScrollPhysics(), - child: Container( - height: constraints.maxHeight, - child: Padding( - padding: const EdgeInsets.all(8.0), - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Icon(CanvasIcons.warning, size: 40, color: ParentColors.failure), - Padding( - padding: const EdgeInsets.fromLTRB(48, 28, 48, 32), - child: Text( - L10n(context).errorLoadingRecipients, - textAlign: TextAlign.center, - style: Theme.of(context).textTheme.bodySmall?.copyWith(fontSize: 16), - ), - ), - TextButton( - onPressed: _loadRecipients, - child: Text( - L10n(context).retry, - style: Theme.of(context).textTheme.bodySmall?.copyWith(fontSize: 16), - ), - style: TextButton.styleFrom( - shape: RoundedRectangleBorder( - borderRadius: new BorderRadius.circular(24.0), - side: BorderSide(color: ParentColors.tiara), - ), - ), - ), - ], - ), - ), - ), - ); - }, - ); - } - - Widget _recipientsWidget(BuildContext context) { - return AnimatedSize( - alignment: Alignment.topLeft, - curve: Curves.easeInOutBack, - duration: Duration(milliseconds: 350), - child: Row( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Expanded( - child: Semantics( - label: L10n(context).recipients, - child: InkWell( - onTap: () => setState(() => _recipientsExpanded = !_recipientsExpanded), - child: Padding( - padding: const EdgeInsets.fromLTRB(16, 8, 8, 8), - child: Wrap( - crossAxisAlignment: WrapCrossAlignment.center, - key: CreateConversationScreen.recipientsKey, - spacing: 8, - runSpacing: 8, - children: _recipientChips(context), - ), - ), - ), - ), - ), - IconButton( - padding: EdgeInsets.all(16), - tooltip: L10n(context).selectRecipients, - key: CreateConversationScreen.recipientsAddKey, - icon: Icon( - CanvasIcons.address_book, - size: 20, - color: Theme.of(context).hintColor, - ), - onPressed: _sending ? null : () => _showRecipientPicker(context), - ) - ], - ), - ); - } - - List _recipientChips(BuildContext context) { - if (_selectedRecipients.isEmpty) - return [ - Chip( - label: Text(L10n(context).noRecipientsSelected), - backgroundColor: ParentTheme.of(context)?.nearSurfaceColor, - avatar: Icon( - CanvasIcons.warning, - color: Colors.redAccent, - size: 16, - ), - ) - ]; - if (_recipientsExpanded) { - return _selectedRecipients.map((user) => _chip(user)).toList(); - } else { - return [ - _chip(_selectedRecipients[0], ellipsize: true), - if (_selectedRecipients.length > 1) - Text( - L10n(context).plusRecipientCount(_selectedRecipients.length - 1), - style: TextStyle(fontWeight: FontWeight.w500), - ) - ]; - } - } - - Widget _chip(Recipient user, {bool ellipsize = false}) { - return Chip( - materialTapTargetSize: MaterialTapTargetSize.shrinkWrap, - key: ValueKey("user_chip_${user.id}"), - //labelPadding: EdgeInsets.zero, - label: Padding( - padding: const EdgeInsets.only(top: 2, bottom: 1), - child: ConstrainedBox( - constraints: BoxConstraints(maxWidth: ellipsize ? 180 : double.infinity), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - UserName( - user.name, - user.pronouns, - overflow: ellipsize ? TextOverflow.ellipsis : null, - style: TextStyle(fontWeight: FontWeight.w500), - ), - SizedBox(height: 1), - Text( - _enrollmentType(context, user), - style: TextStyle(fontWeight: FontWeight.w500, fontSize: 10), - ) - ], - ), - ), - ), - avatar: Avatar(user.avatarUrl, name: user.name), - backgroundColor: ParentTheme.of(context)?.nearSurfaceColor, - ); - } - - Widget _subjectWidget(BuildContext context) { - return Semantics( - label: L10n(context).messageSubjectInputHint, - focusable: true, - child: TextField( - key: CreateConversationScreen.subjectKey, - controller: _subjectController, - enabled: !_sending, - style: Theme.of(context).textTheme.bodyLarge, - textCapitalization: TextCapitalization.sentences, - decoration: InputDecoration( - labelText: L10n(context).messageSubjectInputHint, - contentPadding: EdgeInsets.all(16), - border: InputBorder.none, - ), - ), - ); - } - - Widget _messageWidget(BuildContext context) { - return Semantics( - label: L10n(context).messageBodyInputHint, - focusable: true, - child: TextField( - key: CreateConversationScreen.messageKey, - controller: _bodyController, - enabled: !_sending, - textCapitalization: TextCapitalization.sentences, - maxLines: null, - // style: Theme.of(context).textTheme.bodyMedium, - decoration: InputDecoration( - labelText: L10n(context).messageBodyInputHint, - contentPadding: EdgeInsets.all(16), - border: InputBorder.none, - ), - ), - ); - } - - _showRecipientPicker(BuildContext context) async { - await showModalBottomSheet( - context: context, - builder: (context) { - return StatefulBuilder(builder: (context, setState) { - return Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Padding( - padding: const EdgeInsets.fromLTRB(16, 24, 16, 8), - child: Text( - L10n(context).recipients, - style: Theme.of(context).textTheme.titleLarge, - ), - ), - Expanded( - child: ListTileTheme( - child: ListView.builder( - itemCount: _allRecipients.length, - itemBuilder: (context, index) { - final user = _allRecipients[index]; - final selected = _selectedRecipients.contains(user); - return ListTile( - selected: selected, - title: UserName.fromRecipient(user), - subtitle: Text(_enrollmentType(context, user)), - leading: Avatar( - user.avatarUrl, - name: user.name, - overlay: selected - ? Container( - color: Theme.of(context).colorScheme.secondary.withOpacity(0.8), - child: Icon(Icons.check, color: Colors.white), - ) - : null, - ), - onTap: () { - if (_selectedRecipients.contains(user)) { - _selectedRecipients.remove(user); - } else { - _selectedRecipients.add(user); - } - setState(() {}); - }, - ); - }, - ), - ), - ), - ], - ); - }); - }, - ); - setState(() {}); // Update page with selected recipients - } - - String _enrollmentType(BuildContext context, Recipient user) { - var type = user.commonCourses?[widget.courseId]?.first; - switch (type) { - case 'TeacherEnrollment': - return L10n(context).enrollmentTypeTeacher; - case 'TaEnrollment': - return L10n(context).enrollmentTypeTA; - case 'StudentEnrollment': - return L10n(context).enrollmentTypeStudent; - case 'ObserverEnrollment': - return L10n(context).enrollmentTypeObserver; - default: - return ''; - } - } -} - -class AttachmentWidget extends StatelessWidget { - AttachmentWidget({this.onDelete, super.key}); - - final Function(AttachmentHandler)? onDelete; - - @override - Widget build(BuildContext context) { - AttachmentHandler handler = Provider.of(context); - Widget child; - switch (handler.stage) { - case AttachmentUploadStage.CREATED: - case AttachmentUploadStage.UPLOADING: - child = _uploadingWidget(context, handler); - break; - case AttachmentUploadStage.FAILED: - child = _failedWidget(context, handler); - break; - case AttachmentUploadStage.FINISHED: - child = _finishedWidget(context, handler); - break; - } - return Container( - width: 112, - height: 96, - child: Stack( - alignment: Alignment.center, - children: [ - Container( - decoration: BoxDecoration( - border: Border.all(color: ParentColors.tiara, width: 0.5), - borderRadius: BorderRadius.all(Radius.circular(4)), - ), - ), - child, - ], - ), - ); - } - - _uploadingWidget(BuildContext context, AttachmentHandler handler) { - return Tooltip( - message: handler.displayName, - child: Stack( - alignment: Alignment.center, - children: [ - SizedBox( - width: 48, - height: 48, - child: CircularProgressIndicator( - value: handler.progress, - backgroundColor: ParentTheme.of(context)?.nearSurfaceColor, - ), - ), - Text( - handler.progress == null ? '' : NumberFormat.percentPattern().format(handler.progress), - style: Theme.of(context).textTheme.bodySmall, - ) - ], - ), - ); - } - - _failedWidget(BuildContext context, AttachmentHandler handler) { - return PopupMenuButton( - tooltip: handler.displayName, - onSelected: (option) => _handleMenuOption(option, handler), - itemBuilder: (context) => [ - PopupMenuItem( - value: 'retry', - child: Text(L10n(context).retry), - ), - PopupMenuItem( - value: 'delete', - child: Text(L10n(context).delete), - ), - ], - child: Align( - alignment: Alignment.center, - child: ListView( - children: [ - SizedBox(height: 6), - Icon( - CanvasIcons.warning, - size: 27, - color: Colors.red, - ), - SizedBox(height: 15), - Text( - L10n(context).attachmentFailed, - textAlign: TextAlign.center, - style: TextStyle(fontSize: 12), - ), - ], - ), - ), - ); - } - - _finishedWidget(BuildContext context, AttachmentHandler handler) { - return PopupMenuButton( - tooltip: handler.displayName, - onSelected: (option) => _handleMenuOption(option, handler), - itemBuilder: (context) => [ - PopupMenuItem( - value: 'delete', - child: Text(L10n(context).delete), - ), - ], - child: Stack( - fit: StackFit.expand, - children: [ - Column( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Icon( - handler.attachment?.getIcon(), - color: Theme.of(context).colorScheme.secondary, - ), - Padding( - padding: const EdgeInsets.fromLTRB(12, 11, 12, 0), - child: Text( - handler.attachment?.displayName ?? '', - maxLines: 2, - overflow: TextOverflow.ellipsis, - textAlign: TextAlign.center, - style: TextStyle(fontSize: 12, fontWeight: FontWeight.w500), - ), - ) - ], - ), - if (handler.attachment?.thumbnailUrl != null && handler.attachment?.thumbnailUrl?.isNotEmpty == true) - ClipRRect( - borderRadius: new BorderRadius.circular(4), - child: FadeInImage.memoryNetwork( - fadeInDuration: const Duration(milliseconds: 300), - fit: BoxFit.cover, - image: handler.attachment!.thumbnailUrl!, - placeholder: kTransparentImage, - ), - ), - ], - ), - ); - } - - void _handleMenuOption(String option, AttachmentHandler handler) async { - /* Wait for PopupMenuButton to finish animating closed, otherwise a change in the widget tree could deactivate - the widget's ancestor and cause ErrorWidget to briefly flicker on screen */ - await Future.delayed(Duration(milliseconds: 150)); - switch (option) { - case 'delete': - handler.deleteAttachment(); - if (onDelete != null) onDelete!(handler); - break; - case 'retry': - handler.performUpload(); - break; - } - } -} diff --git a/apps/flutter_parent/lib/screens/inbox/reply/conversation_reply_interactor.dart b/apps/flutter_parent/lib/screens/inbox/reply/conversation_reply_interactor.dart deleted file mode 100644 index a5e23d76de..0000000000 --- a/apps/flutter_parent/lib/screens/inbox/reply/conversation_reply_interactor.dart +++ /dev/null @@ -1,84 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:flutter/widgets.dart'; -import 'package:flutter_parent/models/conversation.dart'; -import 'package:flutter_parent/models/message.dart'; -import 'package:flutter_parent/network/api/course_api.dart'; -import 'package:flutter_parent/network/api/enrollments_api.dart'; -import 'package:flutter_parent/network/api/inbox_api.dart'; -import 'package:flutter_parent/network/utils/api_prefs.dart'; -import 'package:flutter_parent/screens/inbox/attachment_utils/attachment_handler.dart'; -import 'package:flutter_parent/utils/service_locator.dart'; - -import '../attachment_utils/attachment_picker.dart'; - -class ConversationReplyInteractor { - Future createReply( - Conversation? conversation, - Message? message, - String body, - List attachmentIds, - bool replyAll, - ) async { - Message replyMessage = message ?? conversation!.messages![0]; - List includedMessageIds = [if (message != null || !replyAll) replyMessage.id]; - List recipientIds = []; - - if (!replyAll) { - if (replyMessage.authorId == getCurrentUserId()) { - recipientIds = replyMessage.participatingUserIds!.toList(); - } else { - recipientIds = [replyMessage.authorId]; - } - } else { - // We need to make sure the recipients list doesn't contain any off limit users, such as non-observed students. - final courseId = conversation?.getContextId(); - final userId = ApiPrefs.getUser()?.id; - final enrollments = await locator().getObserveeEnrollments(); - final observeeIds = enrollments - ?.map((enrollment) => enrollment.observedUser) - .where((student) => student != null) - .toSet() - .map((student) => student!.id); - final permissions = await locator().getCoursePermissions(courseId!); - final recipients = await locator().getRecipients(courseId); - recipients?.retainWhere((recipient) { - // Allow self and any observed students as recipients if the sendMessages permission is granted - if (permissions?.sendMessages == true && (observeeIds?.contains(recipient.id) == true || recipient.id == userId)) - return true; - - // Always allow instructors (teachers and TAs) as recipients - var enrollments = recipient.commonCourses![courseId]; - if (enrollments == null) return false; - return enrollments.contains('TeacherEnrollment') || enrollments.contains('TaEnrollment'); - }); - - final filteredRecipientIds = recipients?.map((recipient) => recipient.id); - - recipientIds = replyMessage.participatingUserIds! - .toList() - .where((participantId) => filteredRecipientIds?.contains(participantId) == true) - .toList(); - } - - return locator().addMessage(conversation?.id, body, recipientIds, attachmentIds, includedMessageIds); - } - - Future addAttachment(BuildContext context) async { - return AttachmentPicker.asBottomSheet(context); - } - - String getCurrentUserId() => ApiPrefs.getUser()!.id; -} diff --git a/apps/flutter_parent/lib/screens/inbox/reply/conversation_reply_screen.dart b/apps/flutter_parent/lib/screens/inbox/reply/conversation_reply_screen.dart deleted file mode 100644 index 7abc036d6a..0000000000 --- a/apps/flutter_parent/lib/screens/inbox/reply/conversation_reply_screen.dart +++ /dev/null @@ -1,273 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:flutter/material.dart'; -import 'package:flutter/services.dart'; -import 'package:flutter/widgets.dart'; -import 'package:flutter_parent/l10n/app_localizations.dart'; -import 'package:flutter_parent/models/conversation.dart'; -import 'package:flutter_parent/models/message.dart'; -import 'package:flutter_parent/screens/inbox/attachment_utils/attachment_handler.dart'; -import 'package:flutter_parent/screens/inbox/conversation_details/message_widget.dart'; -import 'package:flutter_parent/screens/inbox/create_conversation/create_conversation_screen.dart'; -import 'package:flutter_parent/utils/common_widgets/arrow_aware_focus_scope.dart'; -import 'package:flutter_parent/utils/common_widgets/view_attachment/view_attachment_screen.dart'; -import 'package:flutter_parent/utils/design/canvas_icons.dart'; -import 'package:flutter_parent/utils/design/parent_theme.dart'; -import 'package:flutter_parent/utils/quick_nav.dart'; -import 'package:flutter_parent/utils/service_locator.dart'; -import 'package:provider/provider.dart'; - -import 'conversation_reply_interactor.dart'; - -class ConversationReplyScreen extends StatefulWidget { - ConversationReplyScreen(this.conversation, this.message, this.replyAll); - - final Conversation? conversation; - final Message? message; - final bool replyAll; - - static final sendKey = Key('sendButton'); - static final attachmentKey = Key('attachmentButton'); - static final messageKey = Key('messageText'); - - @override - _ConversationReplyScreenState createState() => _ConversationReplyScreenState(); -} - -class _ConversationReplyScreenState extends State { - _ConversationReplyScreenState(); - - String _bodyText = ''; - List _attachments = []; - bool _sending = false; - TextEditingController _bodyController = TextEditingController(); - ConversationReplyInteractor _interactor = locator(); - FocusScopeNode _focusScopeNode = FocusScopeNode(); - - final _scaffoldKey = GlobalKey(); - - bool _canSend() => - _bodyText.isNotEmpty && !_sending && _attachments.every((it) => it.stage == AttachmentUploadStage.FINISHED); - - @override - void initState() { - _bodyController.addListener(() { - setState(() => _bodyText = _bodyController.text); - }); - super.initState(); - } - - @override - void dispose() { - _focusScopeNode.dispose(); - super.dispose(); - } - - _send() async { - setState(() => _sending = true); - var attachmentIds = _attachments.map((it) => it.attachment?.id).toList().nonNulls.toList(); - try { - var result = await _interactor.createReply( - widget.conversation, - widget.message, - _bodyText, - attachmentIds, - widget.replyAll, - ); - var newMessage = result?.messages?.first; - Conversation? updatedConversation = null; - if (newMessage != null) updatedConversation = widget.conversation?.rebuild((c) => c..messages.insert(0, newMessage)); - Navigator.of(context).pop(updatedConversation); // Return updated conversation - } catch (e) { - setState(() => _sending = false); - ScaffoldMessenger.of(context).showSnackBar( - SnackBar(content: Text(L10n(context).errorSendingMessage)), - ); - } - } - - Future _onWillPop() async { - if (_sending) return Future.value(false); - if (_bodyText.isEmpty && _attachments.isEmpty) return Future.value(true); - return await showDialog( - context: context, - builder: (context) => new AlertDialog( - title: new Text(L10n(context).unsavedChangesDialogTitle), - content: new Text(L10n(context).unsavedChangesDialogBody), - actions: [ - new TextButton( - onPressed: () => Navigator.of(context).pop(false), - child: new Text(L10n(context).no), - ), - new TextButton( - onPressed: () { - _attachments.forEach((it) => it.deleteAttachment()); - Navigator.of(context).pop(true); - }, - child: new Text(L10n(context).yes), - ), - ], - ), - ) ?? - false; - } - - @override - Widget build(BuildContext context) { - return DefaultParentTheme( - builder: (context) => WillPopScope( - onWillPop: _onWillPop, - child: ArrowAwareFocusScope( - node: _focusScopeNode, - child: Scaffold( - key: _scaffoldKey, - appBar: _appBar(context), - body: _content(context), - ), - ), - ), - ); - } - - AppBar _appBar(BuildContext context) { - return AppBar( - bottom: ParentTheme.of(context)?.appBarDivider(shadowInLightMode: false), - title: Column( - crossAxisAlignment: CrossAxisAlignment.start, - mainAxisSize: MainAxisSize.min, - children: [ - Text(widget.replyAll ? L10n(context).replyAll : L10n(context).reply, style: Theme.of(context).textTheme.bodySmall), - Text(widget.conversation?.subject ?? '', style: Theme.of(context).textTheme.bodySmall), - ], - ), - actions: [ - if (_sending) - Center( - child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 16), - child: Container( - width: 24, - height: 24, - child: CircularProgressIndicator( - strokeWidth: 3, - ), - ), - ), - ), - if (!_sending) - IconButton( - tooltip: L10n(context).addAttachment, - key: ConversationReplyScreen.attachmentKey, - icon: Icon(CanvasIcons.paperclip), - onPressed: _sending - ? null - : () { - _interactor.addAttachment(context).then((attachment) { - if (attachment != null) { - attachment.onStageChange = (_) { - setState(() {}); - }; - attachment.performUpload(); - setState(() => _attachments.add(attachment)); - } - }); - }, - ), - if (!_sending) - IconButton( - tooltip: L10n(context).sendMessage, - key: ConversationReplyScreen.sendKey, - icon: Icon(Icons.send), - color: Theme.of(context).colorScheme.secondary, - disabledColor: Theme.of(context).iconTheme.color?.withOpacity(0.25), - onPressed: _canSend() ? _send : null, - ) - ], - ); - } - - Widget _content(BuildContext context) { - return SingleChildScrollView( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - MessageWidget( - conversation: widget.conversation, - message: widget.message ?? widget.conversation?.messages?[0], - currentUserId: _interactor.getCurrentUserId(), - onAttachmentClicked: (attachment) { - locator().push(context, ViewAttachmentScreen(attachment)); - }, - ), - Divider(height: 1), - _editorWidget(context), - _attachmentsWidget(context), - ], - ), - ); - } - - Widget _attachmentsWidget(BuildContext context) { - if (_attachments.isEmpty) return Container(); - return IgnorePointer( - ignoring: _sending, - child: Container( - height: 104, - padding: EdgeInsets.symmetric(vertical: 4), - child: ListView.separated( - shrinkWrap: true, - itemCount: _attachments.length, - padding: const EdgeInsets.symmetric(horizontal: 16), - scrollDirection: Axis.horizontal, - separatorBuilder: (context, index) => SizedBox(width: 12), - itemBuilder: (context, index) { - var handler = _attachments[index]; - return ChangeNotifierProvider.value( - value: handler, - child: AttachmentWidget( - onDelete: (handler) { - setState(() { - _attachments.remove(handler); - }); - }, - ), - ); - }, - ), - ), - ); - } - - Widget _editorWidget(BuildContext context) { - return Semantics( - label: L10n(context).messageBodyInputHint, - child: TextField( - autofocus: true, - key: ConversationReplyScreen.messageKey, - controller: _bodyController, - enabled: !_sending, - textCapitalization: TextCapitalization.sentences, - minLines: 4, - maxLines: null, - style: Theme.of(context).textTheme.bodyMedium, - decoration: InputDecoration( - hintText: L10n(context).messageBodyInputHint, - contentPadding: EdgeInsets.all(16), - border: InputBorder.none, - ), - ), - ); - } -} diff --git a/apps/flutter_parent/lib/screens/login_landing_screen.dart b/apps/flutter_parent/lib/screens/login_landing_screen.dart deleted file mode 100644 index dae6585ca9..0000000000 --- a/apps/flutter_parent/lib/screens/login_landing_screen.dart +++ /dev/null @@ -1,390 +0,0 @@ -// Copyright (C) 2019 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'dart:math'; - -import 'package:flutter/material.dart'; -import 'package:flutter_parent/l10n/app_localizations.dart'; -import 'package:flutter_parent/models/login.dart'; -import 'package:flutter_parent/models/school_domain.dart'; -import 'package:flutter_parent/network/utils/api_prefs.dart'; -import 'package:flutter_parent/router/panda_router.dart'; -import 'package:flutter_parent/screens/qr_login/qr_login_util.dart'; -import 'package:flutter_parent/screens/web_login/web_login_screen.dart'; -import 'package:flutter_parent/utils/common_widgets/avatar.dart'; -import 'package:flutter_parent/utils/common_widgets/two_finger_double_tap_gesture_detector.dart'; -import 'package:flutter_parent/utils/common_widgets/user_name.dart'; -import 'package:flutter_parent/utils/debug_flags.dart'; -import 'package:flutter_parent/utils/design/canvas_icons_solid.dart'; -import 'package:flutter_parent/utils/design/parent_colors.dart'; -import 'package:flutter_parent/utils/design/parent_theme.dart'; -import 'package:flutter_parent/utils/quick_nav.dart'; -import 'package:flutter_parent/utils/service_locator.dart'; -import 'package:flutter_parent/utils/snickers.dart'; -import 'package:flutter_svg/flutter_svg.dart'; -import 'package:flutter_svg/svg.dart'; -import 'package:tuple/tuple.dart'; - -class LoginLandingScreen extends StatelessWidget { - final GlobalKey _scaffoldKey = GlobalKey(); - - int loginFlowIndex = 0; - - @override - Widget build(BuildContext context) { - return DefaultParentTheme( - builder: (context) => Scaffold( - key: _scaffoldKey, - endDrawer: !DebugFlags.isDebug - ? null // Don't show snickers in release mode - : Drawer( - child: SafeArea( - child: Center( - child: ListView.builder( - shrinkWrap: true, - itemCount: SNICKERS.length, - itemBuilder: (context, index) { - var snicker = SNICKERS[index]; - return ListTile( - title: Text(snicker.title), - subtitle: Text(snicker.subtitle), - onTap: () { - // TODO: needs test - locator().push( - context, - WebLoginScreen( - snicker.domain, - user: snicker.username, - pass: snicker.password), - ); - }, - ); - }, - ), - ), - ), - ), - body: TwoFingerDoubleTapGestureDetector( - onDoubleTap: () => _changeLoginFlow(context), - child: SafeArea( - child: OrientationBuilder( - builder: (context, orientation) => - orientation == Orientation.portrait - ? _body(context) - : _bodyLandscape(context), - ), - )))); - } - - Widget _body(BuildContext context) { - final lastLoginAccount = ApiPrefs.getLastAccount(); - final assetString = ParentTheme.of(context)?.isDarkMode == true ? 'assets/svg/canvas-parent-login-logo-dark.svg' : 'assets/svg/canvas-parent-login-logo.svg'; - return Center( - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.stretch, - children: [ - Spacer(), - SvgPicture.asset( - assetString, - semanticsLabel: L10n(context).canvasLogoLabel, - ), - Spacer(), - if (lastLoginAccount == null) - _filledButton(context, L10n(context).findSchool, () { - onFindSchoolPressed(context); - }), - if (lastLoginAccount != null) - _filledButton( - context, - lastLoginAccount.item1.name == null || - lastLoginAccount.item1.name!.isEmpty - ? lastLoginAccount.item1.domain - : lastLoginAccount.item1.name!, () { - onSavedSchoolPressed(context, lastLoginAccount); - }), - SizedBox(height: 16), - if (lastLoginAccount != null) - _outlineButton(context, L10n(context).findAnotherSchool, () { - onFindSchoolPressed(context); - }), - SizedBox(height: 32), - if (_hasCameras()) _qrLogin(context), - SizedBox(height: 32), - _previousLogins(context), - SizedBox(height: 32) - ], - ), - ); - } - - Widget _bodyLandscape(BuildContext context) { - final lastLoginAccount = ApiPrefs.getLastAccount(); - return LayoutBuilder(builder: (context, constraints) { - final parentWidth = constraints.maxWidth; - return Row( - mainAxisAlignment: MainAxisAlignment.spaceEvenly, - children: [ - Container( - width: parentWidth * 0.5, - child: Center( - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Spacer(), - SvgPicture.asset( - 'assets/svg/canvas-parent-login-logo.svg', - semanticsLabel: L10n(context).canvasLogoLabel, - ), - Spacer() - ], - ), - )), - Container( - width: min(parentWidth * 0.5, 400), - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.stretch, - children: [ - Spacer(), - if (lastLoginAccount == null) - _filledButton(context, L10n(context).findSchool, () { - onFindSchoolPressed(context); - }), - if (lastLoginAccount != null) - _filledButton( - context, - lastLoginAccount.item1.name == null || - lastLoginAccount.item1.name!.isEmpty - ? lastLoginAccount.item1.domain - : lastLoginAccount.item1.name!, () { - onSavedSchoolPressed(context, lastLoginAccount); - }), - SizedBox(height: 16), - if (lastLoginAccount != null) - _outlineButton(context, L10n(context).findAnotherSchool, - () { - onFindSchoolPressed(context); - }), - SizedBox(height: 16), - if (_hasCameras()) _qrLogin(context), - SizedBox(height: 16), - _previousLogins(context), - Spacer() - ], - )), - Spacer() - ], - ); - }); - } - - Widget _filledButton( - BuildContext context, String title, VoidCallback onPressed) { - return Padding( - padding: const EdgeInsets.symmetric(horizontal: 48.0), - child: FilledButton( - child: Padding ( - padding: const EdgeInsets.all(16.0), - child: Text( - title, - style: Theme.of(context).textTheme.titleMedium?.copyWith(color: Colors.white, fontSize: 16), - overflow: TextOverflow.ellipsis, - ), - ), - style: FilledButton.styleFrom( - textStyle: TextStyle(color: Colors.white), - backgroundColor: Theme.of(context).colorScheme.secondary, - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.all(Radius.circular(4)) - ), - ), - onPressed: onPressed - ), - ); - } - - Widget _outlineButton( - BuildContext context, String title, VoidCallback onPressed) { - return Padding( - padding: const EdgeInsets.symmetric(horizontal: 48.0), - child: OutlinedButton( - child: Padding( - padding: const EdgeInsets.all(16.0), - child: Text( - title, - style: Theme.of(context).textTheme.titleMedium, - ), - ), - style: OutlinedButton.styleFrom( - minimumSize: Size(double.infinity, 48), - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(4.0), - ), - side: BorderSide( - width: 1, color: ParentTheme.of(context)?.onSurfaceColor ?? Colors.transparent), - ), - onPressed: onPressed, - ), - ); - } - - bool _hasCameras() { - return ApiPrefs.getCameraCount() != null && ApiPrefs.getCameraCount() != 0; - } - - Widget _qrLogin(BuildContext context) { - return InkWell( - onTap: () { - // Launches the choice between qr login and qr create - locator().launchQRTutorial(context); - }, - child: Container( - padding: EdgeInsets.all(12.0), - child: Row( - crossAxisAlignment: CrossAxisAlignment.center, - mainAxisAlignment: MainAxisAlignment.center, - mainAxisSize: MainAxisSize.min, - children: [ - SvgPicture.asset('assets/svg/qr-code.svg'), - SizedBox(width: 8), - Text( - L10n(context).loginWithQRCode, - style: Theme.of(context).textTheme.titleMedium, - ), - ]), - )); - } - - Widget _previousLogins(BuildContext context) { - final itemHeight = 72.0; - return StatefulBuilder( - builder: (context, setState) { - var logins = ApiPrefs.getLogins(); - if (logins.isEmpty) return Container(); - return Container( - width: double.infinity, - child: Column( - key: Key('previous-logins'), - crossAxisAlignment: CrossAxisAlignment.stretch, - children: [ - Padding( - padding: const EdgeInsets.symmetric(horizontal: 48), - child: Text(L10n(context).previousLogins, - style: Theme.of(context).textTheme.titleMedium), - ), - SizedBox(height: 6), - Padding( - padding: const EdgeInsets.symmetric(horizontal: 48), - child: Divider(height: 1), - ), - AnimatedContainer( - curve: Curves.easeInOutBack, - padding: const EdgeInsets.symmetric(horizontal: 48), - duration: Duration(milliseconds: 400), - height: min(itemHeight * 2, itemHeight * logins.length), - child: ListView.builder( - padding: EdgeInsets.symmetric(vertical: 0), - itemCount: logins.length, - itemBuilder: (context, index) { - Login login = logins[index]; - return ListTile( - contentPadding: EdgeInsets.zero, - onTap: () { - ApiPrefs.switchLogins(login); - locator().pushRouteAndClearStack( - context, PandaRouter.rootSplash()); - }, - leading: Stack( - clipBehavior: Clip.none, - children: [ - Avatar.fromUser(login.currentUser), - if (login.isMasquerading) - Positioned( - right: -6, - top: -6, - child: Container( - padding: EdgeInsets.all(4), - decoration: BoxDecoration( - shape: BoxShape.circle, - color: ParentColors.masquerade, - border: Border.all( - color: Theme.of(context) - .scaffoldBackgroundColor, - width: 2)), - child: Icon(CanvasIconsSolid.masquerade, - color: Colors.white, size: 10), - ), - ), - ], - ), - title: UserName.fromUser(login.currentUser), - subtitle: Text(login.currentDomain, overflow: TextOverflow.ellipsis, style: Theme.of(context).textTheme.labelSmall), - trailing: IconButton( - color: Theme.of(context).textTheme.labelSmall?.color, - tooltip: L10n(context).delete, - onPressed: () async { - await ApiPrefs.removeLogin(login); - setState(() {}); - }, - icon: Icon(Icons.clear), - ), - ); - }, - ), - ), - ], - ), - ); - }, - ); - } - - onFindSchoolPressed(BuildContext context) { - LoginFlow flow = LoginFlow.values[loginFlowIndex % LoginFlow.values.length]; - locator() - .pushRoute(context, PandaRouter.domainSearch(loginFlow: flow)); - } - - onSavedSchoolPressed( - BuildContext context, Tuple2 lastAccount) { - locator().pushRoute( - context, - PandaRouter.loginWeb(lastAccount.item1.domain, - accountName: lastAccount.item1.name!, authenticationProvider: lastAccount.item1.authenticationProvider, loginFlow: lastAccount.item2)); - } - - void _changeLoginFlow(BuildContext context) { - loginFlowIndex++; - LoginFlow flow = LoginFlow.values[loginFlowIndex % LoginFlow.values.length]; - String flowDescription; - switch (flow) { - case LoginFlow.normal: - flowDescription = L10n(context).loginFlowNormal; - break; - case LoginFlow.canvas: - flowDescription = L10n(context).loginFlowCanvas; - break; - case LoginFlow.siteAdmin: - flowDescription = L10n(context).loginFlowSiteAdmin; - break; - case LoginFlow.skipMobileVerify: - flowDescription = L10n(context).loginFlowSkipMobileVerify; - break; - } - - ScaffoldMessenger.of(context).removeCurrentSnackBar(); - ScaffoldMessenger.of(context).showSnackBar(SnackBar(content: Text(flowDescription))); - } -} diff --git a/apps/flutter_parent/lib/screens/manage_students/manage_students_interactor.dart b/apps/flutter_parent/lib/screens/manage_students/manage_students_interactor.dart deleted file mode 100644 index 0d6d440453..0000000000 --- a/apps/flutter_parent/lib/screens/manage_students/manage_students_interactor.dart +++ /dev/null @@ -1,34 +0,0 @@ -// Copyright (C) 2019 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:flutter_parent/models/enrollment.dart'; -import 'package:flutter_parent/models/user.dart'; -import 'package:flutter_parent/network/api/enrollments_api.dart'; -import 'package:flutter_parent/utils/service_locator.dart'; - -class ManageStudentsInteractor { - Future?> getStudents({bool forceRefresh = false}) async { - var enrollments = await _enrollmentsApi().getObserveeEnrollments(forceRefresh: forceRefresh); - List? users = filterStudents(enrollments); - sortUsers(users); - return users; - } - - List? filterStudents(List? enrollments) => - enrollments?.map((enrollment) => enrollment.observedUser).toSet().toList().nonNulls.toList(); - - void sortUsers(List? users) => users?.sort((user1, user2) => (user1.sortableName ?? '').compareTo(user2.sortableName ?? '')); - - EnrollmentsApi _enrollmentsApi() => locator(); -} diff --git a/apps/flutter_parent/lib/screens/manage_students/manage_students_screen.dart b/apps/flutter_parent/lib/screens/manage_students/manage_students_screen.dart deleted file mode 100644 index b57b9669c7..0000000000 --- a/apps/flutter_parent/lib/screens/manage_students/manage_students_screen.dart +++ /dev/null @@ -1,202 +0,0 @@ -// Copyright (C) 2019 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:flutter/material.dart'; -import 'package:flutter_parent/l10n/app_localizations.dart'; -import 'package:flutter_parent/models/user.dart'; -import 'package:flutter_parent/screens/alert_thresholds/alert_thresholds_screen.dart'; -import 'package:flutter_parent/screens/manage_students/student_color_picker_dialog.dart'; -import 'package:flutter_parent/screens/pairing/pairing_util.dart'; -import 'package:flutter_parent/utils/common_widgets/avatar.dart'; -import 'package:flutter_parent/utils/common_widgets/empty_panda_widget.dart'; -import 'package:flutter_parent/utils/common_widgets/error_panda_widget.dart'; -import 'package:flutter_parent/utils/common_widgets/user_name.dart'; -import 'package:flutter_parent/utils/design/parent_theme.dart'; -import 'package:flutter_parent/utils/design/student_color_set.dart'; -import 'package:flutter_parent/utils/quick_nav.dart'; -import 'package:flutter_parent/utils/service_locator.dart'; - -import 'manage_students_interactor.dart'; - -/// It is assumed that this page will not be deep linked, so -/// the list of students that it needs should be passed in. -/// -/// Pull to refresh and updating when a pairing code is used are handled, however. -class ManageStudentsScreen extends StatefulWidget { - final List? _students; - - ManageStudentsScreen(this._students, {super.key}); - - @override - State createState() => _ManageStudentsState(); -} - -class _ManageStudentsState extends State { - Future?>? _studentsFuture; - Future?> _loadStudents() => locator().getStudents(forceRefresh: true); - - GlobalKey _refreshKey = GlobalKey(); - - // Used to tell the Dashboard screen if it needs to update its list of students - bool _addedStudentFlag = false; - - @override - Widget build(BuildContext context) { - return WillPopScope( - onWillPop: () { - Navigator.pop(context, _addedStudentFlag); - return Future.value(false); - }, - child: DefaultParentTheme( - useNonPrimaryAppBar: false, - builder: (context) => Scaffold( - appBar: AppBar( - title: Text(L10n(context).manageStudents), - bottom: ParentTheme.of(context)?.appBarDivider(), - ), - body: FutureBuilder( - initialData: widget._students, - future: _studentsFuture, - builder: (context, AsyncSnapshot?> snapshot) { - // No wait view - users should be passed in on init, and the refresh indicator should handle the pull to refresh - - // Get the view based on the state of the snapshot - Widget view; - if (snapshot.hasError) { - view = _error(context); - } else if (snapshot.data == null || snapshot.data!.isEmpty) { - view = _empty(context); - } else { - view = _StudentsList(snapshot.data!); - } - - return RefreshIndicator( - key: _refreshKey, - onRefresh: _refresh, - child: view, - ); - }, - ), - floatingActionButton: _createFloatingActionButton(context), - ), - ), - ); - } - - Widget _StudentsList(List students) { - return ListView.builder( - itemCount: students.length, - itemBuilder: (context, index) => ListTile( - contentPadding: const EdgeInsets.fromLTRB(16.0, 12.0, 8.0, 12.0), - leading: Hero( - tag: 'studentAvatar${students[index].id}', - child: Avatar(students[index].avatarUrl, name: students[index].shortName), - ), - title: Hero( - tag: 'studentText${students[index].id}', - key: ValueKey('studentTextHero${students[index].id}'), - child: UserName.fromUserShortName( - students[index], - style: Theme.of(context).textTheme.titleMedium, - ), - ), - onTap: () async { - var needsRefresh = await locator.get().push(context, AlertThresholdsScreen(students[index])); - if (needsRefresh == true) { - _refreshKey.currentState?.show(); - _addedStudentFlag = true; - } - }, - trailing: FutureBuilder( - future: ParentTheme.of(context)?.getColorsForStudent(students[index].id), - builder: (context, snapshot) { - var color = snapshot.hasData - ? ParentTheme.of(context)?.getColorVariantForCurrentState(snapshot.data!) ?? Colors.transparent - : Colors.transparent; - return Semantics( - container: true, - label: L10n(context).changeStudentColorLabel(students[index].shortName ?? ''), - child: InkResponse( - highlightColor: color, - onTap: () { - showDialog( - context: context, - builder: (context) => StudentColorPickerDialog( - initialColor: color, - studentId: students[index].id, - ), - ); - }, - child: Container( - width: 48, - height: 48, - padding: EdgeInsets.all(10), - child: Center( - child: Container( - key: Key('color-circle-${students[index].id}'), - width: 20, - height: 20, - decoration: BoxDecoration(color: color, shape: BoxShape.circle), - ), - ), - ), - ), - ); - }, - ), - ), - ); - } - - Widget _error(BuildContext context) { - return ErrorPandaWidget(L10n(context).errorLoadingStudents, () { - _refresh(); - }); - } - - Widget _empty(BuildContext context) { - return EmptyPandaWidget( - svgPath: 'assets/svg/panda-manage-students.svg', - subtitle: L10n(context).emptyStudentList, - buttonText: L10n(context).retry, - onButtonTap: () => _refresh(), - ); - } - - Widget _createFloatingActionButton(BuildContext context) { - return FloatingActionButton( - child: Icon( - Icons.add, - semanticLabel: L10n(context).addNewStudent, - ), - onPressed: () { - locator().pairNewStudent( - context, - () { - _refreshKey.currentState?.show(); - _addedStudentFlag = true; - }, - ); - }, - ); - } - - /// Force widget to reload with a refreshed future - Future _refresh() { - setState(() { - _studentsFuture = _loadStudents(); - }); - return _studentsFuture!.catchError((_) {}); - } -} diff --git a/apps/flutter_parent/lib/screens/manage_students/student_color_picker_dialog.dart b/apps/flutter_parent/lib/screens/manage_students/student_color_picker_dialog.dart deleted file mode 100644 index 5d0497c48d..0000000000 --- a/apps/flutter_parent/lib/screens/manage_students/student_color_picker_dialog.dart +++ /dev/null @@ -1,140 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:flutter/cupertino.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_parent/l10n/app_localizations.dart'; -import 'package:flutter_parent/screens/manage_students/student_color_picker_interactor.dart'; -import 'package:flutter_parent/utils/design/parent_colors.dart'; -import 'package:flutter_parent/utils/design/parent_theme.dart'; -import 'package:flutter_parent/utils/design/student_color_set.dart'; -import 'package:flutter_parent/utils/service_locator.dart'; - -class StudentColorPickerDialog extends StatefulWidget { - final String studentId; - final Color initialColor; - - const StudentColorPickerDialog({required this.initialColor, required this.studentId, super.key}); - @override - _StudentColorPickerDialogState createState() => _StudentColorPickerDialogState(); -} - -class _StudentColorPickerDialogState extends State { - late Color _selectedColor; - bool _saving = false; - bool _error = false; - - @override - void initState() { - _selectedColor = widget.initialColor; - super.initState(); - } - - @override - Widget build(BuildContext context) { - return AlertDialog( - contentPadding: EdgeInsets.zero, - title: Text(L10n(context).selectStudentColor), - content: Column( - mainAxisSize: MainAxisSize.min, - children: [ - SingleChildScrollView(child: _colorOptions(), scrollDirection: Axis.horizontal), - if (_error) - Padding( - padding: const EdgeInsetsDirectional.only(start: 24, top: 8, end: 24), - child: Text( - L10n(context).errorSavingColor, - style: TextStyle(color: ParentColors.failure), - ), - ), - ], - ), - actions: [ - if (_saving) - TextButton( - child: Container( - width: 18, - height: 18, - child: CircularProgressIndicator(strokeWidth: 2), - ), - onPressed: null, - ), - if (!_saving) TextButton(child: Text(L10n(context).cancel), onPressed: () => Navigator.of(context).pop(false)), - if (!_saving) TextButton(child: Text(L10n(context).ok), onPressed: _save), - ], - ); - } - - Widget _colorOptions() { - return Padding( - padding: EdgeInsetsDirectional.only(start: 16, top: 12, end: 16), - child: Row( - key: Key('color-options'), - children: [...StudentColorSet.all.map((colorSet) => _colorOption(colorSet))], - ), - ); - } - - Widget _colorOption(StudentColorSet colorSet) { - var selected = _selectedColor == colorSet.light; - var displayColor = ParentTheme.of(context)?.getColorVariantForCurrentState(colorSet) ?? Colors.transparent; - return Semantics( - selected: selected, - label: StudentColorSet.getA11yName(colorSet, context), - child: InkResponse( - onTap: () { - setState(() { - _selectedColor = colorSet.light; - }); - }, - child: Container( - width: 48, - height: 48, - decoration: ShapeDecoration( - shape: CircleBorder( - side: BorderSide(color: selected ? displayColor : Colors.transparent, width: 3), - ), - ), - padding: EdgeInsets.all(4), - child: Container( - decoration: BoxDecoration( - color: displayColor, - shape: BoxShape.circle, - ), - ), - ), - ), - ); - } - - void _save() async { - if (_selectedColor == widget.initialColor) { - // Selection has not changed, pop without saving - Navigator.of(context).pop(false); - return; - } - setState(() => _saving = true); - - try { - await locator().save(widget.studentId, _selectedColor); - ParentTheme.of(context)?.refreshStudentColor(); - Navigator.of(context).pop(true); - } catch (e, s) { - setState(() { - _saving = false; - _error = true; - }); - } - } -} diff --git a/apps/flutter_parent/lib/screens/manage_students/student_color_picker_interactor.dart b/apps/flutter_parent/lib/screens/manage_students/student_color_picker_interactor.dart deleted file mode 100644 index 1112c4cec2..0000000000 --- a/apps/flutter_parent/lib/screens/manage_students/student_color_picker_interactor.dart +++ /dev/null @@ -1,37 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:flutter/material.dart'; -import 'package:flutter_parent/models/user_color.dart'; -import 'package:flutter_parent/network/api/user_api.dart'; -import 'package:flutter_parent/network/utils/api_prefs.dart'; -import 'package:flutter_parent/utils/db/user_colors_db.dart'; -import 'package:flutter_parent/utils/service_locator.dart'; - -class StudentColorPickerInteractor { - Future save(String studentId, Color newColor) async { - var contextId = 'user_$studentId'; - final userColorsResponse = await locator().setUserColor(contextId, newColor); - if (userColorsResponse?.hexCode != null) { - UserColor data = UserColor((b) => b - ..userId = ApiPrefs.getUser()?.id - ..userDomain = ApiPrefs.getDomain() - ..canvasContext = contextId - ..color = newColor); - await locator().insertOrUpdate(data); - } else { - throw Exception('Failed to set user color'); - } - } -} diff --git a/apps/flutter_parent/lib/screens/masquerade/masquerade_screen.dart b/apps/flutter_parent/lib/screens/masquerade/masquerade_screen.dart deleted file mode 100644 index d8d8159ffb..0000000000 --- a/apps/flutter_parent/lib/screens/masquerade/masquerade_screen.dart +++ /dev/null @@ -1,228 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'dart:async'; - -import 'package:flutter/material.dart'; -import 'package:flutter_parent/l10n/app_localizations.dart'; -import 'package:flutter_parent/utils/common_widgets/respawn.dart'; -import 'package:flutter_parent/utils/design/parent_colors.dart'; -import 'package:flutter_parent/utils/design/parent_theme.dart'; -import 'package:flutter_parent/utils/service_locator.dart'; -import 'package:flutter_svg/flutter_svg.dart'; - -import 'masquerade_screen_interactor.dart'; - -class MasqueradeScreen extends StatefulWidget { - @override - MasqueradeScreenState createState() => MasqueradeScreenState(); -} - -class MasqueradeScreenState extends State { - static Offset pandaMaskOffset = const Offset(150, 40); - - late TextEditingController _domainController; - late TextEditingController _userIdController; - MasqueradeScreenInteractor _interactor = locator(); - late bool _enableDomainInput; - - String? _domainErrorText; - String? _userIdErrorText; - - final GlobalKey _scaffoldKey = GlobalKey(); - - final Duration _pandaAnimDuration = const Duration(milliseconds: 1500); - final Curve _pandaAnimCurve = Curves.ease; - final double _pandaMaskRotation = 0.8; - bool _maskIllustration = false; - bool _flipAnimSide = false; - - bool _startingMasquerade = false; - - late Timer timer; - - @override - void initState() { - _enableDomainInput = _interactor.getDomain()?.contains(MasqueradeScreenInteractor.siteAdminDomain) ?? false; - - // Set up Domain input controller - _domainController = TextEditingController(text: _enableDomainInput ? null : _interactor.getDomain()); - _domainController.addListener(() { - if (_domainErrorText != null) setState(() => _domainErrorText = null); - }); - - // Set up User ID input controller - _userIdController = TextEditingController(); - _userIdController.addListener(() { - if (_userIdErrorText != null) setState(() => _userIdErrorText = null); - }); - - // Set up timer for animation - timer = Timer.periodic(Duration(seconds: 2), (timer) { - setState(() { - _maskIllustration = !_maskIllustration; - if (!_maskIllustration) _flipAnimSide = !_flipAnimSide; - }); - }); - - // Initial animation - WidgetsBinding.instance.addPostFrameCallback((_) { - setState(() { - _maskIllustration = !_maskIllustration; - }); - }); - super.initState(); - } - - @override - void dispose() { - timer.cancel(); - super.dispose(); - } - - @override - Widget build(BuildContext context) { - return DefaultParentTheme( - builder: (context) => Scaffold( - key: _scaffoldKey, - appBar: AppBar( - title: Text(L10n(context).actAsUser), - bottom: ParentTheme.of(context)?.appBarDivider(shadowInLightMode: false), - ), - body: SingleChildScrollView( - child: Padding( - padding: const EdgeInsets.all(24), - child: Column( - children: [ - SizedBox(height: 16), - _pandaIllustration(), - Text(L10n(context).actAsDescription), - SizedBox(height: 16), - TextField( - key: Key('domain-input'), - enabled: _enableDomainInput && !_startingMasquerade, - controller: _domainController, - keyboardType: TextInputType.url, - style: _enableDomainInput ? null : TextStyle(color: ParentColors.ash), - decoration: InputDecoration( - errorText: _domainErrorText, - hintText: L10n(context).domainInputHint, - labelText: L10n(context).domainInputHint, - alignLabelWithHint: true, - border: _enableDomainInput ? OutlineInputBorder() : InputBorder.none, - ), - ), - SizedBox(height: 12), - TextField( - key: Key('user-id-input'), - enabled: !_startingMasquerade, - controller: _userIdController, - decoration: InputDecoration( - errorText: _userIdErrorText, - hintText: L10n(context).userIdInputHint, - labelText: L10n(context).userIdInputHint, - border: OutlineInputBorder(), - ), - ), - SizedBox(height: 12), - if (_startingMasquerade) - Container( - height: 64, - child: Center( - child: Container( - width: 24, - height: 24, - child: CircularProgressIndicator(strokeWidth: 3), - ), - ), - ), - if (!_startingMasquerade) - Container( - width: double.maxFinite, - height: 64, - child: ElevatedButton( - style: ElevatedButton.styleFrom( - backgroundColor: Theme.of(context).primaryColor, - textStyle: TextStyle(color: Colors.white), - ), - child: Text(L10n(context).actAsUser, style: Theme.of(context).textTheme.bodyMedium?.copyWith(color: Colors.white),), - onPressed: () => _startMasquerading(), - ), - ) - ], - ), - ), - ), - ), - ); - } - - Widget _pandaIllustration() { - return ExcludeSemantics( - child: Container( - width: double.maxFinite, - height: 146, - child: Stack( - clipBehavior: Clip.none, - children: [ - Positioned(child: SvgPicture.asset('assets/svg/masquerade-white-panda.svg'), left: 0, right: 0), - AnimatedPositioned( - duration: _pandaAnimDuration, - curve: _pandaAnimCurve, - child: TweenAnimationBuilder( - tween: Tween( - begin: -_pandaMaskRotation, - end: _maskIllustration ? 0 : _flipAnimSide ? _pandaMaskRotation : -_pandaMaskRotation, - ), - duration: _pandaAnimDuration, - curve: _pandaAnimCurve, - builder: (context, value, _) { - return Transform.rotate( - angle: value, - child: SvgPicture.asset('assets/svg/masquerade-red-panda.svg', key: Key('red-panda-mask')), - ); - }, - ), - right: 0, - left: _maskIllustration ? 0 : _flipAnimSide ? pandaMaskOffset.dx : -pandaMaskOffset.dx, - top: _maskIllustration ? 0 : pandaMaskOffset.dy, - ), - ], - ), - ), - ); - } - - Future _startMasquerading() async { - String domain = _interactor.sanitizeDomain(_domainController.text); - String userId = _userIdController.text.trim(); - - if (domain.isEmpty || userId.isEmpty) { - setState(() { - if (domain.isEmpty) _domainErrorText = L10n(context).domainInputError; - if (userId.isEmpty) _userIdErrorText = L10n(context).userIdInputError; - }); - return; - } - - setState(() => _startingMasquerade = true); - bool success = await _interactor.startMasquerading(userId, domain); - if (success) { - Respawn.of(context)?.restart(); - } else { - setState(() => _startingMasquerade = false); - ScaffoldMessenger.of(context).showSnackBar(SnackBar(content: Text(L10n(context).actAsUserError))); - } - } -} diff --git a/apps/flutter_parent/lib/screens/masquerade/masquerade_screen_interactor.dart b/apps/flutter_parent/lib/screens/masquerade/masquerade_screen_interactor.dart deleted file mode 100644 index ac6f0f1144..0000000000 --- a/apps/flutter_parent/lib/screens/masquerade/masquerade_screen_interactor.dart +++ /dev/null @@ -1,58 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:flutter_parent/network/api/user_api.dart'; -import 'package:flutter_parent/network/utils/api_prefs.dart'; -import 'package:flutter_parent/utils/service_locator.dart'; - -class MasqueradeScreenInteractor { - String? getDomain() => ApiPrefs.getDomain(); - - static final siteAdminDomain = 'siteadmin.instructure.com'; - - Future startMasquerading(String masqueradingUserId, String masqueradingDomain) async { - try { - var user = await locator().getUserForDomain(masqueradingDomain, masqueradingUserId); - ApiPrefs.updateCurrentLogin((b) => b - ..masqueradeDomain = masqueradingDomain - ..masqueradeUser = user?.toBuilder()); - return true; - } catch (e) { - return false; - } - } - - /// Cleans up the input domain and adds protocol and '.instructure.com' as necessary. Returns an empty string - /// if sanitizing failed. - String sanitizeDomain(String? domain) { - if (domain == null || domain.isEmpty) return ''; - - // Remove white space - domain = domain.replaceAll(RegExp('\\s'), ''); - - // Add '.instructure.com' if necessary - if (!domain.contains('.') || domain.endsWith('.beta')) domain = '$domain.instructure.com'; - - // Add protocol if missing - if (!domain.startsWith('http')) domain = 'https://$domain'; - - // Run through Uri parser for a final validity check - try { - String parsed = Uri.parse(domain).toString(); - return domain == parsed ? domain : ''; - } catch (e) { - return ''; - } - } -} diff --git a/apps/flutter_parent/lib/screens/not_a_parent_screen.dart b/apps/flutter_parent/lib/screens/not_a_parent_screen.dart deleted file mode 100644 index 0619686bac..0000000000 --- a/apps/flutter_parent/lib/screens/not_a_parent_screen.dart +++ /dev/null @@ -1,123 +0,0 @@ -// Copyright (C) 2019 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:flutter/material.dart'; -import 'package:flutter/rendering.dart'; -import 'package:flutter_parent/l10n/app_localizations.dart'; -import 'package:flutter_parent/network/utils/api_prefs.dart'; -import 'package:flutter_parent/parent_app.dart'; -import 'package:flutter_parent/router/panda_router.dart'; -import 'package:flutter_parent/utils/common_widgets/empty_panda_widget.dart'; -import 'package:flutter_parent/utils/design/parent_colors.dart'; -import 'package:flutter_parent/utils/features_utils.dart'; -import 'package:flutter_parent/utils/quick_nav.dart'; -import 'package:flutter_parent/utils/service_locator.dart'; -import 'package:flutter_parent/utils/url_launcher.dart'; -import 'package:flutter_svg/svg.dart'; - -class NotAParentScreen extends StatelessWidget { - @override - Widget build(BuildContext context) { - return Scaffold( - body: Column( - children: [ - Expanded( - child: EmptyPandaWidget( - svgPath: 'assets/svg/panda-book.svg', - title: L10n(context).notAParentTitle, - subtitle: L10n(context).notAParentSubtitle, - buttonText: L10n(context).returnToLogin, - onButtonTap: () async { - await ApiPrefs.performLogout(app: ParentApp.of(context)); - await FeaturesUtils.performLogout(); - locator().pushRouteAndClearStack(context, PandaRouter.login()); - }, - ), - ), - _appOptions(context), - ], - ), - ); - } - - Padding _appOptions(BuildContext context) { - return Padding( - padding: const EdgeInsets.symmetric(horizontal: 32), - child: ExpansionTile( - trailing: SizedBox(width: 1), // Replace dropdown chevron with empty, non-zero width element - title: Padding( - padding: const EdgeInsetsDirectional.only(start: 16), // Offset to keep text centered - child: Text( - L10n(context).studentOrTeacherTitle, - textAlign: TextAlign.center, - style: Theme.of(context).textTheme.bodySmall, - ), - ), - children: [ - Text( - L10n(context).studentOrTeacherSubtitle, - textAlign: TextAlign.center, - style: Theme.of(context).textTheme.bodySmall, - ), - SizedBox(height: 24), - _appButton(context, L10n(context).studentApp, L10n(context).canvasStudentApp, ParentColors.studentApp, 'assets/svg/canvas-logo-student.svg', () { - locator().launch('market://details?id=com.instructure.candroid'); - }), - _appButton(context, L10n(context).teacherApp, L10n(context).canvasTeacherApp, ParentColors.teacherApp, 'assets/svg/canvas-logo-teacher.svg', () { - locator().launch('market://details?id=com.instructure.teacher'); - }), - SizedBox(height: 24), - ], - ), - ); - } - - Widget _appButton(BuildContext context, String name, String label, Color color, String logo, GestureTapCallback onTap) { - return InkWell( - onTap: onTap, - child: Semantics( - label: label, - excludeSemantics: true, - child: Padding( - padding: const EdgeInsets.all(8.0), - child: Row( - mainAxisSize: MainAxisSize.min, - children: [ - SvgPicture.asset( - logo, - height: 48, - color: color, - ), - SizedBox(width: 8), - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - SvgPicture.asset( - 'assets/svg/canvas-wordmark.svg', - alignment: Alignment.centerLeft, - height: 24, - ), - Text( - name, - style: TextStyle(color: color, fontSize: 10, fontWeight: FontWeight.w900), - ), - ], - ) - ], - ), - ), - ), - ); - } -} diff --git a/apps/flutter_parent/lib/screens/pairing/pairing_code_dialog.dart b/apps/flutter_parent/lib/screens/pairing/pairing_code_dialog.dart deleted file mode 100644 index ba2630c49f..0000000000 --- a/apps/flutter_parent/lib/screens/pairing/pairing_code_dialog.dart +++ /dev/null @@ -1,150 +0,0 @@ -// Copyright (C) 2019 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:flutter/material.dart'; -import 'package:flutter_parent/l10n/app_localizations.dart'; -import 'package:flutter_parent/network/utils/analytics.dart'; -import 'package:flutter_parent/screens/pairing/pairing_interactor.dart'; -import 'package:flutter_parent/utils/common_widgets/arrow_aware_focus_scope.dart'; -import 'package:flutter_parent/utils/design/parent_colors.dart'; -import 'package:flutter_parent/utils/service_locator.dart'; - -class PairingCodeDialog extends StatefulWidget { - final _interactor = locator(); - - final String? _pairingCode; - - PairingCodeDialog(this._pairingCode, {super.key}); - - @override - State createState() => PairingCodeDialogState(); -} - -class PairingCodeDialogState extends State { - var _pairingCodeError = false; - var _makingApiCall = false; - FocusScopeNode _focusScopeNode = FocusScopeNode(); - - final GlobalKey _formKey = GlobalKey(); - - @override - void dispose() { - _focusScopeNode.dispose(); - super.dispose(); - } - - @override - Widget build(BuildContext context) { - return ArrowAwareFocusScope( - node: _focusScopeNode, - child: AlertDialog( - shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8.0)), - title: Text(L10n(context).addStudent), - content: SingleChildScrollView( - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - mainAxisSize: MainAxisSize.min, - children: [ - Padding( - padding: const EdgeInsets.only(bottom: 20.0), - child: Text( - L10n(context).pairingCodeEntryExplanation, - style: Theme.of(context).textTheme.bodyMedium?.copyWith(fontSize: 12.0), - ), - ), - TextFormField( - key: _formKey, - autofocus: true, - autocorrect: false, - autovalidateMode: AutovalidateMode.disabled, - initialValue: widget._pairingCode, - onChanged: (value) { - _showPairingCodeError(false); - }, - validator: (text) { - if (_pairingCodeError) { - return L10n(context).errorPairingFailed; - } else - return null; - }, - onSaved: (code) async { - // Disable OK and Cancel buttons - setState(() { - _makingApiCall = true; - }); - - _showPairingCodeError(false); - - var successful = await widget._interactor.pairWithStudent(code); - if (successful == true) { - // Close dialog - return 'true' to represent that a student was paired - locator().logEvent(AnalyticsEventConstants.ADD_STUDENT_SUCCESS); - Navigator.of(context).pop(true); - } else { - locator().logEvent(AnalyticsEventConstants.ADD_STUDENT_FAILURE); - _showPairingCodeError(true); - } - - // Enable OK and Cancel buttons - setState(() { - _makingApiCall = false; - }); - }, - onFieldSubmitted: (code) async { - _formKey.currentState?.save(); - }, - decoration: InputDecoration( - hintText: L10n(context).pairingCode, - hintStyle: TextStyle(color: ParentColors.ash), - contentPadding: EdgeInsets.only(bottom: 2), - errorText: _pairingCodeError ? L10n(context).errorPairingFailed : null, - ), - ), - ], - ), - ), - actions: [ - TextButton( - child: Text(L10n(context).cancel.toUpperCase()), - style: TextButton.styleFrom(disabledForegroundColor: Theme.of(context).primaryColor.withAlpha(100)), - onPressed: _makingApiCall - ? null - : () { - // Pop dialog - false indicates no student was paired - Navigator.of(context).pop(false); - }, - ), - TextButton( - style: TextButton.styleFrom(disabledForegroundColor: Theme.of(context).primaryColor.withAlpha(100)), - child: Text(L10n(context).ok), - onPressed: _makingApiCall - ? null - : () async { - _showPairingCodeError(false); - _formKey.currentState?.save(); - }, - ), - ], - ), - ); - } - - void _showPairingCodeError(bool show) { - _formKey.currentState?.validate(); - // Update the UI with the error state - setState(() { - _pairingCodeError = show; - }); - } -} diff --git a/apps/flutter_parent/lib/screens/pairing/pairing_interactor.dart b/apps/flutter_parent/lib/screens/pairing/pairing_interactor.dart deleted file mode 100644 index 5027f8ac55..0000000000 --- a/apps/flutter_parent/lib/screens/pairing/pairing_interactor.dart +++ /dev/null @@ -1,26 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:flutter_parent/network/api/enrollments_api.dart'; -import 'package:flutter_parent/utils/qr_utils.dart'; -import 'package:flutter_parent/utils/service_locator.dart'; - -class PairingInteractor { - Future scanQRCode() => QRUtils.scanPairingCode(); - - Future pairWithStudent(String? pairingCode) { - if (pairingCode == null) return Future.value(null); - return locator().pairWithStudent(pairingCode); - } -} diff --git a/apps/flutter_parent/lib/screens/pairing/pairing_util.dart b/apps/flutter_parent/lib/screens/pairing/pairing_util.dart deleted file mode 100644 index 73a956d6e1..0000000000 --- a/apps/flutter_parent/lib/screens/pairing/pairing_util.dart +++ /dev/null @@ -1,95 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:flutter/material.dart'; -import 'package:flutter_parent/l10n/app_localizations.dart'; -import 'package:flutter_parent/network/utils/analytics.dart'; -import 'package:flutter_parent/network/utils/api_prefs.dart'; -import 'package:flutter_parent/router/panda_router.dart'; -import 'package:flutter_parent/screens/pairing/pairing_code_dialog.dart'; -import 'package:flutter_parent/utils/design/canvas_icons.dart'; -import 'package:flutter_parent/utils/design/parent_colors.dart'; -import 'package:flutter_parent/utils/quick_nav.dart'; -import 'package:flutter_parent/utils/service_locator.dart'; -import 'package:flutter_svg/flutter_svg.dart'; - -class PairingUtil { - pairNewStudent(BuildContext context, Function() onSuccess) { - showModalBottomSheet( - backgroundColor: Theme.of(context).scaffoldBackgroundColor, - context: context, - isScrollControlled: true, - builder: (context) { - return ListView( - padding: EdgeInsets.symmetric(vertical: 20, horizontal: 16), - shrinkWrap: true, - children: [ - Text(L10n(context).addStudentWith, style: Theme.of(context).textTheme.bodyMedium), - SizedBox(height: 12), - _pairingCode(context, onSuccess), - if (_hasCameras()) _qrCode(context, onSuccess), - ], - ); - }, - ); - } - - Widget _qrCode(BuildContext context, Function() onSuccess) { - return ListTile( - title: Text(L10n(context).qrCode, style: Theme.of(context).textTheme.titleMedium), - subtitle: Padding( - padding: const EdgeInsets.only(top: 4), - child: Text(L10n(context).qrCodeDescription, style: Theme.of(context).textTheme.bodyMedium), - ), - leading: SvgPicture.asset('assets/svg/qr-code.svg', color: ParentColors.ash, width: 25, height: 25), - contentPadding: EdgeInsets.symmetric(vertical: 10), - onTap: () async { - Navigator.of(context).pop(); - locator().logEvent(AnalyticsEventConstants.ADD_STUDENT_MANAGE_STUDENTS); - var studentPaired = await locator().pushRoute(context, PandaRouter.qrPairing()); - if (studentPaired == true) onSuccess(); - }, - ); - } - - Widget _pairingCode(BuildContext context, Function() onSuccess) { - return ListTile( - title: Text(L10n(context).pairingCode, style: Theme.of(context).textTheme.titleMedium), - subtitle: Padding( - padding: const EdgeInsets.only(top: 4), - child: Text(L10n(context).pairingCodeDescription, style: Theme.of(context).textTheme.bodyMedium), - ), - leading: Icon(CanvasIcons.keyboard_shortcuts, color: ParentColors.ash), - contentPadding: EdgeInsets.symmetric(vertical: 10), - onTap: () async { - Navigator.of(context).pop(); - locator().logEvent(AnalyticsEventConstants.ADD_STUDENT_MANAGE_STUDENTS); - bool? studentPaired = await locator().showDialog( - context: context, - barrierDismissible: true, - builder: (BuildContext context) => PairingCodeDialog(null), - ); - if (studentPaired == true) onSuccess(); - }, - ); - } -} - -class StudentAddedNotifier extends ChangeNotifier { - void notify() => notifyListeners(); -} - -bool _hasCameras() { - return ApiPrefs.getCameraCount() != null && ApiPrefs.getCameraCount() != 0; -} diff --git a/apps/flutter_parent/lib/screens/pairing/qr_pairing_screen.dart b/apps/flutter_parent/lib/screens/pairing/qr_pairing_screen.dart deleted file mode 100644 index b0d7a42fa5..0000000000 --- a/apps/flutter_parent/lib/screens/pairing/qr_pairing_screen.dart +++ /dev/null @@ -1,210 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:flutter/material.dart'; -import 'package:flutter_parent/l10n/app_localizations.dart'; -import 'package:flutter_parent/network/utils/analytics.dart'; -import 'package:flutter_parent/network/utils/api_prefs.dart'; -import 'package:flutter_parent/router/panda_router.dart'; -import 'package:flutter_parent/screens/pairing/pairing_interactor.dart'; -import 'package:flutter_parent/screens/pairing/pairing_util.dart'; -import 'package:flutter_parent/utils/common_widgets/empty_panda_widget.dart'; -import 'package:flutter_parent/utils/common_widgets/loading_indicator.dart'; -import 'package:flutter_parent/utils/design/parent_theme.dart'; -import 'package:flutter_parent/utils/qr_utils.dart'; -import 'package:flutter_parent/utils/quick_nav.dart'; -import 'package:flutter_parent/utils/service_locator.dart'; -import 'package:tuple/tuple.dart'; - -class QRPairingScreen extends StatefulWidget { - final QRPairingInfo? pairingInfo; - final bool isCreatingAccount; - - const QRPairingScreen({this.pairingInfo, this.isCreatingAccount = false, super.key}); - - @override - _QRPairingScreenState createState() => _QRPairingScreenState(); -} - -class _QRPairingScreenState extends State { - final GlobalKey _scaffoldKey = GlobalKey(); - - bool _isPairing = false; - Tuple2? _errorInfo; - - PairingInteractor _interactor = locator(); - - @override - void initState() { - if (widget.pairingInfo != null) { - _isPairing = true; - WidgetsBinding.instance.addPostFrameCallback((_) { - _handleScanResult(widget.pairingInfo!); - }); - } - super.initState(); - } - - @override - Widget build(BuildContext context) { - bool showTutorial = !_isPairing && _errorInfo == null; - return DefaultParentTheme( - builder: (context) => Scaffold( - key: _scaffoldKey, - appBar: AppBar( - title: Text(showTutorial ? L10n(context).qrPairingTutorialTitle : L10n(context).qrPairingTitle), - automaticallyImplyLeading: true, - bottom: ParentTheme.of(context)?.appBarDivider(shadowInLightMode: false), - actions: [ - if (showTutorial) _nextButton(context), - ], - ), - body: _body(context), - ), - ); - } - - Widget _body(BuildContext context) { - if (_isPairing) { - return LoadingIndicator(); - } else if (_errorInfo != null) { - return _errorMessage(context); - } else { - return _tutorial(context); - } - } - - Widget _tutorial(BuildContext context) { - return Padding( - padding: const EdgeInsets.all(16), - child: Column( - children: [ - Text(L10n(context).qrPairingTutorialMessage, style: Theme.of(context).textTheme.titleMedium), - Expanded( - child: FractionallySizedBox( - alignment: Alignment.center, - heightFactor: 0.75, - child: Image.asset( - 'assets/png/locate-pairing-qr-tutorial.png', - semanticLabel: L10n(context).qrPairingScreenshotContentDescription, - ), - ), - ), - ], - ), - ); - } - - Widget _nextButton(BuildContext context) { - return ButtonTheme( - textTheme: Theme.of(context).buttonTheme.textTheme, - minWidth: 48, - child: TextButton( - style: TextButton.styleFrom( - visualDensity: VisualDensity.compact, - shape: CircleBorder(side: BorderSide(color: Colors.transparent)), - ), - child: Text(L10n(context).next.toUpperCase()), - onPressed: () async { - QRPairingScanResult result = await _interactor.scanQRCode(); - _handleScanResult(result); - }, - ), - ); - } - - Widget _errorMessage(BuildContext context) { - return EmptyPandaWidget( - svgPath: 'assets/svg/panda-no-pairing-code.svg', - title: _errorInfo!.item1, - subtitle: _errorInfo!.item2, - buttonText: L10n(context).retry, - onButtonTap: () async { - QRPairingScanResult result = await _interactor.scanQRCode(); - _handleScanResult(result); - }, - ); - } - - void _handleScanResult(QRPairingScanResult result) async { - var l10n = L10n(context); - if (result is QRPairingInfo) { - setState(() => _isPairing = true); - - if (widget.isCreatingAccount) { - setState(() { - _isPairing = false; - }); - - // Don't pair, just route the info to account creation - locator() - .pushRoute(context, PandaRouter.accountCreation(result.code, result.domain, result.accountId)); - } else { - _handleScanResultForPairing(result); - } - } else if (result is QRPairingScanError) { - locator().logMessage(result.type.toString()); - Tuple2? errorInfo; - switch (result.type) { - case QRPairingScanErrorType.invalidCode: - errorInfo = Tuple2(l10n.qrPairingInvalidCodeTitle, l10n.invalidQRCodeError); - break; - case QRPairingScanErrorType.cameraError: - errorInfo = Tuple2(l10n.qrPairingCameraPermissionTitle, l10n.qrCodeNoCameraError); - break; - case QRPairingScanErrorType.unknown: - errorInfo = Tuple2(l10n.qrPairingFailedTitle, l10n.qrPairingFailedSubtitle); - break; - case QRPairingScanErrorType.canceled: - // Don't set or change the error if scan was canceled - break; - } - setState(() { - _isPairing = false; - _errorInfo = errorInfo; - }); - } - } - - void _handleScanResultForPairing(QRPairingInfo result) async { - var l10n = L10n(context); - // 'success' is true if pairing worked, false for API/pairing error, null for network error - bool? success = await _interactor.pairWithStudent(result.code); - - if (success == true) { - // If opened from a deep link in a cold state, this will be the top route and we'll want to go to the splash instead of popping - if (ModalRoute.of(context)?.isFirst == true) { - locator().replaceRoute(context, PandaRouter.rootSplash()); - } else { - locator().notify(); - Navigator.of(context).pop(true); - } - } else { - Tuple2 errorInfo; - if (success == false) { - if (ApiPrefs.isLoggedIn() && ApiPrefs.getDomain()?.endsWith(result.domain) == false) { - errorInfo = Tuple2(l10n.qrPairingWrongDomainTitle, l10n.qrPairingWrongDomainSubtitle); - } else { - errorInfo = Tuple2(l10n.qrPairingFailedTitle, l10n.qrPairingFailedSubtitle); - } - } else { - errorInfo = Tuple2(l10n.genericNetworkError, l10n.qrPairingNetworkError); - } - setState(() { - _isPairing = false; - _errorInfo = errorInfo; - }); - } - } -} diff --git a/apps/flutter_parent/lib/screens/qr_login/qr_login_tutorial_screen.dart b/apps/flutter_parent/lib/screens/qr_login/qr_login_tutorial_screen.dart deleted file mode 100644 index 1de7c14423..0000000000 --- a/apps/flutter_parent/lib/screens/qr_login/qr_login_tutorial_screen.dart +++ /dev/null @@ -1,114 +0,0 @@ -/* - * Copyright (C) 2020 - present Instructure, Inc. - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, version 3 of the License. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -import 'package:flutter/material.dart'; -import 'package:flutter_parent/l10n/app_localizations.dart'; -import 'package:flutter_parent/network/utils/analytics.dart'; -import 'package:flutter_parent/router/panda_router.dart'; -import 'package:flutter_parent/screens/qr_login/qr_login_tutorial_screen_interactor.dart'; -import 'package:flutter_parent/utils/design/parent_theme.dart'; -import 'package:flutter_parent/utils/quick_nav.dart'; -import 'package:flutter_parent/utils/service_locator.dart'; - -class QRLoginTutorialScreen extends StatefulWidget { - @override - _QRLoginTutorialScreenState createState() => _QRLoginTutorialScreenState(); -} - -class _QRLoginTutorialScreenState extends State { - final GlobalKey _scaffoldKey = GlobalKey(); - - @override - Widget build(BuildContext context) { - return DefaultParentTheme( - builder: (context) => Scaffold( - key: _scaffoldKey, - appBar: AppBar( - title: Text(L10n(context).locateQRCode), - automaticallyImplyLeading: true, - actions: [_nextButton(context)], - bottom: ParentTheme.of(context)?.appBarDivider(shadowInLightMode: false), - ), - body: _body(context), - )); - } - - Widget _nextButton(BuildContext context) { - return MaterialButton( - minWidth: 20, - highlightColor: Colors.transparent, - splashColor: Theme.of(context).colorScheme.secondary.withAlpha(100), - textColor: Theme.of(context).colorScheme.secondary, - shape: CircleBorder(side: BorderSide(color: Colors.transparent)), - onPressed: () async { - var barcodeResult = await locator().scan(); - if (barcodeResult.isSuccess && barcodeResult.result != null) { - final result = await locator().pushRoute(context, PandaRouter.qrLogin(barcodeResult.result!)); - - // Await this result so we can show an error message if the splash screen has to pop after a login issue - // (This is typically in the case of the same QR code being scanned twice) - if (result != null && result is String) { - _showSnackBarError(context, result); - } - } else if (barcodeResult.errorType == QRError.invalidQR || barcodeResult.errorType == QRError.cameraError) { - // We only want to display an error for invalid and camera denied, the other case is the user cancelled - locator().logMessage(barcodeResult.errorType.toString()); - _showSnackBarError( - context, - barcodeResult.errorType == QRError.invalidQR - ? L10n(context).invalidQRCodeError - : L10n(context).qrCodeNoCameraError); - } - }, - child: Text( - L10n(context).next.toUpperCase(), - textAlign: TextAlign.end, - style: TextStyle( - fontSize: 16, - fontWeight: FontWeight.w500, - ), - ), - ); - } - - Widget _body(BuildContext context) { - return ListView( - children: [ - Padding( - padding: const EdgeInsets.fromLTRB(16, 24, 16, 0), - child: Text( - L10n(context).qrCodeExplanation, - style: TextStyle(fontSize: 16), - ), - ), - SizedBox(height: 24), - FractionallySizedBox( - alignment: Alignment.center, - widthFactor: 0.75, - child: Image( - semanticLabel: L10n(context).qrCodeScreenshotContentDescription, - image: AssetImage('assets/png/locate-qr-code-tutorial.png'), - fit: BoxFit.contain), - ) - ], - ); - } - - _showSnackBarError(BuildContext context, String error) { - ScaffoldMessenger.of(context).removeCurrentSnackBar(); - ScaffoldMessenger.of(context).showSnackBar(SnackBar(content: Text(error))); - } -} diff --git a/apps/flutter_parent/lib/screens/qr_login/qr_login_tutorial_screen_interactor.dart b/apps/flutter_parent/lib/screens/qr_login/qr_login_tutorial_screen_interactor.dart deleted file mode 100644 index d236da76c3..0000000000 --- a/apps/flutter_parent/lib/screens/qr_login/qr_login_tutorial_screen_interactor.dart +++ /dev/null @@ -1,69 +0,0 @@ -/* - * Copyright (C) 2020 - present Instructure, Inc. - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, version 3 of the License. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -import 'package:barcode_scan2/barcode_scan2.dart'; -import 'package:flutter/services.dart'; -import 'package:flutter_parent/utils/qr_utils.dart'; -import 'package:flutter_parent/utils/service_locator.dart'; -import 'package:flutter_parent/utils/veneers/barcode_scan_veneer.dart'; - -class QRLoginTutorialScreenInteractor { - Future scan() async { - BarcodeScanResult result = BarcodeScanResult(false, errorType: QRError.invalidQR); - try { - ScanResult scanResult = await locator().scanBarcode(); - String barcodeResult = scanResult.rawContent; - switch (scanResult.type) { - case ResultType.Barcode: - if (QRUtils.verifySSOLogin(barcodeResult) != null) { - result = BarcodeScanResult(true, result: barcodeResult); - } else { - result = BarcodeScanResult(false, errorType: QRError.invalidQR); - } - break; - case ResultType.Error: - result = BarcodeScanResult(false, errorType: QRError.invalidQR); - break; - case ResultType.Cancelled: - // Do nothing - result = BarcodeScanResult(false, errorType: QRError.cancelled); - break; - } - } on PlatformException catch (e) { - if (e.code == BarcodeScanner.cameraAccessDenied) { - result = BarcodeScanResult(false, errorType: QRError.cameraError); - } else { - // Unknown error while scanning - result = BarcodeScanResult(false, errorType: QRError.invalidQR); - } - } catch (e) { - // Just in case - result = BarcodeScanResult(false, errorType: QRError.invalidQR); - } - - return result; - } -} - -class BarcodeScanResult { - final bool isSuccess; - final QRError? errorType; - final String? result; - - BarcodeScanResult(this.isSuccess, {this.errorType = null, this.result = null}); -} - -enum QRError { invalidQR, cameraError, cancelled } diff --git a/apps/flutter_parent/lib/screens/qr_login/qr_login_util.dart b/apps/flutter_parent/lib/screens/qr_login/qr_login_util.dart deleted file mode 100644 index 7d36404e08..0000000000 --- a/apps/flutter_parent/lib/screens/qr_login/qr_login_util.dart +++ /dev/null @@ -1,65 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:flutter/material.dart'; -import 'package:flutter_parent/l10n/app_localizations.dart'; -import 'package:flutter_parent/network/utils/analytics.dart'; -import 'package:flutter_parent/router/panda_router.dart'; -import 'package:flutter_parent/utils/quick_nav.dart'; -import 'package:flutter_parent/utils/service_locator.dart'; - -class QRLoginUtil { - launchQRTutorial(BuildContext context) { - showModalBottomSheet( - context: context, - isScrollControlled: true, - builder: (context) { - return ListView( - padding: EdgeInsets.symmetric(vertical: 20, horizontal: 16), - shrinkWrap: true, - children: [ - Text(L10n(context).qrLoginSelect, style: Theme.of(context).textTheme.bodySmall), - SizedBox(height: 12), - _login(context), - _createAccount(context), - ], - ); - }, - ); - } - - Widget _login(BuildContext context) { - return ListTile( - title: Text(L10n(context).qrLoginHaveAccount), - contentPadding: EdgeInsets.symmetric(vertical: 10), - onTap: () async { - Navigator.of(context).pop(); - locator().logEvent(AnalyticsEventConstants.QR_LOGIN_CLICKED); - locator().pushRoute(context, PandaRouter.qrTutorial()); - }, - ); - } - - Widget _createAccount(BuildContext context) { - return ListTile( - title: Text(L10n(context).qrLoginNewAccount), - contentPadding: EdgeInsets.symmetric(vertical: 10), - onTap: () async { - Navigator.of(context).pop(); - locator().logEvent(AnalyticsEventConstants.QR_ACCOUNT_CREATION_CLICKED); - locator().pushRoute(context, PandaRouter.qrPairing(isCreatingAccount: true)); - }, - ); - } -} diff --git a/apps/flutter_parent/lib/screens/remote_config/remote_config_interactor.dart b/apps/flutter_parent/lib/screens/remote_config/remote_config_interactor.dart deleted file mode 100644 index 39c6fa40df..0000000000 --- a/apps/flutter_parent/lib/screens/remote_config/remote_config_interactor.dart +++ /dev/null @@ -1,26 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:flutter_parent/utils/remote_config_utils.dart'; - -class RemoteConfigInteractor { - - Map getRemoteConfigParams() { - return Map.fromIterable(RemoteConfigParams.values, key: (rc) => rc, value: (rc) => RemoteConfigUtils.getStringValue(rc)); - } - - void updateRemoteConfig(RemoteConfigParams rcKey, String value) { - RemoteConfigUtils.updateRemoteConfig(rcKey, value); - } -} \ No newline at end of file diff --git a/apps/flutter_parent/lib/screens/remote_config/remote_config_screen.dart b/apps/flutter_parent/lib/screens/remote_config/remote_config_screen.dart deleted file mode 100644 index 6100c40408..0000000000 --- a/apps/flutter_parent/lib/screens/remote_config/remote_config_screen.dart +++ /dev/null @@ -1,72 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:flutter/material.dart'; -import 'package:flutter_parent/screens/remote_config/remote_config_interactor.dart'; -import 'package:flutter_parent/utils/remote_config_utils.dart'; -import 'package:flutter_parent/utils/service_locator.dart'; - -class RemoteConfigScreen extends StatefulWidget { - @override - _RemoteConfigScreenState createState() => _RemoteConfigScreenState(); -} - -class _RemoteConfigScreenState extends State { - RemoteConfigInteractor _interactor = locator(); - - late Map _remoteConfig; - - @override - void initState() { - _remoteConfig = _interactor.getRemoteConfigParams(); - super.initState(); - } - - @override - Widget build(BuildContext context) { - return Scaffold( - appBar: AppBar(title: Text('Remote Config Params')), - body: Padding( - padding: const EdgeInsets.all(8.0), - child: ListView( - key: Key('remote_config_params_list'), - children: _createListItems(_remoteConfig), - ), - ), - ); - } - - List _createListItems(Map remoteConfigParams) { - return remoteConfigParams.entries.map((e) => _createListItem(e)).toList(); - } - - Widget _createListItem(MapEntry entry) { - return Row(children: [ - Align( - child: Text(RemoteConfigUtils.getRemoteConfigName(entry.key)), - alignment: Alignment.centerLeft, - ), - Flexible( - child: Padding( - padding: EdgeInsets.only(left: 8.0), - child: TextField( - controller: TextEditingController()..text = entry.value, - onChanged: (value) => { - _interactor.updateRemoteConfig(entry.key, value) - }, - ), - )) - ]); - } -} diff --git a/apps/flutter_parent/lib/screens/settings/legal_screen.dart b/apps/flutter_parent/lib/screens/settings/legal_screen.dart deleted file mode 100644 index 90323f5401..0000000000 --- a/apps/flutter_parent/lib/screens/settings/legal_screen.dart +++ /dev/null @@ -1,79 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -import 'package:flutter/material.dart'; -import 'package:flutter_parent/l10n/app_localizations.dart'; -import 'package:flutter_parent/router/panda_router.dart'; -import 'package:flutter_parent/utils/design/canvas_icons.dart'; -import 'package:flutter_parent/utils/design/parent_theme.dart'; -import 'package:flutter_parent/utils/quick_nav.dart'; -import 'package:flutter_parent/utils/service_locator.dart'; -import 'package:flutter_parent/utils/url_launcher.dart'; - -class LegalScreen extends StatelessWidget { - @override - Widget build(BuildContext context) { - final l10n = L10n(context); - return DefaultParentTheme( - builder: (context) => Scaffold( - appBar: AppBar( - title: Text(l10n.helpLegalLabel), - bottom: ParentTheme.of(context)?.appBarDivider(shadowInLightMode: false), - ), - body: ListView( - children: [ - _LegalRow( - label: l10n.privacyPolicy, - onTap: () => locator().launch('https://www.instructure.com/policies/product-privacy-policy'), - icon: CanvasIcons.admin, - ), - _LegalRow( - label: L10n(context).termsOfUse, - icon: CanvasIcons.document, - onTap: () => locator().pushRoute(context, PandaRouter.termsOfUse()), - ), - _LegalRow( - label: l10n.canvasOnGithub, - icon: CanvasIcons.github, - onTap: () => locator().launch('https://github.com/instructure/canvas-android'), - ), - ], - ), - ), - ); - } -} - -class _LegalRow extends StatelessWidget { - final String label; - final VoidCallback onTap; - final IconData icon; - - const _LegalRow({ required this.label, required this.onTap, required this.icon, super.key}); - - @override - Widget build(BuildContext context) { - final textTheme = Theme.of(context).textTheme; - - return ListTile( - title: Row( - children: [ - Icon(icon, color: Theme.of(context).colorScheme.secondary, size: 20), - SizedBox(width: 20), - Expanded(child: Text(label, style: textTheme.titleMedium)), - ], - ), - onTap: onTap, - ); - } -} diff --git a/apps/flutter_parent/lib/screens/settings/settings_interactor.dart b/apps/flutter_parent/lib/screens/settings/settings_interactor.dart deleted file mode 100644 index 8f92fb9995..0000000000 --- a/apps/flutter_parent/lib/screens/settings/settings_interactor.dart +++ /dev/null @@ -1,111 +0,0 @@ -// Copyright (C) 2019 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:flutter/material.dart'; -import 'package:flutter_parent/l10n/app_localizations.dart'; -import 'package:flutter_parent/network/utils/analytics.dart'; -import 'package:flutter_parent/network/utils/api_prefs.dart'; -import 'package:flutter_parent/screens/remote_config/remote_config_screen.dart'; -import 'package:flutter_parent/utils/debug_flags.dart'; -import 'package:flutter_parent/utils/design/parent_theme.dart'; -import 'package:flutter_parent/utils/design/theme_transition/theme_transition_target.dart'; -import 'package:flutter_parent/utils/quick_nav.dart'; -import 'package:flutter_parent/utils/service_locator.dart'; -import 'package:flutter_svg/flutter_svg.dart'; -import 'package:package_info_plus/package_info_plus.dart'; - -import '../../router/panda_router.dart'; -import '../theme_viewer_screen.dart'; - -class SettingsInteractor { - bool isDebugMode() => DebugFlags.isDebug; - - void routeToThemeViewer(BuildContext context) { - locator().push(context, ThemeViewerScreen()); - } - - void routeToRemoteConfig(BuildContext context) { - locator().push(context, RemoteConfigScreen()); - } - - void routeToLegal(BuildContext context) { - locator().pushRoute(context, PandaRouter.legal()); - } - - void toggleDarkMode(BuildContext context, GlobalKey>? anchorKey) { - if (ParentTheme.of(context)?.isDarkMode == true) { - locator().logEvent(AnalyticsEventConstants.DARK_MODE_OFF); - } else { - locator().logEvent(AnalyticsEventConstants.DARK_MODE_ON); - } - ThemeTransitionTarget.toggleDarkMode(context, anchorKey); - } - - void toggleHCMode(context) { - if (ParentTheme.of(context)?.isHC == true) { - locator().logEvent(AnalyticsEventConstants.HC_MODE_OFF); - } else { - locator().logEvent(AnalyticsEventConstants.HC_MODE_ON); - } - ParentTheme.of(context)?.toggleHC(); - } - - void showAboutDialog(context) { - showDialog( - context: context, - builder: (context) => AlertDialog( - title: Text(L10n(context).about), - content: FutureBuilder( - future: PackageInfo.fromPlatform(), - builder: - (BuildContext context, AsyncSnapshot snapshot) { - return SingleChildScrollView( - child: Column( - crossAxisAlignment: CrossAxisAlignment.stretch, - mainAxisSize: MainAxisSize.min, - children: [ - Text(L10n(context).aboutAppTitle, - style: TextStyle(fontSize: 16)), - Text(snapshot.data!.appName, style: TextStyle(fontSize: 14)), - SizedBox(height: 24), - Text(L10n(context).aboutDomainTitle, - style: TextStyle(fontSize: 16)), - Text(ApiPrefs.getDomain() ?? '', style: TextStyle(fontSize: 14)), - SizedBox(height: 24), - Text(L10n(context).aboutLoginIdTitle, - style: TextStyle(fontSize: 16)), - Text(ApiPrefs.getUser()?.loginId ?? '', - style: TextStyle(fontSize: 14)), - SizedBox(height: 24), - Text(L10n(context).aboutEmailTitle, - style: TextStyle(fontSize: 16)), - Text(ApiPrefs.getUser()?.primaryEmail ?? '', - style: TextStyle(fontSize: 14)), - SizedBox(height: 24), - Text(L10n(context).aboutVersionTitle, - style: TextStyle(fontSize: 16)), - Text(snapshot.data!.version, style: TextStyle(fontSize: 14)), - SizedBox(height: 32), - SvgPicture.asset( - 'assets/svg/ic_instructure_logo.svg', - alignment: Alignment.bottomCenter, - semanticsLabel: L10n(context).aboutLogoSemanticsLabel, - ) - ], - ), - ); - }, - ))); - } -} diff --git a/apps/flutter_parent/lib/screens/settings/settings_screen.dart b/apps/flutter_parent/lib/screens/settings/settings_screen.dart deleted file mode 100644 index cb4ab4f9b2..0000000000 --- a/apps/flutter_parent/lib/screens/settings/settings_screen.dart +++ /dev/null @@ -1,238 +0,0 @@ -// Copyright (C) 2019 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:flutter/material.dart'; -import 'package:flutter_parent/l10n/app_localizations.dart'; -import 'package:flutter_parent/network/utils/analytics.dart'; -import 'package:flutter_parent/screens/settings/settings_interactor.dart'; -import 'package:flutter_parent/utils/design/parent_theme.dart'; -import 'package:flutter_parent/utils/design/theme_transition/theme_transition_target.dart'; -import 'package:flutter_parent/utils/service_locator.dart'; -import 'package:flutter_svg/svg.dart'; - -class SettingsScreen extends StatefulWidget { - @override - _SettingsScreenState createState() => _SettingsScreenState(); -} - -class _SettingsScreenState extends State { - var _lightModeKey = GlobalKey(); - var _darkModeKey = GlobalKey(); - Key _highContrastModeKey = GlobalKey(); - - SettingsInteractor _interactor = locator(); - - @override - Widget build(BuildContext context) { - return ThemeTransitionTarget( - child: DefaultParentTheme( - builder: (context) => Scaffold( - appBar: AppBar( - title: Text(L10n(context).settings, style: Theme.of(context).textTheme.titleLarge), - bottom: ParentTheme.of(context)?.appBarDivider(shadowInLightMode: false), - ), - body: ListView( - children: [ - Container( - child: ListTile( - title: Text(L10n(context).theme, style: Theme.of(context).textTheme.bodyMedium), - ), - ), - _themeButtons(context), - SizedBox(height: 16), - if (ParentTheme.of(context)?.isDarkMode == true) - _webViewDarkModeSwitch(context), - _highContrastModeSwitch(context), - _about(context), - _legal(context), - if (_interactor.isDebugMode()) _themeViewer(context), - if (_interactor.isDebugMode()) _remoteConfigs(context) - ], - ), - ), - ), - ); - } - - Widget _themeButtons(BuildContext context) { - return Padding( - padding: EdgeInsets.zero, - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceEvenly, - children: [ - _themeOption( - anchorKey: _lightModeKey, - buttonKey: Key('light-mode-button'), - context: context, - selected: ParentTheme.of(context)?.isDarkMode == false, - semanticsLabel: L10n(context).lightModeLabel, - child: SvgPicture.asset( - 'assets/svg/panda-light-mode.svg', - excludeFromSemantics: - true, // Semantic label is set in _themeOption() - ), - ), - _themeOption( - anchorKey: _darkModeKey, - buttonKey: Key('dark-mode-button'), - context: context, - selected: ParentTheme.of(context)?.isDarkMode == true, - semanticsLabel: L10n(context).darkModeLabel, - child: SvgPicture.asset( - 'assets/svg/panda-dark-mode.svg', - excludeFromSemantics: - true, // Semantic label is set in _themeOption() - ), - ), - ], - ), - ); - } - - Widget _themeOption({ - GlobalKey? anchorKey, - Key? buttonKey, - required BuildContext context, - required bool selected, - String? semanticsLabel, - required Widget child, - }) { - double size = 140; - return Semantics( - selected: selected, - label: semanticsLabel, - inMutuallyExclusiveGroup: true, - button: true, - child: Container( - key: anchorKey, - width: size, - height: size, - padding: EdgeInsets.all(5), - foregroundDecoration: selected - ? BoxDecoration( - borderRadius: BorderRadius.circular(100), - border: - Border.all(color: Theme.of(context).colorScheme.secondary, width: 2), - ) - : null, - child: ClipRRect( - borderRadius: BorderRadius.circular(100), - child: Stack( - children: [ - child, - Material( - type: MaterialType.transparency, - child: InkWell( - key: buttonKey, - onTap: selected - ? null - : () => _interactor.toggleDarkMode(context, anchorKey), - ), - ) - ], - ), - ), - ), - ); - } - - Widget _webViewDarkModeSwitch(BuildContext context) { - return MergeSemantics( - child: ListTile( - title: Text(L10n(context).webViewDarkModeLabel, style: Theme.of(context).textTheme.bodyMedium), - trailing: Switch( - value: ParentTheme.of(context)?.isWebViewDarkMode == true, - onChanged: (_) => _toggleWebViewDarkMode(context), - materialTapTargetSize: MaterialTapTargetSize.shrinkWrap, - ), - onTap: () => _toggleWebViewDarkMode(context), - ), - ); - } - - _toggleWebViewDarkMode(BuildContext context) { - if (ParentTheme.of(context)?.isWebViewDarkMode == true) { - locator().logEvent(AnalyticsEventConstants.DARK_WEB_MODE_OFF); - } else { - locator().logEvent(AnalyticsEventConstants.DARK_WEB_MODE_ON); - } - ParentTheme.of(context)?.toggleWebViewDarkMode(); - } - - Widget _highContrastModeSwitch(BuildContext context) { - return MergeSemantics( - child: ListTile( - title: Text(L10n(context).highContrastLabel, style: Theme.of(context).textTheme.bodyMedium), - trailing: Switch( - key: _highContrastModeKey, - value: ParentTheme.of(context)?.isHC == true, - onChanged: (_) => _onHighContrastModeChanged(context), - materialTapTargetSize: MaterialTapTargetSize.shrinkWrap, - ), - onTap: () => _onHighContrastModeChanged(context), - ), - ); - } - - _onHighContrastModeChanged(BuildContext context) { - _interactor.toggleHCMode(context); - } - - Widget _about(BuildContext context) => ListTile( - key: Key('about'), - title: Row( - children: [Text(L10n(context).about, style: Theme.of(context).textTheme.bodyMedium)], - ), - onTap: () => _interactor.showAboutDialog(context)); - - Widget _legal(BuildContext context) => ListTile( - title: Text(L10n(context).helpLegalLabel, style: Theme.of(context).textTheme.bodyMedium), - onTap: () => _interactor.routeToLegal(context)); - - Widget _themeViewer(BuildContext context) => ListTile( - key: Key('theme-viewer'), - title: Row( - children: [ - _debugLabel(context), - SizedBox(width: 16), - Text('Theme Viewer', style: Theme.of(context).textTheme.bodyMedium), // Not shown in release mode, not translated - ], - ), - onTap: () => _interactor.routeToThemeViewer(context), - ); - - Widget _remoteConfigs(BuildContext context) => ListTile( - key: Key('remote-configs'), - title: Row( - children: [ - _debugLabel(context), - SizedBox(width: 16), - Text('Remote Config Params', style: Theme.of(context).textTheme.bodyMedium) - ], - ), - onTap: () => _interactor.routeToRemoteConfig(context), - ); - - Container _debugLabel(BuildContext context) { - return Container( - decoration: BoxDecoration( - color: Theme.of(context).colorScheme.secondary, - borderRadius: BorderRadius.circular(32), - ), - padding: const EdgeInsets.all(4), - child: Icon(Icons.bug_report, - color: Theme.of(context).colorScheme.secondary, size: 16), - ); - } -} diff --git a/apps/flutter_parent/lib/screens/splash/splash_screen.dart b/apps/flutter_parent/lib/screens/splash/splash_screen.dart deleted file mode 100644 index d682b3ab48..0000000000 --- a/apps/flutter_parent/lib/screens/splash/splash_screen.dart +++ /dev/null @@ -1,227 +0,0 @@ -// Copyright (C) 2019 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'dart:math'; -import 'dart:ui'; - -import 'package:flutter/material.dart'; -import 'package:flutter_parent/l10n/app_localizations.dart'; -import 'package:flutter_parent/network/utils/api_prefs.dart'; -import 'package:flutter_parent/router/panda_router.dart'; -import 'package:flutter_parent/screens/splash/splash_screen_interactor.dart'; -import 'package:flutter_parent/utils/common_widgets/canvas_loading_indicator.dart'; -import 'package:flutter_parent/utils/common_widgets/masquerade_ui.dart'; -import 'package:flutter_parent/utils/quick_nav.dart'; -import 'package:flutter_parent/utils/service_locator.dart'; - -class SplashScreen extends StatefulWidget { - final String? qrLoginUrl; - - SplashScreen({this.qrLoginUrl, super.key}); - - @override - _SplashScreenState createState() => _SplashScreenState(); -} - -class _SplashScreenState extends State with SingleTickerProviderStateMixin { - Future? _dataFuture; - Future? _cameraFuture; - - // Controller and animation used on the loading indicator for the 'zoom out' effect immediately before routing - late AnimationController _controller; - late Animation _animation; - late String _route; - - @override - void initState() { - super.initState(); - _controller = AnimationController(vsync: this, duration: const Duration(milliseconds: 300)); - _animation = CurvedAnimation(parent: _controller, curve: Curves.easeInBack); - _animation.addListener(_animationListener); - } - - @override - Widget build(BuildContext context) { - if (!ApiPrefs.isLoggedIn() && widget.qrLoginUrl == null) { - // If they aren't logged in or logging in with QR, route to login screen - if (_cameraFuture == null) { - _cameraFuture = locator().getCameraCount(); - } - - return FutureBuilder( - future: _cameraFuture, - builder: (BuildContext context, AsyncSnapshot snapshot) { - if (snapshot.hasData || snapshot.hasError) { - // Even if the camera count fails, we don't want to trap the user on splash - _navigate(PandaRouter.login()); - } - - return _defaultBody(context); - }); - } else { - if (_dataFuture == null) { - _dataFuture = locator().getData(qrLoginUrl: widget.qrLoginUrl); - } - - return Scaffold( - backgroundColor: Theme.of(context).primaryColor, - body: FutureBuilder( - future: _dataFuture, - builder: (BuildContext context, AsyncSnapshot snapshot) { - if (snapshot.hasData) { - if (snapshot.data!.isObserver || snapshot.data!.canMasquerade) { - _navigateToDashboardOrAup(); - } else { - // User is not an observer and cannot masquerade. Show the not-a-parent screen. - _navigate(PandaRouter.notParent()); - } - } else if (snapshot.hasError) { - if (snapshot.error is QRLoginError) { - WidgetsBinding.instance - .addPostFrameCallback((_) => Navigator.pop(context, L10n(context).loginWithQRCodeError)); - } else { - // On error, proceed without pre-fetched student list - _navigateToDashboardOrAup(); - } - } - return Container( - child: Center( - child: ScaleTransition( - scale: Tween(begin: 1.0, end: 0.0).animate(_animation), - child: const CanvasLoadingIndicator()), - ), - ); - }, - ), - ); - } - } - - Widget _defaultBody(BuildContext cont) { - return Scaffold( - backgroundColor: Theme.of(context).primaryColor, - body: Container( - child: Center( - child: ScaleTransition( - scale: Tween(begin: 1.0, end: 0.0).animate(_animation), child: const CanvasLoadingIndicator()), - ), - )); - } - - _navigate(String route) { - MasqueradeUI.of(context)?.refresh(); - _route = route; - _controller.forward(); // Start the animation, we'll navigate when it finishes - } - - _navigateToDashboardOrAup() { - locator() - .isTermsAcceptanceRequired() - .then((aupRequired) => { - if (aupRequired == true) { - _navigate(PandaRouter.aup()) - } - else { - _navigate(PandaRouter.dashboard()) - } - }); - } - - _animationListener() { - if (_animation.status == AnimationStatus.completed) { - // Use a custom page route for the circle reveal animation - locator().pushRouteWithCustomTransition( - context, - _route, - true, - Duration(milliseconds: 500), - ( - context, - animation, - secondaryAnimation, - child, - ) { - return ScaleTransition( - scale: Tween( - begin: 2.0, - end: 1.0, - ).animate(CurvedAnimation( - parent: animation, - curve: Curves.easeOutQuad, - )), - child: _CircleClipTransition( - child: child, - scale: Tween( - begin: 0.0, - end: 1.0, - ).animate(CurvedAnimation( - parent: animation, - curve: Curves.easeInExpo, - )), - ), - ); - }, - ); - } - } - - @override - void dispose() { - _controller.dispose(); - super.dispose(); - } -} - -class _CircleClipTransition extends AnimatedWidget { - const _CircleClipTransition({ - required Animation scale, - this.child, - super.key - }) : super(listenable: scale); - - Animation get animation => listenable as Animation; - - final Widget? child; - - @override - Widget build(BuildContext context) { - return AnimatedBuilder( - animation: animation, - builder: (context, _) => ClipPath( - clipper: _CircleClipper(animation.value), - child: child, - ), - ); - } -} - -class _CircleClipper extends CustomClipper { - final double animationValue; - - _CircleClipper(this.animationValue); - - @override - Path getClip(Size size) { - return Path() - ..addOval( - Rect.fromCircle( - center: size.center(Offset.zero), - radius: animationValue * sqrt(pow(size.width, 2) + pow(size.height, 2)) / 2, - ), - ); - } - - @override - bool shouldReclip(CustomClipper oldClipper) => true; -} diff --git a/apps/flutter_parent/lib/screens/splash/splash_screen_interactor.dart b/apps/flutter_parent/lib/screens/splash/splash_screen_interactor.dart deleted file mode 100644 index 906278f7d5..0000000000 --- a/apps/flutter_parent/lib/screens/splash/splash_screen_interactor.dart +++ /dev/null @@ -1,164 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:flutter_parent/models/canvas_token.dart'; -import 'package:flutter_parent/models/login.dart'; -import 'package:flutter_parent/models/mobile_verify_result.dart'; -import 'package:flutter_parent/network/api/accounts_api.dart'; -import 'package:flutter_parent/network/api/auth_api.dart'; -import 'package:flutter_parent/network/api/oauth_api.dart'; -import 'package:flutter_parent/network/api/user_api.dart'; -import 'package:flutter_parent/network/utils/analytics.dart'; -import 'package:flutter_parent/network/utils/api_prefs.dart'; -import 'package:flutter_parent/network/utils/dio_config.dart'; -import 'package:flutter_parent/screens/dashboard/dashboard_interactor.dart'; -import 'package:flutter_parent/screens/masquerade/masquerade_screen_interactor.dart'; -import 'package:flutter_parent/utils/db/user_colors_db.dart'; -import 'package:flutter_parent/utils/features_utils.dart'; -import 'package:flutter_parent/utils/qr_utils.dart'; -import 'package:flutter_parent/utils/service_locator.dart'; -import 'package:flutter_parent/utils/veneers/barcode_scan_veneer.dart'; - -class SplashScreenInteractor { - Future getData({String? qrLoginUrl}) async { - if (qrLoginUrl != null) { - // Double check the loginUrl - final qrLoginUri = QRUtils.verifySSOLogin(qrLoginUrl); - if (qrLoginUri == null) { - locator().logEvent(AnalyticsEventConstants.QR_LOGIN_FAILURE); - return Future.error(QRLoginError()); - } else { - final qrSuccess = await _performSSOLogin(qrLoginUri); - // Error out if the login fails, otherwise continue - if (!qrSuccess) { - locator().logEvent( - AnalyticsEventConstants.QR_LOGIN_FAILURE, - extras: {AnalyticsParamConstants.DOMAIN_PARAM: qrLoginUri.host}, - ); - return Future.error(QRLoginError()); - } else { - locator().logEvent( - AnalyticsEventConstants.QR_LOGIN_SUCCESS, - extras: {AnalyticsParamConstants.DOMAIN_PARAM: qrLoginUri.host}, - ); - } - } - } - - // Use same call as the dashboard so results will be cached - var students = await locator().getStudents(forceRefresh: true); - var isObserver = students?.isNotEmpty ?? false; - - // Check for masquerade permissions if we haven't already - if (ApiPrefs.getCurrentLogin()?.canMasquerade == null) { - if (ApiPrefs.getDomain()?.contains(MasqueradeScreenInteractor.siteAdminDomain) == true) { - ApiPrefs.updateCurrentLogin((b) => b..canMasquerade = true); - } else { - try { - var permissions = await locator().getAccountPermissions(); - ApiPrefs.updateCurrentLogin((b) => b..canMasquerade = permissions?.becomeUser); - } catch (e) { - ApiPrefs.updateCurrentLogin((b) => b..canMasquerade = false); - } - } - } - - SplashScreenData data = SplashScreenData(isObserver, ApiPrefs.getCurrentLogin()?.canMasquerade == true); - - if (data.isObserver || data.canMasquerade) await updateUserColors(); - - await FeaturesUtils.checkUsageMetricFeatureFlag(); - - return data; - } - - Future updateUserColors() async { - var colors = await locator().getUserColors(refresh: true); - if (colors == null) return; - await locator().insertOrUpdateAll(ApiPrefs.getDomain(), ApiPrefs.getUser()?.id, colors); - } - - Future getCameraCount() async { - if (ApiPrefs.getCameraCount() == null) { - int cameraCount = await locator().getNumberOfCameras(); - await ApiPrefs.setCameraCount(cameraCount); - return cameraCount; - } else { - return ApiPrefs.getCameraCount() ?? 0; - } - } - - Future _performSSOLogin(Uri qrLoginUri) async { - final domain = qrLoginUri.queryParameters[QRUtils.QR_DOMAIN] ?? ''; - final oAuthCode = qrLoginUri.queryParameters[QRUtils.QR_AUTH_CODE] ?? ''; - - final mobileVerifyResult = await locator().mobileVerify(domain); - - if (mobileVerifyResult?.result != VerifyResultEnum.success) { - return Future.value(false); - } - - CanvasToken? tokenResponse; - try { - tokenResponse = await locator().getTokens(mobileVerifyResult, oAuthCode); - } catch (e) { - return Future.value(false); - } - - // Key here is that realUser represents a masquerading attempt - var isMasquerading = tokenResponse?.realUser != null; - Login login = Login((b) => b - ..accessToken = tokenResponse?.accessToken - ..refreshToken = tokenResponse?.refreshToken - ..domain = mobileVerifyResult?.baseUrl - ..clientId = mobileVerifyResult?.clientId - ..clientSecret = mobileVerifyResult?.clientSecret - ..masqueradeUser = isMasquerading ? tokenResponse?.user?.toBuilder() : null - ..masqueradeDomain = isMasquerading ? mobileVerifyResult?.baseUrl : null - ..isMasqueradingFromQRCode = isMasquerading ? true : null - ..canMasquerade = isMasquerading ? true : null - ..user = tokenResponse?.user?.toBuilder()); - - ApiPrefs.addLogin(login); - ApiPrefs.switchLogins(login); - await DioConfig().clearCache(); - - return Future.value(true); - } - - Future _requiresTermsAcceptance(String targetUrl) async { - return (await locator.get().getAuthenticatedUrl(targetUrl))?.requiresTermsAcceptance; - } - - Future isTermsAcceptanceRequired() async { - final targetUrl = '${ApiPrefs.getCurrentLogin()?.domain}/users/self'; - String? domain = ApiPrefs.getDomain(); - if (domain == null) { - return false; - } else if (targetUrl.contains(domain)) { - return _requiresTermsAcceptance(targetUrl); - } else { - return false; - } - } -} - -class SplashScreenData { - final bool isObserver; - final bool canMasquerade; - - SplashScreenData(this.isObserver, this.canMasquerade); -} - -class QRLoginError {} diff --git a/apps/flutter_parent/lib/screens/theme_viewer_screen.dart b/apps/flutter_parent/lib/screens/theme_viewer_screen.dart deleted file mode 100644 index 475a8ec268..0000000000 --- a/apps/flutter_parent/lib/screens/theme_viewer_screen.dart +++ /dev/null @@ -1,444 +0,0 @@ -// Copyright (C) 2019 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:flutter/material.dart'; -import 'package:flutter_parent/utils/design/canvas_icons.dart'; -import 'package:flutter_parent/utils/design/canvas_icons_solid.dart'; -import 'package:flutter_parent/utils/design/parent_colors.dart'; -import 'package:flutter_parent/utils/design/parent_theme.dart'; -import 'package:flutter_parent/utils/design/student_color_set.dart'; - -/// A screen for viewing and configuring the app theme. This will not be a user-facing screen so -/// the Strings used here will not be translated. -class ThemeViewerScreen extends StatefulWidget { - static final GlobalKey scaffoldKey = GlobalKey(); - static final Key studentColorKey = Key('student-color'); - - @override - _ThemeViewerScreenState createState() => _ThemeViewerScreenState(); -} - -class _ThemeViewerScreenState extends State { - bool _allToggle = true; - - _toggleAll() { - setState(() => _allToggle = !_allToggle); - } - - Map getStyles(TextTheme theme) => { - 'subtitle2 / caption': theme.titleSmall, - 'overline / subhead': theme.labelSmall, - 'bodyText2 / body': theme.bodyMedium, - 'caption / subtitle': theme.bodySmall, - 'subtitle1 / title': theme.titleMedium, - 'headline5 / heading': theme.headlineSmall, - 'headline4 / display': theme.headlineMedium, - 'button / -': theme.labelLarge, - 'bodyText1 / -': theme.bodyLarge, - 'headline6 / -': theme.titleLarge, - 'headline3 / -': theme.displaySmall, - 'headline2 / -': theme.displayMedium, - 'headline1 / -': theme.displayLarge, - }; - - @override - Widget build(BuildContext context) { - return DefaultTabController( - length: 3, - child: Scaffold( - key: ThemeViewerScreen.scaffoldKey, - drawer: Drawer( - child: Container( - color: Theme.of(context).scaffoldBackgroundColor, - child: SafeArea( - child: ListView( - children: [ - DrawerHeader( - child: ListView( - children: [ - Align( - alignment: Alignment.centerLeft, - child: Container( - key: ThemeViewerScreen.studentColorKey, - width: 48, - height: 48, - color: Theme.of(context).colorScheme.secondary, - ) - ), - Text('Theme configuration', style: Theme.of(context).textTheme.titleLarge), - Text('Play around with some values', style: Theme.of(context).textTheme.bodySmall), - ], - ), - ), - ..._drawerContents(context), - ], - ), - ), - ), - ), - appBar: AppBar( - title: Column( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text('Theme Viewer'), - Text('View all the things', style: Theme.of(context).primaryTextTheme.bodySmall), - ], - ), - actions: [ - IconButton(icon: Icon(CanvasIcons.email), onPressed: () {}), - IconButton(icon: Icon(CanvasIcons.search), onPressed: () {}), - ], - bottom: ParentTheme.of(context)?.appBarDivider( - bottom: TabBar( - indicatorColor: Theme.of(context).primaryIconTheme.color, - tabs: [ - Tab(text: 'Widgets'), - Tab(text: 'Text Styles'), - Tab(text: 'Icons'), - ], - ), - ), - ), - body: Container( - child: TabBarView( - children: [ - _content(context), - _textStyles(context), - _icons(context), - ], - ), - ), - floatingActionButton: FloatingActionButton( - child: Icon(CanvasIconsSolid.chat), - onPressed: () {}, - ), - bottomNavigationBar: Builder( - builder: (context) { - int selectedIdx = 1; - return StatefulBuilder( - builder: (context, setState) => Column( - mainAxisSize: MainAxisSize.min, - children: [ - Divider(height: 0.5, thickness: 0.5), - BottomNavigationBar( - backgroundColor: Theme.of(context).scaffoldBackgroundColor, - unselectedItemColor: Theme.of(context).textTheme.bodySmall?.color, - onTap: (value) => setState(() => selectedIdx = value), // new - currentIndex: selectedIdx, // new - items: [ - new BottomNavigationBarItem( - icon: Icon(CanvasIcons.courses), - label: 'Courses', - ), - new BottomNavigationBarItem( - icon: Icon(CanvasIcons.calendar_month), - label: 'Calendar', - ), - new BottomNavigationBarItem( - icon: Icon(CanvasIcons.alerts), - label: 'Alerts', - ), - ], - ), - ], - ), - ); - }, - ), - ), - ); - } - - List _drawerContents(BuildContext context) { - var selectedColorSet = ParentTheme.of(context)!.studentColorSet; - var colorIndex = StudentColorSet.all.indexOf(selectedColorSet); - if (colorIndex == -1) colorIndex = 0; - return [ - Padding( - padding: const EdgeInsets.symmetric(horizontal: 16), - child: DropdownButton( - hint: Text('Tralala'), - value: colorIndex, - onChanged: (index) => ParentTheme.of(context)?.setSelectedStudent(index.toString()), - isExpanded: true, - items: StudentColorSet.all - .asMap() - .entries - .map( - (it) => DropdownMenuItem( - value: it.key, - child: Row( - mainAxisSize: MainAxisSize.max, - children: [ - Container( - width: 12, - height: 12, - color: ParentTheme.of(context)?.getColorVariantForCurrentState(it.value), - ), - SizedBox(width: 8), - Flexible(child: Text('Student Color ${it.key + 1}')), - ], - ), - ), - ) - .toList(), - ), - ), - SwitchListTile( - title: Text('Dark Mode', style: Theme.of(context).textTheme.bodyMedium), - subtitle: Text('Subtitle'), - value: ParentTheme.of(context)?.isDarkMode == true, - onChanged: (_) => ParentTheme.of(context)?.toggleDarkMode(), - ), - SwitchListTile( - title: Text('High Contrast Mode', style: Theme.of(context).textTheme.bodyMedium), - value: ParentTheme.of(context)?.isHC == true, - onChanged: (_) => ParentTheme.of(context)?.toggleHC(), - ), - ]; - } - - Widget _content(BuildContext context) { - var swatch = ParentColors.makeSwatch(ParentTheme.of(context)!.studentColor); - return ListView( - children: [ - AppBar( - iconTheme: Theme.of(context).iconTheme, - backgroundColor: Theme.of(context).scaffoldBackgroundColor, - title: Column( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text('Inverse AppBar'), - Text('Inbox, creating/editing, etc', style: Theme.of(context).textTheme.bodySmall), - ], - ), - actions: [ - IconButton(icon: Icon(CanvasIcons.email), onPressed: () {}), - IconButton(icon: Icon(CanvasIcons.search), onPressed: () {}), - ], - ), - Padding( - padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 16), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - for (var i = 0; i <= 900; i += 100) - Material( - elevation: 1, - child: Container( - color: swatch[i == 0 ? 50 : i], - width: 24, - height: 24, - child: Center( - child: Text( - i == 0 ? '50' : i.toString(), - style: TextStyle( - fontSize: 8, - color: (swatch[i == 0 ? 50 : i]?.computeLuminance() ?? 0) > 0.5 ? Colors.black : Colors.white), - ), - ), - ), - ), - ], - ), - ), - Divider(), - Padding( - padding: const EdgeInsets.all(16), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Padding( - padding: const EdgeInsets.only(bottom: 4), - child: Text('Essay: The Rocky Planet', style: Theme.of(context).textTheme.headlineMedium), - ), - Row( - children: [ - Text('100 pts', style: Theme.of(context).textTheme.bodySmall), - Padding( - padding: const EdgeInsets.only(left: 12, right: 4), - child: Icon(Icons.check_circle, size: 20, color: ParentTheme.of(context)?.successColor), - ), - Text('Submitted', - style: Theme.of(context).textTheme.bodySmall?.apply(color: ParentTheme.of(context)?.successColor)), - ], - ), - ], - ), - ), - Divider(), - Padding( - padding: const EdgeInsets.fromLTRB(16, 8, 16, 8), - child: Text('Default Text Style'), - ), - Divider(), - Padding( - padding: const EdgeInsets.symmetric(horizontal: 16), - child: Text('Due', style: Theme.of(context).textTheme.labelSmall), - ), - Padding( - padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 8), - child: Text('April 1 at 11:59pm', style: Theme.of(context).textTheme.titleMedium), - ), - Divider(), - SwitchListTile( - title: Text('SubHead'), - subtitle: Text('Caption'), - value: _allToggle, - onChanged: (_) => _toggleAll(), - ), - SwitchListTile( - title: Text('Switch (disabled)'), - value: _allToggle, - onChanged: null, - ), - CheckboxListTile( - title: Text('Checkbox'), - value: _allToggle, - onChanged: (_) => _toggleAll(), - ), - CheckboxListTile( - title: Text('Checkbox (disabled)'), - value: _allToggle, - onChanged: null, - ), - Divider(), - Padding( - padding: const EdgeInsets.only(left: 16, top: 16), - child: Text('BIO 102', style: Theme.of(context).textTheme.labelSmall), - ), - ListTile( - title: Text('ListTile Title'), - subtitle: Text('ListTile Subtitle'), - leading: Icon( - Icons.assignment, - color: Theme.of(context).colorScheme.secondary, - ), - ), - Divider(), - Row( - mainAxisAlignment: MainAxisAlignment.spaceEvenly, - children: [ - TextButton( - child: Text('Flat button'), - style: TextButton.styleFrom( - textStyle: TextStyle(color: Theme.of(context).colorScheme.secondary), - ), - onPressed: () {}, - ), - ElevatedButton( - child: Text('Raised Button'), - style: ElevatedButton.styleFrom( - backgroundColor: Theme.of(context).colorScheme.onSecondary, - ), - onPressed: () {}, - ) - ], - ), - Divider(), - Row( - mainAxisAlignment: MainAxisAlignment.spaceEvenly, - children: [ - TextButton( - child: Text('Flat button (disabled)'), - style: TextButton.styleFrom( - textStyle: TextStyle(color: Theme.of(context).colorScheme.secondary), - ), - onPressed: null, - ), - ElevatedButton( - child: Text('Raised Button (disabled)'), - style: ElevatedButton.styleFrom( - backgroundColor: Theme.of(context).colorScheme.onSecondary, - ), - onPressed: null, - ) - ], - ), - Divider(), - ], - ); - } - - Widget _textStyles(BuildContext context) { - var styles = getStyles(Theme.of(context).textTheme).entries.toList(); - return SingleChildScrollView( - child: SingleChildScrollView( - scrollDirection: Axis.horizontal, - child: DataTable( - dataRowHeight: 64, - columnSpacing: 24, - horizontalMargin: 16, - columns: [ - DataColumn(label: Text('Name / design name')), - DataColumn(label: Text('Size')), - DataColumn(label: Text('Weight')), - DataColumn(label: Text('Color')), - DataColumn(label: Text('Example')), - ], - rows: styles.map((entry) { - var name = entry.key; - var style = entry.value; - return DataRow(cells: [ - DataCell(Text(name)), - DataCell(Text(style?.fontSize?.toString() ?? '')), - DataCell(Text(style?.fontWeight?.toString().replaceFirst('FontWeight.w', '') ?? '')), - DataCell(Row( - children: [ - Container( - child: Container( - width: 20, - height: 20, - color: style?.color, - ), - //color: bgColor, - padding: EdgeInsets.all(4), - ), - SizedBox(width: 6), - Column( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text('#' + (style?.color?.value.toRadixString(16).substring(2).toUpperCase() ?? '')), - Text((100 * (style?.color?.opacity ?? 1)).toStringAsFixed(0) + '% opacity') - ], - ) - ], - )), - DataCell( - Container( - child: Text('Sample', style: style), - padding: EdgeInsets.all(8), - //color: bgColor, - ), - ), - ]); - }).toList(), - ), - ), - ); - } - - Widget _icons(BuildContext context) { - return GridView.count( - crossAxisCount: 3, - children: List.generate(CanvasIcons.allIcons.length, (idx) { - return Column( - children: [Icon(CanvasIcons.allIcons[idx][1]), Text(CanvasIcons.allIcons[idx][0])], - ); - })); - } -} diff --git a/apps/flutter_parent/lib/screens/under_construction_screen.dart b/apps/flutter_parent/lib/screens/under_construction_screen.dart deleted file mode 100644 index 72286bcd9f..0000000000 --- a/apps/flutter_parent/lib/screens/under_construction_screen.dart +++ /dev/null @@ -1,71 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:flutter/material.dart'; -import 'package:flutter_parent/l10n/app_localizations.dart'; -import 'package:flutter_parent/utils/design/parent_theme.dart'; -import 'package:flutter_svg/svg.dart'; - -class UnderConstructionScreen extends StatelessWidget { - final bool showAppBar; - - const UnderConstructionScreen({this.showAppBar = false, super.key}); - - @override - Widget build(BuildContext context) { - return Scaffold( - appBar: showAppBar && (ModalRoute.of(context)?.canPop ?? false) - ? AppBar( - elevation: 0, - backgroundColor: Colors.transparent, - iconTheme: Theme.of(context).iconTheme, - bottom: ParentTheme.of(context)?.appBarDivider(shadowInLightMode: false), - ) - : null, - body: _body(context), - bottomNavigationBar: Row( - mainAxisAlignment: MainAxisAlignment.spaceEvenly, - children: [], - ), - ); - } - - Center _body(BuildContext context) { - return Center( - child: SingleChildScrollView( - child: Padding( - padding: const EdgeInsets.all(32), - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - SvgPicture.asset('assets/svg/panda-under-construction.svg'), - SizedBox(height: 64), - Text( - L10n(context).underConstruction, - textAlign: TextAlign.center, - style: TextStyle(fontSize: 20, fontWeight: FontWeight.bold), - ), - SizedBox(height: 8), - Text( - L10n(context).currentlyBuildingThisFeature, - textAlign: TextAlign.center, - style: Theme.of(context).textTheme.titleMedium?.copyWith(fontWeight: FontWeight.normal), - ), - ], - ), - ), - ), - ); - } -} diff --git a/apps/flutter_parent/lib/screens/web_login/web_login_interactor.dart b/apps/flutter_parent/lib/screens/web_login/web_login_interactor.dart deleted file mode 100644 index b904738c9d..0000000000 --- a/apps/flutter_parent/lib/screens/web_login/web_login_interactor.dart +++ /dev/null @@ -1,40 +0,0 @@ -// Copyright (C) 2019 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:flutter_parent/models/login.dart'; -import 'package:flutter_parent/models/mobile_verify_result.dart'; -import 'package:flutter_parent/network/api/auth_api.dart'; -import 'package:flutter_parent/network/utils/api_prefs.dart'; -import 'package:flutter_parent/utils/service_locator.dart'; - -class WebLoginInteractor { - Future mobileVerify(String domain) { - return locator().mobileVerify(domain); - } - - Future performLogin(MobileVerifyResult? result, String oAuthRequest) async { - final tokens = await locator().getTokens(result, oAuthRequest); - - Login login = Login((b) => b - ..accessToken = tokens?.accessToken - ..refreshToken = tokens?.refreshToken - ..domain = result?.baseUrl - ..clientId = result?.clientId - ..clientSecret = result?.clientSecret - ..user = tokens?.user?.toBuilder()); - - ApiPrefs.addLogin(login); - ApiPrefs.switchLogins(login); - } -} diff --git a/apps/flutter_parent/lib/screens/web_login/web_login_screen.dart b/apps/flutter_parent/lib/screens/web_login/web_login_screen.dart deleted file mode 100644 index fa9aacd72c..0000000000 --- a/apps/flutter_parent/lib/screens/web_login/web_login_screen.dart +++ /dev/null @@ -1,459 +0,0 @@ -// Copyright (C) 2019 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'dart:async'; - -import 'package:device_info_plus/device_info_plus.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_parent/l10n/app_localizations.dart'; -import 'package:flutter_parent/models/mobile_verify_result.dart'; -import 'package:flutter_parent/models/school_domain.dart'; -import 'package:flutter_parent/network/utils/analytics.dart'; -import 'package:flutter_parent/network/utils/api_prefs.dart'; -import 'package:flutter_parent/router/panda_router.dart'; -import 'package:flutter_parent/screens/web_login/web_login_interactor.dart'; -import 'package:flutter_parent/utils/common_widgets/arrow_aware_focus_scope.dart'; -import 'package:flutter_parent/utils/common_widgets/loading_indicator.dart'; -import 'package:flutter_parent/utils/design/parent_theme.dart'; -import 'package:flutter_parent/utils/quick_nav.dart'; -import 'package:flutter_parent/utils/service_locator.dart'; -import 'package:webview_flutter/webview_flutter.dart'; - -enum LoginFlow { - normal, - canvas, - siteAdmin, - skipMobileVerify, -} - -class WebLoginScreen extends StatefulWidget { - WebLoginScreen(this.domain, { - this.accountName, - this.user, - this.pass, - this.authenticationProvider, - this.loginFlow = LoginFlow.normal, - super.key, - }); - - final String? user; - final String? accountName; - final String? pass; - final String domain; - final String? authenticationProvider; - final LoginFlow loginFlow; - - static const String PROTOCOL_SKIP_VERIFY_KEY = 'skip-protocol'; - static const String ID_SKIP_VERIFY_KEY = 'skip-id'; - static const String SECRET_SKIP_VERIFY_KEY = 'skip-secret'; - - @override - _WebLoginScreenState createState() => _WebLoginScreenState(); -} - -class _WebLoginScreenState extends State { - static const String SUCCESS_URL = '/login/oauth2/auth?code='; - static const String ERROR_URL = '/login/oauth2/auth?error=access_denied'; - - final Completer _controllerCompleter = Completer(); - - WebLoginInteractor get _interactor => locator(); - - Future? _verifyFuture; - WebViewController? _controller; - late String _authUrl; - late String _domain; - bool _showLoading = false; - bool _isMobileVerifyError = false; - bool loadStarted = false; - - @override - Widget build(BuildContext context) { - return DefaultParentTheme( - builder: (context) => Scaffold( - appBar: AppBar( - title: Text(widget.domain), - bottom: ParentTheme.of(context)?.appBarDivider(shadowInLightMode: false), - ), - body: _loginBody(), - // MBL-14271: When in landscape mode, set this to false in order to avoid the situation - // where the soft keyboard keeps flickering on and off. - resizeToAvoidBottomInset: MediaQuery.of(context).orientation == Orientation.portrait, - ), - ); - } - - Widget _loginBody() { - if (_verifyFuture == null) { - _verifyFuture = (widget.loginFlow == LoginFlow.skipMobileVerify) - ? Future.delayed(Duration.zero, () => _SkipVerifyDialog.asDialog(context, widget.domain)).then((result) { - // Use the result if we have it, otherwise continue on with mobile verify - if (result != null) { return result; } - return _interactor.mobileVerify(widget.domain); - }) - : _interactor.mobileVerify(widget.domain); - } - - return FutureBuilder( - future: _verifyFuture, - builder: (context, AsyncSnapshot snapshot) { - if (snapshot.connectionState == ConnectionState.waiting) { - return LoadingIndicator(); - } else { - _isMobileVerifyError = snapshot.hasError || (snapshot.hasData && snapshot.data!.result != VerifyResultEnum.success); - if (_isMobileVerifyError) { - WidgetsBinding.instance.addPostFrameCallback((_) { - _showErrorDialog(context, snapshot); - }); - } - - // Load the WebView regardless of errors, so the user can see what they've done - return _webView(context, snapshot); - } - }, - ); - } - - Widget _webView(BuildContext context, AsyncSnapshot snapshot) { - final verifyResult = snapshot.data; - - return Stack( - children: [ - WebView( - navigationDelegate: (request) => - _navigate(context, request, verifyResult), - javascriptMode: JavascriptMode.unrestricted, - userAgent: ApiPrefs.getUserAgent(), - onPageFinished: (url) => _pageFinished(url, verifyResult), - onPageStarted: (url) => _pageStarted(url), - onWebViewCreated: (controller) => - _webViewCreated(controller, verifyResult), - ), - if (_showLoading) ...[ - Container(color: Theme.of(context).scaffoldBackgroundColor), - LoadingIndicator(), - ], - ], - ); - } - - void _webViewCreated(WebViewController controller, MobileVerifyResult? verifyResult) async { - controller.clearCache(); - _controller = controller; - - // WebView's created, time to load - await _buildAuthUrl(verifyResult); - _loadAuthUrl(); - - if (!_controllerCompleter.isCompleted) _controllerCompleter.complete(controller); - } - - void _pageFinished(String url, MobileVerifyResult? verifyResult) { - _controllerCompleter.future.then((controller) async { - if (widget.user != null && widget.pass != null) { - // SnickerDoodle login - await controller.evaluateJavascript("""javascript: { - document.getElementsByName('pseudonym_session[unique_id]')[0].value = '${widget.user}'; - document.getElementsByName('pseudonym_session[password]')[0].value = '${widget.pass}'; - document.getElementsByClassName('Button')[0].click(); - };"""); - } - - // If the institution does not support skipping the authentication screen this will catch that error and force the - // rebuilding of the authentication url with the authorization screen flow. Example: canvas.sfu.ca - // NOTE: the example institution doesn't work when mobile verify is called with canvasParent in the user-agent - final htmlError = await controller.evaluateJavascript(""" - (function() { return (''+document.getElementsByTagName('html')[0].innerHTML+''); })(); - """); - if (htmlError != null && htmlError.contains("redirect_uri does not match client settings")) { - await _buildAuthUrl(verifyResult, forceAuthRedirect: true); - controller.loadUrl("about:blank"); - _loadAuthUrl(); - } - if (loadStarted) { - _hideLoadingDialog(); - } - }); - } - - void _pageStarted(String url) { - loadStarted = true; - _showLoadingState(); - } - - void _showLoadingState() { - if (!_isMobileVerifyError) { - setState(() => _showLoading = true); - } - } - - void _hideLoadingDialog() { - if (!_isMobileVerifyError) { - setState(() => _showLoading = false); - } - } - - NavigationDecision _navigate(BuildContext context, NavigationRequest request, MobileVerifyResult? result) { - if (request.url.contains(SUCCESS_URL)) { - // Success! Try to get tokens now - var url = request.url; - String oAuthRequest = url.substring(url.indexOf(SUCCESS_URL) + SUCCESS_URL.length); - locator().performLogin(result, oAuthRequest).then((_) { - locator().logEvent( - AnalyticsEventConstants.LOGIN_SUCCESS, - extras: {AnalyticsParamConstants.DOMAIN_PARAM: result?.baseUrl}, - ); - final lastAccount = new SchoolDomain((builder) => - builder - ..authenticationProvider = widget.authenticationProvider - ..domain = widget.domain - ..name = widget.accountName); - ApiPrefs.setLastAccount(lastAccount, widget.loginFlow); - locator().pushRouteAndClearStack( - context, PandaRouter.rootSplash()); - }).catchError((_) { - locator().logEvent( - AnalyticsEventConstants.LOGIN_FAILURE, - extras: {AnalyticsParamConstants.DOMAIN_PARAM: result?.baseUrl}, - ); - // Load the original auth url so the user can try again - _loadAuthUrl(); - }); - return NavigationDecision.prevent; - } else if (request.url.contains(ERROR_URL)) { - // Load the original auth url so the user can try again - _loadAuthUrl(); - return NavigationDecision.prevent; - } else { - return NavigationDecision.navigate; - } - } - - /// Load the authenticated url with any necessary cookies - void _loadAuthUrl() async { - _showLoadingState(); - final cookieManager = CookieManager(); - cookieManager.clearCookies(); - - if (widget.loginFlow == LoginFlow.siteAdmin) { - if (_domain.contains('.instructure.com')) { - cookieManager.setCookie(WebViewCookie(name: 'canvas_sa_delegated', value: '1', domain: _domain)); - cookieManager.setCookie(WebViewCookie(name: 'canvas_sa_delegated', value: '1', domain: '.instructure.com')); - } else { - cookieManager.setCookie(WebViewCookie(name: 'canvas_sa_delegated', value: '1', domain: _domain)); - } - } - - _controller?.loadUrl(_authUrl); - } - - /// Sets an authenticated login url as well as the base url of the institution - Future _buildAuthUrl( - MobileVerifyResult? verifyResult, { - bool forceAuthRedirect = false, - }) async { - // Sanitize the url - String? baseUrl = verifyResult?.baseUrl; - if ((baseUrl?.length ?? 0) == 0) { - baseUrl = widget.domain; - } - if (baseUrl?.endsWith('/') == true) { - baseUrl = baseUrl!.substring(0, baseUrl.length - 1); - } - final scheme = baseUrl == null ? null : Uri.parse(baseUrl).scheme; - if (scheme == null || scheme.isEmpty) { - baseUrl = 'https://${baseUrl}'; - } - - // Prepare login information - var purpose = await DeviceInfoPlugin().androidInfo.then((info) => info.model.replaceAll(' ', '_')); - var clientId = verifyResult != null ? Uri.encodeQueryComponent(verifyResult.clientId) : ''; - var redirect = Uri.encodeQueryComponent('https://canvas.instructure.com/login/oauth2/auth'); - - if (forceAuthRedirect || widget.domain.contains(".test.") || widget.loginFlow == LoginFlow.skipMobileVerify) { - // Skip mobile verify - redirect = Uri.encodeQueryComponent("urn:ietf:wg:oauth:2.0:oob"); - } - - var result = - '$baseUrl/login/oauth2/auth?client_id=$clientId&response_type=code&mobile=1&purpose=$purpose&redirect_uri=$redirect'; - - // If an authentication provider is supplied we need to pass that along. This should only be appended if one exists. - if (widget.authenticationProvider != null && - widget.authenticationProvider!.length > 0 && - widget.authenticationProvider!.toLowerCase() != 'null') { - locator().logMessage('authentication_provider=${widget.authenticationProvider}'); - result = '$result&authentication_provider=${Uri.encodeQueryComponent(widget.authenticationProvider!)}'; - } - - if (widget.loginFlow == LoginFlow.canvas) result += '&canvas_login=1'; - - // Set the variables to use when doing a load - _authUrl = result; - _domain = baseUrl ?? ''; - } - - /// Shows a simple alert dialog with an error message that correlates to the result code - _showErrorDialog(BuildContext context, AsyncSnapshot snapshot) => showDialog( - context: context, - builder: (context) { - return AlertDialog( - title: Text(L10n(context).unexpectedError), - content: Text(_getErrorMessage(context, snapshot)), - actions: [ - TextButton( - child: Text(L10n(context).ok), - onPressed: () => Navigator.of(context).pop(), - ), - ], - ); - }); - - String _getErrorMessage(BuildContext context, AsyncSnapshot snapshot) { - final localizations = L10n(context); - - // No data means the request failed for some other reason that we don't know - if (!snapshot.hasData) { - debugPrint('Failed to do mobile verify with error: ${snapshot.error}'); - return localizations.domainVerificationErrorUnknown; - } - - switch (snapshot.data!.result) { - case VerifyResultEnum.generalError: - return localizations.domainVerificationErrorGeneral; - case VerifyResultEnum.domainNotAuthorized: - return localizations.domainVerificationErrorDomain; - case VerifyResultEnum.unknownUserAgent: - return localizations.domainVerificationErrorUserAgent; - default: - return localizations.domainVerificationErrorUnknown; - } - } -} - -/// Private dialog to show when skipping mobile verify. Let's users provide their own protocol, and client id/secret. -class _SkipVerifyDialog extends StatefulWidget { - final String domain; - - const _SkipVerifyDialog(this.domain, {super.key}); - - @override - __SkipVerifyDialogState createState() => __SkipVerifyDialogState(); - - static Future asDialog(BuildContext context, String domain) { - return showDialog(context: context, builder: (_) => _SkipVerifyDialog(domain)); - } -} - -class __SkipVerifyDialogState extends State<_SkipVerifyDialog> { - final _formKey = GlobalKey(); - - FocusScopeNode _focusScopeNode = FocusScopeNode(); - - String _protocol = 'https'; - String _clientId = ''; - String _clientSecret = ''; - - bool _autoValidate = false; - - @override - void dispose() { - _focusScopeNode.dispose(); - super.dispose(); - } - - @override - Widget build(BuildContext context) { - return AlertDialog( - shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8.0)), - title: Text(L10n(context).skipMobileVerifyTitle), // Non translated string - content: _content(), - actions: [ - TextButton( - child: Text(L10n(context).cancel.toUpperCase()), - onPressed: () => Navigator.of(context).pop(null), - ), - TextButton( - child: Text(L10n(context).ok.toUpperCase()), - onPressed: () => _popWithResult(), - ), - ], - ); - } - - void _popWithResult() { - if (_formKey.currentState?.validate() == true) { - Navigator.of(context).pop(MobileVerifyResult((b) => b - ..clientId = _clientId - ..clientSecret = _clientSecret - ..baseUrl = '$_protocol://${widget.domain}')); - } else { - // Now that they've tried to submit, let the form start validating - setState(() { - _autoValidate = true; - }); - } - } - - Widget _content() { - return SingleChildScrollView( - child: ArrowAwareFocusScope( - node: _focusScopeNode, - child: Form( - key: _formKey, - autovalidateMode: _autoValidate ? AutovalidateMode.always : AutovalidateMode.disabled, - child: Column( - mainAxisSize: MainAxisSize.min, - children: [ - TextFormField( - key: Key(WebLoginScreen.PROTOCOL_SKIP_VERIFY_KEY), - decoration: _decoration(L10n(context).skipMobileVerifyProtocol), - initialValue: _protocol, - onChanged: (text) => _protocol = text, - validator: (text) => text?.isEmpty == true ? L10n(context).skipMobileVerifyProtocolMissing : null, - textInputAction: TextInputAction.next, - onFieldSubmitted: (_) => _focusScopeNode.nextFocus(), - ), - SizedBox(height: 16), - TextFormField( - key: Key(WebLoginScreen.ID_SKIP_VERIFY_KEY), - decoration: _decoration(L10n(context).skipMobileVerifyClientId), - onChanged: (text) => _clientId = text, - validator: (text) => text?.isEmpty == true ? L10n(context).skipMobileVerifyClientIdMissing : null, - textInputAction: TextInputAction.next, - onFieldSubmitted: (_) => _focusScopeNode.nextFocus(), - ), - SizedBox(height: 16), - TextFormField( - key: Key(WebLoginScreen.SECRET_SKIP_VERIFY_KEY), - decoration: _decoration(L10n(context).skipMobileVerifyClientSecret), - onChanged: (text) => _clientSecret = text, - validator: (text) => text?.isEmpty == true ? L10n(context).skipMobileVerifyClientSecretMissing : null, - textInputAction: TextInputAction.done, - onFieldSubmitted: (_) => _focusScopeNode.nextFocus(), - onEditingComplete: _popWithResult, - ), - ], - ), - ), - ), - ); - } - - InputDecoration _decoration(String label) => InputDecoration( - labelText: label, - fillColor: ParentTheme.of(context)?.nearSurfaceColor, - filled: true, - ); -} diff --git a/apps/flutter_parent/lib/utils/alert_helper.dart b/apps/flutter_parent/lib/utils/alert_helper.dart deleted file mode 100644 index 236a005483..0000000000 --- a/apps/flutter_parent/lib/utils/alert_helper.dart +++ /dev/null @@ -1,37 +0,0 @@ -// Copyright (C) 2023 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:flutter_parent/models/alert.dart'; -import 'package:flutter_parent/models/course.dart'; -import 'package:flutter_parent/network/api/course_api.dart'; -import 'package:flutter_parent/utils/service_locator.dart'; - -class AlertsHelper { - Future?> filterAlerts(List? list) async { - List filteredList = []; - if (list == null) return null; - for (var element in list) { - var courseId = element.getCourseIdForGradeAlerts(); - if (courseId == null) { - filteredList.add(element); - } else { - Course? course = await locator().getCourse(courseId, forceRefresh: false); - if (!(course?.settings?.restrictQuantitativeData ?? false)) { - filteredList.add(element); - } - } - } - return filteredList; - } -} diff --git a/apps/flutter_parent/lib/utils/base_model.dart b/apps/flutter_parent/lib/utils/base_model.dart deleted file mode 100644 index 5b8c9459e2..0000000000 --- a/apps/flutter_parent/lib/utils/base_model.dart +++ /dev/null @@ -1,42 +0,0 @@ -// Copyright (C) 2019 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:flutter/material.dart'; - -/// Represents the state of the view -enum ViewState { Idle, Busy, Error } - -/// Represents the model of the widget -class BaseModel extends ChangeNotifier { - ViewState _state = ViewState.Idle; - - ViewState get state => _state; - - void setState({required ViewState viewState}) { - _state = viewState; - notifyListeners(); - } - - // A helper method to set the state to busy when starting a load, and setting the state back to idle when done - Future work(Future Function()? loadBlock) async { - try { - setState(viewState: ViewState.Busy); - if (loadBlock != null) await loadBlock(); - setState(viewState: ViewState.Idle); - } catch (e) { - print('error while doing work: $e'); - setState(viewState: ViewState.Error); - } - } -} diff --git a/apps/flutter_parent/lib/utils/common_widgets/arrow_aware_focus_scope.dart b/apps/flutter_parent/lib/utils/common_widgets/arrow_aware_focus_scope.dart deleted file mode 100644 index 164cda3d8d..0000000000 --- a/apps/flutter_parent/lib/utils/common_widgets/arrow_aware_focus_scope.dart +++ /dev/null @@ -1,50 +0,0 @@ -// Copyright (C) 2019 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -import 'package:flutter/material.dart'; -import 'package:flutter/widgets.dart'; -import 'package:flutter/services.dart'; - -// A key-catch callback for the class below -FocusOnKeyCallback _onDirectionKeyCallback = (node, event) { - if(event is RawKeyDownEvent) { - if(event.logicalKey == LogicalKeyboardKey.arrowDown) { - node.focusInDirection(TraversalDirection.down); - return KeyEventResult.handled; // event handled - } - if(event.logicalKey == LogicalKeyboardKey.arrowUp) { - node.focusInDirection(TraversalDirection.up); - return KeyEventResult.handled; // event handled - } - if(event.logicalKey == LogicalKeyboardKey.arrowLeft) { - node.focusInDirection(TraversalDirection.left); - return KeyEventResult.handled; // event handled - } - if(event.logicalKey == LogicalKeyboardKey.arrowRight) { - node.focusInDirection(TraversalDirection.right); - return KeyEventResult.handled; // event handled - } - } - - return KeyEventResult.ignored; // event not handled -}; - - -// A FocusScope that properly handles directional-arrow presses (and dpad). -class ArrowAwareFocusScope extends FocusScope { - ArrowAwareFocusScope({required Widget child, FocusScopeNode? node}) - : super(child: child, node: node, onKey: _onDirectionKeyCallback); -} - - - diff --git a/apps/flutter_parent/lib/utils/common_widgets/attachment_indicator_widget.dart b/apps/flutter_parent/lib/utils/common_widgets/attachment_indicator_widget.dart deleted file mode 100644 index 828289e8b0..0000000000 --- a/apps/flutter_parent/lib/utils/common_widgets/attachment_indicator_widget.dart +++ /dev/null @@ -1,92 +0,0 @@ -/* - * Copyright (C) 2020 - present Instructure, Inc. - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, version 3 of the License. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -import 'package:flutter/material.dart'; -import 'package:flutter_parent/models/attachment.dart'; -import 'package:flutter_parent/screens/inbox/attachment_utils/attachment_extensions.dart'; -import 'package:flutter_parent/utils/design/parent_colors.dart'; -import 'package:transparent_image/transparent_image.dart'; - -class AttachmentIndicatorWidget extends StatelessWidget { - final Attachment attachment; - final Function(Attachment)? onAttachmentClicked; - - const AttachmentIndicatorWidget({required this.attachment, required this.onAttachmentClicked, super.key}); - - @override - Widget build(BuildContext context) { - return MergeSemantics( - child: Container( - key: Key('attachment-${attachment.id}'), - width: 112, - height: 96, - child: Stack( - alignment: Alignment.center, - children: [ - Container( - decoration: BoxDecoration( - border: Border.all(color: ParentColors.tiara, width: 0.5), - borderRadius: BorderRadius.all(Radius.circular(4)), - ), - ), - Stack( - fit: StackFit.expand, - children: [ - Column( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Icon( - attachment.getIcon(), - color: Theme.of(context).colorScheme.secondary, - ), - Padding( - padding: const EdgeInsets.fromLTRB(12, 11, 12, 0), - child: Text( - attachment.displayName!, - maxLines: 2, - overflow: TextOverflow.ellipsis, - textAlign: TextAlign.center, - style: TextStyle(fontSize: 12, fontWeight: FontWeight.w500), - ), - ) - ], - ), - if (attachment.thumbnailUrl != null && attachment.thumbnailUrl!.isNotEmpty) - ClipRRect( - borderRadius: new BorderRadius.circular(4), - child: FadeInImage.memoryNetwork( - fadeInDuration: const Duration(milliseconds: 300), - fit: BoxFit.cover, - image: attachment.thumbnailUrl!, - placeholder: kTransparentImage, - ), - ), - Material( - color: Colors.transparent, - child: InkWell( - onTap: () { - if (onAttachmentClicked != null) onAttachmentClicked!(attachment); - }, - ), - ), - ], - ), - ], - ), - ), - ); - } -} diff --git a/apps/flutter_parent/lib/utils/common_widgets/avatar.dart b/apps/flutter_parent/lib/utils/common_widgets/avatar.dart deleted file mode 100644 index 802408915c..0000000000 --- a/apps/flutter_parent/lib/utils/common_widgets/avatar.dart +++ /dev/null @@ -1,135 +0,0 @@ -// Copyright (C) 2019 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:cached_network_image/cached_network_image.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_parent/models/user.dart'; -import 'package:flutter_parent/utils/design/parent_colors.dart'; - -class Avatar extends StatelessWidget { - final Color? backgroundColor; - final String? url; - final double radius; - final Widget? overlay; - final String? name; // Generally should be the shortname of the user - final bool showInitials; - - static const List noPictureUrls = const [ - 'images/dotted_pic.png', - 'images%2Fmessages%2Favatar-50.png', - 'images/messages/avatar-50.png', - 'images/messages/avatar-group-50.png', - ]; - - const Avatar( - this.url, { - this.backgroundColor, - this.radius = 20, - this.overlay, - this.name, - this.showInitials = true, - super.key, - }); - - Avatar.fromUser( - User user, { - Color? backgroundColor, - double radius = 20, - Widget? overlay, - }) : this(user.avatarUrl, name: user.shortName, backgroundColor: backgroundColor, radius: radius, overlay: overlay); - - @override - Widget build(BuildContext context) { - Color bgColor = backgroundColor ?? Theme.of(context).canvasColor; - - // We avoid using CachedNetworkImage in tests due to the complexity of mocking its dependencies. - // We determine if we're in a test by checking the runtime type of WidgetsBinding. In prod it's an instance of - // WidgetsFlutterBinding and in tests it's an instance of AutomatedTestWidgetsFlutterBinding. - var isTest = WidgetsBinding.instance.runtimeType != WidgetsFlutterBinding; - - // Url is valid if it's not null or empty, does not contain any noPictureUrls, and we're not testing - bool isUrlValid = !isTest && url != null && url!.isNotEmpty && !noPictureUrls.any((it) => url!.contains(it)); - - return Semantics( - excludeSemantics: true, - child: ClipRRect( - borderRadius: BorderRadius.circular(radius), - child: Container( - color: bgColor, - width: radius * 2, - height: radius * 2, - child: Stack( - children: [ - isUrlValid // Don't use CachedNetworkImage if we're running in a test - ? CachedNetworkImage( - fadeInDuration: const Duration(milliseconds: 300), - fit: BoxFit.cover, - width: radius * 2, - height: radius * 2, - imageUrl: url ?? '', - placeholder: (context, _) => _initialsWidget(context, bgColor), - errorWidget: (context, _, __) => _initialsWidget(context, bgColor), - ) - : _initialsWidget(context, bgColor), - if (overlay != null) - SizedBox( - width: radius * 2, - height: radius * 2, - child: overlay, - ), - ], - ), - ), - ), - ); - } - - Widget _initialsWidget(BuildContext context, Color bgColor) { - return Container( - padding: EdgeInsets.all(0.5), - decoration: BoxDecoration( - shape: BoxShape.circle, - color: Theme.of(context).dividerColor, - ), - child: CircleAvatar( - child: showInitials - ? Text( - getUserInitials(name), - style: TextStyle(fontSize: radius * 0.8, fontWeight: FontWeight.bold, color: ParentColors.ash), - ) - : Container(), - backgroundColor: bgColor, - radius: radius, - ), - ); - } - - // This method is static to make it easier to test! - static String getUserInitials(String? shortName) { - if (shortName == null || shortName.isEmpty) return '?'; - - var name = shortName; - - // Take the first letter of each word, uppercase it, and put it into a list - var initials = name.trim().split(RegExp(r"\s+")).map((it) => it.toUpperCase()[0]).toList(); - - if (initials.length == 2) { - // We have two initials, put them together into one string and return it - return initials.join(''); - } else { - // Just take the first initial if we don't have exactly two - return initials[0]; - } - } -} diff --git a/apps/flutter_parent/lib/utils/common_widgets/badges.dart b/apps/flutter_parent/lib/utils/common_widgets/badges.dart deleted file mode 100644 index 3069c0b5c7..0000000000 --- a/apps/flutter_parent/lib/utils/common_widgets/badges.dart +++ /dev/null @@ -1,177 +0,0 @@ -// Copyright (C) 2019 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:flutter/foundation.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_parent/l10n/app_localizations.dart'; -import 'package:flutter_parent/utils/design/parent_theme.dart'; - -/// Typedef for the function callback to get the semantics string. -/// e.x., semantics: (context, count) => L10n(context).unreadCount(count) -/// -/// See Also for more details: -/// * [NumberBadge] -/// * [IndicatorBadge] -typedef String GetSemantics(BuildContext context, int? count); - -/// A simple class to wrap options for [NumberBadge] and [WidgetBadge] -class BadgeOptions { - /// The initial count to show for the badge - final int? count; - - /// The max count a badge can show, for counts greater than this the string shown will be '$maxCount+' - final int? maxCount; - - /// True if the badge should include a border - final bool includeBorder; - - /// True if the badge colors should be changed to look better against the primary color background - final bool onPrimarySurface; - - const BadgeOptions({this.count, this.maxCount = 99, this.includeBorder = false, this.onPrimarySurface = false}); -} - -/// Adds a badge to a widget. If a count or a listenable is provided, a circle with the count is used as the badge. -/// Otherwise an simple circle will be added as an indicator. -/// -/// Positioning of Indicator or Number badge is different, with indicators being in the top left, and numbers being on -/// the right side. If more custom cases are needed, this may need to be modified. -/// -/// See Also: -/// -/// * [NumberBadge] for when a count or listenable is provided -/// * [IndicatorBadge] for when a simple circle is all that is needed -class WidgetBadge extends StatelessWidget { - final Widget icon; - final BadgeOptions? options; - final GetSemantics? semantics; - final ValueListenable? countListenable; - - const WidgetBadge(this.icon, {this.options = const BadgeOptions(), this.semantics, this.countListenable, super.key}); - - @override - Widget build(BuildContext context) { - return Stack( - clipBehavior: Clip.none, - children: [ - icon, - _badge(), - ], - ); - } - - Widget _badge() { - // If no badge count and no listenable are provided, we just want an indicator on the icon, not a badge with a count - if (options?.count == null && countListenable == null) { - return PositionedDirectional(start: 8, top: 8, child: IndicatorBadge(semantics: semantics)); - } - return PositionedDirectional( - end: -10, - top: -10, - child: NumberBadge(options: options!, semantics: semantics, listenable: countListenable), - ); - } -} - -/// A badge with a number in it. If the count is zero or less then no badge is shown. A listenable can be provided so -/// that the badge count will update automatically. If maxCount is provided (defaults to 99) then the count will be -/// capped at that number with a "+" appended. -/// Defaults semantics to [AppLocalizations.unreadCount] if not provided, can be overridden to return null so no -/// semantics label is added (which then just reads the count provided) -class NumberBadge extends StatelessWidget { - static final backgroundKey = const ValueKey('backgroundKey'); - static final borderKey = const ValueKey('borderKey'); - - final BadgeOptions options; - final GetSemantics? semantics; - final ValueListenable? listenable; - - const NumberBadge({this.options = const BadgeOptions(), this.semantics, this.listenable, super.key}); - - @override - Widget build(BuildContext context) { - if (listenable == null) return _badge(context, options.count); - return ValueListenableBuilder( - valueListenable: listenable!, - builder: (context, count, _) => _badge(context, count as int?), - ); - } - - Widget _badge(BuildContext context, int? count) { - // If there's no count, then don't show anything - if (count == null || count <= 0) return SizedBox(); - - final maxCount = options.maxCount; - final accentColor = (ParentTheme.of(context)?.isDarkMode == true ? Colors.black : Theme.of(context).colorScheme.secondary); - - // Wrap in another container to get the border around the badge, since using border for circles in a box decoration - // has antialiasing issues. - return Container( - key: borderKey, - padding: EdgeInsets.all(options.includeBorder ? 2.0 : 0.0), - decoration: BoxDecoration( - color: options.onPrimarySurface ? accentColor : Theme.of(context).scaffoldBackgroundColor, - shape: BoxShape.circle, - ), - child: Container( - key: backgroundKey, - decoration: _badgeDecoration(context, options), - child: Padding( - padding: const EdgeInsets.all(6.0), - child: Text( - maxCount != null && count > maxCount ? L10n(context).badgeNumberPlus(maxCount) : '$count', - semanticsLabel: semantics != null ? semantics!(context, count) : L10n(context).unreadCount(count), - style: TextStyle( - fontSize: 10, - color: options.onPrimarySurface ? accentColor : Theme.of(context).scaffoldBackgroundColor, - fontWeight: FontWeight.bold, - ), - ), - ), - ), - ); - } -} - -/// An empty colored circle, used as an indicator badge. Typically signals that an item is unread, which doesn't need a -/// count like the NumberBadge. -/// Defaults semantics to [AppLocalizations.unread] if not provided, can be overridden to return null so no semantics -/// label is added. Never provides a value for 'count' in the semantics function. -class IndicatorBadge extends StatelessWidget { - final GetSemantics? semantics; - - const IndicatorBadge({this.semantics, super.key}); - - @override - Widget build(BuildContext context) { - return Semantics( - label: semantics != null ? semantics!(context, null) : L10n(context).unread, - child: Container( - key: Key('unread-indicator'), - width: 8, - height: 8, - decoration: _badgeDecoration(context, BadgeOptions(includeBorder: false)), - ), - ); - } -} - -/// A simple circle decoration to use for the badge background. Keys off of [BadgeOptions.onPrimarySurface] to -/// determine what color to make the background. -Decoration _badgeDecoration(BuildContext context, BadgeOptions options) => BoxDecoration( - shape: BoxShape.circle, - color: options.onPrimarySurface ? Theme.of(context).primaryIconTheme.color : Theme.of(context).colorScheme.secondary, - // Can't use border here as there is an antialiasing issue: https://github.com/flutter/flutter/issues/13675 -// border: !options.includeBorder ? null : Border.all(color: Theme.of(context).scaffoldBackgroundColor, width: 2), - ); diff --git a/apps/flutter_parent/lib/utils/common_widgets/canvas_loading_indicator.dart b/apps/flutter_parent/lib/utils/common_widgets/canvas_loading_indicator.dart deleted file mode 100644 index 3fb3678535..0000000000 --- a/apps/flutter_parent/lib/utils/common_widgets/canvas_loading_indicator.dart +++ /dev/null @@ -1,152 +0,0 @@ -// Copyright (C) 2019 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'dart:math'; - -import 'package:flutter/material.dart'; -import 'package:vector_math/vector_math.dart' as Vector; - -class CanvasLoadingIndicator extends StatefulWidget { - const CanvasLoadingIndicator({ - this.size = 48, - this.color = Colors.white, - super.key, - }); - - final double size; - final Color color; - - @override - _CanvasLoadingIndicatorState createState() => _CanvasLoadingIndicatorState(); -} - -class _CanvasLoadingIndicatorState extends State with SingleTickerProviderStateMixin { - late AnimationController _controller; - late Animation _animation; - late _CanvasLoadingIndicatorPainter _painter; - - @override - void initState() { - _controller = AnimationController(vsync: this); - _animation = CurvedAnimation(parent: _controller, curve: Curves.easeInOutQuad); - _controller.repeat(period: Duration(milliseconds: 600)); - _painter = _CanvasLoadingIndicatorPainter( - _animation, - widget.color, - ); - super.initState(); - } - - @override - Widget build(BuildContext context) { - return CustomPaint( - painter: _painter, - child: SizedBox( - width: widget.size, - height: widget.size, - ), - ); - } - - @override - void dispose() { - _controller.dispose(); - super.dispose(); - } -} - -class _CanvasLoadingIndicatorPainter extends CustomPainter { - _CanvasLoadingIndicatorPainter(this.animation, Color color) : super(repaint: animation) { - _circlePaint = Paint()..color = color; - } - - // Distance from view center where circles will 'spawn', as a percent of max ring radius - static const fractionSpawnPointRadius = 0.31; - - // Maximum circle radius, as a percent of max ring radius - static const fractionMaxCircleRadius = 0.29; - - // Radius if the inner ring, as a percent of max ring radius - static const fractionInnerRingRadius = 1 / 3.0; - - // Number of circles in the design - static const circleCount = 8; - - // The driving animation - final Animation animation; - - // The last progress value tracked, used to track iterations - double _lastProgress = -1.0; - - // The current iteration - int _iteration = 0; - - // Paint used to draw each circle - late Paint _circlePaint; - - @override - void paint(Canvas canvas, Size size) { - // Determine animation progress and track iteration count - if (animation.value < _lastProgress) _iteration++; - _lastProgress = animation.value; - - // Set clipping mask */ - Path clipPath = Path(); - clipPath.addOval(Rect.fromPoints(size.topLeft(Offset.zero), size.bottomRight(Offset.zero))); - canvas.clipPath(clipPath); - - // Determine full angle offset based iteration count - var offset = 360.0 / circleCount; - if ((_iteration + 1) % 4 != 0) offset = -offset; - - var center = size.center(Offset.zero); - var maxRingRadius = center.dx; - var spawnPointRadius = maxRingRadius * fractionSpawnPointRadius; - var maxCircleRadius = maxRingRadius * fractionMaxCircleRadius; - - // Method that draws a single circle - void _drawCircle(double radius, double angleRadians, double distanceFromCenter) { - double x = center.dx + distanceFromCenter * cos(angleRadians); - double y = center.dy + distanceFromCenter * sin(angleRadians); - canvas.drawCircle(Offset(x, y), radius, _circlePaint); - } - - // Method that draws a ring of circles - void _drawCircleRing(double angleOffset, double growthPercent) { - double radius = growthPercent * maxCircleRadius; - double ringRadius = spawnPointRadius + (growthPercent * (maxRingRadius - spawnPointRadius)); - for (int i = 0; i < circleCount; i++) { - _drawCircle(radius, Vector.radians(i * 45 + angleOffset), ringRadius); - } - } - - if (_iteration % 2 == 0) { - // Draw zoom animation on even iterations - double innerRingPercentage = animation.value * fractionInnerRingRadius; - double outerRingPercentage = fractionInnerRingRadius + animation.value * (1 - fractionInnerRingRadius); - double exitingRingPercentage = 1 + animation.value; - _drawCircleRing(offset, innerRingPercentage); - if (_iteration >= 1) _drawCircleRing(0, outerRingPercentage); - if (_iteration >= 3) _drawCircleRing(0, exitingRingPercentage); - } else { - // Draw rotation animation on odd iterations - offset = offset * (1 - animation.value); - _drawCircleRing(offset, fractionInnerRingRadius); - if (_iteration >= 2) _drawCircleRing(0, 1); - } - } - - @override - bool shouldRepaint(CustomPainter oldDelegate) => false; -} diff --git a/apps/flutter_parent/lib/utils/common_widgets/dialog_with_navigator_key.dart b/apps/flutter_parent/lib/utils/common_widgets/dialog_with_navigator_key.dart deleted file mode 100644 index 5c57214d2a..0000000000 --- a/apps/flutter_parent/lib/utils/common_widgets/dialog_with_navigator_key.dart +++ /dev/null @@ -1,101 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:flutter/material.dart'; - -/// _DialogRoute copied (with minor changes) from flutter/lib/src/widget/routes.dart -class _DialogRoute extends PopupRoute { - _DialogRoute({ - required pageBuilder, - required String barrierLabel, - required RouteTransitionsBuilder transitionBuilder, - bool barrierDismissible = true, - Color barrierColor = const Color(0x80000000), - Duration transitionDuration = const Duration(milliseconds: 200), - super.settings, - }) : _pageBuilder = pageBuilder, - _barrierDismissible = barrierDismissible, - _barrierLabel = barrierLabel, - _barrierColor = barrierColor, - _transitionDuration = transitionDuration, - _transitionBuilder = transitionBuilder; - - final RoutePageBuilder _pageBuilder; - - @override - bool get barrierDismissible => _barrierDismissible; - final bool _barrierDismissible; - - @override - String get barrierLabel => _barrierLabel; - final String _barrierLabel; - - @override - Color get barrierColor => _barrierColor; - final Color _barrierColor; - - @override - Duration get transitionDuration => _transitionDuration; - final Duration _transitionDuration; - - final RouteTransitionsBuilder _transitionBuilder; - - @override - Widget buildPage(BuildContext context, Animation animation, Animation secondaryAnimation) { - return Semantics( - child: _pageBuilder(context, animation, secondaryAnimation), - scopesRoute: true, - explicitChildNodes: true, - ); - } - - @override - Widget buildTransitions( - BuildContext context, - Animation animation, - Animation secondaryAnimation, - Widget child, - ) { - return _transitionBuilder(context, animation, secondaryAnimation, child); - } -} - -/// Similar to [showDialog], but instead of taking a [BuildContext] this takes a [GlobalKey] of type [NavigatorState]. -/// This is useful in situations where [showDialog] will not work because a [Navigator] is not accessible via the -/// available [BuildContext], such as the masquerading UI which is an ancestor of the [Navigator]. -Future showDialogWithNavigatorKey({ - required GlobalKey navKey, - required WidgetBuilder builder, - required BuildContext buildContext, - bool barrierDismissible = true, -}) { - BuildContext context = navKey.currentContext ?? buildContext; - assert(debugCheckHasMaterialLocalizations(context)); - - var route = _DialogRoute( - pageBuilder: (_, __, ___) => SafeArea(child: Builder(builder: builder)), - barrierLabel: MaterialLocalizations.of(context).modalBarrierDismissLabel, - transitionBuilder: (_, animation, __, child) { - return FadeTransition( - opacity: CurvedAnimation(parent: animation, curve: Curves.easeOut), - child: child, - ); - }, - barrierDismissible: barrierDismissible, - barrierColor: Colors.black54, - transitionDuration: const Duration(milliseconds: 150), - ); - - return (navKey.currentState)?.push(route) ?? Future.value(null); -} diff --git a/apps/flutter_parent/lib/utils/common_widgets/dropdown_arrow.dart b/apps/flutter_parent/lib/utils/common_widgets/dropdown_arrow.dart deleted file mode 100644 index 1fc71509a0..0000000000 --- a/apps/flutter_parent/lib/utils/common_widgets/dropdown_arrow.dart +++ /dev/null @@ -1,101 +0,0 @@ -// Copyright (C) 2019 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'dart:math'; - -import 'package:flutter/material.dart'; - -/// A widget that renders a dropdown arrow which can animate between its 'collapsed' and 'expanded' states. -class DropdownArrow extends StatelessWidget { - const DropdownArrow({ - this.size = 4, - double? strokeWidth, - this.color = Colors.white, - this.rotate = false, - this.specificProgress = null, - super.key, - }) : this.strokeWidth = strokeWidth ?? size / 2; - - /// Specifies the height of the dropdown arrow. The width will always be twice this value. - final double size; - - /// The thickness of the stroke used to draw the dropdown arrow. Defaults to half the value of [size]. - final double strokeWidth; - - /// The color of the dropdown arrow. Defaults to [Colors.white]. - final Color color; - - /// Whether this dropdown arrow should be rotated 180 degrees to indicate an 'expanded' state. Changing this value - /// will animate the dropdown arrow to its new rotation. This value will be ignored if a non-null value has been - /// specified for [specificProgress]. - final bool rotate; - - /// A specific rotation progress from 0.0 to 1.0, where 0.0 represents a 'collapsed' state and 1.0 represents an - /// 'expanded' state. Specifying a non-null value here will cause the value of [rotate] to be ignored. - /// - /// This is useful for cases where the expand/collapse progress is manually tracked for elements associated with - /// this dropdown arrow, e.g. the calendar widget where the user can swipe vertically to expand/collapse - /// between a month view and a week view. - final double? specificProgress; - - @override - Widget build(BuildContext context) { - if (specificProgress != null) { - return Transform.rotate( - angle: specificProgress! * -pi, - child: CustomPaint( - child: SizedBox(width: size * 2, height: size), - painter: _DropdownArrowPainter(color, strokeWidth), - ), - ); - } - return TweenAnimationBuilder( - tween: Tween(begin: 0, end: rotate ? -pi : 0), - duration: Duration(milliseconds: 300), - builder: (context, value, _) { - return Transform.rotate( - angle: value, - child: CustomPaint( - child: SizedBox(width: size * 2, height: size), - painter: _DropdownArrowPainter(color, strokeWidth), - ), - ); - }, - ); - } -} - -class _DropdownArrowPainter extends CustomPainter { - _DropdownArrowPainter(Color color, double strokeWidth) { - _arrowPaint = Paint() - ..style = PaintingStyle.stroke - ..strokeWidth = strokeWidth - ..color = color; - } - - late Paint _arrowPaint; - - @override - void paint(Canvas canvas, Size size) { - canvas.drawPath( - Path() - ..moveTo(0, 0) - ..lineTo(size.width / 2, size.height) - ..lineTo(size.width, 0), - _arrowPaint); - } - - @override - bool shouldRepaint(CustomPainter oldDelegate) => false; -} diff --git a/apps/flutter_parent/lib/utils/common_widgets/empty_panda_widget.dart b/apps/flutter_parent/lib/utils/common_widgets/empty_panda_widget.dart deleted file mode 100644 index de212d699c..0000000000 --- a/apps/flutter_parent/lib/utils/common_widgets/empty_panda_widget.dart +++ /dev/null @@ -1,80 +0,0 @@ -// Copyright (C) 2019 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:flutter/material.dart'; -import 'package:flutter_parent/utils/common_widgets/full_screen_scroll_container.dart'; -import 'package:flutter_parent/utils/design/parent_colors.dart'; -import 'package:flutter_svg/svg.dart'; - -/// A simple empty widget that shows a centered SVG above a title/subtitle. All components are optionally, though -/// ideally all are present. Spacing is added based on which components are present. -class EmptyPandaWidget extends StatelessWidget { - final String? svgPath; - final String? title; - final String? subtitle; - final String? buttonText; - final GestureTapCallback? onButtonTap; - final Widget? header; - - const EmptyPandaWidget({ - this.svgPath, - this.title, - this.subtitle, - this.buttonText, - this.onButtonTap, - this.header, - super.key, - }); - - @override - Widget build(BuildContext context) { - return FullScreenScrollContainer( - children: [ - if (svgPath != null) SvgPicture.asset(svgPath!, excludeFromSemantics: true), - if (svgPath != null && (title != null || subtitle != null)) SizedBox(height: 64), - if (title != null) - Text( - title!, - textAlign: TextAlign.center, - style: Theme.of(context).textTheme.titleLarge?.copyWith(fontSize: 20, fontWeight: FontWeight.normal), - ), - if (title != null && subtitle != null) SizedBox(height: 8), - if (subtitle != null) - Text( - subtitle!, - textAlign: TextAlign.center, - style: Theme.of(context).textTheme.titleMedium?.copyWith(fontWeight: FontWeight.normal), - ), - if (buttonText != null) - Padding( - padding: const EdgeInsets.only(top: 48), - child: TextButton( - onPressed: onButtonTap, - child: Text( - buttonText!, - style: Theme.of(context).textTheme.bodySmall?.copyWith(fontSize: 16), - ), - style: TextButton.styleFrom( - shape:RoundedRectangleBorder( - borderRadius: new BorderRadius.circular(4), - side: BorderSide(color: ParentColors.tiara), - ), - ), - ), - ), - ], - header: header, - ); - } -} diff --git a/apps/flutter_parent/lib/utils/common_widgets/error_panda_widget.dart b/apps/flutter_parent/lib/utils/common_widgets/error_panda_widget.dart deleted file mode 100644 index 2d3e772b30..0000000000 --- a/apps/flutter_parent/lib/utils/common_widgets/error_panda_widget.dart +++ /dev/null @@ -1,62 +0,0 @@ -// Copyright (C) 2019 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:flutter/material.dart'; -import 'package:flutter_parent/l10n/app_localizations.dart'; -import 'package:flutter_parent/utils/common_widgets/full_screen_scroll_container.dart'; -import 'package:flutter_parent/utils/design/canvas_icons.dart'; -import 'package:flutter_parent/utils/design/parent_colors.dart'; - -/// Displays the error page used throughout the app -/// Contains a warning icon, an error message, and a retry button. -/// -/// Use the [callback] to set what happens when the retry button is pressed -/// Use the [errorString] to specify what was supposed to be loaded -class ErrorPandaWidget extends StatelessWidget { - final Function? callback; - final String errorString; - final Widget? header; - - ErrorPandaWidget(this.errorString, this.callback, {this.header}); - - @override - Widget build(BuildContext context) { - return FullScreenScrollContainer( - children: [ - Icon(CanvasIcons.warning, size: 40, color: ParentColors.failure), - Padding( - padding: const EdgeInsets.fromLTRB(48, 28, 48, 32), - child: Text( - errorString, - textAlign: TextAlign.center, - style: Theme.of(context).textTheme.bodyMedium?.copyWith(fontSize: 16), - ), - ), - TextButton( - onPressed: () { - if (callback != null) callback!(); - }, - child: Text(L10n(context).retry, style: Theme.of(context).textTheme.bodyMedium?.copyWith(fontSize: 16)), - style: TextButton.styleFrom( - shape: RoundedRectangleBorder( - borderRadius: new BorderRadius.circular(4.0), - side: BorderSide(color: ParentColors.tiara), - ), - ) - ) - ], - header: header, - ); - } -} diff --git a/apps/flutter_parent/lib/utils/common_widgets/error_report/error_report_dialog.dart b/apps/flutter_parent/lib/utils/common_widgets/error_report/error_report_dialog.dart deleted file mode 100644 index 81ac8a8f37..0000000000 --- a/apps/flutter_parent/lib/utils/common_widgets/error_report/error_report_dialog.dart +++ /dev/null @@ -1,245 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -import 'package:device_info_plus/device_info_plus.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_parent/l10n/app_localizations.dart'; -import 'package:flutter_parent/utils/common_widgets/error_report/error_report_interactor.dart'; -import 'package:flutter_parent/utils/common_widgets/full_screen_scroll_container.dart'; -import 'package:flutter_parent/utils/design/parent_theme.dart'; -import 'package:flutter_parent/utils/service_locator.dart'; -import 'package:package_info_plus/package_info_plus.dart'; - -import '../arrow_aware_focus_scope.dart'; - -class ErrorReportDialog extends StatefulWidget { - static const Key subjectKey = Key('subject'); - static const Key descriptionKey = Key('description'); - static const Key emailKey = Key('email'); - - final String title; // Used to specify different titles depending on how this dialog was shown - final String? subject; - final ErrorReportSeverity? severity; - final FlutterErrorDetails? error; - final bool includeEmail; // Used when shown during login, so that users can get responses from created service tickets - final bool hideSeverityPicker; - - const ErrorReportDialog._internal( - this.title, - this.subject, - this.severity, - this.includeEmail, - this.hideSeverityPicker, - this.error, { - super.key, - }); - - @override - _ErrorReportDialogState createState() => _ErrorReportDialogState(); - - static Future asDialog( - BuildContext context, { - String? title, - String? subject, - ErrorReportSeverity? severity, - bool includeEmail = false, - bool hideSeverityPicker = false, - FlutterErrorDetails? error}) { - return showDialog( - context: context, - builder: (context) => ErrorReportDialog._internal( - title ?? L10n(context).reportProblemTitle, - subject, - severity ?? ErrorReportSeverity.COMMENT, - includeEmail, - hideSeverityPicker, - error, - ), - ); - } -} - -class _ErrorReportDialogState extends State { - final _formKey = GlobalKey(); - - // Non state changing variables - FocusScopeNode _focusScopeNode = FocusScopeNode(); - String? _subject; - String? _email; - String? _description; - - // State changing variables - late ErrorReportSeverity? _selectedSeverity; - late bool _autoValidate; - - @override - void initState() { - super.initState(); - - _autoValidate = false; - _subject = widget.subject; - _selectedSeverity = widget.severity; - } - - @override - void dispose() { - _focusScopeNode.dispose(); - super.dispose(); - } - - @override - Widget build(BuildContext context) { - return FullScreenScrollContainer( - horizontalPadding: 0, - children: [ - AlertDialog( - shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8.0)), - title: Text(widget.title), - actions: [ - TextButton( - child: Text(L10n(context).cancel.toUpperCase()), - onPressed: () => Navigator.of(context).pop(), - ), - TextButton( - child: Text(L10n(context).sendReport.toUpperCase()), - onPressed: () async { - if (_formKey.currentState?.validate() == true) { - await _submitReport(); - Navigator.of(context).pop(); - } else { - // Start auto validating since they've tried to submit once - setState(() => _autoValidate = true); - } - }, - ), - ], - content: _content(context), - ), - ], - ); - } - - Widget _content(BuildContext context) { - final severityOptions = _getSeverityOptions(); - return SingleChildScrollView( - child: Form( - key: _formKey, - autovalidateMode: _autoValidate ? AutovalidateMode.always : AutovalidateMode.disabled, - child: ArrowAwareFocusScope( - node: _focusScopeNode, - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - mainAxisSize: MainAxisSize.min, - children: [ - TextFormField( - key: ErrorReportDialog.subjectKey, - initialValue: _subject, - decoration: _decoration(L10n(context).reportProblemSubject), - validator: (text) => text?.isEmpty == true ? L10n(context).reportProblemSubjectEmpty : null, - onChanged: (text) => _subject = text, - textInputAction: TextInputAction.next, - onFieldSubmitted: (_) => _focusScopeNode.nextFocus(), - ), - if (widget.includeEmail) SizedBox(height: 16), - if (widget.includeEmail) - TextFormField( - key: ErrorReportDialog.emailKey, - decoration: _decoration(L10n(context).reportProblemEmail), - validator: (text) => - (widget.includeEmail && text?.isEmpty == true) ? L10n(context).reportProblemEmailEmpty : null, - onChanged: (text) => _email = text, - textInputAction: TextInputAction.next, - onFieldSubmitted: (_) => _focusScopeNode.nextFocus(), - ), - SizedBox(height: 16), - TextFormField( - key: ErrorReportDialog.descriptionKey, - minLines: 3, - maxLines: null, - decoration: _decoration(L10n(context).reportProblemDescription, alignLabelWithHint: true), - validator: (text) => text?.isEmpty == true ? L10n(context).reportProblemDescriptionEmpty : null, - onChanged: (text) => _description = text, - ), - SizedBox(height: 16), - if (!widget.hideSeverityPicker) Text(L10n(context).reportProblemSeverity), - if (!widget.hideSeverityPicker) - Container( - color: ParentTheme.of(context)?.nearSurfaceColor, - padding: EdgeInsets.symmetric(horizontal: 16, vertical: 4), - child: DropdownButton<_SeverityOption>( - itemHeight: null, - isExpanded: true, - underline: SizedBox(), - onChanged: (option) async { - setState(() => _selectedSeverity = option?.severity); - // Clear focus here, as it can go back to the text forms if they were previously selected - // NO! This messes up dpad-nav - //_focusScopeNode.requestFocus(FocusNode()); - }, - value: severityOptions.firstWhere((option) => option.severity == _selectedSeverity), - items: severityOptions.map((option) { - return DropdownMenuItem<_SeverityOption>(value: option, child: Text(option.label)); - }).toList(), - ), - ), - ], - ), - ), - ), - ); - } - - _submitReport() async { - final l10n = L10n(context); - DeviceInfoPlugin deviceInfo = DeviceInfoPlugin(); - AndroidDeviceInfo androidInfo = await deviceInfo.androidInfo; - PackageInfo packageInfo = await PackageInfo.fromPlatform(); - - // Add device and package info before the users description - final comment = '' + - '${l10n.device}: ${androidInfo.manufacturer} ${androidInfo.model}\n' + - '${l10n.osVersion}: Android ${androidInfo.version.release}\n' + - '${l10n.versionNumber}: ${packageInfo.appName} v${packageInfo.version} (${packageInfo.buildNumber})\n\n' + - '-------------------------\n\n' + - '$_description'; - - // Send to the API; with stacktrace and device info - await locator() - .submitErrorReport(_subject, comment, _email, _selectedSeverity, widget.error?.stack?.toString()); - } - - InputDecoration _decoration(String label, {bool alignLabelWithHint = false}) => InputDecoration( - labelText: label, - alignLabelWithHint: alignLabelWithHint, - fillColor: ParentTheme.of(context)?.nearSurfaceColor, - filled: true, - ); - - List<_SeverityOption> _getSeverityOptions() { - final l10n = L10n(context); - return [ - _SeverityOption(ErrorReportSeverity.COMMENT, l10n.errorSeverityComment), - _SeverityOption(ErrorReportSeverity.NOT_URGENT, l10n.errorSeverityNotUrgent), - _SeverityOption(ErrorReportSeverity.WORKAROUND_POSSIBLE, l10n.errorSeverityWorkaroundPossible), - _SeverityOption(ErrorReportSeverity.BLOCKING, l10n.errorSeverityBlocking), - _SeverityOption(ErrorReportSeverity.CRITICAL, l10n.errorSeverityCritical), - ]; - } -} - -class _SeverityOption { - final ErrorReportSeverity severity; - final String label; - - _SeverityOption(this.severity, this.label); -} diff --git a/apps/flutter_parent/lib/utils/common_widgets/error_report/error_report_interactor.dart b/apps/flutter_parent/lib/utils/common_widgets/error_report/error_report_interactor.dart deleted file mode 100644 index bcb2fc523b..0000000000 --- a/apps/flutter_parent/lib/utils/common_widgets/error_report/error_report_interactor.dart +++ /dev/null @@ -1,68 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:flutter_parent/network/api/enrollments_api.dart'; -import 'package:flutter_parent/network/api/error_report_api.dart'; -import 'package:flutter_parent/network/utils/api_prefs.dart'; -import 'package:flutter_parent/utils/service_locator.dart'; - -class ErrorReportInteractor { - Future submitErrorReport( - String? subject, String description, String? email, ErrorReportSeverity? severity, String? stacktrace) async { - final user = ApiPrefs.getUser(); - final domain = (ApiPrefs.getDomain()?.isNotEmpty == true) ? ApiPrefs.getDomain() : ErrorReportApi.DEFAULT_DOMAIN; - final becomeUser = (user?.id.isNotEmpty == true) ? '$domain?become_user_id=${user?.id}' : ''; - final userEmail = (email?.isNotEmpty == true) ? email : user?.primaryEmail ?? ''; - - final enrollments = user == null ? [] : await locator().getSelfEnrollments(forceRefresh: true); - final userRoles = enrollments == null ? '' : Set.from(enrollments.map((enrollment) => enrollment.type)).toList().join(','); - - return locator().submitErrorReport( - subject: subject, - description: description, - email: userEmail, - severity: _errorReportSeverityTag(severity), - stacktrace: stacktrace, - domain: domain, - name: user?.name ?? '', - becomeUser: becomeUser, - userRoles: userRoles, - ); - } - - String _errorReportSeverityTag(ErrorReportSeverity? severity) { - switch (severity) { - case ErrorReportSeverity.COMMENT: - return 'just_a_comment'; - case ErrorReportSeverity.NOT_URGENT: - return 'not_urgent'; - case ErrorReportSeverity.WORKAROUND_POSSIBLE: - return 'workaround_possible'; - case ErrorReportSeverity.BLOCKING: - return 'blocks_what_i_need_to_do'; - case ErrorReportSeverity.CRITICAL: - return 'extreme_critical_emergency'; - default: - throw ArgumentError('The provided severity is not supported: ${severity.toString()} not in ${ErrorReportSeverity.values.toString()}'); - } - } -} - -enum ErrorReportSeverity { - COMMENT, - NOT_URGENT, - WORKAROUND_POSSIBLE, - BLOCKING, - CRITICAL, -} diff --git a/apps/flutter_parent/lib/utils/common_widgets/full_screen_scroll_container.dart b/apps/flutter_parent/lib/utils/common_widgets/full_screen_scroll_container.dart deleted file mode 100644 index 607287c2a9..0000000000 --- a/apps/flutter_parent/lib/utils/common_widgets/full_screen_scroll_container.dart +++ /dev/null @@ -1,61 +0,0 @@ -// Copyright (C) 2019 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:flutter/material.dart'; - -/// A helper class for centering a widget in a scrollable container. Useful when trying to put an empty/error state in -/// a refresh indicator. -/// -/// Mostly pulling from the example by Flutter for SingleChildScrollView: -/// https://api.flutter.dev/flutter/widgets/SingleChildScrollView-class.html -class FullScreenScrollContainer extends StatelessWidget { - final Widget? header; - final List children; - final double horizontalPadding; - - const FullScreenScrollContainer({required this.children, this.header, this.horizontalPadding = 32, super.key}); - - @override - Widget build(BuildContext context) { - return LayoutBuilder( - builder: (BuildContext context, BoxConstraints viewportConstraints) => SingleChildScrollView( - physics: AlwaysScrollableScrollPhysics(), - child: ConstrainedBox( - constraints: BoxConstraints( - minHeight: viewportConstraints.maxHeight, - minWidth: viewportConstraints.maxWidth, - ), - child: IntrinsicHeight( - child: Column( - mainAxisAlignment: MainAxisAlignment.start, - children: [ - if (header != null) header!, - Expanded( - child: Padding( - padding: EdgeInsets.symmetric(horizontal: horizontalPadding), - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - mainAxisSize: MainAxisSize.max, - children: children, - ), - ), - ), - ], - ), - ), - ), - ), - ); - } -} diff --git a/apps/flutter_parent/lib/utils/common_widgets/loading_indicator.dart b/apps/flutter_parent/lib/utils/common_widgets/loading_indicator.dart deleted file mode 100644 index 44433117c2..0000000000 --- a/apps/flutter_parent/lib/utils/common_widgets/loading_indicator.dart +++ /dev/null @@ -1,20 +0,0 @@ -// Copyright (C) 2019 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:flutter/material.dart'; - -class LoadingIndicator extends StatelessWidget { - @override - Widget build(BuildContext context) => Center(child: CircularProgressIndicator()); -} diff --git a/apps/flutter_parent/lib/utils/common_widgets/masquerade_ui.dart b/apps/flutter_parent/lib/utils/common_widgets/masquerade_ui.dart deleted file mode 100644 index e5fb5cf85d..0000000000 --- a/apps/flutter_parent/lib/utils/common_widgets/masquerade_ui.dart +++ /dev/null @@ -1,159 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:flutter/cupertino.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_parent/l10n/app_localizations.dart'; -import 'package:flutter_parent/models/user.dart'; -import 'package:flutter_parent/network/utils/api_prefs.dart'; -import 'package:flutter_parent/router/panda_router.dart'; -import 'package:flutter_parent/utils/common_widgets/dialog_with_navigator_key.dart'; -import 'package:flutter_parent/utils/common_widgets/respawn.dart'; -import 'package:flutter_parent/utils/common_widgets/user_name.dart'; -import 'package:flutter_parent/utils/design/parent_colors.dart'; -import 'package:flutter_parent/utils/design/parent_theme.dart'; -import 'package:flutter_parent/utils/quick_nav.dart'; -import 'package:flutter_parent/utils/service_locator.dart'; -import 'package:flutter_parent/utils/style_slicer.dart'; - -import '../features_utils.dart'; - -class MasqueradeUI extends StatefulWidget { - final Widget child; - final GlobalKey navKey; - - const MasqueradeUI({required this.child, required this.navKey, super.key}); - - @override - MasqueradeUIState createState() => MasqueradeUIState(); - - static MasqueradeUIState? of(BuildContext context) { - return context.findAncestorStateOfType(); - } - - static void showMasqueradeCancelDialog(GlobalKey navKey, BuildContext context) { - bool logout = ApiPrefs.getCurrentLogin()?.isMasqueradingFromQRCode == true; - User user = ApiPrefs.getUser()!; - showDialog( - context: navKey.currentContext ?? context, - builder: (context) { - AppLocalizations l10n = L10n(context); - var nameText = UserName.fromUser(user).text; - String messageText = logout ? l10n.endMasqueradeLogoutMessage(nameText) : l10n.endMasqueradeMessage(nameText); - return AlertDialog( - title: Text(L10n(context).stopActAsUser), - content: Text.rich(StyleSlicer.apply(messageText, [PronounSlice(user.pronouns)])), - actions: [ - TextButton( - child: new Text(L10n(context).cancel), - onPressed: () => navKey.currentState?.pop(false), - ), - TextButton( - child: new Text(L10n(context).ok), - onPressed: () async { - if (logout) { - await ParentTheme.of(context)?.setSelectedStudent(null); - await ApiPrefs.performLogout(); - await FeaturesUtils.performLogout(); - MasqueradeUI.of(context)?.refresh(); - locator().pushRouteAndClearStack(context, PandaRouter.login()); - } else { - ApiPrefs.updateCurrentLogin((b) => b - ..masqueradeUser = null - ..masqueradeDomain = null); - Respawn.of(context)?.restart(); - } - }, - ), - ], - ); - }, - ); - } -} - -class MasqueradeUIState extends State { - bool _enabled = false; - late User _user; - - GlobalKey _childKey = GlobalKey(); - - bool get enabled => _enabled; - - @override - void initState() { - refresh(shouldSetState: false); - super.initState(); - } - - void refresh({bool shouldSetState = true}) { - bool wasEnabled = _enabled; - if (ApiPrefs.isLoggedIn() && ApiPrefs.isMasquerading()) { - _enabled = true; - _user = ApiPrefs.getUser()!; - } else { - _enabled = false; - } - if (wasEnabled != _enabled && shouldSetState) { - WidgetsBinding.instance.addPostFrameCallback((_) { - setState(() {}); - }); - } - } - - @override - Widget build(BuildContext context) { - Widget child = KeyedSubtree(key: _childKey, child: widget.child); - if (!_enabled) return child; - String message = L10n(context).actingAsUser(UserName.fromUser(_user).text); - return SafeArea( - child: Material( - child: Container( - key: Key('masquerade-ui-container'), - foregroundDecoration: BoxDecoration( - border: Border.all(color: ParentColors.masquerade, width: 3.0), - ), - child: Column( - children: [ - Container( - color: ParentColors.masquerade, - child: Row( - mainAxisSize: MainAxisSize.max, - children: [ - SizedBox(width: 16), - Expanded( - child: Text.rich( - StyleSlicer.apply(message, [PronounSlice(_user.pronouns)]), - style: TextStyle(color: Colors.white), - ), - ), - IconButton( - icon: Icon( - Icons.close, - color: Colors.white, - semanticLabel: L10n(context).stopActAsUser, - ), - onPressed: () => MasqueradeUI.showMasqueradeCancelDialog(widget.navKey, context), - ), - ], - ), - ), - Expanded(child: child), - ], - ), - ), - ), - ); - } -} diff --git a/apps/flutter_parent/lib/utils/common_widgets/rating_dialog.dart b/apps/flutter_parent/lib/utils/common_widgets/rating_dialog.dart deleted file mode 100644 index 7c574dda6a..0000000000 --- a/apps/flutter_parent/lib/utils/common_widgets/rating_dialog.dart +++ /dev/null @@ -1,254 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -import 'package:device_info_plus/device_info_plus.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_parent/l10n/app_localizations.dart'; -import 'package:flutter_parent/network/utils/analytics.dart'; -import 'package:flutter_parent/network/utils/api_prefs.dart'; -import 'package:flutter_parent/utils/common_widgets/arrow_aware_focus_scope.dart'; -import 'package:flutter_parent/utils/common_widgets/full_screen_scroll_container.dart'; -import 'package:flutter_parent/utils/design/parent_colors.dart'; -import 'package:flutter_parent/utils/service_locator.dart'; -import 'package:flutter_parent/utils/veneers/android_intent_veneer.dart'; -import 'package:package_info_plus/package_info_plus.dart'; - -import '../url_launcher.dart'; - -class RatingDialog extends StatefulWidget { - static const FOUR_WEEKS = 28; - static const SIX_WEEKS = 42; - static const _RATING_TO_APP_STORE_THRESHOLD = 3; - - /// Will show the rating dialog when: - /// - user has used the app for 4 weeks - /// - when the user sees the dialog again there will be a "don't show again" button - /// - when the user sees the dialog, there are a few use cases for when to show the dialog again - /// - /// 1. User presses 4-5 stars -> take user to play store and don't show dialog again - /// 2. User presses < 4 stars with no comment -> show again 4 weeks later - /// 3. User presses < 4 stars with a comment -> show again 6 weeks later - /// 4. User presses back -> show again 4 weeks later - static Future asDialog(BuildContext context) { - // Don't show dialog in tests, so that they run more stable. Testing this rating dialog can be achieved by - // using the method `RatingDialog.showDialogIfPossible()` - final hideForAutomatedTests = WidgetsBinding.instance.runtimeType != WidgetsFlutterBinding; - return showDialogIfPossible(context, hideForAutomatedTests); - } - - /// A helper function for showing the dialog, so that this dialog can still be widget tested - @visibleForTesting - static Future showDialogIfPossible(BuildContext context, bool hideForAutomatedTests) { - if (ApiPrefs.getRatingDontShowAgain() == true || hideForAutomatedTests) return Future.value(); - - final nextShowDate = ApiPrefs.getRatingNextShowDate(); - final date = DateTime.now(); - - if (nextShowDate == null) { - ApiPrefs.setRatingNextShowDate(date.add(Duration(days: FOUR_WEEKS))); - return Future.value(); - } - - if (date.isBefore(nextShowDate)) return Future.value(); - - ApiPrefs.setRatingNextShowDate(date.add(Duration(days: FOUR_WEEKS))); - - locator().logEvent(AnalyticsEventConstants.RATING_DIALOG_SHOW); - - return showDialog( - context: context, - builder: (context) => RatingDialog._internal(), - ); - } - - const RatingDialog._internal({super.key}); - - @override - _RatingDialogState createState() => _RatingDialogState(); -} - -class _RatingDialogState extends State { - late String _comment; - late int _focusedStar; - late int _selectedStar; - late bool _sending; - - @override - void initState() { - super.initState(); - _comment = ''; - _focusedStar = -1; - _selectedStar = -1; - _sending = false; - } - - /// Widget building - - @override - Widget build(BuildContext context) { - return FullScreenScrollContainer( - horizontalPadding: 0, - children: [ - ArrowAwareFocusScope( - child: AlertDialog( - shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8.0)), - title: Text(L10n(context).ratingDialogTitle), - actions: [ - TextButton( - child: Text(L10n(context).ratingDialogDontShowAgain.toUpperCase()), - onPressed: _handleDontShowAgain, - ) - ], - content: Column( - mainAxisSize: MainAxisSize.min, - children: [ - _stars(), - if (_selectedStar >= 0 && _selectedStar < RatingDialog._RATING_TO_APP_STORE_THRESHOLD) _commentWidget(), - ], - ), - ), - ), - ], - ); - } - - Widget _stars() { - return Semantics( - container: true, - label: L10n(context).starRating(_selectedStar + 1), - child: Row( - mainAxisSize: MainAxisSize.min, - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.center, - children: List.generate(5, (index) { - return _materialButton(index); - }), - ), - ); - } - - Widget _materialButton(int index) { - final starColor = _focusedStar >= index ? ParentColors.parentApp : ParentColors.ash; - return Semantics( - child: MaterialButton( - child: Icon(Icons.star, color: starColor, size: 48, semanticLabel: L10n(context).starRating(index + 1)), - height: 48, - minWidth: 48, - shape: CircleBorder(), - onPressed: () => _handleStarPressed(index), - onHighlightChanged: (highlighted) => setState(() => _focusedStar = highlighted ? index : _selectedStar), - padding: EdgeInsets.zero, - ), - ); - } - - Widget _commentWidget() { - return Column( - children: [ - MergeSemantics( - // If not wrapped in merge semantics, it will not be focusable with talkback - child: TextField( - maxLines: null, - textCapitalization: TextCapitalization.sentences, - decoration: InputDecoration(hintText: L10n(context).ratingDialogCommentDescription), - onChanged: (text) => setState(() => _comment = text), - ), - ), - SizedBox(height: 8), - ElevatedButton( - child: Text(L10n(context).ratingDialogSendFeedback.toUpperCase()), - style: ElevatedButton.styleFrom( - backgroundColor: Theme.of(context).colorScheme.secondary, - foregroundColor: Colors.white, - textStyle: Theme.of(context).textTheme.bodyMedium?.copyWith(color: Colors.white), - ), - onPressed: _sending ? null : _sendFeedbackPressed, - ), - ], - ); - } - - /// Helper functions - - _handleDontShowAgain() { - ApiPrefs.setRatingDontShowAgain(true); - locator().logEvent(AnalyticsEventConstants.RATING_DIALOG_DONT_SHOW_AGAIN); - Navigator.of(context).pop(); - } - - _popAndSendAnalytics(int index) { - locator().logEvent( - AnalyticsEventConstants.RATING_DIALOG, - extras: {AnalyticsParamConstants.STAR_RATING: index + 1}, - ); - Navigator.of(context).pop(); - } - - _handleStarPressed(int index) { - // If the rating is high, don't show the rating dialog again and launch the app store so they can review there too - if (index >= RatingDialog._RATING_TO_APP_STORE_THRESHOLD) { - ApiPrefs.setRatingDontShowAgain(true); - locator().launchAppStore(); - _popAndSendAnalytics(index); - return; - } - - setState(() { - _focusedStar = index; - _selectedStar = index; - }); - } - - _sendFeedbackPressed() async { - setState(() { - _sending = true; // Prevent the send button from getting clicked multiple times - }); - - if (_comment.isNotEmpty) await _sendFeedback(); - _popAndSendAnalytics(_selectedStar); - } - - _sendFeedback() async { - try { - // Show again in 6 weeks since they're leaving a comment - ApiPrefs.setRatingNextShowDate(DateTime.now().add(Duration(days: RatingDialog.SIX_WEEKS))); - - final l10n = L10n(context); - - final parentId = ApiPrefs.getUser()?.id ?? 0; - final email = ApiPrefs.getUser()?.primaryEmail ?? ''; - final domain = ApiPrefs.getDomain() ?? ''; - - DeviceInfoPlugin deviceInfo = DeviceInfoPlugin(); - AndroidDeviceInfo androidInfo = await deviceInfo.androidInfo; - PackageInfo packageInfo = await PackageInfo.fromPlatform(); - - - final subject = l10n.ratingDialogEmailSubject(packageInfo.version); - - // Populate the email body with information about the user - String emailBody = '' + - '$_comment\r\n' + - '\r\n' + - '${l10n.helpUserId} $parentId\r\n' + - '${l10n.helpEmail} $email\r\n' + - '${l10n.helpDomain} $domain\r\n' + - '${l10n.versionNumber}: ${packageInfo.appName} v${packageInfo.version} (${packageInfo.buildNumber})\r\n' + - '${l10n.device}: ${androidInfo.manufacturer} ${androidInfo.model}\r\n' + - '${l10n.osVersion}: Android ${androidInfo.version.release}\r\n' + - '----------------------------------------------\r\n'; - - locator().launchEmailWithBody(subject, emailBody); - } catch (_) {} // Catch any errors that come from trying to launch an email - } -} diff --git a/apps/flutter_parent/lib/utils/common_widgets/respawn.dart b/apps/flutter_parent/lib/utils/common_widgets/respawn.dart deleted file mode 100644 index ff7514878f..0000000000 --- a/apps/flutter_parent/lib/utils/common_widgets/respawn.dart +++ /dev/null @@ -1,43 +0,0 @@ -// Copyright (C) 2019 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:flutter/widgets.dart'; - -/// Widget that can be respawned with a clean state. To perform respawn, call Respawn.of(context).kill() -class Respawn extends StatefulWidget { - final Widget? child; - - const Respawn({this.child, super.key}); - - @override - _RespawnState createState() => _RespawnState(); - - static _RespawnState? of(BuildContext context) { - return context.findAncestorStateOfType<_RespawnState>(); - } -} - -class _RespawnState extends State { - Key _key = GlobalKey(); - - restart() => setState(() => _key = UniqueKey()); - - @override - Widget build(BuildContext context) { - return Container( - key: _key, - child: widget.child, - ); - } -} diff --git a/apps/flutter_parent/lib/utils/common_widgets/two_finger_double_tap_gesture_detector.dart b/apps/flutter_parent/lib/utils/common_widgets/two_finger_double_tap_gesture_detector.dart deleted file mode 100644 index 7f906e4623..0000000000 --- a/apps/flutter_parent/lib/utils/common_widgets/two_finger_double_tap_gesture_detector.dart +++ /dev/null @@ -1,94 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:flutter/gestures.dart'; -import 'package:flutter/material.dart'; - -class TwoFingerDoubleTapGestureDetector extends StatelessWidget { - final Widget child; - final VoidCallback onDoubleTap; - final bool excludeFromSemantics; - - const TwoFingerDoubleTapGestureDetector({ - required this.child, - required this.onDoubleTap, - this.excludeFromSemantics = false, - super.key, - }); - - @override - Widget build(BuildContext context) { - return RawGestureDetector( - behavior: HitTestBehavior.opaque, - child: child, - excludeFromSemantics: excludeFromSemantics, - gestures: { - TwoFingerDoubleTapGestureRecognizer: GestureRecognizerFactoryWithHandlers( - () => TwoFingerDoubleTapGestureRecognizer(), - (TwoFingerDoubleTapGestureRecognizer instance) => instance.onDoubleTap = onDoubleTap, - ), - }, - ); - } -} - -class TwoFingerDoubleTapGestureRecognizer extends MultiTapGestureRecognizer { - VoidCallback? onDoubleTap; - - Map _downPointers = {}; - Map _upPointers = {}; - DateTime? _lastTwoFingerTap; - - TwoFingerDoubleTapGestureRecognizer() { - onTapDown = _trackTapDown; - onTapUp = _trackTapUp; - onTapCancel = (_) => _reset(); - } - - void _trackTapDown(int pointer, TapDownDetails details) { - _downPointers[pointer] = DateTime.now(); - if (_downPointers.length > 2) _reset(); - } - - void _trackTapUp(int pointer, TapUpDetails details) { - DateTime? downTime = _downPointers.remove(pointer); - if (downTime == null) return; - DateTime upTime = DateTime.now(); - if (upTime.difference(downTime) < kLongPressTimeout) _upPointers[pointer] = upTime; - if (_upPointers.length >= 2) { - var upTimes = _upPointers.values.toList(); - if (upTimes[0].difference(upTimes[1]).abs() < kPressTimeout) { - _trackTwoFingerTap(); - } - _upPointers.clear(); - _downPointers.clear(); - } - } - - void _trackTwoFingerTap() { - DateTime tapTime = DateTime.now(); - DateTime? lastTap = _lastTwoFingerTap; - _lastTwoFingerTap = tapTime; - if (lastTap != null && tapTime.difference(lastTap) < kDoubleTapTimeout) { - if (onDoubleTap != null) onDoubleTap!(); - _reset(); - } - } - - void _reset() { - _downPointers.clear(); - _upPointers.clear(); - _lastTwoFingerTap = null; - } -} diff --git a/apps/flutter_parent/lib/utils/common_widgets/user_name.dart b/apps/flutter_parent/lib/utils/common_widgets/user_name.dart deleted file mode 100644 index e131b15b3c..0000000000 --- a/apps/flutter_parent/lib/utils/common_widgets/user_name.dart +++ /dev/null @@ -1,68 +0,0 @@ -// Copyright (C) 2019 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:flutter/material.dart'; -import 'package:flutter_parent/models/basic_user.dart'; -import 'package:flutter_parent/models/recipient.dart'; -import 'package:flutter_parent/models/user.dart'; - -class UserName extends StatelessWidget { - final String userName; - final String? pronouns; - final TextStyle? style; - final TextOverflow? overflow; - - UserName(this.userName, this.pronouns, {this.style, this.overflow}); - - UserName.fromUser(User user, {this.style = null, this.overflow = null}) - : userName = user.name, - pronouns = user.pronouns; - - UserName.fromUserShortName(User user, {this.style = null, this.overflow = null}) - : userName = user.shortName!, - pronouns = user.pronouns; - - UserName.fromBasicUser(BasicUser user, {this.style = null, this.overflow = null}) - : userName = user.name!, - pronouns = user.pronouns; - - UserName.fromRecipient(Recipient recipient, {this.style = null, this.overflow = null}) - : userName = recipient.name, - pronouns = recipient.pronouns; - - String get text { - if (pronouns != null && pronouns!.isNotEmpty) { - return ('$userName ($pronouns)'); - } else { - return userName; - } - } - - TextSpan get span => TextSpan( - children: [ - TextSpan(text: userName), - if (pronouns != null) TextSpan(text: ' (${pronouns})', style: TextStyle(fontStyle: FontStyle.italic)) - ], - style: style, - ); - - @override - Widget build(BuildContext context) { - return Text.rich( - span, - overflow: overflow, - style: Theme.of(context).textTheme.titleMedium - ); - } -} diff --git a/apps/flutter_parent/lib/utils/common_widgets/view_attachment/fetcher/attachment_fetcher.dart b/apps/flutter_parent/lib/utils/common_widgets/view_attachment/fetcher/attachment_fetcher.dart deleted file mode 100644 index f0dc7c21a6..0000000000 --- a/apps/flutter_parent/lib/utils/common_widgets/view_attachment/fetcher/attachment_fetcher.dart +++ /dev/null @@ -1,73 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'dart:io'; - -import 'package:dio/dio.dart'; -import 'package:flutter/widgets.dart'; -import 'package:flutter_parent/l10n/app_localizations.dart'; -import 'package:flutter_parent/models/attachment.dart'; -import 'package:flutter_parent/utils/common_widgets/error_panda_widget.dart'; -import 'package:flutter_parent/utils/common_widgets/loading_indicator.dart'; -import 'package:flutter_parent/utils/common_widgets/view_attachment/fetcher/attachment_fetcher_interactor.dart'; -import 'package:flutter_parent/utils/service_locator.dart'; - -class AttachmentFetcher extends StatefulWidget { - final Attachment attachment; - final Widget Function(BuildContext context, File file) builder; - - const AttachmentFetcher({required this.attachment, required this.builder, super.key}); - - @override - _AttachmentFetcherState createState() => _AttachmentFetcherState(); -} - -class _AttachmentFetcherState extends State { - final _interactor = locator(); - late CancelToken _cancelToken; - late Future _fileFuture; - - @override - void initState() { - _cancelToken = _interactor.generateCancelToken(); - _fileFuture = _interactor.fetchAttachmentFile(widget.attachment, _cancelToken); - super.initState(); - } - - @override - Widget build(BuildContext context) { - return FutureBuilder( - future: _fileFuture, - builder: (BuildContext context, AsyncSnapshot snapshot) { - if (snapshot.connectionState == ConnectionState.waiting) { - return LoadingIndicator(); - } else if (snapshot.hasData) { - return widget.builder(context, snapshot.data!); - } else { - return ErrorPandaWidget(L10n(context).errorLoadingFile, () { - setState(() { - _fileFuture = _interactor.fetchAttachmentFile(widget.attachment, _cancelToken); - }); - }); - } - }, - ); - } - - @override - void dispose() { - _cancelToken.cancel(); - super.dispose(); - } -} diff --git a/apps/flutter_parent/lib/utils/common_widgets/view_attachment/fetcher/attachment_fetcher_interactor.dart b/apps/flutter_parent/lib/utils/common_widgets/view_attachment/fetcher/attachment_fetcher_interactor.dart deleted file mode 100644 index ba3385be0f..0000000000 --- a/apps/flutter_parent/lib/utils/common_widgets/view_attachment/fetcher/attachment_fetcher_interactor.dart +++ /dev/null @@ -1,50 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'dart:io'; - -import 'package:dio/dio.dart'; -import 'package:flutter_parent/models/attachment.dart'; -import 'package:flutter_parent/network/api/file_api.dart'; -import 'package:flutter_parent/utils/service_locator.dart'; -import 'package:flutter_parent/utils/veneers/path_provider_veneer.dart'; - -class AttachmentFetcherInteractor { - Future fetchAttachmentFile(Attachment attachment, CancelToken cancelToken) async { - var savePath = await getAttachmentSavePath(attachment); - - // Check if file already exists - var file = File(savePath); - if (await file.exists() && await file.length() == attachment.size) return file; - - return locator().downloadFile(attachment.url!, savePath, cancelToken: cancelToken); - } - - Future getAttachmentSavePath(Attachment attachment) async { - var fileName = attachment.filename; - if (fileName == null || fileName.isEmpty) { - var index = attachment.url!.lastIndexOf('/'); - if (index >= 0 && index < attachment.url!.length - 1) { - fileName = attachment.url!.substring(attachment.url!.lastIndexOf('/') + 1); - } else { - fileName = 'file'; - } - } - fileName = 'attachment-${attachment.id}-$fileName'; - var cacheDir = await locator().getTemporaryDirectory(); - return '${cacheDir.path}/$fileName'; - } - - CancelToken generateCancelToken() => CancelToken(); -} diff --git a/apps/flutter_parent/lib/utils/common_widgets/view_attachment/view_attachment_interactor.dart b/apps/flutter_parent/lib/utils/common_widgets/view_attachment/view_attachment_interactor.dart deleted file mode 100644 index 259e78b6be..0000000000 --- a/apps/flutter_parent/lib/utils/common_widgets/view_attachment/view_attachment_interactor.dart +++ /dev/null @@ -1,46 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:android_intent_plus/android_intent.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_parent/models/attachment.dart'; -import 'package:flutter_parent/utils/permission_handler.dart'; -import 'package:flutter_parent/utils/veneers/android_intent_veneer.dart'; -import 'package:flutter_parent/utils/veneers/flutter_downloader_veneer.dart'; -import 'package:flutter_parent/utils/veneers/path_provider_veneer.dart'; -import 'package:path_provider/path_provider.dart'; -import 'package:permission_handler/permission_handler.dart'; - -import '../../service_locator.dart'; - -class ViewAttachmentInteractor { - Future openExternally(Attachment attachment) async { - AndroidIntent intent = AndroidIntent( - action: 'action_view', - data: attachment.url, - type: attachment.inferContentType(), - ); - await locator().launch(intent); - } - - Future downloadFile(Attachment attachment) async { - var dirs = await locator().getExternalStorageDirectories(type: StorageDirectory.downloads); - locator().enqueue( - url: attachment.url!, - savedDir: dirs![0].path, - showNotification: true, - openFileFromNotification: true, - ); - } -} \ No newline at end of file diff --git a/apps/flutter_parent/lib/utils/common_widgets/view_attachment/view_attachment_screen.dart b/apps/flutter_parent/lib/utils/common_widgets/view_attachment/view_attachment_screen.dart deleted file mode 100644 index e1d03666fc..0000000000 --- a/apps/flutter_parent/lib/utils/common_widgets/view_attachment/view_attachment_screen.dart +++ /dev/null @@ -1,111 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:flutter/material.dart'; -import 'package:flutter_parent/l10n/app_localizations.dart'; -import 'package:flutter_parent/models/attachment.dart'; -import 'package:flutter_parent/utils/common_widgets/view_attachment/view_attachment_interactor.dart'; -import 'package:flutter_parent/utils/common_widgets/view_attachment/viewers/audio_video_attachment_viewer.dart'; -import 'package:flutter_parent/utils/common_widgets/view_attachment/viewers/image_attachment_viewer.dart'; -import 'package:flutter_parent/utils/common_widgets/view_attachment/viewers/text_attachment_viewer.dart'; -import 'package:flutter_parent/utils/common_widgets/view_attachment/viewers/unknown_attachment_type_viewer.dart'; -import 'package:flutter_parent/utils/design/parent_theme.dart'; -import 'package:flutter_parent/utils/service_locator.dart'; - -class ViewAttachmentScreen extends StatefulWidget { - const ViewAttachmentScreen(this.attachment, {super.key}); - - final Attachment attachment; - - @override - _ViewAttachmentScreenState createState() => _ViewAttachmentScreenState(); -} - -class _ViewAttachmentScreenState extends State { - GlobalKey scaffoldKey = GlobalKey(); - - final _interactor = locator(); - - @override - Widget build(BuildContext context) { - return DefaultParentTheme( - builder: (context) => Scaffold( - key: scaffoldKey, - appBar: AppBar( - elevation: 2, - title: Text(widget.attachment.displayName ?? widget.attachment.filename ?? ''), - bottom: ParentTheme.of(context)?.appBarDivider(), - actions: [_overflowMenu()], - ), - body: _body(context), - ), - ); - } - - Widget _body(BuildContext context) { - String? contentType = widget.attachment.inferContentType(); - - if (contentType == null) return UnknownAttachmentTypeViewer(widget.attachment); - - if (contentType.startsWith('audio') || contentType.startsWith('video')) { - return AudioVideoAttachmentViewer(widget.attachment); - } else if (contentType.startsWith('image')) { - return ImageAttachmentViewer(widget.attachment); - } else if (contentType == 'text/plain') { - return TextAttachmentViewer(widget.attachment); - } - - return UnknownAttachmentTypeViewer(widget.attachment); - } - - Widget _overflowMenu() { - return PopupMenuButton( - onSelected: (option) { - if (option == 'open_externally') { - _openExternally(); - } else { - _interactor.downloadFile(widget.attachment); - } - }, - itemBuilder: (context) => [ - PopupMenuItem( - value: 'download', - child: ListTile( - contentPadding: EdgeInsets.zero, - leading: Icon(Icons.file_download), - title: Text(L10n(context).download), - ), - ), - PopupMenuItem( - value: 'open_externally', - child: ListTile( - contentPadding: EdgeInsets.zero, - leading: Icon(Icons.open_in_new), - title: Text(L10n(context).openFileExternally), - ), - ), - ], - ); - } - - _openExternally() { - _interactor.openExternally(widget.attachment).catchError((_) { - ScaffoldMessenger.of(context).showSnackBar( - SnackBar( - content: Text(L10n(context).noApplicationsToHandleFile), - ), - ); - }); - } -} diff --git a/apps/flutter_parent/lib/utils/common_widgets/view_attachment/viewers/audio_video_attachment_viewer.dart b/apps/flutter_parent/lib/utils/common_widgets/view_attachment/viewers/audio_video_attachment_viewer.dart deleted file mode 100644 index 910d13a04e..0000000000 --- a/apps/flutter_parent/lib/utils/common_widgets/view_attachment/viewers/audio_video_attachment_viewer.dart +++ /dev/null @@ -1,123 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:chewie/chewie.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter/widgets.dart'; -import 'package:flutter_parent/l10n/app_localizations.dart'; -import 'package:flutter_parent/models/attachment.dart'; -import 'package:flutter_parent/utils/common_widgets/loading_indicator.dart'; -import 'package:flutter_parent/utils/design/canvas_icons.dart'; -import 'package:flutter_parent/utils/service_locator.dart'; -import 'package:video_player/video_player.dart'; - -import '../../empty_panda_widget.dart'; -import 'audio_video_attachment_viewer_interactor.dart'; - -class AudioVideoAttachmentViewer extends StatefulWidget { - final Attachment attachment; - - bool get isAudio => attachment.inferContentType()?.startsWith('audio') == true; - - const AudioVideoAttachmentViewer(this.attachment, {super.key}); - - @override - _AudioVideoAttachmentViewerState createState() => _AudioVideoAttachmentViewerState(); -} - -class _AudioVideoAttachmentViewerState extends State { - static const defaultAspectRatio = 16 / 9; - - VideoPlayerController? _videoController; - ChewieController? _chewieController; - - final _interactor = locator(); - - late Future controllerFuture; - - @override - void initState() { - controllerFuture = _initController(); - super.initState(); - } - - Future _initController() async { - _videoController = _interactor.makeController(widget.attachment.url!); - - try { - // Initialized the video controller so we can get the aspect ratio - await _videoController?.initialize(); - } catch (e) { - // Intentionally left blank. Errors will be handled by ChewieController.errorBuilder. - } - - // Get aspect ratio from controller, fall back to 16:9 - var aspectRatio = _videoController?.value.aspectRatio; - if (aspectRatio == null || aspectRatio.isNaN || aspectRatio <= 0) aspectRatio = defaultAspectRatio; - - // Set up controller - _chewieController = ChewieController( - videoPlayerController: _videoController!, - aspectRatio: aspectRatio, - autoInitialize: true, - autoPlay: true, - allowedScreenSleep: false, - overlay: widget.isAudio - ? Container( - color: Theme.of(context).scaffoldBackgroundColor, - child: Center( - child: Icon(CanvasIcons.audio), - ), - ) - : Container(), - errorBuilder: (context, error) => _error(context), - ); - return _chewieController!; - } - - @override - Widget build(BuildContext context) { - return FutureBuilder( - future: controllerFuture, - builder: (BuildContext context, AsyncSnapshot snapshot) { - if (snapshot.hasData) { - return Center( - child: Chewie(controller: snapshot.data!), - ); - } else if (snapshot.hasError) { - return _error(context); - } else { - return LoadingIndicator(); - } - }, - ); - } - - Widget _error(BuildContext context) { - return Container( - color: Theme.of(context).scaffoldBackgroundColor, - child: EmptyPandaWidget( - svgPath: 'assets/svg/panda-not-supported.svg', - title: L10n(context).errorPlayingMedia, - ), - ); - } - - @override - void dispose() { - super.dispose(); - _videoController?.dispose(); - _chewieController?.dispose(); - } -} diff --git a/apps/flutter_parent/lib/utils/common_widgets/view_attachment/viewers/audio_video_attachment_viewer_interactor.dart b/apps/flutter_parent/lib/utils/common_widgets/view_attachment/viewers/audio_video_attachment_viewer_interactor.dart deleted file mode 100644 index ed8baf9122..0000000000 --- a/apps/flutter_parent/lib/utils/common_widgets/view_attachment/viewers/audio_video_attachment_viewer_interactor.dart +++ /dev/null @@ -1,21 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:video_player/video_player.dart'; - -class AudioVideoAttachmentViewerInteractor { - VideoPlayerController? makeController(String url) { - return VideoPlayerController.networkUrl(Uri.parse(url)); - } -} diff --git a/apps/flutter_parent/lib/utils/common_widgets/view_attachment/viewers/image_attachment_viewer.dart b/apps/flutter_parent/lib/utils/common_widgets/view_attachment/viewers/image_attachment_viewer.dart deleted file mode 100644 index 49181ae179..0000000000 --- a/apps/flutter_parent/lib/utils/common_widgets/view_attachment/viewers/image_attachment_viewer.dart +++ /dev/null @@ -1,55 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:flutter/material.dart'; -import 'package:flutter_parent/l10n/app_localizations.dart'; -import 'package:flutter_parent/models/attachment.dart'; -import 'package:flutter_parent/utils/common_widgets/empty_panda_widget.dart'; -import 'package:flutter_parent/utils/common_widgets/loading_indicator.dart'; -import 'package:flutter_svg/flutter_svg.dart'; -import 'package:photo_view/photo_view.dart'; - -class ImageAttachmentViewer extends StatelessWidget { - final Attachment attachment; - - const ImageAttachmentViewer(this.attachment, {super.key}); - - @override - Widget build(BuildContext context) { - var minScale = PhotoViewComputedScale.contained; - var backgroundDecoration = BoxDecoration(color: Theme.of(context).scaffoldBackgroundColor); - - if (attachment.inferContentType()?.contains('svg') == true) { - return PhotoView.customChild( - backgroundDecoration: backgroundDecoration, - child: SvgPicture.network( - attachment.url ?? '', - placeholderBuilder: (context) => LoadingIndicator(), - ), - minScale: minScale, - ); - } - - return PhotoView( - backgroundDecoration: backgroundDecoration, - imageProvider: NetworkImage(attachment.url ?? ''), - minScale: minScale, - loadingBuilder: (context, imageChunkEvent) => LoadingIndicator(), - errorBuilder: (context, error, stackTrace) => EmptyPandaWidget( - svgPath: 'assets/svg/panda-not-supported.svg', - title: L10n(context).errorLoadingImage, - ), - ); - } -} diff --git a/apps/flutter_parent/lib/utils/common_widgets/view_attachment/viewers/text_attachment_viewer.dart b/apps/flutter_parent/lib/utils/common_widgets/view_attachment/viewers/text_attachment_viewer.dart deleted file mode 100644 index 32cfad542a..0000000000 --- a/apps/flutter_parent/lib/utils/common_widgets/view_attachment/viewers/text_attachment_viewer.dart +++ /dev/null @@ -1,69 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:flutter/widgets.dart'; -import 'package:flutter_parent/models/attachment.dart'; -import 'package:flutter_parent/utils/common_widgets/view_attachment/fetcher/attachment_fetcher.dart'; - -class TextAttachmentViewer extends StatefulWidget { - final Attachment attachment; - - const TextAttachmentViewer(this.attachment, {super.key}); - - @override - _TextAttachmentViewerState createState() => _TextAttachmentViewerState(); -} - -class _TextAttachmentViewerState extends State { - static const minTextSize = 10.0; - static const maxTextSize = 48.0; - - var _textSize = 14.0; - var _referenceTextSize; - - @override - Widget build(BuildContext context) { - return AttachmentFetcher( - attachment: widget.attachment, - builder: (context, file) { - return LayoutBuilder( - builder: (context, size) => GestureDetector( - onScaleStart: (_) => _referenceTextSize = _textSize, - onScaleUpdate: (scaleDetails) { - var newSize = _referenceTextSize * scaleDetails.scale; - if (newSize < minTextSize) newSize = minTextSize; - if (newSize > maxTextSize) newSize = maxTextSize; - setState(() { - _textSize = newSize; - }); - }, - child: Container( - width: size.maxWidth, - height: size.maxHeight, - child: SingleChildScrollView( - child: Padding( - padding: const EdgeInsets.all(16), - child: Text( - file.readAsStringSync(), - style: TextStyle(fontSize: _textSize), - ), - ), - ), - ), - ), - ); - }, - ); - } -} diff --git a/apps/flutter_parent/lib/utils/common_widgets/view_attachment/viewers/unknown_attachment_type_viewer.dart b/apps/flutter_parent/lib/utils/common_widgets/view_attachment/viewers/unknown_attachment_type_viewer.dart deleted file mode 100644 index 2eea62b257..0000000000 --- a/apps/flutter_parent/lib/utils/common_widgets/view_attachment/viewers/unknown_attachment_type_viewer.dart +++ /dev/null @@ -1,33 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:flutter/material.dart'; -import 'package:flutter_parent/l10n/app_localizations.dart'; -import 'package:flutter_parent/models/attachment.dart'; -import 'package:flutter_parent/utils/common_widgets/empty_panda_widget.dart'; - -class UnknownAttachmentTypeViewer extends StatelessWidget { - final Attachment attachment; - - const UnknownAttachmentTypeViewer(this.attachment, {super.key}); - - @override - Widget build(BuildContext context) { - return EmptyPandaWidget( - svgPath: 'assets/svg/panda-not-supported.svg', - title: L10n(context).unsupportedFileTitle, - subtitle: L10n(context).unsupportedFileMessage, - ); - } -} diff --git a/apps/flutter_parent/lib/utils/common_widgets/web_view/canvas_web_view.dart b/apps/flutter_parent/lib/utils/common_widgets/web_view/canvas_web_view.dart deleted file mode 100644 index 4052a2549f..0000000000 --- a/apps/flutter_parent/lib/utils/common_widgets/web_view/canvas_web_view.dart +++ /dev/null @@ -1,309 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -import 'package:flutter/foundation.dart'; -import 'package:flutter/gestures.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_parent/l10n/app_localizations.dart'; -import 'package:flutter_parent/network/utils/api_prefs.dart'; -import 'package:flutter_parent/router/panda_router.dart'; -import 'package:flutter_parent/utils/common_widgets/loading_indicator.dart'; -import 'package:flutter_parent/utils/common_widgets/web_view/web_content_interactor.dart'; -import 'package:flutter_parent/utils/design/parent_theme.dart'; -import 'package:flutter_parent/utils/quick_nav.dart'; -import 'package:flutter_parent/utils/service_locator.dart'; -import 'package:flutter_parent/utils/web_view_utils.dart'; -import 'package:webview_flutter/webview_flutter.dart'; - -/// A general purpose web view to display html content to users. -class CanvasWebView extends StatefulWidget { - /// Flag to authenticate links in the provided html content - final bool authContentIfNecessary; - - /// The html content to load into the webview - final String? content; - - /// The empty description to show when the provided content is blank - final String? emptyDescription; - - /// Flag to set the webview as fullscreen, otherwise it resizes to fit it's content size (used for embedding html content on a screen with other widgets) - /// - /// Note: When set to true, overscroll gestures tend to get swallowed and disables the use of a [RefreshIndicator] PTR - final bool fullScreen; - - /// If set, delays loading the page once the webview is created - final Future? futureDelay; - - /// The horizontal padding to add to the content being loaded - final double horizontalPadding; - - /// The initial height to set the webview to, not used if [fullScreen] is true - final double initialHeight; - - const CanvasWebView({ - this.authContentIfNecessary = true, - this.content, - this.emptyDescription, - this.fullScreen = true, - this.futureDelay = null, - this.horizontalPadding = 0, - this.initialHeight = 1, - super.key, - }); - - @override - _CanvasWebViewState createState() => _CanvasWebViewState(); -} - -class _CanvasWebViewState extends State { - String? _content; - Future? _contentFuture; - - WebContentInteractor get _interactor => locator(); - - @override - void initState() { - _content = widget.content; - super.initState(); - } - - @override - Widget build(BuildContext context) { - if (!widget.authContentIfNecessary) { - _contentFuture = Future.value(widget.content); - } else if (_contentFuture == null || _content != widget.content) { - // If we don't have a future or if the content has changed (i.e., PTR changed the data), update the content future - _content = widget.content; - _contentFuture = _interactor.authContent(_content, L10n(context).launchExternalTool); - } - - return _ResizingWebView( - contentFuture: _contentFuture, - emptyDescription: widget.emptyDescription, - initialHeight: widget.initialHeight, - horizontalPadding: widget.horizontalPadding, - fullScreen: widget.fullScreen, - futureDelay: widget.futureDelay, - ); - } -} - -class _ResizingWebView extends StatefulWidget { - final Future? contentFuture; - final String? emptyDescription; - - final double initialHeight; - final double horizontalPadding; - - final bool fullScreen; - final Future? futureDelay; - - const _ResizingWebView({ - this.contentFuture, - required this.emptyDescription, - required this.initialHeight, - required this.horizontalPadding, - required this.fullScreen, - required this.futureDelay, - super.key - }); - - @override - _ResizingWebViewState createState() => _ResizingWebViewState(); -} - -class _ResizingWebViewState extends State<_ResizingWebView> with WidgetsBindingObserver { - String? _content; - WebViewController? _controller; - late double _height; - late bool _loading; - late bool _inactive; - - WebContentInteractor get _interactor => locator(); - - @override - void initState() { - _height = widget.initialHeight; - - // We avoid using _loading in tests due to the complexity of mocking its dependencies. - // We determine if we're in a test by checking the runtime type of WidgetsBinding. In prod it's an instance of - // WidgetsFlutterBinding and in tests it's an instance of AutomatedTestWidgetsFlutterBinding. - var isTest = WidgetsBinding.instance.runtimeType != WidgetsFlutterBinding; - - _loading = true && !isTest; - _inactive = false; - - WidgetsBinding.instance.addObserver(this); - super.initState(); - } - - @override - void dispose() { - _controller = null; - WidgetsBinding.instance.removeObserver(this); - - super.dispose(); - } - - /// Adding this observer method to watch for inactive states, which can break the webview. More on this discussion - /// can be found here: https://github.com/flutter/flutter/issues/28651 - /// - /// There were fix attempts by the flutter team to prevent the JNI link error, but we can still reproduce by doing - /// the following steps: - /// Kill the app -> Click a link that goes to a screen with a webview (assignment details) -> Open in parent app -> - /// Press back -> Click a link -> Open in parent app -> App crashes - @override - void didChangeAppLifecycleState(AppLifecycleState state) { - print(state); - switch (state) { - case AppLifecycleState.inactive: - setState(() => _inactive = true); - break; - case AppLifecycleState.resumed: - setState(() => _inactive = false); - break; - default: - break; - } - } - - @override - Widget build(BuildContext context) { - return FutureBuilder( - future: widget.contentFuture, - builder: (context, AsyncSnapshot snapshot) => FutureBuilder( - future: widget.futureDelay, - builder: (context, delay) { - // We're delaying if we're still waiting for data (besides a pull to refresh, show the previous while waiting for new data) - final delaying = (snapshot.connectionState == ConnectionState.waiting && !snapshot.hasData) || - delay.connectionState == ConnectionState.waiting; - - // If there is no content, and we're not delaying, then we can stop showing loading since pageFinished will never get called - final emptyContent = (snapshot.data == null || snapshot.data!.isEmpty); - if (!delaying && emptyContent) _loading = false; - - return Stack( - children: [ - if (!delaying) _contentBody(snapshot.data, emptyContent), - if (_loading || delaying) - // Wrap in a container that's the scaffold color so we don't get the gross black bar while webview is initializing - Container( - color: Theme.of(context).scaffoldBackgroundColor, - child: LoadingIndicator(), - ), - ], - ); - }, - ), - ); - } - - Widget _contentBody(String? widgetContent, bool emptyContent) { - // Check for empty content - if (emptyContent) { - if (widget.emptyDescription?.isEmpty ?? true) { - return Container(); // No empty text, so just be empty - } else { - return Padding( - padding: EdgeInsets.symmetric(horizontal: widget.horizontalPadding), - child: Text(widget.emptyDescription ?? '', style: Theme.of(context).textTheme.bodyMedium), - ); - } - } - - // If we are not active, don't display a webview - if (_inactive) { - return Container(); - } - - // Handle being rebuilt by parent widgets (refresh) - if (_content != widgetContent) { - _height = widget.initialHeight; - _content = widgetContent!; - _controller?.loadHtml(_content, - horizontalPadding: widget.horizontalPadding, - darkMode: ParentTheme.of(context)?.isWebViewDarkMode ?? false); - } - - Widget child = WebView( - javascriptMode: JavascriptMode.unrestricted, - onPageFinished: _handlePageLoaded, - onWebViewCreated: _handleWebViewCreated, - navigationDelegate: _handleNavigation, - gestureRecognizers: _webViewGestures(), - javascriptChannels: _webViewChannels(), - ); - - if (!widget.fullScreen) { - child = ConstrainedBox( - constraints: BoxConstraints(maxHeight: _height), - child: child, - ); - } - - return child; - } - - Future _handleNavigation(NavigationRequest request) async { - // Otherwise, we'll let the router handle it - locator().routeInternally(context, request.url); - return NavigationDecision.prevent; - } - - void _handleWebViewCreated(WebViewController webViewController) async { - webViewController.loadHtml(_content, - baseUrl: ApiPrefs.getDomain(), - horizontalPadding: widget.horizontalPadding, - darkMode: ParentTheme.of(context)?.isWebViewDarkMode ?? false); - _controller = webViewController; - } - - void _handlePageLoaded(String url) async { - if (!mounted) return; - - setState(() => _loading = false); - - // Don't resize if fullscreen, or if a link was clicked - // TODO: May not need initialHeight check for links with new navigation request handling - if (widget.fullScreen || _height != widget.initialHeight) return; - final height = double.tryParse((await _controller?.evaluateJavascript('document.documentElement.scrollHeight;')) ?? - (widget.initialHeight + 1).toString()) ?? - widget.initialHeight; - - // TODO: May need to revisit this in the future, on an emulator I was able to get an out of resource exception for too big of a canvas - // here for creating too large of a webview. Doesn't seem to happen on a real device, will have to monitor crashes. - // One possible idea is to set to let the max height of the content be the height of the available space (wrapping - // the ConstrainedBox in a LayoutBuilder to size appropriately). Though this would require adding the - // WebViewGestureRecognizer, which doesn't support PTR, and would need some extra flag besides just fullScreen. - if (!mounted) return; // Possible race condition here - setState(() => _height = height); - } - - Set> _webViewGestures() { - final gestures = Set>(); - - // Only add the gesture recognizer if we're a full screen webview, otherwise PTR detection gets swallowed - if (widget.fullScreen) { - gestures.add(Factory(() => WebViewGestureRecognizer())); - } - - return gestures; - } - - Set _webViewChannels() { - return Set() - ..add(_interactor.ltiToolPressedChannel((JavascriptMessage message) { - PandaRouter.routeInternally(context, message.message); - })); - } -} diff --git a/apps/flutter_parent/lib/utils/common_widgets/web_view/html_description_screen.dart b/apps/flutter_parent/lib/utils/common_widgets/web_view/html_description_screen.dart deleted file mode 100644 index 0cee461ab5..0000000000 --- a/apps/flutter_parent/lib/utils/common_widgets/web_view/html_description_screen.dart +++ /dev/null @@ -1,36 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -import 'package:flutter/material.dart'; -import 'package:flutter_parent/l10n/app_localizations.dart'; -import 'package:flutter_parent/utils/common_widgets/web_view/canvas_web_view.dart'; -import 'package:flutter_parent/utils/design/parent_theme.dart'; - -class HtmlDescriptionScreen extends StatelessWidget { - /// Html passed to a full screen web view - final String? html; - final String appBarTitle; - - const HtmlDescriptionScreen(this.html, this.appBarTitle, {super.key}); - - @override - Widget build(BuildContext context) { - return Scaffold( - appBar: AppBar( - bottom: ParentTheme.of(context)?.appBarDivider(), - title: Text(appBarTitle), - ), - body: CanvasWebView(content: html, horizontalPadding: 16), - ); - } -} diff --git a/apps/flutter_parent/lib/utils/common_widgets/web_view/html_description_tile.dart b/apps/flutter_parent/lib/utils/common_widgets/web_view/html_description_tile.dart deleted file mode 100644 index 579932a3a1..0000000000 --- a/apps/flutter_parent/lib/utils/common_widgets/web_view/html_description_tile.dart +++ /dev/null @@ -1,127 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -import 'package:flutter/material.dart'; -import 'package:flutter_parent/l10n/app_localizations.dart'; -import 'package:flutter_parent/utils/common_widgets/web_view/html_description_screen.dart'; -import 'package:flutter_parent/utils/design/parent_colors.dart'; -import 'package:flutter_parent/utils/design/parent_theme.dart'; -import 'package:flutter_parent/utils/quick_nav.dart'; -import 'package:flutter_parent/utils/service_locator.dart'; - -/// A simple class to handle wrapping embedded html content. Displays a description title with a student colored -/// button to view the html in a full screen web view. This is done to avoid creating embedded web views that are -/// too large and crash devices. By using a full screen web view [HtmlDescriptionScreen] we can let the webview handle -/// its content and scrolling. -/// -/// Handles showing an empty state if there is no html content (null or empty), provided that emptyDescription is also -/// not null or empty. -class HtmlDescriptionTile extends StatelessWidget { - /// Html passed to a full screen web view - final String? html; - - /// Only used if an emptyDescription is not null or not empty. - /// Defaults to AppLocalizations.descriptionTitle - final String? descriptionTitle; - - /// Only used if html is not null and not empty. - /// Defaults to AppLocalizations.viewDescription - final String? buttonLabel; - - /// If null or empty, this will render an empty container and nothing else. - final String? emptyDescription; - - const HtmlDescriptionTile({ - required this.html, - this.descriptionTitle, - this.buttonLabel, - this.emptyDescription, - super.key, - }); - - @override - Widget build(BuildContext context) { - if (html == null || html?.isEmpty == true) { - return _buildEmptyState(context); - } - - return InkWell( - onTap: () => _launchSimpleWebView(context), - child: Padding( - padding: const EdgeInsets.symmetric(vertical: 16), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - _title(context), - Text( - buttonLabel ?? L10n(context).viewDescription, - style: Theme.of(context).textTheme.titleMedium?.copyWith(color: ParentTheme.of(context)?.studentColor), - ), - ], - ), - Icon(Icons.arrow_forward, color: ParentColors.tiara), - ], - ), - ), - ); - } - - Widget _title(BuildContext context) { - return Padding( - padding: const EdgeInsets.only(bottom: 8), - child: Text(descriptionTitle ?? L10n(context).descriptionTitle, style: Theme.of(context).textTheme.labelSmall), - ); - } - - Widget _buildEmptyState(BuildContext context) { - // No empty text, so just be empty - if (emptyDescription == null || emptyDescription!.isEmpty) return Container(); - - final parentTheme = ParentTheme.of(context); - return Padding( - padding: const EdgeInsets.symmetric(vertical: 16), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - _title(context), - Container( - width: double.infinity, - height: 72, - padding: EdgeInsets.all(16), - decoration: BoxDecoration( - color: parentTheme?.nearSurfaceColor, - borderRadius: BorderRadius.circular(4), - ), - child: Center( - child: Text( - emptyDescription!, - style: Theme.of(context).textTheme.titleSmall?.copyWith(color: parentTheme?.onSurfaceColor), - ), - ), - ), - ], - ), - ); - } - - _launchSimpleWebView(BuildContext context) { - // We don't want/need a route for this screen, as passing around large amounts of html may break Flutter routing or - // may have personally identifiable information (and shouldn't be logged by the screen parameter analytics). - // We'll at least get a screen view for that screen name, and a log entry, so we should still be able to track - // any issues that come from navigating to this screen. - locator().push(context, HtmlDescriptionScreen(html!, L10n(context).descriptionTitle)); - } -} diff --git a/apps/flutter_parent/lib/utils/common_widgets/web_view/simple_web_view_screen.dart b/apps/flutter_parent/lib/utils/common_widgets/web_view/simple_web_view_screen.dart deleted file mode 100644 index dcb7c6ba10..0000000000 --- a/apps/flutter_parent/lib/utils/common_widgets/web_view/simple_web_view_screen.dart +++ /dev/null @@ -1,139 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:flutter/foundation.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_parent/network/utils/api_prefs.dart'; -import 'package:flutter_parent/utils/design/parent_theme.dart'; -import 'package:flutter_parent/utils/web_view_utils.dart'; -import 'package:webview_flutter/webview_flutter.dart'; - -import '../../service_locator.dart'; -import '../../url_launcher.dart'; - -class SimpleWebViewScreen extends StatefulWidget { - final String url; - final String title; - final String? infoText; - final Map? initialCookies; - final bool limitWebAccess; - - SimpleWebViewScreen( - this.url, - this.title, - this.limitWebAccess, { - String? infoText, - Map? initialCookies, - }) : this.infoText = infoText, - this.initialCookies = initialCookies; - - @override - State createState() => _SimpleWebViewScreenState(); -} - -class _SimpleWebViewScreenState extends State { - WebViewController? _controller; - - @override - Widget build(BuildContext context) { - return WillPopScope( - onWillPop: () => _handleBackPress(context), - child: Scaffold( - appBar: AppBar( - elevation: 0, - backgroundColor: Colors.transparent, - iconTheme: Theme.of(context).iconTheme, - bottom: ParentTheme.of(context)?.appBarDivider(shadowInLightMode: false), - title: Text(widget.title, style: Theme.of(context).textTheme.titleLarge), - ), - body: WebView( - javascriptMode: JavascriptMode.unrestricted, - userAgent: ApiPrefs.getUserAgent(), - gestureRecognizers: Set()..add(Factory(() => WebViewGestureRecognizer())), - navigationDelegate: _handleNavigation, - onWebViewCreated: (controller) { - _controller = controller; - controller.loadUrl(widget.url); - }, - onPageFinished: _handlePageLoaded, - initialCookies: _getCookies(), - ), - ), - ); - } - - NavigationDecision _handleNavigation(NavigationRequest request) { - if (request.url.contains('/download?download_frd=')) { - locator().launch(request.url); - return NavigationDecision.prevent; - } - if (!request.isForMainFrame || widget.url.startsWith(request.url) || !widget.limitWebAccess) return NavigationDecision.navigate; - return NavigationDecision.prevent; - } - - void _handlePageLoaded(String url) async { - // If there's no info to show, just return - if (widget.infoText == null || widget.infoText!.isEmpty) return; - - // Run javascript to show the info alert - await _controller?.evaluateJavascript(_showAlertJavascript); - } - - String _getDomain() { - final uri = Uri.parse(widget.url); - return uri.host; - } - - List _getCookies() { - return widget.initialCookies?.entries - .map((entry) => WebViewCookie(name: entry.key.toString(), value: entry.value.toString(), domain: _getDomain())) - .toList() ?? - []; - } - - String get _showAlertJavascript => """ - const floatNode = `
- -
` - - \$(floatNode) - .appendTo(\$('body')[0]) - .on('click', 'button', event => { - \$('#flash_message_holder_mobile').remove() - }) - """; - - @override - void dispose() { - super.dispose(); - _controller = null; - } - - Future _handleBackPress(BuildContext context) async { - if (await _controller?.canGoBack() == true) { - _controller?.goBack(); - return Future.value(false); - } else { - return Future.value(true); - } - } -} diff --git a/apps/flutter_parent/lib/utils/common_widgets/web_view/web_content_interactor.dart b/apps/flutter_parent/lib/utils/common_widgets/web_view/web_content_interactor.dart deleted file mode 100644 index 58c39f237c..0000000000 --- a/apps/flutter_parent/lib/utils/common_widgets/web_view/web_content_interactor.dart +++ /dev/null @@ -1,98 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -import 'package:flutter_parent/network/api/oauth_api.dart'; -import 'package:flutter_parent/network/utils/api_prefs.dart'; -import 'package:flutter_parent/utils/service_locator.dart'; -import 'package:webview_flutter/webview_flutter.dart'; - -class WebContentInteractor { - /// See [assets/html/html_wrapper.html] for usage of these strings - final _onLtiToolButtonPressedChannel = 'OnLtiToolButtonPressed'; - final _onLtiToolButtonPressedFunction = 'onLtiToolButtonPressed'; - - OAuthApi get _api => locator.get(); - - Future _authUrl(String targetUrl) async { - return (await _api.getAuthenticatedUrl(targetUrl))?.sessionUrl ?? targetUrl; - } - - Future getAuthUrl(String targetUrl) async { - final domain = ApiPrefs.getDomain(); - if (domain != null && targetUrl.contains(domain)) { - return _authUrl(targetUrl); - } else { - return targetUrl; - } - } - - Future? authContent(String? content, String? externalToolButtonText) async { - if (content == null || content.isEmpty) return Future.value(content); - - String authContent = content; - final iframeMatcher = RegExp(''); - final matches = iframeMatcher.allMatches(content); - - for (RegExpMatch element in matches) { - final iframe = element.group(0); - if (iframe != null) { - if (RegExp('id=\"cnvs_content\"').hasMatch(iframe)) { - authContent = await _handleCanvasContent(iframe, authContent); - } else if (RegExp('external_tool').hasMatch(iframe)) { - authContent = await _handleLti(iframe, authContent, externalToolButtonText); - } - } - } - - return authContent; - } - - /// This is a general workaround for institutions that want to include any kind of content in an iframe - Future _handleCanvasContent(String iframe, String content) async { - final matcher = RegExp('src=\"([^\"]+)\"').firstMatch(iframe); - - if (matcher != null) { - final sourceUrl = matcher.group(1); - if (sourceUrl != null) { - final authUrl = await _authUrl(sourceUrl); - final newIframe = iframe.replaceFirst(sourceUrl, authUrl); - content = content.replaceFirst(iframe, newIframe); - } - } - - return content; - } - - Future _handleLti(String iframe, String content, externalToolButtonText) async { - final matcher = RegExp('src=\"([^\"]+)\"').firstMatch(iframe); - if (matcher != null) { - final sourceUrl = matcher.group(1); - // Make sure this REALLY is an LTI src, this check might need to be upgraded in the future... - if (sourceUrl != null && sourceUrl.contains('external_tools')) { - final authUrl = await _authUrl(sourceUrl); - final newIframe = iframe.replaceFirst(sourceUrl, authUrl); - - final button = - '

$externalToolButtonText

'; - - content = content.replaceFirst(iframe, newIframe + button); - } - } - - return content; - } - - JavascriptChannel ltiToolPressedChannel(JavascriptMessageHandler handler) { - return JavascriptChannel(name: _onLtiToolButtonPressedChannel, onMessageReceived: handler); - } -} diff --git a/apps/flutter_parent/lib/utils/core_extensions/date_time_extensions.dart b/apps/flutter_parent/lib/utils/core_extensions/date_time_extensions.dart deleted file mode 100644 index c7479dc56a..0000000000 --- a/apps/flutter_parent/lib/utils/core_extensions/date_time_extensions.dart +++ /dev/null @@ -1,78 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:intl/intl.dart'; - -/// Returns a locale usable by DateTime formatters. This will generally be the current locale, but will fall back -/// to the 'en' locale if the current locale is unsupported. -String get supportedDateLocale => DateFormat.localeExists(Intl.getCurrentLocale()) ? Intl.getCurrentLocale() : 'en'; - -extension Format on DateTime? { - /// Formats this [DateTime] for the current locale using the provided localization function - String? l10nFormat( - String Function(String date, String time)? localizer, { - DateFormat? dateFormat, - DateFormat? timeFormat, - }) { - if (this == null || localizer == null) return null; - DateTime local = this!.toLocal(); - String date = (dateFormat ?? DateFormat.MMMd(supportedDateLocale)).format(local); - String time = (timeFormat ?? DateFormat.jm(supportedDateLocale)).format(local); - return localizer(date, time); - } - - bool isSameDayAs(DateTime? other) { - if (this == null || other == null) return false; - return this!.year == other.year && this!.month == other.month && this!.day == other.day; - } - - DateTime? withFirstDayOfWeek() { - if (this == null) return null; - final firstDay = DateFormat(null, supportedDateLocale).dateSymbols.FIRSTDAYOFWEEK; - var offset = (this!.weekday - 1 - firstDay) % 7; - return DateTime(this!.year, this!.month, this!.day - offset); - } - - int? get localDayOfWeek { - if (this == null) return null; - final firstDay = DateFormat(null, supportedDateLocale).dateSymbols.FIRSTDAYOFWEEK; - return (this!.weekday - 1 - firstDay) % 7; - } - - bool isWeekend() { - if (this == null) return false; - return DateFormat(null, supportedDateLocale).dateSymbols.WEEKENDRANGE.contains((this!.weekday - 1) % 7); - } - - DateTime? withStartOfDay() => this == null ? null : DateTime(this!.year, this!.month, this!.day); - - DateTime? withEndOfDay() => this == null ? null : DateTime(this!.year, this!.month, this!.day, 23, 59, 59, 999); - - DateTime? withStartOfMonth() => this == null ? null : DateTime(this!.year, this!.month, 1); - - DateTime? withEndOfMonth() => this == null ? null : DateTime(this!.year, this!.month + 1, 0, 23, 59, 59, 999); - - /// Returns this DateTime rounded to the nearest date at midnight. In other words, if the time is before noon this - /// will return the same date but with the time set to midnight. If the time is at noon or after noon, this will - /// return the following day at midnight. - DateTime? roundToMidnight() { - if (this == null) { - return null; - } else if (this!.hour >= 12) { - return DateTime(this!.year, this!.month, this!.day + 1); - } else { - return withStartOfDay(); - } - } -} diff --git a/apps/flutter_parent/lib/utils/core_extensions/list_extensions.dart b/apps/flutter_parent/lib/utils/core_extensions/list_extensions.dart deleted file mode 100644 index 977e676abb..0000000000 --- a/apps/flutter_parent/lib/utils/core_extensions/list_extensions.dart +++ /dev/null @@ -1,99 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -/// Defines the sort order of null values when compared to non-null values -enum NullSortOrder { - /// Null values are treated as being greater than the non-null values to which they are compared - greaterThan, - - /// Null values are treated as being less than the non-null values to which they are compared - lessThan, - - /// Null values are treated as being equal to the non-null values to which they are compared - equal, - - /// Null values will not be handled specially. Throws an [ArgumentError] when comparing null values to non-null values. - none, -} - -typedef Comparable? Selector(T? element); - -extension ListUtils on List? { - /// Sorts elements in-place according to the natural sort order of the value returned by the specified [selectors]. - /// Subsequent selectors will only be used when elements returned by preceding selectors have the same sort order. - List? sortBySelector( - List> selectors, { - bool descending = false, - NullSortOrder nullSortOrder = NullSortOrder.greaterThan, - }) { - if (this == null || this?.isEmpty == true || selectors.isEmpty) return this; - this!.sort((a, b) { - int result = 0; - for (int i = 0; i < selectors.length; i++) { - var selector = selectors[i]; - - var value1 = selector(descending ? b : a); - var value2 = selector(descending ? a : b); - - if (value1 != null && value2 != null) { - // Both values are non-null; perform a direct comparison. - result = value1.compareTo((value2)); - } else if ((value1 == null) != (value2 == null)) { - // Only one of the values is null - switch (nullSortOrder) { - case NullSortOrder.greaterThan: - result = value1 == null ? 1 : -1; - break; - case NullSortOrder.lessThan: - result = value1 == null ? -1 : 1; - break; - case NullSortOrder.equal: - result = 0; - break; - case NullSortOrder.none: - var validValue = value1 ?? value2; - throw ArgumentError('Cannot compare null to $validValue. Consider using a different NullSortOrder.'); - } - } else { - // Both values are null; treat them as equal. - result = 0; - } - - // Skip subsequent comparisons if we have already found a difference - if (result != 0) break; - } - return result; - }); - return this; - } - - /// Returns the number of elements matching the given [predicate]. - int count(bool Function(T?) predicate) { - if (this == null) return 0; - var count = 0; - this!.forEach((element) { - if (predicate(element)) ++count; - }); - return count; - } - - List? mapIndexed(R transform(int index, T? t)) { - if (this == null) return null; - final List list = []; - for (int i = 0; i < this!.length; i++) { - list.add(transform(i, this![i])); - } - return list; - } -} diff --git a/apps/flutter_parent/lib/utils/crash_utils.dart b/apps/flutter_parent/lib/utils/crash_utils.dart deleted file mode 100644 index d3dfb4e50f..0000000000 --- a/apps/flutter_parent/lib/utils/crash_utils.dart +++ /dev/null @@ -1,51 +0,0 @@ -// Copyright (C) 2019 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:firebase_crashlytics/firebase_crashlytics.dart'; -import 'package:flutter/foundation.dart'; -import 'package:flutter/widgets.dart'; -import 'package:flutter_parent/network/utils/api_prefs.dart'; -import 'package:flutter_parent/screens/crash_screen.dart'; -import 'package:flutter_parent/utils/service_locator.dart'; - -class CrashUtils { - static Future init() async { - // Set up error handling - FirebaseCrashlytics firebase = locator(); - - FlutterError.onError = (error) async { - // We don't know how the crashlytics stores the userId so we just set it to empty to make sure we don't log it. - await firebase.setUserIdentifier(''); - firebase.recordFlutterError(error); - }; - - if (kReleaseMode) { - await firebase.setCrashlyticsCollectionEnabled(true); - } else { - await firebase.setCrashlyticsCollectionEnabled(false); - } - - // Set up custom crash screen - ErrorWidget.builder = (error) { - // Only need to dump errors in debug, release builds call onError - if (kReleaseMode) { - firebase.recordFlutterError(error); - firebase.log('Widget Crash'); - } else { - FlutterError.dumpErrorToConsole(error); - } - return CrashScreen(error); - }; - } -} diff --git a/apps/flutter_parent/lib/utils/db/calendar_filter_db.dart b/apps/flutter_parent/lib/utils/db/calendar_filter_db.dart deleted file mode 100644 index 9fe7e5f93c..0000000000 --- a/apps/flutter_parent/lib/utils/db/calendar_filter_db.dart +++ /dev/null @@ -1,129 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:built_collection/built_collection.dart'; -import 'package:flutter_parent/models/calendar_filter.dart'; -import 'package:flutter_parent/utils/service_locator.dart'; -import 'package:sqflite/sqflite.dart'; - -class CalendarFilterDb { - static const String tableName = 'calendar_filter'; - - static const String columnId = '_id'; - static const String columnUserDomain = 'user_domain'; - static const String columnUserId = 'user_id'; - static const String columnObserveeId = 'observee_id'; - static const String columnFilters = 'filters'; - - static const allColumns = [ - columnId, - columnUserDomain, - columnUserId, - columnObserveeId, - columnFilters, - ]; - - Database db = locator(); - - static Map toMap(CalendarFilter data) => { - columnId: data.id, - columnUserDomain: data.userDomain, - columnUserId: data.userId, - columnObserveeId: data.observeeId, - columnFilters: joinFilters(data.filters.toSet()), - }; - - static CalendarFilter fromMap(Map map) => CalendarFilter((b) => b - ..id = map[columnId] - ..userDomain = map[columnUserDomain] - ..userId = map[columnUserId] - ..observeeId = map[columnObserveeId] - ..filters = SetBuilder(splitFilters(map[columnFilters]))); - - static Future createTable(Database db, int version) async { - await db.execute(''' - create table $tableName ( - $columnId integer primary key autoincrement, - $columnUserDomain text not null, - $columnUserId text not null, - $columnObserveeId text not null, - $columnFilters text not null) - '''); - } - - static Future updateTable(Database db, int oldVersion, int newVersion) async { - if (oldVersion < 2) { - // This table was added in database version 2 - await db.execute(''' - create table $tableName ( - $columnId integer primary key autoincrement, - $columnUserDomain text not null, - $columnUserId text not null, - $columnObserveeId text not null, - $columnFilters text not null) - '''); - } - } - - static String joinFilters(Set? filters) { - if (filters == null || filters.isEmpty) return ''; - return filters.join('|'); - } - - static Set splitFilters(String? joinedFilters) { - if (joinedFilters == null || joinedFilters.isEmpty) return {}; - return joinedFilters.split('|').toSet(); - } - - Future insertOrUpdate(CalendarFilter data) async { - CalendarFilter? existing = await getByObserveeId(data.userDomain, data.userId, data.observeeId); - if (existing == null) { - var id = await db.insert(tableName, toMap(data)); - return getById(id); - } else { - data = data.rebuild((b) => b..id = existing.id); - var id = await db.update(tableName, toMap(data), where: '$columnId = ?', whereArgs: [existing.id]); - return getById(id); - } - } - - Future getById(int id) async { - List maps = await db.query(tableName, columns: allColumns, where: '$columnId = ?', whereArgs: [id]); - if (maps.isNotEmpty) return fromMap(maps.first); - return null; - } - - Future getByObserveeId(String userDomain, String userId, String observeeId) async { - List maps = await db.query( - tableName, - columns: allColumns, - where: '$columnUserDomain = ? AND $columnUserId = ? AND $columnObserveeId = ?', - whereArgs: [userDomain, userId, observeeId], - ); - if (maps.isNotEmpty) return fromMap(maps.first); - return null; - } - - Future deleteById(int id) { - return db.delete(tableName, where: '$columnId = ?', whereArgs: [id]); - } - - Future deleteAllForUser(String? userDomain, String? userId) { - return db.delete( - tableName, - where: '$columnUserDomain = ? AND $columnUserId = ?', - whereArgs: [userDomain, userId], - ); - } -} diff --git a/apps/flutter_parent/lib/utils/db/db_util.dart b/apps/flutter_parent/lib/utils/db/db_util.dart deleted file mode 100644 index f894728c05..0000000000 --- a/apps/flutter_parent/lib/utils/db/db_util.dart +++ /dev/null @@ -1,54 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:flutter_parent/utils/db/calendar_filter_db.dart'; -import 'package:flutter_parent/utils/db/reminder_db.dart'; -import 'package:flutter_parent/utils/db/user_colors_db.dart'; -import 'package:sqflite/sqflite.dart'; - -List _creators = [ - ReminderDb.createTable, - CalendarFilterDb.createTable, - UserColorsDb.createTable, -]; - -List _updaters = [ - CalendarFilterDb.updateTable, - ReminderDb.updateTable, - UserColorsDb.updateTable, -]; - -class DbUtil { - static const dbVersion = 4; - static const dbName = 'canvas_parent.db'; - - static Database? _db; - - static Database get instance { - if (_db == null) throw StateError('DbUtil has not been initialized!'); - return _db!; - } - - static Future init() async { - _db = await openDatabase(dbName, version: dbVersion, onCreate: _onCreate, onUpgrade: _onUpgrade); - } - - static Future _onCreate(Database db, int version) async { - _creators.forEach((creator) => creator(db, version)); - } - - static Future _onUpgrade(Database db, int oldVersion, int newVersion) async { - _updaters.forEach((updater) => updater(db, oldVersion, newVersion)); - } -} diff --git a/apps/flutter_parent/lib/utils/db/reminder_db.dart b/apps/flutter_parent/lib/utils/db/reminder_db.dart deleted file mode 100644 index 6b660daa20..0000000000 --- a/apps/flutter_parent/lib/utils/db/reminder_db.dart +++ /dev/null @@ -1,124 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:flutter_parent/models/reminder.dart'; -import 'package:flutter_parent/utils/service_locator.dart'; -import 'package:sqflite/sqflite.dart'; - -class ReminderDb { - static const String tableName = 'reminders'; - - static const String columnId = '_id'; - static const String columnUserDomain = 'user_domain'; - static const String columnUserId = 'user_id'; - static const String columnType = 'type'; - static const String columnItemId = 'item_id'; - static const String columnCourseId = 'course_id'; - static const String columnDate = 'date'; - - static const allColumns = [ - columnId, - columnUserDomain, - columnUserId, - columnType, - columnItemId, - columnCourseId, - columnDate, - ]; - - Database db = locator(); - - static Map toMap(Reminder data) => { - columnId: data.id, - columnUserDomain: data.userDomain, - columnUserId: data.userId, - columnType: data.type, - columnItemId: data.itemId, - columnCourseId: data.courseId, - columnDate: data.date?.toIso8601String(), - }; - - static Reminder fromMap(Map map) => Reminder((b) => b - ..id = map[columnId] - ..userDomain = map[columnUserDomain] - ..userId = map[columnUserId] - ..type = map[columnType] - ..itemId = map[columnItemId] - ..courseId = map[columnCourseId] - ..date = DateTime.parse(map[columnDate])); - - static Future createTable(Database db, int version) async { - await db.execute(''' - create table $tableName ( - $columnId integer primary key autoincrement, - $columnUserDomain text not null, - $columnUserId text not null, - $columnType text not null, - $columnItemId text not null, - $columnCourseId text not null, - $columnDate text not null ) - '''); - } - - static Future updateTable(Database db, int oldVersion, int newVersion) async { - if (oldVersion < 3) { - // Course ID column added in database version 3 - await db.execute('alter table $tableName add column $columnCourseId text not null default \'\''); - } - } - - Future insert(Reminder data) async { - var id = await db.insert(tableName, toMap(data)); - return getById(id); - } - - Future getById(int id) async { - List maps = await db.query(tableName, columns: allColumns, where: '$columnId = ?', whereArgs: [id]); - if (maps.isNotEmpty) return fromMap(maps.first); - return null; - } - - Future getByItem(String? userDomain, String? userId, String? type, String? itemId) async { - List maps = await db.query( - tableName, - columns: allColumns, - where: '$columnUserDomain = ? AND $columnUserId = ? AND $columnType = ? AND $columnItemId = ?', - whereArgs: [userDomain, userId, type, itemId], - ); - if (maps.isNotEmpty) return fromMap(maps.first); - return null; - } - - Future>? getAllForUser(String? userDomain, String? userId) async { - List maps = await db.query( - tableName, - columns: allColumns, - where: '$columnUserDomain = ? AND $columnUserId = ?', - whereArgs: [userDomain, userId], - ); - return maps.map((it) => fromMap(it)).toList(); - } - - Future deleteById(int? id) { - return db.delete(tableName, where: '$columnId = ?', whereArgs: [id]); - } - - Future deleteAllForUser(String? userDomain, String? userId) { - return db.delete( - tableName, - where: '$columnUserDomain = ? AND $columnUserId = ?', - whereArgs: [userDomain, userId], - ); - } -} diff --git a/apps/flutter_parent/lib/utils/db/user_colors_db.dart b/apps/flutter_parent/lib/utils/db/user_colors_db.dart deleted file mode 100644 index 79abb5ab70..0000000000 --- a/apps/flutter_parent/lib/utils/db/user_colors_db.dart +++ /dev/null @@ -1,126 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'dart:ui'; - -import 'package:flutter_parent/models/user_color.dart'; -import 'package:flutter_parent/models/user_colors.dart'; -import 'package:flutter_parent/utils/service_locator.dart'; -import 'package:sqflite/sqflite.dart'; - -class UserColorsDb { - static const String tableName = 'user_colors'; - - static const String columnId = '_id'; - static const String columnUserDomain = 'user_domain'; - static const String columnUserId = 'user_id'; - static const String columnCanvasContext = 'canvas_context'; - static const String columnColor = 'color'; - - static const allColumns = [ - columnId, - columnUserDomain, - columnUserId, - columnCanvasContext, - columnColor, - ]; - - Database db = locator(); - - static Map toMap(UserColor userColor) => { - columnId: userColor.id, - columnUserDomain: userColor.userDomain, - columnUserId: userColor.userId, - columnCanvasContext: userColor.canvasContext, - columnColor: userColor.color.value, - }; - - static UserColor fromMap(Map map) => UserColor((b) => b - ..id = map[columnId] - ..userDomain = map[columnUserDomain] - ..userId = map[columnUserId] - ..canvasContext = map[columnCanvasContext] - ..color = Color(map[columnColor])); - - static Future createTable(Database db, int version) async { - await db.execute(''' - create table $tableName ( - $columnId integer primary key autoincrement, - $columnUserDomain text not null, - $columnUserId text not null, - $columnCanvasContext text not null, - $columnColor integer not null) - '''); - } - - static Future updateTable(Database db, int oldVersion, int newVersion) async { - if (oldVersion < 4) { - // This table was added in database version 4 - await createTable(db, newVersion); - } - } - - Future getById(int id) async { - List maps = await db.query(tableName, columns: allColumns, where: '$columnId = ?', whereArgs: [id]); - if (maps.isNotEmpty) return fromMap(maps.first); - return null; - } - - Future insertOrUpdateAll(String? domain, String? userId, UserColors colors) async { - for (var entry in colors.customColors.entries) { - await insertOrUpdate(UserColor((b) => b - ..userDomain = domain - ..userId = userId - ..canvasContext = entry.key - ..color = parseColor(entry.value))); - } - } - - static Color parseColor(String hexCode) => Color(int.parse('FF${hexCode.substring(1)}', radix: 16)); - - Future insertOrUpdate(UserColor data) async { - UserColor? existing = await getByContext(data.userDomain, data.userId, data.canvasContext); - if (existing == null) { - var id = await db.insert(tableName, toMap(data)); - return getById(id); - } else { - data = data.rebuild((b) => b..id = existing.id); - var id = await db.update(tableName, toMap(data), where: '$columnId = ?', whereArgs: [existing.id]); - return getById(id); - } - } - - Future getByContext(String? userDomain, String? userId, String canvasContext) async { - List maps = await db.query( - tableName, - columns: allColumns, - where: '$columnUserDomain = ? AND $columnUserId = ? AND $columnCanvasContext = ?', - whereArgs: [userDomain, userId, canvasContext], - ); - if (maps.isNotEmpty) return fromMap(maps.first); - return null; - } - - Future deleteById(int id) { - return db.delete(tableName, where: '$columnId = ?', whereArgs: [id]); - } - - Future deleteAllForUser(String userDomain, String userId) { - return db.delete( - tableName, - where: '$columnUserDomain = ? AND $columnUserId = ?', - whereArgs: [userDomain, userId], - ); - } -} diff --git a/apps/flutter_parent/lib/utils/debouncer.dart b/apps/flutter_parent/lib/utils/debouncer.dart deleted file mode 100644 index ec2f92c962..0000000000 --- a/apps/flutter_parent/lib/utils/debouncer.dart +++ /dev/null @@ -1,31 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'dart:async'; - -/// A simple helper class that puts a [_duration] delay on the callback passed to [debounce]. -/// Mainly used for when large amounts of user input can cause an unnecessary large amount of network calls -class Debouncer { - final Duration _duration; - Timer? _timer; - - Debouncer(this._duration); - - void debounce(void Function() callback) { - if (_timer != null) { - _timer!.cancel(); - } - _timer = Timer(_duration, callback); - } -} diff --git a/apps/flutter_parent/lib/utils/debug_flags.dart b/apps/flutter_parent/lib/utils/debug_flags.dart deleted file mode 100644 index 08c3ee7c61..0000000000 --- a/apps/flutter_parent/lib/utils/debug_flags.dart +++ /dev/null @@ -1,27 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:flutter/foundation.dart'; - -/// A collection of boolean flags that will control when debug features are used -/// -/// To edit this file and have git ignore your local changes, run this command: -/// git update-index --skip-worktree apps/flutter_parent/lib/utils/debug_flags.dart -/// -/// To start tracking local changes again, run this command: -/// git update-index --no-skip-worktree apps/flutter_parent/lib/utils/debug_flags.dart -class DebugFlags { - static bool isDebug = kDebugMode; // Defaults to kDebugMode, can set to true to have debug features in release builds - static bool isDebugApi = false; -} diff --git a/apps/flutter_parent/lib/utils/design/canvas_icons.dart b/apps/flutter_parent/lib/utils/design/canvas_icons.dart deleted file mode 100644 index 6ba5e26493..0000000000 --- a/apps/flutter_parent/lib/utils/design/canvas_icons.dart +++ /dev/null @@ -1,659 +0,0 @@ -// Copyright (C) 2019 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:flutter/widgets.dart'; - -class CanvasIcons { - CanvasIcons._(); - - static const IconData Arc = const IconData(0xea01, fontFamily: 'CanvasIcons'); - static const IconData a11y = const IconData(0xea02, fontFamily: 'CanvasIcons'); - static const IconData add = const IconData(0xea03, fontFamily: 'CanvasIcons'); - static const IconData address_book = const IconData(0xea04, fontFamily: 'CanvasIcons'); - static const IconData admin = const IconData(0xea05, fontFamily: 'CanvasIcons'); - static const IconData alerts = const IconData(0xea06, fontFamily: 'CanvasIcons'); - static const IconData analytics = const IconData(0xea07, fontFamily: 'CanvasIcons'); - static const IconData android = const IconData(0xea08, fontFamily: 'CanvasIcons'); - static const IconData annotate = const IconData(0xea09, fontFamily: 'CanvasIcons'); - static const IconData announcement = const IconData(0xea0a, fontFamily: 'CanvasIcons'); - static const IconData apple = const IconData(0xea0b, fontFamily: 'CanvasIcons'); - static const IconData arrow_down = const IconData(0xea0c, fontFamily: 'CanvasIcons'); - static const IconData arrow_end = const IconData(0xea0d, fontFamily: 'CanvasIcons'); - static const IconData arrow_left = const IconData(0xea0e, fontFamily: 'CanvasIcons'); - static const IconData arrow_open_down = const IconData(0xea0f, fontFamily: 'CanvasIcons'); - static const IconData arrow_open_end = const IconData(0xea10, fontFamily: 'CanvasIcons'); - static const IconData arrow_open_left = const IconData(0xea11, fontFamily: 'CanvasIcons'); - static const IconData arrow_open_right = const IconData(0xea12, fontFamily: 'CanvasIcons'); - static const IconData arrow_open_start = const IconData(0xea13, fontFamily: 'CanvasIcons'); - static const IconData arrow_open_up = const IconData(0xea14, fontFamily: 'CanvasIcons'); - static const IconData arrow_right = const IconData(0xea15, fontFamily: 'CanvasIcons'); - static const IconData arrow_start = const IconData(0xea16, fontFamily: 'CanvasIcons'); - static const IconData arrow_up = const IconData(0xea17, fontFamily: 'CanvasIcons'); - static const IconData assignment = const IconData(0xea18, fontFamily: 'CanvasIcons'); - static const IconData attach_media = const IconData(0xea19, fontFamily: 'CanvasIcons'); - static const IconData audio = const IconData(0xea1a, fontFamily: 'CanvasIcons'); - static const IconData bank = const IconData(0xea1b, fontFamily: 'CanvasIcons'); - static const IconData blueprint_lock = const IconData(0xea1c, fontFamily: 'CanvasIcons'); - static const IconData blueprint = const IconData(0xea1d, fontFamily: 'CanvasIcons'); - static const IconData bold = const IconData(0xea1e, fontFamily: 'CanvasIcons'); - static const IconData bookmark = const IconData(0xea1f, fontFamily: 'CanvasIcons'); - static const IconData box = const IconData(0xea20, fontFamily: 'CanvasIcons'); - static const IconData bullet_list_alpha = const IconData(0xea21, fontFamily: 'CanvasIcons'); - static const IconData bullet_list_circle_outline = const IconData(0xea22, fontFamily: 'CanvasIcons'); - static const IconData bullet_list_roman = const IconData(0xea23, fontFamily: 'CanvasIcons'); - static const IconData bullet_list_square = const IconData(0xea24, fontFamily: 'CanvasIcons'); - static const IconData bullet_list = const IconData(0xea25, fontFamily: 'CanvasIcons'); - static const IconData calculator = const IconData(0xea26, fontFamily: 'CanvasIcons'); - static const IconData calendar_add = const IconData(0xea27, fontFamily: 'CanvasIcons'); - static const IconData calendar_clock = const IconData(0xea28, fontFamily: 'CanvasIcons'); - static const IconData calendar_day = const IconData(0xea29, fontFamily: 'CanvasIcons'); - static const IconData calendar_days = const IconData(0xea2a, fontFamily: 'CanvasIcons'); - static const IconData calendar_month = const IconData(0xea2b, fontFamily: 'CanvasIcons'); - static const IconData calendar_reserved = const IconData(0xea2c, fontFamily: 'CanvasIcons'); - static const IconData chat = const IconData(0xea2d, fontFamily: 'CanvasIcons'); - static const IconData check_dark = const IconData(0xea2e, fontFamily: 'CanvasIcons'); - static const IconData check_mark_indeterminate = const IconData(0xea2f, fontFamily: 'CanvasIcons'); - static const IconData check_mark = const IconData(0xea30, fontFamily: 'CanvasIcons'); - static const IconData check_plus = const IconData(0xea31, fontFamily: 'CanvasIcons'); - static const IconData check = const IconData(0xea32, fontFamily: 'CanvasIcons'); - static const IconData circle_arrow_down = const IconData(0xea33, fontFamily: 'CanvasIcons'); - static const IconData circle_arrow_up = const IconData(0xea34, fontFamily: 'CanvasIcons'); - static const IconData clear_text_formatting = const IconData(0xea35, fontFamily: 'CanvasIcons'); - static const IconData clock = const IconData(0xea36, fontFamily: 'CanvasIcons'); - static const IconData closed_captioning_off = const IconData(0xea37, fontFamily: 'CanvasIcons'); - static const IconData closed_captioning_on = const IconData(0xea38, fontFamily: 'CanvasIcons'); - static const IconData closed_captioning = const IconData(0xea39, fontFamily: 'CanvasIcons'); - static const IconData cloud_download = const IconData(0xea3a, fontFamily: 'CanvasIcons'); - static const IconData cloud_lock = const IconData(0xea3b, fontFamily: 'CanvasIcons'); - static const IconData code = const IconData(0xea3c, fontFamily: 'CanvasIcons'); - static const IconData collapse = const IconData(0xea3d, fontFamily: 'CanvasIcons'); - static const IconData collection_save = const IconData(0xea3e, fontFamily: 'CanvasIcons'); - static const IconData collection = const IconData(0xea3f, fontFamily: 'CanvasIcons'); - static const IconData comment = const IconData(0xea40, fontFamily: 'CanvasIcons'); - static const IconData commons = const IconData(0xea41, fontFamily: 'CanvasIcons'); - static const IconData complete = const IconData(0xea42, fontFamily: 'CanvasIcons'); - static const IconData compose = const IconData(0xea43, fontFamily: 'CanvasIcons'); - static const IconData copy_course = const IconData(0xea44, fontFamily: 'CanvasIcons'); - static const IconData copy = const IconData(0xea45, fontFamily: 'CanvasIcons'); - static const IconData courses = const IconData(0xea46, fontFamily: 'CanvasIcons'); - static const IconData dashboard = const IconData(0xea47, fontFamily: 'CanvasIcons'); - static const IconData deactivate_user = const IconData(0xea48, fontFamily: 'CanvasIcons'); - static const IconData discussion_check = const IconData(0xea49, fontFamily: 'CanvasIcons'); - static const IconData discussion_new = const IconData(0xea4a, fontFamily: 'CanvasIcons'); - static const IconData discussion_reply_2 = const IconData(0xea4b, fontFamily: 'CanvasIcons'); - static const IconData discussion_reply_dark = const IconData(0xea4c, fontFamily: 'CanvasIcons'); - static const IconData discussion_reply = const IconData(0xea4d, fontFamily: 'CanvasIcons'); - static const IconData discussion_search = const IconData(0xea4e, fontFamily: 'CanvasIcons'); - static const IconData discussion_x = const IconData(0xea4f, fontFamily: 'CanvasIcons'); - static const IconData discussion = const IconData(0xea50, fontFamily: 'CanvasIcons'); - static const IconData document = const IconData(0xea51, fontFamily: 'CanvasIcons'); - static const IconData download = const IconData(0xea52, fontFamily: 'CanvasIcons'); - static const IconData drag_handle = const IconData(0xea53, fontFamily: 'CanvasIcons'); - static const IconData drop_down = const IconData(0xea54, fontFamily: 'CanvasIcons'); - static const IconData duplicate = const IconData(0xea55, fontFamily: 'CanvasIcons'); - static const IconData edit = const IconData(0xea56, fontFamily: 'CanvasIcons'); - static const IconData educators = const IconData(0xea57, fontFamily: 'CanvasIcons'); - static const IconData email = const IconData(0xea58, fontFamily: 'CanvasIcons'); - static const IconData empty = const IconData(0xea59, fontFamily: 'CanvasIcons'); - static const IconData end = const IconData(0xea5a, fontFamily: 'CanvasIcons'); - static const IconData equation = const IconData(0xea5b, fontFamily: 'CanvasIcons'); - static const IconData equella = const IconData(0xea5c, fontFamily: 'CanvasIcons'); - static const IconData essay = const IconData(0xea5d, fontFamily: 'CanvasIcons'); - static const IconData exit_full_screen = const IconData(0xea5e, fontFamily: 'CanvasIcons'); - static const IconData expand_items = const IconData(0xea5f, fontFamily: 'CanvasIcons'); - static const IconData expand_left = const IconData(0xea60, fontFamily: 'CanvasIcons'); - static const IconData expand_start = const IconData(0xea61, fontFamily: 'CanvasIcons'); - static const IconData expand = const IconData(0xea62, fontFamily: 'CanvasIcons'); - static const IconData export_content = const IconData(0xea63, fontFamily: 'CanvasIcons'); - static const IconData export_icon = const IconData(0xea64, fontFamily: 'CanvasIcons'); - static const IconData external_link = const IconData(0xea65, fontFamily: 'CanvasIcons'); - static const IconData eye = const IconData(0xea66, fontFamily: 'CanvasIcons'); - static const IconData facebook_boxed = const IconData(0xea67, fontFamily: 'CanvasIcons'); - static const IconData facebook = const IconData(0xea68, fontFamily: 'CanvasIcons'); - static const IconData fast_forward = const IconData(0xea69, fontFamily: 'CanvasIcons'); - static const IconData feedback = const IconData(0xea6a, fontFamily: 'CanvasIcons'); - static const IconData file_locked = const IconData(0xea6b, fontFamily: 'CanvasIcons'); - static const IconData files_copyright = const IconData(0xea6c, fontFamily: 'CanvasIcons'); - static const IconData files_creative_commons = const IconData(0xea6d, fontFamily: 'CanvasIcons'); - static const IconData files_fair_use = const IconData(0xea6e, fontFamily: 'CanvasIcons'); - static const IconData files_obtained_permission = const IconData(0xea6f, fontFamily: 'CanvasIcons'); - static const IconData files_public_domain = const IconData(0xea70, fontFamily: 'CanvasIcons'); - static const IconData filmstrip = const IconData(0xea71, fontFamily: 'CanvasIcons'); - static const IconData filter = const IconData(0xea72, fontFamily: 'CanvasIcons'); - static const IconData flag = const IconData(0xea73, fontFamily: 'CanvasIcons'); - static const IconData folder_locked = const IconData(0xea74, fontFamily: 'CanvasIcons'); - static const IconData folder = const IconData(0xea75, fontFamily: 'CanvasIcons'); - static const IconData forward = const IconData(0xea76, fontFamily: 'CanvasIcons'); - static const IconData full_screen = const IconData(0xea77, fontFamily: 'CanvasIcons'); - static const IconData github = const IconData(0xea78, fontFamily: 'CanvasIcons'); - static const IconData gradebook_export = const IconData(0xea79, fontFamily: 'CanvasIcons'); - static const IconData gradebook_import = const IconData(0xea7a, fontFamily: 'CanvasIcons'); - static const IconData gradebook = const IconData(0xea7b, fontFamily: 'CanvasIcons'); - static const IconData group_dark_new = const IconData(0xea7c, fontFamily: 'CanvasIcons'); - static const IconData group_new = const IconData(0xea7d, fontFamily: 'CanvasIcons'); - static const IconData group = const IconData(0xea7e, fontFamily: 'CanvasIcons'); - static const IconData hamburger = const IconData(0xea7f, fontFamily: 'CanvasIcons'); - static const IconData heart = const IconData(0xea80, fontFamily: 'CanvasIcons'); - static const IconData highlighter = const IconData(0xea81, fontFamily: 'CanvasIcons'); - static const IconData home = const IconData(0xea82, fontFamily: 'CanvasIcons'); - static const IconData hour_glass = const IconData(0xea83, fontFamily: 'CanvasIcons'); - static const IconData image = const IconData(0xea84, fontFamily: 'CanvasIcons'); - static const IconData import_content = const IconData(0xea85, fontFamily: 'CanvasIcons'); - static const IconData import_icon = const IconData(0xea86, fontFamily: 'CanvasIcons'); - static const IconData inbox = const IconData(0xea87, fontFamily: 'CanvasIcons'); - static const IconData indent_2 = const IconData(0xea88, fontFamily: 'CanvasIcons'); - static const IconData indent = const IconData(0xea89, fontFamily: 'CanvasIcons'); - static const IconData info_borderless = const IconData(0xea8a, fontFamily: 'CanvasIcons'); - static const IconData info = const IconData(0xea8b, fontFamily: 'CanvasIcons'); - static const IconData instructure = const IconData(0xea8c, fontFamily: 'CanvasIcons'); - static const IconData integrations = const IconData(0xea8d, fontFamily: 'CanvasIcons'); - static const IconData invitation = const IconData(0xea8e, fontFamily: 'CanvasIcons'); - static const IconData italic = const IconData(0xea8f, fontFamily: 'CanvasIcons'); - static const IconData keyboard_shortcuts = const IconData(0xea90, fontFamily: 'CanvasIcons'); - static const IconData launch = const IconData(0xea91, fontFamily: 'CanvasIcons'); - static const IconData life_preserver = const IconData(0xea92, fontFamily: 'CanvasIcons'); - static const IconData like = const IconData(0xea93, fontFamily: 'CanvasIcons'); - static const IconData link = const IconData(0xea94, fontFamily: 'CanvasIcons'); - static const IconData linkedin = const IconData(0xea95, fontFamily: 'CanvasIcons'); - static const IconData lock = const IconData(0xea96, fontFamily: 'CanvasIcons'); - static const IconData lti = const IconData(0xea97, fontFamily: 'CanvasIcons'); - static const IconData mark_as_read = const IconData(0xea98, fontFamily: 'CanvasIcons'); - static const IconData marker = const IconData(0xea99, fontFamily: 'CanvasIcons'); - static const IconData masquerade = const IconData(0xea9a, fontFamily: 'CanvasIcons'); - static const IconData mastery_paths = const IconData(0xea9b, fontFamily: 'CanvasIcons'); - static const IconData materials_required_light = const IconData(0xea9c, fontFamily: 'CanvasIcons'); - static const IconData materials_required = const IconData(0xea9d, fontFamily: 'CanvasIcons'); - static const IconData mature_light = const IconData(0xea9e, fontFamily: 'CanvasIcons'); - static const IconData mature = const IconData(0xea9f, fontFamily: 'CanvasIcons'); - static const IconData media = const IconData(0xeaa0, fontFamily: 'CanvasIcons'); - static const IconData message = const IconData(0xeaa1, fontFamily: 'CanvasIcons'); - static const IconData mic = const IconData(0xeaa2, fontFamily: 'CanvasIcons'); - static const IconData mini_arrow_down = const IconData(0xeaa3, fontFamily: 'CanvasIcons'); - static const IconData mini_arrow_end = const IconData(0xeaa4, fontFamily: 'CanvasIcons'); - static const IconData mini_arrow_left = const IconData(0xeaa5, fontFamily: 'CanvasIcons'); - static const IconData mini_arrow_right = const IconData(0xeaa6, fontFamily: 'CanvasIcons'); - static const IconData mini_arrow_start = const IconData(0xeaa7, fontFamily: 'CanvasIcons'); - static const IconData mini_arrow_up = const IconData(0xeaa8, fontFamily: 'CanvasIcons'); - static const IconData minimize = const IconData(0xeaa9, fontFamily: 'CanvasIcons'); - static const IconData module = const IconData(0xeaaa, fontFamily: 'CanvasIcons'); - static const IconData more = const IconData(0xeaab, fontFamily: 'CanvasIcons'); - static const IconData move_down_bottom = const IconData(0xeaac, fontFamily: 'CanvasIcons'); - static const IconData move_down = const IconData(0xeaad, fontFamily: 'CanvasIcons'); - static const IconData move_end = const IconData(0xeaae, fontFamily: 'CanvasIcons'); - static const IconData move_left = const IconData(0xeaaf, fontFamily: 'CanvasIcons'); - static const IconData move_right = const IconData(0xeab0, fontFamily: 'CanvasIcons'); - static const IconData move_start = const IconData(0xeab1, fontFamily: 'CanvasIcons'); - static const IconData move_up_top = const IconData(0xeab2, fontFamily: 'CanvasIcons'); - static const IconData move_up = const IconData(0xeab3, fontFamily: 'CanvasIcons'); - static const IconData ms_excel = const IconData(0xeab4, fontFamily: 'CanvasIcons'); - static const IconData ms_ppt = const IconData(0xeab5, fontFamily: 'CanvasIcons'); - static const IconData ms_word = const IconData(0xeab6, fontFamily: 'CanvasIcons'); - static const IconData muted = const IconData(0xeab7, fontFamily: 'CanvasIcons'); - static const IconData next_unread = const IconData(0xeab8, fontFamily: 'CanvasIcons'); - static const IconData no = const IconData(0xeab9, fontFamily: 'CanvasIcons'); - static const IconData not_graded = const IconData(0xeaba, fontFamily: 'CanvasIcons'); - static const IconData note_dark = const IconData(0xeabb, fontFamily: 'CanvasIcons'); - static const IconData note_light = const IconData(0xeabc, fontFamily: 'CanvasIcons'); - static const IconData note = const IconData(0xeabd, fontFamily: 'CanvasIcons'); - static const IconData numbered_list = const IconData(0xeabe, fontFamily: 'CanvasIcons'); - static const IconData off = const IconData(0xeabf, fontFamily: 'CanvasIcons'); - static const IconData open_folder = const IconData(0xeac0, fontFamily: 'CanvasIcons'); - static const IconData outcomes = const IconData(0xeac1, fontFamily: 'CanvasIcons'); - static const IconData outdent = const IconData(0xeac2, fontFamily: 'CanvasIcons'); - static const IconData outdent2 = const IconData(0xeac3, fontFamily: 'CanvasIcons'); - static const IconData oval_half = const IconData(0xeac4, fontFamily: 'CanvasIcons'); - static const IconData page_down = const IconData(0xeac5, fontFamily: 'CanvasIcons'); - static const IconData page_up = const IconData(0xeac6, fontFamily: 'CanvasIcons'); - static const IconData paint = const IconData(0xeac7, fontFamily: 'CanvasIcons'); - static const IconData paperclip = const IconData(0xeac8, fontFamily: 'CanvasIcons'); - static const IconData partial = const IconData(0xeac9, fontFamily: 'CanvasIcons'); - static const IconData pause = const IconData(0xeaca, fontFamily: 'CanvasIcons'); - static const IconData pdf = const IconData(0xeacb, fontFamily: 'CanvasIcons'); - static const IconData peer_graded = const IconData(0xeacc, fontFamily: 'CanvasIcons'); - static const IconData peer_review = const IconData(0xeacd, fontFamily: 'CanvasIcons'); - static const IconData pin = const IconData(0xeace, fontFamily: 'CanvasIcons'); - static const IconData pinterest = const IconData(0xeacf, fontFamily: 'CanvasIcons'); - static const IconData play = const IconData(0xead0, fontFamily: 'CanvasIcons'); - static const IconData plus = const IconData(0xead1, fontFamily: 'CanvasIcons'); - static const IconData post_to_sis = const IconData(0xead2, fontFamily: 'CanvasIcons'); - static const IconData prerequisite = const IconData(0xead3, fontFamily: 'CanvasIcons'); - static const IconData printer = const IconData(0xead4, fontFamily: 'CanvasIcons'); - static const IconData progress = const IconData(0xead5, fontFamily: 'CanvasIcons'); - static const IconData publish = const IconData(0xead6, fontFamily: 'CanvasIcons'); - static const IconData question = const IconData(0xead7, fontFamily: 'CanvasIcons'); - static const IconData quiz_instructions = const IconData(0xead8, fontFamily: 'CanvasIcons'); - static const IconData quiz_stats_avg = const IconData(0xead9, fontFamily: 'CanvasIcons'); - static const IconData quiz_stats_cronbachs_alpha = const IconData(0xeada, fontFamily: 'CanvasIcons'); - static const IconData quiz_stats_deviation = const IconData(0xeadb, fontFamily: 'CanvasIcons'); - static const IconData quiz_stats_high = const IconData(0xeadc, fontFamily: 'CanvasIcons'); - static const IconData quiz_stats_low = const IconData(0xeadd, fontFamily: 'CanvasIcons'); - static const IconData quiz_stats_time = const IconData(0xeade, fontFamily: 'CanvasIcons'); - static const IconData quiz_title = const IconData(0xeadf, fontFamily: 'CanvasIcons'); - static const IconData quiz = const IconData(0xeae0, fontFamily: 'CanvasIcons'); - static const IconData refresh = const IconData(0xeae1, fontFamily: 'CanvasIcons'); - static const IconData remove_bookmark = const IconData(0xeae2, fontFamily: 'CanvasIcons'); - static const IconData remove_from_collection = const IconData(0xeae3, fontFamily: 'CanvasIcons'); - static const IconData remove_link = const IconData(0xeae4, fontFamily: 'CanvasIcons'); - static const IconData replied = const IconData(0xeae5, fontFamily: 'CanvasIcons'); - static const IconData reply_2 = const IconData(0xeae6, fontFamily: 'CanvasIcons'); - static const IconData reply_all_2 = const IconData(0xeae7, fontFamily: 'CanvasIcons'); - static const IconData reply = const IconData(0xeae8, fontFamily: 'CanvasIcons'); - static const IconData reset = const IconData(0xeae9, fontFamily: 'CanvasIcons'); - static const IconData rewind = const IconData(0xeaea, fontFamily: 'CanvasIcons'); - static const IconData rss_add = const IconData(0xeaeb, fontFamily: 'CanvasIcons'); - static const IconData rss = const IconData(0xeaec, fontFamily: 'CanvasIcons'); - static const IconData rubric_dark = const IconData(0xeaed, fontFamily: 'CanvasIcons'); - static const IconData rubric = const IconData(0xeaee, fontFamily: 'CanvasIcons'); - static const IconData save = const IconData(0xeaef, fontFamily: 'CanvasIcons'); - static const IconData search_address_book = const IconData(0xeaf0, fontFamily: 'CanvasIcons'); - static const IconData search = const IconData(0xeaf1, fontFamily: 'CanvasIcons'); - static const IconData settings_2 = const IconData(0xeaf2, fontFamily: 'CanvasIcons'); - static const IconData settings = const IconData(0xeaf3, fontFamily: 'CanvasIcons'); - static const IconData shape_oval = const IconData(0xeaf4, fontFamily: 'CanvasIcons'); - static const IconData shape_polygon = const IconData(0xeaf5, fontFamily: 'CanvasIcons'); - static const IconData shape_rectangle = const IconData(0xeaf6, fontFamily: 'CanvasIcons'); - static const IconData share = const IconData(0xeaf7, fontFamily: 'CanvasIcons'); - static const IconData sis_imported = const IconData(0xeaf8, fontFamily: 'CanvasIcons'); - static const IconData sis_not_synced = const IconData(0xeaf9, fontFamily: 'CanvasIcons'); - static const IconData sis_synced = const IconData(0xeafa, fontFamily: 'CanvasIcons'); - static const IconData skype = const IconData(0xeafb, fontFamily: 'CanvasIcons'); - static const IconData speed_grader = const IconData(0xeafc, fontFamily: 'CanvasIcons'); - static const IconData standards = const IconData(0xeafd, fontFamily: 'CanvasIcons'); - static const IconData star_light = const IconData(0xeafe, fontFamily: 'CanvasIcons'); - static const IconData star = const IconData(0xeaff, fontFamily: 'CanvasIcons'); - static const IconData stats = const IconData(0xeb00, fontFamily: 'CanvasIcons'); - static const IconData stop = const IconData(0xeb01, fontFamily: 'CanvasIcons'); - static const IconData strikethrough = const IconData(0xeb02, fontFamily: 'CanvasIcons'); - static const IconData student_view = const IconData(0xeb03, fontFamily: 'CanvasIcons'); - static const IconData syllabus = const IconData(0xeb04, fontFamily: 'CanvasIcons'); - static const IconData table_cell_select_all = const IconData(0xeb05, fontFamily: 'CanvasIcons'); - static const IconData table_delete_column = const IconData(0xeb06, fontFamily: 'CanvasIcons'); - static const IconData table_delete_row = const IconData(0xeb07, fontFamily: 'CanvasIcons'); - static const IconData table_delete_table = const IconData(0xeb08, fontFamily: 'CanvasIcons'); - static const IconData table_insert_column_after = const IconData(0xeb09, fontFamily: 'CanvasIcons'); - static const IconData table_insert_column_before = const IconData(0xeb0a, fontFamily: 'CanvasIcons'); - static const IconData table_insert_row_above = const IconData(0xeb0b, fontFamily: 'CanvasIcons'); - static const IconData table_insert_row_after = const IconData(0xeb0c, fontFamily: 'CanvasIcons'); - static const IconData table_left_header = const IconData(0xeb0d, fontFamily: 'CanvasIcons'); - static const IconData table_merge_cells = const IconData(0xeb0e, fontFamily: 'CanvasIcons'); - static const IconData table_row_properties = const IconData(0xeb0f, fontFamily: 'CanvasIcons'); - static const IconData table_split_cells = const IconData(0xeb10, fontFamily: 'CanvasIcons'); - static const IconData table_top_header = const IconData(0xeb11, fontFamily: 'CanvasIcons'); - static const IconData table = const IconData(0xeb12, fontFamily: 'CanvasIcons'); - static const IconData tag = const IconData(0xeb13, fontFamily: 'CanvasIcons'); - static const IconData target = const IconData(0xeb14, fontFamily: 'CanvasIcons'); - static const IconData text_background_color = const IconData(0xeb15, fontFamily: 'CanvasIcons'); - static const IconData text_centered = const IconData(0xeb16, fontFamily: 'CanvasIcons'); - static const IconData text_color = const IconData(0xeb17, fontFamily: 'CanvasIcons'); - static const IconData text_direction_ltr = const IconData(0xeb18, fontFamily: 'CanvasIcons'); - static const IconData text_direction_rtl = const IconData(0xeb19, fontFamily: 'CanvasIcons'); - static const IconData text_end = const IconData(0xeb1a, fontFamily: 'CanvasIcons'); - static const IconData text_left = const IconData(0xeb1b, fontFamily: 'CanvasIcons'); - static const IconData text_right = const IconData(0xeb1c, fontFamily: 'CanvasIcons'); - static const IconData text_start = const IconData(0xeb1d, fontFamily: 'CanvasIcons'); - static const IconData text_subscript = const IconData(0xeb1e, fontFamily: 'CanvasIcons'); - static const IconData text_superscript = const IconData(0xeb1f, fontFamily: 'CanvasIcons'); - static const IconData text = const IconData(0xeb20, fontFamily: 'CanvasIcons'); - static const IconData textarea = const IconData(0xeb21, fontFamily: 'CanvasIcons'); - static const IconData timer = const IconData(0xeb22, fontFamily: 'CanvasIcons'); - static const IconData toggle_end = const IconData(0xeb23, fontFamily: 'CanvasIcons'); - static const IconData toggle_left = const IconData(0xeb24, fontFamily: 'CanvasIcons'); - static const IconData toggle_right = const IconData(0xeb25, fontFamily: 'CanvasIcons'); - static const IconData toggle_start = const IconData(0xeb26, fontFamily: 'CanvasIcons'); - static const IconData trash = const IconData(0xeb27, fontFamily: 'CanvasIcons'); - static const IconData trouble = const IconData(0xeb28, fontFamily: 'CanvasIcons'); - static const IconData twitter_boxed = const IconData(0xeb29, fontFamily: 'CanvasIcons'); - static const IconData twitter = const IconData(0xeb2a, fontFamily: 'CanvasIcons'); - static const IconData underline = const IconData(0xeb2b, fontFamily: 'CanvasIcons'); - static const IconData unlock = const IconData(0xeb2c, fontFamily: 'CanvasIcons'); - static const IconData unmuted = const IconData(0xeb2d, fontFamily: 'CanvasIcons'); - static const IconData unpublish = const IconData(0xeb2e, fontFamily: 'CanvasIcons'); - static const IconData unpublished = const IconData(0xeb2f, fontFamily: 'CanvasIcons'); - static const IconData updown = const IconData(0xeb30, fontFamily: 'CanvasIcons'); - static const IconData upload = const IconData(0xeb31, fontFamily: 'CanvasIcons'); - static const IconData user_add = const IconData(0xeb32, fontFamily: 'CanvasIcons'); - static const IconData user = const IconData(0xeb33, fontFamily: 'CanvasIcons'); - static const IconData video_camera_off = const IconData(0xeb34, fontFamily: 'CanvasIcons'); - static const IconData video_camera = const IconData(0xeb35, fontFamily: 'CanvasIcons'); - static const IconData video = const IconData(0xeb36, fontFamily: 'CanvasIcons'); - static const IconData warning_borderless = const IconData(0xeb37, fontFamily: 'CanvasIcons'); - static const IconData warning = const IconData(0xeb38, fontFamily: 'CanvasIcons'); - static const IconData windows = const IconData(0xeb39, fontFamily: 'CanvasIcons'); - static const IconData wordpress = const IconData(0xeb3a, fontFamily: 'CanvasIcons'); - static const IconData x = const IconData(0xeb3b, fontFamily: 'CanvasIcons'); - static const IconData zipped = const IconData(0xeb3c, fontFamily: 'CanvasIcons'); - static const IconData zoom_in = const IconData(0xeb3d, fontFamily: 'CanvasIcons'); - static const IconData zoom_out = const IconData(0xeb3e, fontFamily: 'CanvasIcons'); - - static const List allIcons = [ - ['Arc', Arc], - ['a11y', a11y], - ['add', add], - ['address_book', address_book], - ['admin', admin], - ['alerts', alerts], - ['analytics', analytics], - ['android', android], - ['annotate', annotate], - ['announcement', announcement], - ['apple', apple], - ['arrow_down', arrow_down], - ['arrow_end', arrow_end], - ['arrow_left', arrow_left], - ['arrow_open_down', arrow_open_down], - ['arrow_open_end', arrow_open_end], - ['arrow_open_left', arrow_open_left], - ['arrow_open_right', arrow_open_right], - ['arrow_open_start', arrow_open_start], - ['arrow_open_up', arrow_open_up], - ['arrow_right', arrow_right], - ['arrow_start', arrow_start], - ['arrow_up', arrow_up], - ['assignment', assignment], - ['attach_media', attach_media], - ['audio', audio], - ['bank', bank], - ['blueprint_lock', blueprint_lock], - ['blueprint', blueprint], - ['bold', bold], - ['bookmark', bookmark], - ['box', box], - ['bullet_list_alpha', bullet_list_alpha], - ['bullet_list_circle_outline', bullet_list_circle_outline], - ['bullet_list_roman', bullet_list_roman], - ['bullet_list_square', bullet_list_square], - ['bullet_list', bullet_list], - ['calculator', calculator], - ['calendar_add', calendar_add], - ['calendar_clock', calendar_clock], - ['calendar_day', calendar_day], - ['calendar_days', calendar_days], - ['calendar_month', calendar_month], - ['calendar_reserved', calendar_reserved], - ['chat', chat], - ['check_dark', check_dark], - ['check_mark_indeterminate', check_mark_indeterminate], - ['check_mark', check_mark], - ['check_plus', check_plus], - ['check', check], - ['circle_arrow_down', circle_arrow_down], - ['circle_arrow_up', circle_arrow_up], - ['clear_text_formatting', clear_text_formatting], - ['clock', clock], - ['closed_captioning_off', closed_captioning_off], - ['closed_captioning_on', closed_captioning_on], - ['closed_captioning', closed_captioning], - ['cloud_download', cloud_download], - ['cloud_lock', cloud_lock], - ['code', code], - ['collapse', collapse], - ['collection_save', collection_save], - ['collection', collection], - ['comment', comment], - ['commons', commons], - ['complete', complete], - ['compose', compose], - ['copy_course', copy_course], - ['copy', copy], - ['courses', courses], - ['dashboard', dashboard], - ['deactivate_user', deactivate_user], - ['discussion_check', discussion_check], - ['discussion_new', discussion_new], - ['discussion_reply_2', discussion_reply_2], - ['discussion_reply_dark', discussion_reply_dark], - ['discussion_reply', discussion_reply], - ['discussion_search', discussion_search], - ['discussion_x', discussion_x], - ['discussion', discussion], - ['document', document], - ['download', download], - ['drag_handle', drag_handle], - ['drop_down', drop_down], - ['duplicate', duplicate], - ['edit', edit], - ['educators', educators], - ['email', email], - ['empty', empty], - ['end', end], - ['equation', equation], - ['equella', equella], - ['essay', essay], - ['exit_full_screen', exit_full_screen], - ['expand_items', expand_items], - ['expand_left', expand_left], - ['expand_start', expand_start], - ['expand', expand], - ['export_content', export_content], - ['export_icon', export_icon], - ['external_link', external_link], - ['eye', eye], - ['facebook_boxed', facebook_boxed], - ['facebook', facebook], - ['fast_forward', fast_forward], - ['feedback', feedback], - ['file_locked', file_locked], - ['files_copyright', files_copyright], - ['files_creative_commons', files_creative_commons], - ['files_fair_use', files_fair_use], - ['files_obtained_permission', files_obtained_permission], - ['files_public_domain', files_public_domain], - ['filmstrip', filmstrip], - ['filter', filter], - ['flag', flag], - ['folder_locked', folder_locked], - ['folder', folder], - ['forward', forward], - ['full_screen', full_screen], - ['github', github], - ['gradebook_export', gradebook_export], - ['gradebook_import', gradebook_import], - ['gradebook', gradebook], - ['group_dark_new', group_dark_new], - ['group_new', group_new], - ['group', group], - ['hamburger', hamburger], - ['heart', heart], - ['highlighter', highlighter], - ['home', home], - ['hour_glass', hour_glass], - ['image', image], - ['import_content', import_content], - ['import_icon', import_icon], - ['inbox', inbox], - ['indent_2', indent_2], - ['indent', indent], - ['info_borderless', info_borderless], - ['info', info], - ['instructure', instructure], - ['integrations', integrations], - ['invitation', invitation], - ['italic', italic], - ['keyboard_shortcuts', keyboard_shortcuts], - ['launch', launch], - ['life_preserver', life_preserver], - ['like', like], - ['link', link], - ['linkedin', linkedin], - ['lock', lock], - ['lti', lti], - ['mark_as_read', mark_as_read], - ['marker', marker], - ['masquerade', masquerade], - ['mastery_paths', mastery_paths], - ['materials_required_light', materials_required_light], - ['materials_required', materials_required], - ['mature_light', mature_light], - ['mature', mature], - ['media', media], - ['message', message], - ['mic', mic], - ['mini_arrow_down', mini_arrow_down], - ['mini_arrow_end', mini_arrow_end], - ['mini_arrow_left', mini_arrow_left], - ['mini_arrow_right', mini_arrow_right], - ['mini_arrow_start', mini_arrow_start], - ['mini_arrow_up', mini_arrow_up], - ['minimize', minimize], - ['module', module], - ['more', more], - ['move_down_bottom', move_down_bottom], - ['move_down', move_down], - ['move_end', move_end], - ['move_left', move_left], - ['move_right', move_right], - ['move_start', move_start], - ['move_up_top', move_up_top], - ['move_up', move_up], - ['ms_excel', ms_excel], - ['ms_ppt', ms_ppt], - ['ms_word', ms_word], - ['muted', muted], - ['next_unread', next_unread], - ['no', no], - ['not_graded', not_graded], - ['note_dark', note_dark], - ['note_light', note_light], - ['note', note], - ['numbered_list', numbered_list], - ['off', off], - ['open_folder', open_folder], - ['outcomes', outcomes], - ['outdent', outdent], - ['outdent2', outdent2], - ['oval_half', oval_half], - ['page_down', page_down], - ['page_up', page_up], - ['paint', paint], - ['paperclip', paperclip], - ['partial', partial], - ['pause', pause], - ['pdf', pdf], - ['peer_graded', peer_graded], - ['peer_review', peer_review], - ['pin', pin], - ['pinterest', pinterest], - ['play', play], - ['plus', plus], - ['post_to_sis', post_to_sis], - ['prerequisite', prerequisite], - ['printer', printer], - ['progress', progress], - ['publish', publish], - ['question', question], - ['quiz_instructions', quiz_instructions], - ['quiz_stats_avg', quiz_stats_avg], - ['quiz_stats_cronbachs_alpha', quiz_stats_cronbachs_alpha], - ['quiz_stats_deviation', quiz_stats_deviation], - ['quiz_stats_high', quiz_stats_high], - ['quiz_stats_low', quiz_stats_low], - ['quiz_stats_time', quiz_stats_time], - ['quiz_title', quiz_title], - ['quiz', quiz], - ['refresh', refresh], - ['remove_bookmark', remove_bookmark], - ['remove_from_collection', remove_from_collection], - ['remove_link', remove_link], - ['replied', replied], - ['reply_2', reply_2], - ['reply_all_2', reply_all_2], - ['reply', reply], - ['reset', reset], - ['rewind', rewind], - ['rss_add', rss_add], - ['rss', rss], - ['rubric_dark', rubric_dark], - ['rubric', rubric], - ['save', save], - ['search_address_book', search_address_book], - ['search', search], - ['settings_2', settings_2], - ['settings', settings], - ['shape_oval', shape_oval], - ['shape_polygon', shape_polygon], - ['shape_rectangle', shape_rectangle], - ['share', share], - ['sis_imported', sis_imported], - ['sis_not_synced', sis_not_synced], - ['sis_synced', sis_synced], - ['skype', skype], - ['speed_grader', speed_grader], - ['standards', standards], - ['star_light', star_light], - ['star', star], - ['stats', stats], - ['stop', stop], - ['strikethrough', strikethrough], - ['student_view', student_view], - ['syllabus', syllabus], - ['table_cell_select_all', table_cell_select_all], - ['table_delete_column', table_delete_column], - ['table_delete_row', table_delete_row], - ['table_delete_table', table_delete_table], - ['table_insert_column_after', table_insert_column_after], - ['table_insert_column_before', table_insert_column_before], - ['table_insert_row_above', table_insert_row_above], - ['table_insert_row_after', table_insert_row_after], - ['table_left_header', table_left_header], - ['table_merge_cells', table_merge_cells], - ['table_row_properties', table_row_properties], - ['table_split_cells', table_split_cells], - ['table_top_header', table_top_header], - ['table', table], - ['tag', tag], - ['target', target], - ['text_background_color', text_background_color], - ['text_centered', text_centered], - ['text_color', text_color], - ['text_direction_ltr', text_direction_ltr], - ['text_direction_rtl', text_direction_rtl], - ['text_end', text_end], - ['text_left', text_left], - ['text_right', text_right], - ['text_start', text_start], - ['text_subscript', text_subscript], - ['text_superscript', text_superscript], - ['text', text], - ['textarea', textarea], - ['timer', timer], - ['toggle_end', toggle_end], - ['toggle_left', toggle_left], - ['toggle_right', toggle_right], - ['toggle_start', toggle_start], - ['trash', trash], - ['trouble', trouble], - ['twitter_boxed', twitter_boxed], - ['twitter', twitter], - ['underline', underline], - ['unlock', unlock], - ['unmuted', unmuted], - ['unpublish', unpublish], - ['unpublished', unpublished], - ['updown', updown], - ['upload', upload], - ['user_add', user_add], - ['user', user], - ['video_camera_off', video_camera_off], - ['video_camera', video_camera], - ['video', video], - ['warning_borderless', warning_borderless], - ['warning', warning], - ['windows', windows], - ['wordpress', wordpress], - ['x', x], - ['zipped', zipped], - ['zoom_in', zoom_in], - ['zoom_out', zoom_out], - ]; -} diff --git a/apps/flutter_parent/lib/utils/design/canvas_icons_solid.dart b/apps/flutter_parent/lib/utils/design/canvas_icons_solid.dart deleted file mode 100755 index 818078e909..0000000000 --- a/apps/flutter_parent/lib/utils/design/canvas_icons_solid.dart +++ /dev/null @@ -1,659 +0,0 @@ -// Copyright (C) 2019 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:flutter/widgets.dart'; - -class CanvasIconsSolid { - CanvasIconsSolid._(); - - static const IconData Arc = const IconData(0xea01, fontFamily: 'CanvasIconsSolid'); - static const IconData a11y = const IconData(0xea02, fontFamily: 'CanvasIconsSolid'); - static const IconData add = const IconData(0xea03, fontFamily: 'CanvasIconsSolid'); - static const IconData address_book = const IconData(0xea04, fontFamily: 'CanvasIconsSolid'); - static const IconData admin = const IconData(0xea05, fontFamily: 'CanvasIconsSolid'); - static const IconData alerts = const IconData(0xea06, fontFamily: 'CanvasIconsSolid'); - static const IconData analytics = const IconData(0xea07, fontFamily: 'CanvasIconsSolid'); - static const IconData android = const IconData(0xea08, fontFamily: 'CanvasIconsSolid'); - static const IconData annotate = const IconData(0xea09, fontFamily: 'CanvasIconsSolid'); - static const IconData announcement = const IconData(0xea0a, fontFamily: 'CanvasIconsSolid'); - static const IconData apple = const IconData(0xea0b, fontFamily: 'CanvasIconsSolid'); - static const IconData arrow_down = const IconData(0xea0c, fontFamily: 'CanvasIconsSolid'); - static const IconData arrow_end = const IconData(0xea0d, fontFamily: 'CanvasIconsSolid'); - static const IconData arrow_left = const IconData(0xea0e, fontFamily: 'CanvasIconsSolid'); - static const IconData arrow_open_down = const IconData(0xea0f, fontFamily: 'CanvasIconsSolid'); - static const IconData arrow_open_end = const IconData(0xea10, fontFamily: 'CanvasIconsSolid'); - static const IconData arrow_open_left = const IconData(0xea11, fontFamily: 'CanvasIconsSolid'); - static const IconData arrow_open_right = const IconData(0xea12, fontFamily: 'CanvasIconsSolid'); - static const IconData arrow_open_start = const IconData(0xea13, fontFamily: 'CanvasIconsSolid'); - static const IconData arrow_open_up = const IconData(0xea14, fontFamily: 'CanvasIconsSolid'); - static const IconData arrow_right = const IconData(0xea15, fontFamily: 'CanvasIconsSolid'); - static const IconData arrow_start = const IconData(0xea16, fontFamily: 'CanvasIconsSolid'); - static const IconData arrow_up = const IconData(0xea17, fontFamily: 'CanvasIconsSolid'); - static const IconData assignment = const IconData(0xea18, fontFamily: 'CanvasIconsSolid'); - static const IconData attach_media = const IconData(0xea19, fontFamily: 'CanvasIconsSolid'); - static const IconData audio = const IconData(0xea1a, fontFamily: 'CanvasIconsSolid'); - static const IconData bank = const IconData(0xea1b, fontFamily: 'CanvasIconsSolid'); - static const IconData blueprint_lock = const IconData(0xea1c, fontFamily: 'CanvasIconsSolid'); - static const IconData blueprint = const IconData(0xea1d, fontFamily: 'CanvasIconsSolid'); - static const IconData bold = const IconData(0xea1e, fontFamily: 'CanvasIconsSolid'); - static const IconData bookmark = const IconData(0xea1f, fontFamily: 'CanvasIconsSolid'); - static const IconData box = const IconData(0xea20, fontFamily: 'CanvasIconsSolid'); - static const IconData bullet_list_alpha = const IconData(0xea21, fontFamily: 'CanvasIconsSolid'); - static const IconData bullet_list_circle_outline = const IconData(0xea22, fontFamily: 'CanvasIconsSolid'); - static const IconData bullet_list_roman = const IconData(0xea23, fontFamily: 'CanvasIconsSolid'); - static const IconData bullet_list_square = const IconData(0xea24, fontFamily: 'CanvasIconsSolid'); - static const IconData bullet_list = const IconData(0xea25, fontFamily: 'CanvasIconsSolid'); - static const IconData calculator = const IconData(0xea26, fontFamily: 'CanvasIconsSolid'); - static const IconData calendar_add = const IconData(0xea27, fontFamily: 'CanvasIconsSolid'); - static const IconData calendar_clock = const IconData(0xea28, fontFamily: 'CanvasIconsSolid'); - static const IconData calendar_day = const IconData(0xea29, fontFamily: 'CanvasIconsSolid'); - static const IconData calendar_days = const IconData(0xea2a, fontFamily: 'CanvasIconsSolid'); - static const IconData calendar_month = const IconData(0xea2b, fontFamily: 'CanvasIconsSolid'); - static const IconData calendar_reserved = const IconData(0xea2c, fontFamily: 'CanvasIconsSolid'); - static const IconData chat = const IconData(0xea2d, fontFamily: 'CanvasIconsSolid'); - static const IconData check_dark = const IconData(0xea2e, fontFamily: 'CanvasIconsSolid'); - static const IconData check_mark_indeterminate = const IconData(0xea2f, fontFamily: 'CanvasIconsSolid'); - static const IconData check_mark = const IconData(0xea30, fontFamily: 'CanvasIconsSolid'); - static const IconData check_plus = const IconData(0xea31, fontFamily: 'CanvasIconsSolid'); - static const IconData check = const IconData(0xea32, fontFamily: 'CanvasIconsSolid'); - static const IconData circle_arrow_down = const IconData(0xea33, fontFamily: 'CanvasIconsSolid'); - static const IconData circle_arrow_up = const IconData(0xea34, fontFamily: 'CanvasIconsSolid'); - static const IconData clear_text_formatting = const IconData(0xea35, fontFamily: 'CanvasIconsSolid'); - static const IconData clock = const IconData(0xea36, fontFamily: 'CanvasIconsSolid'); - static const IconData closed_captioning_off = const IconData(0xea37, fontFamily: 'CanvasIconsSolid'); - static const IconData closed_captioning_on = const IconData(0xea38, fontFamily: 'CanvasIconsSolid'); - static const IconData closed_captioning = const IconData(0xea39, fontFamily: 'CanvasIconsSolid'); - static const IconData cloud_download = const IconData(0xea3a, fontFamily: 'CanvasIconsSolid'); - static const IconData cloud_lock = const IconData(0xea3b, fontFamily: 'CanvasIconsSolid'); - static const IconData code = const IconData(0xea3c, fontFamily: 'CanvasIconsSolid'); - static const IconData collapse = const IconData(0xea3d, fontFamily: 'CanvasIconsSolid'); - static const IconData collection_save = const IconData(0xea3e, fontFamily: 'CanvasIconsSolid'); - static const IconData collection = const IconData(0xea3f, fontFamily: 'CanvasIconsSolid'); - static const IconData comment = const IconData(0xea40, fontFamily: 'CanvasIconsSolid'); - static const IconData commons = const IconData(0xea41, fontFamily: 'CanvasIconsSolid'); - static const IconData complete = const IconData(0xea42, fontFamily: 'CanvasIconsSolid'); - static const IconData compose = const IconData(0xea43, fontFamily: 'CanvasIconsSolid'); - static const IconData copy_course = const IconData(0xea44, fontFamily: 'CanvasIconsSolid'); - static const IconData copy = const IconData(0xea45, fontFamily: 'CanvasIconsSolid'); - static const IconData courses = const IconData(0xea46, fontFamily: 'CanvasIconsSolid'); - static const IconData dashboard = const IconData(0xea47, fontFamily: 'CanvasIconsSolid'); - static const IconData deactivate_user = const IconData(0xea48, fontFamily: 'CanvasIconsSolid'); - static const IconData discussion_check = const IconData(0xea49, fontFamily: 'CanvasIconsSolid'); - static const IconData discussion_new = const IconData(0xea4a, fontFamily: 'CanvasIconsSolid'); - static const IconData discussion_reply_2 = const IconData(0xea4b, fontFamily: 'CanvasIconsSolid'); - static const IconData discussion_reply_dark = const IconData(0xea4c, fontFamily: 'CanvasIconsSolid'); - static const IconData discussion_reply = const IconData(0xea4d, fontFamily: 'CanvasIconsSolid'); - static const IconData discussion_search = const IconData(0xea4e, fontFamily: 'CanvasIconsSolid'); - static const IconData discussion_x = const IconData(0xea4f, fontFamily: 'CanvasIconsSolid'); - static const IconData discussion = const IconData(0xea50, fontFamily: 'CanvasIconsSolid'); - static const IconData document = const IconData(0xea51, fontFamily: 'CanvasIconsSolid'); - static const IconData download = const IconData(0xea52, fontFamily: 'CanvasIconsSolid'); - static const IconData drag_handle = const IconData(0xea53, fontFamily: 'CanvasIconsSolid'); - static const IconData drop_down = const IconData(0xea54, fontFamily: 'CanvasIconsSolid'); - static const IconData duplicate = const IconData(0xea55, fontFamily: 'CanvasIconsSolid'); - static const IconData edit = const IconData(0xea56, fontFamily: 'CanvasIconsSolid'); - static const IconData educators = const IconData(0xea57, fontFamily: 'CanvasIconsSolid'); - static const IconData email = const IconData(0xea58, fontFamily: 'CanvasIconsSolid'); - static const IconData empty = const IconData(0xea59, fontFamily: 'CanvasIconsSolid'); - static const IconData end = const IconData(0xea5a, fontFamily: 'CanvasIconsSolid'); - static const IconData equation = const IconData(0xea5b, fontFamily: 'CanvasIconsSolid'); - static const IconData equella = const IconData(0xea5c, fontFamily: 'CanvasIconsSolid'); - static const IconData essay = const IconData(0xea5d, fontFamily: 'CanvasIconsSolid'); - static const IconData exit_full_screen = const IconData(0xea5e, fontFamily: 'CanvasIconsSolid'); - static const IconData expand_items = const IconData(0xea5f, fontFamily: 'CanvasIconsSolid'); - static const IconData expand_left = const IconData(0xea60, fontFamily: 'CanvasIconsSolid'); - static const IconData expand_start = const IconData(0xea61, fontFamily: 'CanvasIconsSolid'); - static const IconData expand = const IconData(0xea62, fontFamily: 'CanvasIconsSolid'); - static const IconData export_content = const IconData(0xea63, fontFamily: 'CanvasIconsSolid'); - static const IconData export_icon = const IconData(0xea64, fontFamily: 'CanvasIconsSolid'); - static const IconData external_link = const IconData(0xea65, fontFamily: 'CanvasIconsSolid'); - static const IconData eye = const IconData(0xea66, fontFamily: 'CanvasIconsSolid'); - static const IconData facebook_boxed = const IconData(0xea67, fontFamily: 'CanvasIconsSolid'); - static const IconData facebook = const IconData(0xea68, fontFamily: 'CanvasIconsSolid'); - static const IconData fast_forward = const IconData(0xea69, fontFamily: 'CanvasIconsSolid'); - static const IconData feedback = const IconData(0xea6a, fontFamily: 'CanvasIconsSolid'); - static const IconData file_locked = const IconData(0xea6b, fontFamily: 'CanvasIconsSolid'); - static const IconData files_copyright = const IconData(0xea6c, fontFamily: 'CanvasIconsSolid'); - static const IconData files_creative_commons = const IconData(0xea6d, fontFamily: 'CanvasIconsSolid'); - static const IconData files_fair_use = const IconData(0xea6e, fontFamily: 'CanvasIconsSolid'); - static const IconData files_obtained_permission = const IconData(0xea6f, fontFamily: 'CanvasIconsSolid'); - static const IconData files_public_domain = const IconData(0xea70, fontFamily: 'CanvasIconsSolid'); - static const IconData filmstrip = const IconData(0xea71, fontFamily: 'CanvasIconsSolid'); - static const IconData filter = const IconData(0xea72, fontFamily: 'CanvasIconsSolid'); - static const IconData flag = const IconData(0xea73, fontFamily: 'CanvasIconsSolid'); - static const IconData folder_locked = const IconData(0xea74, fontFamily: 'CanvasIconsSolid'); - static const IconData folder = const IconData(0xea75, fontFamily: 'CanvasIconsSolid'); - static const IconData forward = const IconData(0xea76, fontFamily: 'CanvasIconsSolid'); - static const IconData full_screen = const IconData(0xea77, fontFamily: 'CanvasIconsSolid'); - static const IconData github = const IconData(0xea78, fontFamily: 'CanvasIconsSolid'); - static const IconData gradebook_export = const IconData(0xea79, fontFamily: 'CanvasIconsSolid'); - static const IconData gradebook_import = const IconData(0xea7a, fontFamily: 'CanvasIconsSolid'); - static const IconData gradebook = const IconData(0xea7b, fontFamily: 'CanvasIconsSolid'); - static const IconData group_dark_new = const IconData(0xea7c, fontFamily: 'CanvasIconsSolid'); - static const IconData group_new = const IconData(0xea7d, fontFamily: 'CanvasIconsSolid'); - static const IconData group = const IconData(0xea7e, fontFamily: 'CanvasIconsSolid'); - static const IconData hamburger = const IconData(0xea7f, fontFamily: 'CanvasIconsSolid'); - static const IconData heart = const IconData(0xea80, fontFamily: 'CanvasIconsSolid'); - static const IconData highlighter = const IconData(0xea81, fontFamily: 'CanvasIconsSolid'); - static const IconData home = const IconData(0xea82, fontFamily: 'CanvasIconsSolid'); - static const IconData hour_glass = const IconData(0xea83, fontFamily: 'CanvasIconsSolid'); - static const IconData image = const IconData(0xea84, fontFamily: 'CanvasIconsSolid'); - static const IconData import_content = const IconData(0xea85, fontFamily: 'CanvasIconsSolid'); - static const IconData import_icon = const IconData(0xea86, fontFamily: 'CanvasIconsSolid'); - static const IconData inbox = const IconData(0xea87, fontFamily: 'CanvasIconsSolid'); - static const IconData indent_2 = const IconData(0xea88, fontFamily: 'CanvasIconsSolid'); - static const IconData indent = const IconData(0xea89, fontFamily: 'CanvasIconsSolid'); - static const IconData info_borderless = const IconData(0xea8a, fontFamily: 'CanvasIconsSolid'); - static const IconData info = const IconData(0xea8b, fontFamily: 'CanvasIconsSolid'); - static const IconData instructure = const IconData(0xea8c, fontFamily: 'CanvasIconsSolid'); - static const IconData integrations = const IconData(0xea8d, fontFamily: 'CanvasIconsSolid'); - static const IconData invitation = const IconData(0xea8e, fontFamily: 'CanvasIconsSolid'); - static const IconData italic = const IconData(0xea8f, fontFamily: 'CanvasIconsSolid'); - static const IconData keyboard_shortcuts = const IconData(0xea90, fontFamily: 'CanvasIconsSolid'); - static const IconData launch = const IconData(0xea91, fontFamily: 'CanvasIconsSolid'); - static const IconData life_preserver = const IconData(0xea92, fontFamily: 'CanvasIconsSolid'); - static const IconData like = const IconData(0xea93, fontFamily: 'CanvasIconsSolid'); - static const IconData link = const IconData(0xea94, fontFamily: 'CanvasIconsSolid'); - static const IconData linkedin = const IconData(0xea95, fontFamily: 'CanvasIconsSolid'); - static const IconData lock = const IconData(0xea96, fontFamily: 'CanvasIconsSolid'); - static const IconData lti = const IconData(0xea97, fontFamily: 'CanvasIconsSolid'); - static const IconData mark_as_read = const IconData(0xea98, fontFamily: 'CanvasIconsSolid'); - static const IconData marker = const IconData(0xea99, fontFamily: 'CanvasIconsSolid'); - static const IconData masquerade = const IconData(0xea9a, fontFamily: 'CanvasIconsSolid'); - static const IconData mastery_paths = const IconData(0xea9b, fontFamily: 'CanvasIconsSolid'); - static const IconData materials_required_light = const IconData(0xea9c, fontFamily: 'CanvasIconsSolid'); - static const IconData materials_required = const IconData(0xea9d, fontFamily: 'CanvasIconsSolid'); - static const IconData mature_light = const IconData(0xea9e, fontFamily: 'CanvasIconsSolid'); - static const IconData mature = const IconData(0xea9f, fontFamily: 'CanvasIconsSolid'); - static const IconData media = const IconData(0xeaa0, fontFamily: 'CanvasIconsSolid'); - static const IconData message = const IconData(0xeaa1, fontFamily: 'CanvasIconsSolid'); - static const IconData mic = const IconData(0xeaa2, fontFamily: 'CanvasIconsSolid'); - static const IconData mini_arrow_down = const IconData(0xeaa3, fontFamily: 'CanvasIconsSolid'); - static const IconData mini_arrow_end = const IconData(0xeaa4, fontFamily: 'CanvasIconsSolid'); - static const IconData mini_arrow_left = const IconData(0xeaa5, fontFamily: 'CanvasIconsSolid'); - static const IconData mini_arrow_right = const IconData(0xeaa6, fontFamily: 'CanvasIconsSolid'); - static const IconData mini_arrow_start = const IconData(0xeaa7, fontFamily: 'CanvasIconsSolid'); - static const IconData mini_arrow_up = const IconData(0xeaa8, fontFamily: 'CanvasIconsSolid'); - static const IconData minimize = const IconData(0xeaa9, fontFamily: 'CanvasIconsSolid'); - static const IconData module = const IconData(0xeaaa, fontFamily: 'CanvasIconsSolid'); - static const IconData more = const IconData(0xeaab, fontFamily: 'CanvasIconsSolid'); - static const IconData move_down_bottom = const IconData(0xeaac, fontFamily: 'CanvasIconsSolid'); - static const IconData move_down = const IconData(0xeaad, fontFamily: 'CanvasIconsSolid'); - static const IconData move_end = const IconData(0xeaae, fontFamily: 'CanvasIconsSolid'); - static const IconData move_left = const IconData(0xeaaf, fontFamily: 'CanvasIconsSolid'); - static const IconData move_right = const IconData(0xeab0, fontFamily: 'CanvasIconsSolid'); - static const IconData move_start = const IconData(0xeab1, fontFamily: 'CanvasIconsSolid'); - static const IconData move_up_top = const IconData(0xeab2, fontFamily: 'CanvasIconsSolid'); - static const IconData move_up = const IconData(0xeab3, fontFamily: 'CanvasIconsSolid'); - static const IconData ms_excel = const IconData(0xeab4, fontFamily: 'CanvasIconsSolid'); - static const IconData ms_ppt = const IconData(0xeab5, fontFamily: 'CanvasIconsSolid'); - static const IconData ms_word = const IconData(0xeab6, fontFamily: 'CanvasIconsSolid'); - static const IconData muted = const IconData(0xeab7, fontFamily: 'CanvasIconsSolid'); - static const IconData next_unread = const IconData(0xeab8, fontFamily: 'CanvasIconsSolid'); - static const IconData no = const IconData(0xeab9, fontFamily: 'CanvasIconsSolid'); - static const IconData not_graded = const IconData(0xeaba, fontFamily: 'CanvasIconsSolid'); - static const IconData note_dark = const IconData(0xeabb, fontFamily: 'CanvasIconsSolid'); - static const IconData note_light = const IconData(0xeabc, fontFamily: 'CanvasIconsSolid'); - static const IconData note = const IconData(0xeabd, fontFamily: 'CanvasIconsSolid'); - static const IconData numbered_list = const IconData(0xeabe, fontFamily: 'CanvasIconsSolid'); - static const IconData off = const IconData(0xeabf, fontFamily: 'CanvasIconsSolid'); - static const IconData open_folder = const IconData(0xeac0, fontFamily: 'CanvasIconsSolid'); - static const IconData outcomes = const IconData(0xeac1, fontFamily: 'CanvasIconsSolid'); - static const IconData outdent = const IconData(0xeac2, fontFamily: 'CanvasIconsSolid'); - static const IconData outdent2 = const IconData(0xeac3, fontFamily: 'CanvasIconsSolid'); - static const IconData oval_half = const IconData(0xeac4, fontFamily: 'CanvasIconsSolid'); - static const IconData page_down = const IconData(0xeac5, fontFamily: 'CanvasIconsSolid'); - static const IconData page_up = const IconData(0xeac6, fontFamily: 'CanvasIconsSolid'); - static const IconData paint = const IconData(0xeac7, fontFamily: 'CanvasIconsSolid'); - static const IconData paperclip = const IconData(0xeac8, fontFamily: 'CanvasIconsSolid'); - static const IconData partial = const IconData(0xeac9, fontFamily: 'CanvasIconsSolid'); - static const IconData pause = const IconData(0xeaca, fontFamily: 'CanvasIconsSolid'); - static const IconData pdf = const IconData(0xeacb, fontFamily: 'CanvasIconsSolid'); - static const IconData peer_graded = const IconData(0xeacc, fontFamily: 'CanvasIconsSolid'); - static const IconData peer_review = const IconData(0xeacd, fontFamily: 'CanvasIconsSolid'); - static const IconData pin = const IconData(0xeace, fontFamily: 'CanvasIconsSolid'); - static const IconData pinterest = const IconData(0xeacf, fontFamily: 'CanvasIconsSolid'); - static const IconData play = const IconData(0xead0, fontFamily: 'CanvasIconsSolid'); - static const IconData plus = const IconData(0xead1, fontFamily: 'CanvasIconsSolid'); - static const IconData post_to_sis = const IconData(0xead2, fontFamily: 'CanvasIconsSolid'); - static const IconData prerequisite = const IconData(0xead3, fontFamily: 'CanvasIconsSolid'); - static const IconData printer = const IconData(0xead4, fontFamily: 'CanvasIconsSolid'); - static const IconData progress = const IconData(0xead5, fontFamily: 'CanvasIconsSolid'); - static const IconData publish = const IconData(0xead6, fontFamily: 'CanvasIconsSolid'); - static const IconData question = const IconData(0xead7, fontFamily: 'CanvasIconsSolid'); - static const IconData quiz_instructions = const IconData(0xead8, fontFamily: 'CanvasIconsSolid'); - static const IconData quiz_stats_avg = const IconData(0xead9, fontFamily: 'CanvasIconsSolid'); - static const IconData quiz_stats_cronbachs_alpha = const IconData(0xeada, fontFamily: 'CanvasIconsSolid'); - static const IconData quiz_stats_deviation = const IconData(0xeadb, fontFamily: 'CanvasIconsSolid'); - static const IconData quiz_stats_high = const IconData(0xeadc, fontFamily: 'CanvasIconsSolid'); - static const IconData quiz_stats_low = const IconData(0xeadd, fontFamily: 'CanvasIconsSolid'); - static const IconData quiz_stats_time = const IconData(0xeade, fontFamily: 'CanvasIconsSolid'); - static const IconData quiz_title = const IconData(0xeadf, fontFamily: 'CanvasIconsSolid'); - static const IconData quiz = const IconData(0xeae0, fontFamily: 'CanvasIconsSolid'); - static const IconData refresh = const IconData(0xeae1, fontFamily: 'CanvasIconsSolid'); - static const IconData remove_bookmark = const IconData(0xeae2, fontFamily: 'CanvasIconsSolid'); - static const IconData remove_from_collection = const IconData(0xeae3, fontFamily: 'CanvasIconsSolid'); - static const IconData remove_link = const IconData(0xeae4, fontFamily: 'CanvasIconsSolid'); - static const IconData replied = const IconData(0xeae5, fontFamily: 'CanvasIconsSolid'); - static const IconData reply_2 = const IconData(0xeae6, fontFamily: 'CanvasIconsSolid'); - static const IconData reply_all_2 = const IconData(0xeae7, fontFamily: 'CanvasIconsSolid'); - static const IconData reply = const IconData(0xeae8, fontFamily: 'CanvasIconsSolid'); - static const IconData reset = const IconData(0xeae9, fontFamily: 'CanvasIconsSolid'); - static const IconData rewind = const IconData(0xeaea, fontFamily: 'CanvasIconsSolid'); - static const IconData rss_add = const IconData(0xeaeb, fontFamily: 'CanvasIconsSolid'); - static const IconData rss = const IconData(0xeaec, fontFamily: 'CanvasIconsSolid'); - static const IconData rubric_dark = const IconData(0xeaed, fontFamily: 'CanvasIconsSolid'); - static const IconData rubric = const IconData(0xeaee, fontFamily: 'CanvasIconsSolid'); - static const IconData save = const IconData(0xeaef, fontFamily: 'CanvasIconsSolid'); - static const IconData search_address_book = const IconData(0xeaf0, fontFamily: 'CanvasIconsSolid'); - static const IconData search = const IconData(0xeaf1, fontFamily: 'CanvasIconsSolid'); - static const IconData settings_2 = const IconData(0xeaf2, fontFamily: 'CanvasIconsSolid'); - static const IconData settings = const IconData(0xeaf3, fontFamily: 'CanvasIconsSolid'); - static const IconData shape_oval = const IconData(0xeaf4, fontFamily: 'CanvasIconsSolid'); - static const IconData shape_polygon = const IconData(0xeaf5, fontFamily: 'CanvasIconsSolid'); - static const IconData shape_rectangle = const IconData(0xeaf6, fontFamily: 'CanvasIconsSolid'); - static const IconData share = const IconData(0xeaf7, fontFamily: 'CanvasIconsSolid'); - static const IconData sis_imported = const IconData(0xeaf8, fontFamily: 'CanvasIconsSolid'); - static const IconData sis_not_synced = const IconData(0xeaf9, fontFamily: 'CanvasIconsSolid'); - static const IconData sis_synced = const IconData(0xeafa, fontFamily: 'CanvasIconsSolid'); - static const IconData skype = const IconData(0xeafb, fontFamily: 'CanvasIconsSolid'); - static const IconData speed_grader = const IconData(0xeafc, fontFamily: 'CanvasIconsSolid'); - static const IconData standards = const IconData(0xeafd, fontFamily: 'CanvasIconsSolid'); - static const IconData star_light = const IconData(0xeafe, fontFamily: 'CanvasIconsSolid'); - static const IconData star = const IconData(0xeaff, fontFamily: 'CanvasIconsSolid'); - static const IconData stats = const IconData(0xeb00, fontFamily: 'CanvasIconsSolid'); - static const IconData stop = const IconData(0xeb01, fontFamily: 'CanvasIconsSolid'); - static const IconData strikethrough = const IconData(0xeb02, fontFamily: 'CanvasIconsSolid'); - static const IconData student_view = const IconData(0xeb03, fontFamily: 'CanvasIconsSolid'); - static const IconData syllabus = const IconData(0xeb04, fontFamily: 'CanvasIconsSolid'); - static const IconData table_cell_select_all = const IconData(0xeb05, fontFamily: 'CanvasIconsSolid'); - static const IconData table_delete_column = const IconData(0xeb06, fontFamily: 'CanvasIconsSolid'); - static const IconData table_delete_row = const IconData(0xeb07, fontFamily: 'CanvasIconsSolid'); - static const IconData table_delete_table = const IconData(0xeb08, fontFamily: 'CanvasIconsSolid'); - static const IconData table_insert_column_after = const IconData(0xeb09, fontFamily: 'CanvasIconsSolid'); - static const IconData table_insert_column_before = const IconData(0xeb0a, fontFamily: 'CanvasIconsSolid'); - static const IconData table_insert_row_above = const IconData(0xeb0b, fontFamily: 'CanvasIconsSolid'); - static const IconData table_insert_row_after = const IconData(0xeb0c, fontFamily: 'CanvasIconsSolid'); - static const IconData table_left_header = const IconData(0xeb0d, fontFamily: 'CanvasIconsSolid'); - static const IconData table_merge_cells = const IconData(0xeb0e, fontFamily: 'CanvasIconsSolid'); - static const IconData table_row_properties = const IconData(0xeb0f, fontFamily: 'CanvasIconsSolid'); - static const IconData table_split_cells = const IconData(0xeb10, fontFamily: 'CanvasIconsSolid'); - static const IconData table_top_header = const IconData(0xeb11, fontFamily: 'CanvasIconsSolid'); - static const IconData table = const IconData(0xeb12, fontFamily: 'CanvasIconsSolid'); - static const IconData tag = const IconData(0xeb13, fontFamily: 'CanvasIconsSolid'); - static const IconData target = const IconData(0xeb14, fontFamily: 'CanvasIconsSolid'); - static const IconData text_background_color = const IconData(0xeb15, fontFamily: 'CanvasIconsSolid'); - static const IconData text_centered = const IconData(0xeb16, fontFamily: 'CanvasIconsSolid'); - static const IconData text_color = const IconData(0xeb17, fontFamily: 'CanvasIconsSolid'); - static const IconData text_direction_ltr = const IconData(0xeb18, fontFamily: 'CanvasIconsSolid'); - static const IconData text_direction_rtl = const IconData(0xeb19, fontFamily: 'CanvasIconsSolid'); - static const IconData text_end = const IconData(0xeb1a, fontFamily: 'CanvasIconsSolid'); - static const IconData text_left = const IconData(0xeb1b, fontFamily: 'CanvasIconsSolid'); - static const IconData text_right = const IconData(0xeb1c, fontFamily: 'CanvasIconsSolid'); - static const IconData text_start = const IconData(0xeb1d, fontFamily: 'CanvasIconsSolid'); - static const IconData text_subscript = const IconData(0xeb1e, fontFamily: 'CanvasIconsSolid'); - static const IconData text_superscript = const IconData(0xeb1f, fontFamily: 'CanvasIconsSolid'); - static const IconData text = const IconData(0xeb20, fontFamily: 'CanvasIconsSolid'); - static const IconData textarea = const IconData(0xeb21, fontFamily: 'CanvasIconsSolid'); - static const IconData timer = const IconData(0xeb22, fontFamily: 'CanvasIconsSolid'); - static const IconData toggle_end = const IconData(0xeb23, fontFamily: 'CanvasIconsSolid'); - static const IconData toggle_left = const IconData(0xeb24, fontFamily: 'CanvasIconsSolid'); - static const IconData toggle_right = const IconData(0xeb25, fontFamily: 'CanvasIconsSolid'); - static const IconData toggle_start = const IconData(0xeb26, fontFamily: 'CanvasIconsSolid'); - static const IconData trash = const IconData(0xeb27, fontFamily: 'CanvasIconsSolid'); - static const IconData trouble = const IconData(0xeb28, fontFamily: 'CanvasIconsSolid'); - static const IconData twitter_boxed = const IconData(0xeb29, fontFamily: 'CanvasIconsSolid'); - static const IconData twitter = const IconData(0xeb2a, fontFamily: 'CanvasIconsSolid'); - static const IconData underline = const IconData(0xeb2b, fontFamily: 'CanvasIconsSolid'); - static const IconData unlock = const IconData(0xeb2c, fontFamily: 'CanvasIconsSolid'); - static const IconData unmuted = const IconData(0xeb2d, fontFamily: 'CanvasIconsSolid'); - static const IconData unpublish = const IconData(0xeb2e, fontFamily: 'CanvasIconsSolid'); - static const IconData unpublished = const IconData(0xeb2f, fontFamily: 'CanvasIconsSolid'); - static const IconData updown = const IconData(0xeb30, fontFamily: 'CanvasIconsSolid'); - static const IconData upload = const IconData(0xeb31, fontFamily: 'CanvasIconsSolid'); - static const IconData user_add = const IconData(0xeb32, fontFamily: 'CanvasIconsSolid'); - static const IconData user = const IconData(0xeb33, fontFamily: 'CanvasIconsSolid'); - static const IconData video_camera_off = const IconData(0xeb34, fontFamily: 'CanvasIconsSolid'); - static const IconData video_camera = const IconData(0xeb35, fontFamily: 'CanvasIconsSolid'); - static const IconData video = const IconData(0xeb36, fontFamily: 'CanvasIconsSolid'); - static const IconData warning_borderless = const IconData(0xeb37, fontFamily: 'CanvasIconsSolid'); - static const IconData warning = const IconData(0xeb38, fontFamily: 'CanvasIconsSolid'); - static const IconData windows = const IconData(0xeb39, fontFamily: 'CanvasIconsSolid'); - static const IconData wordpress = const IconData(0xeb3a, fontFamily: 'CanvasIconsSolid'); - static const IconData x = const IconData(0xeb3b, fontFamily: 'CanvasIconsSolid'); - static const IconData zipped = const IconData(0xeb3c, fontFamily: 'CanvasIconsSolid'); - static const IconData zoom_in = const IconData(0xeb3d, fontFamily: 'CanvasIconsSolid'); - static const IconData zoom_out = const IconData(0xeb3e, fontFamily: 'CanvasIconsSolid'); - - static const List allIcons = [ - Arc, - a11y, - add, - address_book, - admin, - alerts, - analytics, - android, - annotate, - announcement, - apple, - arrow_down, - arrow_end, - arrow_left, - arrow_open_down, - arrow_open_end, - arrow_open_left, - arrow_open_right, - arrow_open_start, - arrow_open_up, - arrow_right, - arrow_start, - arrow_up, - assignment, - attach_media, - audio, - bank, - blueprint_lock, - blueprint, - bold, - bookmark, - box, - bullet_list_alpha, - bullet_list_circle_outline, - bullet_list_roman, - bullet_list_square, - bullet_list, - calculator, - calendar_add, - calendar_clock, - calendar_day, - calendar_days, - calendar_month, - calendar_reserved, - chat, - check_dark, - check_mark_indeterminate, - check_mark, - check_plus, - check, - circle_arrow_down, - circle_arrow_up, - clear_text_formatting, - clock, - closed_captioning_off, - closed_captioning_on, - closed_captioning, - cloud_download, - cloud_lock, - code, - collapse, - collection_save, - collection, - comment, - commons, - complete, - compose, - copy_course, - copy, - courses, - dashboard, - deactivate_user, - discussion_check, - discussion_new, - discussion_reply_2, - discussion_reply_dark, - discussion_reply, - discussion_search, - discussion_x, - discussion, - document, - download, - drag_handle, - drop_down, - duplicate, - edit, - educators, - email, - empty, - end, - equation, - equella, - essay, - exit_full_screen, - expand_items, - expand_left, - expand_start, - expand, - export_content, - export_icon, - external_link, - eye, - facebook_boxed, - facebook, - fast_forward, - feedback, - file_locked, - files_copyright, - files_creative_commons, - files_fair_use, - files_obtained_permission, - files_public_domain, - filmstrip, - filter, - flag, - folder_locked, - folder, - forward, - full_screen, - github, - gradebook_export, - gradebook_import, - gradebook, - group_dark_new, - group_new, - group, - hamburger, - heart, - highlighter, - home, - hour_glass, - image, - import_content, - import_icon, - inbox, - indent_2, - indent, - info_borderless, - info, - instructure, - integrations, - invitation, - italic, - keyboard_shortcuts, - launch, - life_preserver, - like, - link, - linkedin, - lock, - lti, - mark_as_read, - marker, - masquerade, - mastery_paths, - materials_required_light, - materials_required, - mature_light, - mature, - media, - message, - mic, - mini_arrow_down, - mini_arrow_end, - mini_arrow_left, - mini_arrow_right, - mini_arrow_start, - mini_arrow_up, - minimize, - module, - more, - move_down_bottom, - move_down, - move_end, - move_left, - move_right, - move_start, - move_up_top, - move_up, - ms_excel, - ms_ppt, - ms_word, - muted, - next_unread, - no, - not_graded, - note_dark, - note_light, - note, - numbered_list, - off, - open_folder, - outcomes, - outdent, - outdent2, - oval_half, - page_down, - page_up, - paint, - paperclip, - partial, - pause, - pdf, - peer_graded, - peer_review, - pin, - pinterest, - play, - plus, - post_to_sis, - prerequisite, - printer, - progress, - publish, - question, - quiz_instructions, - quiz_stats_avg, - quiz_stats_cronbachs_alpha, - quiz_stats_deviation, - quiz_stats_high, - quiz_stats_low, - quiz_stats_time, - quiz_title, - quiz, - refresh, - remove_bookmark, - remove_from_collection, - remove_link, - replied, - reply_2, - reply_all_2, - reply, - reset, - rewind, - rss_add, - rss, - rubric_dark, - rubric, - save, - search_address_book, - search, - settings_2, - settings, - shape_oval, - shape_polygon, - shape_rectangle, - share, - sis_imported, - sis_not_synced, - sis_synced, - skype, - speed_grader, - standards, - star_light, - star, - stats, - stop, - strikethrough, - student_view, - syllabus, - table_cell_select_all, - table_delete_column, - table_delete_row, - table_delete_table, - table_insert_column_after, - table_insert_column_before, - table_insert_row_above, - table_insert_row_after, - table_left_header, - table_merge_cells, - table_row_properties, - table_split_cells, - table_top_header, - table, - tag, - target, - text_background_color, - text_centered, - text_color, - text_direction_ltr, - text_direction_rtl, - text_end, - text_left, - text_right, - text_start, - text_subscript, - text_superscript, - text, - textarea, - timer, - toggle_end, - toggle_left, - toggle_right, - toggle_start, - trash, - trouble, - twitter_boxed, - twitter, - underline, - unlock, - unmuted, - unpublish, - unpublished, - updown, - upload, - user_add, - user, - video_camera_off, - video_camera, - video, - warning_borderless, - warning, - windows, - wordpress, - x, - zipped, - zoom_in, - zoom_out - ]; -} diff --git a/apps/flutter_parent/lib/utils/design/parent_colors.dart b/apps/flutter_parent/lib/utils/design/parent_colors.dart deleted file mode 100644 index 2dfb01da0c..0000000000 --- a/apps/flutter_parent/lib/utils/design/parent_colors.dart +++ /dev/null @@ -1,90 +0,0 @@ -// Copyright (C) 2019 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'dart:math'; -import 'dart:ui'; - -import 'package:flutter/material.dart'; - -class ParentColors { - /// The core 'dark' color used for text, icons, etc on light backgrounds - static const licorice = Color(0xFF2D3B45); - - /// The core 'light' color, used for text, icons, etc on dark backgrounds - static const tiara = Color(0xFFC7CDD1); - - /// A very light color - static const porcelain = Color(0xFFF5F5F5); - - /// The core 'faded' color, used for subtitles, inactive icons, etc on either light or dark backgrounds - static const ash = Color(0xFF6B7780); - - /// Another dark color, slightly lighter than licorice - static const oxford = Color(0xFF394B58); - - /// A general 'failure' color, crimson - static const failure = Color(0xFFEE0612); - - /// Core color for the parent app - static const parentApp = Color(0xFF007BC2); - - /// Core color for the student app - static const studentApp = Color(0xFFE62429); - - /// Core color for the teacher app - static const teacherApp = Color(0xFF9E58BD); - - /// Color for light mode divider under the app bar - static const appBarDividerLight = Color(0x1F000000); - - /// Color for masquerade-related UI elements - static const masquerade = Color(0xFFBE32A3); - - /// Generates a [MaterialColor] swatch for a given color. For best results the source color should have a medium brightness. - static MaterialColor makeSwatch(Color color) { - var src = HSLColor.fromColor(color); - - var shades = {500: color}; - - // Upper (darker) colors. Max saturation is 100, min lightness is 63% of source lightness - var saturationIncrement = (1.0 - src.saturation) / 4; - var valueIncrement = ((src.lightness * 0.63) - src.lightness) / 4; - var saturation = src.saturation; - var value = src.lightness; - for (int shade = 600; shade <= 900; shade += 100) { - saturation += saturationIncrement; - value += valueIncrement; - shades[shade] = HSLColor.fromAHSL(1.0, src.hue, min(saturation, 1.0), min(value, 1.0)).toColor(); - } - - // Lower (lighter) colors. Min saturation is 10, max lightness is 99 - saturationIncrement = (src.saturation - 0.10) / 5; - valueIncrement = (0.99 - src.lightness) / 5; - saturation = src.saturation; - value = src.lightness; - for (int shade = 400; shade >= 0; shade -= 100) { - saturation += saturationIncrement; - value += valueIncrement; - var color = HSLColor.fromAHSL(1.0, src.hue, min(1.0, saturation), min(1.0, value)).toColor(); - if (shade == 0) { - // A shade of 0 would be completely white, so 50 is the lightest color shade - shades[50] = color; - } else { - shades[shade] = color; - } - } - - return MaterialColor(color.value, shades); - } -} diff --git a/apps/flutter_parent/lib/utils/design/parent_theme.dart b/apps/flutter_parent/lib/utils/design/parent_theme.dart deleted file mode 100644 index ef0e8a2c4c..0000000000 --- a/apps/flutter_parent/lib/utils/design/parent_theme.dart +++ /dev/null @@ -1,399 +0,0 @@ -// Copyright (C) 2019 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:flutter/material.dart'; -import 'package:flutter/services.dart'; -import 'package:flutter_parent/models/user_color.dart'; -import 'package:flutter_parent/network/utils/api_prefs.dart'; -import 'package:flutter_parent/utils/db/user_colors_db.dart'; -import 'package:flutter_parent/utils/design/parent_colors.dart'; -import 'package:flutter_parent/utils/design/theme_prefs.dart'; -import 'package:flutter_parent/utils/service_locator.dart'; -import 'package:provider/provider.dart'; - -import 'student_color_set.dart'; - -/// Provides Parent App [ThemeData] to the 'builder' callback. This theme data is styled to account for dark mode, -/// high-contrast mode, and a selectable student color set. This widget is designed to directly wrap (or be a nearby -/// ancestor of) the 'MaterialApp' widget which should consume the provided 'themeData' object. -/// -/// Mapping of design text style names to Flutter text style names: -/// -/// Design name: Flutter name: Size: Weight: -/// --------------------------------------------------- -/// caption -> subtitle 12 Medium (500) - faded -/// subhead -> overline 12 Bold (700) - faded -/// body -> body1 14 Regular (400) -/// subtitle -> caption 14 Medium (500) - faded -/// title -> subhead 16 Medium (500) -/// heading -> headline 18 Medium (500) -/// display -> display1 24 Medium (500) -/// -class ParentTheme extends StatefulWidget { - final Widget Function(BuildContext context, ThemeData themeData) builder; - - const ParentTheme({ - required this.builder, - this.themePrefs = const ThemePrefs(), - super.key - }); - - final ThemePrefs themePrefs; - - @override - _ParentThemeState createState() => _ParentThemeState(); - - static _ParentThemeState? of(BuildContext context) { - return context.findAncestorStateOfType<_ParentThemeState>(); - } -} - -/// State for the [ParentTheme] widget. Holds state for dark mode, high contrast mode, and the dynamically set -/// student color. To obtain an instance of this state, call 'ParentTheme.of(context)' with any context that -/// descends from a ParentTheme widget. -class _ParentThemeState extends State { - ParentThemeStateChangeNotifier _notifier = ParentThemeStateChangeNotifier(); - - StudentColorSet? _studentColorSet; - - String? _selectedStudentId; - - Future refreshStudentColor() => setSelectedStudent(_selectedStudentId); - - /// Set the id of the selected student, used for updating the student color. Setting this to null - /// effectively resets the color state. - Future setSelectedStudent(String? studentId) async { - _studentColorSet = null; - _selectedStudentId = studentId; - - _studentColorSet = await getColorsForStudent(studentId); - - setState(() {}); - } - - Future getColorsForStudent(String? studentId) async { - // Get saved color for this user - UserColor? userColor = await locator().getByContext( - ApiPrefs.getDomain(), - ApiPrefs.getUser()?.id, - 'user_$studentId', - ); - - StudentColorSet colorSet; - if (userColor == null && studentId != null) { - // No saved color for this user, fall back to existing color sets based on user id - var numId = studentId.replaceAll(RegExp(r'[^\d]'), ''); - var index = (int.tryParse(numId) ?? studentId.length) % StudentColorSet.all.length; - colorSet = StudentColorSet.all[index]; - } else { - // Check if there is a matching color set and prefer that for a better dark/HC mode experience - Color? color = userColor?.color; - colorSet = StudentColorSet.all.firstWhere( - (colorSet) => colorSet.light == color, - orElse: () => color != null ? StudentColorSet(color, color, color, color) : StudentColorSet.all.first, - ); - } - return colorSet; - } - - /// Returns the currently selected student color set - StudentColorSet get studentColorSet => _studentColorSet ?? StudentColorSet.all[0]; - - /// Returns the color variant of the provided 'colorSet' that is appropriate for the current state of dark mode and - /// high-contrast mode in this theme - Color getColorVariantForCurrentState(StudentColorSet colorSet) { - if (isDarkMode) { - return isHC ? colorSet.darkHC : colorSet.dark; - } else { - return isHC ? colorSet.lightHC : colorSet.light; - } - } - - /// Returns the current student color based on the state of dark mode and high-contrast mode - Color get studentColor => getColorVariantForCurrentState(studentColorSet); - - /// Sets whether the current theme should use dark mode - set isDarkMode(bool isDark) { - setState(() { - widget.themePrefs.darkMode = isDark; - }); - } - - /// Sets whether the current theme should use dark mode for WebViews - set isWebViewDarkMode(bool isDark) { - setState(() { - widget.themePrefs.webViewDarkMode = isDark; - }); - } - - /// Toggles dark mode for the current theme - toggleDarkMode() => isDarkMode = !isDarkMode; - - /// Toggles WebView dark mode for the current theme - toggleWebViewDarkMode() => isWebViewDarkMode = !isWebViewDarkMode; - - /// Sets whether the current theme should use high-contrast mode - set isHC(bool isHC) { - setState(() { - widget.themePrefs.hcMode = isHC; - }); - } - - /// Toggles high-contrast for the current theme - toggleHC() => isHC = !isHC; - - /// Returns true if dark mode is enabled for the current theme - bool get isDarkMode => widget.themePrefs.darkMode; - - /// Returns true if dark mode for WebViews is enabled for the current theme - bool get isWebViewDarkMode => widget.themePrefs.darkMode && widget.themePrefs.webViewDarkMode; - - /// Returns true if high-contrast mode is enabled for the current theme - bool get isHC => widget.themePrefs.hcMode; - - /// Returns true if both dark mode and high-contrast mode are disabled for the current theme - bool get isLightNormal => !isDarkMode && !isHC; - - /// Returns true if dark mode is disable and high-contrast mode is enabled for the current theme - bool get isLightHC => !isDarkMode && isHC; - - /// Returns true if dark mode is enabled and high-contrast mode is disabled for the current theme - bool get isDarkNormal => isDarkMode && !isHC; - - /// Returns true if both dark mode and high-contrast mode are enabled for the current theme - bool get isDarkHC => isDarkMode && isHC; - - /// Returns a Parent App theme that ignores student color - ThemeData get defaultTheme => _buildTheme(getColorVariantForCurrentState(StudentColorSet.electric), isDarkMode); - - /// Returns a light Parent App theme that ignores student color - ThemeData get defaultLightTheme => _buildTheme(getColorVariantForCurrentState(StudentColorSet.electric), false); - - /// Returns a Parent App theme styled with the color of the currently selected student - ThemeData get studentTheme => _buildTheme(studentColor, isDarkMode); - - /// Create a preferred size divider that can be used as the bottom of an app bar - PreferredSize _appBarDivider(Color color) => PreferredSize( - preferredSize: Size.fromHeight(1), - child: Divider(height: 1, color: color), - ); - - /// Returns a light divider if in dark mode, otherwise a light divider that changes color with HC mode - PreferredSize get _appBarDividerThemed => - _appBarDivider(isDarkMode ? ParentColors.oxford : ParentColors.appBarDividerLight); - - /// Returns a light divider if in dark mode, dark divider in light mode unless shadowInLightMode is true, wrapping the optional bottom passed in - PreferredSizeWidget? appBarDivider({PreferredSizeWidget? bottom, bool shadowInLightMode = true}) => - (isDarkMode || !shadowInLightMode) - ? PreferredSize( - preferredSize: Size.fromHeight(1.0 + (bottom?.preferredSize.height ?? 0)), // Bottom height plus divider - child: Column( - children: [ - if (bottom != null) bottom, - _appBarDividerThemed, - ], - ), - ) - : bottom; - - /// Returns a widget wrapping a divider on top of the passed in bottom - Widget bottomNavigationDivider(Widget bottom) => Column( - mainAxisSize: MainAxisSize.min, - children: [ - _appBarDividerThemed, - bottom, - ], - ); - - @override - void setState(fn) { - super.setState(fn); - _notifier.notify(); - } - - @override - Widget build(BuildContext context) { - return ChangeNotifierProvider.value( - value: _notifier, - child: widget.builder(context, studentTheme), - ); - } - - /// Color for text, icons, etc that contrasts sharply with the scaffold (i.e. surface) color - Color get onSurfaceColor => isDarkMode ? ParentColors.tiara : ParentColors.licorice; - - /// Color similar to the surface color but is slightly darker in light mode and slightly lighter in dark mode. - /// This should be used elements that should be visually distinguishable from the surface color but must also contrast - /// sharply with the [onSurfaceColor]. Examples are chip backgrounds, progressbar backgrounds, avatar backgrounds, etc. - Color get nearSurfaceColor => isDarkMode ? Colors.grey[850] ?? ParentColors.porcelain : ParentColors.porcelain; - - /// The green 'success' color appropriate for the current light/dark/HC mode - Color get successColor => getColorVariantForCurrentState(StudentColorSet.shamrock); - - ThemeData _buildTheme(Color themeColor, bool isDarkMode) { - var textTheme = _buildTextTheme(onSurfaceColor); - - // Use single text color for all styles in high-contrast mode - if (isHC) { - textTheme = textTheme.apply(displayColor: onSurfaceColor, bodyColor: onSurfaceColor); - } - else { - textTheme = isDarkMode ? - _buildTextTheme(onSurfaceColor, fadeColor: ParentColors.ash) : - _buildTextTheme(onSurfaceColor); - } - - var primaryTextTheme = _buildTextTheme(Colors.white, fadeColor: ParentColors.tiara); - - if (isHC) { - primaryTextTheme = primaryTextTheme.apply(displayColor: Colors.white, bodyColor: Colors.white); - } else if (isDarkMode) { - primaryTextTheme = _buildTextTheme(ParentColors.porcelain, fadeColor: ParentColors.tiara); - } - - var primaryIconTheme = isDarkMode - ? IconThemeData(color: ParentColors.tiara) - : IconThemeData(color: Colors.white); - - var brightness = isDarkMode ? Brightness.dark : Brightness.light; - var backgroundColor = isDarkMode ? Colors.black : Colors.white; - var iconTheme = isDarkMode - ? IconThemeData(color: ParentColors.porcelain) - : IconThemeData(color: ParentColors.licorice); - var dividerColor = isHC ? onSurfaceColor : isDarkMode ? ParentColors - .licorice : ParentColors.tiara; - var dialogBackgroundColor = isDarkMode ? ParentColors.licorice : ParentColors.tiara; - - var swatch = ParentColors.makeSwatch(themeColor); - - return ThemeData( - primarySwatch: swatch, - primaryColor: isDarkMode ? Colors.black : null, - colorScheme: ColorScheme.fromSwatch(primarySwatch: swatch).copyWith( - secondary: swatch[500], brightness: brightness), - textSelectionTheme: TextSelectionThemeData( - selectionHandleColor: swatch[300], - ), - scaffoldBackgroundColor: backgroundColor, - canvasColor: backgroundColor, - textTheme: textTheme, - primaryTextTheme: primaryTextTheme, - iconTheme: iconTheme, - primaryIconTheme: primaryIconTheme, - dividerColor: dividerColor, - dividerTheme: DividerThemeData(color: dividerColor), - buttonTheme: ButtonThemeData( - height: 48, minWidth: 120, textTheme: ButtonTextTheme.primary), - fontFamily: 'Lato', - tabBarTheme: TabBarTheme( - labelStyle: primaryTextTheme.titleMedium?.copyWith(fontSize: 14), - labelColor: primaryTextTheme.titleMedium?.color, - unselectedLabelStyle: primaryTextTheme.bodySmall?.copyWith( - fontSize: 14), - unselectedLabelColor: primaryTextTheme.bodySmall?.color, - ), - appBarTheme: AppBarTheme( - backgroundColor: isDarkMode ? Colors.white12 : themeColor, - foregroundColor: primaryIconTheme.color, - systemOverlayStyle: SystemUiOverlayStyle.light, - ), - ); - } - - TextTheme _buildTextTheme(Color color, {Color fadeColor = ParentColors.oxford}) { - return TextTheme( - /// Design-provided styles - - // Comments for each text style represent the nomenclature of the designs we have - // Caption - titleSmall: TextStyle(color: fadeColor, fontSize: 12, fontWeight: FontWeight.w500), - - // Subhead - labelSmall: TextStyle(color: fadeColor, fontSize: 12, fontWeight: FontWeight.bold, letterSpacing: 0), - - // Body - bodyMedium: TextStyle(color: color, fontSize: 14, fontWeight: FontWeight.normal), - - // Subtitle - bodySmall: TextStyle(color: fadeColor, fontSize: 14, fontWeight: FontWeight.w500), - - // Title - titleMedium: TextStyle(color: color, fontSize: 16, fontWeight: FontWeight.w500), - - // Heading - headlineSmall: TextStyle(color: color, fontSize: 18, fontWeight: FontWeight.w500), - - // Display - headlineMedium: TextStyle(color: color, fontSize: 24, fontWeight: FontWeight.w500), - - /// Other/unmapped styles - - titleLarge: TextStyle(color: color), - - displayLarge: TextStyle(color: fadeColor), - - displayMedium: TextStyle(color: fadeColor), - - displaySmall: TextStyle(color: fadeColor), - - bodyLarge: TextStyle(color: color), - - labelLarge: TextStyle(color: color), - ); - } -} - -/// A [ChangeNotifier] used to notify consumers when the ParentTheme state changes. Ideally the state itself would -/// be a [ChangeNotifier] so we wouldn't need this extra class, but there is currently a mixin-related limitation -/// that prevents the state's dispose method from being called: https://github.com/flutter/flutter/issues/24293 -class ParentThemeStateChangeNotifier with ChangeNotifier { - notify() => notifyListeners(); // notifyListeners is protected, so we expose it through another method -} - -/// Applies a 'default' Parent App theme to descendant widgets. This theme is identical to the one provided by -/// ParentTheme with the exception of the primary and accent colors, which are fixed and do not respond to changes -/// to the selected student color. -/// Additionally, the app bar can be specified to the non primary app bar when emphasizing that there is no student -/// context. This makes the app bar use the scaffold background color, altering the text and icon themes so that they -/// still show properly as well. -class DefaultParentTheme extends StatelessWidget { - final WidgetBuilder builder; - final bool useNonPrimaryAppBar; - - const DefaultParentTheme({required this.builder, this.useNonPrimaryAppBar = true, super.key}); - - @override - Widget build(BuildContext context) { - var theme = ParentTheme.of(context)!.defaultTheme; - if (useNonPrimaryAppBar) theme = theme.copyWith(appBarTheme: _scaffoldColoredAppBarTheme(context)); - - return Consumer( - builder: (context, state, _) => Theme( - child: Builder(builder: builder), - data: theme, - ), - ); - } - - AppBarTheme _scaffoldColoredAppBarTheme(BuildContext context) { - final theme = Theme.of(context); - return AppBarTheme( - color: theme.scaffoldBackgroundColor, - toolbarTextStyle: theme.textTheme.bodyMedium, - titleTextStyle: theme.textTheme.titleLarge, - iconTheme: theme.iconTheme, - elevation: 0, - ); - } -} diff --git a/apps/flutter_parent/lib/utils/design/student_color_set.dart b/apps/flutter_parent/lib/utils/design/student_color_set.dart deleted file mode 100644 index 313043d7b1..0000000000 --- a/apps/flutter_parent/lib/utils/design/student_color_set.dart +++ /dev/null @@ -1,69 +0,0 @@ -// Copyright (C) 2019 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'dart:ui'; - -import 'package:flutter/cupertino.dart'; -import 'package:flutter_parent/l10n/app_localizations.dart'; - -/// Holds a set of a color variants meant to be used with different combinations of dark mode and high-contrast mode -class StudentColorSet { - /// Blue student color set - static const electric = StudentColorSet(Color(0xFF007BC2), Color(0xFF065D89), Color(0xFF008EE2), Color(0xFF00A0FF)); - - /// Purple student color set - static const jeffGoldplum = - StudentColorSet(Color(0xFF5F4DCE), Color(0xFF523ECC), Color(0xFF7667D5), Color(0xFF9584FF)); - - /// Pink student color set - static const barney = StudentColorSet(Color(0xFFBF32A4), Color(0xFFA30785), Color(0xFFCB34AF), Color(0xFFFF43DB)); - - /// Red student color set - static const raspberry = StudentColorSet(Color(0xFFE9162E), Color(0xFFAC182A), Color(0xFFEC3349), Color(0xFFFF6073)); - - /// Orange student color set - static const fire = StudentColorSet(Color(0xFFD34503), Color(0xFF9F3300), Color(0xFFFC5E13), Color(0xFFFF6319)); - - /// Green student color set - static const shamrock = StudentColorSet(Color(0xFF008A12), Color(0xFF006809), Color(0xFF00AC18), Color(0xFF00B119)); - - /// List of all student color sets - static const List all = [electric, jeffGoldplum, barney, raspberry, fire, shamrock]; - - const StudentColorSet(this.light, this.lightHC, this.dark, this.darkHC); - - final Color light; - final Color lightHC; - final Color dark; - final Color darkHC; - - static String getA11yName(StudentColorSet colorSet, BuildContext context) { - switch (colorSet) { - case electric: - return L10n(context).colorElectric; - case jeffGoldplum: - return L10n(context).colorPlum; - case barney: - return L10n(context).colorBarney; - case raspberry: - return L10n(context).colorRaspberry; - case fire: - return L10n(context).colorFire; - case shamrock: - return L10n(context).colorShamrock; - default: - return ''; - } - } -} diff --git a/apps/flutter_parent/lib/utils/design/theme_prefs.dart b/apps/flutter_parent/lib/utils/design/theme_prefs.dart deleted file mode 100644 index 9b06002e67..0000000000 --- a/apps/flutter_parent/lib/utils/design/theme_prefs.dart +++ /dev/null @@ -1,57 +0,0 @@ -// Copyright (C) 2019 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:flutter/foundation.dart'; -import 'package:shared_preferences/shared_preferences.dart'; - -class ThemePrefs { - static String PREF_KEY_DARK_MODE = 'dark_mode'; - - static String PREF_KEY_WEB_VIEW_DARK_MODE = 'web_view_dark_mode'; - - static String PREF_KEY_HC_MODE = 'high_contrast_mode'; - - static SharedPreferences? _prefs; - - static Future init() async { - if (_prefs == null) _prefs = await SharedPreferences.getInstance(); - } - - @visibleForTesting - static Future clear() => _prefs?.clear() ?? Future(() => false); - - const ThemePrefs(); - - /// Returns the stored preference for dark mode. The get the value for the theme in use, call ParentTheme.of(context).isDarkMode - bool get darkMode => _prefs?.getBool(PREF_KEY_DARK_MODE) ?? false; - - /// Sets the dark mode value. Note that calling this only changes the stored preference. To update the theme in use, - /// prefer setting ParentTheme.of(context).isDarkMode - set darkMode(bool value) => _prefs?.setBool(PREF_KEY_DARK_MODE, value); - - /// Returns the stored preference for dark mode for WebViews. The get the value for the theme in use, - /// call ParentTheme.of(context).isWebViewDarkMode - bool get webViewDarkMode => _prefs?.getBool(PREF_KEY_WEB_VIEW_DARK_MODE) ?? false; - - /// Sets the dark mode value for WebViews. Note that calling this only changes the stored preference. To update the - /// theme in use, prefer setting ParentTheme.of(context).isWebViewDarkMode - set webViewDarkMode(bool value) => _prefs?.setBool(PREF_KEY_WEB_VIEW_DARK_MODE, value); - - /// Returns the stored preference for high-contrast mode. To get the value for the theme in use, call ParentTheme.of(context).isHC - bool get hcMode => _prefs?.getBool(PREF_KEY_HC_MODE) ?? false; - - /// Sets the high contrast mode value. Note that calling this only changes the stored preference. To update the theme - /// in use, prefer setting ParentTheme.of(context).isHC - set hcMode(bool value) => _prefs?.setBool(PREF_KEY_HC_MODE, value); -} diff --git a/apps/flutter_parent/lib/utils/design/theme_transition/theme_transition_overlay.dart b/apps/flutter_parent/lib/utils/design/theme_transition/theme_transition_overlay.dart deleted file mode 100644 index decaddb526..0000000000 --- a/apps/flutter_parent/lib/utils/design/theme_transition/theme_transition_overlay.dart +++ /dev/null @@ -1,177 +0,0 @@ -// Copyright (C) 2019 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'dart:math'; -import 'dart:typed_data'; -import 'dart:ui'; - -import 'package:flutter/material.dart'; -import 'package:flutter/rendering.dart'; -import 'package:flutter_parent/utils/design/theme_transition/theme_transition_target.dart'; - -/// An overlay shown during a theme transition, where the 'old' theme is rendered on top of the theme and a -/// clipping mask is used to animated a circular reveal to the theme. Refer to [ThemeTransitionTarget] for -/// usage details. -class ThemeTransitionOverlay extends StatefulWidget { - final Uint8List imageBytes; - final Offset anchorCenter; - final Function() onReady; - - const ThemeTransitionOverlay( - this.imageBytes, - this.anchorCenter, - this.onReady, { - super.key, - }); - - static display(BuildContext context, GlobalKey? anchorKey, Function() onReady) async { - // Get center of anchor, which will be the origin point of the transition animation - RenderBox box = anchorKey?.currentContext!.findRenderObject() as RenderBox; - var anchorCenter = box.localToGlobal(box.size.center(Offset(0, 0))); - - // Get the target widget over which the animation will be displayed - var target = ThemeTransitionTarget.of(context); - if (target == null) throw 'ThemeTransitionTarget not found in the widget tree'; - - // Get the repaint boundary of the target, render at 1/2 scale to a PNG image - RenderRepaintBoundary boundary = ThemeTransitionTarget.of(context)!.boundaryKey.currentContext!.findRenderObject() as RenderRepaintBoundary; - var scale = WidgetsBinding.instance.window.devicePixelRatio / 2; - var img = await boundary.toImage(pixelRatio: scale); - var byteData = await img.toByteData(format: ImageByteFormat.png); - Uint8List pngBytes = byteData!.buffer.asUint8List(); - - // Custom route to ThemeTransitionOverlay - Navigator.of(context).push( - PageRouteBuilder( - opaque: false, // Ensures the underlying screen is rendered during the reveal animation - pageBuilder: (BuildContext context, _, __) => ThemeTransitionOverlay(pngBytes, anchorCenter, onReady), - ), - ); - } - - @override - _ThemeTransitionOverlayState createState() => _ThemeTransitionOverlayState(); -} - -class _ThemeTransitionOverlayState extends State with TickerProviderStateMixin { - static const maxSplashOpacity = 0.35; - - late AnimationController _animationController; - late Animation _animation; - bool _onReadyCalled = false; - - @override - void initState() { - super.initState(); - - _animationController = AnimationController(vsync: this, duration: Duration(milliseconds: 1000)); - - _animationController.addListener(() { - // Remove this overlay once the transition animation is complete - if (_animationController.isCompleted) { - Navigator.of(context).pop(); - } - }); - _animation = CurvedAnimation( - parent: _animationController, - curve: Curves.easeInBack, - ); - _animationController.forward(); - } - - @override - void dispose() { - _animationController.dispose(); - super.dispose(); - } - - @override - Widget build(BuildContext context) { - var image = Image.memory( - widget.imageBytes, - repeat: ImageRepeat.repeat, - filterQuality: FilterQuality.none, - ); - - // Wait for the image to finish loading before calling onReady, otherwise a race condition might cause the screen - // to briefly flicker between the old and themes. - image.image.resolve(ImageConfiguration()).addListener(ImageStreamListener((_, __) { - if (!_onReadyCalled) { - _onReadyCalled = true; - widget.onReady(); - } - })); - - return AnimatedBuilder( - animation: _animation, - builder: (context, child) { - var size = MediaQuery.of(context).size; - - // Set up splash color. This should fade to zero opacity as the animation progresses. - var splashColor = Theme.of(context) - .splashColor - .withOpacity(maxSplashOpacity - (maxSplashOpacity * _animation.value.clamp(0.0, 1.0))); - - // Set up the circle Rect that will serve as both the clipping bounds and the splash shape - var rect = Rect.fromCircle( - center: widget.anchorCenter, - radius: _animation.value * sqrt(pow(size.width, 2) + pow(size.height, 2)), - ); - - // Wrap the clipper inside the CustomPaint so the splash renders on top rather than being clipped - return CustomPaint( - painter: _ThemeTransitionSplashPainter(splashColor, rect), - child: ClipPath( - clipper: _ThemeTransitionClipper(rect), - child: image, - ), - ); - }, - ); - } -} - -/// Performs the clip operation which reveals the theme underneath -class _ThemeTransitionClipper extends CustomClipper { - Rect clipRect; - - _ThemeTransitionClipper(this.clipRect); - - @override - Path getClip(Size size) { - return Path() - ..addRect(Rect.fromLTRB(0, 0, size.width, size.height)) - ..addOval(clipRect) - ..fillType = PathFillType.evenOdd; - } - - @override - bool shouldReclip(CustomClipper oldClipper) => true; -} - -/// Draws a ripple/splash over the transition animation -class _ThemeTransitionSplashPainter extends CustomPainter { - _ThemeTransitionSplashPainter(this.color, this.splashRect); - - Color color; - Rect splashRect; - - @override - void paint(Canvas canvas, Size size) { - canvas.drawPath(Path()..addOval(splashRect), Paint()..color = color); - } - - @override - bool shouldRepaint(CustomPainter oldDelegate) => false; -} diff --git a/apps/flutter_parent/lib/utils/design/theme_transition/theme_transition_target.dart b/apps/flutter_parent/lib/utils/design/theme_transition/theme_transition_target.dart deleted file mode 100644 index e69f089a51..0000000000 --- a/apps/flutter_parent/lib/utils/design/theme_transition/theme_transition_target.dart +++ /dev/null @@ -1,70 +0,0 @@ -// Copyright (C) 2019 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:flutter/widgets.dart'; -import 'package:flutter_parent/utils/design/parent_theme.dart'; -import 'package:flutter_parent/utils/design/theme_transition/theme_transition_overlay.dart'; - -/// A widget targeted to display a circular reveal theme transition animation when the theme changes. For example, to -/// animate a transition to or from dark mode, wrap a child with this widget and call -/// ThemeTransitionTarget.toggleDark(context, anchorKey), where anchorKey is a [GlobalKey] assigned to a widget from -/// which the animation transition should originate. -/// -/// Note that this this widget is intended to be used with a full-screen [child] (e.g. a settings screen) and will not -/// work correctly with smaller nested widgets within a screen. -class ThemeTransitionTarget extends StatefulWidget { - final Widget? child; - - const ThemeTransitionTarget({this.child, super.key}); - - @override - _ThemeTransitionTargetState createState() => _ThemeTransitionTargetState(); - - /// Toggles dark mode and initiates an animated circular reveal transition to the new theme. [context] must be - /// a [BuildContext] that contains a [ThemeTransitionTarget], and [anchorKey] must be a [GlobalKey] assigned - /// to a widget from which the animation transition will originate. - static void toggleDarkMode(BuildContext context, GlobalKey? anchorKey) { - _toggleMode(context, anchorKey, () => ParentTheme.of(context)?.toggleDarkMode()); - } - - static void _toggleMode(BuildContext context, GlobalKey? anchorKey, Function() toggle) { - // If testing, just toggle without doing the theme transition overlay - if (WidgetsBinding.instance.runtimeType != WidgetsFlutterBinding) { - toggle(); - return; - } - - WidgetsBinding.instance.addPostFrameCallback((_) { - ThemeTransitionOverlay.display(context, anchorKey, () { - toggle(); - }); - }); - } - - static _ThemeTransitionTargetState? of(BuildContext context) { - return context.findAncestorStateOfType<_ThemeTransitionTargetState>(); - } -} - -class _ThemeTransitionTargetState extends State { - final boundaryKey = GlobalKey(); - - @override - Widget build(BuildContext context) { - return RepaintBoundary( - key: boundaryKey, - child: widget.child, - ); - } -} diff --git a/apps/flutter_parent/lib/utils/features_utils.dart b/apps/flutter_parent/lib/utils/features_utils.dart deleted file mode 100644 index 8f2a0b9eeb..0000000000 --- a/apps/flutter_parent/lib/utils/features_utils.dart +++ /dev/null @@ -1,45 +0,0 @@ -// Copyright (C) 2023 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:encrypted_shared_preferences/encrypted_shared_preferences.dart'; -import 'package:flutter_parent/network/api/features_api.dart'; -import 'package:flutter_parent/utils/service_locator.dart'; - -class FeaturesUtils { - - static const String KEY_SEND_USAGE_METRICS = 'send_usage_metrics'; - - static EncryptedSharedPreferences? _prefs; - - static Future init() async { - if (_prefs == null) _prefs = await EncryptedSharedPreferences.getInstance(); - } - - static Future checkUsageMetricFeatureFlag() async { - await init(); - final featureFlags = await locator().getFeatureFlags(); - await _prefs?.setBool(KEY_SEND_USAGE_METRICS, featureFlags?.sendUsageMetrics); - } - - static Future getUsageMetricFeatureFlag() async { - await init(); - return await _prefs?.getBool(KEY_SEND_USAGE_METRICS) == true; - } - - static Future performLogout() async { - if (_prefs != null) { - await _prefs?.remove(KEY_SEND_USAGE_METRICS); - } - } -} \ No newline at end of file diff --git a/apps/flutter_parent/lib/utils/notification_util.dart b/apps/flutter_parent/lib/utils/notification_util.dart deleted file mode 100644 index 3c1307a516..0000000000 --- a/apps/flutter_parent/lib/utils/notification_util.dart +++ /dev/null @@ -1,143 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'dart:async'; -import 'dart:convert'; - -import 'package:flutter/foundation.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_local_notifications/flutter_local_notifications.dart'; -import 'package:flutter_parent/l10n/app_localizations.dart'; -import 'package:flutter_parent/models/notification_payload.dart'; -import 'package:flutter_parent/models/reminder.dart'; -import 'package:flutter_parent/models/serializers.dart'; -import 'package:flutter_parent/network/utils/analytics.dart'; -import 'package:flutter_parent/router/panda_router.dart'; -import 'package:flutter_parent/utils/db/reminder_db.dart'; -import 'package:flutter_parent/utils/service_locator.dart'; -import 'package:timezone/data/latest_all.dart' as tz; -import 'package:timezone/timezone.dart' as tz; - -class NotificationUtil { - static const notificationChannelReminders = - 'com.instructure.parentapp/reminders'; - - static AndroidFlutterLocalNotificationsPlugin? _plugin; - - @visibleForTesting - static initForTest(AndroidFlutterLocalNotificationsPlugin plugin) { - _plugin = plugin; - } - - static Future init(Completer? appCompleter) async { - var initializationSettings = AndroidInitializationSettings('ic_notification_canvas_logo'); - - if (_plugin == null) { - _plugin = AndroidFlutterLocalNotificationsPlugin(); - } - - await _plugin!.initialize( - initializationSettings, - onDidReceiveNotificationResponse: (rawPayload) async { - await handlePayload(rawPayload.payload ?? '', appCompleter); - }, - ); - } - - @visibleForTesting - static Future handlePayload( - String rawPayload, Completer? appCompleter) async { - try { - NotificationPayload? payload = deserialize(json.decode(rawPayload)); - switch (payload?.type) { - case NotificationPayloadType.reminder: - await handleReminder(payload!, appCompleter); - break; - case NotificationPayloadType.other: - break; - } - } catch (e) { - print(e); - } - } - - @visibleForTesting - static Future handleReminder( - NotificationPayload payload, Completer? appCompleter) async { - Reminder? reminder = Reminder.fromNotification(payload); - - // Delete reminder from db - await locator().deleteById(reminder?.id); - - // Create route - String? route; - switch (reminder?.type) { - case Reminder.TYPE_ASSIGNMENT: - route = - PandaRouter.assignmentDetails(reminder!.courseId, reminder.itemId); - break; - case Reminder.TYPE_EVENT: - route = PandaRouter.eventDetails(reminder!.courseId, reminder.itemId); - break; - } - - // Push route, but only after the app has finished building - if (route != null) appCompleter?.future.then((_) => WidgetsBinding.instance.handlePushRoute(route!)); - } - - Future scheduleReminder( - AppLocalizations l10n, String? title, String body, Reminder reminder) { - final payload = NotificationPayload((b) => b - ..type = NotificationPayloadType.reminder - ..data = json.encode(serialize(reminder))); - - final notificationDetails = AndroidNotificationDetails( - notificationChannelReminders, - l10n.remindersNotificationChannelName, - channelDescription: l10n.remindersNotificationChannelDescription - ); - - if (reminder.type == Reminder.TYPE_ASSIGNMENT) { - locator() - .logEvent(AnalyticsEventConstants.REMINDER_ASSIGNMENT_CREATE); - } else { - locator() - .logEvent(AnalyticsEventConstants.REMINDER_EVENT_CREATE); - } - - tz.initializeTimeZones(); - var d = reminder.date!.toUtc(); - var date = tz.TZDateTime.utc(d.year, d.month, d.day, d.hour, d.minute, d.second); - - return _plugin!.zonedSchedule( - reminder.id!, - title, - body, - date, - notificationDetails, - scheduleMode: AndroidScheduleMode.exactAllowWhileIdle, - payload: json.encode(serialize(payload)) - ); - } - - Future deleteNotification(int id) => _plugin!.cancel(id); - - Future deleteNotifications(List ids) async { - for (int id in ids) await _plugin!.cancel(id); - } - - Future requestScheduleExactAlarmPermission() async { - return await _plugin?.requestExactAlarmsPermission(); - } -} diff --git a/apps/flutter_parent/lib/utils/old_app_migration.dart b/apps/flutter_parent/lib/utils/old_app_migration.dart deleted file mode 100644 index 659eac747e..0000000000 --- a/apps/flutter_parent/lib/utils/old_app_migration.dart +++ /dev/null @@ -1,61 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'dart:convert'; - -import 'package:flutter/services.dart'; -import 'package:flutter_parent/models/login.dart'; -import 'package:flutter_parent/models/serializers.dart'; -import 'package:flutter_parent/network/utils/api_prefs.dart'; - -class OldAppMigration { - static const channelName = 'com.instructure.parentapp/oldAppMigrations'; - static const methodGetLogins = 'getLogins'; - static const methodHasOldReminders = 'hasOldReminders'; - - static const channel = const MethodChannel(channelName); - - Future performMigrationIfNecessary() async { - // Skip if we have already performed the migration - if (ApiPrefs.getHasMigrated() == true) return; - - // Get the list of logins from the native side - List data = await channel.invokeMethod(methodGetLogins); - List logins = data.map((it) => deserialize(json.decode(it))).toList().nonNulls.toList(); - - if (logins.isNotEmpty) { - // Save the list of logins to prefs - ApiPrefs.saveLogins(logins); - - // Set the first login as the current login - ApiPrefs.switchLogins(logins[0]); - } - - // Mark as migrated - ApiPrefs.setHasMigrated(true); - } - - Future hasOldReminders() async { - // Skip if we have already performed the check - if (ApiPrefs.getHasCheckedOldReminders() == true) return false; - - // Get result from native side - var hasOldReminders = await channel.invokeMethod(methodHasOldReminders); - - // Mark as checked - await ApiPrefs.setHasCheckedOldReminders(true); - - return hasOldReminders; - } -} diff --git a/apps/flutter_parent/lib/utils/permission_handler.dart b/apps/flutter_parent/lib/utils/permission_handler.dart deleted file mode 100644 index 11cc79b1ba..0000000000 --- a/apps/flutter_parent/lib/utils/permission_handler.dart +++ /dev/null @@ -1,11 +0,0 @@ -import 'package:permission_handler/permission_handler.dart'; - -class PermissionHandler { - Future checkPermissionStatus(Permission permission) async { - return permission.status; - } - - Future requestPermission(Permission permission) async { - return permission.request(); - } -} \ No newline at end of file diff --git a/apps/flutter_parent/lib/utils/qr_utils.dart b/apps/flutter_parent/lib/utils/qr_utils.dart deleted file mode 100644 index 0b4192246e..0000000000 --- a/apps/flutter_parent/lib/utils/qr_utils.dart +++ /dev/null @@ -1,114 +0,0 @@ -/* - * Copyright (C) 2020 - present Instructure, Inc. - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, version 3 of the License. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -import 'package:barcode_scan2/barcode_scan2.dart'; -import 'package:flutter/services.dart'; -import 'package:flutter_parent/utils/service_locator.dart'; -import 'package:flutter_parent/utils/veneers/barcode_scan_veneer.dart'; - -class QRUtils { - // QR Login - static const String QR_DOMAIN = 'domain'; - static const String QR_AUTH_CODE = 'code_android_parent'; - static const String QR_HOST = 'sso.canvaslms.com'; - static const String QR_HOST_BETA = 'sso.beta.canvaslms.com'; - static const String QR_HOST_TEST = 'sso.test.canvaslms.com'; - - // QR Pairing - static const String QR_PAIR_PATH = 'pair'; - static const String QR_PAIR_PARAM_CODE = 'code'; - static const String QR_PAIR_PARAM_ACCOUNT_ID = 'account_id'; - - static Uri? verifySSOLogin(String? url) { - if (url == null) return null; - try { - var uri = Uri.parse(url); - var hostList = [QR_HOST, QR_HOST_BETA, QR_HOST_TEST]; - if (hostList.contains(uri.host) && - uri.queryParameters[QR_DOMAIN] != null && - uri.queryParameters[QR_AUTH_CODE] != null) { - return uri; - } else { - return null; - } - } catch (e) { - return null; - } - } - - /// Opens the bar code scanner and attempts to scan for a pairing QR code - static Future scanPairingCode() async { - try { - ScanResult scanResult = await locator().scanBarcode(); - switch (scanResult.type) { - case ResultType.Barcode: - return QRUtils.parsePairingInfo(scanResult.rawContent); - case ResultType.Cancelled: - return QRPairingScanResult.error(QRPairingScanErrorType.canceled); - case ResultType.Error: - return QRPairingScanResult.error(QRPairingScanErrorType.invalidCode); - } - } on PlatformException catch (e) { - if (e.code == BarcodeScanner.cameraAccessDenied) { - return QRPairingScanResult.error(QRPairingScanErrorType.cameraError); - } - } catch (e) { - // Intentionally left blank - } - return QRPairingScanResult.error(QRPairingScanErrorType.unknown); - } - - /// Attempts to parse and return QR pairing information from the provided uri. Returns null if parsing failed. - static QRPairingScanResult parsePairingInfo(String? rawUri) { - if (rawUri == null) return QRPairingScanResult.error(QRPairingScanErrorType.invalidCode); - try { - var uri = Uri.parse(rawUri); - var params = uri.queryParameters; - if (QR_PAIR_PATH == uri.pathSegments.first && - params[QR_PAIR_PARAM_CODE] != null && - params[QR_PAIR_PARAM_ACCOUNT_ID] != null) { - return QRPairingScanResult.success(params[QR_PAIR_PARAM_CODE]!, uri.host, params[QR_PAIR_PARAM_ACCOUNT_ID]!); - } - } catch (e) { - // Intentionally left blank - } - return QRPairingScanResult.error(QRPairingScanErrorType.invalidCode); - } -} - -class QRPairingScanResult { - QRPairingScanResult._(); - - factory QRPairingScanResult.success(String code, String domain, String accountId) = QRPairingInfo._; - - factory QRPairingScanResult.error(QRPairingScanErrorType type) = QRPairingScanError._; -} - -class QRPairingInfo extends QRPairingScanResult { - final String code; - final String domain; - final String accountId; - - QRPairingInfo._(this.code, this.domain, this.accountId) : super._(); -} - -class QRPairingScanError extends QRPairingScanResult { - final QRPairingScanErrorType type; - - QRPairingScanError._(this.type) : super._(); -} - -enum QRPairingScanErrorType { invalidCode, cameraError, canceled, unknown } diff --git a/apps/flutter_parent/lib/utils/quick_nav.dart b/apps/flutter_parent/lib/utils/quick_nav.dart deleted file mode 100644 index f26c2e9174..0000000000 --- a/apps/flutter_parent/lib/utils/quick_nav.dart +++ /dev/null @@ -1,81 +0,0 @@ -// Copyright (C) 2019 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:fluro/fluro.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter/material.dart' as Material show showDialog; -import 'package:flutter/widgets.dart'; -import 'package:flutter_parent/network/utils/analytics.dart'; -import 'package:flutter_parent/router/panda_router.dart'; -import 'package:flutter_parent/utils/service_locator.dart'; - -class QuickNav { - @Deprecated('Deprecated in favor of using PushRoute etc, end goal is for all routes to go through PandaRouter') - Future push(BuildContext context, Widget widget) { - _logShow(widget); - return Navigator.of(context).push(MaterialPageRoute(builder: (context) => widget)); - } - - /// Default method for pushing screens, uses material transition - Future pushRoute(BuildContext context, String route, - {TransitionType transitionType = TransitionType.material}) { - return PandaRouter.router.navigateTo(context, route, transition: transitionType); - } - - Future replaceRoute(BuildContext context, String route, - {TransitionType transitionType = TransitionType.material}) { - return PandaRouter.router.navigateTo(context, route, transition: transitionType, replace: true); - } - - Future pushRouteAndClearStack(BuildContext context, String route, - {TransitionType transitionType = TransitionType.material}) { - return PandaRouter.router.navigateTo(context, route, transition: transitionType, clearStack: true); - } - - Future pushRouteWithCustomTransition(BuildContext context, String route, bool clearStack, - Duration transitionDuration, RouteTransitionsBuilder transitionsBuilder, - {TransitionType transitionType = TransitionType.custom}) { - return PandaRouter.router.navigateTo(context, route, - clearStack: clearStack, - transitionDuration: transitionDuration, - transition: transitionType, - transitionBuilder: transitionsBuilder); - } - - Future routeInternally(BuildContext context, String url) { - return PandaRouter.routeInternally(context, url); - } - - void _logShow(Widget widget) { - final widgetName = widget.runtimeType.toString(); - final message = 'Pushing widget: $widgetName'; - locator().logMessage(message); - locator().setCurrentScreen(widgetName); - } - - Future showDialog({ - required BuildContext context, - bool barrierDismissible = true, - required WidgetBuilder builder, - bool useRootNavigator = true, - RouteSettings? routeSettings, - }) => - Material.showDialog( - context: context, - barrierDismissible: barrierDismissible, - builder: builder, - useRootNavigator: useRootNavigator, - routeSettings: routeSettings, - ); -} diff --git a/apps/flutter_parent/lib/utils/remote_config_utils.dart b/apps/flutter_parent/lib/utils/remote_config_utils.dart deleted file mode 100644 index b944666049..0000000000 --- a/apps/flutter_parent/lib/utils/remote_config_utils.dart +++ /dev/null @@ -1,155 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:firebase_remote_config/firebase_remote_config.dart'; -import 'package:flutter/widgets.dart'; -import 'package:shared_preferences/shared_preferences.dart'; - -// All of the Remote Config params that we choose to care about. -enum RemoteConfigParams { - TEST_STRING, - MOBILE_VERIFY_BETA_ENABLED, -} - -class RemoteConfigUtils { - static FirebaseRemoteConfig? _remoteConfig = null; - static SharedPreferences? _prefs; - - // I bifurcated initialize() into initialize() and initializeExplicit() to allow for - // tests to pass in a mocked RemoteConfig object. - /** - * Initialize RemoteConfigUtils. Should only be called once. - * This is the normal initializer that should be called from production code. - **/ - static Future initialize() async { - FirebaseRemoteConfig freshRemoteConfig = await FirebaseRemoteConfig.instance; - await initializeExplicit(freshRemoteConfig); - } - - /** Only intended for use in test code. Should not be called from production code. */ - @visibleForTesting - static void clean() { - _remoteConfig = null; - _prefs = null; - } - - /** - * Initialize RemoteConfigUtils with a pre-built RemoteConfig object. - * Only intended for use in test code. Should not be called from production code. - */ - @visibleForTesting - static Future initializeExplicit(FirebaseRemoteConfig remoteConfig) async { - if (_remoteConfig != null) - throw StateError('double-initialization of RemoteConfigUtils'); - - _remoteConfig = remoteConfig; - _remoteConfig!.settings.minimumFetchInterval = Duration(hours: 1); - - // fetch data from Firebase - bool updated = false; - try { - await _remoteConfig?.fetch(); - updated = await _remoteConfig?.activate() ?? false; - } catch (e) { - // On fetch/activate failure, just make sure that updated is set to false - updated = false; - } - - // Grab a SharedPreferences instance - _prefs = await SharedPreferences.getInstance(); - - if (updated) { - // If we actually fetched something, then store the fetched info into _prefs - RemoteConfigParams.values.forEach((rc) { - String rcParamName = getRemoteConfigName(rc); - String? rcParamValue = _remoteConfig?.getString(rcParamName); - String rcPreferencesName = _getSharedPreferencesName(rc); - print( - 'RemoteConfigUtils.initialize(): fetched $rcParamName=${rcParamValue == null ? 'null' : '\"$rcParamValue\"'}'); - if (rcParamValue != null) { - _prefs?.setString(rcPreferencesName, rcParamValue); - } - }); - } else { - // Otherwise, some log info. The log info here and above will serve as a substitute for - // a local remote-config settings page, which is not supported at this time. - print('RemoteConfigUtils.initialize(): No update'); - RemoteConfigParams.values.forEach((rc) { - String rcParamName = getRemoteConfigName(rc); - String rcPreferencesName = _getSharedPreferencesName(rc); - String? rcParamValue = _prefs?.getString(rcPreferencesName); - print( - 'RemoteConfigUtils.initialize(): cached $rcParamName value = ${rcParamValue == null ? 'null' : '\"$rcParamValue\"'}'); - }); - } - } - - /** Fetch the value (in string form) of the specified RemoteConfigParams element. */ - static String getStringValue(RemoteConfigParams rcParam) { - if (_remoteConfig == null) - throw StateError('RemoteConfigUtils not yet initialized'); - - var rcDefault = _getRemoteConfigDefaultValue(rcParam); - var rcPreferencesName = _getSharedPreferencesName(rcParam); - var result = _prefs?.getString(rcPreferencesName); - if (result == null) { - result = rcDefault; - _prefs?.setString(rcPreferencesName, rcDefault); - } - return result; - } - - // TODO: Get bool, double, int. But we have historically just used string values. - - // Utility method to fetch the remote config variable name associated with rcParam. - // Switch statements are required to cover all possible cases, so if we add - // a new element in RemoveConfigParams, we'll be forced to add handling for - // it here. - static String getRemoteConfigName(RemoteConfigParams rcParam) { - switch (rcParam) { - case RemoteConfigParams.TEST_STRING: - return 'test_string'; - case RemoteConfigParams.MOBILE_VERIFY_BETA_ENABLED: - return 'mobile_verify_beta_enabled'; - default: - return ''; - } - } - - // Utility method to fetch the default (string) value associated with rcParam. - // Switch statements are required to cover all possible cases, so if we add - // a new element in RemoveConfigParams, we'll be forced to add handling for - // it here. - static String _getRemoteConfigDefaultValue(RemoteConfigParams rcParam) { - switch (rcParam) { - case RemoteConfigParams.TEST_STRING: - return 'hey there'; - case RemoteConfigParams.MOBILE_VERIFY_BETA_ENABLED: - return 'false'; - default: - return ''; - } - } - - // Utility method to fetch the name of the SharedPreferences entry - // that corresponds to rcParam. Just prepends an 'rc_' to the - // remote config name for rcParam. - static String _getSharedPreferencesName(RemoteConfigParams rcParam) { - return 'rc_${getRemoteConfigName(rcParam)}'; - } - - static void updateRemoteConfig(RemoteConfigParams rcParam, String newValue) { - _prefs?.setString(_getSharedPreferencesName(rcParam), newValue); - } -} diff --git a/apps/flutter_parent/lib/utils/service_locator.dart b/apps/flutter_parent/lib/utils/service_locator.dart deleted file mode 100644 index 2866bbe36a..0000000000 --- a/apps/flutter_parent/lib/utils/service_locator.dart +++ /dev/null @@ -1,176 +0,0 @@ -// Copyright (C) 2019 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:firebase_crashlytics/firebase_crashlytics.dart'; -import 'package:flutter_parent/network/api/accounts_api.dart'; -import 'package:flutter_parent/network/api/alert_api.dart'; -import 'package:flutter_parent/network/api/announcement_api.dart'; -import 'package:flutter_parent/network/api/assignment_api.dart'; -import 'package:flutter_parent/network/api/auth_api.dart'; -import 'package:flutter_parent/network/api/calendar_events_api.dart'; -import 'package:flutter_parent/network/api/course_api.dart'; -import 'package:flutter_parent/network/api/enrollments_api.dart'; -import 'package:flutter_parent/network/api/error_report_api.dart'; -import 'package:flutter_parent/network/api/features_api.dart'; -import 'package:flutter_parent/network/api/file_api.dart'; -import 'package:flutter_parent/network/api/help_links_api.dart'; -import 'package:flutter_parent/network/api/inbox_api.dart'; -import 'package:flutter_parent/network/api/oauth_api.dart'; -import 'package:flutter_parent/network/api/page_api.dart'; -import 'package:flutter_parent/network/api/planner_api.dart'; -import 'package:flutter_parent/network/api/user_api.dart'; -import 'package:flutter_parent/network/utils/analytics.dart'; -import 'package:flutter_parent/screens/account_creation/account_creation_interactor.dart'; -import 'package:flutter_parent/screens/alert_thresholds/alert_thresholds_interactor.dart'; -import 'package:flutter_parent/screens/alerts/alerts_interactor.dart'; -import 'package:flutter_parent/screens/announcements/announcement_details_interactor.dart'; -import 'package:flutter_parent/screens/assignments/assignment_details_interactor.dart'; -import 'package:flutter_parent/screens/aup/acceptable_use_policy_interactor.dart'; -import 'package:flutter_parent/screens/calendar/calendar_today_click_notifier.dart'; -import 'package:flutter_parent/screens/calendar/calendar_widget/calendar_filter_screen/calendar_filter_list_interactor.dart'; -import 'package:flutter_parent/screens/courses/courses_interactor.dart'; -import 'package:flutter_parent/screens/courses/details/course_details_interactor.dart'; -import 'package:flutter_parent/screens/courses/routing_shell/course_routing_shell_interactor.dart'; -import 'package:flutter_parent/screens/dashboard/alert_notifier.dart'; -import 'package:flutter_parent/screens/dashboard/dashboard_interactor.dart'; -import 'package:flutter_parent/screens/dashboard/inbox_notifier.dart'; -import 'package:flutter_parent/screens/domain_search/domain_search_interactor.dart'; -import 'package:flutter_parent/screens/events/event_details_interactor.dart'; -import 'package:flutter_parent/screens/help/help_screen_interactor.dart'; -import 'package:flutter_parent/screens/inbox/attachment_utils/attachment_picker_interactor.dart'; -import 'package:flutter_parent/screens/inbox/conversation_details/conversation_details_interactor.dart'; -import 'package:flutter_parent/screens/inbox/conversation_list/conversation_list_interactor.dart'; -import 'package:flutter_parent/screens/inbox/create_conversation/create_conversation_interactor.dart'; -import 'package:flutter_parent/screens/inbox/reply/conversation_reply_interactor.dart'; -import 'package:flutter_parent/screens/manage_students/manage_students_interactor.dart'; -import 'package:flutter_parent/screens/manage_students/student_color_picker_interactor.dart'; -import 'package:flutter_parent/screens/masquerade/masquerade_screen_interactor.dart'; -import 'package:flutter_parent/screens/pairing/pairing_interactor.dart'; -import 'package:flutter_parent/screens/pairing/pairing_util.dart'; -import 'package:flutter_parent/screens/qr_login/qr_login_tutorial_screen_interactor.dart'; -import 'package:flutter_parent/screens/qr_login/qr_login_util.dart'; -import 'package:flutter_parent/screens/remote_config/remote_config_interactor.dart'; -import 'package:flutter_parent/screens/settings/settings_interactor.dart'; -import 'package:flutter_parent/screens/splash/splash_screen_interactor.dart'; -import 'package:flutter_parent/screens/web_login/web_login_interactor.dart'; -import 'package:flutter_parent/utils/alert_helper.dart'; -import 'package:flutter_parent/utils/common_widgets/error_report/error_report_interactor.dart'; -import 'package:flutter_parent/utils/common_widgets/view_attachment/view_attachment_interactor.dart'; -import 'package:flutter_parent/utils/common_widgets/view_attachment/viewers/audio_video_attachment_viewer_interactor.dart'; -import 'package:flutter_parent/utils/common_widgets/web_view/web_content_interactor.dart'; -import 'package:flutter_parent/utils/db/calendar_filter_db.dart'; -import 'package:flutter_parent/utils/db/reminder_db.dart'; -import 'package:flutter_parent/utils/db/user_colors_db.dart'; -import 'package:flutter_parent/utils/notification_util.dart'; -import 'package:flutter_parent/utils/old_app_migration.dart'; -import 'package:flutter_parent/utils/permission_handler.dart'; -import 'package:flutter_parent/utils/quick_nav.dart'; -import 'package:flutter_parent/utils/url_launcher.dart'; -import 'package:flutter_parent/utils/veneers/android_intent_veneer.dart'; -import 'package:flutter_parent/utils/veneers/barcode_scan_veneer.dart'; -import 'package:flutter_parent/utils/veneers/flutter_downloader_veneer.dart'; -import 'package:flutter_parent/utils/veneers/flutter_snackbar_veneer.dart'; -import 'package:flutter_parent/utils/veneers/path_provider_veneer.dart'; -import 'package:get_it/get_it.dart'; -import 'package:sqflite/sqflite.dart'; - -import 'common_widgets/view_attachment/fetcher/attachment_fetcher_interactor.dart'; -import 'db/db_util.dart'; - -GetIt locator = GetIt.instance; - -void setupLocator() { - // APIs - locator.registerLazySingleton(() => AccountsApi()); - locator.registerLazySingleton(() => AlertsApi()); - locator.registerLazySingleton(() => AnnouncementApi()); - locator.registerLazySingleton(() => AssignmentApi()); - locator.registerLazySingleton(() => AuthApi()); - locator.registerLazySingleton(() => CalendarEventsApi()); - locator.registerLazySingleton(() => CourseApi()); - locator.registerLazySingleton(() => EnrollmentsApi()); - locator.registerLazySingleton(() => ErrorReportApi()); - locator.registerLazySingleton(() => FileApi()); - locator.registerLazySingleton(() => HelpLinksApi()); - locator.registerLazySingleton(() => InboxApi()); - locator.registerLazySingleton(() => OAuthApi()); - locator.registerLazySingleton(() => PageApi()); - locator.registerLazySingleton(() => PlannerApi()); - locator.registerLazySingleton(() => UserApi()); - locator.registerLazySingleton(() => FeaturesApi()); - - // DB helpers - locator.registerLazySingleton(() => DbUtil.instance); - locator.registerLazySingleton(() => CalendarFilterDb()); - locator.registerLazySingleton(() => ReminderDb()); - locator.registerLazySingleton(() => UserColorsDb()); - - // Interactors - locator.registerFactory(() => AcceptableUsePolicyInteractor()); - locator.registerFactory(() => AccountCreationInteractor()); - locator.registerFactory(() => AlertsInteractor()); - locator.registerFactory(() => AlertThresholdsInteractor()); - locator.registerFactory(() => AnnouncementDetailsInteractor()); - locator.registerFactory(() => AttachmentFetcherInteractor()); - locator.registerFactory(() => AssignmentDetailsInteractor()); - locator.registerFactory(() => AttachmentPickerInteractor()); - locator.registerFactory(() => AudioVideoAttachmentViewerInteractor()); - locator.registerFactory(() => CalendarFilterListInteractor()); - locator.registerFactory(() => ConversationDetailsInteractor()); - locator.registerFactory(() => ConversationListInteractor()); - locator.registerFactory(() => ConversationReplyInteractor()); - locator.registerFactory(() => CourseDetailsInteractor()); - locator.registerFactory(() => CoursesInteractor()); - locator.registerFactory(() => CreateConversationInteractor()); - locator.registerFactory(() => CourseRoutingShellInteractor()); - locator.registerFactory(() => DashboardInteractor()); - locator.registerFactory(() => DomainSearchInteractor()); - locator.registerFactory(() => ErrorReportInteractor()); - locator.registerFactory(() => EventDetailsInteractor()); - locator.registerFactory(() => HelpScreenInteractor()); - locator.registerFactory(() => ManageStudentsInteractor()); - locator.registerFactory(() => MasqueradeScreenInteractor()); - locator.registerFactory(() => PairingInteractor()); - locator.registerFactory(() => QRLoginTutorialScreenInteractor()); - locator.registerFactory(() => RemoteConfigInteractor()); - locator.registerFactory(() => SettingsInteractor()); - locator.registerFactory(() => SplashScreenInteractor()); - locator.registerFactory(() => StudentColorPickerInteractor()); - locator.registerFactory(() => ViewAttachmentInteractor()); - locator.registerFactory(() => WebLoginInteractor()); - locator.registerFactory(() => WebContentInteractor()); - - // Veneers and mockable dependencies - locator.registerLazySingleton(() => AndroidIntentVeneer()); - locator.registerLazySingleton(() => BarcodeScanVeneer()); - locator.registerLazySingleton(() => FlutterDownloaderVeneer()); - locator.registerLazySingleton(() => FlutterSnackbarVeneer()); - locator.registerLazySingleton(() => FirebaseCrashlytics.instance); - locator.registerLazySingleton(() => PathProviderVeneer()); - locator.registerLazySingleton(() => PermissionHandler()); - locator.registerLazySingleton(() => UrlLauncher()); - - // Other - locator.registerLazySingleton(() => AlertCountNotifier()); - locator.registerLazySingleton(() => Analytics()); - locator.registerLazySingleton(() => CalendarTodayClickNotifier()); - locator.registerLazySingleton(() => InboxCountNotifier()); - locator.registerLazySingleton(() => NotificationUtil()); - locator.registerLazySingleton(() => OldAppMigration()); - locator.registerLazySingleton(() => PairingUtil()); - locator.registerLazySingleton(() => QRLoginUtil()); - locator.registerLazySingleton(() => QuickNav()); - locator.registerLazySingleton(() => StudentAddedNotifier()); - locator.registerLazySingleton(() => AlertsHelper()); -} diff --git a/apps/flutter_parent/lib/utils/snickers.dart b/apps/flutter_parent/lib/utils/snickers.dart deleted file mode 100644 index 3b606099bd..0000000000 --- a/apps/flutter_parent/lib/utils/snickers.dart +++ /dev/null @@ -1,32 +0,0 @@ -/// Copyright (C) 2019 - present Instructure, Inc. -/// -/// This program is free software: you can redistribute it and/or modify -/// it under the terms of the GNU General Public License as published by -/// the Free Software Foundation, version 3 of the License. -/// -/// This program is distributed in the hope that it will be useful, -/// but WITHOUT ANY WARRANTY; without even the implied warranty of -/// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -/// GNU General Public License for more details. -/// -/// You should have received a copy of the GNU General Public License -/// along with this program. If not, see . - -import 'package:flutter_parent/models/snicker_doodle.dart'; - -/// A list of SnickerDoodles that will show up in the right-hand drawer of the login landing page -/// -/// To edit this file and have git ignore your local changes, run this command: -/// git update-index --skip-worktree apps/flutter_parent/lib/utils/snickers.dart -/// -/// To start tracking local changes again, run this command: -/// git update-index --no-skip-worktree apps/flutter_parent/lib/utils/snickers.dart -const List SNICKERS = const [ - const SnickerDoodle( - title: "Example", - subtitle: "This does not work", - username: "user", - password: "pass", - domain: "canvas.instructure.com", - ), -]; diff --git a/apps/flutter_parent/lib/utils/style_slicer.dart b/apps/flutter_parent/lib/utils/style_slicer.dart deleted file mode 100644 index 040b41b21e..0000000000 --- a/apps/flutter_parent/lib/utils/style_slicer.dart +++ /dev/null @@ -1,151 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:flutter/gestures.dart'; -import 'package:flutter/widgets.dart'; -import 'package:tuple/tuple.dart'; - -/// Utility class for applying styles to substrings ('slices') within a body of text. -abstract class StyleSlicer { - const StyleSlicer({ - this.style, - this.recognizer, - }); - - final TextStyle? style; - final GestureRecognizer? recognizer; - - List getSlices(String src); - - /// Applies styling to the given [source] text - as specified by the provided [slicers] - and returns the result - /// as a TextSpan. - /// - /// If two or more slices overlap (i.e. multiple styles are specified for the same substring) then the intersection - /// of the slices will be treated as an independent sub-slice whose style is a merger of the styles of the overlapping - /// slices, where style properties of slicers located later in the list of [slicers] take precedence. - /// - /// Similarly, if a sub-slice would receive multiple gesture recognizers, only the [recognizer] of the slicer located - /// later in the list of [slicers] will be used. - /// - /// A base style for the entire text can be applied by specifying [baseStyle] - static TextSpan apply(String? source, List? slicers, {TextStyle? baseStyle = const TextStyle()}) { - if (source == null || source.isEmpty) return TextSpan(text: ''); - if (slicers == null || slicers.isEmpty) return TextSpan(text: source); - - // Create full-length slice for base style - slicers.insert(0, RangeSlice(0, source.length, style: baseStyle)); - - Map> opsMap = {}; - - slicers.forEach((slicer) { - slicer.getSlices(source).forEach((slice) { - opsMap.putIfAbsent(slice.item1, () => []).add(_SlicerOp(true, slicer)); - opsMap.putIfAbsent(slice.item2, () => []).add(_SlicerOp(false, slicer)); - }); - }); - - List slicePoints = opsMap.keys.toList()..sort(); - List currentSlicers = []; - List spans = []; - - for (int i = 0; i < slicePoints.length - 1; i++) { - int start = slicePoints[i]; - int end = slicePoints[i + 1]; - - opsMap[start]?.forEach((op) { - if (op.isAdd) { - currentSlicers.add(op.slicer); - } else { - currentSlicers.remove(op.slicer); - } - }); - - String slice = source.substring(start, end); - TextStyle style = _mergeStyles(currentSlicers); - var recognizer = currentSlicers.lastWhere((it) => it?.recognizer != null, orElse: () => null)?.recognizer; - - spans.add(TextSpan(text: slice, style: style, recognizer: recognizer)); - } - if (spans.length == 1) return spans[0]; - return TextSpan(children: spans); - } - - static TextStyle _mergeStyles(List currentSlicers) { - TextStyle style = TextStyle(); - currentSlicers.forEach((it) => style = style.merge(it?.style)); - return style; - } -} - -/// Represents an operation to add or remove a slicer from the list of currently-applied slicers -class _SlicerOp { - final bool isAdd; - final StyleSlicer slicer; - _SlicerOp(this.isAdd, this.slicer); -} - -/// Provides a single slice for the range starting at [start] and ending at [end]. -class RangeSlice extends StyleSlicer { - final Tuple2 range; - - RangeSlice( - int start, - int end, { - TextStyle? style, - GestureRecognizer? recognizer, - }) : range = Tuple2(start, end), - super(style: style, recognizer: recognizer); - - @override - List getSlices(String src) { - return [range]; - } -} - -/// Provides slices that match the given [pattern]. To limit the number of matches, specify a non-negative value -/// for [maxMatches]. -class PatternSlice extends StyleSlicer { - final Pattern? pattern; - final int maxMatches; - - PatternSlice( - this.pattern, { - this.maxMatches = -1, - TextStyle? style, - GestureRecognizer? recognizer, - }) : super(style: style, recognizer: recognizer); - - @override - List getSlices(String src) { - if (pattern == null || pattern == '') return []; - var matches = pattern!.allMatches(src); - if (maxMatches > -1) matches = matches.take(maxMatches); - return matches.map((it) => Tuple2(it.start, it.end)).toList(); - } -} - -/// Provides italicized slices that match instances of the specified [pronoun] wrapped in parentheses. To limit the -/// number of matches, specify a non-negative value for [maxMatches]. -class PronounSlice extends PatternSlice { - PronounSlice( - String? pronoun, { - int maxMatches = -1, - GestureRecognizer? recognizer, - }) : super( - pronoun == null || pronoun.isEmpty ? null : '($pronoun)', - maxMatches: maxMatches, - style: TextStyle(fontStyle: FontStyle.italic), - recognizer: recognizer, - ); -} diff --git a/apps/flutter_parent/lib/utils/url_launcher.dart b/apps/flutter_parent/lib/utils/url_launcher.dart deleted file mode 100644 index e9088240d0..0000000000 --- a/apps/flutter_parent/lib/utils/url_launcher.dart +++ /dev/null @@ -1,45 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:flutter/services.dart'; - -class UrlLauncher { - static const channelName = 'com.instructure.parentapp/url_launcher'; - static const launchMethod = 'launch'; - static const canLaunchMethod = 'canLaunch'; - - MethodChannel channel = MethodChannel(channelName); - - Future canLaunch(String url, {bool excludeInstructure = true}) { - return channel.invokeMethod( - canLaunchMethod, - { - 'url': url, - 'excludeInstructure': excludeInstructure, - }, - ); - } - - Future launch(String url, {bool excludeInstructure = true}) { - return channel.invokeMethod( - launchMethod, - { - 'url': url, - 'excludeInstructure': excludeInstructure, - }, - ); - } - - Future launchAppStore() => launch('https://play.google.com/store/apps/details?id=com.instructure.parentapp'); -} diff --git a/apps/flutter_parent/lib/utils/veneers/android_intent_veneer.dart b/apps/flutter_parent/lib/utils/veneers/android_intent_veneer.dart deleted file mode 100644 index 862de53210..0000000000 --- a/apps/flutter_parent/lib/utils/veneers/android_intent_veneer.dart +++ /dev/null @@ -1,56 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:android_intent_plus/android_intent.dart'; - -class AndroidIntentVeneer { - launch(AndroidIntent intent) => intent.launch(); - - launchPhone(String phoneNumber) { - final intent = AndroidIntent( - action: 'android.intent.action.DIAL', - data: Uri.parse(phoneNumber).toString()); - - launch(intent); - } - - launchEmail(String url) { - final intent = AndroidIntent( - action: 'android.intent.action.SENDTO', - data: Uri.parse(url).toString()); - - launch(intent); - } - - launchEmailWithBody(String subject, String emailBody, - {String recipientEmail = 'mobilesupport@instructure.com'}) { - final intent = AndroidIntent( - action: 'android.intent.action.SENDTO', - data: Uri( - scheme: 'mailto', - query: encodeQueryParameters( - {'subject': subject, 'body': emailBody}), - path: recipientEmail) - .toString(), - ); - - launch(intent); - } - - String encodeQueryParameters(Map params) { - return params.entries - .map((e) => '${Uri.encodeComponent(e.key)}=${Uri.encodeComponent(e.value)}') - .join('&'); - } -} diff --git a/apps/flutter_parent/lib/utils/veneers/barcode_scan_veneer.dart b/apps/flutter_parent/lib/utils/veneers/barcode_scan_veneer.dart deleted file mode 100644 index 3552765c21..0000000000 --- a/apps/flutter_parent/lib/utils/veneers/barcode_scan_veneer.dart +++ /dev/null @@ -1,27 +0,0 @@ -/* - * Copyright (C) 2020 - present Instructure, Inc. - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, version 3 of the License. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -import 'package:barcode_scan2/barcode_scan2.dart'; - -class BarcodeScanVeneer { - Future scanBarcode() { - return BarcodeScanner.scan(); - } - - Future getNumberOfCameras() { - return BarcodeScanner.numberOfCameras; - } -} diff --git a/apps/flutter_parent/lib/utils/veneers/flutter_downloader_veneer.dart b/apps/flutter_parent/lib/utils/veneers/flutter_downloader_veneer.dart deleted file mode 100644 index 6e0e191b3e..0000000000 --- a/apps/flutter_parent/lib/utils/veneers/flutter_downloader_veneer.dart +++ /dev/null @@ -1,65 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:flutter/widgets.dart'; -import 'package:flutter_downloader/flutter_downloader.dart'; - -class FlutterDownloaderVeneer { - Future enqueue({ - required String url, - required String savedDir, - String? fileName, - bool showNotification = true, - bool openFileFromNotification = true, - bool requiresStorageNotLow = true, - bool saveInPublicStorage = true}) => - FlutterDownloader.enqueue( - url: url, - savedDir: savedDir, - fileName: fileName, - showNotification: showNotification, - openFileFromNotification: openFileFromNotification, - requiresStorageNotLow: requiresStorageNotLow, - saveInPublicStorage: saveInPublicStorage); - - Future?> loadTasks() => FlutterDownloader.loadTasks(); - - static Future?> loadTasksWithRawQuery({required String query}) => - FlutterDownloader.loadTasksWithRawQuery(query: query); - - static Future cancel({required String taskId}) => FlutterDownloader.cancel(taskId: taskId); - - static Future cancelAll() => FlutterDownloader.cancelAll(); - - static Future pause({required String taskId}) => FlutterDownloader.pause(taskId: taskId); - - static Future resume({ - required String taskId, - bool requiresStorageNotLow = true, - }) => - FlutterDownloader.resume(taskId: taskId, requiresStorageNotLow: requiresStorageNotLow); - - static Future retry({ - required String taskId, - bool requiresStorageNotLow = true, - }) => - FlutterDownloader.retry(taskId: taskId, requiresStorageNotLow: requiresStorageNotLow); - - static Future remove({required String taskId, bool shouldDeleteContent = false}) => - FlutterDownloader.remove(taskId: taskId, shouldDeleteContent: shouldDeleteContent); - - static Future open({required String taskId}) => FlutterDownloader.open(taskId: taskId); - - static registerCallback(DownloadCallback callback) => FlutterDownloader.registerCallback(callback); -} diff --git a/apps/flutter_parent/lib/utils/veneers/flutter_snackbar_veneer.dart b/apps/flutter_parent/lib/utils/veneers/flutter_snackbar_veneer.dart deleted file mode 100644 index de4bc4e48b..0000000000 --- a/apps/flutter_parent/lib/utils/veneers/flutter_snackbar_veneer.dart +++ /dev/null @@ -1,24 +0,0 @@ -/* - * Copyright (C) 2020 - present Instructure, Inc. - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, version 3 of the License. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ -import 'package:flutter/material.dart'; - -class FlutterSnackbarVeneer { - showSnackBar(context, String message) { - ScaffoldMessenger.of(context).showSnackBar(SnackBar( - content: Text(message), - )); - } -} diff --git a/apps/flutter_parent/lib/utils/veneers/path_provider_veneer.dart b/apps/flutter_parent/lib/utils/veneers/path_provider_veneer.dart deleted file mode 100644 index d70e6f860f..0000000000 --- a/apps/flutter_parent/lib/utils/veneers/path_provider_veneer.dart +++ /dev/null @@ -1,36 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'dart:io'; - -import 'package:path_provider/path_provider.dart' as PathProvider; - -/// Wrapper around path_provider for ease of mocking in tests -class PathProviderVeneer { - Future getTemporaryDirectory() => PathProvider.getTemporaryDirectory(); - - Future getApplicationSupportDirectory() => PathProvider.getApplicationSupportDirectory(); - - Future getLibraryDirectory() => PathProvider.getLibraryDirectory(); - - Future getApplicationDocumentsDirectory() => PathProvider.getApplicationDocumentsDirectory(); - - Future getExternalStorageDirectory() => PathProvider.getExternalStorageDirectory(); - - Future?> getExternalCacheDirectories() => PathProvider.getExternalCacheDirectories(); - - Future?> getExternalStorageDirectories({PathProvider.StorageDirectory? type}) { - return PathProvider.getExternalStorageDirectories(type: type); - } -} diff --git a/apps/flutter_parent/lib/utils/web_view_utils.dart b/apps/flutter_parent/lib/utils/web_view_utils.dart deleted file mode 100644 index ff55e34412..0000000000 --- a/apps/flutter_parent/lib/utils/web_view_utils.dart +++ /dev/null @@ -1,103 +0,0 @@ -/* - * Copyright (C) 2020 - present Instructure, Inc. - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, version 3 of the License. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -import 'dart:convert'; - -import 'package:flutter/gestures.dart'; -import 'package:flutter/services.dart'; -import 'package:webview_flutter/webview_flutter.dart'; - -extension WebViewUtils on WebViewController { - /** - * Formats html/rich content into a somewhat suitable form for mobile. - * - * See html_wrapper.html for more details - */ - Future loadHtml( - String? html, { - String? baseUrl, - Map? headers, - double horizontalPadding = 0, - bool darkMode = false}) - async { - String fileText = await rootBundle.loadString('assets/html/html_wrapper.html'); - html = _applyWorkAroundForDoubleSlashesAsUrlSource(html); - html = _addProtocolToLinks(html); - html = _checkForMathTags(html); - html = fileText.replaceAll('{CANVAS_CONTENT}', html); - html = html.replaceAll('{BACKGROUND}', darkMode ? '#000000' : '#ffffff'); - html = html.replaceAll('{COLOR}', darkMode ? '#ffffff' : '#000000'); - html = html.replaceAll('{LINK_COLOR}', darkMode ? '#1283C4' : '#0374B5'); - html = html.replaceAll('{VISITED_LINK_COLOR}', darkMode ? '#C74BAF' : '#BF32A4'); - html = html.replaceAll('{PADDING}', horizontalPadding.toString()); - this.loadHtmlString(html, baseUrl: baseUrl); - } - - /** - * Loads html content w/o any change to formatting - */ - Future loadRawHtml(String html, Map headers) async { - String uri = Uri.dataFromString(html, mimeType: 'text/html', encoding: Encoding.getByName('utf-8')).toString(); - this.loadUrl(uri); - } -} - -String _checkForMathTags(String html) { - if ((RegExp('\$\$.+\$\$|\\\(.+\\\)').hasMatch(html) || html.contains(' - $html"""; - } else { - return html; - } -} - -String _applyWorkAroundForDoubleSlashesAsUrlSource(String? html) { - if (html == null || html.isEmpty) return ''; - // Fix for embedded videos that have // instead of http:// - html = html.replaceAll('href="//', 'href="https://'); - html = html.replaceAll('href=\'//', 'href=\'https://'); - html = html.replaceAll('src="//', 'src="https://'); - html = html.replaceAll('src=\'//', 'src=\'https://'); - return html; -} - -String _addProtocolToLinks(String html) { - if (html.isEmpty) return ''; - - html = html.replaceAll('href="www.', 'href="https://www.'); - html = html.replaceAll('href=\'www.', 'href=\'https://www.'); - html = html.replaceAll('src="www.', 'src="https://www.'); - html = html.replaceAll('src=\'www.', 'src=\'https://www.'); - return html; -} - -/// -/// Due to the Gesture Arena currently favoring basically but the WebView, -/// this will tell the arena to respect vertical swipe gestures on the WebView -/// so it can scroll -/// Code taken from: https://github.com/flutter/flutter/issues/35394 -/// Fallback to handling accepting pointers with this stack overflow post if problems arise again -/// https://stackoverflow.com/questions/57069716/scrolling-priority-when-combining-horizontal-scrolling-with-webview/57150906#57150906 -/// Related issues: -/// https://github.com/flutter/flutter/issues/36304 -/// https://github.com/flutter/flutter/issues/35394 -class WebViewGestureRecognizer extends VerticalDragGestureRecognizer { - WebViewGestureRecognizer(); - - @override - get onUpdate => (_) {}; -} diff --git a/apps/flutter_parent/plugins/encrypted_shared_preferences/LICENSE b/apps/flutter_parent/plugins/encrypted_shared_preferences/LICENSE deleted file mode 100644 index 000b4618d2..0000000000 --- a/apps/flutter_parent/plugins/encrypted_shared_preferences/LICENSE +++ /dev/null @@ -1,27 +0,0 @@ -// Copyright 2017 The Chromium Authors. All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. \ No newline at end of file diff --git a/apps/flutter_parent/plugins/encrypted_shared_preferences/README.md b/apps/flutter_parent/plugins/encrypted_shared_preferences/README.md deleted file mode 100644 index 2c7bdc86df..0000000000 --- a/apps/flutter_parent/plugins/encrypted_shared_preferences/README.md +++ /dev/null @@ -1,70 +0,0 @@ -# Encrypted Shared preferences plugin - -Wraps EncryptedSharedPreferences (on Android) no iOS support, providing -a persistent store for simple data. Data is persisted to disk asynchronously. -Neither platform can guarantee that writes will be persisted to disk after -returning and this plugin must not be used for storing critical data. - -## Usage -To use this plugin, add `encrypted_shared_preferences` as a [dependency in your pubspec.yaml file] - -### Example - -``` dart -import 'package:flutter/material.dart'; -import 'package:encrypted_shared_preferences/encrypted_shared_preferences.dart'; - -void main() { - runApp(MaterialApp( - home: Scaffold( - body: Center( - child: RaisedButton( - onPressed: _incrementCounter, - child: Text('Increment Counter'), - ), - ), - ), - )); -} - -_incrementCounter() async { - EncryptedSharedPreferences prefs = await EncryptedSharedPreferences.getInstance(); - int counter = (prefs.getInt('counter') ?? 0) + 1; - print('Pressed $counter times.'); - await prefs.setInt('counter', counter); -} -``` - -### Testing - -You can populate `EncryptedSharedPreferences` with initial values in your tests by running this code: - -```dart -EncryptedSharedPreferences.setMockInitialValues (Map values); -``` - -# encrypted_shared_preferences_platform_interface - -A common platform interface for the [`encrypted_shared_preferences`][1] plugin. - -This interface allows platform-specific implementations of the `encrypted_shared_preferences` -plugin, as well as the plugin itself, to ensure they are supporting the -same interface. - -# Usage - -To implement a new platform-specific implementation of `encrypted_shared_preferences`, extend -[`EncryptedSharedPreferencesPlatform`][2] with an implementation that performs the -platform-specific behavior, and when you register your plugin, set the default -`EncryptedSharedPreferencesLoader` by calling the `EncryptedSharedPreferencesPlatform.loader` setter. - -# Note on breaking changes - -Strongly prefer non-breaking changes (such as adding a method to the interface) -over breaking changes for this package. - -See https://flutter.dev/go/platform-interface-breaking-changes for a discussion -on why a less-clean interface is preferable to a breaking change. - -[1]: ../encrypted_shared_preferences -[2]: lib/encrypted_shared_preferences_platform_interface.dart diff --git a/apps/flutter_parent/plugins/encrypted_shared_preferences/android/build.gradle b/apps/flutter_parent/plugins/encrypted_shared_preferences/android/build.gradle deleted file mode 100644 index 0551809ceb..0000000000 --- a/apps/flutter_parent/plugins/encrypted_shared_preferences/android/build.gradle +++ /dev/null @@ -1,48 +0,0 @@ -group 'com.instructure.parentapp.encryptedsharedpreferences' -version '1.0-SNAPSHOT' - -buildscript { - repositories { - google() - mavenCentral() - } - - dependencies { - classpath "com.android.tools.build:gradle:7.4.2" - } -} - -rootProject.allprojects { - repositories { - google() - mavenCentral() - } -} - -allprojects { - gradle.projectsEvaluated { - tasks.withType(JavaCompile) { - options.compilerArgs << "-Xlint:unchecked" << "-Xlint:deprecation" - } - } -} - -apply plugin: 'com.android.library' - -android { - compileSdkVersion 33 - - defaultConfig { - minSdkVersion 23 - testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" - } - lintOptions { - disable 'InvalidPackage' - } - - namespace 'com.instructure.parentapp.encryptedsharedpreferences' -} - -dependencies { - implementation 'androidx.security:security-crypto:1.1.0-alpha03' -} \ No newline at end of file diff --git a/apps/flutter_parent/plugins/encrypted_shared_preferences/android/gradle.properties b/apps/flutter_parent/plugins/encrypted_shared_preferences/android/gradle.properties deleted file mode 100644 index d9cf55df7c..0000000000 --- a/apps/flutter_parent/plugins/encrypted_shared_preferences/android/gradle.properties +++ /dev/null @@ -1,2 +0,0 @@ -org.gradle.jvmargs=-Xmx1536M -android.useAndroidX=true diff --git a/apps/flutter_parent/plugins/encrypted_shared_preferences/android/settings.gradle b/apps/flutter_parent/plugins/encrypted_shared_preferences/android/settings.gradle deleted file mode 100644 index 32ee61b0c5..0000000000 --- a/apps/flutter_parent/plugins/encrypted_shared_preferences/android/settings.gradle +++ /dev/null @@ -1 +0,0 @@ -rootProject.name = 'encrypted_shared_preferences' diff --git a/apps/flutter_parent/plugins/encrypted_shared_preferences/android/src/main/AndroidManifest.xml b/apps/flutter_parent/plugins/encrypted_shared_preferences/android/src/main/AndroidManifest.xml deleted file mode 100644 index 1cea85809e..0000000000 --- a/apps/flutter_parent/plugins/encrypted_shared_preferences/android/src/main/AndroidManifest.xml +++ /dev/null @@ -1,3 +0,0 @@ - - diff --git a/apps/flutter_parent/plugins/encrypted_shared_preferences/android/src/main/java/com/instructure/parentapp/encryptedsharedpreferences/EncryptedSharedPreferencesPlugin.java b/apps/flutter_parent/plugins/encrypted_shared_preferences/android/src/main/java/com/instructure/parentapp/encryptedsharedpreferences/EncryptedSharedPreferencesPlugin.java deleted file mode 100644 index 50030647b9..0000000000 --- a/apps/flutter_parent/plugins/encrypted_shared_preferences/android/src/main/java/com/instructure/parentapp/encryptedsharedpreferences/EncryptedSharedPreferencesPlugin.java +++ /dev/null @@ -1,53 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -package com.instructure.parentapp.encryptedsharedpreferences; - -import android.content.Context; -import io.flutter.embedding.engine.plugins.FlutterPlugin; -import io.flutter.plugin.common.BinaryMessenger; -import io.flutter.plugin.common.MethodChannel; -import io.flutter.plugin.common.PluginRegistry; - -/** SharedPreferencesPlugin */ -public class EncryptedSharedPreferencesPlugin implements FlutterPlugin { - private static final String CHANNEL_NAME = "com.instructure.parentapp/encrypted_shared_preferences"; - private MethodChannel channel; - - public static void registerWith(PluginRegistry.Registrar registrar) { - final EncryptedSharedPreferencesPlugin plugin = new EncryptedSharedPreferencesPlugin(); - plugin.setupChannel(registrar.messenger(), registrar.context()); - } - - @Override - public void onAttachedToEngine(FlutterPlugin.FlutterPluginBinding binding) { - setupChannel(binding.getBinaryMessenger(), binding.getApplicationContext()); - } - - @Override - public void onDetachedFromEngine(FlutterPlugin.FlutterPluginBinding binding) { - teardownChannel(); - } - - private void setupChannel(BinaryMessenger messenger, Context context) { - channel = new MethodChannel(messenger, CHANNEL_NAME); - MethodCallHandlerImpl handler = new MethodCallHandlerImpl(context); - channel.setMethodCallHandler(handler); - } - - private void teardownChannel() { - channel.setMethodCallHandler(null); - channel = null; - } -} diff --git a/apps/flutter_parent/plugins/encrypted_shared_preferences/android/src/main/java/com/instructure/parentapp/encryptedsharedpreferences/MethodCallHandlerImpl.java b/apps/flutter_parent/plugins/encrypted_shared_preferences/android/src/main/java/com/instructure/parentapp/encryptedsharedpreferences/MethodCallHandlerImpl.java deleted file mode 100644 index c77db1a769..0000000000 --- a/apps/flutter_parent/plugins/encrypted_shared_preferences/android/src/main/java/com/instructure/parentapp/encryptedsharedpreferences/MethodCallHandlerImpl.java +++ /dev/null @@ -1,232 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -package com.instructure.parentapp.encryptedsharedpreferences; - -import androidx.security.crypto.EncryptedSharedPreferences; -import androidx.security.crypto.MasterKeys; -import android.content.Context; -import android.content.SharedPreferences; -import android.os.AsyncTask; -import android.util.Base64; -import io.flutter.plugin.common.MethodCall; -import io.flutter.plugin.common.MethodChannel; -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.io.ObjectInputStream; -import java.io.ObjectOutputStream; -import java.math.BigInteger; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Set; - -/** - * Implementation of the {@link MethodChannel.MethodCallHandler} for the plugin. It is also - * responsible of managing the {@link android.content.SharedPreferences}. - */ -@SuppressWarnings("unchecked") -class MethodCallHandlerImpl implements MethodChannel.MethodCallHandler { - - private static final String SHARED_PREFERENCES_NAME = "FlutterEncryptedSharedPreferences"; - - // Fun fact: The following is a base64 encoding of the string "This is the prefix for a list." - private static final String LIST_IDENTIFIER = "VGhpcyBpcyB0aGUgcHJlZml4IGZvciBhIGxpc3Qu"; - private static final String BIG_INTEGER_PREFIX = "VGhpcyBpcyB0aGUgcHJlZml4IGZvciBCaWdJbnRlZ2Vy"; - private static final String DOUBLE_PREFIX = "VGhpcyBpcyB0aGUgcHJlZml4IGZvciBEb3VibGUu"; - - private final SharedPreferences preferences; - - /** - * Constructs a {@link MethodCallHandlerImpl} instance. Creates a {@link - * android.content.SharedPreferences} based on the {@code context}. - */ - MethodCallHandlerImpl(Context context) { - SharedPreferences prefs; - - try { - String masterKeyAlias = MasterKeys.getOrCreate(MasterKeys.AES256_GCM_SPEC); - - prefs = EncryptedSharedPreferences.create( - SHARED_PREFERENCES_NAME, - masterKeyAlias, - context, - EncryptedSharedPreferences.PrefKeyEncryptionScheme.AES256_SIV, - EncryptedSharedPreferences.PrefValueEncryptionScheme.AES256_GCM - ); - } catch (Exception e) { - e.printStackTrace(); - prefs = context.getSharedPreferences(SHARED_PREFERENCES_NAME, Context.MODE_PRIVATE); - } - - preferences = prefs; - } - - @Override - public void onMethodCall(MethodCall call, MethodChannel.Result result) { - String key = call.argument("key"); - try { - switch (call.method) { - case "setBool": - commitAsync(preferences.edit().putBoolean(key, (boolean) call.argument("value")), result); - break; - case "setDouble": - double doubleValue = ((Number) call.argument("value")).doubleValue(); - String doubleValueStr = Double.toString(doubleValue); - commitAsync(preferences.edit().putString(key, DOUBLE_PREFIX + doubleValueStr), result); - break; - case "setInt": - Number number = call.argument("value"); - if (number instanceof BigInteger) { - BigInteger integerValue = (BigInteger) number; - commitAsync( - preferences - .edit() - .putString( - key, BIG_INTEGER_PREFIX + integerValue.toString(Character.MAX_RADIX)), - result); - } else { - commitAsync(preferences.edit().putLong(key, number.longValue()), result); - } - break; - case "setString": - String value = (String) call.argument("value"); - if (value.startsWith(LIST_IDENTIFIER) || value.startsWith(BIG_INTEGER_PREFIX)) { - result.error( - "StorageError", - "This string cannot be stored as it clashes with special identifier prefixes.", - null); - return; - } - commitAsync(preferences.edit().putString(key, value), result); - break; - case "setStringList": - List list = call.argument("value"); - commitAsync( - preferences.edit().putString(key, LIST_IDENTIFIER + encodeList(list)), result); - break; - case "commit": - // We've been committing the whole time. - result.success(true); - break; - case "getAll": - result.success(getAllPrefs()); - return; - case "remove": - commitAsync(preferences.edit().remove(key), result); - break; - case "clear": - Set keySet = getAllPrefs().keySet(); - SharedPreferences.Editor clearEditor = preferences.edit(); - for (String keyToDelete : keySet) { - clearEditor.remove(keyToDelete); - } - commitAsync(clearEditor, result); - break; - default: - result.notImplemented(); - break; - } - } catch (IOException e) { - result.error("IOException encountered", call.method, e); - } - } - - private void commitAsync( - final SharedPreferences.Editor editor, final MethodChannel.Result result) { - new AsyncTask() { - @Override - protected Boolean doInBackground(Void... voids) { - return editor.commit(); - } - - @Override - protected void onPostExecute(Boolean value) { - result.success(value); - } - }.execute(); - } - - private List decodeList(String encodedList) throws IOException { - ObjectInputStream stream = null; - try { - stream = new ObjectInputStream(new ByteArrayInputStream(Base64.decode(encodedList, 0))); - return (List) stream.readObject(); - } catch (ClassNotFoundException e) { - throw new IOException(e); - } finally { - if (stream != null) { - stream.close(); - } - } - } - - private String encodeList(List list) throws IOException { - ObjectOutputStream stream = null; - try { - ByteArrayOutputStream byteStream = new ByteArrayOutputStream(); - stream = new ObjectOutputStream(byteStream); - stream.writeObject(list); - stream.flush(); - return Base64.encodeToString(byteStream.toByteArray(), 0); - } finally { - if (stream != null) { - stream.close(); - } - } - } - - // Filter preferences to only those set by the flutter app. - private Map getAllPrefs() throws IOException { - Map allPrefs = preferences.getAll(); - Map filteredPrefs = new HashMap<>(); - for (String key : allPrefs.keySet()) { - if (key.startsWith("flutter.")) { - Object value = allPrefs.get(key); - if (value instanceof String) { - String stringValue = (String) value; - if (stringValue.startsWith(LIST_IDENTIFIER)) { - value = decodeList(stringValue.substring(LIST_IDENTIFIER.length())); - } else if (stringValue.startsWith(BIG_INTEGER_PREFIX)) { - String encoded = stringValue.substring(BIG_INTEGER_PREFIX.length()); - value = new BigInteger(encoded, Character.MAX_RADIX); - } else if (stringValue.startsWith(DOUBLE_PREFIX)) { - String doubleStr = stringValue.substring(DOUBLE_PREFIX.length()); - value = Double.valueOf(doubleStr); - } - } else if (value instanceof Set) { - // This only happens for previous usage of setStringSet. The app expects a list. - List listValue = new ArrayList<>((Set) value); - // Let's migrate the value too while we are at it. - boolean success = - preferences - .edit() - .remove(key) - .putString(key, LIST_IDENTIFIER + encodeList(listValue)) - .commit(); - if (!success) { - // If we are unable to migrate the existing preferences, it means we potentially lost them. - // In this case, an error from getAllPrefs() is appropriate since it will alert the app during plugin initialization. - throw new IOException("Could not migrate set to list"); - } - value = listValue; - } - filteredPrefs.put(key, value); - } - } - return filteredPrefs; - } -} diff --git a/apps/flutter_parent/plugins/encrypted_shared_preferences/lib/encrypted_shared_preferences.dart b/apps/flutter_parent/plugins/encrypted_shared_preferences/lib/encrypted_shared_preferences.dart deleted file mode 100644 index d26adff96f..0000000000 --- a/apps/flutter_parent/plugins/encrypted_shared_preferences/lib/encrypted_shared_preferences.dart +++ /dev/null @@ -1,186 +0,0 @@ -// Copyright 2017 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -import 'dart:async'; - -import 'package:flutter/cupertino.dart'; -import 'package:meta/meta.dart'; - -import 'shared_preferences_platform_interface.dart'; - -/// Wraps EncryptedSharedPreferences (on Android), providing a persistent store for simple data. No iOS support. -/// -/// Data is persisted to disk asynchronously. -class EncryptedSharedPreferences { - EncryptedSharedPreferences._(this._preferenceCache); - - static const String _prefix = 'flutter.'; - static Completer? _completer; - - static EncryptedSharedPreferencesStorePlatform get _store => EncryptedSharedPreferencesStorePlatform.instance; - - /// Loads and parses the [EncryptedSharedPreferences] for this app from disk. - /// - /// Because this is reading from disk, it shouldn't be awaited in - /// performance-sensitive blocks. - static Future getInstance() async { - if (_completer == null) { - _completer = Completer(); - try { - final Map preferencesMap = await _getSharedPreferencesMap(); - _completer!.complete(EncryptedSharedPreferences._(preferencesMap)); - } on Exception catch (e) { - // If there's an error, explicitly return the future with an error. - // then set the completer to null so we can retry. - _completer!.completeError(e); - final Future sharedPrefsFuture = _completer!.future; - _completer = null; - return sharedPrefsFuture; - } - } - return _completer!.future; - } - - /// The cache that holds all preferences. - /// - /// It is instantiated to the current state of the EncryptedSharedPreferences or - /// and then kept in sync via setter methods in this class. - /// - /// It is NOT guaranteed that this cache and the device prefs will remain - /// in sync since the setter method might fail for any reason. - final Map _preferenceCache; - - /// Returns all keys in the persistent storage. - Set getKeys() => Set.from(_preferenceCache.keys); - - /// Reads a value of any type from persistent storage. - dynamic get(String key) => _preferenceCache[key]; - - /// Reads a value from persistent storage, throwing an exception if it's not a - /// bool. - bool? getBool(String key) => _preferenceCache[key] as bool?; - - /// Reads a value from persistent storage, throwing an exception if it's not - /// an int. - int? getInt(String key) => _preferenceCache[key] as int?; - - /// Reads a value from persistent storage, throwing an exception if it's not a - /// double. - double? getDouble(String key) => _preferenceCache[key] as double?; - - /// Reads a value from persistent storage, throwing an exception if it's not a - /// String. - String? getString(String key) => _preferenceCache[key] as String?; - - /// Returns true if persistent storage the contains the given [key]. - bool containsKey(String key) => _preferenceCache.containsKey(key); - - /// Reads a set of string values from persistent storage, throwing an - /// exception if it's not a string set. - List getStringList(String key) { - dynamic list = _preferenceCache[key]; - List? castedList; - try { - castedList = (list as List).map((e) => e as String).toList(); - } catch (e) { - castedList = []; - } - // Make a copy of the list so that later mutations won't propagate - return castedList; - } - - /// Saves a boolean [value] to persistent storage in the background. - /// - /// If [value] is null, this is equivalent to calling [remove()] on the [key]. - Future setBool(String key, bool? value) => _setValue('Bool', key, value); - - /// Saves an integer [value] to persistent storage in the background. - /// - /// If [value] is null, this is equivalent to calling [remove()] on the [key]. - Future setInt(String key, int? value) => _setValue('Int', key, value); - - /// Saves a double [value] to persistent storage in the background. - /// - /// Android doesn't support storing doubles, so it will be stored as a float. - /// - /// If [value] is null, this is equivalent to calling [remove()] on the [key]. - Future setDouble(String key, double? value) => _setValue('Double', key, value); - - /// Saves a string [value] to persistent storage in the background. - /// - /// If [value] is null, this is equivalent to calling [remove()] on the [key]. - Future setString(String key, String? value) => _setValue('String', key, value); - - /// Saves a list of strings [value] to persistent storage in the background. - /// - /// If [value] is null, this is equivalent to calling [remove()] on the [key]. - Future setStringList(String key, List? value) => _setValue('StringList', key, value); - - /// Removes an entry from persistent storage. - Future remove(String key) => _setValue(null, key, null); - - Future _setValue(String? valueType, String key, Object? value) { - final String prefixedKey = '$_prefix$key'; - if (value == null) { - _preferenceCache.remove(key); - return _store.remove(prefixedKey); - } else { - if (value is List) { - // Make a copy of the list so that later mutations won't propagate - _preferenceCache[key] = [...value.toList()]; - } else { - _preferenceCache[key] = value; - } - return _store.setValue(valueType!, prefixedKey, value); - } - } - - /// Always returns true. - /// On iOS, synchronize is marked deprecated. On Android, we commit every set. - @deprecated - Future commit() async => true; - - /// Completes with true once the user preferences for the app has been cleared. - Future clear() async { - _preferenceCache.clear(); - return _store.clear(); - } - - /// Fetches the latest values from the host platform. - /// - /// Use this method to observe modifications that were made in native code - /// (without using the plugin) while the app is running. - Future reload() async { - final Map preferences = await EncryptedSharedPreferences._getSharedPreferencesMap(); - _preferenceCache.clear(); - _preferenceCache.addAll(preferences); - } - - static Future> _getSharedPreferencesMap() async { - final Map fromSystem = await _store.getAll(); - // Strip the flutter. prefix from the returned preferences. - final Map preferencesMap = {}; - for (String key in fromSystem.keys) { - assert(key.startsWith(_prefix)); - preferencesMap[key.substring(_prefix.length)] = fromSystem[key]!; - } - return preferencesMap; - } - - /// Initializes the shared preferences with mock values for testing. - /// - /// If the singleton instance has been initialized already, it is nullified. - @visibleForTesting - static void setMockInitialValues(Map values) { - final Map newValues = values.map((String key, Object value) { - String newKey = key; - if (!key.startsWith(_prefix)) { - newKey = '$_prefix$key'; - } - return MapEntry(newKey, value); - }); - EncryptedSharedPreferencesStorePlatform.instance = InMemoryEncryptedSharedPreferencesStore.withData(newValues); - _completer = null; - } -} diff --git a/apps/flutter_parent/plugins/encrypted_shared_preferences/lib/method_channel_shared_preferences.dart b/apps/flutter_parent/plugins/encrypted_shared_preferences/lib/method_channel_shared_preferences.dart deleted file mode 100644 index 7564190358..0000000000 --- a/apps/flutter_parent/plugins/encrypted_shared_preferences/lib/method_channel_shared_preferences.dart +++ /dev/null @@ -1,57 +0,0 @@ -// Copyright 2017 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -import 'dart:async'; - -import 'package:flutter/services.dart'; - -import 'shared_preferences_platform_interface.dart'; - -const MethodChannel _kChannel = MethodChannel('com.instructure.parentapp/encrypted_shared_preferences'); - -/// Wraps SharedPreferences (on Android), providing a secure, persistent store for simple data. No iOS support -/// -/// Data is persisted to disk asynchronously. -class MethodChannelEncryptedSharedPreferencesStore extends EncryptedSharedPreferencesStorePlatform { - @override - Future remove(String key) { - return _invokeBoolMethod('remove', { - 'key': key, - }); - } - - @override - Future setValue(String valueType, String key, Object value) { - return _invokeBoolMethod('set$valueType', { - 'key': key, - 'value': value, - }); - } - - Future _invokeBoolMethod(String method, Map params) { - return _kChannel - .invokeMethod(method, params) - // TODO(yjbanov): I copied this from the original - // shared_preferences.dart implementation, but I - // actually do not know why it's necessary to pipe the - // result through an identity function. - // - // Source: https://github.com/flutter/plugins/blob/3a87296a40a2624d200917d58f036baa9fb18df8/packages/shared_preferences/lib/shared_preferences.dart#L134 - .then((dynamic result) => result); - } - - @override - Future clear() async { - bool? result = await _kChannel.invokeMethod('clear'); - if (result == null) return false; - return result; - } - - @override - Future> getAll() async { - Map? results = await _kChannel.invokeMapMethod('getAll'); - if (results == null) return {}; - return results; - } -} diff --git a/apps/flutter_parent/plugins/encrypted_shared_preferences/lib/shared_preferences_platform_interface.dart b/apps/flutter_parent/plugins/encrypted_shared_preferences/lib/shared_preferences_platform_interface.dart deleted file mode 100644 index 25d757971f..0000000000 --- a/apps/flutter_parent/plugins/encrypted_shared_preferences/lib/shared_preferences_platform_interface.dart +++ /dev/null @@ -1,110 +0,0 @@ -// Copyright 2017 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -import 'dart:async'; - -import 'package:meta/meta.dart'; - -import 'method_channel_shared_preferences.dart'; - -/// The interface that implementations of encrypted_shared_preferences must implement. -/// -/// Platform implementations should extend this class rather than implement it as `encrypted_shared_preferences` -/// does not consider newly added methods to be breaking changes. Extending this class -/// (using `extends`) ensures that the subclass will get the default implementation, while -/// platform implementations that `implements` this interface will be broken by newly added -/// [EncryptedSharedPreferencesStorePlatform] methods. -abstract class EncryptedSharedPreferencesStorePlatform { - /// The default instance of [EncryptedSharedPreferencesStorePlatform] to use. - /// - /// Defaults to [MethodChannelEncryptedSharedPreferencesStore]. - static EncryptedSharedPreferencesStorePlatform get instance => _instance; - - /// Platform-specific plugins should set this with their own platform-specific - /// class that extends [EncryptedSharedPreferencesStorePlatform] when they register themselves. - static set instance(EncryptedSharedPreferencesStorePlatform value) { - if (!value.isMock) { - try { - value._verifyProvidesDefaultImplementations(); - } on NoSuchMethodError catch (_) { - throw AssertionError('Platform interfaces must not be implemented with `implements`'); - } - } - _instance = value; - } - - static EncryptedSharedPreferencesStorePlatform _instance = MethodChannelEncryptedSharedPreferencesStore(); - - /// Only mock implementations should set this to true. - /// - /// Mockito mocks are implementing this class with `implements` which is forbidden for anything - /// other than mocks (see class docs). This property provides a backdoor for mockito mocks to - /// skip the verification that the class isn't implemented with `implements`. - @visibleForTesting - bool get isMock => false; - - /// Removes the value associated with the [key]. - Future remove(String key); - - /// Stores the [value] associated with the [key]. - /// - /// The [valueType] must match the type of [value] as follows: - /// - /// * Value type "Bool" must be passed if the value is of type `bool`. - /// * Value type "Double" must be passed if the value is of type `double`. - /// * Value type "Int" must be passed if the value is of type `int`. - /// * Value type "String" must be passed if the value is of type `String`. - /// * Value type "StringList" must be passed if the value is of type `List`. - Future setValue(String valueType, String key, Object value); - - /// Removes all keys and values in the store. - Future clear(); - - /// Returns all key/value pairs persisted in this store. - Future> getAll(); - - // This method makes sure that SharedPreferencesStorePlatform isn't implemented with `implements`. - // - // See class doc for more details on why implementing this class is forbidden. - // - // This private method is called by the instance setter, which fails if the class is - // implemented with `implements`. - void _verifyProvidesDefaultImplementations() {} -} - -/// Stores data in memory. -/// -/// Data does not persist across application restarts. This is useful in unit-tests. -class InMemoryEncryptedSharedPreferencesStore extends EncryptedSharedPreferencesStorePlatform { - /// Instantiates an empty in-memory preferences store. - InMemoryEncryptedSharedPreferencesStore.empty() : _data = {}; - - /// Instantiates an in-memory preferences store containing a copy of [data]. - InMemoryEncryptedSharedPreferencesStore.withData(Map data) : _data = Map.from(data); - - final Map _data; - - @override - Future clear() async { - _data.clear(); - return true; - } - - @override - Future> getAll() async { - return Map.from(_data); - } - - @override - Future remove(String key) async { - _data.remove(key); - return true; - } - - @override - Future setValue(String valueType, String key, Object value) async { - _data[key] = value; - return true; - } -} diff --git a/apps/flutter_parent/plugins/encrypted_shared_preferences/pubspec.lock b/apps/flutter_parent/plugins/encrypted_shared_preferences/pubspec.lock deleted file mode 100644 index 8ab0940bf0..0000000000 --- a/apps/flutter_parent/plugins/encrypted_shared_preferences/pubspec.lock +++ /dev/null @@ -1,437 +0,0 @@ -# Generated by pub -# See https://dart.dev/tools/pub/glossary#lockfile -packages: - _fe_analyzer_shared: - dependency: transitive - description: - name: _fe_analyzer_shared - url: "https://pub.dartlang.org" - source: hosted - version: "30.0.0" - analyzer: - dependency: transitive - description: - name: analyzer - url: "https://pub.dartlang.org" - source: hosted - version: "2.7.0" - archive: - dependency: transitive - description: - name: archive - url: "https://pub.dartlang.org" - source: hosted - version: "3.1.2" - args: - dependency: transitive - description: - name: args - url: "https://pub.dartlang.org" - source: hosted - version: "2.3.0" - async: - dependency: transitive - description: - name: async - url: "https://pub.dartlang.org" - source: hosted - version: "2.8.1" - boolean_selector: - dependency: transitive - description: - name: boolean_selector - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - characters: - dependency: transitive - description: - name: characters - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - charcode: - dependency: transitive - description: - name: charcode - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.1" - cli_util: - dependency: transitive - description: - name: cli_util - url: "https://pub.dartlang.org" - source: hosted - version: "0.3.5" - clock: - dependency: transitive - description: - name: clock - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - collection: - dependency: transitive - description: - name: collection - url: "https://pub.dartlang.org" - source: hosted - version: "1.15.0" - convert: - dependency: transitive - description: - name: convert - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.1" - coverage: - dependency: transitive - description: - name: coverage - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.3" - crypto: - dependency: transitive - description: - name: crypto - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.1" - e2e: - dependency: "direct dev" - description: - name: e2e - url: "https://pub.dartlang.org" - source: hosted - version: "0.2.4+4" - fake_async: - dependency: transitive - description: - name: fake_async - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - file: - dependency: transitive - description: - name: file - url: "https://pub.dartlang.org" - source: hosted - version: "6.1.2" - flutter: - dependency: "direct main" - description: flutter - source: sdk - version: "0.0.0" - flutter_driver: - dependency: "direct dev" - description: flutter - source: sdk - version: "0.0.0" - flutter_test: - dependency: "direct dev" - description: flutter - source: sdk - version: "0.0.0" - frontend_server_client: - dependency: transitive - description: - name: frontend_server_client - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.2" - fuchsia_remote_debug_protocol: - dependency: transitive - description: flutter - source: sdk - version: "0.0.0" - glob: - dependency: transitive - description: - name: glob - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.2" - http_multi_server: - dependency: transitive - description: - name: http_multi_server - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.1" - http_parser: - dependency: transitive - description: - name: http_parser - url: "https://pub.dartlang.org" - source: hosted - version: "4.0.0" - io: - dependency: transitive - description: - name: io - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.3" - js: - dependency: transitive - description: - name: js - url: "https://pub.dartlang.org" - source: hosted - version: "0.6.3" - logging: - dependency: transitive - description: - name: logging - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.2" - matcher: - dependency: transitive - description: - name: matcher - url: "https://pub.dartlang.org" - source: hosted - version: "0.12.10" - meta: - dependency: "direct main" - description: - name: meta - url: "https://pub.dartlang.org" - source: hosted - version: "1.7.0" - mime: - dependency: transitive - description: - name: mime - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - node_preamble: - dependency: transitive - description: - name: node_preamble - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.1" - package_config: - dependency: transitive - description: - name: package_config - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.2" - path: - dependency: transitive - description: - name: path - url: "https://pub.dartlang.org" - source: hosted - version: "1.8.0" - pedantic: - dependency: "direct dev" - description: - name: pedantic - url: "https://pub.dartlang.org" - source: hosted - version: "1.11.1" - platform: - dependency: transitive - description: - name: platform - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.0" - pool: - dependency: transitive - description: - name: pool - url: "https://pub.dartlang.org" - source: hosted - version: "1.5.0" - process: - dependency: transitive - description: - name: process - url: "https://pub.dartlang.org" - source: hosted - version: "4.2.3" - pub_semver: - dependency: transitive - description: - name: pub_semver - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - shelf: - dependency: transitive - description: - name: shelf - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - shelf_packages_handler: - dependency: transitive - description: - name: shelf_packages_handler - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.0" - shelf_static: - dependency: transitive - description: - name: shelf_static - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - shelf_web_socket: - dependency: transitive - description: - name: shelf_web_socket - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - sky_engine: - dependency: transitive - description: flutter - source: sdk - version: "0.0.99" - source_map_stack_trace: - dependency: transitive - description: - name: source_map_stack_trace - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - source_maps: - dependency: transitive - description: - name: source_maps - url: "https://pub.dartlang.org" - source: hosted - version: "0.10.10" - source_span: - dependency: transitive - description: - name: source_span - url: "https://pub.dartlang.org" - source: hosted - version: "1.8.1" - stack_trace: - dependency: transitive - description: - name: stack_trace - url: "https://pub.dartlang.org" - source: hosted - version: "1.10.0" - stream_channel: - dependency: transitive - description: - name: stream_channel - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - string_scanner: - dependency: transitive - description: - name: string_scanner - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - sync_http: - dependency: transitive - description: - name: sync_http - url: "https://pub.dartlang.org" - source: hosted - version: "0.3.0" - term_glyph: - dependency: transitive - description: - name: term_glyph - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - test: - dependency: "direct dev" - description: - name: test - url: "https://pub.dartlang.org" - source: hosted - version: "1.17.10" - test_api: - dependency: transitive - description: - name: test_api - url: "https://pub.dartlang.org" - source: hosted - version: "0.4.2" - test_core: - dependency: transitive - description: - name: test_core - url: "https://pub.dartlang.org" - source: hosted - version: "0.4.0" - typed_data: - dependency: transitive - description: - name: typed_data - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.0" - vector_math: - dependency: transitive - description: - name: vector_math - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - vm_service: - dependency: transitive - description: - name: vm_service - url: "https://pub.dartlang.org" - source: hosted - version: "7.1.1" - watcher: - dependency: transitive - description: - name: watcher - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - web_socket_channel: - dependency: transitive - description: - name: web_socket_channel - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - webdriver: - dependency: transitive - description: - name: webdriver - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.0" - webkit_inspection_protocol: - dependency: transitive - description: - name: webkit_inspection_protocol - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - yaml: - dependency: transitive - description: - name: yaml - url: "https://pub.dartlang.org" - source: hosted - version: "3.1.0" -sdks: - dart: ">=2.14.0 <3.0.0" - flutter: ">=2.5.3" diff --git a/apps/flutter_parent/plugins/encrypted_shared_preferences/pubspec.yaml b/apps/flutter_parent/plugins/encrypted_shared_preferences/pubspec.yaml deleted file mode 100644 index 17508e3735..0000000000 --- a/apps/flutter_parent/plugins/encrypted_shared_preferences/pubspec.yaml +++ /dev/null @@ -1,30 +0,0 @@ -name: encrypted_shared_preferences -description: Flutter plugin for reading and writing simple key-value pairs. - Wraps EncryptedSharedPreferences on Android with no iOS implementation. -version: 0.5.6+3 -publish_to: none - -flutter: - plugin: - platforms: - android: - package: com.instructure.parentapp.encryptedsharedpreferences - pluginClass: EncryptedSharedPreferencesPlugin - -dependencies: - meta: ^1.0.4 - flutter: - sdk: flutter - -dev_dependencies: - flutter_test: - sdk: flutter - flutter_driver: - sdk: flutter - test: any - e2e: ^0.2.0 - pedantic: ^1.8.0 - -environment: - sdk: ">=3.0.0 <3.10.6" - flutter: 3.13.2 diff --git a/apps/flutter_parent/plugins/encrypted_shared_preferences/test/method_channel_shared_preferences_test.dart b/apps/flutter_parent/plugins/encrypted_shared_preferences/test/method_channel_shared_preferences_test.dart deleted file mode 100644 index a391e63704..0000000000 --- a/apps/flutter_parent/plugins/encrypted_shared_preferences/test/method_channel_shared_preferences_test.dart +++ /dev/null @@ -1,112 +0,0 @@ -// Copyright 2017 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -import 'package:encrypted_shared_preferences/method_channel_shared_preferences.dart'; -import 'package:encrypted_shared_preferences/shared_preferences_platform_interface.dart'; -import 'package:flutter/services.dart'; -import 'package:flutter_test/flutter_test.dart'; - -void main() { - TestWidgetsFlutterBinding.ensureInitialized(); - - group(MethodChannelEncryptedSharedPreferencesStore, () { - const MethodChannel channel = MethodChannel( - 'com.instructure.parentapp/encrypted_shared_preferences', - ); - - const Map kTestValues = { - 'flutter.String': 'hello world', - 'flutter.Bool': true, - 'flutter.Int': 42, - 'flutter.Double': 3.14159, - 'flutter.StringList': ['foo', 'bar'], - }; - - InMemoryEncryptedSharedPreferencesStore? testData; - - final List log = []; - MethodChannelEncryptedSharedPreferencesStore? store; - - setUp(() async { - testData = InMemoryEncryptedSharedPreferencesStore.empty(); - - channel.setMockMethodCallHandler((MethodCall methodCall) async { - log.add(methodCall); - if (methodCall.method == 'getAll') { - return await testData?.getAll(); - } - if (methodCall.method == 'remove') { - final String key = methodCall.arguments['key']; - return await testData?.remove(key); - } - if (methodCall.method == 'clear') { - return await testData?.clear(); - } - final RegExp setterRegExp = RegExp(r'set(.*)'); - final Match? match = setterRegExp.matchAsPrefix(methodCall.method); - if (match != null && match.groupCount == 1) { - final String valueType = match.group(1) ?? ''; - final String key = methodCall.arguments['key']; - final Object value = methodCall.arguments['value']; - return await testData?.setValue(valueType, key, value); - } - fail('Unexpected method call: ${methodCall.method}'); - }); - store = MethodChannelEncryptedSharedPreferencesStore(); - log.clear(); - }); - - tearDown(() async { - await testData?.clear(); - store = null; - testData = null; - }); - - test('getAll', () async { - testData = InMemoryEncryptedSharedPreferencesStore.withData(kTestValues); - expect(await store?.getAll(), kTestValues); - expect(log.single.method, 'getAll'); - }); - - test('remove', () async { - testData = InMemoryEncryptedSharedPreferencesStore.withData(kTestValues); - expect(await store?.remove('flutter.String'), true); - expect(await store?.remove('flutter.Bool'), true); - expect(await store?.remove('flutter.Int'), true); - expect(await store?.remove('flutter.Double'), true); - expect(await testData?.getAll(), { - 'flutter.StringList': ['foo', 'bar'], - }); - - expect(log, hasLength(4)); - for (MethodCall call in log) { - expect(call.method, 'remove'); - } - }); - - test('setValue', () async { - expect(await testData?.getAll(), isEmpty); - for (String key in kTestValues.keys) { - final dynamic value = kTestValues[key]; - expect(await store?.setValue(key.split('.').last, key, value), true); - } - expect(await testData?.getAll(), kTestValues); - - expect(log, hasLength(5)); - expect(log[0].method, 'setString'); - expect(log[1].method, 'setBool'); - expect(log[2].method, 'setInt'); - expect(log[3].method, 'setDouble'); - expect(log[4].method, 'setStringList'); - }); - - test('clear', () async { - testData = InMemoryEncryptedSharedPreferencesStore.withData(kTestValues); - expect(await testData?.getAll(), isNotEmpty); - expect(await store?.clear(), true); - expect(await testData?.getAll(), isEmpty); - expect(log.single.method, 'clear'); - }); - }); -} diff --git a/apps/flutter_parent/plugins/encrypted_shared_preferences/test/shared_preferences_platform_interface_test.dart b/apps/flutter_parent/plugins/encrypted_shared_preferences/test/shared_preferences_platform_interface_test.dart deleted file mode 100644 index 5bd6533ff5..0000000000 --- a/apps/flutter_parent/plugins/encrypted_shared_preferences/test/shared_preferences_platform_interface_test.dart +++ /dev/null @@ -1,48 +0,0 @@ -// Copyright 2017 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -import 'package:encrypted_shared_preferences/shared_preferences_platform_interface.dart'; -import 'package:flutter_test/flutter_test.dart'; - -void main() { - TestWidgetsFlutterBinding.ensureInitialized(); - - group(EncryptedSharedPreferencesStorePlatform, () { - test('disallows implementing interface', () { - expect( - () { - EncryptedSharedPreferencesStorePlatform.instance = IllegalImplementation(); - }, - throwsAssertionError, - ); - }); - }); -} - -class IllegalImplementation implements EncryptedSharedPreferencesStorePlatform { - // Intentionally declare self as not a mock to trigger the - // compliance check. - @override - bool get isMock => false; - - @override - Future clear() { - throw UnimplementedError(); - } - - @override - Future> getAll() { - throw UnimplementedError(); - } - - @override - Future remove(String key) { - throw UnimplementedError(); - } - - @override - Future setValue(String valueType, String key, Object value) { - throw UnimplementedError(); - } -} diff --git a/apps/flutter_parent/plugins/encrypted_shared_preferences/test/shared_preferences_test.dart b/apps/flutter_parent/plugins/encrypted_shared_preferences/test/shared_preferences_test.dart deleted file mode 100755 index bff56b5835..0000000000 --- a/apps/flutter_parent/plugins/encrypted_shared_preferences/test/shared_preferences_test.dart +++ /dev/null @@ -1,238 +0,0 @@ -// Copyright 2017 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -import 'package:encrypted_shared_preferences/encrypted_shared_preferences.dart'; -import 'package:encrypted_shared_preferences/shared_preferences_platform_interface.dart'; -import 'package:flutter/services.dart'; -import 'package:flutter_test/flutter_test.dart'; - -void main() { - TestWidgetsFlutterBinding.ensureInitialized(); - - group('SharedPreferences', () { - const Map kTestValues = { - 'flutter.String': 'hello world', - 'flutter.bool': true, - 'flutter.int': 42, - 'flutter.double': 3.14159, - 'flutter.List': ['foo', 'bar'], - }; - - const Map kTestValues2 = { - 'flutter.String': 'goodbye world', - 'flutter.bool': false, - 'flutter.int': 1337, - 'flutter.double': 2.71828, - 'flutter.List': ['baz', 'quox'], - }; - - late FakeSharedPreferencesStore store; - late EncryptedSharedPreferences preferences; - - setUp(() async { - store = FakeSharedPreferencesStore(kTestValues); - EncryptedSharedPreferencesStorePlatform.instance = store; - preferences = await EncryptedSharedPreferences.getInstance(); - store.log.clear(); - }); - - tearDown(() async { - await preferences.clear(); - }); - - test('reading', () async { - expect(preferences.get('String'), kTestValues['flutter.String']); - expect(preferences.get('bool'), kTestValues['flutter.bool']); - expect(preferences.get('int'), kTestValues['flutter.int']); - expect(preferences.get('double'), kTestValues['flutter.double']); - expect(preferences.get('List'), kTestValues['flutter.List']); - expect(preferences.getString('String'), kTestValues['flutter.String']); - expect(preferences.getBool('bool'), kTestValues['flutter.bool']); - expect(preferences.getInt('int'), kTestValues['flutter.int']); - expect(preferences.getDouble('double'), kTestValues['flutter.double']); - expect(preferences.getStringList('List'), kTestValues['flutter.List']); - expect(store.log, []); - }); - - test('writing', () async { - await Future.wait(>[ - preferences.setString('String', kTestValues2['flutter.String'] as String), - preferences.setBool('bool', kTestValues2['flutter.bool'] as bool), - preferences.setInt('int', kTestValues2['flutter.int'] as int), - preferences.setDouble('double', kTestValues2['flutter.double'] as double), - preferences.setStringList('List', kTestValues2['flutter.List'] as List) - ]); - expect( - store.log, - [ - isMethodCall('setValue', arguments: [ - 'String', - 'flutter.String', - kTestValues2['flutter.String'], - ]), - isMethodCall('setValue', arguments: [ - 'Bool', - 'flutter.bool', - kTestValues2['flutter.bool'], - ]), - isMethodCall('setValue', arguments: [ - 'Int', - 'flutter.int', - kTestValues2['flutter.int'], - ]), - isMethodCall('setValue', arguments: [ - 'Double', - 'flutter.double', - kTestValues2['flutter.double'], - ]), - isMethodCall('setValue', arguments: [ - 'StringList', - 'flutter.List', - kTestValues2['flutter.List'], - ]), - ], - ); - store.log.clear(); - - expect(preferences.getString('String'), kTestValues2['flutter.String']); - expect(preferences.getBool('bool'), kTestValues2['flutter.bool']); - expect(preferences.getInt('int'), kTestValues2['flutter.int']); - expect(preferences.getDouble('double'), kTestValues2['flutter.double']); - expect(preferences.getStringList('List'), kTestValues2['flutter.List']); - expect(store.log, equals([])); - }); - - test('removing', () async { - const String key = 'testKey'; - await preferences.setString(key, null); - await preferences.setBool(key, null); - await preferences.setInt(key, null); - await preferences.setDouble(key, null); - await preferences.setStringList(key, null); - await preferences.remove(key); - expect( - store.log, - List.filled( - 6, - isMethodCall( - 'remove', - arguments: 'flutter.$key', - ), - growable: true, - )); - }); - - test('containsKey', () async { - const String key = 'testKey'; - - expect(false, preferences.containsKey(key)); - - await preferences.setString(key, 'test'); - expect(true, preferences.containsKey(key)); - }); - - test('clearing', () async { - await preferences.clear(); - expect(preferences.getString('String'), null); - expect(preferences.getBool('bool'), null); - expect(preferences.getInt('int'), null); - expect(preferences.getDouble('double'), null); - expect(preferences.getStringList('List'), null); - expect(store.log, [isMethodCall('clear', arguments: null)]); - }); - - test('reloading', () async { - await preferences.setString('String', kTestValues['flutter.String'] as String); - expect(preferences.getString('String'), kTestValues['flutter.String']); - - EncryptedSharedPreferences.setMockInitialValues(kTestValues2); - expect(preferences.getString('String'), kTestValues['flutter.String']); - - await preferences.reload(); - expect(preferences.getString('String'), kTestValues2['flutter.String']); - }); - - test('back to back calls should return same instance.', () async { - final Future first = EncryptedSharedPreferences.getInstance(); - final Future second = EncryptedSharedPreferences.getInstance(); - expect(await first, await second); - }); - - group('mocking', () { - const String _key = 'dummy'; - const String _prefixedKey = 'flutter.' + _key; - - test('test 1', () async { - EncryptedSharedPreferences.setMockInitialValues({_prefixedKey: 'my string'}); - final EncryptedSharedPreferences prefs = await EncryptedSharedPreferences.getInstance(); - final String? value = prefs.getString(_key); - expect(value, 'my string'); - }); - - test('test 2', () async { - EncryptedSharedPreferences.setMockInitialValues({_prefixedKey: 'my other string'}); - final EncryptedSharedPreferences prefs = await EncryptedSharedPreferences.getInstance(); - final String? value = prefs.getString(_key); - expect(value, 'my other string'); - }); - }); - - test('writing copy of strings list', () async { - final List myList = []; - await preferences.setStringList("myList", myList); - myList.add("foobar"); - - final List cachedList = preferences.getStringList('myList'); - expect(cachedList, []); - - cachedList.add("foobar2"); - - expect(preferences.getStringList('myList'), []); - }); - }); - - test('calling mock initial values with non-prefixed keys succeeds', () async { - EncryptedSharedPreferences.setMockInitialValues({ - 'test': 'foo', - }); - final EncryptedSharedPreferences prefs = await EncryptedSharedPreferences.getInstance(); - final String? value = prefs.getString('test'); - expect(value, 'foo'); - }); -} - -class FakeSharedPreferencesStore implements EncryptedSharedPreferencesStorePlatform { - FakeSharedPreferencesStore(Map data) - : backend = InMemoryEncryptedSharedPreferencesStore.withData(data); - - final InMemoryEncryptedSharedPreferencesStore backend; - final List log = []; - - @override - bool get isMock => true; - - @override - Future clear() { - log.add(MethodCall('clear')); - return backend.clear(); - } - - @override - Future> getAll() { - log.add(MethodCall('getAll')); - return backend.getAll(); - } - - @override - Future remove(String key) { - log.add(MethodCall('remove', key)); - return backend.remove(key); - } - - @override - Future setValue(String valueType, String key, Object value) { - log.add(MethodCall('setValue', [valueType, key, value])); - return backend.setValue(valueType, key, value); - } -} diff --git a/apps/flutter_parent/process_test_results.bash b/apps/flutter_parent/process_test_results.bash deleted file mode 100755 index 3810dc260e..0000000000 --- a/apps/flutter_parent/process_test_results.bash +++ /dev/null @@ -1,168 +0,0 @@ -# Script to process "flutter test --machine" output. -# Designed to: -# (1) Make failures easier to identify in the log -# (2) Emit test failure and test summary info to Splunk - -successCount=0 -failureCount=0 -failures=() -commonSplunkData="\"workflow\" : \"$BITRISE_TRIGGERED_WORKFLOW_ID\", \"app\" : \"flutter-parent\", \"branch\" : \"$BITRISE_GIT_BRANCH\"" - -echo file is $1 -while IFS= read -r line -do - - # Process a "test" entry, marking the beginning of the test - # This is where we capture file name and test name, map test id to each - # Sample line: - # {"test":{"id":1799,"name":"internal url handler launches simpleWebView for limitAccessFlag without match","suiteID":1586,"groupIDs":[1731,1786],"metadata":{"skip":false,"skipReason":null},"line":112,"column":3,"url":"package:flutter_test/src/widget_tester.dart","root_line":512,"root_column":5,"root_url":"file:///Users/jhoag/code/projects/canvas-android/apps/flutter_parent/test/router/panda_router_test.dart"},"type":"testStart","time":79561} - - if [[ $line =~ "\"test\":" ]] - then - # Parse the test id - idRegex='\"id\":([0-9]+),' - [[ $line =~ $idRegex ]] - id=${BASH_REMATCH[1]} - - # Parse the test name - nameRegex='\"name\":\"([A-Za-z0-9 -\(\)/\._]+)\",\"suiteID\"' - [[ $line =~ $nameRegex ]] - name=${BASH_REMATCH[1]} - - # Parse the file name. We'll try to grab the root_url field first, then the url field. - urlRegex='\"root_url\":\"([A-Za-z0-9 -:\(\)/\._]+)\"' - [[ $line =~ $urlRegex ]] - url=${BASH_REMATCH[1]} - if [ -z "$url" ] - then - urlRegex='\"url\":\"([A-Za-z0-9 -:\(\)/\._]+)\"' - [[ $line =~ $urlRegex ]] - url=${BASH_REMATCH[1]} - fi - - # If we've succeeded in getting a url value, parse the test file from that. - if [ -n "$url" ] - then - - file=`echo $url | rev | cut -d "/" -f 1 | rev` - - #echo id=$id, name=$name, url=$url, file=$file - nameMap[$id]=$name - fileMap[$id]=$file - - # Print out the file and test name to show some progress. - # This is optional. We can take it out if we want to shrink bitrise logs. - echo -en "\r\033[K$file - $name" - fi - - fi - - # Process a test message. - # There can be many messages in a test, but we'll assume that the final message - # for a failed test is the error message with stack trace. So we'll track the - # last message we see for each test. - if [[ $line =~ "\"messageType\":\"print\"" ]] - then - - # Grab the test id field - idRegex='\"testID\":([0-9]+),' - [[ $line =~ $idRegex ]] - id=${BASH_REMATCH[1]} - - # Grab the messsage field - messageRegex='\"message\":\"(.+)\",\"type\"' - [[ $line =~ $messageRegex ]] - message=${BASH_REMATCH[1]} - - # Record this message as the last one received for the test - messageMap[$id]=$message - fi - - - - # Process a test result, reporting failures to splunk - # Sample line: - # {"testID":1801,"result":"success","skipped":false,"hidden":false,"type":"testDone","time":79662} - if [[ $line =~ "\"result\":" ]] - then - - # Grab the test id field - idRegex='\"testID\":([0-9]+),' - [[ $line =~ $idRegex ]] - id=${BASH_REMATCH[1]} - - # Grab our test name and file from our id->name and id->file maps - name=${nameMap[$id]} - file=${fileMap[$id]} - - # Grab the result field - resultRegex='\"result\":\"([A-Za-z]+)\",' - [[ $line =~ $resultRegex ]] - result=${BASH_REMATCH[1]} - - # Grab the hidden field - hiddenRegex='\"hidden\":(true|false),' - [[ $line =~ $hiddenRegex ]] - hidden=${BASH_REMATCH[1]} - - # Skip hidden tests - if [ $hidden = "false" ] - then - # On a fail, send a message to splunk - if [ $result = "error" ] - then - failureMessage=${messageMap[$id]} - echo -e "\n\ntest FAILED: $file \"$name\"\n\n" - echo -e "\nfailureMessage: $failureMessage" - failedTest="$file - \"$name\"\n" - failures=("${failures[@]}" $failedTest) - # Emit summary payload message to Splunk if we are on bitrise - if [ -n "$SPLUNK_MOBILE_TOKEN" ] - then - # Put failureMessage last because it may overflow. - payload="{\"sourcetype\" : \"mobile-android-qa-testresult\", \"event\" : {\"buildUrl\" : \"$BITRISE_BUILD_URL\", \"status\" : \"failed\", \"testName\": \"$name\", \"testClass\" : \"$file\", $commonSplunkData, \"message\":\"$failureMessage\"}}" - #echo error payload: \"$payload\" - curl -k "https://http-inputs-inst.splunkcloud.com:443/services/collector" -H "Authorization: Splunk $SPLUNK_MOBILE_TOKEN" -d "$payload" - fi - ((failureCount=failureCount+1)) - else - ((successCount=successCount+1)) - fi - fi - - fi - - # Capture end-of-run event - # Sample line: - # {"success":false,"type":"done","time":114261} - if [[ $line =~ "\"success\":" ]] - then - # Capture success field - successRegex='\"success\":(true|false),' - [[ $line =~ $successRegex ]] - success=${BASH_REMATCH[1]} - - # Capture time field - timeRegex='\"time\":([0-9]+)' - [[ $line =~ $timeRegex ]] - msTime=${BASH_REMATCH[1]} - - ((totalCount=successCount+failureCount)) - echo -e "\n" - echo $successCount of $totalCount tests passed - echo success: $success, time: $msTime - if [ $failureCount -ne 0 ] - then - echo -e "Failed tests:\n ${failures[@]}" - fi - - # Emit summary payload message to Splunk if we are on bitrise - if [ -n "$SPLUNK_MOBILE_TOKEN" ] - then - payload="{\"numTests\" : $totalCount, \"numFailures\" : $failureCount, \"runTime\" : $msTime, $commonSplunkData}" - curl -k "https://http-inputs-inst.splunkcloud.com:443/services/collector" -H "Authorization: Splunk $SPLUNK_MOBILE_TOKEN" -d "{\"sourcetype\" : \"mobile-android-qa-summary\", \"event\" : $payload}" - fi - - fi -# Reads from either provided file or from stdin. -done < "${1:-/dev/stdin}" diff --git a/apps/flutter_parent/pubspec.lock b/apps/flutter_parent/pubspec.lock deleted file mode 100644 index f05ba9414b..0000000000 --- a/apps/flutter_parent/pubspec.lock +++ /dev/null @@ -1,1592 +0,0 @@ -# Generated by pub -# See https://dart.dev/tools/pub/glossary#lockfile -packages: - _fe_analyzer_shared: - dependency: transitive - description: - name: _fe_analyzer_shared - sha256: ae92f5d747aee634b87f89d9946000c2de774be1d6ac3e58268224348cd0101a - url: "https://pub.dev" - source: hosted - version: "61.0.0" - _flutterfire_internals: - dependency: transitive - description: - name: _flutterfire_internals - sha256: "5dce45a06d386358334eb1689108db6455d90ceb0d75848d5f4819283d4ee2b8" - url: "https://pub.dev" - source: hosted - version: "1.3.4" - analyzer: - dependency: transitive - description: - name: analyzer - sha256: ea3d8652bda62982addfd92fdc2d0214e5f82e43325104990d4f4c4a2a313562 - url: "https://pub.dev" - source: hosted - version: "5.13.0" - android_intent_plus: - dependency: "direct main" - description: - name: android_intent_plus - sha256: f72ae20bb37108694f442e7ae6acbd28b453ca62ce86842f6787b784355abfe6 - url: "https://pub.dev" - source: hosted - version: "4.0.2" - args: - dependency: transitive - description: - name: args - sha256: eef6c46b622e0494a36c5a12d10d77fb4e855501a91c1b9ef9339326e58f0596 - url: "https://pub.dev" - source: hosted - version: "2.4.2" - asn1lib: - dependency: transitive - description: - name: asn1lib - sha256: "21afe4333076c02877d14f4a89df111e658a6d466cbfc802eb705eb91bd5adfd" - url: "https://pub.dev" - source: hosted - version: "1.5.0" - async: - dependency: transitive - description: - name: async - sha256: "947bfcf187f74dbc5e146c9eb9c0f10c9f8b30743e341481c1e2ed3ecc18c20c" - url: "https://pub.dev" - source: hosted - version: "2.11.0" - barcode_scan2: - dependency: "direct main" - description: - name: barcode_scan2 - sha256: "0b0625d27841a21e36e896195d86b2aada335e3c486f63647cce701495718e16" - url: "https://pub.dev" - source: hosted - version: "4.2.4" - boolean_selector: - dependency: transitive - description: - name: boolean_selector - sha256: "6cfb5af12253eaf2b368f07bacc5a80d1301a071c73360d746b7f2e32d762c66" - url: "https://pub.dev" - source: hosted - version: "2.1.1" - build: - dependency: transitive - description: - name: build - sha256: "80184af8b6cb3e5c1c4ec6d8544d27711700bc3e6d2efad04238c7b5290889f0" - url: "https://pub.dev" - source: hosted - version: "2.4.1" - build_config: - dependency: transitive - description: - name: build_config - sha256: bf80fcfb46a29945b423bd9aad884590fb1dc69b330a4d4700cac476af1708d1 - url: "https://pub.dev" - source: hosted - version: "1.1.1" - build_daemon: - dependency: transitive - description: - name: build_daemon - sha256: "5f02d73eb2ba16483e693f80bee4f088563a820e47d1027d4cdfe62b5bb43e65" - url: "https://pub.dev" - source: hosted - version: "4.0.0" - build_resolvers: - dependency: "direct dev" - description: - name: build_resolvers - sha256: "6c4dd11d05d056e76320b828a1db0fc01ccd376922526f8e9d6c796a5adbac20" - url: "https://pub.dev" - source: hosted - version: "2.2.1" - build_runner: - dependency: "direct dev" - description: - name: build_runner - sha256: "10c6bcdbf9d049a0b666702cf1cee4ddfdc38f02a19d35ae392863b47519848b" - url: "https://pub.dev" - source: hosted - version: "2.4.6" - build_runner_core: - dependency: transitive - description: - name: build_runner_core - sha256: "6d6ee4276b1c5f34f21fdf39425202712d2be82019983d52f351c94aafbc2c41" - url: "https://pub.dev" - source: hosted - version: "7.2.10" - built_collection: - dependency: "direct main" - description: - name: built_collection - sha256: "376e3dd27b51ea877c28d525560790aee2e6fbb5f20e2f85d5081027d94e2100" - url: "https://pub.dev" - source: hosted - version: "5.1.1" - built_value: - dependency: "direct main" - description: - name: built_value - sha256: "598a2a682e2a7a90f08ba39c0aaa9374c5112340f0a2e275f61b59389543d166" - url: "https://pub.dev" - source: hosted - version: "8.6.1" - built_value_generator: - dependency: "direct dev" - description: - name: built_value_generator - sha256: "14835d3ee2a0b19ffb263c57d82a3b2a64b0090d6b9d12e3b1646c1ff82a2476" - url: "https://pub.dev" - source: hosted - version: "8.6.1" - cached_network_image: - dependency: "direct main" - description: - name: cached_network_image - sha256: fd3d0dc1d451f9a252b32d95d3f0c3c487bc41a75eba2e6097cb0b9c71491b15 - url: "https://pub.dev" - source: hosted - version: "3.2.3" - cached_network_image_platform_interface: - dependency: transitive - description: - name: cached_network_image_platform_interface - sha256: bb2b8403b4ccdc60ef5f25c70dead1f3d32d24b9d6117cfc087f496b178594a7 - url: "https://pub.dev" - source: hosted - version: "2.0.0" - cached_network_image_web: - dependency: transitive - description: - name: cached_network_image_web - sha256: b8eb814ebfcb4dea049680f8c1ffb2df399e4d03bf7a352c775e26fa06e02fa0 - url: "https://pub.dev" - source: hosted - version: "1.0.2" - characters: - dependency: transitive - description: - name: characters - sha256: "04a925763edad70e8443c99234dc3328f442e811f1d8fd1a72f1c8ad0f69a605" - url: "https://pub.dev" - source: hosted - version: "1.3.0" - checked_yaml: - dependency: transitive - description: - name: checked_yaml - sha256: feb6bed21949061731a7a75fc5d2aa727cf160b91af9a3e464c5e3a32e28b5ff - url: "https://pub.dev" - source: hosted - version: "2.0.3" - chewie: - dependency: "direct main" - description: - name: chewie - sha256: "60701da1f22ed20cd2d40e856fd1f2249dacf5b629d9fa50676443a18a4857b8" - url: "https://pub.dev" - source: hosted - version: "1.7.0" - clock: - dependency: transitive - description: - name: clock - sha256: cb6d7f03e1de671e34607e909a7213e31d7752be4fb66a86d29fe1eb14bfb5cf - url: "https://pub.dev" - source: hosted - version: "1.1.1" - code_builder: - dependency: transitive - description: - name: code_builder - sha256: "4ad01d6e56db961d29661561effde45e519939fdaeb46c351275b182eac70189" - url: "https://pub.dev" - source: hosted - version: "4.5.0" - collection: - dependency: "direct main" - description: - name: collection - sha256: f092b211a4319e98e5ff58223576de6c2803db36221657b46c82574721240687 - url: "https://pub.dev" - source: hosted - version: "1.17.2" - convert: - dependency: transitive - description: - name: convert - sha256: "0f08b14755d163f6e2134cb58222dd25ea2a2ee8a195e53983d57c075324d592" - url: "https://pub.dev" - source: hosted - version: "3.1.1" - coverage: - dependency: transitive - description: - name: coverage - sha256: "2fb815080e44a09b85e0f2ca8a820b15053982b2e714b59267719e8a9ff17097" - url: "https://pub.dev" - source: hosted - version: "1.6.3" - cross_file: - dependency: transitive - description: - name: cross_file - sha256: "0b0036e8cccbfbe0555fd83c1d31a6f30b77a96b598b35a5d36dd41f718695e9" - url: "https://pub.dev" - source: hosted - version: "0.3.3+4" - crypto: - dependency: transitive - description: - name: crypto - sha256: ff625774173754681d66daaf4a448684fb04b78f902da9cb3d308c19cc5e8bab - url: "https://pub.dev" - source: hosted - version: "3.0.3" - csslib: - dependency: transitive - description: - name: csslib - sha256: "706b5707578e0c1b4b7550f64078f0a0f19dec3f50a178ffae7006b0a9ca58fb" - url: "https://pub.dev" - source: hosted - version: "1.0.0" - cupertino_icons: - dependency: transitive - description: - name: cupertino_icons - sha256: e35129dc44c9118cee2a5603506d823bab99c68393879edb440e0090d07586be - url: "https://pub.dev" - source: hosted - version: "1.0.5" - dart_style: - dependency: transitive - description: - name: dart_style - sha256: "1efa911ca7086affd35f463ca2fc1799584fb6aa89883cf0af8e3664d6a02d55" - url: "https://pub.dev" - source: hosted - version: "2.3.2" - dbus: - dependency: transitive - description: - name: dbus - sha256: "6f07cba3f7b3448d42d015bfd3d53fe12e5b36da2423f23838efc1d5fb31a263" - url: "https://pub.dev" - source: hosted - version: "0.7.8" - device_info_plus: - dependency: "direct main" - description: - name: device_info_plus - sha256: "86add5ef97215562d2e090535b0a16f197902b10c369c558a100e74ea06e8659" - url: "https://pub.dev" - source: hosted - version: "9.0.3" - device_info_plus_platform_interface: - dependency: transitive - description: - name: device_info_plus_platform_interface - sha256: d3b01d5868b50ae571cd1dc6e502fc94d956b665756180f7b16ead09e836fd64 - url: "https://pub.dev" - source: hosted - version: "7.0.0" - dio: - dependency: "direct main" - description: - name: dio - sha256: "7d328c4d898a61efc3cd93655a0955858e29a0aa647f0f9e02d59b3bb275e2e8" - url: "https://pub.dev" - source: hosted - version: "4.0.6" - dio_http_cache_lts: - dependency: "direct main" - description: - name: dio_http_cache_lts - sha256: "331da4c8444203bd3f20db1dc8a560969524a6b6e32e9ba16dad18f992a0b2b3" - url: "https://pub.dev" - source: hosted - version: "0.4.1" - dio_smart_retry: - dependency: "direct main" - description: - name: dio_smart_retry - sha256: "7c008542f7a5c5552a0757c7cd0e8c7b3131617120ee3e48456425f673f8ff09" - url: "https://pub.dev" - source: hosted - version: "1.4.0" - email_validator: - dependency: "direct main" - description: - name: email_validator - sha256: e9a90f27ab2b915a27d7f9c2a7ddda5dd752d6942616ee83529b686fc086221b - url: "https://pub.dev" - source: hosted - version: "2.1.17" - encrypt: - dependency: "direct main" - description: - name: encrypt - sha256: "4fd4e4fdc21b9d7d4141823e1e6515cd94e7b8d84749504c232999fba25d9bbb" - url: "https://pub.dev" - source: hosted - version: "5.0.1" - encrypted_shared_preferences: - dependency: "direct main" - description: - path: "plugins/encrypted_shared_preferences" - relative: true - source: path - version: "0.5.6+3" - fake_async: - dependency: transitive - description: - name: fake_async - sha256: "511392330127add0b769b75a987850d136345d9227c6b94c96a04cf4a391bf78" - url: "https://pub.dev" - source: hosted - version: "1.3.1" - faker: - dependency: "direct main" - description: - name: faker - sha256: "746e59f91d8b06a389e74cf76e909a05ed69c12691768e2f93557fdf29200fd0" - url: "https://pub.dev" - source: hosted - version: "2.1.0" - ffi: - dependency: transitive - description: - name: ffi - sha256: "7bf0adc28a23d395f19f3f1eb21dd7cfd1dd9f8e1c50051c069122e6853bc878" - url: "https://pub.dev" - source: hosted - version: "2.1.0" - file: - dependency: transitive - description: - name: file - sha256: "1b92bec4fc2a72f59a8e15af5f52cd441e4a7860b49499d69dfa817af20e925d" - url: "https://pub.dev" - source: hosted - version: "6.1.4" - file_picker: - dependency: "direct main" - description: - name: file_picker - sha256: "21145c9c268d54b1f771d8380c195d2d6f655e0567dc1ca2f9c134c02c819e0a" - url: "https://pub.dev" - source: hosted - version: "5.3.3" - file_selector_linux: - dependency: transitive - description: - name: file_selector_linux - sha256: "770eb1ab057b5ae4326d1c24cc57710758b9a46026349d021d6311bd27580046" - url: "https://pub.dev" - source: hosted - version: "0.9.2" - file_selector_macos: - dependency: transitive - description: - name: file_selector_macos - sha256: "4ada532862917bf16e3adb3891fe3a5917a58bae03293e497082203a80909412" - url: "https://pub.dev" - source: hosted - version: "0.9.3+1" - file_selector_platform_interface: - dependency: transitive - description: - name: file_selector_platform_interface - sha256: "412705a646a0ae90f33f37acfae6a0f7cbc02222d6cd34e479421c3e74d3853c" - url: "https://pub.dev" - source: hosted - version: "2.6.0" - file_selector_windows: - dependency: transitive - description: - name: file_selector_windows - sha256: "1372760c6b389842b77156203308940558a2817360154084368608413835fc26" - url: "https://pub.dev" - source: hosted - version: "0.9.3" - firebase_core: - dependency: "direct main" - description: - name: firebase_core - sha256: "2e9324f719e90200dc7d3c4f5d2abc26052f9f2b995d3b6626c47a0dfe1c8192" - url: "https://pub.dev" - source: hosted - version: "2.15.0" - firebase_core_platform_interface: - dependency: transitive - description: - name: firebase_core_platform_interface - sha256: b63e3be6c96ef5c33bdec1aab23c91eb00696f6452f0519401d640938c94cba2 - url: "https://pub.dev" - source: hosted - version: "4.8.0" - firebase_core_web: - dependency: transitive - description: - name: firebase_core_web - sha256: "0fd5c4b228de29b55fac38aed0d9e42514b3d3bd47675de52bf7f8fccaf922fa" - url: "https://pub.dev" - source: hosted - version: "2.6.0" - firebase_crashlytics: - dependency: "direct main" - description: - name: firebase_crashlytics - sha256: "3607b46342537f98df18b130b6f5ab25cee6981a3a782e1a7b121d04dfea3caa" - url: "https://pub.dev" - source: hosted - version: "3.3.4" - firebase_crashlytics_platform_interface: - dependency: transitive - description: - name: firebase_crashlytics_platform_interface - sha256: c63abeb87b18f6e6d4bf6bb3977f15d2d9281a049d93fe098e83e56dcbf7da06 - url: "https://pub.dev" - source: hosted - version: "3.6.4" - firebase_remote_config: - dependency: "direct main" - description: - name: firebase_remote_config - sha256: "2883fad38d9536487f649c558c9e902a8ae36676990e9000bc8bd72f914ac9dd" - url: "https://pub.dev" - source: hosted - version: "4.2.4" - firebase_remote_config_platform_interface: - dependency: transitive - description: - name: firebase_remote_config_platform_interface - sha256: "250384e15b4a732d9cca97b8b9ed5a29767f5c77d6301fc653d6bbe8b26b9487" - url: "https://pub.dev" - source: hosted - version: "1.4.4" - firebase_remote_config_web: - dependency: transitive - description: - name: firebase_remote_config_web - sha256: c3e2be7d6e1416e4a1c7cc16d55a060a623e9e84c0ca0b07d9252584f39b7b08 - url: "https://pub.dev" - source: hosted - version: "1.4.4" - fixnum: - dependency: transitive - description: - name: fixnum - sha256: "25517a4deb0c03aa0f32fd12db525856438902d9c16536311e76cdc57b31d7d1" - url: "https://pub.dev" - source: hosted - version: "1.1.0" - fluro: - dependency: "direct main" - description: - name: fluro - sha256: "24d07d0b285b213ec2045b83e85d076185fa5c23651e44dae0ac6755784b97d0" - url: "https://pub.dev" - source: hosted - version: "2.0.5" - flutter: - dependency: "direct main" - description: flutter - source: sdk - version: "0.0.0" - flutter_blurhash: - dependency: transitive - description: - name: flutter_blurhash - sha256: "05001537bd3fac7644fa6558b09ec8c0a3f2eba78c0765f88912882b1331a5c6" - url: "https://pub.dev" - source: hosted - version: "0.7.0" - flutter_cache_manager: - dependency: transitive - description: - name: flutter_cache_manager - sha256: "8207f27539deb83732fdda03e259349046a39a4c767269285f449ade355d54ba" - url: "https://pub.dev" - source: hosted - version: "3.3.1" - flutter_downloader: - dependency: "direct main" - description: - name: flutter_downloader - sha256: "2b126083d2e6b7c09755bca12012c4c734bcf7666cf07ba00c508fcb83e8d0d7" - url: "https://pub.dev" - source: hosted - version: "1.11.1" - flutter_driver: - dependency: "direct dev" - description: flutter - source: sdk - version: "0.0.0" - flutter_linkify: - dependency: "direct main" - description: - name: flutter_linkify - sha256: "74669e06a8f358fee4512b4320c0b80e51cffc496607931de68d28f099254073" - url: "https://pub.dev" - source: hosted - version: "6.0.0" - flutter_local_notifications: - dependency: "direct main" - description: - name: flutter_local_notifications - sha256: "6d11ea777496061e583623aaf31923f93a9409ef8fcaeeefdd6cd78bf4fe5bb3" - url: "https://pub.dev" - source: hosted - version: "16.1.0" - flutter_local_notifications_linux: - dependency: transitive - description: - name: flutter_local_notifications_linux - sha256: "33f741ef47b5f63cc7f78fe75eeeac7e19f171ff3c3df054d84c1e38bedb6a03" - url: "https://pub.dev" - source: hosted - version: "4.0.0+1" - flutter_local_notifications_platform_interface: - dependency: transitive - description: - name: flutter_local_notifications_platform_interface - sha256: "7cf643d6d5022f3baed0be777b0662cce5919c0a7b86e700299f22dc4ae660ef" - url: "https://pub.dev" - source: hosted - version: "7.0.0+1" - flutter_localizations: - dependency: "direct main" - description: flutter - source: sdk - version: "0.0.0" - flutter_plugin_android_lifecycle: - dependency: transitive - description: - name: flutter_plugin_android_lifecycle - sha256: "950e77c2bbe1692bc0874fc7fb491b96a4dc340457f4ea1641443d0a6c1ea360" - url: "https://pub.dev" - source: hosted - version: "2.0.15" - flutter_slidable: - dependency: "direct main" - description: - name: flutter_slidable - sha256: cc4231579e3eae41ae166660df717f4bad1359c87f4a4322ad8ba1befeb3d2be - url: "https://pub.dev" - source: hosted - version: "3.0.0" - flutter_svg: - dependency: "direct main" - description: - name: flutter_svg - sha256: "8c5d68a82add3ca76d792f058b186a0599414f279f00ece4830b9b231b570338" - url: "https://pub.dev" - source: hosted - version: "2.0.7" - flutter_test: - dependency: "direct dev" - description: flutter - source: sdk - version: "0.0.0" - flutter_web_plugins: - dependency: transitive - description: flutter - source: sdk - version: "0.0.0" - frontend_server_client: - dependency: transitive - description: - name: frontend_server_client - sha256: "408e3ca148b31c20282ad6f37ebfa6f4bdc8fede5b74bc2f08d9d92b55db3612" - url: "https://pub.dev" - source: hosted - version: "3.2.0" - fuchsia_remote_debug_protocol: - dependency: transitive - description: flutter - source: sdk - version: "0.0.0" - get_it: - dependency: "direct main" - description: - name: get_it - sha256: "529de303c739fca98cd7ece5fca500d8ff89649f1bb4b4e94fb20954abcd7468" - url: "https://pub.dev" - source: hosted - version: "7.6.0" - glob: - dependency: transitive - description: - name: glob - sha256: "0e7014b3b7d4dac1ca4d6114f82bf1782ee86745b9b42a92c9289c23d8a0ab63" - url: "https://pub.dev" - source: hosted - version: "2.1.2" - graphs: - dependency: transitive - description: - name: graphs - sha256: aedc5a15e78fc65a6e23bcd927f24c64dd995062bcd1ca6eda65a3cff92a4d19 - url: "https://pub.dev" - source: hosted - version: "2.3.1" - html: - dependency: transitive - description: - name: html - sha256: "3a7812d5bcd2894edf53dfaf8cd640876cf6cef50a8f238745c8b8120ea74d3a" - url: "https://pub.dev" - source: hosted - version: "0.15.4" - http: - dependency: transitive - description: - name: http - sha256: "759d1a329847dd0f39226c688d3e06a6b8679668e350e2891a6474f8b4bb8525" - url: "https://pub.dev" - source: hosted - version: "1.1.0" - http_multi_server: - dependency: transitive - description: - name: http_multi_server - sha256: "97486f20f9c2f7be8f514851703d0119c3596d14ea63227af6f7a481ef2b2f8b" - url: "https://pub.dev" - source: hosted - version: "3.2.1" - http_parser: - dependency: transitive - description: - name: http_parser - sha256: "2aa08ce0341cc9b354a498388e30986515406668dbcc4f7c950c3e715496693b" - url: "https://pub.dev" - source: hosted - version: "4.0.2" - image_picker: - dependency: "direct main" - description: - name: image_picker - sha256: "841837258e0b42c80946c43443054fc726f5e8aa84a97f363eb9ef0d45b33c14" - url: "https://pub.dev" - source: hosted - version: "1.0.2" - image_picker_android: - dependency: transitive - description: - name: image_picker_android - sha256: "8179b54039b50eee561676232304f487602e2950ffb3e8995ed9034d6505ca34" - url: "https://pub.dev" - source: hosted - version: "0.8.7+4" - image_picker_for_web: - dependency: transitive - description: - name: image_picker_for_web - sha256: "8b6c160cdbe572199103a091c783685b236110e4a0fd7a4947f32ff5b7da8765" - url: "https://pub.dev" - source: hosted - version: "3.0.0" - image_picker_ios: - dependency: transitive - description: - name: image_picker_ios - sha256: b3e2f21feb28b24dd73a35d7ad6e83f568337c70afab5eabac876e23803f264b - url: "https://pub.dev" - source: hosted - version: "0.8.8" - image_picker_linux: - dependency: transitive - description: - name: image_picker_linux - sha256: "02cbc21fe1706b97942b575966e5fbbeaac535e76deef70d3a242e4afb857831" - url: "https://pub.dev" - source: hosted - version: "0.2.1" - image_picker_macos: - dependency: transitive - description: - name: image_picker_macos - sha256: cee2aa86c56780c13af2c77b5f2f72973464db204569e1ba2dd744459a065af4 - url: "https://pub.dev" - source: hosted - version: "0.2.1" - image_picker_platform_interface: - dependency: transitive - description: - name: image_picker_platform_interface - sha256: c1134543ae2187e85299996d21c526b2f403854994026d575ae4cf30d7bb2a32 - url: "https://pub.dev" - source: hosted - version: "2.9.0" - image_picker_windows: - dependency: transitive - description: - name: image_picker_windows - sha256: c3066601ea42113922232c7b7b3330a2d86f029f685bba99d82c30e799914952 - url: "https://pub.dev" - source: hosted - version: "0.2.1" - intl: - dependency: "direct main" - description: - name: intl - sha256: "3bc132a9dbce73a7e4a21a17d06e1878839ffbf975568bc875c60537824b0c4d" - url: "https://pub.dev" - source: hosted - version: "0.18.1" - intl_generator: - dependency: "direct dev" - description: - name: intl_generator - sha256: "120e03ccefe0c215801e44a8ccbaeabe6c895c5792f44298133745ab0a0e0bf5" - url: "https://pub.dev" - source: hosted - version: "0.4.1" - io: - dependency: transitive - description: - name: io - sha256: "2ec25704aba361659e10e3e5f5d672068d332fc8ac516421d483a11e5cbd061e" - url: "https://pub.dev" - source: hosted - version: "1.0.4" - js: - dependency: transitive - description: - name: js - sha256: f2c445dce49627136094980615a031419f7f3eb393237e4ecd97ac15dea343f3 - url: "https://pub.dev" - source: hosted - version: "0.6.7" - json_annotation: - dependency: transitive - description: - name: json_annotation - sha256: b10a7b2ff83d83c777edba3c6a0f97045ddadd56c944e1a23a3fdf43a1bf4467 - url: "https://pub.dev" - source: hosted - version: "4.8.1" - json_serializable: - dependency: transitive - description: - name: json_serializable - sha256: aa1f5a8912615733e0fdc7a02af03308933c93235bdc8d50d0b0c8a8ccb0b969 - url: "https://pub.dev" - source: hosted - version: "6.7.1" - linkify: - dependency: transitive - description: - name: linkify - sha256: "4139ea77f4651ab9c315b577da2dd108d9aa0bd84b5d03d33323f1970c645832" - url: "https://pub.dev" - source: hosted - version: "5.0.0" - logging: - dependency: transitive - description: - name: logging - sha256: "623a88c9594aa774443aa3eb2d41807a48486b5613e67599fb4c41c0ad47c340" - url: "https://pub.dev" - source: hosted - version: "1.2.0" - matcher: - dependency: transitive - description: - name: matcher - sha256: "1803e76e6653768d64ed8ff2e1e67bea3ad4b923eb5c56a295c3e634bad5960e" - url: "https://pub.dev" - source: hosted - version: "0.12.16" - material_color_utilities: - dependency: transitive - description: - name: material_color_utilities - sha256: "9528f2f296073ff54cb9fee677df673ace1218163c3bc7628093e7eed5203d41" - url: "https://pub.dev" - source: hosted - version: "0.5.0" - meta: - dependency: transitive - description: - name: meta - sha256: "3c74dbf8763d36539f114c799d8a2d87343b5067e9d796ca22b5eb8437090ee3" - url: "https://pub.dev" - source: hosted - version: "1.9.1" - mime: - dependency: "direct main" - description: - name: mime - sha256: e4ff8e8564c03f255408decd16e7899da1733852a9110a58fe6d1b817684a63e - url: "https://pub.dev" - source: hosted - version: "1.0.4" - mockito: - dependency: "direct dev" - description: - name: mockito - sha256: "7d5b53bcd556c1bc7ffbe4e4d5a19c3e112b7e925e9e172dd7c6ad0630812616" - url: "https://pub.dev" - source: hosted - version: "5.4.2" - nested: - dependency: transitive - description: - name: nested - sha256: "03bac4c528c64c95c722ec99280375a6f2fc708eec17c7b3f07253b626cd2a20" - url: "https://pub.dev" - source: hosted - version: "1.0.0" - node_preamble: - dependency: transitive - description: - name: node_preamble - sha256: "6e7eac89047ab8a8d26cf16127b5ed26de65209847630400f9aefd7cd5c730db" - url: "https://pub.dev" - source: hosted - version: "2.0.2" - octo_image: - dependency: transitive - description: - name: octo_image - sha256: "107f3ed1330006a3bea63615e81cf637433f5135a52466c7caa0e7152bca9143" - url: "https://pub.dev" - source: hosted - version: "1.0.2" - package_config: - dependency: transitive - description: - name: package_config - sha256: "1c5b77ccc91e4823a5af61ee74e6b972db1ef98c2ff5a18d3161c982a55448bd" - url: "https://pub.dev" - source: hosted - version: "2.1.0" - package_info_plus: - dependency: "direct main" - description: - name: package_info_plus - sha256: "6ff267fcd9d48cb61c8df74a82680e8b82e940231bb5f68356672fde0397334a" - url: "https://pub.dev" - source: hosted - version: "4.1.0" - package_info_plus_platform_interface: - dependency: transitive - description: - name: package_info_plus_platform_interface - sha256: "9bc8ba46813a4cc42c66ab781470711781940780fd8beddd0c3da62506d3a6c6" - url: "https://pub.dev" - source: hosted - version: "2.0.1" - path: - dependency: transitive - description: - name: path - sha256: "8829d8a55c13fc0e37127c29fedf290c102f4e40ae94ada574091fe0ff96c917" - url: "https://pub.dev" - source: hosted - version: "1.8.3" - path_parsing: - dependency: transitive - description: - name: path_parsing - sha256: e3e67b1629e6f7e8100b367d3db6ba6af4b1f0bb80f64db18ef1fbabd2fa9ccf - url: "https://pub.dev" - source: hosted - version: "1.0.1" - path_provider: - dependency: "direct main" - description: - name: path_provider - sha256: "909b84830485dbcd0308edf6f7368bc8fd76afa26a270420f34cabea2a6467a0" - url: "https://pub.dev" - source: hosted - version: "2.1.0" - path_provider_android: - dependency: transitive - description: - name: path_provider_android - sha256: "5d44fc3314d969b84816b569070d7ace0f1dea04bd94a83f74c4829615d22ad8" - url: "https://pub.dev" - source: hosted - version: "2.1.0" - path_provider_foundation: - dependency: transitive - description: - name: path_provider_foundation - sha256: "1b744d3d774e5a879bb76d6cd1ecee2ba2c6960c03b1020cd35212f6aa267ac5" - url: "https://pub.dev" - source: hosted - version: "2.3.0" - path_provider_linux: - dependency: transitive - description: - name: path_provider_linux - sha256: ba2b77f0c52a33db09fc8caf85b12df691bf28d983e84cf87ff6d693cfa007b3 - url: "https://pub.dev" - source: hosted - version: "2.2.0" - path_provider_platform_interface: - dependency: transitive - description: - name: path_provider_platform_interface - sha256: bced5679c7df11190e1ddc35f3222c858f328fff85c3942e46e7f5589bf9eb84 - url: "https://pub.dev" - source: hosted - version: "2.1.0" - path_provider_windows: - dependency: transitive - description: - name: path_provider_windows - sha256: ee0e0d164516b90ae1f970bdf29f726f1aa730d7cfc449ecc74c495378b705da - url: "https://pub.dev" - source: hosted - version: "2.2.0" - percent_indicator: - dependency: "direct main" - description: - name: percent_indicator - sha256: c37099ad833a883c9d71782321cb65c3a848c21b6939b6185f0ff6640d05814c - url: "https://pub.dev" - source: hosted - version: "4.2.3" - permission_handler: - dependency: "direct main" - description: - name: permission_handler - sha256: "63e5216aae014a72fe9579ccd027323395ce7a98271d9defa9d57320d001af81" - url: "https://pub.dev" - source: hosted - version: "10.4.3" - permission_handler_android: - dependency: transitive - description: - name: permission_handler_android - sha256: "2ffaf52a21f64ac9b35fe7369bb9533edbd4f698e5604db8645b1064ff4cf221" - url: "https://pub.dev" - source: hosted - version: "10.3.3" - permission_handler_apple: - dependency: transitive - description: - name: permission_handler_apple - sha256: "99e220bce3f8877c78e4ace901082fb29fa1b4ebde529ad0932d8d664b34f3f5" - url: "https://pub.dev" - source: hosted - version: "9.1.4" - permission_handler_platform_interface: - dependency: transitive - description: - name: permission_handler_platform_interface - sha256: "7c6b1500385dd1d2ca61bb89e2488ca178e274a69144d26bbd65e33eae7c02a9" - url: "https://pub.dev" - source: hosted - version: "3.11.3" - permission_handler_windows: - dependency: transitive - description: - name: permission_handler_windows - sha256: cc074aace208760f1eee6aa4fae766b45d947df85bc831cde77009cdb4720098 - url: "https://pub.dev" - source: hosted - version: "0.1.3" - petitparser: - dependency: transitive - description: - name: petitparser - sha256: cb3798bef7fc021ac45b308f4b51208a152792445cce0448c9a4ba5879dd8750 - url: "https://pub.dev" - source: hosted - version: "5.4.0" - photo_view: - dependency: "direct main" - description: - name: photo_view - sha256: "8036802a00bae2a78fc197af8a158e3e2f7b500561ed23b4c458107685e645bb" - url: "https://pub.dev" - source: hosted - version: "0.14.0" - platform: - dependency: transitive - description: - name: platform - sha256: "4a451831508d7d6ca779f7ac6e212b4023dd5a7d08a27a63da33756410e32b76" - url: "https://pub.dev" - source: hosted - version: "3.1.0" - plugin_platform_interface: - dependency: transitive - description: - name: plugin_platform_interface - sha256: "43798d895c929056255600343db8f049921cbec94d31ec87f1dc5c16c01935dd" - url: "https://pub.dev" - source: hosted - version: "2.1.5" - pointycastle: - dependency: transitive - description: - name: pointycastle - sha256: "7c1e5f0d23c9016c5bbd8b1473d0d3fb3fc851b876046039509e18e0c7485f2c" - url: "https://pub.dev" - source: hosted - version: "3.7.3" - pool: - dependency: transitive - description: - name: pool - sha256: "20fe868b6314b322ea036ba325e6fc0711a22948856475e2c2b6306e8ab39c2a" - url: "https://pub.dev" - source: hosted - version: "1.5.1" - process: - dependency: transitive - description: - name: process - sha256: "53fd8db9cec1d37b0574e12f07520d582019cb6c44abf5479a01505099a34a09" - url: "https://pub.dev" - source: hosted - version: "4.2.4" - protobuf: - dependency: transitive - description: - name: protobuf - sha256: "01dd9bd0fa02548bf2ceee13545d4a0ec6046459d847b6b061d8a27237108a08" - url: "https://pub.dev" - source: hosted - version: "2.1.0" - provider: - dependency: "direct main" - description: - name: provider - sha256: cdbe7530b12ecd9eb455bdaa2fcb8d4dad22e80b8afb4798b41479d5ce26847f - url: "https://pub.dev" - source: hosted - version: "6.0.5" - pub_semver: - dependency: transitive - description: - name: pub_semver - sha256: "40d3ab1bbd474c4c2328c91e3a7df8c6dd629b79ece4c4bd04bee496a224fb0c" - url: "https://pub.dev" - source: hosted - version: "2.1.4" - pubspec_parse: - dependency: transitive - description: - name: pubspec_parse - sha256: c63b2876e58e194e4b0828fcb080ad0e06d051cb607a6be51a9e084f47cb9367 - url: "https://pub.dev" - source: hosted - version: "1.2.3" - quiver: - dependency: transitive - description: - name: quiver - sha256: b1c1ac5ce6688d77f65f3375a9abb9319b3cb32486bdc7a1e0fdf004d7ba4e47 - url: "https://pub.dev" - source: hosted - version: "3.2.1" - rxdart: - dependency: transitive - description: - name: rxdart - sha256: "0c7c0cedd93788d996e33041ffecda924cc54389199cde4e6a34b440f50044cb" - url: "https://pub.dev" - source: hosted - version: "0.27.7" - shared_preferences: - dependency: "direct main" - description: - name: shared_preferences - sha256: "0344316c947ffeb3a529eac929e1978fcd37c26be4e8468628bac399365a3ca1" - url: "https://pub.dev" - source: hosted - version: "2.2.0" - shared_preferences_android: - dependency: transitive - description: - name: shared_preferences_android - sha256: fe8401ec5b6dcd739a0fe9588802069e608c3fdbfd3c3c93e546cf2f90438076 - url: "https://pub.dev" - source: hosted - version: "2.2.0" - shared_preferences_foundation: - dependency: transitive - description: - name: shared_preferences_foundation - sha256: f39696b83e844923b642ce9dd4bd31736c17e697f6731a5adf445b1274cf3cd4 - url: "https://pub.dev" - source: hosted - version: "2.3.2" - shared_preferences_linux: - dependency: transitive - description: - name: shared_preferences_linux - sha256: "71d6806d1449b0a9d4e85e0c7a917771e672a3d5dc61149cc9fac871115018e1" - url: "https://pub.dev" - source: hosted - version: "2.3.0" - shared_preferences_platform_interface: - dependency: transitive - description: - name: shared_preferences_platform_interface - sha256: "23b052f17a25b90ff2b61aad4cc962154da76fb62848a9ce088efe30d7c50ab1" - url: "https://pub.dev" - source: hosted - version: "2.3.0" - shared_preferences_web: - dependency: transitive - description: - name: shared_preferences_web - sha256: "7347b194fb0bbeb4058e6a4e87ee70350b6b2b90f8ac5f8bd5b3a01548f6d33a" - url: "https://pub.dev" - source: hosted - version: "2.2.0" - shared_preferences_windows: - dependency: transitive - description: - name: shared_preferences_windows - sha256: f95e6a43162bce43c9c3405f3eb6f39e5b5d11f65fab19196cf8225e2777624d - url: "https://pub.dev" - source: hosted - version: "2.3.0" - shelf: - dependency: transitive - description: - name: shelf - sha256: ad29c505aee705f41a4d8963641f91ac4cee3c8fad5947e033390a7bd8180fa4 - url: "https://pub.dev" - source: hosted - version: "1.4.1" - shelf_packages_handler: - dependency: transitive - description: - name: shelf_packages_handler - sha256: "89f967eca29607c933ba9571d838be31d67f53f6e4ee15147d5dc2934fee1b1e" - url: "https://pub.dev" - source: hosted - version: "3.0.2" - shelf_static: - dependency: transitive - description: - name: shelf_static - sha256: a41d3f53c4adf0f57480578c1d61d90342cd617de7fc8077b1304643c2d85c1e - url: "https://pub.dev" - source: hosted - version: "1.1.2" - shelf_web_socket: - dependency: transitive - description: - name: shelf_web_socket - sha256: "9ca081be41c60190ebcb4766b2486a7d50261db7bd0f5d9615f2d653637a84c1" - url: "https://pub.dev" - source: hosted - version: "1.0.4" - sky_engine: - dependency: transitive - description: flutter - source: sdk - version: "0.0.99" - source_gen: - dependency: transitive - description: - name: source_gen - sha256: fc0da689e5302edb6177fdd964efcb7f58912f43c28c2047a808f5bfff643d16 - url: "https://pub.dev" - source: hosted - version: "1.4.0" - source_helper: - dependency: transitive - description: - name: source_helper - sha256: "6adebc0006c37dd63fe05bca0a929b99f06402fc95aa35bf36d67f5c06de01fd" - url: "https://pub.dev" - source: hosted - version: "1.3.4" - source_map_stack_trace: - dependency: transitive - description: - name: source_map_stack_trace - sha256: "84cf769ad83aa6bb61e0aa5a18e53aea683395f196a6f39c4c881fb90ed4f7ae" - url: "https://pub.dev" - source: hosted - version: "2.1.1" - source_maps: - dependency: transitive - description: - name: source_maps - sha256: "708b3f6b97248e5781f493b765c3337db11c5d2c81c3094f10904bfa8004c703" - url: "https://pub.dev" - source: hosted - version: "0.10.12" - source_span: - dependency: transitive - description: - name: source_span - sha256: "53e943d4206a5e30df338fd4c6e7a077e02254531b138a15aec3bd143c1a8b3c" - url: "https://pub.dev" - source: hosted - version: "1.10.0" - sqflite: - dependency: "direct main" - description: - name: sqflite - sha256: "591f1602816e9c31377d5f008c2d9ef7b8aca8941c3f89cc5fd9d84da0c38a9a" - url: "https://pub.dev" - source: hosted - version: "2.3.0" - sqflite_common: - dependency: transitive - description: - name: sqflite_common - sha256: "1b92f368f44b0dee2425bb861cfa17b6f6cf3961f762ff6f941d20b33355660a" - url: "https://pub.dev" - source: hosted - version: "2.5.0" - stack_trace: - dependency: transitive - description: - name: stack_trace - sha256: c3c7d8edb15bee7f0f74debd4b9c5f3c2ea86766fe4178eb2a18eb30a0bdaed5 - url: "https://pub.dev" - source: hosted - version: "1.11.0" - stream_channel: - dependency: transitive - description: - name: stream_channel - sha256: "83615bee9045c1d322bbbd1ba209b7a749c2cbcdcb3fdd1df8eb488b3279c1c8" - url: "https://pub.dev" - source: hosted - version: "2.1.1" - stream_transform: - dependency: transitive - description: - name: stream_transform - sha256: "14a00e794c7c11aa145a170587321aedce29769c08d7f58b1d141da75e3b1c6f" - url: "https://pub.dev" - source: hosted - version: "2.1.0" - string_scanner: - dependency: transitive - description: - name: string_scanner - sha256: "556692adab6cfa87322a115640c11f13cb77b3f076ddcc5d6ae3c20242bedcde" - url: "https://pub.dev" - source: hosted - version: "1.2.0" - sync_http: - dependency: transitive - description: - name: sync_http - sha256: "7f0cd72eca000d2e026bcd6f990b81d0ca06022ef4e32fb257b30d3d1014a961" - url: "https://pub.dev" - source: hosted - version: "0.3.1" - synchronized: - dependency: transitive - description: - name: synchronized - sha256: "5fcbd27688af6082f5abd611af56ee575342c30e87541d0245f7ff99faa02c60" - url: "https://pub.dev" - source: hosted - version: "3.1.0" - term_glyph: - dependency: transitive - description: - name: term_glyph - sha256: a29248a84fbb7c79282b40b8c72a1209db169a2e0542bce341da992fe1bc7e84 - url: "https://pub.dev" - source: hosted - version: "1.2.1" - test: - dependency: "direct dev" - description: - name: test - sha256: "13b41f318e2a5751c3169137103b60c584297353d4b1761b66029bae6411fe46" - url: "https://pub.dev" - source: hosted - version: "1.24.3" - test_api: - dependency: transitive - description: - name: test_api - sha256: "75760ffd7786fffdfb9597c35c5b27eaeec82be8edfb6d71d32651128ed7aab8" - url: "https://pub.dev" - source: hosted - version: "0.6.0" - test_core: - dependency: transitive - description: - name: test_core - sha256: "99806e9e6d95c7b059b7a0fc08f07fc53fabe54a829497f0d9676299f1e8637e" - url: "https://pub.dev" - source: hosted - version: "0.5.3" - timezone: - dependency: transitive - description: - name: timezone - sha256: "1cfd8ddc2d1cfd836bc93e67b9be88c3adaeca6f40a00ca999104c30693cdca0" - url: "https://pub.dev" - source: hosted - version: "0.9.2" - timing: - dependency: transitive - description: - name: timing - sha256: "70a3b636575d4163c477e6de42f247a23b315ae20e86442bebe32d3cabf61c32" - url: "https://pub.dev" - source: hosted - version: "1.0.1" - transparent_image: - dependency: "direct main" - description: - name: transparent_image - sha256: e8991d955a2094e197ca24c645efec2faf4285772a4746126ca12875e54ca02f - url: "https://pub.dev" - source: hosted - version: "2.0.1" - tuple: - dependency: "direct main" - description: - name: tuple - sha256: a97ce2013f240b2f3807bcbaf218765b6f301c3eff91092bcfa23a039e7dd151 - url: "https://pub.dev" - source: hosted - version: "2.0.2" - typed_data: - dependency: transitive - description: - name: typed_data - sha256: facc8d6582f16042dd49f2463ff1bd6e2c9ef9f3d5da3d9b087e244a7b564b3c - url: "https://pub.dev" - source: hosted - version: "1.3.2" - uuid: - dependency: "direct main" - description: - name: uuid - sha256: "648e103079f7c64a36dc7d39369cabb358d377078a051d6ae2ad3aa539519313" - url: "https://pub.dev" - source: hosted - version: "3.0.7" - vector_graphics: - dependency: transitive - description: - name: vector_graphics - sha256: "670f6e07aca990b4a2bcdc08a784193c4ccdd1932620244c3a86bb72a0eac67f" - url: "https://pub.dev" - source: hosted - version: "1.1.7" - vector_graphics_codec: - dependency: transitive - description: - name: vector_graphics_codec - sha256: "7451721781d967db9933b63f5733b1c4533022c0ba373a01bdd79d1a5457f69f" - url: "https://pub.dev" - source: hosted - version: "1.1.7" - vector_graphics_compiler: - dependency: transitive - description: - name: vector_graphics_compiler - sha256: "80a13c613c8bde758b1464a1755a7b3a8f2b6cec61fbf0f5a53c94c30f03ba2e" - url: "https://pub.dev" - source: hosted - version: "1.1.7" - vector_math: - dependency: "direct main" - description: - name: vector_math - sha256: "80b3257d1492ce4d091729e3a67a60407d227c27241d6927be0130c98e741803" - url: "https://pub.dev" - source: hosted - version: "2.1.4" - video_player: - dependency: "direct main" - description: - name: video_player - sha256: "3fd106c74da32f336dc7feb65021da9b0207cb3124392935f1552834f7cce822" - url: "https://pub.dev" - source: hosted - version: "2.7.0" - video_player_android: - dependency: transitive - description: - name: video_player_android - sha256: f338a5a396c845f4632959511cad3542cdf3167e1b2a1a948ef07f7123c03608 - url: "https://pub.dev" - source: hosted - version: "2.4.9" - video_player_avfoundation: - dependency: transitive - description: - name: video_player_avfoundation - sha256: f5f5b7fe8c865be8a57fe80c2dca130772e1db775b7af4e5c5aa1905069cfc6c - url: "https://pub.dev" - source: hosted - version: "2.4.9" - video_player_platform_interface: - dependency: transitive - description: - name: video_player_platform_interface - sha256: "1ca9acd7a0fb15fb1a990cb554e6f004465c6f37c99d2285766f08a4b2802988" - url: "https://pub.dev" - source: hosted - version: "6.2.0" - video_player_web: - dependency: transitive - description: - name: video_player_web - sha256: "44ce41424d104dfb7cf6982cc6b84af2b007a24d126406025bf40de5d481c74c" - url: "https://pub.dev" - source: hosted - version: "2.0.16" - vm_service: - dependency: transitive - description: - name: vm_service - sha256: c620a6f783fa22436da68e42db7ebbf18b8c44b9a46ab911f666ff09ffd9153f - url: "https://pub.dev" - source: hosted - version: "11.7.1" - wakelock_plus: - dependency: transitive - description: - name: wakelock_plus - sha256: aac3f3258f01781ec9212df94eecef1eb9ba9350e106728def405baa096ba413 - url: "https://pub.dev" - source: hosted - version: "1.1.1" - wakelock_plus_platform_interface: - dependency: transitive - description: - name: wakelock_plus_platform_interface - sha256: "40fabed5da06caff0796dc638e1f07ee395fb18801fbff3255a2372db2d80385" - url: "https://pub.dev" - source: hosted - version: "1.1.0" - watcher: - dependency: transitive - description: - name: watcher - sha256: "3d2ad6751b3c16cf07c7fca317a1413b3f26530319181b37e3b9039b84fc01d8" - url: "https://pub.dev" - source: hosted - version: "1.1.0" - web: - dependency: transitive - description: - name: web - sha256: dc8ccd225a2005c1be616fe02951e2e342092edf968cf0844220383757ef8f10 - url: "https://pub.dev" - source: hosted - version: "0.1.4-beta" - web_socket_channel: - dependency: transitive - description: - name: web_socket_channel - sha256: d88238e5eac9a42bb43ca4e721edba3c08c6354d4a53063afaa568516217621b - url: "https://pub.dev" - source: hosted - version: "2.4.0" - webdriver: - dependency: transitive - description: - name: webdriver - sha256: "3c923e918918feeb90c4c9fdf1fe39220fa4c0e8e2c0fffaded174498ef86c49" - url: "https://pub.dev" - source: hosted - version: "3.0.2" - webkit_inspection_protocol: - dependency: transitive - description: - name: webkit_inspection_protocol - sha256: "67d3a8b6c79e1987d19d848b0892e582dbb0c66c57cc1fef58a177dd2aa2823d" - url: "https://pub.dev" - source: hosted - version: "1.2.0" - webview_flutter: - dependency: "direct main" - description: - name: webview_flutter - sha256: "392c1d83b70fe2495de3ea2c84531268d5b8de2de3f01086a53334d8b6030a88" - url: "https://pub.dev" - source: hosted - version: "3.0.4" - webview_flutter_android: - dependency: transitive - description: - name: webview_flutter_android - sha256: "8b3b2450e98876c70bfcead876d9390573b34b9418c19e28168b74f6cb252dbd" - url: "https://pub.dev" - source: hosted - version: "2.10.4" - webview_flutter_platform_interface: - dependency: transitive - description: - name: webview_flutter_platform_interface - sha256: "812165e4e34ca677bdfbfa58c01e33b27fd03ab5fa75b70832d4b7d4ca1fa8cf" - url: "https://pub.dev" - source: hosted - version: "1.9.5" - webview_flutter_wkwebview: - dependency: transitive - description: - name: webview_flutter_wkwebview - sha256: a5364369c758892aa487cbf59ea41d9edd10f9d9baf06a94e80f1bd1b4c7bbc0 - url: "https://pub.dev" - source: hosted - version: "2.9.5" - win32: - dependency: transitive - description: - name: win32 - sha256: f2add6fa510d3ae152903412227bda57d0d5a8da61d2c39c1fb022c9429a41c0 - url: "https://pub.dev" - source: hosted - version: "5.0.6" - win32_registry: - dependency: transitive - description: - name: win32_registry - sha256: e4506d60b7244251bc59df15656a3093501c37fb5af02105a944d73eb95be4c9 - url: "https://pub.dev" - source: hosted - version: "1.1.1" - xdg_directories: - dependency: transitive - description: - name: xdg_directories - sha256: f0c26453a2d47aa4c2570c6a033246a3fc62da2fe23c7ffdd0a7495086dc0247 - url: "https://pub.dev" - source: hosted - version: "1.0.2" - xml: - dependency: transitive - description: - name: xml - sha256: "5bc72e1e45e941d825fd7468b9b4cc3b9327942649aeb6fc5cdbf135f0a86e84" - url: "https://pub.dev" - source: hosted - version: "6.3.0" - yaml: - dependency: transitive - description: - name: yaml - sha256: "75769501ea3489fca56601ff33454fe45507ea3bfb014161abc3b43ae25989d5" - url: "https://pub.dev" - source: hosted - version: "3.1.2" -sdks: - dart: ">=3.1.0-185.0.dev <3.10.6" - flutter: ">=3.13.2" diff --git a/apps/flutter_parent/pubspec.yaml b/apps/flutter_parent/pubspec.yaml deleted file mode 100644 index 33e84ca2cb..0000000000 --- a/apps/flutter_parent/pubspec.yaml +++ /dev/null @@ -1,166 +0,0 @@ -# Copyright (C) 2019 - present Instructure, Inc. -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, version 3 of the License. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -name: flutter_parent -description: Canvas Parent - -# The following defines the version and build number for your application. -# A version number is three numbers separated by dots, like 1.2.43 -# followed by an optional build number separated by a +. -# Both the version and the builder number may be overridden in flutter -# build by specifying --build-name and --build-number, respectively. -# In Android, build-name is used as versionName while build-number used as versionCode. -# Read more about Android versioning at https://developer.android.com/studio/publish/versioning -# In iOS, build-name is used as CFBundleShortVersionString while build-number used as CFBundleVersion. -# Read more about iOS versioning at -# https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html -version: 3.15.0+55 - -module: - androidX: true - -environment: - sdk: ">=3.0.0 <=3.13.2" - flutter: 3.13.2 - -dependencies: - flutter: - sdk: flutter - flutter_localizations: - sdk: flutter - firebase_remote_config: ^4.2.4 - firebase_core: ^2.15.0 - firebase_crashlytics: ^3.3.4 - get_it: ^7.6.0 - intl: ^0.18.1 - provider: ^6.0.5 - vector_math: ^2.1.4 - tuple: ^2.0.2 - flutter_slidable: ^3.0.0 - percent_indicator: ^4.2.3 - sqflite: ^2.2.8+4 - faker: ^2.1.0 - uuid: ^3.0.7 - collection: ^1.17.2 - flutter_linkify: ^6.0.0 - email_validator: ^2.1.17 - - # File handling - path_provider: ^2.0.15 - flutter_downloader: ^1.11.1 - mime: ^1.0.4 - file_picker: ^5.3.2 - - # Media handling - flutter_svg: ^2.0.7 - image_picker: ^1.0.1 - transparent_image: ^2.0.1 - cached_network_image: ^3.2.3 - photo_view: ^0.14.0 - video_player: ^2.7.0 - chewie: ^1.7.0 - barcode_scan2: ^4.2.4 - - # Networking / Serialization - dio: ^4.0.0 - dio_smart_retry: ^1.3.2 - built_value: ^8.6.1 - built_collection: ^5.1.1 - - dio_http_cache_lts: ^0.4.1 - - # Platform interactions - android_intent_plus: ^4.0.1 - device_info_plus: ^9.0.2 - encrypted_shared_preferences: # Used by ApiPrefs to securely store data - path: ./plugins/encrypted_shared_preferences - flutter_local_notifications: ^16.1.0 - package_info_plus: ^4.0.2 - permission_handler: ^10.4.3 - shared_preferences: ^2.2.0 # Used to cache remote config properties - webview_flutter: ^3.0.4 - - # Routing - fluro: ^2.0.5 - - encrypt: ^5.0.1 - -dev_dependencies: - flutter_driver: - sdk: flutter - flutter_test: - sdk: flutter - test: ^1.24.3 - intl_generator: ^0.4.1 - mockito: ^5.4.2 - - build_resolvers: ^2.2.1 - build_runner: ^2.4.6 - built_value_generator: ^8.6.1 - - -# For information on the generic Dart part of this file, see the -# following page: https://dart.dev/tools/pub/pubspec - -# The following section is specific to Flutter. -flutter: - - # The following line ensures that the Material Icons font is - # included with your application, so that you can use the icons in - # the material Icons class. - uses-material-design: true - - assets: - - assets/svg/ - - assets/svg/bottom-nav/ - - assets/png/ - - assets/fonts/ - - assets/html/html_wrapper.html - - # An image asset can refer to one or more resolution-specific "variants", see - # https://flutter.dev/assets-and-images/#resolution-aware. - - # For details regarding adding assets from package dependencies, see - # https://flutter.dev/assets-and-images/#from-packages - - fonts: - - family: CanvasIcons - fonts: - - asset: assets/fonts/CanvasIcons.ttf - - family: CanvasIconsSolid - fonts: - - asset: assets/fonts/CanvasIconsSolid.ttf - - family: Lato - fonts: - - asset: assets/fonts/lato_regular.ttf - - # To add custom fonts to your application, add a fonts section here, - # in this "flutter" section. Each entry in this list should have a - # "family" key with the font family name, and a "fonts" key with a - # list giving the asset and other descriptors for the font. For - # example: - # fonts: - # - family: Schyler - # fonts: - # - asset: fonts/Schyler-Regular.ttf - # - asset: fonts/Schyler-Italic.ttf - # style: italic - # - family: Trajan Pro - # fonts: - # - asset: fonts/TrajanPro.ttf - # - asset: fonts/TrajanPro_Bold.ttf - # weight: 700 - # - # For details regarding fonts from package dependencies, - # see https://flutter.dev/custom-fonts/#from-packages diff --git a/apps/flutter_parent/run_all_ui_tests.bash b/apps/flutter_parent/run_all_ui_tests.bash deleted file mode 100755 index fdb22e184d..0000000000 --- a/apps/flutter_parent/run_all_ui_tests.bash +++ /dev/null @@ -1,91 +0,0 @@ -# It appears that there is no way to just tell "flutter drive" to run all of the tests. -# You have to specify a target. -# This script will find all *_test.dart files in test_driver, and will strip the "_test" -# out of each for a proper target file. -# -# Note that if we started having multiple driver files (e.g., the ones with "_test" in them), -# we might need to tweak this script. It assumes a 1-1 correspondence between driver files -# and target files. - -commonSplunkData="\"workflow\" : \"$BITRISE_TRIGGERED_WORKFLOW_ID\", \"app\" : \"flutter-parent\", \"branch\" : \"$BITRISE_GIT_BRANCH\"" - -# Common logic to emit a test result -# Arg 1 : test name -# Arg 2 : test status (retry/failed/passed) -# Arg 3 : test time, in seconds -emitTestResult() { - testName=$1 - testStatus=$2 - runTime=$3 - - # If we have no Splunk access, abort. - # Splunk access = running on bitrise = splunk env var defined - if [ -z "$SPLUNK_MOBILE_TOKEN" ] - then - echo Aborting test result reporting -- not on Bitrise - return - fi - - # TODO: collect runTime info for test - payload="{\"sourcetype\" : \"mobile-android-qa-testresult\", \"event\" : {\"buildUrl\" : \"$BITRISE_BUILD_URL\", \"status\" : \"$testStatus\", \"testName\": \"$testName\", \"runTime\" : $runTime, $commonSplunkData}}" - curl -k "https://http-inputs-inst.splunkcloud.com:443/services/collector" -H "Authorization: Splunk $SPLUNK_MOBILE_TOKEN" -d "$payload" -} - -passed=0 -failed=0 -failures=() -for driver in test_driver/*_test.dart -do - echo "Aggregator: driver = $driver" - - target=${driver/_test} - echo "Aggregator: target = $target" - - # Start the clock - startTime=`date +"%s"` - - # Run the test - flutter clean - flutter pub get - flutter drive --target=$target - - # Allow for a single retry for a failed test - if [ $? -ne 0 ] - then - # Stop the clock - endTime=`date +"%s"` - ((runSecs=endTime-startTime)) - echo "Aggregator: $driver failed; retrying..." - emitTestResult $driver retry $runSecs - startTime=`date +"%s"` # restart the clock - flutter drive --target=$target # rerun the test - fi - - # Record test result - if [ $? -eq 0 ] - then - # Stop the clock - endTime=`date +"%s"` - ((runSecs=endTime-startTime)) - echo Aggregator: $driver Passed, secs=$runSecs - ((passed=passed+1)) - emitTestResult $driver passed $runSecs - else - # Stop the clock - endTime=`date +"%s"` - ((runSecs=endTime-startTime)) - echo Aggregator: $driver FAILED, secs=$runSecs - ((failed=failed+1)) - failures=("${failures[@]}" $driver) - emitTestResult $driver failed $runSecs - fi -done - -if [ $failed -eq 0 ] -then - echo Aggregator: All tests \($passed\) passed! -else - echo Aggregator: $failed failing tests: ${failures[@]} - exit 1 -fi - diff --git a/apps/flutter_parent/test/l10n/app_localizations_delegate_test.dart b/apps/flutter_parent/test/l10n/app_localizations_delegate_test.dart deleted file mode 100644 index b25cd328cf..0000000000 --- a/apps/flutter_parent/test/l10n/app_localizations_delegate_test.dart +++ /dev/null @@ -1,143 +0,0 @@ -// Copyright (C) 2019 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'dart:ui'; - -import 'package:flutter_parent/l10n/app_localizations.dart'; -import 'package:intl/intl.dart'; -import 'package:test/test.dart'; - -void main() { - test('shouldReload returns false', () { - expect(AppLocalizations.delegate.shouldReload(AppLocalizations.delegate), false); - }); - - group('load', () { - test('handles country code', () async { - await AppLocalizations.delegate.load(Locale.fromSubtags(languageCode: 'ar', countryCode: 'AR')); - expect(Intl.defaultLocale, 'ar_AR'); - }); - - test('handles custom locale script code', () async { - await AppLocalizations.delegate - .load(Locale.fromSubtags(languageCode: 'en', countryCode: 'AU', scriptCode: 'unimelb')); - expect(Intl.defaultLocale, 'en_AU_unimelb'); - }); - - test('handles no script code and no country code', () async { - await AppLocalizations.delegate.load(Locale.fromSubtags(languageCode: 'ar')); - expect(Intl.defaultLocale, 'ar'); - }); - }); - - group('isSupported', () { - test('returns true for supported language', () { - final locale = Locale('en'); - expect(AppLocalizations.delegate.isSupported(locale), true); - }); - - test('returns true for supported custom language pack', () { - final locale = Locale.fromSubtags(languageCode: 'en', scriptCode: 'unimelb', countryCode: 'AU'); - expect(AppLocalizations.delegate.isSupported(locale), true); - }); - - test('returns true for supported custom language pack without a country code', () { - final locale = Locale.fromSubtags(languageCode: 'sv', scriptCode: 'instk12'); - expect(AppLocalizations.delegate.isSupported(locale), true); - }); - - test('returns false for unsupported language', () { - final locale = Locale('aa'); - expect(AppLocalizations.delegate.isSupported(locale), false); - }); - - test('returns false for unsupported custom language pack', () { - final locale = Locale.fromSubtags(languageCode: 'en', scriptCode: 'bleminu', countryCode: 'AU'); - expect(AppLocalizations.delegate.isSupported(locale), false); - }); - - test('returns false for unsupported country', () { - final locale = Locale('en', 'AA'); - expect(AppLocalizations.delegate.isSupported(locale), false); - }); - }); - - /// resolution tests - - group('resolution callback', () { - test('returns locale when supported', () { - final fallback = Locale('en'); - final locale = Locale('es'); - - _testLocaleResolution(fallback, locale, locale); - }); - - test('returns locale without country code when language with a country code is unsupported', () { - final fallback = Locale('en'); - final locale = Locale('pl', 'AA'); - final expected = Locale('pl'); - - _testLocaleResolution(fallback, locale, expected, matchCountry: false); - }); - - test('returns fallback when language with a country code is unsupported', () { - final fallback = Locale('en'); - final locale = Locale('pl', 'AA'); - - _testLocaleResolution(fallback, locale, fallback); - }); - - test('eturns custom language locale when supported', () { - final fallback = Locale('en'); - final locale = Locale.fromSubtags(languageCode: 'en', scriptCode: 'unimelb', countryCode: 'AU'); - - _testLocaleResolution(fallback, locale, locale); - }); - - test('returns custom language locale without a country code when supported', () { - final fallback = Locale('en'); - final locale = Locale.fromSubtags(languageCode: 'sv', scriptCode: 'instk12'); - - _testLocaleResolution(fallback, locale, locale); - }); - - test('returns fallback locale when unsupported', () { - final fallback = Locale('en'); - final locale = Locale('aa'); - - _testLocaleResolution(fallback, locale, fallback); - }); - - test('returns fallback locale when custom language locale is unsupported', () { - final fallback = Locale('en'); - final locale = Locale.fromSubtags(languageCode: 'en', scriptCode: 'bleminu', countryCode: 'AU'); - - _testLocaleResolution(fallback, locale, fallback); - }); - - test('returns en locale when no fallback and locale is unsupported', () { - final locale = Locale('aa'); - final expected = Locale('en'); - - _testLocaleResolution(null, locale, expected); - }); - }); -} - -_testLocaleResolution(Locale? fallback, Locale resolving, Locale expected, {bool matchCountry = true}) { - final callback = AppLocalizations.delegate.resolution(fallback: fallback, matchCountry: matchCountry); - final actual = callback(resolving, AppLocalizations.delegate.supportedLocales); - - expect(actual, expected); -} diff --git a/apps/flutter_parent/test/models/alert_test.dart b/apps/flutter_parent/test/models/alert_test.dart deleted file mode 100644 index baaa7720dc..0000000000 --- a/apps/flutter_parent/test/models/alert_test.dart +++ /dev/null @@ -1,65 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:flutter_parent/models/alert.dart'; -import 'package:flutter_test/flutter_test.dart'; - -void main() { - test('Alert type is converted to correct api string', () { - expect('course_announcement', AlertType.courseAnnouncement.toApiString()); - expect('institution_announcement', AlertType.institutionAnnouncement.toApiString()); - expect('assignment_grade_high', AlertType.assignmentGradeHigh.toApiString()); - expect('assignment_grade_low', AlertType.assignmentGradeLow.toApiString()); - expect('assignment_missing', AlertType.assignmentMissing.toApiString()); - expect('course_grade_high', AlertType.courseGradeHigh.toApiString()); - expect('course_grade_low', AlertType.courseGradeLow.toApiString()); - }); - - test('isSwitch returns true when switch, false when not', () { - expect(true, AlertType.assignmentMissing.isSwitch()); - expect(true, AlertType.courseAnnouncement.isSwitch()); - expect(true, AlertType.institutionAnnouncement.isSwitch()); - expect(true, AlertType.assignmentMissing.isSwitch()); - expect(false, AlertType.courseGradeLow.isSwitch()); - expect(false, AlertType.courseGradeHigh.isSwitch()); - expect(false, AlertType.assignmentGradeLow.isSwitch()); - expect(false, AlertType.assignmentGradeHigh.isSwitch()); - }); - - test('returns valid courseId for course announcement alert', () { - final courseId = '1234'; - final alert = Alert((b) => b - ..id = '123' - ..title = 'Hodor' - ..workflowState = AlertWorkflowState.unread - ..htmlUrl = 'https://instructure.com/api/v1/courses/$courseId/discussion_topics/1234' - ..alertType = AlertType.courseAnnouncement - ..lockedForUser = false); - - expect(alert.getCourseIdForAnnouncement(), courseId); - }); - - test('assertion fails for not a course announcement alert', () { - final alert = Alert((b) => b - ..id = '123' - ..title = 'Hodor' - ..workflowState = AlertWorkflowState.unread - ..alertType = AlertType.institutionAnnouncement - ..lockedForUser = false); - - expect(() { - alert.getCourseIdForAnnouncement(); - }, throwsA(isA())); - }); -} diff --git a/apps/flutter_parent/test/models/assignment_test.dart b/apps/flutter_parent/test/models/assignment_test.dart deleted file mode 100644 index 3dead7d91c..0000000000 --- a/apps/flutter_parent/test/models/assignment_test.dart +++ /dev/null @@ -1,238 +0,0 @@ -// Copyright (C) 2019 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:built_collection/built_collection.dart'; -import 'package:flutter_parent/models/assignment.dart'; -import 'package:flutter_parent/models/lock_info.dart'; -import 'package:flutter_parent/models/locked_module.dart'; -import 'package:flutter_parent/models/submission.dart'; -import 'package:flutter_parent/models/submission_wrapper.dart'; -import 'package:test/test.dart'; - -void main() { - const String studentId = '1337'; - - group('isSubmittable', () { - test('returns true if submission types contain discussion_topic', () { - final assignment = _mockAssignment(types: [SubmissionTypes.onPaper, SubmissionTypes.discussionTopic]); - expect(assignment.isSubmittable(), true); - }); - - test('returns true if submission types contain online_quiz', () { - final assignment = _mockAssignment(types: [SubmissionTypes.onPaper, SubmissionTypes.onlineQuiz]); - expect(assignment.isSubmittable(), true); - }); - - test('returns true if submission types contain external_tool', () { - final assignment = _mockAssignment(types: [SubmissionTypes.onPaper, SubmissionTypes.externalTool]); - expect(assignment.isSubmittable(), true); - }); - - test('returns true if submission types contain online_text_entry', () { - final assignment = _mockAssignment(types: [SubmissionTypes.onPaper, SubmissionTypes.onlineTextEntry]); - expect(assignment.isSubmittable(), true); - }); - - test('returns true if submission types contain online_url', () { - final assignment = _mockAssignment(types: [SubmissionTypes.onPaper, SubmissionTypes.onlineUrl]); - expect(assignment.isSubmittable(), true); - }); - - test('returns true if submission types contain online_upload', () { - final assignment = _mockAssignment(types: [SubmissionTypes.onPaper, SubmissionTypes.onlineUpload]); - expect(assignment.isSubmittable(), true); - }); - - test('returns true if submission types contain media_recording', () { - final assignment = _mockAssignment(types: [SubmissionTypes.onPaper, SubmissionTypes.mediaRecording]); - expect(assignment.isSubmittable(), true); - }); - - test('returns false if submission types contain only onPaper', () { - final assignment = _mockAssignment(types: [SubmissionTypes.onPaper]); - expect(assignment.isSubmittable(), false); - }); - - test('returns false if submission types contain only none', () { - final assignment = _mockAssignment(types: [SubmissionTypes.none]); - expect(assignment.isSubmittable(), false); - }); - - test('returns false if submission types contain only non-submittable types', () { - final assignment = _mockAssignment(types: [SubmissionTypes.none, SubmissionTypes.onPaper]); - expect(assignment.isSubmittable(), false); - }); - }); - - group('getStatus', () { - test('returns NONE for none submission type', () { - final assignment = _mockAssignment(types: [SubmissionTypes.none]); - expect(assignment.getStatus(studentId: studentId), SubmissionStatus.NONE); - }); - - test('returns NONE for on paper submission type', () { - final assignment = _mockAssignment(types: [SubmissionTypes.onPaper]); - expect(assignment.getStatus(studentId: studentId), SubmissionStatus.NONE); - }); - - test('returns LATE for a late submission', () { - final assignment = _mockAssignment(submission: _mockSubmission(studentId).toBuilder()..isLate = true); - expect(assignment.getStatus(studentId: studentId), SubmissionStatus.LATE); - }); - - test('returns MISSING for a missing submission', () { - final assignment = _mockAssignment(submission: _mockSubmission(studentId).toBuilder()..missing = true); - expect(assignment.getStatus(studentId: studentId), SubmissionStatus.MISSING); - }); - - test('returns MISSING for a pass due assignment with a null submission', () { - final past = DateTime.now().subtract(Duration(seconds: 1)); - final assignment = _mockAssignment(dueAt: past, submission: null); - - expect(assignment.getStatus(studentId: studentId), SubmissionStatus.MISSING); - }); - - test('returns MISSING for a pass due assignment with an empty (server generated) submission', () { - final past = DateTime.now().subtract(Duration(seconds: 1)); - final submission = _mockSubmission(studentId).toBuilder() - ..attempt = 0 - ..grade = null; - final assignment = _mockAssignment(dueAt: past, submission: submission); - - expect(assignment.getStatus(studentId: studentId), SubmissionStatus.MISSING); - }); - - test('returns NOT_SUBMITTED for a missing submission with type external_tool', () { - final past = DateTime.now().subtract(Duration(seconds: 1)); - final assignment = _mockAssignment(dueAt: past, submission: null) - .rebuild((b) => b..submissionTypes = BuiltList.of([SubmissionTypes.externalTool]).toBuilder()); - - expect(assignment.getStatus(studentId: studentId), SubmissionStatus.NOT_SUBMITTED); - }); - - test('returns NOT_SUBMITTED for a submission with no submitted at time', () { - final assignment = _mockAssignment(submission: _mockSubmission(studentId).toBuilder()..submittedAt = null); - expect(assignment.getStatus(studentId: studentId), SubmissionStatus.NOT_SUBMITTED); - }); - - test('returns SUBMITTED for a submission with a submitted at time', () { - final past = DateTime.now().subtract(Duration(seconds: 1)); - final assignment = _mockAssignment(submission: _mockSubmission(studentId).toBuilder()..submittedAt = past); - - expect(assignment.getStatus(studentId: studentId), SubmissionStatus.SUBMITTED); - }); - - test('returns SUBMITTED for a passed due submission with a valid attempt', () { - final past = DateTime.now().subtract(Duration(seconds: 1)); - final submission = _mockSubmission(studentId).toBuilder() - ..attempt = 1 - ..submittedAt = DateTime.now(); - final assignment = _mockAssignment(dueAt: past, submission: submission); - - expect(assignment.getStatus(studentId: studentId), SubmissionStatus.SUBMITTED); - }); - }); - - group('isFullyLocked', () { - test('returns false when there is no lock info', () { - final assignment = _mockAssignment(); - - expect(assignment.isFullyLocked, false); - }); - - test('returns true when there is lock info with module name', () { - final lockInfo = LockInfo((b) => b - ..contextModule = LockedModule((m) => m - ..id = '' - ..contextId = '' - ..isRequireSequentialProgress = false - ..name = 'name').toBuilder()); - final assignment = _mockAssignment().rebuild((b) => b..lockInfo = lockInfo.toBuilder()); - - expect(assignment.isFullyLocked, true); - }); - - test('returns true when there is lock info with unlock at', () { - final unlockDate = DateTime(2100); - final lockInfo = LockInfo((b) => b..unlockAt = unlockDate); - final assignment = _mockAssignment().rebuild((b) => b..lockInfo = lockInfo.toBuilder()); - - expect(assignment.isFullyLocked, true); - }); - - test('returns false when there is lock info with unlock at in the past', () { - final unlockDate = DateTime(2000); - final lockInfo = LockInfo((b) => b..unlockAt = unlockDate); - final assignment = _mockAssignment().rebuild((b) => b..lockInfo = lockInfo.toBuilder()); - - expect(assignment.isFullyLocked, false); - }); - }); - - group('isDiscussion', () { - test('isDiscussion returns true when submission types contains discussion_topic', () { - final assignment = _mockAssignment().rebuild( - (b) => b..submissionTypes = ListBuilder([SubmissionTypes.discussionTopic]), - ); - - expect(assignment.isDiscussion, isTrue); - }); - - test('isDiscussion returns false when submission types does not contain discussion_topic', () { - final assignment = _mockAssignment().rebuild((b) => b..submissionTypes = ListBuilder([])); - - expect(assignment.isDiscussion, isFalse); - }); - }); - - group('isQuiz', () { - test('isQuiz returns true when submission types contains online_quiz', () { - final assignment = _mockAssignment().rebuild( - (b) => b..submissionTypes = ListBuilder([SubmissionTypes.onlineQuiz]), - ); - - expect(assignment.isQuiz, isTrue); - }); - - test('isQuiz returns false when submission types does not contain online_quiz', () { - final assignment = _mockAssignment().rebuild((b) => b..submissionTypes = ListBuilder([])); - - expect(assignment.isQuiz, isFalse); - }); - }); -} - -Assignment _mockAssignment({ - DateTime? dueAt, - SubmissionBuilder? submission, - List types = const [SubmissionTypes.onlineTextEntry], -}) { - List submissionList = submission != null ? [submission.build()] : []; - - SubmissionWrapper submissionWrapper = - SubmissionWrapper((b) => b..submissionList = BuiltList.from(submissionList).toBuilder()); - - return Assignment((b) => b - ..id = '' - ..courseId = '' - ..assignmentGroupId = '' - ..position = 0 - ..dueAt = dueAt - ..submissionWrapper = submissionWrapper.toBuilder() - ..submissionTypes = BuiltList(types).toBuilder()); -} - -Submission _mockSubmission(String studentId) => Submission((b) => b - ..assignmentId = '' - ..userId = studentId); diff --git a/apps/flutter_parent/test/models/attachment_test.dart b/apps/flutter_parent/test/models/attachment_test.dart deleted file mode 100644 index b492ddb06a..0000000000 --- a/apps/flutter_parent/test/models/attachment_test.dart +++ /dev/null @@ -1,74 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:flutter/widgets.dart'; -import 'package:flutter_parent/models/attachment.dart'; -import 'package:flutter_parent/screens/inbox/attachment_utils/attachment_extensions.dart'; -import 'package:flutter_parent/utils/design/canvas_icons.dart'; -import 'package:test/test.dart'; - -void main() { - IconData getIcon(String? contentType) => Attachment((a) => a..contentType = contentType).getIcon(); - - test('returns video icon for video attachments', () { - expect(getIcon('video/mp4'), CanvasIcons.video); - }); - - test('returns image icon for image attachments', () { - expect(getIcon('image/png'), CanvasIcons.image); - }); - - test('returns pdf icon for PDF attachments', () { - expect(getIcon('application/pdf'), CanvasIcons.pdf); - }); - - test('returns powerpoint icon for powerpoint attachments', () { - expect(getIcon('application/vnd.ms-powerpoint'), CanvasIcons.ms_ppt); - expect(getIcon('application/vnd.openxmlformats-officedocument.presentationml.presentation'), CanvasIcons.ms_ppt); - }); - - test('returns spreadsheet icon for spreadsheet attachments', () { - expect(getIcon('text/csv'), CanvasIcons.ms_excel); - expect(getIcon('application/vnd.ms-excel'), CanvasIcons.ms_excel); - expect(getIcon('application/vnd.oasis.opendocument.spreadsheet'), CanvasIcons.ms_excel); - expect(getIcon('application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'), CanvasIcons.ms_excel); - }); - - test('returns word icon for word processor attachments', () { - expect(getIcon('application/rtf'), CanvasIcons.ms_word); - expect(getIcon('application/msword'), CanvasIcons.ms_word); - expect(getIcon('application/x-abiword'), CanvasIcons.ms_word); - expect(getIcon('application/vnd.oasis.opendocument.text'), CanvasIcons.ms_word); - expect(getIcon('application/vnd.openxmlformats-officedocument.wordprocessingml.document'), CanvasIcons.ms_word); - }); - - test('returns zip icon for archive attachments', () { - expect(getIcon('application/zip'), CanvasIcons.zipped); - expect(getIcon('application/gzip'), CanvasIcons.zipped); - expect(getIcon('application/x-tar'), CanvasIcons.zipped); - expect(getIcon('application/x-bzip'), CanvasIcons.zipped); - expect(getIcon('application/java-archive'), CanvasIcons.zipped); - expect(getIcon('application/x-7z-compressed'), CanvasIcons.zipped); - expect(getIcon('application/application/x-bzip2'), CanvasIcons.zipped); - expect(getIcon('application/vnd.android.package-archive'), CanvasIcons.zipped); - expect(getIcon('application/application/x-rar-compressed'), CanvasIcons.zipped); - }); - - test('returns document icon for other attachment types', () { - expect(getIcon(''), CanvasIcons.document); - expect(getIcon(null), CanvasIcons.document); - expect(getIcon('null'), CanvasIcons.document); - expect(getIcon('application/octet-stream'), CanvasIcons.document); - }); -} diff --git a/apps/flutter_parent/test/models/course_grade_test.dart b/apps/flutter_parent/test/models/course_grade_test.dart deleted file mode 100644 index ec233efb9c..0000000000 --- a/apps/flutter_parent/test/models/course_grade_test.dart +++ /dev/null @@ -1,173 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -import 'package:built_collection/built_collection.dart'; -import 'package:flutter_parent/models/course.dart'; -import 'package:flutter_parent/models/course_grade.dart'; -import 'package:flutter_parent/models/enrollment.dart'; -import 'package:test/test.dart'; - -void main() { - final _course = Course((b) => b..id = 'course_123'); - final _enrollment = Enrollment((b) => b..enrollmentState = 'active'); - - group('isCourseGradeLocked', () { - test('returns true if hideFinalGrades is true', () { - final course = Course((b) => b..hideFinalGrades = true); - final grade = CourseGrade(course, null); - - expect(grade.isCourseGradeLocked(), true); - }); - - test('returns false if hideFinalGrades and hasGradingPeriods are false', () { - final course = Course((b) => b - ..hideFinalGrades = false - ..hasGradingPeriods = false); - final grade = CourseGrade(course, null); - - expect(grade.isCourseGradeLocked(), false); - }); - - test('returns true if hasGradingPeriods is true and there are no course enrollments', () { - final course = Course((b) => b - ..hasGradingPeriods = true - ..enrollments = BuiltList.of([]).toBuilder()); - final grade = CourseGrade(course, null); - - expect(grade.isCourseGradeLocked(), true); - }); - - test('returns false if hasGradingPeriods is true and an active grading period on the course enrollment is set', () { - final enrollment = _enrollment.rebuild((b) => b - ..currentGradingPeriodId = '101' - ..multipleGradingPeriodsEnabled = true); - - final course = Course((b) => b - ..hasGradingPeriods = true - ..enrollments = BuiltList.of([enrollment]).toBuilder()); - - final grade = CourseGrade(course, null); - - expect(grade.isCourseGradeLocked(), false); - }); - - test( - 'returns true if hasGradingPeriods is true and an active grading period on the course enrollment is set but forcing all periods', - () { - final enrollment = _enrollment.rebuild((b) => b - ..currentGradingPeriodId = '101' - ..multipleGradingPeriodsEnabled = true); - - final course = Course((b) => b - ..hasGradingPeriods = true - ..enrollments = BuiltList.of([enrollment]).toBuilder()); - - final grade = CourseGrade(course, null, forceAllPeriods: true); - - expect(grade.isCourseGradeLocked(), true); - }); - - test('returns false if hasGradingPeriods is true and NO active grading period on the course enrollment is set', () { - final enrollment = _enrollment.rebuild((b) => b..multipleGradingPeriodsEnabled = true); - - final course = Course((b) => b - ..hasGradingPeriods = true - ..enrollments = BuiltList.of([enrollment]).toBuilder()); - - final grade = CourseGrade(course, null); - - expect(grade.isCourseGradeLocked(), true); - }); - - test( - 'returns false if hasGradingPeriods is true and totalsForAllGradingPeriodsOption on the course enrollment is true', - () { - final enrollment = _enrollment.rebuild((b) => b - ..role = 'student' - ..totalsForAllGradingPeriodsOption = true - ..multipleGradingPeriodsEnabled = true); - - final course = Course((b) => b - ..hasGradingPeriods = true - ..enrollments = BuiltList.of([enrollment]).toBuilder()); - - final grade = CourseGrade(course, null); - - expect(grade.isCourseGradeLocked(), false); - }); - - test( - 'returns false if hasGradingPeriods is true and totalsForAllGradingPeriodsOption on the course enrollment is false', - () { - final enrollment = _enrollment.rebuild((b) => b - ..role = 'student' - ..totalsForAllGradingPeriodsOption = false - ..multipleGradingPeriodsEnabled = true); - - final course = Course((b) => b - ..hasGradingPeriods = true - ..enrollments = BuiltList.of([enrollment]).toBuilder()); - - final grade = CourseGrade(course, null); - - expect(grade.isCourseGradeLocked(), true); - }); - }); - - group('equals', () { - test('returns true if the course is the same', () { - final grade = CourseGrade(_course, null); - expect(true, grade == CourseGrade(_course, null)); - }); - - test('returns false if the courses are different', () { - final grade = CourseGrade(_course, null); - expect(false, grade == CourseGrade(_course.rebuild((b) => b..id = 'copy'), null)); - }); - - test('returns true if the enrollment is the same', () { - final grade = CourseGrade(null, _enrollment); - expect(true, grade == CourseGrade(null, _enrollment)); - }); - - test('returns false if the enrollments are different', () { - final grade = CourseGrade(null, _enrollment); - expect(false, grade == CourseGrade(null, _enrollment.rebuild((b) => b..enrollmentState = 'completed'))); - }); - - test('returns true if the course and enrollment are the same', () { - final grade = CourseGrade(_course, _enrollment); - expect(true, grade == CourseGrade(_course, _enrollment)); - }); - - test('returns true if the course and enrollment are the same and forceAllPeriod is true', () { - final grade = CourseGrade(_course, _enrollment, forceAllPeriods: true); - expect(true, grade == CourseGrade(_course, _enrollment, forceAllPeriods: true)); - }); - - test('returns true if the course and enrollment are the same and forceAllPeriod is false', () { - final grade = CourseGrade(_course, _enrollment, forceAllPeriods: true); - expect(true, grade == CourseGrade(_course, _enrollment, forceAllPeriods: true)); - }); - - test('returns false if the course and enrollment are the same but have different forceAllPeriod', () { - final grade = CourseGrade(_course, _enrollment, forceAllPeriods: true); - expect(false, grade == CourseGrade(_course, _enrollment)); - }); - - test('returns false if the other side is not a course grade', () { - final grade = CourseGrade(null, null); - expect(false, grade == _course); - }); - }); -} diff --git a/apps/flutter_parent/test/models/course_test.dart b/apps/flutter_parent/test/models/course_test.dart deleted file mode 100644 index 6e99de6055..0000000000 --- a/apps/flutter_parent/test/models/course_test.dart +++ /dev/null @@ -1,154 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -import 'package:built_collection/built_collection.dart'; -import 'package:built_value/json_object.dart'; -import 'package:flutter_parent/models/course.dart'; -import 'package:flutter_parent/models/course_grade.dart'; -import 'package:flutter_parent/models/enrollment.dart'; -import 'package:flutter_parent/models/grading_scheme_item.dart'; -import 'package:test/test.dart'; - -void main() { - final _studentId = '123'; - final _gradingPeriodId = '321'; - final _course = Course((b) => b..id = 'course_123'); - final futureDate = DateTime.now().add(Duration(days: 10)); - final pastDate = DateTime.now().subtract(Duration(days: 10)); - final _enrollment = Enrollment((b) => b - ..enrollmentState = 'active' - ..userId = _studentId); - - group('getCourseGrade', () { - test('returns a course grade with the course and enrollment', () { - final grade = _course.getCourseGrade(_studentId, enrollment: _enrollment); - expect(grade, CourseGrade(_course, _enrollment, forceAllPeriods: false)); - }); - - test('returns a course grade with the course and student enrollment', () { - final course = _course.rebuild((b) => b..enrollments = ListBuilder([_enrollment])); - - final grade = course.getCourseGrade(_studentId); - expect(grade, CourseGrade(course, course.enrollments!.first, forceAllPeriods: false)); - }); - - test('returns a course grade with the course and student gradinig period enrollment', () { - final enrollmentInGradingPeriod = _enrollment.rebuild((b) => b..currentGradingPeriodId = _gradingPeriodId); - final course = _course.rebuild((b) => b..enrollments = ListBuilder([_enrollment, enrollmentInGradingPeriod])); - - final grade = course.getCourseGrade(_studentId, gradingPeriodId: _gradingPeriodId); - expect(grade, CourseGrade(course, enrollmentInGradingPeriod, forceAllPeriods: false)); - }); - - test('returns a course grade with the course and student enrollment without grading period', () { - final enrollmentInGradingPeriod = _enrollment.rebuild((b) => b..currentGradingPeriodId = _gradingPeriodId); - final course = _course.rebuild((b) => b..enrollments = ListBuilder([_enrollment, enrollmentInGradingPeriod])); - - // Test the various ways that grading period can not be set - CourseGrade grade = course.getCourseGrade(_studentId); - expect(grade, CourseGrade(course, _enrollment, forceAllPeriods: false)); - - grade = course.getCourseGrade(_studentId, gradingPeriodId: null); - expect(grade, CourseGrade(course, _enrollment, forceAllPeriods: false)); - - grade = course.getCourseGrade(_studentId, gradingPeriodId: ''); - expect(grade, CourseGrade(course, _enrollment, forceAllPeriods: false)); - }); - - test('returns a course grade with the course and no enrollment without matchinig grading period', () { - final course = _course.rebuild((b) => b..enrollments = ListBuilder([_enrollment])); - - // Test the various ways that grading period can not be set - final grade = course.getCourseGrade(_studentId, gradingPeriodId: _gradingPeriodId); - expect(grade, CourseGrade(course, null, forceAllPeriods: false)); - }); - - test('returns a course grade with the course and passed in enrollment when course has matching enrollment', () { - final enrollment = _enrollment.rebuild((b) => b..currentGradingPeriodId = _gradingPeriodId); - final course = _course.rebuild((b) => b..enrollments = ListBuilder([_enrollment])); - - // Test the various ways that grading period can not be set - final grade = course.getCourseGrade(_studentId, enrollment: enrollment); - expect(grade, CourseGrade(course, enrollment, forceAllPeriods: false)); - }); - }); - - group('isValidForCurrentStudent', () { - test('returns true for valid date with valid enrollment', () { - final course = _course.rebuild((b) => b - ..accessRestrictedByDate = false - ..restrictEnrollmentsToCourseDates = true - ..endAt = futureDate - ..enrollments = ListBuilder([_enrollment])); - - final isValid = course.isValidForCurrentStudent(_studentId); - - expect(isValid, isTrue); - }); - - test('returns false for valid date with invalid enrollment', () { - final invalidEnrollment = Enrollment((b) => b - ..enrollmentState = 'active' - ..userId = '789'); - final course = _course.rebuild((b) => b - ..accessRestrictedByDate = false - ..restrictEnrollmentsToCourseDates = true - ..endAt = futureDate - ..enrollments = ListBuilder([invalidEnrollment])); - - final isValid = course.isValidForCurrentStudent(_studentId); - - expect(isValid, isFalse); - }); - }); - - group('gradingScheme', () { - final gradingSchemeBuilder = ListBuilder() - ..add(JsonObject(["A", 0.9])) - ..add(JsonObject(["F", 0.0])); - - final course = _course.rebuild((b) => b..gradingScheme = gradingSchemeBuilder); - - test('returns "F" for 70 percent', () { - expect(course.convertScoreToLetterGrade(70, 100), 'F'); - }); - - test('returns "A" for 90 percent', () { - expect(course.convertScoreToLetterGrade(90, 100), 'A'); - }); - - test('returns empty if max score is 0', () { - expect(course.convertScoreToLetterGrade(10, 0), ''); - }); - - test('returns empty if grading scheme is null or empty', () { - final course = _course.rebuild((b) => b..gradingScheme = null); - expect(course.convertScoreToLetterGrade(10, 0), ''); - }); - - test('grading scheme mapping filters out incorrect items', () { - gradingSchemeBuilder.add(JsonObject("")); - gradingSchemeBuilder.add(JsonObject([1, 0.9])); - gradingSchemeBuilder.add(JsonObject(["C", "3"])); - final course = _course.rebuild((b) => b..gradingScheme = gradingSchemeBuilder); - expect(course.gradingSchemeItems, [ - GradingSchemeItem((b) => b - ..grade = "A" - ..value = 0.9), - GradingSchemeItem((b) => b - ..grade = "F" - ..value = 0.0), - ]); - }); - }); -} diff --git a/apps/flutter_parent/test/models/enrollment_test.dart b/apps/flutter_parent/test/models/enrollment_test.dart deleted file mode 100644 index b7e5a93a34..0000000000 --- a/apps/flutter_parent/test/models/enrollment_test.dart +++ /dev/null @@ -1,94 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -import 'package:flutter_parent/models/enrollment.dart'; -import 'package:test/test.dart'; - -void main() { - final _enrollment = Enrollment((b) => b..enrollmentState = 'active'); - - group('hasActiveGradingPeriod', () { - test('returns false if multipleGradingPeriodsEnabled is false', () { - final enrollment = _enrollment.rebuild((b) => b..multipleGradingPeriodsEnabled = false); - expect(enrollment.hasActiveGradingPeriod(), false); - }); - - test('returns false if currentGradingPeriodId is null', () { - final enrollment = _enrollment.rebuild((b) => b - ..multipleGradingPeriodsEnabled = true - ..currentGradingPeriodId = null); - expect(enrollment.hasActiveGradingPeriod(), false); - }); - - test('returns false if currentGradingPeriodId is empty', () { - final enrollment = _enrollment.rebuild((b) => b - ..multipleGradingPeriodsEnabled = true - ..currentGradingPeriodId = ''); - expect(enrollment.hasActiveGradingPeriod(), false); - }); - - test('returns false if currentGradingPeriodId is 0', () { - final enrollment = _enrollment.rebuild((b) => b - ..multipleGradingPeriodsEnabled = true - ..currentGradingPeriodId = '0'); - expect(enrollment.hasActiveGradingPeriod(), false); - }); - - test('returns true if multipleGradingPeriodsEnabled and currentGradingPeriodId is set', () { - final enrollment = _enrollment.rebuild((b) => b - ..multipleGradingPeriodsEnabled = true - ..currentGradingPeriodId = '123'); - expect(enrollment.hasActiveGradingPeriod(), true); - }); - }); - - group('isTotalsForAllGradingPeriodsEnabled', () { - test('returns false if enrollment is not student or observer', () { - final enrollment = _enrollment.rebuild((b) => b); - expect(enrollment.isTotalsForAllGradingPeriodsEnabled(), false); - }); - - test('returns false if enrollment has multipleGradingPeriodsEnabled false', () { - final enrollment = _enrollment.rebuild((b) => b - ..role = 'student' - ..multipleGradingPeriodsEnabled = false); - expect(enrollment.isTotalsForAllGradingPeriodsEnabled(), false); - }); - - test('returns false if enrollment has totalsForAllGradingPeriodsOption false', () { - final enrollment = _enrollment.rebuild((b) => b - ..role = 'student' - ..multipleGradingPeriodsEnabled = true - ..totalsForAllGradingPeriodsOption = false); - expect(enrollment.isTotalsForAllGradingPeriodsEnabled(), false); - }); - - test('returns false if student enrollment has multipleGradingPeriodsEnabled and totalsForAllGradingPeriodsOption', - () { - final enrollment = _enrollment.rebuild((b) => b - ..role = 'student' - ..multipleGradingPeriodsEnabled = true - ..totalsForAllGradingPeriodsOption = true); - expect(enrollment.isTotalsForAllGradingPeriodsEnabled(), true); - }); - - test('returns false if observer enrollment has multipleGradingPeriodsEnabled and totalsForAllGradingPeriodsOption', - () { - final enrollment = _enrollment.rebuild((b) => b - ..role = 'observer' - ..multipleGradingPeriodsEnabled = true - ..totalsForAllGradingPeriodsOption = true); - expect(enrollment.isTotalsForAllGradingPeriodsEnabled(), true); - }); - }); -} diff --git a/apps/flutter_parent/test/models/media_comment_test.dart b/apps/flutter_parent/test/models/media_comment_test.dart deleted file mode 100644 index b2e0fd084a..0000000000 --- a/apps/flutter_parent/test/models/media_comment_test.dart +++ /dev/null @@ -1,34 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:flutter_parent/models/media_comment.dart'; -import 'package:test/test.dart'; - -void main() { - test('toAttachment returns Attachment with correct properties', () { - final mediaComment = MediaComment((m) => m - ..mediaId = 'mediaId' - ..displayName = 'Display Name' - ..url = 'fake url' - ..mediaType = MediaType.video - ..contentType = 'video/mp4'); - final attachment = mediaComment.toAttachment(); - - expect(attachment.id, 'media-comment-${mediaComment.mediaId}'); - expect(attachment.contentType, mediaComment.contentType); - expect(attachment.filename, mediaComment.mediaId); - expect(attachment.displayName, mediaComment.displayName); - expect(attachment.url, mediaComment.url); - }); -} diff --git a/apps/flutter_parent/test/models/schedule_item_test.dart b/apps/flutter_parent/test/models/schedule_item_test.dart deleted file mode 100644 index 899ee112af..0000000000 --- a/apps/flutter_parent/test/models/schedule_item_test.dart +++ /dev/null @@ -1,257 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:built_collection/built_collection.dart'; -import 'package:flutter_parent/models/assignment.dart'; -import 'package:flutter_parent/models/plannable.dart'; -import 'package:flutter_parent/models/planner_item.dart'; -import 'package:flutter_parent/models/planner_submission.dart'; -import 'package:flutter_parent/models/schedule_item.dart'; -import 'package:flutter_parent/models/submission.dart'; -import 'package:flutter_parent/models/submission_wrapper.dart'; -import 'package:test/test.dart'; - -void main() { - final contextId = '1234'; - final contextType = 'course'; - final courseName = 'hodor'; - final date = DateTime.now(); - - final scheduleItem = ScheduleItem((b) => b - ..id = '' - ..type = ScheduleItem.apiTypeCalendar - ..isAllDay = false - ..isHidden = false - ..effectiveContextCode = '${contextType}_$contextId'); - - final assignment = Assignment((b) => b - ..courseId = '' - ..assignmentGroupId = '' - ..submissionTypes = ListBuilder([SubmissionTypes.onlineUrl]) - ..position = 0 - ..id = '123'); - - final submission = Submission((b) => b - ..assignmentId = '123' - ..userId = '123'); - - group('context helpers', () { - test('returns a valid id for getContextId', () { - final result = scheduleItem.getContextId(); - - expect(result, contextId); - }); - - test('returns a valid context type for getContextType', () { - final result = scheduleItem.getContextType(); - - expect(result, contextType); - }); - - test('returns a valid id for getContextId when effectiveContextCode is null', () { - final newContextId = 'hodor'; - final item = scheduleItem.rebuild((b) => b - ..contextCode = '${contextType}_$newContextId' - ..effectiveContextCode = null); - - final result = item.getContextId(); - - expect(result, newContextId); - }); - - test('returns a valid context type for getContextType when effectiveContextCode is null', () { - final newContextType = 'group'; - final item = scheduleItem.rebuild((b) => b - ..contextCode = '${newContextType}_$contextId' - ..effectiveContextCode = null); - - final result = item.getContextType(); - - expect(result, newContextType); - }); - }); - - group('Item type helpers', () { - test('type of ScheduleItem.apiTypeCalendar results in event type', () { - final result = scheduleItem.getItemType(); - - expect(result, ScheduleItemType.event); - }); - - test('assignment.isQuiz results in quiz type', () { - final newAssignment = assignment.rebuild((b) => b..submissionTypes = ListBuilder([SubmissionTypes.onlineQuiz])); - final item = scheduleItem.rebuild((b) => b - ..type = ScheduleItem.apiTypeAssignment - ..assignment = newAssignment.toBuilder()); - final result = item.getItemType(); - - expect(result, ScheduleItemType.quiz); - }); - - test('assignment.isDiscussion results in discussion type', () { - final newAssignment = - assignment.rebuild((b) => b..submissionTypes = ListBuilder([SubmissionTypes.discussionTopic])); - final item = scheduleItem.rebuild((b) => b - ..type = ScheduleItem.apiTypeAssignment - ..assignment = newAssignment.toBuilder()); - final result = item.getItemType(); - - expect(result, ScheduleItemType.discussion); - }); - - test('else, results in an assignment type', () { - final item = scheduleItem.rebuild((b) => b - ..type = ScheduleItem.apiTypeAssignment - ..assignment = assignment.toBuilder()); - final result = item.getItemType(); - - expect(result, ScheduleItemType.assignment); - }); - - test('type of ScheduleItem.apiTypeCalendar results in event type string', () { - final result = scheduleItem.getItemTypeAsString(); - - expect(result, ScheduleItem.scheduleTypeEvent); - }); - - test('assignment.isQuiz results in quiz type string', () { - final newAssignment = assignment.rebuild((b) => b..submissionTypes = ListBuilder([SubmissionTypes.onlineQuiz])); - final item = scheduleItem.rebuild((b) => b - ..type = ScheduleItem.apiTypeAssignment - ..assignment = newAssignment.toBuilder()); - final result = item.getItemTypeAsString(); - - expect(result, ScheduleItem.scheduleTypeQuiz); - }); - - test('assignment.isDiscussion results in discussion type string', () { - final newAssignment = - assignment.rebuild((b) => b..submissionTypes = ListBuilder([SubmissionTypes.discussionTopic])); - final item = scheduleItem.rebuild((b) => b - ..type = ScheduleItem.apiTypeAssignment - ..assignment = newAssignment.toBuilder()); - final result = item.getItemTypeAsString(); - - expect(result, ScheduleItem.scheduleTypeDiscussion); - }); - - test('else, results in an assignment type string', () { - final item = scheduleItem.rebuild((b) => b - ..type = ScheduleItem.apiTypeAssignment - ..assignment = assignment.toBuilder()); - final result = item.getItemTypeAsString(); - - expect(result, ScheduleItem.apiTypeAssignment); - }); - }); - - group('Planner Item Conversion', () { - test('PlannerSubmission returns null for null assignment', () { - final item = scheduleItem.rebuild((b) => b..assignment = null); - - final result = item.getPlannerSubmission(); - - expect(result, isNull); - }); - - test('PlannerSubmission returns submitted false for null submission', () { - final newAssignment = - assignment.rebuild((b) => b..submissionWrapper = SubmissionWrapper((b) => b..submission = null).toBuilder()); - - final item = scheduleItem.rebuild((b) => b..assignment = newAssignment.toBuilder()); - - final result = item.getPlannerSubmission(); - - expect(result, isNotNull); - expect(result!.submitted, isFalse); - }); - - test('returns valid PlannerSubmission for valid submission', () { - final newAssignment = assignment.rebuild( - (b) => b..submissionWrapper = SubmissionWrapper((b) => b..submission = submission.toBuilder()).toBuilder()); - - final item = scheduleItem.rebuild((b) => b..assignment = newAssignment.toBuilder()); - - final result = item.getPlannerSubmission(); - final expectedPlannerSubmission = PlannerSubmission((b) => b - ..submitted = submission.submittedAt != null - ..excused = submission.excused - ..graded = submission.isGraded() - ..late = submission.isLate - ..missing = submission.missing); - - expect(result, isNotNull); - expect(result, expectedPlannerSubmission); - }); - - test('returns valid PlannerItem for valid scheduleItem', () { - final newAssignment = assignment.rebuild((b) => b - ..pointsPossible = 20.0 - ..dueAt = date - ..submissionWrapper = SubmissionWrapper((b) => b..submission = submission.toBuilder()).toBuilder()); - - final item = scheduleItem.rebuild((b) => b - ..effectiveContextCode = '${contextType}_$contextId' - ..startAt = date - ..htmlUrl = '' - ..title = 'hodor' - ..assignment = newAssignment.toBuilder()); - - final result = item.toPlannerItem(courseName); - final plannable = Plannable((b) => b - ..id = item.id - ..title = item.title - ..pointsPossible = newAssignment.pointsPossible - ..dueAt = newAssignment.dueAt - ..assignmentId = newAssignment.id); - final expectedResult = PlannerItem((b) => b - ..courseId = contextId - ..contextType = contextType - ..contextName = courseName - ..plannableType = ScheduleItem.scheduleTypeEvent - ..plannable = plannable.toBuilder() - ..plannableDate = item.startAt - ..htmlUrl = item.htmlUrl - ..submissionStatus = item.getPlannerSubmission()?.toBuilder()); - - expect(result, isNotNull); - expect(result, expectedResult); - }); - - test('returns valid PlannerItem for valid scheduleItem with null assignment', () { - final item = scheduleItem.rebuild((b) => b - ..effectiveContextCode = '${contextType}_$contextId' - ..startAt = date - ..htmlUrl = '' - ..title = 'hodor'); - - final result = item.toPlannerItem(courseName); - final plannable = Plannable((b) => b - ..id = item.id - ..title = item.title); - final expectedResult = PlannerItem((b) => b - ..courseId = contextId - ..contextType = contextType - ..contextName = courseName - ..plannableType = ScheduleItem.scheduleTypeEvent - ..plannable = plannable.toBuilder() - ..plannableDate = item.startAt - ..htmlUrl = item.htmlUrl - ..submissionStatus = item.getPlannerSubmission()?.toBuilder()); - - expect(result, isNotNull); - expect(result, expectedResult); - }); - }); -} diff --git a/apps/flutter_parent/test/models/submission_test.dart b/apps/flutter_parent/test/models/submission_test.dart deleted file mode 100644 index 8da11dbdc4..0000000000 --- a/apps/flutter_parent/test/models/submission_test.dart +++ /dev/null @@ -1,58 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -import 'package:flutter_parent/models/submission.dart'; -import 'package:test/test.dart'; - -void main() { - const String studentId = '1337'; - - group('isGraded', () { - test('returns false if there is not a grade', () { - final submission = Submission((b) => b - ..assignmentId = '' - ..grade = null - ..userId = studentId); - expect(submission.isGraded(), false); - }); - - test('returns false if the workflow is pending_review', () { - final submission = Submission((b) => b - ..assignmentId = '' - ..grade = 'a' - ..workflowState = 'pending_review' - ..userId = studentId); - expect(submission.isGraded(), false); - }); - - test('returns false if there is not a postedAt', () { - final submission = Submission((b) => b - ..assignmentId = '' - ..grade = 'a' - ..workflowState = 'graded' - ..postedAt = null - ..userId = studentId); - expect(submission.isGraded(), false); - }); - - test('returns true if all reqiured fields are set', () { - final submission = Submission((b) => b - ..assignmentId = '' - ..grade = 'a' - ..workflowState = 'graded' - ..postedAt = DateTime.now() - ..userId = studentId); - expect(submission.isGraded(), true); - }); - }); -} diff --git a/apps/flutter_parent/test/models/submission_wrapper_test.dart b/apps/flutter_parent/test/models/submission_wrapper_test.dart deleted file mode 100644 index 38fcf6c074..0000000000 --- a/apps/flutter_parent/test/models/submission_wrapper_test.dart +++ /dev/null @@ -1,94 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'dart:convert'; - -import 'package:built_collection/built_collection.dart'; -import 'package:flutter_parent/models/serializers.dart'; -import 'package:flutter_parent/models/submission.dart'; -import 'package:flutter_parent/models/submission_wrapper.dart'; -import 'package:test/test.dart'; - -void main() { - final id1 = '123'; - final submission1 = Submission((b) => b - ..id = '$id1' - ..assignmentId = '$id1' - ..userId = '$id1' - ..missing = true); - final submissionString1 = '''{ - "id": "$id1", - "assignment_id": "$id1", - "user_id": "$id1", - "missing": true - }'''; - - final submissionString1round2 = - '''{id: 123, score: 0.0, attempt: 0, submission_history: [], grade_matches_current_submission: false, late: false, excused: false, missing: true, assignment_id: 123, user_id: 123, grader_id: , entered_score: 0.0, grade: null, submitted_at: null, commentCreated: null, mediaContentType: null, mediaCommentUrl: null, mediaCommentDisplay: null, body: null, workflow_state: null, submission_type: null, preview_url: null, url: null, assignment: null, user: null, points_deducted: null, entered_grade: null, posted_at: null}'''; - - final id2 = '456'; - final submission2 = Submission((b) => b - ..id = '$id2' - ..assignmentId = '$id2' - ..userId = '$id2' - ..missing = true); - final submissionString2 = '''{ - "id": "$id2", - "assignment_id": "$id2", - "user_id": "$id2", - "missing": true - }'''; - - final submissionString2round2 = - '''{id: 456, score: 0.0, attempt: 0, submission_history: [], grade_matches_current_submission: false, late: false, excused: false, missing: true, assignment_id: 456, user_id: 456, grader_id: , entered_score: 0.0, grade: null, submitted_at: null, commentCreated: null, mediaContentType: null, mediaCommentUrl: null, mediaCommentDisplay: null, body: null, workflow_state: null, submission_type: null, preview_url: null, url: null, assignment: null, user: null, points_deducted: null, entered_grade: null, posted_at: null}'''; - - group('deserialize', () { - test('Single submission', () { - final encodedJson = jsonDecode(submissionString2); - - SubmissionWrapper? submissionWrapper = jsonSerializers.deserializeWith(SubmissionWrapper.serializer, encodedJson); - - expect(submissionWrapper?.submission, equals(submission2)); - expect(submissionWrapper?.submissionList, isNull); - }); - - test('List of submissions', () { - final jsonArray = '[$submissionString1, $submissionString2]'; - final encodedJson = jsonDecode(jsonArray); - print(encodedJson.toString()); - - SubmissionWrapper? submissionWrapper = jsonSerializers.deserializeWith(SubmissionWrapper.serializer, encodedJson); - - expect(submissionWrapper?.submission, isNull); - expect(submissionWrapper?.submissionList, equals([submission1, submission2])); - }); - }); - - group('serialize', () { - test('Single submission', () { - final submissionWrapper = SubmissionWrapper((b) => b..submission = submission1.toBuilder()); - final jsonValue = jsonSerializers.serializeWith(SubmissionWrapper.serializer, submissionWrapper); - - expect(jsonValue.toString(), equals('{submission: $submissionString1round2}')); - }); - - test('List of submissions', () { - final submissionWrapper = SubmissionWrapper( - (b) => b..submissionList = BuiltList.from([submission1, submission2]).toBuilder()); - final jsonValue = jsonSerializers.serializeWith(SubmissionWrapper.serializer, submissionWrapper); - - expect(jsonValue.toString(), equals('{submission: [$submissionString1round2, $submissionString2round2]}')); - }); - }); -} diff --git a/apps/flutter_parent/test/network/analytics_observer_test.dart b/apps/flutter_parent/test/network/analytics_observer_test.dart deleted file mode 100644 index 56465151b0..0000000000 --- a/apps/flutter_parent/test/network/analytics_observer_test.dart +++ /dev/null @@ -1,147 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -import 'package:flutter/material.dart'; -import 'package:flutter_parent/network/utils/analytics.dart'; -import 'package:flutter_parent/network/utils/analytics_observer.dart'; -import 'package:flutter_parent/router/panda_router.dart'; -import 'package:mockito/mockito.dart'; -import 'package:test/test.dart'; - -import '../utils/test_app.dart'; -import '../utils/test_helpers/mock_helpers.dart'; -import '../utils/test_helpers/mock_helpers.mocks.dart'; - -void main() { - final observer = AnalyticsObserver(); - final analytics = MockAnalytics(); - - setUpAll(() { - PandaRouter.init(); // Initialize the router so when we matches are found it works as expected - setupTestLocator((locator) { - locator.registerLazySingleton(() => analytics); - }); - }); - - setUp(() { - reset(analytics); - }); - - group('didPop', () { - test('logs analytics with a PageRoute', () { - final screenName = '/courses/:courseId'; - final courseId = '1234'; - final settings = RouteSettings(name: PandaRouter.courseDetails(courseId)); - - observer.didPop( - MaterialPageRoute(builder: (_) => Container()), - MaterialPageRoute(builder: (_) => Container(), settings: settings), - ); - - verify(analytics.setCurrentScreen(screenName)); - verify(analytics.logMessage('Pushing widget: $screenName with params: {courseId: [$courseId]}')); - }); - - test('does not log analytics with a non PageRoute', () { - observer.didPop( - _NonPageRoute(), - _NonPageRoute(), - ); - - verifyNever(analytics.setCurrentScreen(any)); - verifyNever(analytics.logMessage(any)); - }); - }); - - group('didReplace', () { - test('logs analytics with a PageRoute', () { - final screenName = '/courses/:courseId'; - final courseId = '1234'; - final settings = RouteSettings(name: PandaRouter.courseDetails(courseId)); - - observer.didReplace(newRoute: MaterialPageRoute(builder: (_) => Container(), settings: settings)); - - verify(analytics.setCurrentScreen(screenName)); - verify(analytics.logMessage('Pushing widget: $screenName with params: {courseId: [$courseId]}')); - }); - - test('does not log analytics with a non PageRoute', () { - observer.didReplace( - newRoute: _NonPageRoute(), - oldRoute: MaterialPageRoute(builder: (_) => Container()), - ); - - verifyNever(analytics.setCurrentScreen(any)); - verifyNever(analytics.logMessage(any)); - }); - }); - - group('didPush', () { - test('logs analytics with a PageRoute', () { - final screenName = '/courses/:courseId'; - final courseId = '1234'; - final settings = RouteSettings(name: PandaRouter.courseDetails(courseId)); - - observer.didPush( - MaterialPageRoute(builder: (_) => Container(), settings: settings), - MaterialPageRoute(builder: (_) => Container()), - ); - - verify(analytics.setCurrentScreen(screenName)); - verify(analytics.logMessage('Pushing widget: $screenName with params: {courseId: [$courseId]}')); - }); - - test('does not log analytics with a non PageRoute', () { - observer.didPush( - _NonPageRoute(), - MaterialPageRoute(builder: (_) => Container()), - ); - - verifyNever(analytics.setCurrentScreen(any)); - verifyNever(analytics.logMessage(any)); - }); - }); - - test('does not log analytics with a non null route name', () { - observer.didPush( - MaterialPageRoute(builder: (_) => Container(), settings: RouteSettings()), - MaterialPageRoute(builder: (_) => Container()), - ); - - verifyNever(analytics.setCurrentScreen(any)); - verifyNever(analytics.logMessage(any)); - }); -} - -class _NonPageRoute extends ModalRoute { - @override - bool get opaque => false; - - @override - Color? get barrierColor => null; - - @override - bool get maintainState => false; - - @override - String? get barrierLabel => null; - - @override - bool get barrierDismissible => false; - - @override - Duration get transitionDuration => Duration.zero; - - @override - Widget buildPage(BuildContext context, Animation animation, Animation secondaryAnimation) => Container(); -} diff --git a/apps/flutter_parent/test/network/api_prefs_test.dart b/apps/flutter_parent/test/network/api_prefs_test.dart deleted file mode 100644 index bbae30e5a1..0000000000 --- a/apps/flutter_parent/test/network/api_prefs_test.dart +++ /dev/null @@ -1,491 +0,0 @@ -// Copyright (C) 2019 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'dart:convert'; -import 'dart:ui'; - -import 'package:encrypted_shared_preferences/encrypted_shared_preferences.dart'; -import 'package:flutter_parent/models/login.dart'; -import 'package:flutter_parent/models/reminder.dart'; -import 'package:flutter_parent/models/serializers.dart'; -import 'package:flutter_parent/models/user.dart'; -import 'package:flutter_parent/network/api/auth_api.dart'; -import 'package:flutter_parent/network/utils/api_prefs.dart'; -import 'package:flutter_parent/utils/db/calendar_filter_db.dart'; -import 'package:flutter_parent/utils/db/reminder_db.dart'; -import 'package:flutter_parent/utils/notification_util.dart'; -import 'package:flutter_test/flutter_test.dart'; -import 'package:mockito/mockito.dart'; -import 'package:package_info_plus/package_info_plus.dart'; -import 'package:shared_preferences/shared_preferences.dart'; - -import '../utils/canvas_model_utils.dart'; -import '../utils/platform_config.dart'; -import '../utils/test_app.dart'; -import '../utils/test_helpers/mock_helpers.dart'; -import '../utils/test_helpers/mock_helpers.mocks.dart'; - -void main() { - tearDown(() { - ApiPrefs.clean(); - }); - - test('is logged in returns false', () async { - await setupPlatformChannels(); - expect(ApiPrefs.isLoggedIn(), false); - }); - - test('is logged in returns false with no login uuid', () async { - var login = Login((b) => b - ..domain = 'domain' - ..accessToken = 'token' - ..user = CanvasModelTestUtils.mockUser().toBuilder()); - await setupPlatformChannels(config: PlatformConfig()); - await ApiPrefs.addLogin(login); - - expect(ApiPrefs.isLoggedIn(), false); - }); - - test('is logged in returns false with no valid uuid but no matching login', () async { - var login = Login((b) => b - ..uuid = 'uuid' - ..domain = 'domain' - ..accessToken = 'token' - ..user = CanvasModelTestUtils.mockUser().toBuilder()); - await setupPlatformChannels(config: PlatformConfig(mockApiPrefs: {ApiPrefs.KEY_CURRENT_LOGIN_UUID: 'other_uuid'})); - await ApiPrefs.addLogin(login); - - expect(ApiPrefs.isLoggedIn(), false); - }); - - test('is logged in returns true with a valid uuid and matching login', () async { - var login = Login((b) => b - ..domain = 'domain' - ..accessToken = 'token' - ..user = CanvasModelTestUtils.mockUser().toBuilder()); - await setupPlatformChannels(config: PlatformConfig(mockApiPrefs: {ApiPrefs.KEY_CURRENT_LOGIN_UUID: login.uuid})); - await ApiPrefs.addLogin(login); - - expect(ApiPrefs.isLoggedIn(), true); - }); - - test('is logged in returns false with an empty token', () async { - var login = Login((b) => b - ..domain = 'domain' - ..accessToken = '' - ..user = CanvasModelTestUtils.mockUser().toBuilder()); - await setupPlatformChannels(config: PlatformConfig(mockApiPrefs: {ApiPrefs.KEY_CURRENT_LOGIN_UUID: login.uuid})); - await ApiPrefs.addLogin(login); - - expect(ApiPrefs.isLoggedIn(), false); - }); - - test('is logged in returns false with an empty domain', () async { - var login = Login((b) => b - ..domain = '' - ..accessToken = 'token' - ..user = CanvasModelTestUtils.mockUser().toBuilder()); - await setupPlatformChannels(config: PlatformConfig(mockApiPrefs: {ApiPrefs.KEY_CURRENT_LOGIN_UUID: login.uuid})); - await ApiPrefs.addLogin(login); - - expect(ApiPrefs.isLoggedIn(), false); - }); - - test('getApiUrl returns the domain with the api path added', () async { - var login = Login((b) => b - ..domain = 'domain' - ..user = CanvasModelTestUtils.mockUser().toBuilder()); - await setupPlatformChannels(config: PlatformConfig(mockApiPrefs: {ApiPrefs.KEY_CURRENT_LOGIN_UUID: login.uuid})); - await ApiPrefs.addLogin(login); - - expect(ApiPrefs.getApiUrl(), 'domain/api/v1/'); - }); - - test('switchLogins updates current login data', () async { - await setupPlatformChannels(); - - Login user = Login((b) => b - ..accessToken = 'token' - ..refreshToken = 'refresh' - ..domain = 'domain' - ..clientId = 'clientId' - ..clientSecret = 'clientSecret' - ..user = CanvasModelTestUtils.mockUser().toBuilder()); - - ApiPrefs.switchLogins(user); - - expect(ApiPrefs.getAuthToken(), user.accessToken); - expect(ApiPrefs.getRefreshToken(), user.refreshToken); - expect(ApiPrefs.getDomain(), user.domain); - expect(ApiPrefs.getClientId(), user.clientId); - expect(ApiPrefs.getClientSecret(), user.clientSecret); - expect(ApiPrefs.getUser(), user.user); - }); - - test('perform logout clears out data', () async { - var login = Login((b) => b - ..domain = 'domain' - ..accessToken = 'accessToken' - ..refreshToken = 'refreshToken' - ..user = CanvasModelTestUtils.mockUser().toBuilder()); - - await setupPlatformChannels( - config: PlatformConfig( - mockApiPrefs: {ApiPrefs.KEY_CURRENT_LOGIN_UUID: login.uuid}, - )); - await ApiPrefs.addLogin(login); - - expect(ApiPrefs.getDomain(), login.domain); - expect(ApiPrefs.getAuthToken(), login.accessToken); - expect(ApiPrefs.getRefreshToken(), login.refreshToken); - expect(ApiPrefs.getCurrentLoginUuid(), login.uuid); - - await ApiPrefs.performLogout(switchingLogins: true); - - expect(ApiPrefs.getDomain(), null); - expect(ApiPrefs.getAuthToken(), null); - expect(ApiPrefs.getRefreshToken(), null); - expect(ApiPrefs.getCurrentLoginUuid(), null); - }); - - test('perform logout clears out reminders and calendar filters, and deletes auth token', () async { - final reminderDb = MockReminderDb(); - final calendarFilterDb = MockCalendarFilterDb(); - final notificationUtil = MockNotificationUtil(); - final authApi = MockAuthApi(); - setupTestLocator((locator) { - locator.registerLazySingleton(() => reminderDb); - locator.registerLazySingleton(() => authApi); - locator.registerLazySingleton(() => calendarFilterDb); - locator.registerLazySingleton(() => notificationUtil); - }); - - final reminder = Reminder((b) => b..id = 1234); - when(reminderDb.getAllForUser(any, any)).thenAnswer((_) async => [reminder]); - - var login = Login((b) => b - ..domain = 'domain' - ..accessToken = 'accessToken' - ..refreshToken = 'refreshToken' - ..user = CanvasModelTestUtils.mockUser().toBuilder()); - - await setupPlatformChannels( - config: PlatformConfig( - mockApiPrefs: {ApiPrefs.KEY_CURRENT_LOGIN_UUID: login.uuid}, - )); - await ApiPrefs.addLogin(login); - await ApiPrefs.performLogout(switchingLogins: false); - - verify(reminderDb.getAllForUser(login.domain, login.user.id)); - verify(notificationUtil.deleteNotifications([reminder.id!])); - verify(reminderDb.deleteAllForUser(login.domain, login.user.id)); - verify(calendarFilterDb.deleteAllForUser(login.domain, login.user.id)); - verify(authApi.deleteToken(login.domain, login.accessToken)); - }); - - test('isMasquerading returns false if not masquerading', () async { - final login = Login(); - await setupPlatformChannels(config: PlatformConfig(mockApiPrefs: {ApiPrefs.KEY_CURRENT_LOGIN_UUID: login.uuid})); - await ApiPrefs.addLogin(login); - - expect(ApiPrefs.isMasquerading(), isFalse); - }); - - test('isMasquerading returns true if masquerading', () async { - final login = Login((b) => b - ..masqueradeDomain = 'masqueradeDomain' - ..masqueradeUser = CanvasModelTestUtils.mockUser().toBuilder()); - await setupPlatformChannels(config: PlatformConfig(mockApiPrefs: {ApiPrefs.KEY_CURRENT_LOGIN_UUID: login.uuid})); - await ApiPrefs.addLogin(login); - - expect(ApiPrefs.isMasquerading(), isTrue); - }); - - test('setting user updates stored user', () async { - final login = Login(); - await setupPlatformChannels(config: PlatformConfig(mockApiPrefs: {ApiPrefs.KEY_CURRENT_LOGIN_UUID: login.uuid})); - await ApiPrefs.addLogin(login); - - final user = CanvasModelTestUtils.mockUser(); - await ApiPrefs.setUser(user); - - expect(ApiPrefs.getUser(), user); - }); - - test('setting user updates stored masqueradeUser if masquerading', () async { - final login = Login((b) => b - ..masqueradeDomain = 'masqueradeDomain' - ..masqueradeUser = CanvasModelTestUtils.mockUser().toBuilder()); - await setupPlatformChannels(config: PlatformConfig(mockApiPrefs: {ApiPrefs.KEY_CURRENT_LOGIN_UUID: login.uuid})); - await ApiPrefs.addLogin(login); - - final user = CanvasModelTestUtils.mockUser(); - await ApiPrefs.setUser(user); - - expect(ApiPrefs.getCurrentLogin()?.masqueradeUser, user); - }); - - test('setting user updates with new locale rebuilds the app', () async { - final login = Login(); - await setupPlatformChannels(config: PlatformConfig(mockApiPrefs: {ApiPrefs.KEY_CURRENT_LOGIN_UUID: login.uuid})); - - expect(ApiPrefs.getUser(), null); - - await ApiPrefs.addLogin(login); - - final user = CanvasModelTestUtils.mockUser(); - final app = _MockApp(); - await ApiPrefs.setUser(user, app: app); - - verify(app.rebuild(any)).called(1); - }); - - test('effectiveLocale returns the devices locale', () async { - await setupPlatformChannels(); - - final deviceLocale = window.locale.toLanguageTag(); - - final localeParts = deviceLocale.split('-'); - expect(ApiPrefs.effectiveLocale(), Locale(localeParts.first, localeParts.last)); - }); - - test('effectiveLocale returns the users effective locale', () async { - final login = Login(); - await setupPlatformChannels(config: PlatformConfig(mockApiPrefs: {ApiPrefs.KEY_CURRENT_LOGIN_UUID: login.uuid})); - await ApiPrefs.addLogin(login); - - final user = CanvasModelTestUtils.mockUser(); - await ApiPrefs.setUser(user); - - expect(ApiPrefs.effectiveLocale(), Locale(user.effectiveLocale!)); - }); - - test('effectiveLocale returns the users locale if effective locale is null', () async { - final login = Login(); - await setupPlatformChannels(config: PlatformConfig(mockApiPrefs: {ApiPrefs.KEY_CURRENT_LOGIN_UUID: login.uuid})); - await ApiPrefs.addLogin(login); - - final user = CanvasModelTestUtils.mockUser().rebuild((b) => b - ..effectiveLocale = null - ..locale = 'jp'); - - await ApiPrefs.setUser(user); - - expect(ApiPrefs.effectiveLocale(), Locale(user.locale!)); - }); - - test('effectiveLocale returns the users effective locale without inst if script is longer than 5', () async { - final login = Login(); - await setupPlatformChannels(config: PlatformConfig(mockApiPrefs: {ApiPrefs.KEY_CURRENT_LOGIN_UUID: login.uuid})); - await ApiPrefs.addLogin(login); - - final user = CanvasModelTestUtils.mockUser().rebuild((b) => b..effectiveLocale = 'en-AU-x-unimelb'); - - await ApiPrefs.setUser(user); - - expect( - ApiPrefs.effectiveLocale(), Locale.fromSubtags(languageCode: 'en', countryCode: 'AU', scriptCode: 'unimelb')); - }); - - test('effectiveLocale returns the users effective locale with inst if script is less than 5', () async { - final login = Login(); - await setupPlatformChannels(config: PlatformConfig(mockApiPrefs: {ApiPrefs.KEY_CURRENT_LOGIN_UUID: login.uuid})); - await ApiPrefs.addLogin(login); - - final user = CanvasModelTestUtils.mockUser().rebuild((b) => b..effectiveLocale = 'en-GB-x-ukhe'); - - await ApiPrefs.setUser(user); - - expect( - ApiPrefs.effectiveLocale(), Locale.fromSubtags(languageCode: 'en', countryCode: 'GB', scriptCode: 'instukhe')); - }); - - test('getUser returns null', () async { - await setupPlatformChannels(); - expect(ApiPrefs.getUser(), null); - }); - - test('getUser returns masquerade user if masquerading', () async { - final masqueradeUser = CanvasModelTestUtils.mockUser(); - final login = Login((b) => b - ..masqueradeDomain = 'masqueradeDomain' - ..masqueradeUser = masqueradeUser.toBuilder()); - await setupPlatformChannels(config: PlatformConfig(initLoggedInUser: login)); - - expect(ApiPrefs.getUser(), masqueradeUser); - }); - - test('getDomain returns masquerade domain if masquerading', () async { - final masqueradeDomain = 'masqueradeDomain'; - final login = Login((b) => b - ..domain = 'domain' - ..masqueradeDomain = masqueradeDomain - ..masqueradeUser = CanvasModelTestUtils.mockUser().toBuilder()); - await setupPlatformChannels(config: PlatformConfig(mockApiPrefs: {ApiPrefs.KEY_CURRENT_LOGIN_UUID: login.uuid})); - await ApiPrefs.addLogin(login); - - expect(ApiPrefs.getDomain(), masqueradeDomain); - }); - - test('getHeaderMap returns a map with the accept-language from prefs', () async { - final login = Login(); - await setupPlatformChannels(config: PlatformConfig(mockApiPrefs: {ApiPrefs.KEY_CURRENT_LOGIN_UUID: login.uuid})); - await ApiPrefs.addLogin(login); - - final user = CanvasModelTestUtils.mockUser().rebuild((b) => b..effectiveLocale = 'en-US'); - await ApiPrefs.setUser(user); - - expect(ApiPrefs.getHeaderMap()['accept-language'], 'en,US'); - }); - - test('getHeaderMap returns a map with the accept-language from device', () async { - final login = Login(); - await setupPlatformChannels(config: PlatformConfig(mockApiPrefs: {ApiPrefs.KEY_CURRENT_LOGIN_UUID: login.uuid})); - await ApiPrefs.addLogin(login); - - final deviceLocale = window.locale; - final user = CanvasModelTestUtils.mockUser().rebuild((b) => b..effectiveLocale = 'ar'); - await ApiPrefs.setUser(user); - - expect(ApiPrefs.getHeaderMap(forceDeviceLanguage: true)['accept-language'], - deviceLocale.toLanguageTag().replaceAll('-', ',')); - }); - - test('getHeaderMap returns a map with the token from prefs', () async { - var login = Login((b) => b - ..accessToken = 'token' - ..user = CanvasModelTestUtils.mockUser().toBuilder()); - await setupPlatformChannels(config: PlatformConfig(mockApiPrefs: {ApiPrefs.KEY_CURRENT_LOGIN_UUID: login.uuid})); - await ApiPrefs.addLogin(login); - - expect(ApiPrefs.getHeaderMap()['Authorization'], 'Bearer token'); - }); - - test('getHeaderMap returns a map with the token passed in', () async { - var login = Login((b) => b - ..accessToken = 'token' - ..user = CanvasModelTestUtils.mockUser().toBuilder()); - await setupPlatformChannels(config: PlatformConfig(mockApiPrefs: {ApiPrefs.KEY_CURRENT_LOGIN_UUID: login.uuid})); - await ApiPrefs.addLogin(login); - - expect(ApiPrefs.getHeaderMap(token: 'other token')['Authorization'], 'Bearer other token'); - }); - - test('getHeaderMap returns a map with the correct user-agent from prefs', () async { - await setupPlatformChannels(); - var info = await PackageInfo.fromPlatform(); - var userAgent = 'androidParent/${info.version} (${info.buildNumber})'; - - expect(ApiPrefs.getUserAgent(), userAgent); - expect(ApiPrefs.getHeaderMap()['User-Agent'], ApiPrefs.getUserAgent()); - }); - - test('getHeaderMap returns a map with the extra headers passed in', () async { - await setupPlatformChannels(); - - final map = {'key': 'value'}; - - expect(ApiPrefs.getHeaderMap(extraHeaders: map)['key'], 'value'); - }); - - test('gets and sets hasMigrated', () async { - await setupPlatformChannels(); - await ApiPrefs.setHasMigrated(true); - - expect(ApiPrefs.getHasMigrated(), isTrue); - }); - - test('gets and sets selected student', () async { - await setupPlatformChannels(); - User user = CanvasModelTestUtils.mockUser(); - await ApiPrefs.setCurrentStudent(user); - - expect(ApiPrefs.getCurrentStudent(), user); - }); - - test('gets and sets camera count', () async { - await setupPlatformChannels(); - final count = 2; - await ApiPrefs.setCameraCount(count); - - expect(ApiPrefs.getCameraCount(), count); - }); - - test('migrates old prefs to encrypted prefs', () async { - // Setup platform channels with minimal configuration - setupPlatformChannels(config: PlatformConfig(mockApiPrefs: null)); - - // Values - final logins = List.generate(3, (i) { - return Login((b) => b - ..user = CanvasModelTestUtils.mockUser(id: i.toString(), name: 'Test Login $i').toBuilder() - ..accessToken = 'access_$i' - ..refreshToken = 'refresh_$i' - ..clientSecret = 'client_secret' - ..clientId = 'client_id' - ..domain = 'domain' - ..uuid = i.toString()); - }); - final hasMigrated = true; - final hasCheckedOldReminders = true; - final currentLoginId = '123'; - final currentStudent = CanvasModelTestUtils.mockUser(); - - // Setup - final config = PlatformConfig(mockPrefs: { - ApiPrefs.KEY_LOGINS: logins.map((it) => json.encode(serialize(it))).toList(), - ApiPrefs.KEY_HAS_MIGRATED: hasMigrated, - ApiPrefs.KEY_HAS_CHECKED_OLD_REMINDERS: hasCheckedOldReminders, - ApiPrefs.KEY_CURRENT_LOGIN_UUID: currentLoginId, - ApiPrefs.KEY_CURRENT_STUDENT: json.encode(serialize(currentStudent)), - }); - - SharedPreferences.setMockInitialValues(config.mockPrefs!); - EncryptedSharedPreferences.setMockInitialValues({}); - - final oldPrefs = await SharedPreferences.getInstance(); - final encryptedPrefs = await EncryptedSharedPreferences.getInstance(); - - // Old prefs should not be null - expect( - oldPrefs.getStringList(ApiPrefs.KEY_LOGINS)!.map((it) => deserialize(json.decode(it))).toList(), logins); - expect(oldPrefs.getBool(ApiPrefs.KEY_HAS_MIGRATED), hasMigrated); - expect(oldPrefs.getBool(ApiPrefs.KEY_HAS_CHECKED_OLD_REMINDERS), hasCheckedOldReminders); - expect(oldPrefs.getString(ApiPrefs.KEY_CURRENT_LOGIN_UUID), currentLoginId); - expect(deserialize(json.decode(oldPrefs.get(ApiPrefs.KEY_CURRENT_STUDENT) as String)), currentStudent); - - // Actually do the test, init api prefs so we get the migration - await ApiPrefs.init(); - - // encryptedPrefs should be not null - expect(encryptedPrefs.getStringList(ApiPrefs.KEY_LOGINS).map((it) => deserialize(json.decode(it))).toList(), logins); - expect(encryptedPrefs.getBool(ApiPrefs.KEY_HAS_MIGRATED), hasMigrated); - expect(encryptedPrefs.getBool(ApiPrefs.KEY_HAS_CHECKED_OLD_REMINDERS), hasCheckedOldReminders); - expect(encryptedPrefs.getString(ApiPrefs.KEY_CURRENT_LOGIN_UUID), currentLoginId); - expect(deserialize(json.decode(encryptedPrefs.get(ApiPrefs.KEY_CURRENT_STUDENT))), currentStudent); - - // Old prefs should be cleared out - expect(oldPrefs.get(ApiPrefs.KEY_LOGINS), isNull); - expect(oldPrefs.get(ApiPrefs.KEY_HAS_MIGRATED), isNull); - expect(oldPrefs.get(ApiPrefs.KEY_HAS_CHECKED_OLD_REMINDERS), isNull); - expect(oldPrefs.get(ApiPrefs.KEY_CURRENT_LOGIN_UUID), isNull); - expect(oldPrefs.get(ApiPrefs.KEY_CURRENT_STUDENT), isNull); - }); -} - -abstract class _Rebuildable { - void rebuild(Locale? locale); -} - -class _MockApp extends Mock implements _Rebuildable {} diff --git a/apps/flutter_parent/test/network/authentication_interceptor_test.dart b/apps/flutter_parent/test/network/authentication_interceptor_test.dart deleted file mode 100644 index 918cc0a974..0000000000 --- a/apps/flutter_parent/test/network/authentication_interceptor_test.dart +++ /dev/null @@ -1,176 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -import 'package:dio/dio.dart'; -import 'package:flutter_parent/models/canvas_token.dart'; -import 'package:flutter_parent/models/login.dart'; -import 'package:flutter_parent/models/user.dart'; -import 'package:flutter_parent/network/api/auth_api.dart'; -import 'package:flutter_parent/network/utils/analytics.dart'; -import 'package:flutter_parent/network/utils/api_prefs.dart'; -import 'package:flutter_parent/network/utils/authentication_interceptor.dart'; -import 'package:mockito/mockito.dart'; -import 'package:test/test.dart'; - -import '../utils/platform_config.dart'; -import '../utils/test_app.dart'; -import '../utils/test_helpers/mock_helpers.dart'; -import '../utils/test_helpers/mock_helpers.mocks.dart'; - -void main() { - final login = Login((b) => b - ..domain = 'domain' - ..user = User((b) => b..id = '123').toBuilder() - ..clientSecret = 'client_secret' - ..clientId = 'client_id'); - - final dio = MockDio(); - final authApi = MockAuthApi(); - final analytics = MockAnalytics(); - final errorHandler = MockErrorInterceptorHandler(); - - final interceptor = AuthenticationInterceptor(dio); - - setupTestLocator((locator) { - locator.registerLazySingleton(() => authApi); - locator.registerLazySingleton(() => analytics); - }); - - setUp(() { - reset(dio); - reset(authApi); - reset(analytics); - reset(errorHandler); - }); - - test('returns error if response code is not 401', () async { - await setupPlatformChannels(); - var path = 'accounts/self'; - final error = DioError(requestOptions: RequestOptions(path: path), response: Response(statusCode: 403, requestOptions: RequestOptions(path: path))); - - // Test the error response - await interceptor.onError(error, errorHandler); - verify(errorHandler.next(error)); - }); - - test('returns error if path is accounts/self', () async { - await setupPlatformChannels(); - var path = 'accounts/self'; - final error = DioError(requestOptions: RequestOptions(path: path), response: Response(statusCode: 401, requestOptions: RequestOptions(path: path))); - - // Test the error response - await interceptor.onError(error, errorHandler); - verify(errorHandler.next(error)); - }); - - test('returns error if headers have the retry header', () async { - await setupPlatformChannels(config: PlatformConfig(initLoggedInUser: login)); - final error = DioError( - requestOptions: RequestOptions(path: '', headers: {'mobile_refresh': 'mobile_refresh'}), - response: Response(statusCode: 401, requestOptions: RequestOptions(path: '')), - ); - - // Test the error response - await interceptor.onError(error, errorHandler); - verify(errorHandler.next(error)); - verify(analytics.logEvent(AnalyticsEventConstants.TOKEN_REFRESH_FAILURE, extras: { - AnalyticsParamConstants.DOMAIN_PARAM: login.domain, - AnalyticsParamConstants.USER_CONTEXT_ID: 'user_${login.user.id}', - })).called(1); - }); - - test('returns error if login is null', () async { - await setupPlatformChannels(); - final error = DioError(requestOptions: RequestOptions(path: ''), response: Response(statusCode: 401, requestOptions: RequestOptions(path: ''))); - - // Test the error response - await interceptor.onError(error, errorHandler); - verify(errorHandler.next(error)); - verify(analytics.logEvent(AnalyticsEventConstants.TOKEN_REFRESH_FAILURE_NO_SECRET, extras: { - AnalyticsParamConstants.DOMAIN_PARAM: null, - AnalyticsParamConstants.USER_CONTEXT_ID: null, - })).called(1); - }); - - test('returns error if login client id is null', () async { - await setupPlatformChannels(config: PlatformConfig(initLoggedInUser: login.rebuild((b) => b..clientId = null))); - final error = DioError(requestOptions: RequestOptions(path: ''), response: Response(statusCode: 401, requestOptions: RequestOptions(path: ''))); - - // Test the error response - await interceptor.onError(error, errorHandler); - verify(errorHandler.next(error)); - verify(analytics.logEvent(AnalyticsEventConstants.TOKEN_REFRESH_FAILURE_NO_SECRET, extras: { - AnalyticsParamConstants.DOMAIN_PARAM: login.domain, - AnalyticsParamConstants.USER_CONTEXT_ID: 'user_${login.user.id}', - })).called(1); - }); - - test('returns error if login client secret is null', () async { - await setupPlatformChannels(config: PlatformConfig(initLoggedInUser: login.rebuild((b) => b..clientSecret = null))); - final error = DioError(requestOptions: RequestOptions(path: ''), response: Response(statusCode: 401, requestOptions: RequestOptions(path: ''))); - - // Test the error response - await interceptor.onError(error, errorHandler); - verify(errorHandler.next(error)); - verify(analytics.logEvent(AnalyticsEventConstants.TOKEN_REFRESH_FAILURE_NO_SECRET, extras: { - AnalyticsParamConstants.DOMAIN_PARAM: login.domain, - AnalyticsParamConstants.USER_CONTEXT_ID: 'user_${login.user.id}', - })).called(1); - }); - - test('returns error if the refresh api call failed', () async { - await setupPlatformChannels(config: PlatformConfig(initLoggedInUser: login)); - final error = DioError(requestOptions: RequestOptions(path: ''), response: Response(statusCode: 401, requestOptions: RequestOptions(path: ''))); - - when(authApi.refreshToken()).thenAnswer((_) => Future.error('Failed to refresh')); - - when(dio.interceptors).thenAnswer((realInvocation) => Interceptors()); - - // Test the error response - await interceptor.onError(error, errorHandler); - verify(errorHandler.next(error)); - - verify(analytics.logEvent(AnalyticsEventConstants.TOKEN_REFRESH_FAILURE_TOKEN_NOT_VALID, extras: { - AnalyticsParamConstants.DOMAIN_PARAM: login.domain, - AnalyticsParamConstants.USER_CONTEXT_ID: 'user_${login.user.id}', - })).called(1); - verify(authApi.refreshToken()).called(1); - }); - - test('returns a newly authenticated api call', () async { - await setupPlatformChannels(config: PlatformConfig(initLoggedInUser: login)); - - final tokens = CanvasToken((b) => b..accessToken = 'token'); - final path = 'test/path/stuff'; - final error = DioError(requestOptions: RequestOptions(path: path), response: Response(statusCode: 401, requestOptions: RequestOptions(path: path))); - final expectedOptions = RequestOptions(path: path, headers: { - 'Authorization': 'Bearer ${tokens.accessToken}', - 'mobile_refresh': 'mobile_refresh', - }); - final expectedAnswer = Response(requestOptions: expectedOptions, data: 'data', statusCode: 200); - - when(authApi.refreshToken()).thenAnswer((_) async => tokens); - when(dio.fetch(any)).thenAnswer((_) async => expectedAnswer); - when(dio.interceptors).thenAnswer((realInvocation) => Interceptors()); - - // Do the onError call - await interceptor.onError(error, errorHandler); - verify(errorHandler.resolve(expectedAnswer)); - - verify(authApi.refreshToken()).called(1); - final actualOptions = verify(dio.fetch(captureAny)).captured[0] as RequestOptions; - expect(actualOptions.headers, expectedOptions.headers); - expect(ApiPrefs.getCurrentLogin()?.accessToken, tokens.accessToken); - verifyNever(analytics.logEvent(any, extras: anyNamed('extras'))); - }); -} diff --git a/apps/flutter_parent/test/network/dio_config_test.dart b/apps/flutter_parent/test/network/dio_config_test.dart deleted file mode 100644 index 9b2591e15b..0000000000 --- a/apps/flutter_parent/test/network/dio_config_test.dart +++ /dev/null @@ -1,267 +0,0 @@ -// Copyright (C) 2019 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:dio/dio.dart'; -import 'package:flutter_parent/models/login.dart'; -import 'package:flutter_parent/network/utils/api_prefs.dart'; -import 'package:flutter_parent/network/utils/dio_config.dart'; -import 'package:flutter_test/flutter_test.dart'; - -import '../utils/canvas_model_utils.dart'; -import '../utils/test_app.dart'; - -void main() { - setUpAll(() async => await setupPlatformChannels()); - - test('returns a dio object', () async { - final domain = 'https://test_domain.com'; - await ApiPrefs.switchLogins(Login((b) => b..domain = domain)); - var dio = await canvasDio(); - expect(dio, isA()); - }); - - test('DioConfig.canvas returns a config object', () async { - expect(DioConfig.canvas(), isA()); - }); - - test('DioConfig.core returns a config object', () async { - expect(DioConfig.core(), isA()); - }); - - group('canvas options', () { - test('initializes with a base url', () async { - - final domain = 'https://test_domain.com'; - await ApiPrefs.switchLogins(Login((b) => b..domain = domain)); - - var dio = await canvasDio(); - final options = dio.options; - expect(options.baseUrl, '$domain/api/v1/'); - }); - - test('sets up headers', () async { - var dio = await canvasDio(); - final options = dio.options; - final expectedHeaders = ApiPrefs.getHeaderMap() - ..putIfAbsent('accept', () => 'application/json+canvas-string-ids') - ..putIfAbsent('content-type', () => 'application/json; charset=utf-8'); - expect(options.headers, expectedHeaders); - }); - - test('sets up headers with overrides', () async { - final overrideToken = 'overrideToken'; - final extras = {'other': 'value'}; - - var dio = await canvasDio(forceDeviceLanguage: true, overrideToken: overrideToken, extraHeaders: extras); - - final options = dio.options; - final expected = ApiPrefs.getHeaderMap( - forceDeviceLanguage: true, token: overrideToken, extraHeaders: extras) - ..putIfAbsent('accept', () => 'application/json+canvas-string-ids') - ..putIfAbsent('content-type', () => 'application/json; charset=utf-8'); - - expect(options.headers, expected); - }); - - test('sets per page param', () async { - final perPageSize = 1; - var dio = await canvasDio(pageSize: PageSize(perPageSize)); - final options = dio.options; - - expect(options.queryParameters['per_page'], 1); - }); - - test('sets no verifiers param by default', () async { - var dio = await canvasDio(); - final options = dio.options; - - expect(options.queryParameters['no_verifiers'], 1); - }); - - test('sets as_user_id param when masquerading', () async { - String userId = "masquerade_user_id"; - final login = Login((b) => b - ..masqueradeDomain = 'https://masqueradeDomain.com' - ..masqueradeUser = CanvasModelTestUtils.mockUser(id: userId).toBuilder()); - await ApiPrefs.switchLogins(login); - - var dio = await canvasDio(); - - final options = dio.options; - - expect(options.queryParameters['as_user_id'], userId); - }); - - test('Does not set as_user_id param when not masquerading', () async { - final domain = 'https://test_domain.com'; - await ApiPrefs.switchLogins(Login((b) => b..domain = domain)); - var dio = await canvasDio(); - final options = dio.options; - - expect(options.queryParameters.containsKey('as_user_id'), isFalse); - }); - - test('sets cache extras', () async { - var dio = await canvasDio(forceRefresh: true); - expect(dio.options.extra, isNotEmpty); - }); - - test('sets cache extras with force refrersh', () async { - var dio = await canvasDio(forceRefresh: true); - expect(dio.options.extra['dio_cache_force_refresh'], isTrue); - }); - }); - - group('core options', () { - test('initializes with a base url', () async { - var dio = await DioConfig.core().dio; - final options = dio.options; - expect(options.baseUrl, 'https://canvas.instructure.com/api/v1/'); - }); - - test('initializes with a base url without api path', () async { - var dio = await DioConfig.core(includeApiPath: false).dio; - final options = dio.options; - expect(options.baseUrl, 'https://canvas.instructure.com/'); - }); - - test('initializes with a beta base url', () async { - var dio = await DioConfig.core(useBetaDomain: true).dio; - final options = dio.options; - expect(options.baseUrl, 'https://canvas.beta.instructure.com/api/v1/'); - }); - - test('sets up headers', () async { - final headers = { - '123': '123', - 'content-type': 'application/json; charset=utf-8' - }; - var dio = await DioConfig.core(headers: headers).dio; - final options = dio.options; - expect(options.headers, headers); - }); - - test('sets per page param', () async { - final perPageSize = 13; - var dio = await DioConfig.core(pageSize: PageSize(perPageSize)).dio; - final options = dio.options; - expect(options.queryParameters, {'per_page': perPageSize}); - }); - - test('sets up cache maxAge', () async { - final age = Duration(minutes: 123); - var dio = await DioConfig.core(cacheMaxAge: age).dio; - final options = dio.options; - expect(options.extra['dio_cache_max_age'], age); - }); - - test('Does not set cache extras if max age is zero', () async { - var dio = await DioConfig.core(cacheMaxAge: Duration.zero).dio; - final options = dio.options; - expect(options.extra['dio_cache_max_age'], isNull); - expect(options.extra['dio_cache_force_refresh'], isNull); - }); - - test('sets cache extras with force refrersh', () async { - var dio = await DioConfig.core(cacheMaxAge: Duration(minutes: 1), forceRefresh: true).dio; - final options = dio.options; - expect(options.extra['dio_cache_force_refresh'], isTrue); - }); - }); - - group('interceptors', () { - test('adds cache manager', () async { - var dio = await canvasDio(); - // The cache manager is an object that hooks in via an interceptor wrapper, so we can't check for the explicit type - expect(dio.interceptors, contains(isA())); - }); - - test('adds log interceptor', () async { - var dio = await canvasDio(); - expect(dio.interceptors, contains(isA())); - }); - }); - - group('copy', () { - test('Empty copy produces identical config', () { - final original = DioConfig( - baseUrl: 'fakeUrl', - baseHeaders: {'fakeHeader': 'fakeValue'}, - cacheMaxAge: Duration(minutes: 13), - forceRefresh: true, - pageSize: PageSize(13), - extraQueryParams: {'param1': '123'}, - ); - - final copy = original.copyWith(); - - expect(copy.baseUrl, original.baseUrl); - expect(copy.baseHeaders, original.baseHeaders); - expect(copy.cacheMaxAge, original.cacheMaxAge); - expect(copy.forceRefresh, original.forceRefresh); - expect(copy.pageSize, original.pageSize); - expect(copy.extraQueryParams, original.extraQueryParams); - }); - - test('Copy with single value produces correct config', () { - final original = DioConfig( - baseUrl: 'fakeUrl', - baseHeaders: {'fakeHeader': 'fakeValue'}, - cacheMaxAge: Duration(minutes: 13), - forceRefresh: true, - pageSize: PageSize(13), - extraQueryParams: {'param1': '123'}, - ); - - final copy = original.copyWith(baseUrl: ''); - - expect(copy.baseUrl, ''); - expect(copy.baseHeaders, original.baseHeaders); - expect(copy.cacheMaxAge, original.cacheMaxAge); - expect(copy.forceRefresh, original.forceRefresh); - expect(copy.pageSize, original.pageSize); - expect(copy.extraQueryParams, original.extraQueryParams); - }); - - test('Copy with all values produces correct config', () { - final original = DioConfig( - baseUrl: 'fakeUrl', - baseHeaders: {'fakeHeader': 'fakeValue'}, - cacheMaxAge: Duration(minutes: 13), - forceRefresh: true, - pageSize: PageSize(13), - extraQueryParams: {'param1': '123'}, - retries: 1, - ); - - final copy = original.copyWith( - baseUrl: '123', - baseHeaders: {'123': '123'}, - cacheMaxAge: Duration(minutes: 123), - forceRefresh: false, - pageSize: PageSize(123), - extraQueryParams: {'param2': '321'}, - retries: 2, - ); - - expect(copy.baseUrl, '123'); - expect(copy.baseHeaders, {'123': '123'}); - expect(copy.cacheMaxAge, Duration(minutes: 123)); - expect(copy.forceRefresh, false); - expect(copy.pageSize, PageSize(123)); - expect(copy.extraQueryParams, {'param2': '321'}); - expect(copy.retries, 2); - }); - }); -} diff --git a/apps/flutter_parent/test/network/fetch_test.dart b/apps/flutter_parent/test/network/fetch_test.dart deleted file mode 100644 index 74815027f7..0000000000 --- a/apps/flutter_parent/test/network/fetch_test.dart +++ /dev/null @@ -1,145 +0,0 @@ -// Copyright (C) 2019 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:dio/dio.dart'; -import 'package:flutter_parent/models/user.dart'; -import 'package:flutter_parent/network/utils/fetch.dart'; -import 'package:flutter_parent/network/utils/paged_list.dart'; -import 'package:mockito/mockito.dart'; -import 'package:test/test.dart'; - -import '../utils/test_app.dart'; -import '../utils/test_helpers/mock_helpers.dart'; -import '../utils/test_helpers/mock_helpers.mocks.dart'; - -void main() { - group('fetch', () { - test('deserializes a response', () async { - final User? response = await fetch(_request(_rawUser())); - expect(response, _getUser()); - }); - - test('catches errors and returns a Future.error', () async { - bool fail = false; - await fetch(_requestFail()).catchError((_) { - fail = true; // Don't return, just update the flag - return Future.value(null); - }); - expect(fail, isTrue); - }); - }); - - group('fetch first page', () { - test('deserializes a response', () async { - final expected = [ - _getUser(id: '0'), - _getUser(id: '1'), - ]; - final PagedList? response = await fetchFirstPage(_request(_rawUserList())); - expect(response?.data, expected); - }); - - test('catches errors and returns a Future.error', () async { - bool fail = false; - await fetchFirstPage(_requestFail()).catchError((_) { - fail = true; - return Future.value(null); - }); - expect(fail, isTrue); - }); - }); - - // TODO Fix test - // Not able to test getting data for a next page, as we have no way of mocking Dio which is accessed directly in fetch - group('fetch next page', () { - test('catches errors and returns a Future.error', () async { - await setupPlatformChannels(); - bool fail = false; - await fetchNextPage(null).catchError((_) { - fail = true; - return Future.value(null); - }); - expect(fail, isTrue); - }); - }, skip: true); - - group('fetch list', () { - test('deserializes a response', () async { - final expected = [ - _getUser(id: '0'), - _getUser(id: '1'), - ]; - final List? response = await fetchList(_request(_rawUserList())); - expect(response, expected); - }); - - test('depaginates a response', () async { - final expected = [ - _getUser(id: '0'), - _getUser(id: '1'), - _getUser(id: '2'), - _getUser(id: '3'), - ]; - - final pageUrl = 'https://www.google.com'; - final request = _request( - _rawUserList(), - headers: Headers.fromMap({ - 'link': ['<$pageUrl>; rel="next"'] - }), - ); - - final dio = MockDio(); - when(dio.options).thenReturn(BaseOptions()); - when(dio.get(pageUrl)).thenAnswer((_) => _request(_rawUserList(startIndex: 2))); - - final List? response = await fetchList(request, depaginateWith: dio); - expect(response, expected); - }); - - test('catches errors and returns a Future.error', () async { - bool fail = false; - await fetchList(_requestFail()).catchError((_) { - fail = true; // Don't return, just update the flag - return Future.value(null); - }); - expect(fail, isTrue); - }); - }); -} - -Future> _request(data, {Headers? headers}) async => Response(data: data, headers: headers, requestOptions: RequestOptions(path: '')); - -Future> _requestFail() async => throw 'ErRoR'; - -// Mocks - -User _getUser({String id = '0'}) { - return User((b) => b..id = id); -} - -List> _rawUserList({int size = 2, int startIndex = 0}) => - List.generate(size, (index) => _rawUser(id: (startIndex + index).toString())); - -Map _rawUser({String id = '0'}) => { - 'id': '$id', - 'name': '', - 'sortable_name': null, - 'short_name': null, - 'pronouns': null, - 'avatar_url': null, - 'primary_email': null, - 'locale': null, - 'effective_locale': null, - }; diff --git a/apps/flutter_parent/test/network/paged_list_test.dart b/apps/flutter_parent/test/network/paged_list_test.dart deleted file mode 100644 index fe8f0e7c79..0000000000 --- a/apps/flutter_parent/test/network/paged_list_test.dart +++ /dev/null @@ -1,170 +0,0 @@ -// Copyright (C) 2019 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:built_collection/built_collection.dart'; -import 'package:built_value/serializer.dart'; -import 'package:dio/dio.dart'; -import 'package:flutter_parent/models/school_domain.dart'; -import 'package:flutter_parent/models/serializers.dart'; -import 'package:flutter_parent/network/utils/paged_list.dart'; -import 'package:test/test.dart'; - -void main() { - test('has no data', () { - PagedList list = PagedList(Response(requestOptions: RequestOptions(path: ''))); - expect(list.data, []); - }); - - test('has no headers', () { - PagedList list = PagedList(Response(requestOptions: RequestOptions(path: ''))); - expect(list.nextUrl, null); - }); - - test('has no link headers', () { - final map = { - 'key': ['value'] - }; - PagedList list = PagedList(Response(headers: Headers.fromMap(map), requestOptions: RequestOptions(path: ''))); - expect(list.nextUrl, null); - }); - - test('has no next in link headers', () { - final map = { - 'link': ['; rel="last"'] - }; - PagedList list = PagedList(Response(headers: Headers.fromMap(map), requestOptions: RequestOptions(path: ''))); - expect(list.nextUrl, null); - }); - - test('parses the next link', () { - final testHeaders = Headers.fromMap({ - 'link': [ - ''' -; rel="current",; rel="next",; rel="first",; rel="last" - ''' - .trim() - ] - }); - PagedList list = PagedList(Response(headers: testHeaders, requestOptions: RequestOptions(path: ''))); - expect(list.nextUrl, - 'https://mobiledev.instructure.com/api/v1/courses/549835/assignments?include%5B%5D=rubric_assessment&needs_grading_count_by_section=true&order_by=position&override_assignment_dates=true&page=2&per_page=10'); - }); - - test('updates the next link from a response', () { - final testHeaders = Headers.fromMap({ - 'link': [ - ''' -; rel="current",; rel="next",; rel="first",; rel="last" - ''' - .trim() - ] - }); - PagedList list = PagedList(Response(requestOptions: RequestOptions(path: ''))); - expect(list.nextUrl, null); - - list.updateWithResponse(Response(headers: testHeaders, requestOptions: RequestOptions(path: ''))); - expect(list.nextUrl, - 'https://mobiledev.instructure.com/api/v1/courses/549835/assignments?include%5B%5D=rubric_assessment&needs_grading_count_by_section=true&order_by=position&override_assignment_dates=true&page=2&per_page=10'); - }); - - test('updates the next link from a paged list', () { - final testHeaders = Headers.fromMap({ - 'link': [ - ''' -; rel="current",; rel="next",; rel="first",; rel="last" - ''' - .trim() - ] - }); - PagedList list = PagedList(Response(requestOptions: RequestOptions(path: ''))); - expect(list.nextUrl, null); - - list.updateWithPagedList(PagedList(Response(headers: testHeaders, requestOptions: RequestOptions(path: '')))); - expect(list.nextUrl, - 'https://mobiledev.instructure.com/api/v1/courses/549835/assignments?include%5B%5D=rubric_assessment&needs_grading_count_by_section=true&order_by=position&override_assignment_dates=true&page=2&per_page=10'); - }); - - test('parses data', () { - // Set up the serializer to handle this custom type - final type = FullType(BuiltList, [FullType(SchoolDomain)]); - final serializer = - (jsonSerializers.toBuilder()..addBuilderFactory(type, () => ListBuilder())).build(); - - // Generate the data - final data = List.generate(4, (index) { - return SchoolDomain((builder) => builder - ..name = 'School $index' - ..domain = 'Domain $index'); - }); - final serializedData = serializer.serialize(BuiltList(data), specifiedType: type); - PagedList list = PagedList(Response(data: serializedData, requestOptions: RequestOptions(path: ''))); - - expect(list.data, data); - }); - - test('updates data with resposne', () { - // Set up the serializer to handle this custom type - final type = FullType(BuiltList, [FullType(SchoolDomain)]); - final serializer = - (jsonSerializers.toBuilder()..addBuilderFactory(type, () => ListBuilder())).build(); - - // Generate the data - final data = List.generate(4, (index) { - return SchoolDomain((builder) => builder - ..name = 'School $index' - ..domain = 'Domain $index'); - }); - final serializedData = serializer.serialize(BuiltList(data), specifiedType: type); - PagedList list = PagedList(Response(data: serializedData, requestOptions: RequestOptions(path: ''))); - - final dataAlt = List.generate(4, (index) { - return SchoolDomain((builder) => builder - ..name = 'alt School $index' - ..domain = 'alt Domain $index'); - }); - final serializedDataAlt = serializer.serialize(BuiltList(dataAlt), specifiedType: type); - - list.updateWithResponse(Response(data: serializedDataAlt, requestOptions: RequestOptions(path: ''))); - - expect(list.data, data + dataAlt); - }); - - test('updates data with paged list', () { - // Set up the serializer to handle this custom type - final type = FullType(BuiltList, [FullType(SchoolDomain)]); - final serializer = - (jsonSerializers.toBuilder()..addBuilderFactory(type, () => ListBuilder())).build(); - - // Generate the data - final data = List.generate(4, (index) { - return SchoolDomain((builder) => builder - ..name = 'School $index' - ..domain = 'Domain $index'); - }); - final serializedData = serializer.serialize(BuiltList(data), specifiedType: type); - PagedList list = PagedList(Response(data: serializedData, requestOptions: RequestOptions(path: ''))); - - final dataAlt = List.generate(4, (index) { - return SchoolDomain((builder) => builder - ..name = 'Alt School $index' - ..domain = 'Alt Domain $index'); - }); - final serializedDataAlt = serializer.serialize(BuiltList(dataAlt), specifiedType: type); - PagedList listAlt = PagedList(Response(data: serializedDataAlt, requestOptions: RequestOptions(path: ''))); - - list.updateWithPagedList(listAlt); - - expect(list.data, data + dataAlt); - }); -} diff --git a/apps/flutter_parent/test/router/panda_router_test.dart b/apps/flutter_parent/test/router/panda_router_test.dart deleted file mode 100644 index ad6cf2c602..0000000000 --- a/apps/flutter_parent/test/router/panda_router_test.dart +++ /dev/null @@ -1,648 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:fluro/fluro.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_parent/l10n/app_localizations.dart'; -import 'package:flutter_parent/models/login.dart'; -import 'package:flutter_parent/models/user.dart'; -import 'package:flutter_parent/network/utils/analytics.dart'; -import 'package:flutter_parent/network/utils/api_prefs.dart'; -import 'package:flutter_parent/router/panda_router.dart'; -import 'package:flutter_parent/router/router_error_screen.dart'; -import 'package:flutter_parent/screens/announcements/announcement_details_screen.dart'; -import 'package:flutter_parent/screens/assignments/assignment_details_screen.dart'; -import 'package:flutter_parent/screens/calendar/calendar_screen.dart'; -import 'package:flutter_parent/screens/calendar/calendar_widget/calendar_widget.dart'; -import 'package:flutter_parent/screens/courses/details/course_details_screen.dart'; -import 'package:flutter_parent/screens/courses/routing_shell/course_routing_shell_screen.dart'; -import 'package:flutter_parent/screens/dashboard/dashboard_screen.dart'; -import 'package:flutter_parent/screens/domain_search/domain_search_screen.dart'; -import 'package:flutter_parent/screens/events/event_details_screen.dart'; -import 'package:flutter_parent/screens/help/help_screen.dart'; -import 'package:flutter_parent/screens/help/terms_of_use_screen.dart'; -import 'package:flutter_parent/screens/inbox/conversation_list/conversation_list_screen.dart'; -import 'package:flutter_parent/screens/login_landing_screen.dart'; -import 'package:flutter_parent/screens/not_a_parent_screen.dart'; -import 'package:flutter_parent/screens/pairing/qr_pairing_screen.dart'; -import 'package:flutter_parent/screens/qr_login/qr_login_tutorial_screen.dart'; -import 'package:flutter_parent/screens/settings/legal_screen.dart'; -import 'package:flutter_parent/screens/settings/settings_screen.dart'; -import 'package:flutter_parent/screens/splash/splash_screen.dart'; -import 'package:flutter_parent/screens/web_login/web_login_screen.dart'; -import 'package:flutter_parent/utils/common_widgets/web_view/simple_web_view_screen.dart'; -import 'package:flutter_parent/utils/common_widgets/web_view/web_content_interactor.dart'; -import 'package:flutter_parent/utils/qr_utils.dart'; -import 'package:flutter_parent/utils/quick_nav.dart'; -import 'package:flutter_parent/utils/url_launcher.dart'; -import 'package:flutter_parent/utils/veneers/flutter_snackbar_veneer.dart'; -import 'package:flutter_test/flutter_test.dart'; -import 'package:mockito/mockito.dart'; - -import '../utils/accessibility_utils.dart'; -import '../utils/canvas_model_utils.dart'; -import '../utils/platform_config.dart'; -import '../utils/test_app.dart'; -import '../utils/test_helpers/mock_helpers.mocks.dart'; - -final _analytics = MockAnalytics(); - -void main() { - final String _domain = 'https://test.instructure.com'; - final user = CanvasModelTestUtils.mockUser(); - final login = Login((b) => b - ..domain = _domain - ..accessToken = 'token' - ..user = user.toBuilder()); - - final _mockNav = MockQuickNav(); - final _mockWebContentInteractor = MockWebContentInteractor(); - final _mockSnackbar = MockFlutterSnackbarVeneer(); - final _mockLauncher = MockUrlLauncher(); - - setUpAll(() async { - PandaRouter.init(); - setupTestLocator((locator) { - locator.registerLazySingleton(() => _analytics); - locator.registerLazySingleton(() => _mockWebContentInteractor); - locator.registerLazySingleton(() => _mockNav); - locator.registerLazySingleton(() => _mockSnackbar); - locator.registerLazySingleton(() => _mockLauncher); - }); - }); - - setUp(() async { - await setupPlatformChannels(config: PlatformConfig(initLoggedInUser: login)); - ApiPrefs.setCurrentStudent(user); - reset(_analytics); - reset(_mockLauncher); - reset(_mockNav); - reset(_mockSnackbar); - }); - - group('route generators', () { - test('loginWeb returns null by default', () {}); - }); - - group('handlers', () { - test('rootSplash returns splash screen', () { - final widget = _getWidgetFromRoute(PandaRouter.rootSplash()); - expect(widget, isA()); - }); - - test('conversations returns conversations list screen', () { - final widget = _getWidgetFromRoute(PandaRouter.conversations()); - expect(widget, isA()); - }); - - test('dashboard returns dashboard screen', () { - final widget = _getWidgetFromRoute(PandaRouter.dashboard()); - expect(widget, isA()); - }); - - test('login returns login landing screen', () { - final widget = _getWidgetFromRoute(PandaRouter.login()); - expect(widget, isA()); - }); - - test('domainSearch returns DomainSearchScreen', () { - final widget = _getWidgetFromRoute(PandaRouter.domainSearch()); - expect(widget, isA()); - }); - - test('domainSearch returns DomainSearchScreen with LoginFlow', () { - final flow = LoginFlow.canvas; - final widget = _getWidgetFromRoute(PandaRouter.domainSearch(loginFlow: flow)); - - expect(widget, isA()); - expect((widget as DomainSearchScreen).loginFlow, flow); - }); - - test('loginWeb returns web login screen', () { - final domain = 'domain'; - final widget = _getWidgetFromRoute( - PandaRouter.loginWeb(domain), - ) as WebLoginScreen; - - expect(widget, isA()); - expect(widget.domain, domain); - }); - - test('loginWeb returns web login screen with non-uri safe characters ', () { - final domain = 'domain%'; - final widget = _getWidgetFromRoute( - PandaRouter.loginWeb(domain), - ) as WebLoginScreen; - - expect(widget, isA()); - expect(widget.domain, domain); - }); - - test('loginWeb returns web login screen with LoginFlow', () { - final domain = 'domain'; - final flow = LoginFlow.siteAdmin; - final widget = _getWidgetFromRoute( - PandaRouter.loginWeb(domain, loginFlow: flow), - ) as WebLoginScreen; - - expect(widget, isA()); - expect(widget.domain, domain); - expect(widget.loginFlow, flow); - }); - - test('loginWeb returns web login screen with auth provider', () { - final domain = 'domain'; - final authProvider = 'auth'; - final widget = _getWidgetFromRoute( - PandaRouter.loginWeb(domain, authenticationProvider: authProvider), - ) as WebLoginScreen; - - expect(widget, isA()); - expect(widget.domain, domain); - expect(widget.authenticationProvider, authProvider); - }); - - test('notParent returns not a parent screen', () { - final widget = _getWidgetFromRoute(PandaRouter.notParent()); - expect(widget, isA()); - }); - - test('courseDetails returns course details screen', () async { - await setupPlatformChannels(); - final widget = _getWidgetFromRoute( - PandaRouter.courseDetails('123'), - ); - expect(widget, isA()); - }); - - test('assignmentDetails returns assignment details screen', () { - final courseId = '123'; - final assignmentId = '321'; - final widget = _getWidgetFromRoute( - PandaRouter.assignmentDetails(courseId, assignmentId), - ) as AssignmentDetailsScreen; - - expect(widget, isA()); - expect(widget.courseId, courseId); - expect(widget.assignmentId, assignmentId); - }); - - test('eventDetails returns event details screen', () { - final courseId = '123'; - final eventId = '321'; - final widget = _getWidgetFromRoute( - PandaRouter.eventDetails(courseId, eventId), - ) as EventDetailsScreen; - - expect(widget, isA()); - expect(widget.courseId, courseId); - expect(widget.eventId, eventId); - }); - - test('help returns help screen', () { - final widget = _getWidgetFromRoute(PandaRouter.help()); - expect(widget, isA()); - }); - - test('legal returns legal screen', () { - final widget = _getWidgetFromRoute(PandaRouter.legal()); - expect(widget, isA()); - }); - - test('termsOfUse returns terms of use screen', () { - final widget = _getWidgetFromRoute(PandaRouter.termsOfUse()); - expect(widget, isA()); - }); - - test('settings returns settings screen', () { - final widget = _getWidgetFromRoute(PandaRouter.settings()); - expect(widget, isA()); - }); - - test('courseAnnouncementDetails returns announcement details screen', () { - final courseId = '123'; - final announcementId = '321'; - final widget = _getWidgetFromRoute( - PandaRouter.courseAnnouncementDetails(courseId, announcementId), - ) as AnnouncementDetailScreen; - - expect(widget, isA()); - expect(widget.courseId, courseId); - expect(widget.announcementId, announcementId); - expect(widget.announcementType, AnnouncementType.COURSE); - }); - - test('institutionAnnouncementDetails returns announcement details screen', () { - final notificationId = '321'; - final widget = _getWidgetFromRoute( - PandaRouter.institutionAnnouncementDetails(notificationId), - ) as AnnouncementDetailScreen; - - expect(widget, isA()); - expect(widget.courseId, ''); - expect(widget.announcementId, notificationId); - expect(widget.announcementType, AnnouncementType.INSTITUTION); - }); - - test('discussionDetails returns announcement details screen', () { - final courseId = '123'; - final assignmentId = '321'; - final widget = _getWidgetFromRoute( - PandaRouter.discussionDetails(courseId, assignmentId), - ) as AssignmentDetailsScreen; - - expect(widget, isA()); - expect(widget.courseId, courseId); - expect(widget.assignmentId, assignmentId); - }); - - test('RouterErrorScreen returns RouterErrorScreen', () { - final url = 'https://test.instructure.com/blah-blah-blah'; - final widget = _getWidgetFromRoute( - _routerErrorRoute(url), - ) as RouterErrorScreen; - - expect(widget, isA()); - }); - - test('RouterErrorScreen returns RouterErrorScreen', () { - final url = 'https://test.instructure.com/conversations'; - final widget = _getWidgetFromRoute( - _simpleWebViewRoute(url), - ) as SimpleWebViewScreen; - - expect(widget, isA()); - }); - - test('calendar returns Dashboard screen', () { - final widget = _getWidgetFromRoute(PandaRouter.calendar, extraParams: { - 'view_start': ['2018-12-15'], - 'view_name': ['month'] - }); - - expect(widget, isA()); - - DashboardScreen dashboard = widget as DashboardScreen; - expect(dashboard.startingPage, DashboardContentScreens.Calendar); - expect(dashboard.deepLinkParams?[CalendarScreen.startDateKey], DateTime(2018, 12, 15)); - expect(dashboard.deepLinkParams?[CalendarScreen.startViewKey], CalendarView.Month); - }); - - test('courses returns Dashboard screen', () { - final widget = _getWidgetFromRoute(PandaRouter.courses()); - expect((widget as DashboardScreen).startingPage, DashboardContentScreens.Courses); - expect(widget, isA()); - }); - - test('alerts returns Dashboard screen', () { - final widget = _getWidgetFromRoute(PandaRouter.alerts); - expect((widget as DashboardScreen).startingPage, DashboardContentScreens.Alerts); - expect(widget, isA()); - }); - - test('qrTutorial returns QRTutorial screen', () { - final widget = _getWidgetFromRoute(PandaRouter.qrTutorial()); - expect(widget, isA()); - }); - - test('qrLogin returns splash screen', () { - final barcodeResultUrl = 'https://${QRUtils.QR_HOST}/canvas/login?${QRUtils.QR_AUTH_CODE}=1234' - '&${QRUtils.QR_DOMAIN}=mobiledev.instructure.com'; - final widget = _getWidgetFromRoute(PandaRouter.qrLogin(barcodeResultUrl)); - expect(widget, isA()); - }); - - test('qrPairing returns qrPairingScreen screen', () { - final widget = _getWidgetFromRoute(PandaRouter.qrPairing()); - expect(widget, isA()); - }); - - test('qrPairing returns qrPairingScreen screen', () { - final widget = _getWidgetFromRoute(PandaRouter.qrPairing(isCreatingAccount: true)); - expect(widget, isA()); - expect((widget as QRPairingScreen).isCreatingAccount, true); - }); - - test('qrPairing returns qrPairingScreen screen', () { - final uri = 'canvas-parent://mobiledev.instructure.com/pair?code=123abc&account_id=1234'; - final pairingInfo = QRUtils.parsePairingInfo(uri) as QRPairingInfo; - final widget = _getWidgetFromRoute(PandaRouter.qrPairing(pairingUri: uri)); - expect(widget, isA()); - expect((widget as QRPairingScreen).pairingInfo?.code, pairingInfo.code); - expect((widget).pairingInfo?.domain, pairingInfo.domain); - expect((widget).pairingInfo?.accountId, pairingInfo.accountId); - }); - - test('syllabus returns CourseRoutingShellScreen', () { - final courseId = '123'; - final widget = _getWidgetFromRoute(PandaRouter.syllabus(courseId)); - expect(widget, isA()); - expect((widget as CourseRoutingShellScreen).courseId, courseId); - expect((widget as CourseRoutingShellScreen).type, CourseShellType.syllabus); - }); - - test('frontPage returns CourseRoutingShellScreen', () { - final courseId = '123'; - final widget = _getWidgetFromRoute(PandaRouter.frontPage(courseId)); - expect(widget, isA()); - expect((widget as CourseRoutingShellScreen).courseId, courseId); - expect((widget).type, CourseShellType.frontPage); - }); - - test('frontPageWiki returns CourseRoutingShellScreen', () { - final courseId = '123'; - final widget = _getWidgetFromRoute(PandaRouter.frontPageWiki(courseId)); - expect(widget, isA()); - expect((widget as CourseRoutingShellScreen).courseId, courseId); - expect((widget).type, CourseShellType.frontPage); - }); - - test('submissionWebViewRoute returns SimpleWebViewScreen', () { - final url = 'https://test.instructure.com'; - final title = 'Title'; - final cookies = {'key': 'value'}; - final widget = _getWidgetFromRoute(PandaRouter.submissionWebViewRoute(url, title, cookies, false)) as SimpleWebViewScreen; - - expect(widget, isA()); - expect(widget.url, url); - expect(widget.title, title); - expect(widget.initialCookies, cookies); - expect(widget.limitWebAccess, false); - }); - }); - - group('external url handler', () { - test('returns splash when the url does not match any routes', () { - final url = 'https://test.instructure.com/not-supported'; - final widget = _getWidgetFromRoute( - _rootWithUrl(url), - ); - - expect(widget, isA()); - }); - - test('returns dashboard for https scheme', () { - final url = 'https://test.instructure.com/conversations'; - final widget = _getWidgetFromRoute( - _rootWithUrl(url), - ); - - expect(widget, isA()); - }); - - test('returns dashboard for http scheme', () { - final url = 'http://test.instructure.com/conversations'; - final widget = _getWidgetFromRoute( - _rootWithUrl(url), - ); - - expect(widget, isA()); - }); - - test('returns dashboard for canvas-parent scheme', () { - final url = 'canvas-parent://test.instructure.com/conversations'; - final widget = _getWidgetFromRoute( - _rootWithUrl(url), - ); - - expect(widget, isA()); - }); - - test('returns dashboard for canvas-courses scheme', () { - final url = 'canvas-courses://test.instructure.com/conversations'; - final widget = _getWidgetFromRoute( - _rootWithUrl(url), - ); - - expect(widget, isA()); - }); - - test('returns course details ', () { - final url = 'https://test.instructure.com/courses/123'; - final widget = _getWidgetFromRoute( - _rootWithUrl(url), - ); - - expect(widget, isA()); - }); - - test('returns course details for grades', () { - final url = 'https://test.instructure.com/courses/123/grades'; - final widget = _getWidgetFromRoute( - _rootWithUrl(url), - ); - - expect(widget, isA()); - }); - - test('returns assignment details ', () { - final courseId = '123'; - final assignmentId = '321'; - final url = 'https://test.instructure.com/courses/$courseId/assignments/$assignmentId'; - final widget = _getWidgetFromRoute( - _rootWithUrl(url), - ) as AssignmentDetailsScreen; - - expect(widget, isA()); - expect(widget.courseId, courseId); - expect(widget.assignmentId, assignmentId); - }); - - // This route conflicts with assignment details, so having a specific test for it will ensure they aren't broken - test('returns CourseRoutingShellScreen for syllabus', () { - final courseId = '123'; - final url = 'https://test.instructure.com/courses/$courseId/assignments/syllabus'; - final widget = _getWidgetFromRoute(_rootWithUrl(url)) as CourseRoutingShellScreen; - - expect(widget, isA()); - expect(widget.courseId, courseId); - expect(widget.type, CourseShellType.syllabus); - }); - - test('returns router error screen for mismatched domain with valid route', () { - final courseId = '123'; - final assignmentId = '321'; - final url = 'https://fakedomain.instructure.com/courses/$courseId/assignments/$assignmentId'; - final widget = _getWidgetFromRoute( - _rootWithUrl(url), - ) as RouterErrorScreen; - - expect(widget, isA()); - }); - - test('returns Splash screen for qr login', () { - final barcodeResultUrl = 'https://${QRUtils.QR_HOST}/canvas/login?${QRUtils.QR_AUTH_CODE}=1234' - '&${QRUtils.QR_DOMAIN}=mobiledev.instructure.com'; - final widget = _getWidgetFromRoute(_rootWithUrl(barcodeResultUrl)) as SplashScreen; - expect(widget, isA()); - expect(widget.qrLoginUrl, barcodeResultUrl); - }); - - test('returns Splash screen for qr login with no user signed in', () async { - await setupPlatformChannels(config: PlatformConfig()); - final barcodeResultUrl = 'https://${QRUtils.QR_HOST}/canvas/login?${QRUtils.QR_AUTH_CODE}=1234' - '&${QRUtils.QR_DOMAIN}=mobiledev.instructure.com'; - final widget = _getWidgetFromRoute(_rootWithUrl(barcodeResultUrl)) as SplashScreen; - expect(widget, isA()); - expect(widget.qrLoginUrl, barcodeResultUrl); - }); - - // Added the following below tests because they are new cases for the router, two routes, one handler - test('returns CourseRoutingShellScreen for frontPage', () { - final courseId = '123'; - final url = 'https://test.instructure.com/courses/$courseId/pages/first-page'; - final widget = _getWidgetFromRoute(_rootWithUrl(url)) as CourseRoutingShellScreen; - - expect(widget, isA()); - expect(widget.courseId, courseId); - expect(widget.type, CourseShellType.frontPage); - }); - - test('returns CourseRoutingShellScreen for frontPageWiki', () { - final courseId = '123'; - final url = 'https://test.instructure.com/courses/$courseId/wiki'; - final widget = _getWidgetFromRoute(_rootWithUrl(url)) as CourseRoutingShellScreen; - - expect(widget, isA()); - expect(widget.courseId, courseId); - expect(widget.type, CourseShellType.frontPage); - }); - - test('returns Dashboard for any route with no current user or QR', () async { - ApiPrefs.setCurrentStudent(null); - - final courseId = '123'; - final assignmentId = '321'; - final url = 'https://test.instructure.com/courses/$courseId/assignments/$assignmentId'; - - final widget = _getWidgetFromRoute( - _rootWithUrl(url), - ) as DashboardScreen; - - expect(widget, isA()); - }); - }); - - group('internal url handler', () { - testWidgetsWithAccessibilityChecks('returns assignment details', (tester) async { - final courseId = '123'; - final assignmentId = '321'; - final url = 'https://test.instructure.com/courses/$courseId/assignments/$assignmentId'; - await TestApp.showWidgetFromTap(tester, (context) => PandaRouter.routeInternally(context, url)); - - verify(_analytics.logMessage('Attempting to route INTERNAL url: $url')).called(1); - verify(_mockNav.pushRoute(any, PandaRouter.assignmentDetails(courseId, assignmentId))); - }); - - testWidgetsWithAccessibilityChecks('returns router error screen for mismatched domain with valid route', - (tester) async { - final courseId = '123'; - final assignmentId = '321'; - final url = 'https://fakedomain.instructure.com/courses/$courseId/assignments/$assignmentId'; - await TestApp.showWidgetFromTap(tester, (context) => PandaRouter.routeInternally(context, url), - config: PlatformConfig(initLoggedInUser: login)); - - verify(_analytics.logMessage('Attempting to route INTERNAL url: $url')).called(1); - verify(_mockNav.pushRoute(any, _routerErrorRoute(url))); - }); - - testWidgetsWithAccessibilityChecks('launches url for route without match', (tester) async { - final url = 'https://test.instructure.com/courses/1567973/pages/key-test'; - - when(_mockLauncher.canLaunch(url)).thenAnswer((_) => Future.value(true)); - when(_mockLauncher.launch(url)).thenAnswer((_) => Future.value(true)); - when(_mockWebContentInteractor.getAuthUrl(url)).thenAnswer((_) => Future.value(url)); - - await TestApp.showWidgetFromTap(tester, (context) => PandaRouter.routeInternally(context, url)); - - verify(_analytics.logMessage('Attempting to route INTERNAL url: $url')).called(1); - verify(_mockLauncher.launch(url)).called(1); - }); - - testWidgetsWithAccessibilityChecks('shows snackbar error for canLaunch false', (tester) async { - final url = 'https://test.instructure.com/brokenurl'; - when(_mockLauncher.canLaunch(url)).thenAnswer((_) => Future.value(false)); - - await TestApp.showWidgetFromTap(tester, (context) => PandaRouter.routeInternally(context, url)); - - verify(_analytics.logMessage('Attempting to route INTERNAL url: $url')).called(1); - verify(_mockSnackbar.showSnackBar(any, 'An error occurred when trying to display this link')); - }); - - testWidgetsWithAccessibilityChecks('launches simpleWebView for limitAccessFlag without match', (tester) async { - final newLogin = login.rebuild((b) => b.user = login.user - .rebuild((user) => user.permissions = UserPermissionBuilder()..limitParentAppWebAccess = true) - .toBuilder()); - - final url = 'https://test.instructure.com/commons/1234'; - when(_mockWebContentInteractor.getAuthUrl(url)).thenAnswer((_) async => url); - - await TestApp.showWidgetFromTap( - tester, - (context) => PandaRouter.routeInternally(context, url), - config: PlatformConfig(initLoggedInUser: newLogin), - ); - - verify(_analytics.logMessage('Attempting to route INTERNAL url: $url')).called(1); - verify(_mockNav.pushRoute(any, PandaRouter.simpleWebViewRoute(url, AppLocalizations().webAccessLimitedMessage, true))); - }); - }); - - group('url route wrapper', () { - test('returns valid UrlRouteWrapper', () { - final path = '/courses/1567973'; - final url = '$_domain$path'; - final routeWrapper = PandaRouter.getRouteWrapper(url); - - assert(routeWrapper.path == path); - assert(routeWrapper.validHost); - assert(routeWrapper.appRouteMatch != null); - }); - - test('returns UrlRouteWrapper with validHost false and null routematch', () { - final path = '/courses/12347/modules/12345'; - final url = 'https://fakedomain.instructure.com$path'; - final routeWrapper = PandaRouter.getRouteWrapper(url); - - assert(routeWrapper.path == path); - assert(routeWrapper.validHost == false); - assert(routeWrapper.appRouteMatch == null); - }); - - test('root path returns with validHost and null routematch', () { - final path = '/'; - final url = '$_domain$path'; - final routeWrapper = PandaRouter.getRouteWrapper(url); - - assert(routeWrapper.path == path); - assert(routeWrapper.validHost == true); - assert(routeWrapper.appRouteMatch == null); - }); - }); -} - -String _rootWithUrl(String url) => 'external?url=${Uri.encodeQueryComponent(url)}'; - -String _routerErrorRoute(String url) => '/error?url=${Uri.encodeQueryComponent(url)}'; - -String _simpleWebViewRoute(String url) => '/internal?url=${Uri.encodeQueryComponent(url)}'; - -Widget _getWidgetFromRoute(String route, {Map>? extraParams}) { - final match = PandaRouter.router.match(route); - - if (extraParams != null) match?.parameters.addAll(extraParams); - final widget = (match!.route.handler as Handler).handlerFunc(null, match.parameters); - - return widget!; -} diff --git a/apps/flutter_parent/test/router/router_error_screen_test.dart b/apps/flutter_parent/test/router/router_error_screen_test.dart deleted file mode 100644 index ec04b0bf93..0000000000 --- a/apps/flutter_parent/test/router/router_error_screen_test.dart +++ /dev/null @@ -1,98 +0,0 @@ -/* - * Copyright (C) 2020 - present Instructure, Inc. - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, version 3 of the License. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -import 'package:flutter/material.dart'; -import 'package:flutter_parent/l10n/app_localizations.dart'; -import 'package:flutter_parent/network/utils/api_prefs.dart'; -import 'package:flutter_parent/network/utils/dio_config.dart'; -import 'package:flutter_parent/router/router_error_screen.dart'; -import 'package:flutter_parent/screens/login_landing_screen.dart'; -import 'package:flutter_parent/utils/db/calendar_filter_db.dart'; -import 'package:flutter_parent/utils/features_utils.dart'; -import 'package:flutter_parent/utils/quick_nav.dart'; -import 'package:flutter_parent/utils/remote_config_utils.dart'; -import 'package:flutter_parent/utils/url_launcher.dart'; -import 'package:flutter_test/flutter_test.dart'; -import 'package:mockito/mockito.dart'; - -import '../screens/courses/course_summary_screen_test.dart'; -import '../utils/accessibility_utils.dart'; -import '../utils/platform_config.dart'; -import '../utils/test_app.dart'; -import '../utils/test_helpers/mock_helpers.dart'; -import '../utils/test_helpers/mock_helpers.mocks.dart'; - -void main() { - final String _domain = 'https://test.instructure.com'; - - setUp(() async { - final mockRemoteConfig = setupMockRemoteConfig(valueSettings: {'qr_login_enabled_parent': 'true'}); - await setupPlatformChannels(config: PlatformConfig(initRemoteConfig: mockRemoteConfig)); - ApiPrefs.init(); - }); - - tearDown(() { - RemoteConfigUtils.clean(); - }); - - testWidgetsWithAccessibilityChecks('router error renders correctly with url', (tester) async { - await tester.pumpWidget(TestApp( - RouterErrorScreen(_domain), - )); - await tester.pumpAndSettle(); - - expect(find.text(AppLocalizations().routerErrorTitle), findsOneWidget); - expect(find.text(AppLocalizations().routerErrorMessage), findsOneWidget); - expect(find.text(AppLocalizations().openInBrowser), findsOneWidget); - expect(find.text(AppLocalizations().switchUsers), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('router error screen open in browser calls launch with url', (tester) async { - final _mockLauncher = MockUrlLauncher(); - setupTestLocator((locator) => locator.registerLazySingleton(() => _mockLauncher)); - - when(_mockLauncher.launch( - _domain, - )).thenAnswer((_) => Future.value(true)); - - await tester.pumpWidget(TestApp( - RouterErrorScreen(_domain), - )); - await tester.pumpAndSettle(); - await tester.tap(find.text(AppLocalizations().openInBrowser)); - await tester.pump(); - - verify(_mockLauncher.launch(_domain)).called(1); - }); - - testWidgetsWithAccessibilityChecks('router error screen switch users', (tester) async { - setupTestLocator((locator) { - locator.registerLazySingleton(() => QuickNav()); - locator.registerLazySingleton(() => MockCalendarFilterDb()); - }); - - await tester.pumpWidget(TestApp( - RouterErrorScreen(_domain), - )); - await tester.pumpAndSettle(); - await tester.tap(find.text(l10n.switchUsers)); - await tester.pumpAndSettle(); - - expect(find.byType(LoginLandingScreen), findsOneWidget); - expect(ApiPrefs.isLoggedIn(), false); - - }); -} diff --git a/apps/flutter_parent/test/screens/account_creation/account_creation_interactor_test.dart b/apps/flutter_parent/test/screens/account_creation/account_creation_interactor_test.dart deleted file mode 100644 index 0569a4a601..0000000000 --- a/apps/flutter_parent/test/screens/account_creation/account_creation_interactor_test.dart +++ /dev/null @@ -1,63 +0,0 @@ -// Copyright (C) 2019 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:flutter_parent/network/api/accounts_api.dart'; -import 'package:flutter_parent/screens/account_creation/account_creation_interactor.dart'; -import 'package:flutter_parent/utils/url_launcher.dart'; -import 'package:mockito/annotations.dart'; -import 'package:mockito/mockito.dart'; -import 'package:test/test.dart'; - -import '../../utils/test_app.dart'; -import '../../utils/test_helpers/mock_helpers.dart'; -import '../../utils/test_helpers/mock_helpers.mocks.dart'; - -void main() { - final launcher = MockUrlLauncher(); - final api = MockAccountsApi(); - - setupTestLocator((locator) { - locator.registerLazySingleton(() => api); - locator.registerLazySingleton(() => launcher); - }); - - setUp(() { - reset(launcher); - reset(api); - }); - - test('getToSForAccount calls the api', () { - AccountCreationInteractor().getToSForAccount('123', 'hodor.com'); - verify(api.getTermsOfServiceForAccount(any, any)); - }); - - test('createNewAccount calls the api', () { - AccountCreationInteractor().createNewAccount('123', '12345', 'hodor', 'hodor@hodor.com', 'hodor', 'hodor.com'); - verify(api.createNewAccount(any, any, any, any, any, any)); - }); - - test('launchDefaultToS calls the url launcher', () { - AccountCreationInteractor().launchDefaultToS(); - verify( - launcher.launch('https://www.instructure.com/policies/terms-of-use-canvas/'), - ).called(1); - }); - - test('launchPrivacyPolicy calls the url launcher', () { - AccountCreationInteractor().launchPrivacyPolicy(); - verify( - launcher.launch('https://www.instructure.com/policies/product-privacy-policy'), - ).called(1); - }); -} diff --git a/apps/flutter_parent/test/screens/account_creation/account_creation_screen_test.dart b/apps/flutter_parent/test/screens/account_creation/account_creation_screen_test.dart deleted file mode 100644 index 1dab9d3388..0000000000 --- a/apps/flutter_parent/test/screens/account_creation/account_creation_screen_test.dart +++ /dev/null @@ -1,440 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'dart:convert'; - -import 'package:dio/dio.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter/rendering.dart'; -import 'package:flutter_parent/models/terms_of_service.dart'; -import 'package:flutter_parent/network/utils/analytics.dart'; -import 'package:flutter_parent/router/panda_router.dart'; -import 'package:flutter_parent/screens/account_creation/account_creation_interactor.dart'; -import 'package:flutter_parent/screens/account_creation/account_creation_screen.dart'; -import 'package:flutter_parent/screens/web_login/web_login_screen.dart'; -import 'package:flutter_parent/utils/common_widgets/loading_indicator.dart'; -import 'package:flutter_parent/utils/design/canvas_icons.dart'; -import 'package:flutter_parent/utils/qr_utils.dart'; -import 'package:flutter_parent/utils/quick_nav.dart'; -import 'package:flutter_test/flutter_test.dart'; -import 'package:mockito/mockito.dart'; - -import '../../utils/accessibility_utils.dart'; -import '../../utils/finders.dart'; -import '../../utils/test_app.dart'; -import '../../utils/test_helpers/mock_helpers.dart'; -import '../../utils/test_helpers/mock_helpers.mocks.dart'; -import '../courses/course_summary_screen_test.dart'; - -/** - * NOTE FOR TEST FILE: A lot of the below tests have minTapSize disabled, this is due to containing inline links, - * which are not required to meet the min tap target size - */ -void main() { - final interactor = MockAccountCreationInteractor(); - final mockNav = MockQuickNav(); - final analytics = MockAnalytics(); - - final tos = TermsOfService((b) => b - ..accountId = '123' - ..id = '123' - ..passive = false); - - final tosPassive = TermsOfService((b) => b - ..accountId = '123' - ..id = '123' - ..passive = true); - - final pairingInfo = QRPairingScanResult.success('123', 'hodor.com', '123') as QRPairingInfo; - final tosString = - 'By tapping \'Create Account\', you agree to the Terms of Service and acknowledge the Privacy Policy'; - - setupTestLocator((locator) { - locator.registerFactory(() => interactor); - locator.registerLazySingleton(() => mockNav); - locator.registerLazySingleton(() => analytics); - }); - - setUp(() { - reset(interactor); - }); - - group('rendering and loading', () { - testWidgetsWithAccessibilityChecks('forms and labels', (tester) async { - when(interactor.getToSForAccount('123', 'hodor.com')).thenAnswer((_) async => tos); - - await tester.pumpWidget(TestApp(AccountCreationScreen(pairingInfo))); - await tester.pumpAndSettle(); - expect(find.text('Full Name'), findsOneWidget); - expect(find.text('Full Name…'), findsOneWidget); - - expect(find.text('Email Address'), findsOneWidget); - expect(find.text('Email…'), findsOneWidget); - - expect(find.text('Password'), findsOneWidget); - expect(find.text('Password…'), findsOneWidget); - - expect(find.byIcon(CanvasIcons.eye), findsOneWidget); - - expect(find.text('Create Account', skipOffstage: false), findsOneWidget); - expect(find.byType(ElevatedButton, skipOffstage: false), findsOneWidget); - }, a11yExclusions: {A11yExclusion.minTapSize}); - - testWidgetsWithAccessibilityChecks('tos and privacy text visible when passive false', (tester) async { - when(interactor.getToSForAccount('123', 'hodor.com')).thenAnswer((_) async => tos); - - await tester.pumpWidget(TestApp(AccountCreationScreen(pairingInfo))); - await tester.pumpAndSettle(); - - expect(find.richText(tosString, skipOffstage: false), findsOneWidget); - }, a11yExclusions: {A11yExclusion.minTapSize}); - - testWidgetsWithAccessibilityChecks('only privacy text visible when passive false', (tester) async { - when(interactor.getToSForAccount('123', 'hodor.com')).thenAnswer((_) async => tosPassive); - - await tester.pumpWidget(TestApp(AccountCreationScreen(pairingInfo))); - await tester.pumpAndSettle(); - - expect(find.richText('View the Privacy Policy', skipOffstage: false), findsOneWidget); - }, a11yExclusions: {A11yExclusion.minTapSize}); - - testWidgetsWithAccessibilityChecks('tos and privacy text visible when passive false', (tester) async { - when(interactor.getToSForAccount('123', 'hodor.com')).thenAnswer((_) async => tos); - - await tester.pumpWidget(TestApp(AccountCreationScreen(pairingInfo))); - await tester.pumpAndSettle(); - - expect(find.richText(tosString, skipOffstage: false), findsOneWidget); - }, a11yExclusions: {A11yExclusion.minTapSize}); - - testWidgetsWithAccessibilityChecks('already have an account text present', (tester) async { - when(interactor.getToSForAccount('123', 'hodor.com')).thenAnswer((_) async => tos); - - await tester.pumpWidget(TestApp(AccountCreationScreen(pairingInfo))); - await tester.pumpAndSettle(); - - expect(find.richText('Already have an account? Sign In', skipOffstage: false), findsOneWidget); - }, a11yExclusions: {A11yExclusion.minTapSize}); - - testWidgetsWithAccessibilityChecks('tos loading indicator', (tester) async { - when(interactor.getToSForAccount('123', 'hodor.com')).thenAnswer((_) async => tos); - - await tester.pumpWidget(TestApp(AccountCreationScreen(pairingInfo))); - await tester.pump(); - - expect(find.byType(LoadingIndicator, skipOffstage: false), findsOneWidget); - }, a11yExclusions: {A11yExclusion.minTapSize}); - }); - - group('form validation and errors', () { - testWidgetsWithAccessibilityChecks('correct forms show no errors', (tester) async { - when(interactor.getToSForAccount('123', 'hodor.com')).thenAnswer((_) async => tos); - - await tester.pumpWidget(TestApp(AccountCreationScreen(pairingInfo))); - await tester.pumpAndSettle(); - await tester.enterText(find.widgetWithText(TextFormField, 'Full Name…'), 'hodor'); - await tester.enterText(find.widgetWithText(TextFormField, 'Email…'), 'hodor@hodor.com'); - await tester.enterText(find.widgetWithText(TextFormField, 'Password…'), '12345678'); - await tester.drag(find.byType(Scaffold), Offset(0, -500)); - await tester.pumpAndSettle(); - - await tester.tap(find.byType(ElevatedButton)); - await tester.pumpAndSettle(); - - expect(find.text('Please enter full name'), findsNothing); - expect(find.text('Please enter an email address'), findsNothing); - expect(find.text('Please enter a valid email address'), findsNothing); - expect(find.text('Password is required'), findsNothing); - expect(find.text('Password must contain at least 8 characters'), findsNothing); - }, a11yExclusions: {A11yExclusion.minTapSize}); - - testWidgetsWithAccessibilityChecks('empty forms show errors', (tester) async { - when(interactor.getToSForAccount('123', 'hodor.com')).thenAnswer((_) async => tos); - - await tester.pumpWidget(TestApp(AccountCreationScreen(pairingInfo))); - await tester.pumpAndSettle(); - await tester.drag(find.byType(Scaffold), Offset(0, -500)); - await tester.pumpAndSettle(); - - await tester.tap(find.byType(ElevatedButton)); - await tester.pumpAndSettle(); - - expect(find.text('Please enter full name'), findsOneWidget); - expect(find.text('Please enter an email address'), findsOneWidget); - expect(find.text('Password is required'), findsOneWidget); - }, a11yExclusions: {A11yExclusion.minTapSize}); - - testWidgetsWithAccessibilityChecks('password too short error', (tester) async { - when(interactor.getToSForAccount('123', 'hodor.com')).thenAnswer((_) async => tos); - - await tester.pumpWidget(TestApp(AccountCreationScreen(pairingInfo))); - await tester.pumpAndSettle(); - - await tester.enterText(find.widgetWithText(TextFormField, 'Password…'), '1234567'); - - await tester.drag(find.byType(Scaffold), Offset(0, -500)); - await tester.pumpAndSettle(); - - await tester.tap(find.byType(ElevatedButton)); - await tester.pumpAndSettle(); - - expect(find.text('Password must contain at least 8 characters'), findsOneWidget); - }, a11yExclusions: {A11yExclusion.minTapSize}); - - testWidgetsWithAccessibilityChecks('invalid email error', (tester) async { - when(interactor.getToSForAccount('123', 'hodor.com')).thenAnswer((_) async => tos); - - await tester.pumpWidget(TestApp(AccountCreationScreen(pairingInfo))); - await tester.pumpAndSettle(); - - await tester.enterText(find.widgetWithText(TextFormField, 'Email…'), 'hodor'); - - await tester.drag(find.byType(Scaffold), Offset(0, -500)); - await tester.pumpAndSettle(); - - await tester.tap(find.byType(ElevatedButton)); - await tester.pumpAndSettle(); - - expect(find.text('Please enter a valid email address'), findsOneWidget); - }, a11yExclusions: {A11yExclusion.minTapSize}); - }); - - group('inline links', () { - testWidgetsWithAccessibilityChecks('sign in link pushes login route', (tester) async { - when(interactor.getToSForAccount('123', 'hodor.com')).thenAnswer((_) async => tos); - - await tester.pumpWidget(TestApp(AccountCreationScreen(pairingInfo))); - await tester.pumpAndSettle(); - await tester.drag(find.byType(Scaffold), Offset(0, -500)); - await tester.pumpAndSettle(); - - await tester.tap(find.richText('Already have an account? Sign In')); - - verify(mockNav.pushRoute(any, PandaRouter.loginWeb('hodor.com', loginFlow: LoginFlow.normal))); - }, a11yExclusions: {A11yExclusion.minTapSize}); - - testWidgetsWithAccessibilityChecks('Tos link pushes tos route', (tester) async { - when(interactor.getToSForAccount('123', 'hodor.com')).thenAnswer((_) async => tos); - - await tester.pumpWidget(TestApp(AccountCreationScreen(pairingInfo))); - await tester.pumpAndSettle(); - - await tester.drag(find.byType(Scaffold), Offset(0, -1000)); - await tester.pumpAndSettle(); - - // Get text selection for 'Canvas Support' span - var targetText = l10n.qrCreateAccountTermsOfService; - var bodyWidget = tester.widget(find.byKey(AccountCreationScreen.accountCreationTextSpanKey)); - var bodyText = bodyWidget.textSpan?.toPlainText() ?? ''; - var index = bodyText.indexOf(targetText); - var selection = TextSelection(baseOffset: index, extentOffset: index + targetText.length); - - // Get clickable area - RenderParagraph box = AccountCreationScreen.accountCreationTextSpanKey.currentContext?.findRenderObject() as RenderParagraph; - var bodyOffset = box.localToGlobal(Offset.zero); - var textOffset = box.getBoxesForSelection(selection)[0].toRect().center; - - await tester.tapAt(bodyOffset + textOffset); - - verify(mockNav.pushRoute(any, PandaRouter.termsOfUse(accountId: '123', domain: 'hodor.com'))); - }, a11yExclusions: {A11yExclusion.minTapSize}); - - testWidgetsWithAccessibilityChecks('failed tos load launches default tos url', (tester) async { - when(interactor.getToSForAccount('123', 'hodor.com')).thenAnswer((_) async => null); - - await tester.pumpWidget(TestApp(AccountCreationScreen(pairingInfo))); - await tester.pumpAndSettle(); - - await tester.drag(find.byType(Scaffold), Offset(0, -1000)); - await tester.pumpAndSettle(); - - // Get text selection for 'Canvas Support' span - var targetText = l10n.qrCreateAccountTermsOfService; - var bodyWidget = tester.widget(find.byKey(AccountCreationScreen.accountCreationTextSpanKey)); - var bodyText = bodyWidget.textSpan?.toPlainText() ?? ''; - var index = bodyText.indexOf(targetText); - var selection = TextSelection(baseOffset: index, extentOffset: index + targetText.length); - - // Get clickable area - RenderParagraph box = AccountCreationScreen.accountCreationTextSpanKey.currentContext?.findRenderObject() as RenderParagraph; - var bodyOffset = box.localToGlobal(Offset.zero); - var textOffset = box.getBoxesForSelection(selection)[0].toRect().center; - - await tester.tapAt(bodyOffset + textOffset); - - verify(interactor.launchDefaultToS()); - }, a11yExclusions: {A11yExclusion.minTapSize}); - - testWidgetsWithAccessibilityChecks('privacy policy link launches privacy policy url', (tester) async { - when(interactor.getToSForAccount('123', 'hodor.com')).thenAnswer((_) async => null); - - await tester.pumpWidget(TestApp(AccountCreationScreen(pairingInfo))); - await tester.pumpAndSettle(); - - await tester.drag(find.byType(Scaffold), Offset(0, -1000)); - await tester.pumpAndSettle(); - - // Get text selection for 'Canvas Support' span - var targetText = l10n.qrCreateAccountPrivacyPolicy; - var bodyWidget = tester.widget(find.byKey(AccountCreationScreen.accountCreationTextSpanKey)); - var bodyText = bodyWidget.textSpan?.toPlainText() ?? ''; - var index = bodyText.indexOf(targetText); - var selection = TextSelection(baseOffset: index, extentOffset: index + targetText.length); - - // Get clickable area - RenderParagraph box = AccountCreationScreen.accountCreationTextSpanKey.currentContext?.findRenderObject() as RenderParagraph; - var bodyOffset = box.localToGlobal(Offset.zero); - var textOffset = box.getBoxesForSelection(selection)[0].toRect().center; - - await tester.tapAt(bodyOffset + textOffset); - - verify(interactor.launchPrivacyPolicy()); - }, a11yExclusions: {A11yExclusion.minTapSize}); - - testWidgetsWithAccessibilityChecks('passive tos privacy policy link launches privacy policy url', (tester) async { - when(interactor.getToSForAccount('123', 'hodor.com')).thenAnswer((_) async => tosPassive); - - await tester.pumpWidget(TestApp(AccountCreationScreen(pairingInfo))); - await tester.pumpAndSettle(); - - await tester.drag(find.byType(Scaffold), Offset(0, -1000)); - await tester.pumpAndSettle(); - - await tester.tap(find.richText(l10n.qrCreateAccountViewPrivacy)); - - verify(interactor.launchPrivacyPolicy()); - }, a11yExclusions: {A11yExclusion.minTapSize}); - }); - - group('account creation', () { - testWidgetsWithAccessibilityChecks('valid form account creation pushes login route', (tester) async { - when(interactor.getToSForAccount('123', 'hodor.com')).thenAnswer((_) async => tos); - when(interactor.createNewAccount('123', '123', 'hodor', 'hodor@hodor.com', '12345678', 'hodor.com')) - .thenAnswer((_) async => Response(statusCode: 200, requestOptions: RequestOptions(path: ''))); - - await tester.pumpWidget(TestApp(AccountCreationScreen(pairingInfo))); - await tester.pumpAndSettle(); - - await tester.enterText(find.widgetWithText(TextFormField, 'Full Name…'), 'hodor'); - await tester.enterText(find.widgetWithText(TextFormField, 'Email…'), 'hodor@hodor.com'); - await tester.enterText(find.widgetWithText(TextFormField, 'Password…'), '12345678'); - - await tester.drag(find.byType(Scaffold), Offset(0, -500)); - - await tester.pumpAndSettle(); - - await tester.tap(find.byType(ElevatedButton)); - - verify(mockNav.pushRoute(any, PandaRouter.loginWeb('hodor.com', loginFlow: LoginFlow.normal))); - verify(analytics.logEvent( - AnalyticsEventConstants.QR_ACCOUNT_SUCCESS, - extras: {AnalyticsParamConstants.DOMAIN_PARAM: 'hodor.com'}, - )); - }, a11yExclusions: {A11yExclusion.minTapSize}); - - testWidgetsWithAccessibilityChecks('account creation with invalid pairing code shows error', (tester) async { - final jsonData = json.decode( - '{\"errors\":{\"user\":{},\"pseudonym\":{},\"observee\":{},\"pairing_code\":{\"code\":[{\"attribute\":\"code\",\"type\":\"invalid\",\"message\":\"invalid\"}]},\"recaptcha\":null}}'); - when(interactor.getToSForAccount('123', 'hodor.com')).thenAnswer((_) async => tos); - when(interactor.createNewAccount('123', '123', 'hodor', 'hodor@hodor.com', '12345678', 'hodor.com')) - .thenThrow(DioError(response: Response(data: jsonData, requestOptions: RequestOptions(path: '')), requestOptions: RequestOptions(path: ''))); - - await tester.pumpWidget(TestApp(AccountCreationScreen(pairingInfo))); - await tester.pumpAndSettle(); - - await tester.enterText(find.widgetWithText(TextFormField, 'Full Name…'), 'hodor'); - await tester.enterText(find.widgetWithText(TextFormField, 'Email…'), 'hodor@hodor.com'); - await tester.enterText(find.widgetWithText(TextFormField, 'Password…'), '12345678'); - - await tester.drag(find.byType(Scaffold), Offset(0, -500)); - - await tester.pumpAndSettle(); - - await tester.tap(find.byType(ElevatedButton)); - - await tester.pump(); - await tester.pump(); - await tester.pump(); - - expect(find.text('Your code is incorrect or expired.', skipOffstage: false), findsOneWidget); - verify(analytics.logEvent( - AnalyticsEventConstants.QR_ACCOUNT_FAILURE, - extras: {AnalyticsParamConstants.DOMAIN_PARAM: 'hodor.com'}, - )); - }, a11yExclusions: {A11yExclusion.minTapSize}); - - testWidgetsWithAccessibilityChecks('account creation with invalid email shows error', (tester) async { - final jsonData = json.decode( - '{\"errors\":{\"user\":{\"pseudonyms\":[{\"message\":\"invalid\"}]},\"pseudonym\":{},\"observee\":{},\"pairing_code\":{},\"recaptcha\":null}}'); - when(interactor.getToSForAccount('123', 'hodor.com')).thenAnswer((_) async => tos); - when(interactor.createNewAccount('123', '123', 'hodor', 'hodor@hodor.com', '12345678', 'hodor.com')) - .thenThrow(DioError(response: Response(data: jsonData, requestOptions: RequestOptions(path: '')), requestOptions: RequestOptions(path: ''))); - - await tester.pumpWidget(TestApp(AccountCreationScreen(pairingInfo))); - await tester.pumpAndSettle(); - - await tester.enterText(find.widgetWithText(TextFormField, 'Full Name…'), 'hodor'); - await tester.enterText(find.widgetWithText(TextFormField, 'Email…'), 'hodor@hodor.com'); - await tester.enterText(find.widgetWithText(TextFormField, 'Password…'), '12345678'); - - await tester.drag(find.byType(Scaffold), Offset(0, -500)); - - await tester.pumpAndSettle(); - - await tester.tap(find.byType(ElevatedButton)); - - await tester.pump(); - await tester.pump(); - await tester.pump(); - - expect(find.text('Please enter a valid email address'), findsOneWidget); - verify(analytics.logEvent( - AnalyticsEventConstants.QR_ACCOUNT_FAILURE, - extras: {AnalyticsParamConstants.DOMAIN_PARAM: 'hodor.com'}, - )); - }, a11yExclusions: {A11yExclusion.minTapSize}); - }); - - testWidgetsWithAccessibilityChecks('account creation with error shows generic error message', (tester) async { - when(interactor.getToSForAccount('123', 'hodor.com')).thenAnswer((_) async => tos); - when(interactor.createNewAccount('123', '123', 'hodor', 'hodor@hodor.com', '12345678', 'hodor.com')) - .thenThrow(DioError(response: Response(requestOptions: RequestOptions(path: '')), requestOptions: RequestOptions(path: ''))); - - await tester.pumpWidget(TestApp(AccountCreationScreen(pairingInfo))); - await tester.pumpAndSettle(); - - await tester.enterText(find.widgetWithText(TextFormField, 'Full Name…'), 'hodor'); - await tester.enterText(find.widgetWithText(TextFormField, 'Email…'), 'hodor@hodor.com'); - await tester.enterText(find.widgetWithText(TextFormField, 'Password…'), '12345678'); - - await tester.drag(find.byType(Scaffold), Offset(0, -500)); - - await tester.pumpAndSettle(); - - await tester.tap(find.byType(ElevatedButton)); - - await tester.pump(); - await tester.pump(); - await tester.pump(); - - expect( - find.text( - 'Something went wrong trying to create your account, please reach out to your school for assistance.'), - findsOneWidget); - verify(analytics.logEvent( - AnalyticsEventConstants.QR_ACCOUNT_FAILURE, - extras: {AnalyticsParamConstants.DOMAIN_PARAM: 'hodor.com'}, - )); - }, a11yExclusions: {A11yExclusion.minTapSize}); -} diff --git a/apps/flutter_parent/test/screens/alert_thresholds/alert_thresholds_extensions_test.dart b/apps/flutter_parent/test/screens/alert_thresholds/alert_thresholds_extensions_test.dart deleted file mode 100644 index 1eab98dc90..0000000000 --- a/apps/flutter_parent/test/screens/alert_thresholds/alert_thresholds_extensions_test.dart +++ /dev/null @@ -1,92 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:flutter_parent/models/alert.dart'; -import 'package:flutter_parent/models/alert_threshold.dart'; -import 'package:flutter_parent/screens/alert_thresholds/alert_thresholds_extensions.dart'; -import 'package:flutter_test/flutter_test.dart'; - -void main() { - group('List - Get Threshold From Type', () { - test('non-existing threshold returns null', () { - List thresholds = []; - AlertType type = AlertType.courseGradeLow; - - expect(thresholds.getThreshold(type), null); - }); - - test('existing threshold returns threshold', () { - AlertThreshold threshold = _mockThreshold(AlertType.assignmentMissing); - List thresholds = [ - _mockThreshold(AlertType.courseGradeLow, value: '23'), - threshold, - _mockThreshold(AlertType.courseAnnouncement) - ]; - AlertType type = AlertType.assignmentMissing; - - expect(thresholds.getThreshold(type), threshold); - }); - }); - - group('AlertType - Get Threshold Min/Max', () { - test('Course grade low: null/course grade high', () { - AlertType testingType = AlertType.courseGradeLow; - String highValue = '42'; - List expectedResult = [null, highValue]; - AlertThreshold courseGradeLow = _mockThreshold(testingType, value: '24'); - AlertThreshold courseGradeHigh = _mockThreshold(AlertType.courseGradeHigh, value: highValue); - List thresholds = [courseGradeLow, courseGradeHigh]; - - expect(testingType.getMinMax(thresholds), expectedResult); - }); - - test('Course grade high: course grade low/null', () { - AlertType testingType = AlertType.courseGradeHigh; - String lowValue = '24'; - List expectedResult = [lowValue, null]; - AlertThreshold courseGradeLow = _mockThreshold(AlertType.courseGradeLow, value: lowValue); - AlertThreshold courseGradeHigh = _mockThreshold(testingType, value: '42'); - List thresholds = [courseGradeLow, courseGradeHigh]; - - expect(testingType.getMinMax(thresholds), expectedResult); - }); - - test('Assignment grade low: null/assignment grade high', () { - AlertType testingType = AlertType.assignmentGradeLow; - String highValue = '42'; - List expectedResult = [null, highValue]; - AlertThreshold assignmentGradeLow = _mockThreshold(testingType, value: '24'); - AlertThreshold assignmentGradeHigh = _mockThreshold(AlertType.assignmentGradeHigh, value: highValue); - List thresholds = [assignmentGradeLow, assignmentGradeHigh]; - - expect(testingType.getMinMax(thresholds), expectedResult); - }); - - test('Assignment grade high: assignment grade low/null', () { - AlertType testingType = AlertType.assignmentGradeHigh; - String lowValue = '24'; - List expectedResult = [lowValue, null]; - AlertThreshold assignmentGradeLow = _mockThreshold(AlertType.assignmentGradeLow, value: lowValue); - AlertThreshold assignmentGradeHigh = _mockThreshold(testingType, value: '42'); - List thresholds = [assignmentGradeLow, assignmentGradeHigh]; - - expect(testingType.getMinMax(thresholds), expectedResult); - }); - }); -} - -AlertThreshold _mockThreshold(AlertType? type, {String? value}) => AlertThreshold((b) => b - ..alertType = type ?? AlertType.courseGradeLow - ..threshold = value ?? null - ..build()); diff --git a/apps/flutter_parent/test/screens/alert_thresholds/alert_thresholds_interactor_test.dart b/apps/flutter_parent/test/screens/alert_thresholds/alert_thresholds_interactor_test.dart deleted file mode 100644 index d47139ca26..0000000000 --- a/apps/flutter_parent/test/screens/alert_thresholds/alert_thresholds_interactor_test.dart +++ /dev/null @@ -1,120 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:flutter_parent/models/alert.dart'; -import 'package:flutter_parent/models/alert_threshold.dart'; -import 'package:flutter_parent/network/api/alert_api.dart'; -import 'package:flutter_parent/network/api/enrollments_api.dart'; -import 'package:flutter_parent/screens/alert_thresholds/alert_thresholds_interactor.dart'; -import 'package:flutter_test/flutter_test.dart'; -import 'package:mockito/mockito.dart'; - -import '../../utils/test_app.dart'; -import '../../utils/test_helpers/mock_helpers.dart'; -import '../../utils/test_helpers/mock_helpers.mocks.dart'; - -void main() { - AlertThreshold _mockThreshold(AlertType type, {String? value}) => AlertThreshold((b) => b - ..alertType = type - ..threshold = value - ..build()); - - final api = MockAlertsApi(); - final enrollmentsApi = MockEnrollmentsApi(); - - setupTestLocator((locator) { - locator.registerFactory(() => api); - locator.registerFactory(() => enrollmentsApi); - }); - - setUp(() { - reset(api); - reset(enrollmentsApi); - }); - - test('Switch created api call', () async { - when(api.createThreshold(any, any)).thenAnswer((_) => Future.value(null)); - - var type = AlertType.assignmentMissing; - var alertThreshold = null; - var studentId = '1234'; - - await AlertThresholdsInteractor().updateAlertThreshold(type, studentId, alertThreshold); - - verify(api.createThreshold(type, studentId)).called(1); - }); - - test('Switch deleted api call', () async { - when(api.deleteAlert(any)).thenAnswer((_) => Future.value(null)); - - var type = AlertType.assignmentMissing; - var alertThreshold = _mockThreshold(type); - var studentId = '1234'; - - await AlertThresholdsInteractor().updateAlertThreshold(alertThreshold.alertType, studentId, alertThreshold); - - verify(api.deleteAlert(alertThreshold)).called(1); - }); - - test('Percentage updated api call', () async { - when(api.createThreshold(any, any)).thenAnswer((_) => Future.value(null)); - - var type = AlertType.courseGradeLow; - var value = '42'; - var alertThreshold = _mockThreshold(type); - var studentId = '1234'; - - await AlertThresholdsInteractor().updateAlertThreshold(type, studentId, alertThreshold, value: value); - - verify(api.createThreshold(type, studentId, value: value)).called(1); - }); - - test('Percentage deleted api call', () async { - when(api.deleteAlert(any)).thenAnswer((_) => Future.value(null)); - - var type = AlertType.courseGradeLow; - var value = '-1'; - var alertThreshold = _mockThreshold(type); - var studentId = '1234'; - - await AlertThresholdsInteractor() - .updateAlertThreshold(alertThreshold.alertType, studentId, alertThreshold, value: value); - - verify(api.deleteAlert(alertThreshold)).called(1); - }); - - test('getAlertThresholdsForStudent calls through to the api', () async { - var studentId = '1234'; - - await AlertThresholdsInteractor().getAlertThresholdsForStudent(studentId, forceRefresh: true); - - verify(api.getAlertThresholds(studentId, true)).called(1); - }); - - test('canDeleteStudent calls through to the api', () async { - var studentId = '1234'; - - await AlertThresholdsInteractor().canDeleteStudent(studentId); - - verify(enrollmentsApi.canUnpairStudent(studentId)); - }); - - test('deleteStudent calls through to the api', () async { - var studentId = '1234'; - - await AlertThresholdsInteractor().deleteStudent(studentId); - - verify(enrollmentsApi.unpairStudent(studentId)); - }); -} diff --git a/apps/flutter_parent/test/screens/alert_thresholds/alert_thresholds_percent_dialog_test.dart b/apps/flutter_parent/test/screens/alert_thresholds/alert_thresholds_percent_dialog_test.dart deleted file mode 100644 index 0867bb1a8f..0000000000 --- a/apps/flutter_parent/test/screens/alert_thresholds/alert_thresholds_percent_dialog_test.dart +++ /dev/null @@ -1,369 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:flutter/material.dart'; -import 'package:flutter_parent/l10n/app_localizations.dart'; -import 'package:flutter_parent/models/alert.dart'; -import 'package:flutter_parent/models/alert_threshold.dart'; -import 'package:flutter_parent/screens/alert_thresholds/alert_thresholds_interactor.dart'; -import 'package:flutter_parent/screens/alert_thresholds/alert_thresholds_percentage_dialog.dart'; -import 'package:flutter_test/flutter_test.dart'; -import 'package:get_it/get_it.dart'; -import 'package:mockito/mockito.dart'; - -import '../../utils/accessibility_utils.dart'; -import '../../utils/test_app.dart'; -import '../../utils/test_helpers/mock_helpers.mocks.dart'; - -void main() { - group('Render', () { - testWidgetsWithAccessibilityChecks('header', (tester) async { - var widget = TestApp( - AlertThresholdsPercentageDialog([], AlertType.courseGradeLow, ''), - ); - - await tester.pumpWidget(widget); - await tester.pumpAndSettle(); - - expect(find.text(AppLocalizations().courseGradeBelow), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('text input', (tester) async { - var widget = TestApp( - AlertThresholdsPercentageDialog([], AlertType.courseGradeLow, ''), - ); - - await tester.pumpWidget(widget); - await tester.pumpAndSettle(); - - expect(find.byType(TextFormField), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('action buttons', (tester) async { - var widget = TestApp( - AlertThresholdsPercentageDialog([], AlertType.courseGradeLow, ''), - ); - - await tester.pumpWidget(widget); - await tester.pumpAndSettle(); - - expect(find.byType(TextButton), findsNWidgets(3)); - expect(find.text(AppLocalizations().cancel.toUpperCase()), findsOneWidget); - expect(find.text(AppLocalizations().never.toUpperCase()), findsOneWidget); - expect(find.text(AppLocalizations().ok), findsOneWidget); - }); - - testWidgets('initial value', (tester) async { - var initialValue = '42'; - var initialThreshold = _mockThreshold(type: AlertType.courseGradeLow, value: initialValue); - var alertType = AlertType.courseGradeLow; - var studentId = ''; - - // Setup the dialog - var widget = TestApp( - AlertThresholdsPercentageDialog([initialThreshold], alertType, studentId), - ); - - // Launch the dialog - await tester.pumpWidget(widget); - await tester.pumpAndSettle(); - - // Check for the initial value - expect(find.text(initialValue), findsOneWidget); - }); - }); - - group('Validation', () { - testWidgetsWithAccessibilityChecks('only numbers allowed', (tester) async { - String alphaText = 'Instructure'; - String numText = '99'; - - var widget = TestApp( - AlertThresholdsPercentageDialog([], AlertType.courseGradeLow, ''), - ); - - await tester.pumpWidget(widget); - await tester.pumpAndSettle(); - - await tester.enterText(find.byType(TextFormField), alphaText); - expect(find.text(alphaText), findsNothing); - - await tester.enterText(find.byType(TextFormField), numText); - expect(find.text(numText), findsOneWidget); - }); - - testWidgets('error message when setting low >= high', (tester) async { - String lowInput = '99'; - int highInput = 80; - AlertThreshold highThreshold = _mockThreshold(type: AlertType.courseGradeHigh, value: highInput.toString()); - - var widget = TestApp( - AlertThresholdsPercentageDialog([highThreshold], AlertType.courseGradeLow, ''), - ); - - await tester.pumpWidget(widget); - await tester.pumpAndSettle(); - - // Enter invalid input - await tester.enterText(find.byType(TextFormField), lowInput); - expect(find.text(lowInput), findsOneWidget); - await tester.pumpAndSettle(); - - // Check for error message - expect(find.text(AppLocalizations().mustBeBelowN(highInput)), findsOneWidget); - }); - - testWidgets('error message when setting high <= low', (tester) async { - int lowInput = 99; - String highInput = '80'; - AlertThreshold lowThreshold = _mockThreshold(type: AlertType.courseGradeLow, value: lowInput.toString()); - - var widget = TestApp( - AlertThresholdsPercentageDialog([lowThreshold], AlertType.courseGradeHigh, ''), - ); - - await tester.pumpWidget(widget); - await tester.pumpAndSettle(); - - // Enter invalid input - await tester.enterText(find.byType(TextFormField), highInput); - expect(find.text(highInput), findsOneWidget); - await tester.pumpAndSettle(); - - // Check for error message - expect(find.text(AppLocalizations().mustBeAboveN(lowInput)), findsOneWidget); - }); - - testWidgets('error message when input > 100', (tester) async { - String input = '999'; - - var widget = TestApp( - AlertThresholdsPercentageDialog([], AlertType.courseGradeLow, ''), - ); - - await tester.pumpWidget(widget); - await tester.pumpAndSettle(); - - // Enter invalid input - await tester.enterText(find.byType(TextFormField), input); - expect(find.text(input), findsOneWidget); - await tester.pumpAndSettle(); - - // Check for error message - expect(find.text(AppLocalizations().mustBeBelow100), findsOneWidget); - }); - - testWidgets('disable ok button when input > 100', (tester) async { - String input = '999'; - - var widget = TestApp( - AlertThresholdsPercentageDialog([], AlertType.courseGradeLow, ''), - ); - - await tester.pumpWidget(widget); - await tester.pumpAndSettle(); - - // Enter invalid input - await tester.enterText(find.byType(TextFormField), input); - expect(find.text(input), findsOneWidget); - await tester.pumpAndSettle(); - - // Check for error message - expect(tester.widget(find.byKey(AlertThresholdsPercentageDialogState.okButtonKey)).enabled, isFalse); - }); - - testWidgets('disable ok button when setting low >= high', (tester) async { - String input = '70'; - - AlertThreshold highThreshold = _mockThreshold(type: AlertType.courseGradeHigh, value: '50'); - - var widget = TestApp( - AlertThresholdsPercentageDialog([highThreshold], AlertType.courseGradeLow, ''), - ); - - await tester.pumpWidget(widget); - await tester.pumpAndSettle(); - - // Enter invalid input - await tester.enterText(find.byType(TextFormField), input); - expect(find.text(input), findsOneWidget); - await tester.pumpAndSettle(); - - // Check for error message - expect(tester.widget(find.byKey(AlertThresholdsPercentageDialogState.okButtonKey)).enabled, isFalse); - }); - - testWidgets('disable ok button when setting high <= low', (tester) async { - String input = '40'; - - AlertThreshold lowThreshold = _mockThreshold(type: AlertType.courseGradeLow, value: '50'); - - var widget = TestApp( - AlertThresholdsPercentageDialog([lowThreshold], AlertType.courseGradeHigh, ''), - ); - - await tester.pumpWidget(widget); - await tester.pumpAndSettle(); - - // Enter invalid input - await tester.enterText(find.byType(TextFormField), input); - expect(find.text(input), findsOneWidget); - await tester.pumpAndSettle(); - - // Check for error message - expect(tester.widget(find.byKey(AlertThresholdsPercentageDialogState.okButtonKey)).enabled, isFalse); - }); - }); - - group('Actions', () { - // See Alert Thresholds Screen test for testing the result of tapping 'never' - testWidgets('never - closes dialog, returns threshold with value of -1', (tester) async { - AlertThreshold initial = _mockThreshold(type: AlertType.courseGradeLow, value: '42'); - AlertThreshold response = initial.rebuild((b) => b.threshold = '-1'); - AlertThreshold? result; - - var interactor = MockAlertThresholdsInteractor(); - when(interactor.updateAlertThreshold(any, any, any, value: anyNamed('value'))) - .thenAnswer((_) => Future.value(response)); - - _setupLocator(thresholdsInteractor: interactor); - - var widget = TestApp(Builder( - builder: (context) => Container( - child: ElevatedButton(onPressed: () async { - result = await showDialog( - context: context, - builder:(_) => AlertThresholdsPercentageDialog([initial], AlertType.courseGradeLow, '')); - }, - child: Container(), - )))); - - // Show the dialog - await tester.pumpWidget(widget); - await tester.pumpAndSettle(); - await tester.tap(find.byType(ElevatedButton)); - await tester.pumpAndSettle(); - - // Check to see if our initial value is there - expect(find.text(initial.threshold!), findsOneWidget); - - // Tap on 'never' - await tester.tap(find.text(AppLocalizations().never.toUpperCase())); - await tester.pumpAndSettle(); - - // Check if the dialog has been dismissed - expect(find.byType(AlertThresholdsPercentageDialog), findsNothing); - expect(result, initial.rebuild((b) => b.threshold = '-1')); - }); - - testWidgets('cancel - dismisses dialog', (tester) async { - // The dialog won't dismiss if it is the only child in the TestApp widget - var widget = TestApp(Builder( - builder: (context) => Container( - child: ElevatedButton( - child: Container(), - onPressed: () async { - showDialog( - context: context, builder:(_) => AlertThresholdsPercentageDialog([], AlertType.courseGradeLow, '')); - }), - ))); - - // Show the dialog - await tester.pumpWidget(widget); - await tester.pumpAndSettle(); - await tester.tap(find.byType(ElevatedButton)); - await tester.pumpAndSettle(); - - // Tap cancel - await tester.tap(find.text(AppLocalizations().cancel.toUpperCase())); - await tester.pumpAndSettle(); - - expect(find.byType(AlertThresholdsPercentageDialog), findsNothing); - }); - - testWidgetsWithAccessibilityChecks('OK - calls interactor update method', (tester) async { - var initialValue = '42'; - var initialThreshold = _mockThreshold(type: AlertType.courseGradeLow, value: initialValue); - var updatedValue = '24'; - var updatedThreshold = _mockThreshold(type: AlertType.courseGradeLow, value: updatedValue); - var alertType = AlertType.courseGradeLow; - var studentId = '23'; - - var interactor = MockAlertThresholdsInteractor(); - when(interactor.updateAlertThreshold(any, any, any, value: anyNamed('value'))) - .thenAnswer((_) => Future.value(updatedThreshold)); - - _setupLocator(thresholdsInteractor: interactor); - - // Setup the dialog - var widget = TestApp( - AlertThresholdsPercentageDialog([initialThreshold], alertType, studentId), - ); - - // Launch the dialog - await tester.pumpWidget(widget); - await tester.pumpAndSettle(); - - // Enter value - await tester.enterText(find.byType(TextFormField), updatedValue); - expect(find.text(updatedValue), findsOneWidget); - - // Tap 'OK' - await tester.tap(find.text(AppLocalizations().ok)); - await tester.pump(); - await tester.pump(); - - await tester.pumpAndSettle(); - - // Verify we called into the interactor - verify(interactor.updateAlertThreshold(any, any, any, value: updatedValue)).called(1); - }); - - testWidgets('on submit - network failure shows error message', (tester) async { - var interactor = MockAlertThresholdsInteractor(); - when(interactor.updateAlertThreshold(any, any, any, value: anyNamed('value'))) - .thenAnswer((_) => Future.error('error')); - - _setupLocator(thresholdsInteractor: interactor); - - var widget = TestApp( - AlertThresholdsPercentageDialog( - [_mockThreshold(type: AlertType.courseGradeLow, value: '42')], AlertType.courseGradeLow, ''), - ); - - // Show the dialog - await tester.pumpWidget(widget); - await tester.pumpAndSettle(); - - // Tap on 'never' - await tester.tap(find.text(AppLocalizations().never.toUpperCase())); - await tester.pumpAndSettle(); - - // Check for error message - expect(find.text(AppLocalizations().genericNetworkError), findsOneWidget); - }); - }); -} - -void _setupLocator({AlertThresholdsInteractor? thresholdsInteractor}) async { - var locator = GetIt.instance; - await locator.reset(); - - locator.registerFactory(() => thresholdsInteractor ?? MockAlertThresholdsInteractor()); -} - -AlertThreshold _mockThreshold({AlertType? type, String? value}) => AlertThreshold((b) => b - ..alertType = type ?? AlertType.courseGradeLow - ..threshold = value ?? null - ..build()); diff --git a/apps/flutter_parent/test/screens/alert_thresholds/alert_thresholds_screen_test.dart b/apps/flutter_parent/test/screens/alert_thresholds/alert_thresholds_screen_test.dart deleted file mode 100644 index 476b541cec..0000000000 --- a/apps/flutter_parent/test/screens/alert_thresholds/alert_thresholds_screen_test.dart +++ /dev/null @@ -1,370 +0,0 @@ -// Copyright (C) 2019 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:flutter/material.dart'; -import 'package:flutter_parent/l10n/app_localizations.dart'; -import 'package:flutter_parent/models/alert.dart'; -import 'package:flutter_parent/models/alert_threshold.dart'; -import 'package:flutter_parent/models/user.dart'; -import 'package:flutter_parent/screens/alert_thresholds/alert_thresholds_interactor.dart'; -import 'package:flutter_parent/screens/alert_thresholds/alert_thresholds_percentage_dialog.dart'; -import 'package:flutter_parent/screens/alert_thresholds/alert_thresholds_screen.dart'; -import 'package:flutter_parent/utils/common_widgets/avatar.dart'; -import 'package:flutter_parent/utils/common_widgets/error_panda_widget.dart'; -import 'package:flutter_parent/utils/common_widgets/loading_indicator.dart'; -import 'package:flutter_parent/utils/quick_nav.dart'; -import 'package:flutter_test/flutter_test.dart'; -import 'package:intl/intl.dart'; -import 'package:mockito/mockito.dart'; - -import '../../utils/accessibility_utils.dart'; -import '../../utils/canvas_model_utils.dart'; -import '../../utils/network_image_response.dart'; -import '../../utils/test_app.dart'; -import '../../utils/test_helpers/mock_helpers.mocks.dart'; - -void main() { - // For user images - mockNetworkImageResponse(); - - final interactor = MockAlertThresholdsInteractor(); - - setupTestLocator((locator) { - locator.registerFactory(() => interactor); - }); - - setUp(() { - reset(interactor); - }); - - group('Render', () { - testWidgetsWithAccessibilityChecks('shows student', (tester) async { - when(interactor.getAlertThresholdsForStudent(any)).thenAnswer((_) => Future.value([])); - - await _setupScreen(tester, CanvasModelTestUtils.mockUser(name: 'Panda')); - await tester.pumpAndSettle(); - - expect(find.text('Panda Panda'), findsOneWidget); - expect(find.byType(Avatar), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('shows \'alert me\' header', (tester) async { - when(interactor.getAlertThresholdsForStudent(any)).thenAnswer((_) => Future.value([])); - - await _setupScreen(tester, CanvasModelTestUtils.mockUser(name: 'Panda')); - await tester.pumpAndSettle(); - - expect(find.text(AppLocalizations().alertMeWhen), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('shows loading', (tester) async { - when(interactor.getAlertThresholdsForStudent(any)).thenAnswer((_) => Future.value([])); - - await _setupScreen(tester, CanvasModelTestUtils.mockUser(name: 'Panda')); - await tester.pump(); - - expect(find.byType(LoadingIndicator), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('shows error', (tester) async { - when(interactor.getAlertThresholdsForStudent(any)).thenAnswer((_) => Future.error('Error')); - - await _setupScreen(tester, CanvasModelTestUtils.mockUser(name: 'Panda')); - await tester.pumpAndSettle(); - - expect(find.byType(ErrorPandaWidget), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('shows correct thresholds and their types', (tester) async { - when(interactor.getAlertThresholdsForStudent(any)).thenAnswer((_) => Future.value([])); - - await _setupScreen(tester, CanvasModelTestUtils.mockUser(name: 'Panda')); - await tester.pumpAndSettle(); - await tester.pump(); - - expect(_percentageThresholdFinder(AppLocalizations().courseGradeBelow), findsOneWidget); - expect(_percentageThresholdFinder(AppLocalizations().courseGradeAbove), findsOneWidget); - expect(_switchThresholdFinder(AppLocalizations().assignmentMissing), findsOneWidget); - expect(_percentageThresholdFinder(AppLocalizations().assignmentGradeBelow), findsOneWidget); - expect(_percentageThresholdFinder(AppLocalizations().assignmentGradeAbove), findsOneWidget); - expect(_switchThresholdFinder(AppLocalizations().courseAnnouncements), findsOneWidget); - expect(_switchThresholdFinder(AppLocalizations().globalAnnouncements), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('shows delete option if student can be deleted', (tester) async { - when(interactor.getAlertThresholdsForStudent(any)).thenAnswer((_) => Future.value([])); - when(interactor.canDeleteStudent(any)).thenAnswer((_) async => true); - - await _setupScreen(tester, CanvasModelTestUtils.mockUser(name: 'Panda')); - await tester.pumpAndSettle(); - await tester.pump(); - await tester.pump(); - - var overflow = find.byKey(Key('overflow-menu')); - expect(overflow, findsOneWidget); - - await tester.tap(overflow); - await tester.pumpAndSettle(); - - expect(find.text(AppLocalizations().delete), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('hides delete option if student cannot be deleted', (tester) async { - when(interactor.getAlertThresholdsForStudent(any)).thenAnswer((_) => Future.value([])); - when(interactor.canDeleteStudent(any)).thenAnswer((_) async => false); - - await _setupScreen(tester, CanvasModelTestUtils.mockUser(name: 'Panda')); - await tester.pumpAndSettle(); - await tester.pump(); - await tester.pump(); - - var overflow = find.byKey(Key('overflow-menu')); - expect(overflow, findsNothing); - }); - }); - - group('Loading', () { - testWidgetsWithAccessibilityChecks('student thresholds', (tester) async { - String id = '1234'; - - when(interactor.getAlertThresholdsForStudent(any)).thenAnswer((_) => Future.value([])); - - await _setupScreen(tester, CanvasModelTestUtils.mockUser(id: id, name: 'Panda')); - await tester.pump(); - - verify(interactor.getAlertThresholdsForStudent(id)).called(1); - }); - - testWidgetsWithAccessibilityChecks('percent - non-null', (tester) async { - String threshold = '23'; - AlertType type = AlertType.courseGradeLow; - - when(interactor.getAlertThresholdsForStudent(any)) - .thenAnswer((_) => Future.value([_mockThreshold(type: type, value: threshold)])); - - await _setupScreen(tester, CanvasModelTestUtils.mockUser(name: 'Panda')); - await tester.pumpAndSettle(); - await tester.pump(); - - expect(_percentageThresholdFinder(AppLocalizations().courseGradeBelow, value: threshold), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('percent - null', (tester) async { - AlertType type = AlertType.courseGradeLow; - - when(interactor.getAlertThresholdsForStudent(any)).thenAnswer((_) => Future.value([_mockThreshold(type: type)])); - - await _setupScreen(tester, CanvasModelTestUtils.mockUser(name: 'Panda')); - await tester.pumpAndSettle(); - await tester.pump(); - - expect(_percentageThresholdFinder(AppLocalizations().courseGradeBelow, value: null), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('switch - non-null', (tester) async { - AlertType type = AlertType.assignmentMissing; - - when(interactor.getAlertThresholdsForStudent(any)).thenAnswer((_) => Future.value([_mockThreshold(type: type)])); - - await _setupScreen(tester, CanvasModelTestUtils.mockUser(name: 'Panda')); - await tester.pumpAndSettle(); - await tester.pump(); - - expect(_switchThresholdFinder(AppLocalizations().assignmentMissing, switchedOn: true), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('switch - null', (tester) async { - when(interactor.getAlertThresholdsForStudent(any)).thenAnswer((_) => Future.value([])); - - await _setupScreen(tester, CanvasModelTestUtils.mockUser(name: 'Panda')); - await tester.pumpAndSettle(); - await tester.pump(); - - expect(_switchThresholdFinder(AppLocalizations().assignmentMissing, switchedOn: false), findsOneWidget); - }); - }); - - group('Interactions', () { - testWidgetsWithAccessibilityChecks('percent - tap shows dialog', (tester) async { - when(interactor.getAlertThresholdsForStudent(any)).thenAnswer((_) => Future.value([])); - - await _setupScreen(tester, CanvasModelTestUtils.mockUser(name: 'Panda')); - await tester.pumpAndSettle(); - await tester.pump(); - - // Tap on a percent threshold - await tester.tap(find.text(AppLocalizations().courseGradeBelow)); - await tester.pump(); - - expect(find.byType(AlertThresholdsPercentageDialog), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('switch - tap changes value', (tester) async { - when(interactor.getAlertThresholdsForStudent(any)).thenAnswer((_) => Future.value([])); - when(interactor.updateAlertThreshold(any, any, any)) - .thenAnswer((_) => Future.value(_mockThreshold(type: AlertType.assignmentMissing))); - - await _setupScreen(tester, CanvasModelTestUtils.mockUser(name: 'Panda')); - await tester.pumpAndSettle(); - await tester.pump(); - - // Switch is off initially - expect(_switchThresholdFinder(AppLocalizations().assignmentMissing, switchedOn: false), findsOneWidget); - - // Tap on a percent threshold - await tester.tap(find.text(AppLocalizations().assignmentMissing)); - await tester.pumpAndSettle(); - - // Make sure switched is on - expect(_switchThresholdFinder(AppLocalizations().assignmentMissing, switchedOn: true), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('Pops screen after deleting student', (tester) async { - when(interactor.getAlertThresholdsForStudent(any)).thenAnswer((_) => Future.value([])); - when(interactor.canDeleteStudent(any)).thenAnswer((_) async => true); - when(interactor.deleteStudent(any)).thenAnswer((_) async => true); - - dynamic popValue; - - await tester.pumpWidget( - TestApp( - Builder(builder: (context) { - return Material( - child: TextButton( - onPressed: () async { - popValue = await QuickNav().push( - context, - AlertThresholdsScreen(CanvasModelTestUtils.mockUser(name: 'Panda')), - ); - }, - child: Text("Tap me"), - ), - ); - }), - ), - ); - await tester.pumpAndSettle(); - await tester.tap(find.byType(TextButton)); - await tester.pumpAndSettle(); - - // Tap overflow menu - await tester.tap(find.byKey(Key('overflow-menu'))); - await tester.pumpAndSettle(); - - // Tap 'Delete' menu option - await tester.tap(find.text(AppLocalizations().delete)); - await tester.pumpAndSettle(); - - // Tap 'DELETE' dialog button - await tester.tap(find.text(AppLocalizations().delete.toUpperCase())); - await tester.pumpAndSettle(); - - expect(find.byType(AlertThresholdsScreen), findsNothing); - expect(popValue, isTrue); - }); - - testWidgetsWithAccessibilityChecks('Displays error message when deleting student fails', (tester) async { - when(interactor.getAlertThresholdsForStudent(any)).thenAnswer((_) => Future.value([])); - when(interactor.canDeleteStudent(any)).thenAnswer((_) async => true); - when(interactor.deleteStudent(any)).thenAnswer((_) async => false); - - await _setupScreen(tester, CanvasModelTestUtils.mockUser(name: 'Panda')); - await tester.pumpAndSettle(); - - // Tap overflow menu - await tester.tap(find.byKey(Key('overflow-menu'))); - await tester.pumpAndSettle(); - - // Tap 'Delete' menu option - await tester.tap(find.text(AppLocalizations().delete)); - await tester.pumpAndSettle(); - - // Tap 'DELETE' dialog button - await tester.tap(find.text(AppLocalizations().delete.toUpperCase())); - await tester.pumpAndSettle(); - - expect(find.text(AppLocalizations().deleteStudentFailure), findsOneWidget); - }); - }); - - group('Interaction Results', () { - testWidgetsWithAccessibilityChecks('percent threshold changed from dialog', (tester) async { - var initialValue = '42'; - var updatedValue = '24'; - var initialThreshold = _mockThreshold(value: initialValue); - - when(interactor.getAlertThresholdsForStudent(any)).thenAnswer((_) => Future.value([initialThreshold])); - when(interactor.updateAlertThreshold(any, any, any, value: updatedValue)) - .thenAnswer((_) => Future.value(initialThreshold.rebuild((b) => b.threshold = updatedValue))); - - await _setupScreen(tester, CanvasModelTestUtils.mockUser(name: 'Panda')); - await tester.pumpAndSettle(); - await tester.pump(); - - // Check to make sure we have the initial value - expect(find.text(NumberFormat.percentPattern().format(int.tryParse(initialValue)! / 100)), findsOneWidget); - - // Tap on a percent threshold - await tester.tap(find.text(AppLocalizations().courseGradeBelow)); - await tester.pump(); - - // Check for dialog - expect(find.byType(AlertThresholdsPercentageDialog), findsOneWidget); - - // Enter text in the dialog - await tester.enterText(find.byType(TextFormField), updatedValue); - - // Submit text - await tester.tap(find.text(AppLocalizations().ok)); - await tester.pumpAndSettle(); - - // Check for the update - expect(find.text(NumberFormat.percentPattern().format(int.tryParse(updatedValue)! / 100)), findsOneWidget); - }); - }); -} - -Finder _percentageThresholdFinder(String title, {String? value}) => find.byWidgetPredicate((widget) { - return widget is ListTile && - widget.title is Text && - (widget.title as Text).data == title && - widget.trailing is Text && - (widget.trailing as Text).data == - (value != null - ? NumberFormat.percentPattern().format(int.tryParse(value)! / 100) - : AppLocalizations().never) - ? true - : false; - }); - -Finder _switchThresholdFinder(String title, {bool? switchedOn}) => find.byWidgetPredicate((widget) { - return widget is SwitchListTile && - widget.title is Text && - (widget.title as Text).data == title && - (widget.value == (switchedOn != null ? switchedOn : widget.value)) - ? true - : false; - }); - -Future _setupScreen(WidgetTester tester, [User? student]) async { - var user = student ?? CanvasModelTestUtils.mockUser(); - var screen = TestApp(AlertThresholdsScreen(user)); - await tester.pumpWidget(screen); -} - -AlertThreshold _mockThreshold({AlertType? type, String? value}) => AlertThreshold((b) => b - ..alertType = type ?? AlertType.courseGradeLow - ..threshold = value ?? null - ..build()); - diff --git a/apps/flutter_parent/test/screens/alerts/alerts_interactor_test.dart b/apps/flutter_parent/test/screens/alerts/alerts_interactor_test.dart deleted file mode 100644 index 6c1ecf6abe..0000000000 --- a/apps/flutter_parent/test/screens/alerts/alerts_interactor_test.dart +++ /dev/null @@ -1,99 +0,0 @@ -// Copyright (C) 2019 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:flutter_parent/models/alert.dart'; -import 'package:flutter_parent/models/alert_threshold.dart'; -import 'package:flutter_parent/network/api/alert_api.dart'; -import 'package:flutter_parent/screens/alerts/alerts_interactor.dart'; -import 'package:flutter_parent/screens/dashboard/alert_notifier.dart'; -import 'package:flutter_parent/utils/alert_helper.dart'; -import 'package:mockito/mockito.dart'; -import 'package:test/test.dart'; - -import '../../utils/test_app.dart'; -import '../../utils/test_helpers/mock_helpers.dart'; -import '../../utils/test_helpers/mock_helpers.mocks.dart'; - -void main() { - final alertId = '123'; - final studentId = '12321'; - - final api = MockAlertsApi(); - final notifier = MockAlertCountNotifier(); - final alertsHelper = AlertsHelper(); - - setupTestLocator((_locator) { - _locator.registerFactory(() => api); - _locator.registerLazySingleton(() => notifier); - _locator.registerLazySingleton(() => alertsHelper); - }); - - setUp(() { - reset(api); - }); - - test('mark alert read calls the api', () { - when(api.updateAlertWorkflow(studentId, alertId, 'read')).thenAnswer((_) => Future.value(null)); - - AlertsInteractor().markAlertRead(studentId, alertId); - - verify(api.updateAlertWorkflow(studentId, alertId, 'read')).called(1); - }); - - test('mark alert dismissed calls the api', () { - when(api.updateAlertWorkflow(studentId, alertId, 'dismissed')).thenAnswer((_) => Future.value(null)); - - AlertsInteractor().markAlertDismissed(studentId, alertId); - - verify(api.updateAlertWorkflow(studentId, alertId, 'dismissed')).called(1); - }); - - test('get alerts for student returns date sorted list', () async { - final date = DateTime.now(); - final data = List.generate(5, (index) { - // Create a list of alerts with dates in ascending order (reversed) - return Alert((b) => b - ..id = index.toString() - ..actionDate = date.add(Duration(days: index)) - ..lockedForUser = false); - }); - - when(api.getAlertsDepaginated(studentId, false)).thenAnswer((_) => Future.value(data.toList())); - - final actual = await AlertsInteractor().getAlertsForStudent(studentId, false); - - verify(api.getAlertsDepaginated(studentId, false)).called(1); - expect(actual?.alerts, data.reversed.toList()); // Verify that the actual list sorted correctly - }); - - test('get alerts for student returns thresholds', () async { - final data = List.generate(5, (index) { - return AlertThreshold((b) => b..id = '$index'); - }); - when(api.getAlertThresholds(studentId, false)).thenAnswer((_) async => data); - - final actual = await AlertsInteractor().getAlertsForStudent(studentId, false); - - verify(api.getAlertThresholds(studentId, false)).called(1); - verifyNever(notifier.update(any)); // No call to notifier since we didn't force update - expect(actual?.thresholds, data); // Verify that the actual list sorted correctly - }); - - test('updates alert count notifier when forcing refresh', () async { - await AlertsInteractor().getAlertsForStudent(studentId, true); - - verify(api.getAlertThresholds(studentId, true)).called(1); - verify(notifier.update(studentId)).called(1); - }); -} diff --git a/apps/flutter_parent/test/screens/alerts/alerts_screen_test.dart b/apps/flutter_parent/test/screens/alerts/alerts_screen_test.dart deleted file mode 100644 index 0a0bd2ac27..0000000000 --- a/apps/flutter_parent/test/screens/alerts/alerts_screen_test.dart +++ /dev/null @@ -1,546 +0,0 @@ -// Copyright (C) 2019 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:flutter/material.dart'; -import 'package:flutter_parent/l10n/app_localizations.dart'; -import 'package:flutter_parent/models/alert.dart'; -import 'package:flutter_parent/models/alert_threshold.dart'; -import 'package:flutter_parent/router/panda_router.dart'; -import 'package:flutter_parent/screens/alerts/alerts_interactor.dart'; -import 'package:flutter_parent/screens/alerts/alerts_screen.dart'; -import 'package:flutter_parent/screens/announcements/announcement_details_interactor.dart'; -import 'package:flutter_parent/screens/announcements/announcement_view_state.dart'; -import 'package:flutter_parent/screens/dashboard/alert_notifier.dart'; -import 'package:flutter_parent/screens/dashboard/selected_student_notifier.dart'; -import 'package:flutter_parent/utils/common_widgets/badges.dart'; -import 'package:flutter_parent/utils/common_widgets/empty_panda_widget.dart'; -import 'package:flutter_parent/utils/common_widgets/web_view/web_content_interactor.dart'; -import 'package:flutter_parent/utils/core_extensions/date_time_extensions.dart'; -import 'package:flutter_parent/utils/design/canvas_icons.dart'; -import 'package:flutter_parent/utils/design/parent_colors.dart'; -import 'package:flutter_parent/utils/design/student_color_set.dart'; -import 'package:flutter_parent/utils/quick_nav.dart'; -import 'package:flutter_svg/flutter_svg.dart'; -import 'package:flutter_test/flutter_test.dart'; -import 'package:mockito/mockito.dart'; -import 'package:provider/provider.dart'; - -import '../../utils/accessibility_utils.dart'; -import '../../utils/canvas_model_utils.dart'; -import '../../utils/platform_config.dart'; -import '../../utils/test_app.dart'; -import '../../utils/test_helpers/mock_helpers.mocks.dart'; - -final _studentId = '123'; -void main() { - final String domain = 'https://test.instructure.com'; - - final interactor = MockAlertsInteractor(); - final announcementInteractor = MockAnnouncementDetailsInteractor(); - final alertNotifier = MockAlertCountNotifier(); - final mockNav = MockQuickNav(); - - setupTestLocator((locator) { - locator.registerFactory(() => interactor); - locator.registerFactory(() => announcementInteractor); - locator.registerFactory(() => WebContentInteractor()); - locator.registerLazySingleton(() => alertNotifier); - locator.registerFactory(() => mockNav); - }); - - setUp(() { - reset(interactor); - reset(announcementInteractor); - reset(alertNotifier); - reset(mockNav); - }); - - Future _pumpAndTapAlert(WidgetTester tester, Alert alert) async { - final alerts = List.of([alert]); - - when(interactor.getAlertsForStudent(_studentId, any)).thenAnswer((_) => Future.value(AlertsList(alerts, null))); - when(interactor.markAlertRead(_studentId, alerts.first.id)) - .thenAnswer((_) => Future.value(alerts.first.rebuild((b) => b..workflowState = AlertWorkflowState.read))); - - final response = AnnouncementViewState('hodorTitle', 'hodor Subject', 'hodor Message', DateTime.now(), null); - when(announcementInteractor.getAnnouncement(any, any, any, any, any)).thenAnswer((_) => Future.value(response)); - - await tester.pumpWidget(_testableWidget()); - await tester.pumpAndSettle(); - - await tester.tap(find.text(alert.title)); - await tester.pumpAndSettle(); - } - - group('Loading', () { - testWidgetsWithAccessibilityChecks('Shows while waiting for future', (tester) async { - when(interactor.getAlertsForStudent(_studentId, any)).thenAnswer((_) => Future.value(null)); - - await tester.pumpWidget(_testableWidget()); - await tester.pump(); - - expect(find.byType(CircularProgressIndicator), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('Does not show once loaded', (tester) async { - when(interactor.getAlertsForStudent(_studentId, any)).thenAnswer((_) => Future.value(null)); - - await tester.pumpWidget(_testableWidget()); - await tester.pump(); - await tester.pump(); // One extra frame to finish loading - - expect(find.byType(CircularProgressIndicator), findsNothing); - }); - }); - - group('Empty message', () { - testWidgetsWithAccessibilityChecks('Shows when response is null', (tester) async { - when(interactor.getAlertsForStudent(_studentId, any)).thenAnswer((_) => Future.value(null)); - - await tester.pumpWidget(_testableWidget()); - await tester.pumpAndSettle(); - - expect(find.byType(SvgPicture), findsOneWidget); - expect(find.text(AppLocalizations().noAlertsTitle), findsOneWidget); - expect(find.text(AppLocalizations().noAlertsMessage), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('Shows when list is empty', (tester) async { - when(interactor.getAlertsForStudent(_studentId, any)).thenAnswer((_) => Future.value(AlertsList([], null))); - - await tester.pumpWidget(_testableWidget()); - await tester.pumpAndSettle(); - - expect(find.byType(SvgPicture), findsOneWidget); - expect(find.text(AppLocalizations().noAlertsTitle), findsOneWidget); - expect(find.text(AppLocalizations().noAlertsMessage), findsOneWidget); - }); - }); - - testWidgetsWithAccessibilityChecks('Shows error', (tester) async { - when(interactor.getAlertsForStudent(_studentId, any)).thenAnswer((_) => Future.error('ErRoR')); - - await tester.pumpWidget(_testableWidget()); - await tester.pumpAndSettle(); - - expect(find.text(AppLocalizations().unexpectedError), findsOneWidget); - }); - - group('With data', () { - // TODO Fix test - Tested manually, and passed - testWidgetsWithAccessibilityChecks('Can refresh', (tester) async { - when(interactor.getAlertsForStudent(_studentId, any)).thenAnswer((_) => Future.value()); - - await tester.pumpWidget(_testableWidget()); - await tester.pumpAndSettle(); - - final matchedWidget = find.byType(RefreshIndicator); - expect(matchedWidget, findsOneWidget); - - await tester.drag(matchedWidget, const Offset(0, 200)); - - expect(find.byType(CircularProgressIndicator), findsOneWidget); - - await tester.pumpAndSettle(); - expect(find.byType(RefreshIndicator), findsOneWidget); - }, skip: true); - - testWidgetsWithAccessibilityChecks('refreshes when student changes', (tester) async { - final notifier = SelectedStudentNotifier(); - when(interactor.getAlertsForStudent(any, any)).thenAnswer((_) => Future.value(null)); - - await tester.pumpWidget(_testableWidget(notifier: notifier)); - await tester.pumpAndSettle(); - - verify(interactor.getAlertsForStudent(_studentId, any)).called(1); - - final newStudentId = _studentId + 'new'; - final newStudent = notifier.value?.rebuild((b) => b..id = newStudentId); - notifier.update(newStudent!); - await tester.pump(); - - verify(interactor.getAlertsForStudent(newStudentId, true)).called(1); - }); - - testWidgetsWithAccessibilityChecks('Shows alert info for institution annoucnements', (tester) async { - final alerts = _mockData(type: AlertType.institutionAnnouncement); - - when(interactor.getAlertsForStudent(_studentId, any)).thenAnswer((_) => Future.value(AlertsList(alerts, null))); - - await tester.pumpWidget(_testableWidget()); - await tester.pumpAndSettle(); - - final title = find.text(AppLocalizations().globalAnnouncement); - expect(title, findsOneWidget); - expect((tester.widget(title) as Text).style!.color, ParentColors.ash); - expect(find.text(alerts.first.title), findsOneWidget); - expect(find.text(alerts.first.actionDate.l10nFormat(AppLocalizations().dateAtTime)!), findsOneWidget); - expect(find.byIcon(CanvasIcons.info), findsOneWidget); - expect((tester.widget(find.byIcon(CanvasIcons.info)) as Icon).color, ParentColors.ash); - }); - - testWidgetsWithAccessibilityChecks('Shows alert info for course annoucnements', (tester) async { - final alerts = _mockData(type: AlertType.courseAnnouncement); - - when(interactor.getAlertsForStudent(_studentId, any)).thenAnswer((_) => Future.value(AlertsList(alerts, null))); - - await tester.pumpWidget(_testableWidget()); - await tester.pumpAndSettle(); - - final title = find.text(AppLocalizations().courseAnnouncement); - expect(title, findsOneWidget); - expect((tester.widget(title) as Text).style!.color, ParentColors.ash); - expect(find.text(alerts.first.title), findsOneWidget); - expect(find.text(alerts.first.actionDate.l10nFormat(AppLocalizations().dateAtTime)!), findsOneWidget); - expect(find.byIcon(CanvasIcons.info), findsOneWidget); - expect((tester.widget(find.byIcon(CanvasIcons.info)) as Icon).color, ParentColors.ash); - }); - - testWidgetsWithAccessibilityChecks('Shows alert positive for course grade high', (tester) async { - final thresholdValue = '80'; - final alerts = _mockData(type: AlertType.courseGradeHigh); - final thresholds = [ - AlertThreshold((b) => b - ..alertType = AlertType.courseGradeHigh - ..threshold = thresholdValue), - ]; - - when(interactor.getAlertsForStudent(_studentId, any)) - .thenAnswer((_) => Future.value(AlertsList(alerts, thresholds))); - - await tester.pumpWidget(_testableWidget()); - await tester.pumpAndSettle(); - - final title = find.text(AppLocalizations().courseGradeAboveThreshold(thresholdValue)); - expect(title, findsOneWidget); - expect((tester.widget(title) as Text).style!.color, StudentColorSet.electric.light); - expect(find.text(alerts.first.title), findsOneWidget); - expect(find.text(alerts.first.actionDate.l10nFormat(AppLocalizations().dateAtTime)!), findsOneWidget); - expect(find.byIcon(CanvasIcons.info), findsOneWidget); - expect((tester.widget(find.byIcon(CanvasIcons.info)) as Icon).color, StudentColorSet.electric.light); - }); - - testWidgetsWithAccessibilityChecks('Shows alert positive for assignment grade high', (tester) async { - final thresholdValue = '80'; - final alerts = _mockData(type: AlertType.assignmentGradeHigh); - final thresholds = [ - AlertThreshold((b) => b - ..alertType = AlertType.assignmentGradeHigh - ..threshold = thresholdValue), - ]; - - when(interactor.getAlertsForStudent(_studentId, any)) - .thenAnswer((_) => Future.value(AlertsList(alerts, thresholds))); - - await tester.pumpWidget(_testableWidget()); - await tester.pumpAndSettle(); - - final title = find.text(AppLocalizations().assignmentGradeAboveThreshold(thresholdValue)); - expect(title, findsOneWidget); - expect((tester.widget(title) as Text).style!.color, StudentColorSet.electric.light); - expect(find.text(alerts.first.title), findsOneWidget); - expect(find.text(alerts.first.actionDate.l10nFormat(AppLocalizations().dateAtTime)!), findsOneWidget); - expect(find.byIcon(CanvasIcons.info), findsOneWidget); - expect((tester.widget(find.byIcon(CanvasIcons.info)) as Icon).color, StudentColorSet.electric.light); - }); - - testWidgetsWithAccessibilityChecks('Shows alert negative for course grade low', (tester) async { - final thresholdValue = '10'; - final alerts = _mockData(type: AlertType.courseGradeLow); - final thresholds = [ - AlertThreshold((b) => b - ..alertType = AlertType.courseGradeLow - ..threshold = thresholdValue), - ]; - - when(interactor.getAlertsForStudent(_studentId, any)) - .thenAnswer((_) => Future.value(AlertsList(alerts, thresholds))); - - await tester.pumpWidget(_testableWidget()); - await tester.pumpAndSettle(); - - final title = find.text(AppLocalizations().courseGradeBelowThreshold(thresholdValue)); - expect(title, findsOneWidget); - expect((tester.widget(title) as Text).style!.color, ParentColors.failure); - expect(find.text(alerts.first.title), findsOneWidget); - expect(find.text(alerts.first.actionDate.l10nFormat(AppLocalizations().dateAtTime)!), findsOneWidget); - expect(find.byIcon(CanvasIcons.warning), findsOneWidget); - expect((tester.widget(find.byIcon(CanvasIcons.warning)) as Icon).color, ParentColors.failure); - }); - - testWidgetsWithAccessibilityChecks('Shows alert negative for assignment grade low', (tester) async { - final thresholdValue = '10'; - final alerts = _mockData(type: AlertType.assignmentGradeLow); - final thresholds = [ - AlertThreshold((b) => b - ..alertType = AlertType.assignmentGradeLow - ..threshold = thresholdValue), - ]; - - when(interactor.getAlertsForStudent(_studentId, any)) - .thenAnswer((_) => Future.value(AlertsList(alerts, thresholds))); - - await tester.pumpWidget(_testableWidget()); - await tester.pumpAndSettle(); - - final title = find.text(AppLocalizations().assignmentGradeBelowThreshold(thresholdValue)); - expect(title, findsOneWidget); - expect((tester.widget(title) as Text).style!.color, ParentColors.failure); - expect(find.text(alerts.first.title), findsOneWidget); - expect(find.text(alerts.first.actionDate.l10nFormat(AppLocalizations().dateAtTime)!), findsOneWidget); - expect(find.byIcon(CanvasIcons.warning), findsOneWidget); - expect((tester.widget(find.byIcon(CanvasIcons.warning)) as Icon).color, ParentColors.failure); - }); - - testWidgetsWithAccessibilityChecks('Shows alert negative for missing assignment', (tester) async { - final alerts = _mockData(type: AlertType.assignmentMissing); - - when(interactor.getAlertsForStudent(_studentId, any)).thenAnswer((_) => Future.value(AlertsList(alerts, null))); - - await tester.pumpWidget(_testableWidget()); - await tester.pumpAndSettle(); - - final title = find.text(AppLocalizations().assignmentMissing); - expect(title, findsOneWidget); - expect((tester.widget(title) as Text).style!.color, ParentColors.failure); - expect(find.text(alerts.first.title), findsOneWidget); - expect(find.text(alerts.first.actionDate.l10nFormat(AppLocalizations().dateAtTime)!), findsOneWidget); - expect(find.byIcon(CanvasIcons.warning), findsOneWidget); - expect((tester.widget(find.byIcon(CanvasIcons.warning)) as Icon).color, ParentColors.failure); - }); - - testWidgetsWithAccessibilityChecks('Shows alert badge when unread', (tester) async { - final alerts = _mockData(type: AlertType.courseGradeLow, state: AlertWorkflowState.unread); - - when(interactor.getAlertsForStudent(_studentId, any)).thenAnswer((_) => Future.value(AlertsList(alerts, null))); - - await tester.pumpWidget(_testableWidget()); - await tester.pumpAndSettle(); - - expect(find.byType(IndicatorBadge), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('Can tap alert to mark as read', (tester) async { - final alerts = - _mockData(type: AlertType.courseGradeLow, state: AlertWorkflowState.unread, htmlUrl: '$domain/courses/12345'); - - when(interactor.getAlertsForStudent(_studentId, any)).thenAnswer((_) => Future.value(AlertsList(alerts, null))); - when(interactor.markAlertRead(_studentId, alerts.first.id)) - .thenAnswer((_) => Future.value(alerts.first.rebuild((b) => b..workflowState = AlertWorkflowState.read))); - - await tester.pumpWidget(_testableWidget()); - await tester.pumpAndSettle(); - - await tester.tap(find.text(alerts.first.title)); - await tester.pumpAndSettle(); - - verify(interactor.markAlertRead(_studentId, alerts.first.id)).called(1); - verify(alertNotifier.update(_studentId)).called(1); - }); - - testWidgetsWithAccessibilityChecks('Tapping alert that is read does not call to mark as read', (tester) async { - final alerts = - _mockData(type: AlertType.courseGradeLow, state: AlertWorkflowState.read, htmlUrl: '$domain/courses/12345'); - - when(interactor.getAlertsForStudent(_studentId, any)).thenAnswer((_) => Future.value(AlertsList(alerts, null))); - - await tester.pumpWidget(_testableWidget()); - await tester.pumpAndSettle(); - - await tester.tap(find.text(alerts.first.title)); - await tester.pumpAndSettle(); - - verifyNever(interactor.markAlertRead(any, any)); - verifyNever(alertNotifier.update(any)); - }); - - testWidgetsWithAccessibilityChecks('Can dismiss an unread alert', (tester) async { - final alerts = _mockData(type: AlertType.courseGradeLow, state: AlertWorkflowState.unread); - - final alert = alerts.first; - when(interactor.getAlertsForStudent(_studentId, any)).thenAnswer((_) => Future.value(AlertsList(alerts, null))); - when(interactor.markAlertDismissed(_studentId, alert.id)).thenAnswer((_) => Future.value(null)); - - await tester.pumpWidget(_testableWidget()); - await tester.pumpAndSettle(); - - final icon = find.byIcon(Icons.clear); - expect(icon, findsOneWidget); - await tester.tap(icon); - await tester.pumpAndSettle(); - - expect(find.text(alert.title), findsNothing); - expect(find.byType(EmptyPandaWidget), findsOneWidget); - verify(interactor.markAlertDismissed(_studentId, alert.id)).called(1); - verify(alertNotifier.update(_studentId)).called(1); - }); - - testWidgetsWithAccessibilityChecks('Can dismiss a read alert', (tester) async { - final alerts = _mockData(size: 2, type: AlertType.courseGradeLow, state: AlertWorkflowState.read); - - final alert = alerts.first; - when(interactor.getAlertsForStudent(_studentId, any)).thenAnswer((_) => Future.value(AlertsList(alerts, null))); - when(interactor.markAlertDismissed(_studentId, alert.id)).thenAnswer((_) => Future.value(null)); - - await tester.pumpWidget(_testableWidget()); - await tester.pumpAndSettle(); - - final icon = find.byIcon(Icons.clear).first; - expect(icon, findsOneWidget); - await tester.tap(icon); - await tester.pumpAndSettle(); - - expect(find.text(alert.title), findsNothing); - expect(find.byType(EmptyPandaWidget), findsNothing); - verify(interactor.markAlertDismissed(_studentId, alert.id)).called(1); - verifyNever(alertNotifier.update(any)); - }); - - testWidgetsWithAccessibilityChecks('Can tap course announcement alert to go to announcement', (tester) async { - final alert = Alert((b) => b - ..id = '123' - ..title = 'Hodor' - ..workflowState = AlertWorkflowState.unread - ..htmlUrl = '$domain/courses/1234/discussion_topics/1234' - ..alertType = AlertType.courseAnnouncement - ..lockedForUser = false); - - await _pumpAndTapAlert(tester, alert); - - verify(mockNav.routeInternally(any, alert.htmlUrl)); - }); - - testWidgetsWithAccessibilityChecks('Can tap institution announcement alert to go to announcement', (tester) async { - final alert = Alert((b) => b - ..id = '123' - ..contextId = '12345' - ..title = 'Hodor' - ..workflowState = AlertWorkflowState.unread - ..alertType = AlertType.institutionAnnouncement - ..lockedForUser = false); - await _pumpAndTapAlert(tester, alert); - - verify(mockNav.pushRoute(any, PandaRouter.institutionAnnouncementDetails(alert.contextId))); - }); - - testWidgetsWithAccessibilityChecks('Can tap assignment missing alert to show assignment details', (tester) async { - final alert = Alert((b) => b - ..id = '123' - ..title = 'Hodor' - ..workflowState = AlertWorkflowState.unread - ..alertType = AlertType.assignmentMissing - ..htmlUrl = '$domain/courses/1234/assignments/1234' - ..lockedForUser = false); - await _pumpAndTapAlert(tester, alert); - - verify(mockNav.routeInternally(any, alert.htmlUrl)); - }); - - testWidgetsWithAccessibilityChecks('Can tap assignment grade high alert to show assignment details', - (tester) async { - final alert = Alert((b) => b - ..id = '123' - ..title = 'Hodor' - ..workflowState = AlertWorkflowState.unread - ..alertType = AlertType.assignmentGradeHigh - ..htmlUrl = '$domain/courses/1234/assignments/1234' - ..lockedForUser = false); - await _pumpAndTapAlert(tester, alert); - - verify(mockNav.routeInternally(any, alert.htmlUrl)); - }); - - testWidgetsWithAccessibilityChecks('Can tap assignment grade low alert to show assignment details', (tester) async { - final alert = Alert((b) => b - ..id = '123' - ..title = 'Hodor' - ..workflowState = AlertWorkflowState.unread - ..alertType = AlertType.assignmentGradeLow - ..htmlUrl = '$domain/courses/1234/assignments/1234' - ..lockedForUser = false); - await _pumpAndTapAlert(tester, alert); - - verify(mockNav.routeInternally(any, alert.htmlUrl)); - }); - - testWidgetsWithAccessibilityChecks('Can tap course grade high alert to show course details', (tester) async { - final alert = Alert((b) => b - ..id = '123' - ..title = 'Hodor' - ..workflowState = AlertWorkflowState.unread - ..alertType = AlertType.courseGradeHigh - ..htmlUrl = '$domain/courses/1234' - ..lockedForUser = false); - await _pumpAndTapAlert(tester, alert); - - verify(mockNav.routeInternally(any, alert.htmlUrl)); - }); - - testWidgetsWithAccessibilityChecks('Can tap course grade low alert to show course details', (tester) async { - final alert = Alert((b) => b - ..id = '123' - ..title = 'Hodor' - ..workflowState = AlertWorkflowState.unread - ..alertType = AlertType.courseGradeLow - ..htmlUrl = '$domain/courses/1234' - ..lockedForUser = false); - await _pumpAndTapAlert(tester, alert); - - verify(mockNav.routeInternally(any, alert.htmlUrl)); - }); - }); - - group('Accessibility', () { - testWidgetsWithAccessibilityChecks('Dismiss button semantic label includes alert title', (tester) async { - final alerts = _mockData(type: AlertType.courseGradeLow, state: AlertWorkflowState.unread); - - final alert = alerts.first; - when(interactor.getAlertsForStudent(_studentId, any)).thenAnswer((_) => Future.value(AlertsList(alerts, null))); - - await tester.pumpWidget(_testableWidget()); - await tester.pumpAndSettle(); - - final semantics = find.byTooltip(AppLocalizations().dismissAlertLabel(alert.title)); - final icon = find.byIcon(Icons.clear); - - expect(find.descendant(of: semantics, matching: icon), findsOneWidget); - }); - }); -} - -Widget _testableWidget({SelectedStudentNotifier? notifier}) { - notifier = notifier ?? SelectedStudentNotifier(); - return TestApp( - ChangeNotifierProvider( - create: (context) => notifier?..value = CanvasModelTestUtils.mockUser(id: _studentId, name: 'Trevor'), - child: Consumer(builder: (context, model, _) { - return Scaffold(body: AlertsScreen()); - }), - ), - platformConfig: PlatformConfig(initWebview: true), - ); -} - -List _mockData( - {int size = 1, AlertType? type, AlertWorkflowState state = AlertWorkflowState.read, String htmlUrl = ''}) { - return List.generate( - size, - (index) => Alert((b) => b - ..id = index.toString() - ..title = 'Alert $index' - ..workflowState = state - ..alertType = type ?? AlertType.institutionAnnouncement - ..htmlUrl = htmlUrl - ..lockedForUser = false)); -} \ No newline at end of file diff --git a/apps/flutter_parent/test/screens/announcements/announcement_details_interactor_test.dart b/apps/flutter_parent/test/screens/announcements/announcement_details_interactor_test.dart deleted file mode 100644 index 80fdc82ecd..0000000000 --- a/apps/flutter_parent/test/screens/announcements/announcement_details_interactor_test.dart +++ /dev/null @@ -1,155 +0,0 @@ -/* - * Copyright (C) 2020 - present Instructure, Inc. - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, version 3 of the License. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -import 'package:built_collection/built_collection.dart'; -import 'package:flutter_parent/models/account_notification.dart'; -import 'package:flutter_parent/models/announcement.dart'; -import 'package:flutter_parent/models/course.dart'; -import 'package:flutter_parent/models/enrollment.dart'; -import 'package:flutter_parent/models/remote_file.dart'; -import 'package:flutter_parent/network/api/announcement_api.dart'; -import 'package:flutter_parent/network/api/course_api.dart'; -import 'package:flutter_parent/screens/announcements/announcement_details_interactor.dart'; -import 'package:flutter_parent/screens/announcements/announcement_details_screen.dart'; -import 'package:flutter_parent/screens/announcements/announcement_view_state.dart'; -import 'package:mockito/mockito.dart'; -import 'package:test/test.dart'; - -import '../../utils/test_app.dart'; -import '../../utils/test_helpers/mock_helpers.mocks.dart'; - -void main() { - //region data config - final remoteFile = RemoteFile((b) => b - ..id = '123' - ..url = 'hodor.com' - ..filename = 'hodor.jpg' - ..contentType = 'jpg' - ..previewUrl = 'hodor.com/preview' - ..thumbnailUrl = 'hodor.com/thumbnail' - ..displayName = 'hodor'); - - final attachment = remoteFile.toAttachment(); - - final course = Course((b) => b - ..id = '123' - ..enrollments = ListBuilder() - ..name = 'flowers for hodornon' - ..needsGradingCount = 0 - ..hideFinalGrades = false - ..isPublic = false - ..applyAssignmentGroupWeights = false - ..isFavorite = false - ..accessRestrictedByDate = false - ..hasWeightedGradingPeriods = false - ..hasGradingPeriods = false - ..restrictEnrollmentsToCourseDates = false); - - final accountNotification = AccountNotification((b) => b - ..id = '123' - ..startAt = DateTime.now().toIso8601String() - ..message = 'hodor' - ..subject = 'hodor subject'); - - _getAnnouncement({bool hasAttachments = true}) { - return Announcement((b) => b - ..id = '123' - ..postedAt = DateTime.now() - ..message = 'hodor' - ..title = 'hodor subject' - ..htmlUrl = '' - ..attachments = hasAttachments ? ListBuilder([remoteFile]) : null); - } - - //endregion - - final announcementApi = MockAnnouncementApi(); - final courseApi = MockCourseApi(); - - setupTestLocator((locator) { - locator.registerFactory(() => announcementApi); - locator.registerFactory(() => courseApi); - }); - - setUp(() { - reset(announcementApi); - reset(courseApi); - }); - - test('get course announcement returns a proper view state', () async { - final announcement = _getAnnouncement(); - final expectedViewState = - AnnouncementViewState(course.name, announcement.title, announcement.message, announcement.postedAt, attachment); - - when(announcementApi.getCourseAnnouncement(course.id, announcement.id, any)) - .thenAnswer((_) => Future.value(announcement)); - when(courseApi.getCourse(course.id)).thenAnswer((_) => Future.value(course)); - - final actualViewState = await AnnouncementDetailsInteractor() - .getAnnouncement(announcement.id, AnnouncementType.COURSE, course.id, '', true); - - verify(announcementApi.getCourseAnnouncement(course.id, announcement.id, true)).called(1); - verify(courseApi.getCourse(course.id)).called(1); - - expect(actualViewState?.toolbarTitle, expectedViewState.toolbarTitle); - expect(actualViewState?.announcementMessage, expectedViewState.announcementMessage); - expect(actualViewState?.announcementTitle, expectedViewState.announcementTitle); - expect(actualViewState?.postedAt, expectedViewState.postedAt); - expect(actualViewState?.attachment, attachment); - }); - - test('get course announcement returns a proper view state with no attachments', () async { - final announcement = _getAnnouncement(hasAttachments: false); - final expectedViewState = - AnnouncementViewState(course.name, announcement.title, announcement.message, announcement.postedAt, null); - - when(announcementApi.getCourseAnnouncement(course.id, announcement.id, any)) - .thenAnswer((_) => Future.value(announcement)); - when(courseApi.getCourse(course.id)).thenAnswer((_) => Future.value(course)); - - final actualViewState = await AnnouncementDetailsInteractor() - .getAnnouncement(announcement.id, AnnouncementType.COURSE, course.id, '', true); - - verify(announcementApi.getCourseAnnouncement(course.id, announcement.id, true)).called(1); - verify(courseApi.getCourse(course.id)).called(1); - - expect(actualViewState?.toolbarTitle, expectedViewState.toolbarTitle); - expect(actualViewState?.announcementMessage, expectedViewState.announcementMessage); - expect(actualViewState?.announcementTitle, expectedViewState.announcementTitle); - expect(actualViewState?.postedAt, expectedViewState.postedAt); - expect(actualViewState?.attachment, expectedViewState.attachment); - }); - - test('get institution announcement returns a proper view state', () async { - final toolbarTitle = 'Institution Announcement'; - - final expectedViewState = AnnouncementViewState(toolbarTitle, accountNotification.subject, - accountNotification.message, DateTime.parse(accountNotification.startAt), null); - - when(announcementApi.getAccountNotification(accountNotification.id, any)) - .thenAnswer((_) => Future.value(accountNotification)); - - final actualViewState = await AnnouncementDetailsInteractor() - .getAnnouncement(accountNotification.id, AnnouncementType.INSTITUTION, course.id, toolbarTitle, true); - - verify(announcementApi.getAccountNotification(accountNotification.id, true)).called(1); - - expect(actualViewState?.toolbarTitle, expectedViewState.toolbarTitle); - expect(actualViewState?.announcementMessage, expectedViewState.announcementMessage); - expect(actualViewState?.announcementTitle, expectedViewState.announcementTitle); - expect(actualViewState?.postedAt, expectedViewState.postedAt); - }); -} \ No newline at end of file diff --git a/apps/flutter_parent/test/screens/announcements/announcement_details_screen_test.dart b/apps/flutter_parent/test/screens/announcements/announcement_details_screen_test.dart deleted file mode 100644 index 2031a16b32..0000000000 --- a/apps/flutter_parent/test/screens/announcements/announcement_details_screen_test.dart +++ /dev/null @@ -1,195 +0,0 @@ -/* - * Copyright (C) 2020 - present Instructure, Inc. - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, version 3 of the License. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -import 'package:built_value/json_object.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_parent/l10n/app_localizations.dart'; -import 'package:flutter_parent/models/attachment.dart'; -import 'package:flutter_parent/screens/announcements/announcement_details_interactor.dart'; -import 'package:flutter_parent/screens/announcements/announcement_details_screen.dart'; -import 'package:flutter_parent/screens/announcements/announcement_view_state.dart'; -import 'package:flutter_parent/utils/common_widgets/attachment_indicator_widget.dart'; -import 'package:flutter_parent/utils/common_widgets/loading_indicator.dart'; -import 'package:flutter_parent/utils/common_widgets/web_view/html_description_tile.dart'; -import 'package:flutter_parent/utils/common_widgets/web_view/web_content_interactor.dart'; -import 'package:flutter_parent/utils/core_extensions/date_time_extensions.dart'; -import 'package:flutter_test/flutter_test.dart'; -import 'package:mockito/mockito.dart'; - -import '../../utils/accessibility_utils.dart'; -import '../../utils/test_app.dart'; -import '../../utils/test_helpers/mock_helpers.mocks.dart'; - -void main() { - final interactor = MockAnnouncementDetailsInteractor(); - - setupTestLocator((locator) { - locator.registerFactory(() => interactor); - locator.registerFactory(() => WebContentInteractor()); - }); - - setUp(() { - reset(interactor); - }); - - group('Loading', () { - testWidgetsWithAccessibilityChecks('Shows while waiting for future', (tester) async { - when(interactor.getAnnouncement(any, any, any, any, any)).thenAnswer((_) => Future.value(null)); - - await tester.pumpWidget(_testableWidget('', AnnouncementType.COURSE, '')); - await tester.pump(); - - expect(find.byType(LoadingIndicator), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('Does not show once loaded', (tester) async { - when(interactor.getAnnouncement(any, any, any, any, any)).thenAnswer((_) => Future.value(null)); - - await tester.pumpWidget(_testableWidget('', AnnouncementType.COURSE, '')); - await tester.pump(); - await tester.pump(); - - expect(find.byType(LoadingIndicator), findsNothing); - }); - }); - - testWidgetsWithAccessibilityChecks('Shows error', (tester) async { - when(interactor.getAnnouncement(any, any, any, any, any)).thenAnswer((_) => Future.error('error')); - - await tester.pumpWidget(_testableWidget('', AnnouncementType.COURSE, '')); - await tester.pumpAndSettle(); - - expect(find.text(AppLocalizations().errorLoadingAnnouncement), findsOneWidget); - - when(interactor.getAnnouncement(any, any, any, any, any)) - .thenAnswer((_) async => AnnouncementViewState('', '', '', null, null)); - await tester.tap(find.text(AppLocalizations().retry)); - - verify(interactor.getAnnouncement(any, any, any, any, false)).called(1); - verify(interactor.getAnnouncement(any, any, any, any, true)).called(1); - }); - - group('With data', () { - testWidgetsWithAccessibilityChecks('Can pull to refresh', (tester) async { - final announcementId = '123'; - final courseId = '123'; - final announcementMessage = 'hodor'; - final announcementSubject = 'hodor subject'; - final postedAt = DateTime.now(); - final courseName = 'flowers for hodornon'; - - final response = AnnouncementViewState(courseName, announcementSubject, announcementMessage, postedAt, null); - when(interactor.getAnnouncement( - announcementId, AnnouncementType.COURSE, courseId, AppLocalizations().globalAnnouncementTitle, any)) - .thenAnswer((_) => Future.value(response)); - - await tester.pumpWidget(_testableWidget(announcementId, AnnouncementType.COURSE, courseId)); - await tester.pumpAndSettle(); - - // Pull to refresh - final matchedWidget = find.byType(RefreshIndicator); - await tester.drag(matchedWidget, const Offset(0, 200)); - await tester.pumpAndSettle(); - - // Once for initial (non forced) load, once for forced refresh - verify(interactor.getAnnouncement(any, any, any, any, false)).called(1); - verify(interactor.getAnnouncement(any, any, any, any, true)).called(1); - }); - - testWidgetsWithAccessibilityChecks('Shows course announcement', (tester) async { - final announcementId = '123'; - final courseId = '123'; - final announcementMessage = 'hodor'; - final announcementSubject = 'hodor subject'; - final postedAt = DateTime.now(); - final courseName = 'flowers for hodornon'; - - final response = AnnouncementViewState(courseName, announcementSubject, announcementMessage, postedAt, null); - when(interactor.getAnnouncement( - announcementId, AnnouncementType.COURSE, courseId, AppLocalizations().globalAnnouncementTitle, any)) - .thenAnswer((_) => Future.value(response)); - - await tester.pumpWidget(_testableWidget(announcementId, AnnouncementType.COURSE, courseId)); - await tester.pumpAndSettle(); - - expect(find.text(announcementSubject), findsOneWidget); - expect(find.text(courseName), findsOneWidget); - expect(find.text(postedAt.l10nFormat(AppLocalizations().dateAtTime)!), findsOneWidget); - expect(find.byType(HtmlDescriptionTile), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('Shows course announcement with attachment', (tester) async { - final announcementId = '123'; - final courseId = '123'; - final announcementMessage = 'hodor'; - final announcementSubject = 'hodor subject'; - final postedAt = DateTime.now(); - final courseName = 'flowers for hodornon'; - final attachment = Attachment((b) => b - ..jsonId = JsonObject('1') - ..displayName = 'Attachment 1'); - - final response = - AnnouncementViewState(courseName, announcementSubject, announcementMessage, postedAt, attachment); - when(interactor.getAnnouncement( - announcementId, AnnouncementType.COURSE, courseId, AppLocalizations().globalAnnouncementTitle, any)) - .thenAnswer((_) => Future.value(response)); - - await tester.pumpWidget(_testableWidget(announcementId, AnnouncementType.COURSE, courseId)); - await tester.pumpAndSettle(); - - expect(find.text(announcementSubject), findsOneWidget); - expect(find.text(courseName), findsOneWidget); - expect(find.text(postedAt.l10nFormat(AppLocalizations().dateAtTime)!), findsOneWidget); - expect(find.byType(HtmlDescriptionTile), findsOneWidget); - var attachmentWidget = find.byType(AttachmentIndicatorWidget); - expect(attachmentWidget, findsOneWidget); - await tester.tap(attachmentWidget); - verify(interactor.viewAttachment(any, attachment)).called(1); - }); - - testWidgetsWithAccessibilityChecks('Shows institution announcement', (tester) async { - final announcementId = '123'; - final courseId = '123'; - final announcementMessage = 'hodor'; - final announcementSubject = 'hodor subject'; - final postedAt = DateTime.now(); - final toolbarTitle = AppLocalizations().globalAnnouncementTitle; - - final response = AnnouncementViewState(toolbarTitle, announcementSubject, announcementMessage, postedAt, null); - when(interactor.getAnnouncement(announcementId, AnnouncementType.INSTITUTION, courseId, toolbarTitle, any)) - .thenAnswer((_) => Future.value(response)); - - await tester.pumpWidget(_testableWidget(announcementId, AnnouncementType.INSTITUTION, courseId)); - await tester.pumpAndSettle(); - - expect(find.text(announcementSubject), findsOneWidget); - expect(find.text(toolbarTitle), findsOneWidget); - expect(find.text(postedAt.l10nFormat(AppLocalizations().dateAtTime)!), findsOneWidget); - expect(find.byType(HtmlDescriptionTile), findsOneWidget); - }); - }); -} - -Widget _testableWidget(String announcementId, AnnouncementType type, String courseId) { - return TestApp( - Builder( - builder: (BuildContext context) { - return AnnouncementDetailScreen(announcementId, type, courseId, context); - }, - ), - ); -} diff --git a/apps/flutter_parent/test/screens/assignments/assignment_details_interactor_test.dart b/apps/flutter_parent/test/screens/assignments/assignment_details_interactor_test.dart deleted file mode 100644 index 88ac636914..0000000000 --- a/apps/flutter_parent/test/screens/assignments/assignment_details_interactor_test.dart +++ /dev/null @@ -1,187 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -import 'package:flutter_parent/l10n/app_localizations.dart'; -import 'package:flutter_parent/models/assignment.dart'; -import 'package:flutter_parent/models/course.dart'; -import 'package:flutter_parent/models/login.dart'; -import 'package:flutter_parent/models/reminder.dart'; -import 'package:flutter_parent/models/user.dart'; -import 'package:flutter_parent/network/api/assignment_api.dart'; -import 'package:flutter_parent/network/api/course_api.dart'; -import 'package:flutter_parent/network/utils/api_prefs.dart'; -import 'package:flutter_parent/screens/assignments/assignment_details_interactor.dart'; -import 'package:flutter_parent/utils/db/reminder_db.dart'; -import 'package:flutter_parent/utils/notification_util.dart'; -import 'package:mockito/mockito.dart'; -import 'package:test/test.dart'; - -import '../../utils/test_app.dart'; -import '../../utils/test_helpers/mock_helpers.dart'; -import '../../utils/test_helpers/mock_helpers.mocks.dart'; - -void main() { - final assignmentId = '123'; - final courseId = '321'; - final studentId = '1337'; - - final assignmentApi = MockAssignmentApi(); - final courseApi = MockCourseApi(); - final reminderDb = MockReminderDb(); - final notificationUtil = MockNotificationUtil(); - final login = Login((b) => b - ..domain = 'test-domain' - ..user = User((u) => u..id = '123').toBuilder()); - - setupTestLocator((locator) { - locator.registerLazySingleton(() => assignmentApi); - locator.registerLazySingleton(() => courseApi); - locator.registerLazySingleton(() => reminderDb); - locator.registerLazySingleton(() => notificationUtil); - }); - - // Reset the interactions for the shared mocks - setUp(() async { - reset(assignmentApi); - reset(courseApi); - reset(reminderDb); - reset(notificationUtil); - await setupPlatformChannels(); - await ApiPrefs.switchLogins(login); - }); - - group('loadAssignmentDetails', () { - test('returns the course name', () async { - final course = Course((b) => b..name = 'course name'); - when(courseApi.getCourse(courseId)).thenAnswer((_) async => course); - final details = - await AssignmentDetailsInteractor().loadAssignmentDetails(false, courseId, assignmentId, studentId); - - expect(details?.course, course); - }); - - test('loadReminder calls ReminderDb', () async { - final assignmentId = 'assignment-123'; - when(reminderDb.getByItem(any, any, any, any)).thenAnswer((_) async => null); - - await AssignmentDetailsInteractor().loadReminder(assignmentId); - - verify(reminderDb.getByItem(login.domain, login.user.id, Reminder.TYPE_ASSIGNMENT, assignmentId)); - }); - - test('loadReminder returns reminder if reminder date has not passed', () async { - final expected = Reminder((b) => b..date = DateTime.now().add(Duration(minutes: 1))); - when(reminderDb.getByItem(any, any, any, any)).thenAnswer((_) async => expected); - - final actual = await AssignmentDetailsInteractor().loadReminder(''); - - expect(actual, expected); - }); - - test('loadReminder returns null if none exist for the assignment', () async { - when(reminderDb.getByItem(any, any, any, any)).thenAnswer((_) async => null); - - final actual = await AssignmentDetailsInteractor().loadReminder(''); - - expect(actual, isNull); - }); - - test('loadReminder returns null if reminder date has passed', () async { - final reminder = Reminder((b) => b - ..id = 123 - ..date = DateTime.now().subtract(Duration(minutes: 1))); - when(reminderDb.getByItem(any, any, any, any)).thenAnswer((_) async => reminder); - - final actual = await AssignmentDetailsInteractor().loadReminder(''); - - expect(actual, isNull); - verify(notificationUtil.deleteNotification(reminder.id)); - verify(reminderDb.deleteById(reminder.id)); - }); - - test('deleteReminder deletes reminder from database and notifications', () async { - final reminder = Reminder((b) => b..id = 123); - - await AssignmentDetailsInteractor().deleteReminder(reminder); - - verify(notificationUtil.deleteNotification(reminder.id)); - verify(reminderDb.deleteById(reminder.id)); - }); - - test('createReminder inserts reminder into database and schedules a notification', () async { - final date = DateTime.now(); - final formattedDate = 'Febtember 34, 3031'; - final assignment = Assignment((b) => b - ..name = 'Assignment name' - ..id = assignmentId - ..courseId = courseId - ..assignmentGroupId = '' - ..position = 0); - - final reminder = Reminder((b) => b - ..userDomain = login.domain - ..userId = login.user.id - ..type = Reminder.TYPE_ASSIGNMENT - ..itemId = assignment.id - ..courseId = courseId - ..date = date.toUtc()); - - final savedReminder = reminder.rebuild((b) => b..id = 123); - when(reminderDb.insert(reminder)).thenAnswer((_) async => savedReminder); - - final l10n = AppLocalizations(); - await AssignmentDetailsInteractor().createReminder( - l10n, - date, - assignment.id, - courseId, - assignment.name, - formattedDate, - ); - - verify(reminderDb.insert(reminder)); - verify(notificationUtil.scheduleReminder(l10n, assignment.name, formattedDate, savedReminder)); - }); - - test('returns an assignment', () async { - final assignment = Assignment((b) => b - ..id = assignmentId - ..courseId = courseId - ..assignmentGroupId = '' - ..position = 0); - when(courseApi.getCourse(courseId)).thenAnswer((_) async => Course((b) => b..name = '')); - when(assignmentApi.getAssignment(courseId, assignmentId, forceRefresh: false)) - .thenAnswer((_) async => assignment); - final details = - await AssignmentDetailsInteractor().loadAssignmentDetails(false, courseId, assignmentId, studentId); - - expect(details?.assignment, assignment); - }); - - test('returns assignmentEnhancementEnabled as false if response does not contain key', () async { - final features = ["feature1", "feature2"]; - when(courseApi.getEnabledCourseFeatures(courseId)).thenAnswer((_) async => features); - final details = await AssignmentDetailsInteractor().loadAssignmentDetails(false, courseId, assignmentId, studentId); - - expect(details?.assignmentEnhancementEnabled, false); - }); - - test('returns assignmentEnhancementEnabled as true if response contains key', () async { - final features = ["feature1", "assignments_2_student", "feature3"]; - when(courseApi.getEnabledCourseFeatures(courseId)).thenAnswer((_) async => features); - final details = await AssignmentDetailsInteractor().loadAssignmentDetails(false, courseId, assignmentId, studentId); - - expect(details?.assignmentEnhancementEnabled, true); - }); - }); -} diff --git a/apps/flutter_parent/test/screens/assignments/assignment_details_screen_test.dart b/apps/flutter_parent/test/screens/assignments/assignment_details_screen_test.dart deleted file mode 100644 index 71cf83e179..0000000000 --- a/apps/flutter_parent/test/screens/assignments/assignment_details_screen_test.dart +++ /dev/null @@ -1,727 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -import 'dart:convert'; - -import 'package:built_collection/built_collection.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_parent/l10n/app_localizations.dart'; -import 'package:flutter_parent/models/assignment.dart'; -import 'package:flutter_parent/models/course.dart'; -import 'package:flutter_parent/models/lock_info.dart'; -import 'package:flutter_parent/models/locked_module.dart'; -import 'package:flutter_parent/models/reminder.dart'; -import 'package:flutter_parent/models/serializers.dart'; -import 'package:flutter_parent/models/submission.dart'; -import 'package:flutter_parent/models/submission_wrapper.dart'; -import 'package:flutter_parent/models/user.dart'; -import 'package:flutter_parent/network/utils/api_prefs.dart'; -import 'package:flutter_parent/screens/assignments/assignment_details_interactor.dart'; -import 'package:flutter_parent/screens/assignments/assignment_details_screen.dart'; -import 'package:flutter_parent/screens/inbox/create_conversation/create_conversation_interactor.dart'; -import 'package:flutter_parent/screens/inbox/create_conversation/create_conversation_screen.dart'; -import 'package:flutter_parent/utils/common_widgets/error_panda_widget.dart'; -import 'package:flutter_parent/utils/common_widgets/loading_indicator.dart'; -import 'package:flutter_parent/utils/common_widgets/web_view/html_description_tile.dart'; -import 'package:flutter_parent/utils/common_widgets/web_view/simple_web_view_screen.dart'; -import 'package:flutter_parent/utils/common_widgets/web_view/web_content_interactor.dart'; -import 'package:flutter_parent/utils/core_extensions/date_time_extensions.dart'; -import 'package:flutter_parent/utils/design/canvas_icons_solid.dart'; -import 'package:flutter_parent/utils/design/parent_colors.dart'; -import 'package:flutter_parent/utils/design/student_color_set.dart'; -import 'package:flutter_parent/utils/permission_handler.dart'; -import 'package:flutter_parent/utils/quick_nav.dart'; -import 'package:flutter_svg/svg.dart'; -import 'package:flutter_test/flutter_test.dart'; -import 'package:mockito/mockito.dart'; -import 'package:permission_handler/permission_handler.dart'; - -import '../../utils/accessibility_utils.dart'; -import '../../utils/platform_config.dart'; -import '../../utils/test_app.dart'; -import '../../utils/test_helpers/mock_helpers.mocks.dart'; - -void main() { - final courseId = '123'; - final assignmentId = '321'; - final studentId = '1337'; - final studentName = 'billy jean'; - final assignmentName = 'Instructure 101'; - final assignmentUrl = 'https://www.instructure.com'; - - final interactor = MockAssignmentDetailsInteractor(); - final convoInteractor = MockCreateConversationInteractor(); - final permissionHandler = MockPermissionHandler(); - - final student = User((b) => b - ..id = studentId - ..name = studentName); - - final assignment = Assignment((b) => b - ..id = assignmentId - ..courseId = courseId - ..name = assignmentName - ..htmlUrl = assignmentUrl - ..assignmentGroupId = '' - ..position = 0); - - final reminder = Reminder((b) => b - ..id = 123 - ..userId = 'user-123' - ..type = 'type' - ..itemId = 'item-123' - ..date = DateTime.now() - ..userDomain = 'domain'); - - setupTestLocator((locator) { - locator.registerFactory(() => interactor); - locator.registerFactory(() => convoInteractor); - locator.registerFactory(() => WebContentInteractor()); - locator.registerFactory(() => QuickNav()); - locator.registerFactory(() => permissionHandler); - }); - - setUp(() { - reset(interactor); - }); - - testWidgetsWithAccessibilityChecks('Shows loading', (tester) async { - await tester.pumpWidget(TestApp( - AssignmentDetailsScreen( - courseId: courseId, - assignmentId: assignmentId, - ), - platformConfig: PlatformConfig(mockApiPrefs: {ApiPrefs.KEY_CURRENT_STUDENT: json.encode(serialize(student))}), - )); - - await tester.pump(); - - expect(find.byType(LoadingIndicator), findsOneWidget); - expect(find.byType(FloatingActionButton), findsNothing); - }); - - testWidgetsWithAccessibilityChecks('Shows course name in app bar subtitle', (tester) async { - final courseName = 'name'; - when(interactor.loadAssignmentDetails(any, courseId, assignmentId, studentId)) - .thenAnswer((_) async => AssignmentDetails( - course: Course((b) => b..name = courseName), - assignment: assignment, - )); - - await tester.pumpWidget(TestApp( - AssignmentDetailsScreen( - courseId: courseId, - assignmentId: assignmentId, - ), - platformConfig: PlatformConfig(mockApiPrefs: {ApiPrefs.KEY_CURRENT_STUDENT: json.encode(serialize(student))}), - )); - - // Pump for a duration since we're delaying webview load for the animation - await tester.pumpAndSettle(Duration(seconds: 1)); - - expect(find.text(courseName), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('Can swipe to refresh', (tester) async { - when(interactor.loadAssignmentDetails(any, courseId, assignmentId, studentId)) - .thenAnswer((_) async => AssignmentDetails(assignment: assignment)); - - await tester.pumpWidget(TestApp( - AssignmentDetailsScreen( - courseId: courseId, - assignmentId: assignmentId, - ), - platformConfig: PlatformConfig(mockApiPrefs: {ApiPrefs.KEY_CURRENT_STUDENT: json.encode(serialize(student))}), - )); - - await tester.pumpAndSettle(); - - // Should have the refresh indicator - final matchedWidget = find.byType(RefreshIndicator); - expect(matchedWidget, findsOneWidget); - - // Try to refresh - await tester.drag(matchedWidget, const Offset(0, 200)); - await tester.pumpAndSettle(); - - verify(interactor.loadAssignmentDetails(any, courseId, assignmentId, studentId)).called(2); - }); - - testWidgetsWithAccessibilityChecks('Can send a message', (tester) async { - await tester.runAsync(() async { - when(convoInteractor.loadData(any, any)).thenAnswer((_) async => CreateConversationData(Course(), [])); - when(interactor.loadAssignmentDetails(any, courseId, assignmentId, studentId)) - .thenAnswer((_) async => AssignmentDetails(assignment: assignment)); - - await tester.pumpWidget(TestApp( - AssignmentDetailsScreen( - courseId: courseId, - assignmentId: assignmentId, - ), - platformConfig: PlatformConfig(mockApiPrefs: {ApiPrefs.KEY_CURRENT_STUDENT: json.encode(serialize(student))}), - )); - - await tester.pumpAndSettle(); - - await tester.tap(find.byType(FloatingActionButton)); - await tester.pumpAndSettle(); - - // Check to make sure we're on the conversation screen - expect(find.byType(CreateConversationScreen), findsOneWidget); - - // Check that we have the correct subject line - expect(find.text(AppLocalizations().assignmentSubjectMessage(studentName, assignmentName)), findsOneWidget); - }); - }); - - testWidgetsWithAccessibilityChecks('shows error', (tester) async { - when(interactor.loadAssignmentDetails(any, courseId, assignmentId, studentId)) - .thenAnswer((_) => Future.error('Failed to get assignment')); - - await tester.pumpWidget(TestApp( - AssignmentDetailsScreen( - courseId: courseId, - assignmentId: assignmentId, - ), - platformConfig: PlatformConfig(mockApiPrefs: {ApiPrefs.KEY_CURRENT_STUDENT: json.encode(serialize(student))}), - )); - - await tester.pumpAndSettle(); - - expect(find.byType(ErrorPandaWidget), findsOneWidget); - await tester.tap(find.text(AppLocalizations().retry)); - await tester.pumpAndSettle(); - - verify(interactor.loadAssignmentDetails(any, courseId, assignmentId, studentId)).called(2); - }); - - testWidgetsWithAccessibilityChecks('shows Assignment data', (tester) async { - final assignmentName = 'Testing Assignment'; - final description = 'This is a description'; - final dueDate = DateTime.utc(2000); - final points = 1.5; - - when(interactor.loadAssignmentDetails(any, courseId, assignmentId, studentId)) - .thenAnswer((_) async => AssignmentDetails( - assignment: assignment.rebuild((b) => b - ..name = assignmentName - ..description = description - ..pointsPossible = points - ..dueAt = dueDate))); - - await tester.pumpWidget(TestApp( - AssignmentDetailsScreen( - courseId: courseId, - assignmentId: assignmentId, - ), - platformConfig: PlatformConfig(mockApiPrefs: {ApiPrefs.KEY_CURRENT_STUDENT: json.encode(serialize(student))}), - )); - - // Pump for a duration since we're delaying webview load for the animation - await tester.pumpAndSettle(Duration(seconds: 1)); - - expect(find.text(assignmentName), findsOneWidget); - expect(find.text(dueDate.l10nFormat(AppLocalizations().dateAtTime)!), findsOneWidget); - expect(find.text('1.5 pts'), findsOneWidget); - expect(find.byIcon(Icons.do_not_disturb), findsOneWidget); - expect((tester.widget(find.byIcon(Icons.do_not_disturb)) as Icon).color, ParentColors.oxford); - expect(find.text(AppLocalizations().assignmentNotSubmittedLabel), findsOneWidget); - expect((tester.widget(find.text(AppLocalizations().assignmentNotSubmittedLabel)) as Text).style!.color, - ParentColors.oxford); - expect(find.text(AppLocalizations().assignmentRemindMeDescription), findsOneWidget); - expect((tester.widget(find.byType(Switch)) as Switch).value, false); - expect(find.text(AppLocalizations().descriptionTitle), findsOneWidget); - expect(find.byType(HtmlDescriptionTile), findsOneWidget); - - expect(find.text(AppLocalizations().assignmentLockLabel), findsNothing); - }); - - testWidgetsWithAccessibilityChecks('shows Assignment data when submitted', (tester) async { - final assignmentName = 'Testing Assignment'; - final dueDate = DateTime.utc(2000); - final submission = Submission((b) => b - ..assignmentId = assignmentId - ..userId = studentId - ..submittedAt = DateTime.now()); - - when(interactor.loadAssignmentDetails(any, courseId, assignmentId, studentId)).thenAnswer((_) async => - AssignmentDetails( - assignment: assignment.rebuild((b) => b - ..name = assignmentName - ..pointsPossible = 1.0 - ..submissionWrapper = - SubmissionWrapper((b) => b..submissionList = BuiltList.from([submission]).toBuilder()) - .toBuilder() - ..dueAt = dueDate))); - - await tester.pumpWidget(TestApp( - AssignmentDetailsScreen( - courseId: courseId, - assignmentId: assignmentId, - ), - platformConfig: PlatformConfig(mockApiPrefs: {ApiPrefs.KEY_CURRENT_STUDENT: json.encode(serialize(student))}), - )); - - // Pump for a duration since we're delaying webview load for the animation - await tester.pumpAndSettle(Duration(seconds: 1)); - - expect(find.text('1 pts'), findsOneWidget); - - var icon = find.byIcon(CanvasIconsSolid.check); - expect(icon, findsOneWidget); - expect((tester.widget(icon) as Icon).color, Colors.white); - - var iconContainer = tester.widget(find.ancestor(of: icon, matching: find.byType(Container)).first); - expect((iconContainer.decoration as BoxDecoration).color, StudentColorSet.shamrock.light); - - expect(find.text(AppLocalizations().assignmentSubmittedLabel), findsOneWidget); - expect((tester.widget(find.text(AppLocalizations().assignmentSubmittedLabel)) as Text).style!.color, - StudentColorSet.shamrock.light); - }); - - testWidgetsWithAccessibilityChecks('shows Assignment data with no submission', (tester) async { - final assignmentName = 'Testing Assignment'; - final dueDate = DateTime.utc(2000); - - when(interactor.loadAssignmentDetails(any, courseId, assignmentId, studentId)).thenAnswer((_) async => - AssignmentDetails( - assignment: assignment.rebuild((b) => b - ..name = assignmentName - ..pointsPossible = 1.0 - ..submissionWrapper = - SubmissionWrapper((b) => b..submissionList = BuiltList.from([]).toBuilder()).toBuilder() - ..submissionTypes = ListBuilder([SubmissionTypes.none]) - ..dueAt = dueDate))); - - await tester.pumpWidget(TestApp( - AssignmentDetailsScreen( - courseId: courseId, - assignmentId: assignmentId, - ), - platformConfig: PlatformConfig(mockApiPrefs: {ApiPrefs.KEY_CURRENT_STUDENT: json.encode(serialize(student))}), - )); - - // Pump for a duration since we're delaying webview load for the animation - await tester.pumpAndSettle(Duration(seconds: 1)); - - expect(find.text(assignmentName), findsOneWidget); - expect(find.text('1 pts'), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('shows Assignment with no due date', (tester) async { - when(interactor.loadAssignmentDetails(any, courseId, assignmentId, studentId)) - .thenAnswer((_) async => AssignmentDetails(assignment: assignment.rebuild((b) => b..dueAt = null))); - - await tester.pumpWidget(TestApp( - AssignmentDetailsScreen( - courseId: courseId, - assignmentId: assignmentId, - ), - platformConfig: PlatformConfig(mockApiPrefs: {ApiPrefs.KEY_CURRENT_STUDENT: json.encode(serialize(student))}), - )); - - // Pump for a duration since we're delaying webview load for the animation - await tester.pumpAndSettle(Duration(seconds: 1)); - - expect(find.text(AppLocalizations().noDueDate), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('shows lock info with module name', (tester) async { - final moduleName = 'Locked module'; - final lockInfo = LockInfo((b) => b - ..contextModule = LockedModule((m) => m - ..id = '' - ..contextId = '' - ..isRequireSequentialProgress = false - ..name = moduleName).toBuilder()); - when(interactor.loadAssignmentDetails(any, courseId, assignmentId, studentId)).thenAnswer( - (_) async => AssignmentDetails(assignment: assignment.rebuild((b) => b..lockInfo = lockInfo.toBuilder()))); - - await tester.pumpWidget(TestApp( - AssignmentDetailsScreen( - courseId: courseId, - assignmentId: assignmentId, - ), - platformConfig: PlatformConfig(mockApiPrefs: {ApiPrefs.KEY_CURRENT_STUDENT: json.encode(serialize(student))}), - )); - - await tester.pumpAndSettle(); - - expect(find.text(AppLocalizations().assignmentLockLabel), findsOneWidget); - expect(find.text(AppLocalizations().assignmentLockedModule(moduleName)), findsOneWidget); - - expect(find.byType(SvgPicture), findsOneWidget); // Show the locked panda - expect(find.text(AppLocalizations().assignmentDueLabel), findsNothing); // Fully locked, no due date - expect(find.text(AppLocalizations().descriptionTitle), findsNothing); // Fully locked, no description - }); - - testWidgetsWithAccessibilityChecks('shows lock info with unlock date', (tester) async { - final lockExplanation = 'Locked date'; - final unlockAt = DateTime.now().add(Duration(days: 1)); - final lockInfo = LockInfo((b) => b..unlockAt = unlockAt); - when(interactor.loadAssignmentDetails(any, courseId, assignmentId, studentId)) - .thenAnswer((_) async => AssignmentDetails( - assignment: assignment.rebuild((b) => b - ..lockExplanation = lockExplanation - ..lockInfo = lockInfo.toBuilder() - ..unlockAt = unlockAt), - )); - - await tester.pumpWidget(TestApp( - AssignmentDetailsScreen( - courseId: courseId, - assignmentId: assignmentId, - ), - platformConfig: PlatformConfig(mockApiPrefs: {ApiPrefs.KEY_CURRENT_STUDENT: json.encode(serialize(student))}), - )); - - await tester.pumpAndSettle(); - - expect(find.text(AppLocalizations().assignmentLockLabel), findsOneWidget); - expect(find.text(lockExplanation), findsOneWidget); - - expect(find.byType(SvgPicture), findsOneWidget); // Show the locked panda - expect(find.text(AppLocalizations().assignmentDueLabel), findsNothing); // Fully locked, no due date - expect(find.text(AppLocalizations().descriptionTitle), findsNothing); // Fully locked, no description - }); - - testWidgetsWithAccessibilityChecks('shows lock info with lock_explanation', (tester) async { - final explanation = 'it is locked'; - when(interactor.loadAssignmentDetails(any, courseId, assignmentId, studentId)) - .thenAnswer((_) async => AssignmentDetails( - assignment: assignment.rebuild((b) => b - ..lockExplanation = explanation - ..lockAt = DateTime.now().add(Duration(days: -1))), - )); - - await tester.pumpWidget(TestApp( - AssignmentDetailsScreen( - courseId: courseId, - assignmentId: assignmentId, - ), - platformConfig: PlatformConfig(mockApiPrefs: {ApiPrefs.KEY_CURRENT_STUDENT: json.encode(serialize(student))}), - )); - - // Pump for a duration since we're delaying webview load for the animation - await tester.pumpAndSettle(Duration(seconds: 1)); - - expect(find.text(AppLocalizations().assignmentLockLabel), findsOneWidget); - expect(find.text(explanation), findsOneWidget); - expect(find.text(AppLocalizations().assignmentDueLabel), findsOneWidget); // Not fully locked, show due date - expect(find.text(AppLocalizations().descriptionTitle), findsOneWidget); // Not fully locked, show desc - - expect(find.byType(SvgPicture), findsNothing); // Should not show the locked panda - }); - - testWidgetsWithAccessibilityChecks('does not show lock info with lock_explanation if not yet locked', (tester) async { - final explanation = 'it is locked'; - when(interactor.loadAssignmentDetails(any, courseId, assignmentId, studentId)) - .thenAnswer((_) async => AssignmentDetails( - assignment: assignment.rebuild((b) => b - ..lockExplanation = explanation - ..lockAt = DateTime.now().add(Duration(days: 1))), - )); - - await tester.pumpWidget(TestApp( - AssignmentDetailsScreen( - courseId: courseId, - assignmentId: assignmentId, - ), - platformConfig: PlatformConfig(mockApiPrefs: {ApiPrefs.KEY_CURRENT_STUDENT: json.encode(serialize(student))}), - )); - - // Pump for a duration since we're delaying webview load for the animation - await tester.pumpAndSettle(Duration(seconds: 1)); - - // Should not show locked info since it is not yet locked - expect(find.text(AppLocalizations().assignmentLockLabel), findsNothing); - expect(find.text(explanation), findsNothing); - }); - - testWidgetsWithAccessibilityChecks('shows Assignment with no description', (tester) async { - when(interactor.loadAssignmentDetails(any, courseId, assignmentId, studentId)) - .thenAnswer((_) async => AssignmentDetails(assignment: assignment.rebuild((b) => b..dueAt = null))); - - await tester.pumpWidget(TestApp( - AssignmentDetailsScreen( - courseId: courseId, - assignmentId: assignmentId, - ), - platformConfig: PlatformConfig(mockApiPrefs: {ApiPrefs.KEY_CURRENT_STUDENT: json.encode(serialize(student))}), - )); - - // Pump for a duration since we're delaying webview load for the animation - await tester.pumpAndSettle(Duration(seconds: 1)); - - expect(find.text(AppLocalizations().noDescriptionBody), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('shows Assignment instruction if quiz', (tester) async { - when(interactor.loadAssignmentDetails(any, courseId, assignmentId, studentId)) - .thenAnswer((_) async => AssignmentDetails( - assignment: assignment.rebuild((b) => b - ..dueAt = null - ..submissionTypes = BuiltList.of([SubmissionTypes.onlineQuiz]).toBuilder()))); - - await tester.pumpWidget(TestApp( - AssignmentDetailsScreen( - courseId: courseId, - assignmentId: assignmentId, - ), - platformConfig: PlatformConfig(mockApiPrefs: {ApiPrefs.KEY_CURRENT_STUDENT: json.encode(serialize(student))}), - )); - - // Pump for a duration since we're delaying webview load for the animation - await tester.pumpAndSettle(Duration(seconds: 1)); - - expect(find.text(AppLocalizations().assignmentInstructionsLabel), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('shows reminder if set', (tester) async { - when(interactor.loadAssignmentDetails(any, courseId, assignmentId, studentId)) - .thenAnswer((_) async => AssignmentDetails(assignment: assignment)); - - when(interactor.loadReminder(any)).thenAnswer((_) async => reminder); - - await tester.pumpWidget(TestApp( - AssignmentDetailsScreen( - courseId: courseId, - assignmentId: assignmentId, - ), - platformConfig: PlatformConfig(mockApiPrefs: {ApiPrefs.KEY_CURRENT_STUDENT: json.encode(serialize(student))}), - )); - - // Pump for a duration since we're delaying webview load for the animation - await tester.pumpAndSettle(Duration(seconds: 1)); - - expect(find.text(AppLocalizations().assignmentRemindMeSet), findsOneWidget); - expect((tester.widget(find.byType(Switch)) as Switch).value, true); - expect(find.text(reminder.date.l10nFormat(AppLocalizations().dateAtTime)!), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('creates reminder without due date', (tester) async { - when(permissionHandler.checkPermissionStatus(Permission.scheduleExactAlarm)).thenAnswer((realInvocation) => Future.value(PermissionStatus.granted)); - when(interactor.loadAssignmentDetails(any, courseId, assignmentId, studentId)) - .thenAnswer((_) async => AssignmentDetails(assignment: assignment)); - - when(interactor.loadReminder(any)).thenAnswer((_) async => null); - - await tester.pumpWidget(TestApp( - AssignmentDetailsScreen( - courseId: courseId, - assignmentId: assignmentId, - ), - platformConfig: PlatformConfig(mockApiPrefs: {ApiPrefs.KEY_CURRENT_STUDENT: json.encode(serialize(student))}), - )); - - await tester.pumpAndSettle(); - - expect(find.text(AppLocalizations().assignmentRemindMeDescription), findsOneWidget); - expect((tester.widget(find.byType(Switch)) as Switch).value, false); - - when(interactor.loadReminder(any)).thenAnswer((_) async => reminder); - - // Tap on switch to open date picker - await tester.tap(find.byType(Switch)); - await tester.pumpAndSettle(); - - // Tap on 'OK' button in date picker to open time picker - await tester.tap(find.text(DefaultMaterialLocalizations().okButtonLabel)); - await tester.pumpAndSettle(); - - // Tap on 'OK' button in time picker - await tester.tap(find.text(DefaultMaterialLocalizations().okButtonLabel)); - await tester.pumpAndSettle(); - - verify(interactor.createReminder(any, any, assignmentId, courseId, assignment.name, AppLocalizations().noDueDate)); - - expect(find.text(AppLocalizations().assignmentRemindMeSet), findsOneWidget); - expect((tester.widget(find.byType(Switch)) as Switch).value, true); - expect(find.text(reminder.date.l10nFormat(AppLocalizations().dateAtTime)!), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('creates reminder with due date', (tester) async { - when(permissionHandler.checkPermissionStatus(Permission.scheduleExactAlarm)).thenAnswer((realInvocation) => Future.value(PermissionStatus.granted)); - final date = DateTime.now().add(Duration(hours: 1)); - when(interactor.loadAssignmentDetails(any, any, any, any)) - .thenAnswer((_) async => AssignmentDetails(assignment: assignment.rebuild((b) => b..dueAt = date))); - - when(interactor.loadReminder(any)).thenAnswer((_) async => null); - - await tester.pumpWidget(TestApp( - AssignmentDetailsScreen( - courseId: courseId, - assignmentId: assignmentId, - ), - platformConfig: PlatformConfig(mockApiPrefs: {ApiPrefs.KEY_CURRENT_STUDENT: json.encode(serialize(student))}), - )); - - await tester.pumpAndSettle(); - - expect(find.text(AppLocalizations().assignmentRemindMeDescription), findsOneWidget); - expect((tester.widget(find.byType(Switch)) as Switch).value, false); - - when(interactor.loadReminder(any)).thenAnswer((_) async => reminder); - - // Tap on switch to open date picker - await tester.tap(find.byType(Switch)); - await tester.pumpAndSettle(); - - // Tap on 'OK' button in date picker to open time picker - await tester.tap(find.text(DefaultMaterialLocalizations().okButtonLabel)); - await tester.pumpAndSettle(); - - // Tap on 'OK' button in time picker - await tester.tap(find.text(DefaultMaterialLocalizations().okButtonLabel)); - await tester.pumpAndSettle(); - - var expectedBody = date.l10nFormat(AppLocalizations().dueDateAtTime); - verify(interactor.createReminder(any, any, assignmentId, courseId, assignment.name, expectedBody)); - - expect(find.text(AppLocalizations().assignmentRemindMeSet), findsOneWidget); - expect((tester.widget(find.byType(Switch)) as Switch).value, true); - expect(find.text(reminder.date.l10nFormat(AppLocalizations().dateAtTime)!), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('deletes reminder', (tester) async { - when(interactor.loadAssignmentDetails(any, courseId, assignmentId, studentId)) - .thenAnswer((_) async => AssignmentDetails(assignment: assignment)); - - when(interactor.loadReminder(any)).thenAnswer((_) async => reminder); - - await tester.pumpWidget(TestApp( - AssignmentDetailsScreen( - courseId: courseId, - assignmentId: assignmentId, - ), - platformConfig: PlatformConfig(mockApiPrefs: {ApiPrefs.KEY_CURRENT_STUDENT: json.encode(serialize(student))}), - )); - - // Pump for a duration since we're delaying webview load for the animation - await tester.pumpAndSettle(Duration(seconds: 1)); - - expect(find.text(AppLocalizations().assignmentRemindMeSet), findsOneWidget); - expect((tester.widget(find.byType(Switch)) as Switch).value, true); - - when(interactor.loadReminder(any)).thenAnswer((_) async => null); - - await tester.tap(find.byType(Switch)); - await tester.pumpAndSettle(); - - expect(find.text(AppLocalizations().assignmentRemindMeDescription), findsOneWidget); - expect((tester.widget(find.byType(Switch)) as Switch).value, false); - }); - - testWidgetsWithAccessibilityChecks('shows Submission & Rubric button', (tester) async { - when(interactor.loadAssignmentDetails(any, courseId, assignmentId, studentId)).thenAnswer((_) async => AssignmentDetails(assignment: assignment)); - - await tester.pumpWidget(TestApp( - AssignmentDetailsScreen( - courseId: courseId, - assignmentId: assignmentId, - ), - platformConfig: PlatformConfig(mockApiPrefs: {ApiPrefs.KEY_CURRENT_STUDENT: json.encode(serialize(student))}), - )); - - // Pump for a duration since we're delaying webview load for the animation - await tester.pumpAndSettle(Duration(seconds: 1)); - - expect(find.text(AppLocalizations().submissionAndRubric), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('Submission & Rubric button opens SimpleWebViewScreen', (tester) async { - when(interactor.loadAssignmentDetails(any, courseId, assignmentId, studentId)).thenAnswer((_) async => AssignmentDetails(assignment: assignment)); - - await tester.pumpWidget(TestApp( - AssignmentDetailsScreen( - courseId: courseId, - assignmentId: assignmentId, - ), - platformConfig: PlatformConfig(mockApiPrefs: {ApiPrefs.KEY_CURRENT_STUDENT: json.encode(serialize(student))}, initWebview: true), - )); - - // Pump for a duration since we're delaying webview load for the animation - await tester.pumpAndSettle(Duration(seconds: 1)); - - await tester.tap(find.text(AppLocalizations().submissionAndRubric)); - await tester.pumpAndSettle(); - - // Check to make sure we're on the SimpleWebViewScreen screen - expect(find.byType(SimpleWebViewScreen), findsOneWidget); - - // Check that we have the correct title - expect(find.text(AppLocalizations().submission), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks( - 'Submission & Rubric button opens SimpleWebViewScreen with the ' - 'correct url when assignment enhancements are enabled', (tester) async { - when(interactor.loadAssignmentDetails(any, courseId, assignmentId, studentId)) - .thenAnswer((_) async => AssignmentDetails(assignment: assignment, assignmentEnhancementEnabled: true)); - - await tester.pumpWidget(TestApp( - AssignmentDetailsScreen( - courseId: courseId, - assignmentId: assignmentId, - ), - platformConfig: PlatformConfig(mockApiPrefs: {ApiPrefs.KEY_CURRENT_STUDENT: json.encode(serialize(student))}, initWebview: true), - )); - - // Pump for a duration since we're delaying webview load for the animation - await tester.pumpAndSettle(Duration(seconds: 1)); - - await tester.tap(find.text(AppLocalizations().submissionAndRubric)); - await tester.pumpAndSettle(); - - // Check to make sure we're on the SimpleWebViewScreen screen - final webViewScreenFinder = find.byType(SimpleWebViewScreen); - expect(find.byType(SimpleWebViewScreen), findsOneWidget); - - final SimpleWebViewScreen webViewScreen = tester.widget(webViewScreenFinder) as SimpleWebViewScreen; - expect(webViewScreen.url, assignmentUrl); - - // Check that we have the correct title - expect(find.text(AppLocalizations().submission), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks( - 'Submission & Rubric button opens SimpleWebViewScreen with the ' - 'correct url when assignment enhancements are disabled', (tester) async { - when(interactor.loadAssignmentDetails(any, courseId, assignmentId, studentId)) - .thenAnswer((_) async => AssignmentDetails(assignment: assignment, assignmentEnhancementEnabled: false)); - - await tester.pumpWidget(TestApp( - AssignmentDetailsScreen( - courseId: courseId, - assignmentId: assignmentId, - ), - platformConfig: PlatformConfig(mockApiPrefs: {ApiPrefs.KEY_CURRENT_STUDENT: json.encode(serialize(student))}, initWebview: true), - )); - - // Pump for a duration since we're delaying webview load for the animation - await tester.pumpAndSettle(Duration(seconds: 1)); - - await tester.tap(find.text(AppLocalizations().submissionAndRubric)); - await tester.pumpAndSettle(); - - // Check to make sure we're on the SimpleWebViewScreen screen - final webViewScreenFinder = find.byType(SimpleWebViewScreen); - expect(find.byType(SimpleWebViewScreen), findsOneWidget); - - final SimpleWebViewScreen webViewScreen = tester.widget(webViewScreenFinder) as SimpleWebViewScreen; - expect(webViewScreen.url, assignmentUrl + '/submissions/' + studentId); - - // Check that we have the correct title - expect(find.text(AppLocalizations().submission), findsOneWidget); - }); -} diff --git a/apps/flutter_parent/test/screens/assignments/grade_cell_data_test.dart b/apps/flutter_parent/test/screens/assignments/grade_cell_data_test.dart deleted file mode 100644 index 2fe2782299..0000000000 --- a/apps/flutter_parent/test/screens/assignments/grade_cell_data_test.dart +++ /dev/null @@ -1,388 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:built_collection/built_collection.dart'; -import 'package:built_value/json_object.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_parent/l10n/app_localizations.dart'; -import 'package:flutter_parent/models/assignment.dart'; -import 'package:flutter_parent/models/course.dart'; -import 'package:flutter_parent/models/grade_cell_data.dart'; -import 'package:flutter_parent/models/submission.dart'; -import 'package:flutter_parent/utils/core_extensions/date_time_extensions.dart'; -import 'package:flutter_parent/utils/design/parent_colors.dart'; -import 'package:flutter_test/flutter_test.dart'; -import 'package:intl/intl.dart'; - -void main() { - late Assignment baseAssignment; - late Submission baseSubmission; - late GradeCellData baseGradedState; - late Course baseCourse; - - Color secondaryColor = Colors.pinkAccent; - - ThemeData theme = ThemeData().copyWith(colorScheme: ThemeData().colorScheme.copyWith(secondary: secondaryColor)); - AppLocalizations l10n = AppLocalizations(); - - setUp(() { - baseAssignment = Assignment((a) => a - ..id = '1' - ..courseId = '123' - ..assignmentGroupId = '' - ..position = 0 - ..pointsPossible = 100.0 - ..gradingType = GradingType.points); - - baseSubmission = Submission((s) => s - ..attempt = 1 - ..assignmentId = '1' - ..submittedAt = DateTime(2017, 6, 27, 18, 47, 0) - ..workflowState = 'graded' - ..enteredGrade = '85' - ..enteredScore = 85.0 - ..grade = '85' - ..score = 85.0); - - baseGradedState = GradeCellData((b) => b - ..state = GradeCellState.graded - ..accentColor = secondaryColor - ..outOf = 'Out of 100 points'); - - final gradingSchemeBuilder = ListBuilder() - ..add(JsonObject(["A", 0.9])) - ..add(JsonObject(["F", 0.0])); - - baseCourse = Course((b) => b - ..id = '123' - ..settings.restrictQuantitativeData = false - ..gradingScheme = gradingSchemeBuilder); - }); - - test('Returns empty for null submission', () { - var expected = GradeCellData(); - var actual = GradeCellData.forSubmission(baseCourse, baseAssignment, null, theme, l10n); - expect(actual, expected); - }); - - test('Returns Graded state if graded but not submitted', () { - var submission = baseSubmission.rebuild((b) => b..submittedAt = null); - var expected = baseGradedState.rebuild((b) => b - ..graphPercent = 0.85 - ..score = '85' - ..showPointsLabel = true); - var actual = GradeCellData.forSubmission(baseCourse, baseAssignment, submission, theme, l10n); - expect(actual, expected); - }); - - test('Returns Empty state if graded, not submitted, and grade is hidden', () { - var submission = baseSubmission.rebuild((b) => b - ..submittedAt = null - ..enteredGrade = null - ..enteredScore = 0.0 - ..grade = null - ..score = 0.0); - var expected = GradeCellData(); - var actual = GradeCellData.forSubmission(baseCourse, baseAssignment, submission, theme, l10n); - expect(actual, expected); - }); - - test('Returns Submitted state if submitted but not graded', () { - var submission = Submission((s) => s - ..attempt = 1 - ..assignmentId = '1' - ..submittedAt = DateTime(2017, 6, 27, 18, 47, 0) - ..workflowState = 'submitted'); - var expected = GradeCellData((b) => b - ..state = GradeCellState.submitted - ..submissionText = submission.submittedAt.l10nFormat( - l10n.submissionStatusSuccessSubtitle, - dateFormat: DateFormat.MMMMd(), - )); - var actual = GradeCellData.forSubmission(baseCourse, baseAssignment, submission, theme, l10n); - expect(actual, expected); - }); - - test('Returns Empty state when not submitted and ungraded', () { - var submission = Submission((b) => b..assignmentId = '1'); - var expected = GradeCellData(); - var actual = GradeCellData.forSubmission(baseCourse, baseAssignment, submission, theme, l10n); - expect(actual, expected); - }); - - test('Returns correct graded state for excused', () { - var submission = baseSubmission.rebuild((b) => b..excused = true); - var expected = baseGradedState.rebuild((b) => b - ..graphPercent = 1.0 - ..showCompleteIcon = true - ..grade = 'Excused'); - var actual = GradeCellData.forSubmission(baseCourse, baseAssignment, submission, theme, l10n); - expect(actual, expected); - }); - - test('Returns correct state for \'Percentage\' grading type', () { - var assignment = baseAssignment.rebuild((b) => b..gradingType = GradingType.percent); - var submission = baseSubmission.rebuild((b) => b..grade = '85%'); - var expected = baseGradedState.rebuild((b) => b - ..graphPercent = 0.85 - ..score = '85' - ..showPointsLabel = true - ..grade = '85%' - ..gradeContentDescription = '85%'); - var actual = GradeCellData.forSubmission(baseCourse, assignment, submission, theme, l10n); - expect(actual, expected); - }); - - test('Returns correct state for \'Complete-Incomplete\' grading type if Complete', () { - var assignment = baseAssignment.rebuild((b) => b..gradingType = GradingType.passFail); - var submission = baseSubmission.rebuild((b) => b..grade = 'complete'); - var expected = baseGradedState.rebuild((b) => b - ..graphPercent = 1.0 - ..showCompleteIcon = true - ..grade = 'Complete'); - var actual = GradeCellData.forSubmission(baseCourse, assignment, submission, theme, l10n); - expect(actual, expected); - }); - - test('Returns correct state for \'Complete-Incomplete\' grading type if Incomplete', () { - var assignment = baseAssignment.rebuild((b) => b..gradingType = GradingType.passFail); - var submission = baseSubmission.rebuild((b) => b - ..grade = 'incomplete' - ..score = 0.0); - var expected = baseGradedState.rebuild((b) => b - ..accentColor = ParentColors.ash - ..graphPercent = 1.0 - ..showIncompleteIcon = true - ..grade = 'Incomplete'); - var actual = GradeCellData.forSubmission(baseCourse, assignment, submission, theme, l10n); - expect(actual, expected); - }); - - test('Returns correct state for \'Complete-Incomplete\' grading type if not graded', () { - var assignment = baseAssignment.rebuild((b) => b..gradingType = GradingType.passFail); - var submission = baseSubmission.rebuild((b) => b - ..grade = null - ..score = 0.0); - var expected = GradeCellData((b) => b - ..state = GradeCellState.submitted - ..submissionText = submission.submittedAt.l10nFormat( - l10n.submissionStatusSuccessSubtitle, - dateFormat: DateFormat.MMMMd(), - )); - var actual = GradeCellData.forSubmission(baseCourse, assignment, submission, theme, l10n); - expect(actual, expected); - }); - - test('Returns correct state for \'Points\' grading type', () { - var expected = baseGradedState.rebuild((b) => b - ..graphPercent = 0.85 - ..score = '85' - ..showPointsLabel = true); - var actual = GradeCellData.forSubmission(baseCourse, baseAssignment, baseSubmission, theme, l10n); - expect(actual, expected); - }); - - test('Returns correct state for \'Letter Grade\' grading type', () { - var assignment = baseAssignment.rebuild((b) => b..gradingType = GradingType.letterGrade); - var submission = baseSubmission.rebuild((b) => b..grade = 'B+'); - var expected = baseGradedState.rebuild((b) => b - ..graphPercent = 0.85 - ..score = '85' - ..showPointsLabel = true - ..grade = 'B+' - ..gradeContentDescription = 'B+'); - var actual = GradeCellData.forSubmission(baseCourse, assignment, submission, theme, l10n); - expect(actual, expected); - }); - - test('Returns correct state for \'Letter Grade\' grading type with minus', () { - var assignment = baseAssignment.rebuild((b) => b..gradingType = GradingType.letterGrade); - var submission = baseSubmission.rebuild((b) => b - ..grade = 'A-' - ..enteredGrade = 'A-' - ..enteredScore = 91.0 - ..score = 91.0); - var expected = baseGradedState.rebuild((b) => b - ..graphPercent = 0.91 - ..score = '91' - ..showPointsLabel = true - ..grade = 'A-' - ..gradeContentDescription = 'A. minus'); - var actual = GradeCellData.forSubmission(baseCourse, assignment, submission, theme, l10n); - expect(actual, expected); - }); - - test('Returns correct state for \'GPA Scale\' grading type', () { - var assignment = baseAssignment.rebuild((b) => b..gradingType = GradingType.gpaScale); - var submission = baseSubmission.rebuild((b) => b..grade = '3.8 GPA'); - var expected = baseGradedState.rebuild((b) => b - ..graphPercent = 0.85 - ..score = '85' - ..showPointsLabel = true - ..grade = '3.8 GPA' - ..gradeContentDescription = '3.8 GPA'); - var actual = GradeCellData.forSubmission(baseCourse, assignment, submission, theme, l10n); - expect(actual, expected); - }); - - test('Returns empty state for \'Not Graded\' grading type', () { - var assignment = baseAssignment.rebuild((b) => b..gradingType = GradingType.notGraded); - var submission = Submission((b) => b..assignmentId = '1'); - var expected = GradeCellData(); - var actual = GradeCellData.forSubmission(baseCourse, assignment, submission, theme, l10n); - expect(actual, expected); - }); - - test('Returns correct state for late penalty', () { - var submission = baseSubmission.rebuild((b) => b - ..pointsDeducted = 6.0 - ..grade = '79' - ..score = 79.0); - var expected = baseGradedState.rebuild((b) => b - ..graphPercent = 0.79 - ..score = '79' - ..showPointsLabel = true - ..yourGrade = 'Your grade: 85' - ..latePenalty = 'Late Penalty: -6 pts' - ..finalGrade = 'Final Grade: 79'); - var actual = GradeCellData.forSubmission(baseCourse, baseAssignment, submission, theme, l10n); - expect(actual, expected); - }); - - test('Includes content descriptions for letter grade with minus', () { - var assignment = baseAssignment.rebuild((b) => b..gradingType = GradingType.letterGrade); - var submission = baseSubmission.rebuild((b) => b..grade = 'B-'); - var expected = baseGradedState.rebuild((b) => b - ..graphPercent = 0.85 - ..score = '85' - ..showPointsLabel = true - ..grade = 'B-' - ..gradeContentDescription = 'B. minus'); - var actual = GradeCellData.forSubmission(baseCourse, assignment, submission, theme, l10n); - expect(actual, expected); - }); - - test('Includes content descriptions for grades', () { - var assignment = baseAssignment.rebuild((b) => b..gradingType = GradingType.letterGrade); - var submission = baseSubmission.rebuild((b) => b - ..grade = 'B' - ..enteredGrade = '88' - ..enteredScore = 88.0 - ..score = 88.0); - var expected = baseGradedState.rebuild((b) => b - ..graphPercent = 0.88 - ..score = '88' - ..showPointsLabel = true - ..grade = 'B' - ..gradeContentDescription = 'B'); - var actual = GradeCellData.forSubmission(baseCourse, assignment, submission, theme, l10n); - expect(actual, expected); - }); - - test('Returns Empty state when quantitative data is restricted, grading type is points, grading scheme is null and not excused', () { - var course = baseCourse.rebuild((b) => b - ..settings.restrictQuantitativeData = true - ..gradingScheme = null); - var assignment = baseAssignment.rebuild((b) => b..gradingType = GradingType.points); - var submission = Submission((b) => b - ..assignmentId = '1' - ..score = 10.0 - ..grade = 'A'); - var expected = GradeCellData(); - var actual = GradeCellData.forSubmission(course, assignment, submission, theme, l10n); - expect(actual, expected); - }); - - test('Returns Empty state when quantitative data is restricted, grading type is percent, grading scheme is null and not excused', () { - var course = baseCourse.rebuild((b) => b - ..settings.restrictQuantitativeData = true - ..gradingScheme = null); - var assignment = baseAssignment.rebuild((b) => b..gradingType = GradingType.percent); - var submission = Submission((b) => b - ..assignmentId = '1' - ..score = 10.0 - ..grade = 'A'); - var expected = GradeCellData(); - var actual = GradeCellData.forSubmission(course, assignment, submission, theme, l10n); - expect(actual, expected); - }); - - test('Returns correct state when quantitative data is restricted and grading type is percent and excused', () { - var course = baseCourse.rebuild((b) => b..settings.restrictQuantitativeData = true); - var assignment = baseAssignment.rebuild((b) => b..gradingType = GradingType.percent); - var submission = Submission((b) => b - ..assignmentId = '1' - ..score = 10.0 - ..grade = 'A' - ..excused = true); - var expected = baseGradedState.rebuild((b) => b - ..graphPercent = 1.0 - ..grade = l10n.excused - ..outOf = '' - ..showCompleteIcon = true); - var actual = GradeCellData.forSubmission(course, assignment, submission, theme, l10n); - expect(actual, expected); - }); - - test('Returns correct state when quantitative data is restricted and graded', () { - var course = baseCourse.rebuild((b) => b..settings.restrictQuantitativeData = true); - var assignment = baseAssignment.rebuild((b) => b..gradingType = GradingType.letterGrade); - var submission = Submission((b) => b - ..assignmentId = '1' - ..score = 10.0 - ..grade = 'A'); - var expected = baseGradedState.rebuild((b) => b - ..state = GradeCellState.gradedRestrictQuantitativeData - ..graphPercent = 1.0 - ..score = submission.grade - ..gradeContentDescription = submission.grade - ..outOf = ''); - var actual = GradeCellData.forSubmission(course, assignment, submission, theme, l10n); - expect(actual, expected); - }); - - test('Returns correct state when quantitative data is restricted, grading type is percent and grading scheme is given', () { - var course = baseCourse.rebuild((b) => b..settings.restrictQuantitativeData = true); - var assignment = baseAssignment.rebuild((b) => b..gradingType = GradingType.percent); - var submission = Submission((b) => b - ..assignmentId = '1' - ..score = 10.0 - ..grade = 'A'); - var expected = baseGradedState.rebuild((b) => b - ..state = GradeCellState.gradedRestrictQuantitativeData - ..graphPercent = 1.0 - ..score = 'F' - ..outOf = '' - ..gradeContentDescription = 'F'); - var actual = GradeCellData.forSubmission(course, assignment, submission, theme, l10n); - expect(actual, expected); - }); - - test('Returns correct state when quantitative data is restricted, grading type is point and grading scheme is given', () { - var course = baseCourse.rebuild((b) => b..settings.restrictQuantitativeData = true); - var assignment = baseAssignment.rebuild((b) => b..gradingType = GradingType.points); - var submission = Submission((b) => b - ..assignmentId = '1' - ..score = 90.0 - ..grade = 'A'); - var expected = baseGradedState.rebuild((b) => b - ..state = GradeCellState.gradedRestrictQuantitativeData - ..graphPercent = 1.0 - ..score = 'A' - ..outOf = '' - ..gradeContentDescription = 'A'); - var actual = GradeCellData.forSubmission(course, assignment, submission, theme, l10n); - expect(actual, expected); - }); -} diff --git a/apps/flutter_parent/test/screens/assignments/grade_cell_widget_test.dart b/apps/flutter_parent/test/screens/assignments/grade_cell_widget_test.dart deleted file mode 100644 index 3cc7c10885..0000000000 --- a/apps/flutter_parent/test/screens/assignments/grade_cell_widget_test.dart +++ /dev/null @@ -1,193 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:flutter/material.dart'; -import 'package:flutter_parent/l10n/app_localizations.dart'; -import 'package:flutter_parent/models/grade_cell_data.dart'; -import 'package:flutter_parent/screens/assignments/grade_cell.dart'; -import 'package:flutter_parent/utils/design/parent_colors.dart'; -import 'package:flutter_test/flutter_test.dart'; -import 'package:percent_indicator/circular_percent_indicator.dart'; - -import '../../utils/accessibility_utils.dart'; -import '../../utils/test_app.dart'; - -void main() { - AppLocalizations l10n = AppLocalizations(); - - Future setupWithData(WidgetTester tester, GradeCellData data) async { - await tester.pumpWidget(TestApp(GradeCell(data))); - await tester.pumpAndSettle(); - } - - testWidgetsWithAccessibilityChecks('Show empty state', (tester) async { - GradeCellData data = GradeCellData(); - await setupWithData(tester, data); - - expect(find.byKey(Key('grade-cell-empty-container')), findsOneWidget); - expect(find.byKey(Key('grade-cell-graded-container')), findsNothing); - expect(find.byKey(Key('grade-cell-submitted-container')), findsNothing); - }); - - testWidgetsWithAccessibilityChecks('Shows submitted state', (tester) async { - GradeCellData data = GradeCellData((b) => b..state = GradeCellState.submitted); - await setupWithData(tester, data); - - expect(find.byKey(Key('grade-cell-empty-container')), findsNothing); - expect(find.byKey(Key('grade-cell-graded-container')), findsNothing); - expect(find.byKey(Key('grade-cell-submitted-container')), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('Shows graded state', (tester) async { - GradeCellData data = GradeCellData((b) => b..state = GradeCellState.graded); - await setupWithData(tester, data); - - expect(find.byKey(Key('grade-cell-empty-container')), findsNothing); - expect(find.byKey(Key('grade-cell-graded-container')), findsOneWidget); - expect(find.byKey(Key('grade-cell-submitted-container')), findsNothing); - }); - - testWidgetsWithAccessibilityChecks('Does not show divider and label for empty state', (tester) async { - GradeCellData data = GradeCellData(); - await setupWithData(tester, data); - - expect(find.byType(Divider), findsNothing); - expect(find.text(l10n.assignmentGradeLabel), findsNothing); - }); - - testWidgetsWithAccessibilityChecks('Shows divider and label for submitted state', (tester) async { - GradeCellData data = GradeCellData((b) => b..state = GradeCellState.submitted); - await setupWithData(tester, data); - - expect(find.byType(Divider), findsOneWidget); - expect(find.text(l10n.assignmentGradeLabel), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('Shows divider and label for graded state', (tester) async { - GradeCellData data = GradeCellData((b) => b..state = GradeCellState.graded); - await setupWithData(tester, data); - - expect(find.byType(Divider), findsOneWidget); - expect(find.text(l10n.assignmentGradeLabel), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('Shows title and message in submitted state', (tester) async { - GradeCellData data = GradeCellData((b) => b - ..state = GradeCellState.submitted - ..submissionText = 'Submission text'); - await setupWithData(tester, data); - - expect(find.text(l10n.submissionStatusSuccessTitle), findsOneWidget); - expect(find.text(data.submissionText), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('Displays circular grade graph with correct percentage value', (tester) async { - GradeCellData data = GradeCellData((b) => b - ..state = GradeCellState.graded - ..accentColor = Colors.pinkAccent - ..graphPercent = 0.25); - await setupWithData(tester, data); - - var finder = find.byType(CircularPercentIndicator); - expect(finder, findsOneWidget); - expect(tester.widget(finder).percent, data.graphPercent); - expect(tester.widget(finder).progressColor, data.accentColor); - }); - - testWidgetsWithAccessibilityChecks('Displays points and label', (tester) async { - GradeCellData data = GradeCellData((b) => b - ..state = GradeCellState.graded - ..score = '99.5' - ..showPointsLabel = true); - await setupWithData(tester, data); - - expect(find.byKey(Key('grade-cell-score')).evaluate(), find.text(data.score).evaluate()); - expect(find.byKey(Key('grade-cell-points-label')), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('Displays complete icon', (tester) async { - GradeCellData data = GradeCellData((b) => b - ..state = GradeCellState.graded - ..showCompleteIcon = true); - await setupWithData(tester, data); - - expect(find.byKey(Key('grade-cell-complete-icon')), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('Displays incomplete icon', (tester) async { - GradeCellData data = GradeCellData((b) => b - ..state = GradeCellState.graded - ..showIncompleteIcon = true); - await setupWithData(tester, data); - - expect(find.byKey(Key('grade-cell-incomplete-icon')), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('Displays grade text', (tester) async { - GradeCellData data = GradeCellData((b) => b - ..state = GradeCellState.graded - ..grade = 'A-' - ..gradeContentDescription = 'A. minus'); - await setupWithData(tester, data); - - var finder = find.byKey(Key('grade-cell-grade')); - expect(tester.widget(finder).data, data.grade); - expect(tester.widget(finder).semanticsLabel, data.gradeContentDescription); - }); - - testWidgetsWithAccessibilityChecks('Displays \'out of\' text', (tester) async { - GradeCellData data = GradeCellData((b) => b - ..state = GradeCellState.graded - ..outOf = 'Out of 100 points'); - await setupWithData(tester, data); - - expect(find.byKey(Key('grade-cell-out-of')).evaluate(), find.text(data.outOf).evaluate()); - }); - - testWidgetsWithAccessibilityChecks('Displays late penalty text', (tester) async { - GradeCellData data = GradeCellData((b) => b - ..state = GradeCellState.graded - ..accentColor = Colors.pinkAccent - ..yourGrade = 'Your grade: 85' - ..latePenalty = 'Late penalty: -25'); - await setupWithData(tester, data); - - expect(find.byKey(Key('grade-cell-late-penalty')).evaluate(), find.text(data.latePenalty).evaluate()); - expect(find.byKey(Key('grade-cell-your-grade')).evaluate(), find.text(data.yourGrade).evaluate()); - expect(tester.widget(find.byKey(Key('grade-cell-late-penalty'))).style!.color, ParentColors.failure); - }); - - testWidgetsWithAccessibilityChecks('Displays final grade text', (tester) async { - GradeCellData data = GradeCellData((b) => b - ..state = GradeCellState.graded - ..finalGrade = 'Final Grade: A-'); - await setupWithData(tester, data); - - expect(find.byKey(Key('grade-cell-final-grade')).evaluate(), find.text(data.finalGrade).evaluate()); - }); - - testWidgetsWithAccessibilityChecks('Correctly hides elements', (tester) async { - GradeCellData data = GradeCellData((b) => b..state = GradeCellState.graded); - await setupWithData(tester, data); - - expect(find.byKey(Key('grade-cell-score')), findsNothing); - expect(find.byKey(Key('grade-cell-grade')), findsNothing); - expect(find.byKey(Key('grade-cell-out-of')), findsNothing); - expect(find.byKey(Key('grade-cell-final-grade')), findsNothing); - expect(find.byKey(Key('grade-cell-points-label')), findsNothing); - expect(find.byKey(Key('grade-cell-late-penalty')), findsNothing); - expect(find.byKey(Key('grade-cell-complete-icon')), findsNothing); - expect(find.byKey(Key('grade-cell-incomplete-icon')), findsNothing); - }); -} diff --git a/apps/flutter_parent/test/screens/aup/acceptable_use_policy_screen_test.dart b/apps/flutter_parent/test/screens/aup/acceptable_use_policy_screen_test.dart deleted file mode 100644 index 42c264aec2..0000000000 --- a/apps/flutter_parent/test/screens/aup/acceptable_use_policy_screen_test.dart +++ /dev/null @@ -1,90 +0,0 @@ -// Copyright (C) 2023 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:flutter/material.dart'; -import 'package:flutter_parent/l10n/app_localizations.dart'; -import 'package:flutter_parent/models/terms_of_service.dart'; -import 'package:flutter_parent/models/user.dart'; -import 'package:flutter_parent/screens/aup/acceptable_use_policy_interactor.dart'; -import 'package:flutter_parent/screens/aup/acceptable_use_policy_screen.dart'; -import 'package:flutter_parent/utils/quick_nav.dart'; -import 'package:flutter_test/flutter_test.dart'; -import 'package:mockito/mockito.dart'; - -import '../../utils/test_app.dart'; -import '../../utils/test_helpers/mock_helpers.mocks.dart'; - -void main() { - testWidgets('Submit button disabled when switch is not checked', - (tester) async { - var interactor = MockAcceptableUsePolicyInteractor(); - var nav = MockQuickNav(); - setupTestLocator((locator) { - locator.registerFactory(() => interactor); - locator.registerLazySingleton(() => nav); - }); - - await tester.pumpWidget(TestApp(AcceptableUsePolicyScreen())); - await tester.pump(); - var textButton = tester.widget(find.ancestor( - of: find.text(AppLocalizations().acceptableUsePolicyConfirm), - matching: find.byWidgetPredicate((widget) => widget is TextButton))); - expect(textButton.enabled, isFalse); - }); - - testWidgets('Submit button enabled when switch is checked', (tester) async { - var interactor = MockAcceptableUsePolicyInteractor(); - var nav = MockQuickNav(); - setupTestLocator((locator) { - locator.registerFactory(() => interactor); - locator.registerLazySingleton(() => nav); - }); - - await tester.pumpWidget(TestApp(AcceptableUsePolicyScreen())); - await tester.pump(); - - await tester.tap(find.byWidgetPredicate((widget) => widget is Switch)); - await tester.pumpAndSettle(); - - var textButton = tester.widget(find.ancestor( - of: find.text(AppLocalizations().acceptableUsePolicyConfirm), - matching: find.byWidgetPredicate((widget) => widget is TextButton))); - expect(textButton.enabled, isTrue); - }); - - testWidgets('Submit button navigates to splash screen', (tester) async { - var interactor = MockAcceptableUsePolicyInteractor(); - var nav = MockQuickNav(); - setupTestLocator((locator) { - locator.registerFactory(() => interactor); - locator.registerLazySingleton(() => nav); - }); - - when(interactor.acceptTermsOfUse()).thenAnswer((_) async => User()); - - await tester.pumpWidget(TestApp(AcceptableUsePolicyScreen())); - await tester.pump(); - - await tester.tap(find.byWidgetPredicate((widget) => widget is Switch)); - await tester.pumpAndSettle(); - - await tester.tap(find.ancestor( - of: find.text(AppLocalizations().acceptableUsePolicyConfirm), - matching: find.byWidgetPredicate((widget) => widget is TextButton))); - - await tester.pump(); - - verify(nav.pushRouteAndClearStack(any, '/')); - }); -} \ No newline at end of file diff --git a/apps/flutter_parent/test/screens/calendar/calendar_day_list_tile_test.dart b/apps/flutter_parent/test/screens/calendar/calendar_day_list_tile_test.dart deleted file mode 100644 index 78f3aab73b..0000000000 --- a/apps/flutter_parent/test/screens/calendar/calendar_day_list_tile_test.dart +++ /dev/null @@ -1,427 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'dart:convert'; - -import 'package:built_value/json_object.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_parent/l10n/app_localizations.dart'; -import 'package:flutter_parent/models/plannable.dart'; -import 'package:flutter_parent/models/planner_item.dart'; -import 'package:flutter_parent/models/planner_submission.dart'; -import 'package:flutter_parent/models/serializers.dart'; -import 'package:flutter_parent/models/user.dart'; -import 'package:flutter_parent/network/utils/api_prefs.dart'; -import 'package:flutter_parent/router/panda_router.dart'; -import 'package:flutter_parent/screens/assignments/assignment_details_interactor.dart'; -import 'package:flutter_parent/screens/assignments/assignment_details_screen.dart'; -import 'package:flutter_parent/screens/calendar/calendar_day_list_tile.dart'; -import 'package:flutter_parent/screens/events/event_details_interactor.dart'; -import 'package:flutter_parent/screens/events/event_details_screen.dart'; -import 'package:flutter_parent/utils/design/canvas_icons.dart'; -import 'package:flutter_parent/utils/quick_nav.dart'; -import 'package:flutter_test/flutter_test.dart'; -import 'package:mockito/mockito.dart'; - -import '../../utils/accessibility_utils.dart'; -import '../../utils/platform_config.dart'; -import '../../utils/test_app.dart'; -import '../../utils/test_helpers/mock_helpers.dart'; -import '../../utils/test_helpers/mock_helpers.mocks.dart'; - -void main() { - final studentId = '1337'; - final studentName = 'Instructure Panda'; - - final student = User((b) => b - ..id = studentId - ..name = studentName); - - group('Render', () { - testWidgetsWithAccessibilityChecks('shows title', (tester) async { - var title = 'The Title'; - var plannable = _createPlannable(title: title); - - await tester.pumpWidget(TestApp( - CalendarDayListTile(_createPlannerItem(plannable: plannable)), - )); - await tester.pump(); - - expect(find.text(title), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('shows context name', (tester) async { - var contextName = 'Instructure'; - - await tester.pumpWidget(TestApp( - CalendarDayListTile(_createPlannerItem(contextName: contextName)), - )); - await tester.pump(); - - expect(find.text(contextName), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('shows due date', (tester) async { - var dueDate = 'Due Apr 8 at 11:59 AM'; - var date = DateTime.parse('2020-04-08 11:59:00'); - - await tester.pumpWidget(TestApp( - CalendarDayListTile(_createPlannerItem(plannable: _createPlannable(dueAt: date))), - )); - await tester.pump(); - - expect(find.text(dueDate), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('does not show due date if there is none', (tester) async { - var status = PlannerSubmission(); - var pointsPossible = 10.0; - await tester.pumpWidget(TestApp( - CalendarDayListTile(_createPlannerItem( - plannable: _createPlannable(dueAt: null, pointsPossible: pointsPossible), submission: status)), - )); - await tester.pump(); - - // Shows title, context title, and points possible - var textFinder = find.ancestor(of: find.byType(Text), matching: find.byType(CalendarDayListTile)); - expect(textFinder, findsNWidgets(3)); - }); - - testWidgetsWithAccessibilityChecks('shows points possible on no submission status and points possible is not null', - (tester) async { - var pointsPossible = 10.0; - var submissionStatus = PlannerSubmission(); - await tester.pumpWidget(TestApp( - CalendarDayListTile(_createPlannerItem( - plannable: _createPlannable(pointsPossible: pointsPossible), submission: submissionStatus)), - )); - await tester.pump(); - - expect(find.text(AppLocalizations().assignmentTotalPoints('10')), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('does not show points possible when no status and points possible is null', - (tester) async { - var pointsPossible = null; - await tester.pumpWidget(TestApp( - CalendarDayListTile( - _createPlannerItem(contextName: 'blank', plannable: _createPlannable(pointsPossible: pointsPossible))), - )); - await tester.pump(); - - // Check for a text widget that has the 'pts' substring - expect(find.byWidgetPredicate((widget) { - if (widget is Text) { - final Text textWidget = widget; - if (textWidget.data != null) return textWidget.data!.contains('pts'); - return textWidget.textSpan!.toPlainText().contains('pts'); - } - return false; - }), findsNothing); - }); - - testWidgetsWithAccessibilityChecks('shows \'excused\' status', (tester) async { - var submissionStatus = PlannerSubmission((b) => b.excused = true); - await tester.pumpWidget(TestApp( - CalendarDayListTile(_createPlannerItem(submission: submissionStatus)), - )); - await tester.pump(); - - expect(find.text(AppLocalizations().excused), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('shows \'missing\' status', (tester) async { - var submissionStatus = PlannerSubmission((b) => b.missing = true); - await tester.pumpWidget(TestApp( - CalendarDayListTile(_createPlannerItem(submission: submissionStatus)), - )); - await tester.pump(); - - expect(find.text(AppLocalizations().missing), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('shows \'graded\' status', (tester) async { - var submissionStatus = PlannerSubmission((b) => b.graded = true); - await tester.pumpWidget(TestApp( - CalendarDayListTile(_createPlannerItem(submission: submissionStatus)), - )); - await tester.pump(); - - expect(find.text(AppLocalizations().assignmentGradedLabel), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('shows \'submitted\' status', (tester) async { - var submissionStatus = PlannerSubmission((b) => b.needsGrading = true); - await tester.pumpWidget(TestApp( - CalendarDayListTile(_createPlannerItem(submission: submissionStatus)), - )); - await tester.pump(); - - expect(find.text(AppLocalizations().assignmentSubmittedLabel), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('shows assignment icon for assignments', (tester) async { - var plannerItem = _createPlannerItem(contextName: 'blank', plannableType: 'assignment'); - - await tester.pumpWidget(TestApp( - CalendarDayListTile(plannerItem), - )); - await tester.pump(); - - var icon = tester.widget(find.byType(Icon)); - - expect(icon.icon, CanvasIcons.assignment); - }); - - testWidgetsWithAccessibilityChecks('shows quiz icon for quizzes', (tester) async { - var plannerItem = _createPlannerItem(contextName: 'blank', plannableType: 'quiz'); - - await tester.pumpWidget(TestApp( - CalendarDayListTile(plannerItem), - )); - await tester.pump(); - - var icon = tester.widget(find.byType(Icon)); - - expect(icon.icon, CanvasIcons.quiz); - }); - - testWidgetsWithAccessibilityChecks('shows calendar event icon for calendar events', (tester) async { - var plannerItem = _createPlannerItem(contextName: 'blank', plannableType: 'calendar_event'); - - await tester.pumpWidget(TestApp( - CalendarDayListTile(plannerItem), - )); - await tester.pump(); - - var icon = tester.widget(find.byType(Icon)); - - expect(icon.icon, CanvasIcons.calendar_day); - }); - - /* - testWidgetsWithAccessibilityChecks('shows announcement icon for announcements', (tester) async { - var plannerItem = _createPlannerItem(contextName: 'blank', plannableType: 'announcement'); - - await tester.pumpWidget(TestApp( - CalendarDayListTile(plannerItem), - )); - await tester.pump(); - - var icon = tester.widget(find.byType(Icon)); - - expect(icon.icon, CanvasIcons.announcement); - }); - - testWidgetsWithAccessibilityChecks('shows "Planner Note" as context name for planner notes', (tester) async { - await tester.pumpWidget(TestApp( - CalendarDayListTile(_createPlannerItem(contextName: null, plannableType: 'planner_note')), - )); - await tester.pump(); - - expect(find.text(AppLocalizations().plannerNote), findsOneWidget); - }); - */ - }); - - group('Interaction', () { - testWidgetsWithAccessibilityChecks('tapping assignment plannable navigates to assignment details screen', - (tester) async { - var plannerItem = _createPlannerItem(plannableType: 'assignment', contextName: 'Tap me'); - - setupTestLocator((locator) => locator - ..registerFactory(() => QuickNav()) - ..registerFactory(() => MockAssignmentDetailsInteractor())); - - await tester.pumpWidget(TestApp( - CalendarDayListTile(plannerItem), - platformConfig: PlatformConfig(mockApiPrefs: {ApiPrefs.KEY_CURRENT_STUDENT: json.encode(serialize(student))}), - )); - await tester.pump(); - - await tester.tap(find.text('Tap me')); - await tester.pump(); - await tester.pump(); - - expect(find.byType(AssignmentDetailsScreen), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('tapping quiz assignment plannable navigates to assignment details screen', - (tester) async { - var plannerItem = _createPlannerItem( - plannableType: 'quiz', - contextName: 'Tap me', - plannable: _createPlannable(assignmentId: '123'), - ); - - setupTestLocator((locator) => locator - ..registerFactory(() => QuickNav()) - ..registerFactory(() => MockAssignmentDetailsInteractor())); - - await tester.pumpWidget(TestApp( - CalendarDayListTile(plannerItem), - platformConfig: PlatformConfig(mockApiPrefs: {ApiPrefs.KEY_CURRENT_STUDENT: json.encode(serialize(student))}), - )); - await tester.pump(); - - await tester.tap(find.text('Tap me')); - await tester.pump(); - await tester.pump(); - - expect(find.byType(AssignmentDetailsScreen), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('tapping calendar event plannable navigates to event details screen', - (tester) async { - var plannerItem = _createPlannerItem(plannableType: 'calendar_event', contextName: 'Tap me'); - - setupTestLocator((locator) => locator - ..registerFactory(() => QuickNav()) - ..registerFactory(() => MockEventDetailsInteractor())); - - await tester.pumpWidget(TestApp( - CalendarDayListTile(plannerItem), - platformConfig: PlatformConfig(mockApiPrefs: {ApiPrefs.KEY_CURRENT_STUDENT: json.encode(serialize(student))}), - )); - await tester.pump(); - - await tester.tap(find.text('Tap me')); - await tester.pump(); - await tester.pump(); - - expect(find.byType(EventDetailsScreen), findsOneWidget); - }); - - /* - testWidgetsWithAccessibilityChecks('tapping announcement plannable navigates to announcement details screen', - (tester) async { - var plannerItem = _createPlannerItem(plannableType: 'announcement', contextName: 'Tap me'); - - setupTestLocator((locator) => locator - ..registerFactory(() => QuickNav()) - ..registerFactory(() => _MockAnnouncementDetailsInteractor())); - - await tester.pumpWidget(TestApp( - CalendarDayListTile(plannerItem), - platformConfig: PlatformConfig(mockApiPrefs: {ApiPrefs.KEY_CURRENT_STUDENT: json.encode(serialize(student))}), - )); - await tester.pump(); - - await tester.tap(find.text('Tap me')); - await tester.pump(); - await tester.pump(); - - expect(find.byType(AnnouncementDetailScreen), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('tapping quiz plannable launches mobile browser', (tester) async { - var login = Login((b) => b - ..domain = 'https://test.instructure.com' - ..user = CanvasModelTestUtils.mockUser().toBuilder()); - - final url = 'https://test.instructure.com/courses/1/quizzes/1'; - var plannerItem = _createPlannerItem( - plannableType: 'quiz', - contextName: 'Tap me', - htmlUrl: '/courses/1/quizzes/1', - ); - - final _mockLauncher = _MockUrlLauncher(); - final _mockWebContentInteractor = _MockWebContentInteractor(); - final _analytics = _MockAnalytics(); - - when(_mockLauncher.canLaunch(url)).thenAnswer((_) => Future.value(true)); - when(_mockLauncher.launch(url)).thenAnswer((_) => Future.value(true)); - when(_mockWebContentInteractor.getAuthUrl(url)).thenAnswer((_) => Future.value(url)); - - setupTestLocator((locator) => locator - ..registerFactory(() => QuickNav()) - ..registerLazySingleton(() => _analytics) - ..registerLazySingleton(() => _mockLauncher) - ..registerLazySingleton(() => _mockWebContentInteractor)); - - await tester.pumpWidget(TestApp( - CalendarDayListTile(plannerItem), - platformConfig: PlatformConfig( - initLoggedInUser: login, - mockApiPrefs: { - ApiPrefs.KEY_CURRENT_STUDENT: json.encode(serialize(student)), - }, - ), - )); - await tester.pump(); - - // Tap the quiz widget - await tester.tap(find.text('Tap me')); - await tester.pump(); - - verify(_analytics.logMessage('Attempting to route INTERNAL url: $url')).called(1); - verify(_mockLauncher.launch(url)).called(1); - }); - - testWidgetsWithAccessibilityChecks('tapping discussion plannable navigates to course announcement details screen', - (tester) async { - var plannerItem = _createPlannerItem(plannableType: 'discussion_topic', contextName: 'Tap me'); - - setupTestLocator((locator) => locator - ..registerFactory(() => QuickNav()) - ..registerFactory(() => _MockAnnouncementDetailsInteractor())); - - await tester.pumpWidget(TestApp( - CalendarDayListTile(plannerItem), - platformConfig: PlatformConfig(mockApiPrefs: {ApiPrefs.KEY_CURRENT_STUDENT: json.encode(serialize(student))}), - )); - await tester.pump(); - - await tester.tap(find.text('Tap me')); - await tester.pump(); - await tester.pump(); - - expect(find.byType(AnnouncementDetailScreen), findsOneWidget); - }); - */ - }); -} - -Plannable _createPlannable({String? title, DateTime? dueAt, double? pointsPossible, String? assignmentId}) => - Plannable((b) => b - ..id = '' - ..title = title ?? '' - ..pointsPossible = pointsPossible - ..dueAt = dueAt - ..assignmentId = assignmentId ?? ''); - -PlannerItem _createPlannerItem( - {String? contextName, - Plannable? plannable, - String? plannableType, - PlannerSubmission? submission, - String? htmlUrl}) => - PlannerItem((b) => b - ..courseId = '' - ..plannable = plannable != null ? plannable.toBuilder() : _createPlannable().toBuilder() - ..contextType = '' - ..contextName = contextName - ..plannableType = plannableType ?? 'assignment' - ..plannableDate = DateTime.now() - ..htmlUrl = htmlUrl ?? '' - ..submissionStatus = submission != null ? submission.toBuilder() : null - ..submissionStatusRaw = submission != null ? JsonObject(serialize(submission)) : null); - -/* -class _MockAnnouncementDetailsInteractor extends Mock implements AnnouncementDetailsInteractor {} -class _MockUrlLauncher extends Mock implements UrlLauncher {} -class _MockWebContentInteractor extends Mock implements WebContentInteractor {} -class _MockAnalytics extends Mock implements Analytics {} - */ diff --git a/apps/flutter_parent/test/screens/calendar/calendar_day_planner_test.dart b/apps/flutter_parent/test/screens/calendar/calendar_day_planner_test.dart deleted file mode 100644 index 2b924d82bd..0000000000 --- a/apps/flutter_parent/test/screens/calendar/calendar_day_planner_test.dart +++ /dev/null @@ -1,190 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'dart:async'; - -import 'package:built_collection/built_collection.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_parent/models/course.dart'; -import 'package:flutter_parent/models/enrollment.dart'; -import 'package:flutter_parent/models/schedule_item.dart'; -import 'package:flutter_parent/models/user.dart'; -import 'package:flutter_parent/network/api/calendar_events_api.dart'; -import 'package:flutter_parent/screens/calendar/calendar_day_planner.dart'; -import 'package:flutter_parent/screens/calendar/planner_fetcher.dart'; -import 'package:flutter_parent/screens/courses/courses_interactor.dart'; -import 'package:flutter_parent/utils/common_widgets/empty_panda_widget.dart'; -import 'package:flutter_parent/utils/common_widgets/error_panda_widget.dart'; -import 'package:flutter_parent/utils/common_widgets/loading_indicator.dart'; -import 'package:flutter_parent/utils/db/calendar_filter_db.dart'; -import 'package:flutter_test/flutter_test.dart'; -import 'package:mockito/mockito.dart'; -import 'package:provider/provider.dart'; - -import '../../utils/accessibility_utils.dart'; -import '../../utils/canvas_model_utils.dart'; -import '../../utils/test_app.dart'; -import '../../utils/test_helpers/mock_helpers.dart'; -import '../../utils/test_helpers/mock_helpers.mocks.dart'; -import '../courses/course_summary_screen_test.dart'; - -void main() { - var fetcher; - - final User student = CanvasModelTestUtils.mockUser(name: 'Panda'); - final String courseName = 'hodor'; - final course = Course((b) => b - ..id = '123' - ..name = courseName - ..enrollments = BuiltList.of([ - Enrollment((enrollment) => enrollment - ..userId = '123' - ..courseId = '123' - ..enrollmentState = 'active') - ]).toBuilder()); - - final MockCalendarEventsApi api = MockCalendarEventsApi(); - final MockCoursesInteractor interactor = MockCoursesInteractor(); - - setupTestLocator((locator) { - locator.registerLazySingleton(() => api); - locator.registerLazySingleton(() => MockCalendarFilterDb()); - locator.registerFactory(() => interactor); - }); - - setUp(() { - reset(api); - fetcher = PlannerFetcher(userId: '', userDomain: '', observeeId: student.id); - when(interactor.getCourses(isRefresh: anyNamed('isRefresh'))).thenAnswer((_) => Future.value(List.of([course]))); - }); - - group('Render', () { - testWidgetsWithAccessibilityChecks('shows loading indicator when loading', (tester) async { - await tester.pumpWidget(TestApp( - ChangeNotifierProvider( - create: (_) => fetcher, - child: CalendarDayPlanner(DateTime.now()), - ), - )); - await tester.pump(); - - expect(find.byType(LoadingIndicator), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('shows calendar day planner list', (tester) async { - when(api.getUserCalendarItems(any, any, any, ScheduleItem.apiTypeAssignment, - contexts: anyNamed('contexts'), forceRefresh: anyNamed('forceRefresh'))) - .thenAnswer((_) => Future.value([_createScheduleItem(contextName: courseName)])); - - when(api.getUserCalendarItems(any, any, any, ScheduleItem.apiTypeCalendar, - contexts: anyNamed('contexts'), forceRefresh: anyNamed('forceRefresh'))) - .thenAnswer((_) => Future.value([])); - - await tester.pumpWidget(TestApp( - ChangeNotifierProvider( - create: (_) => fetcher, - child: CalendarDayPlanner(DateTime.now()), - ), - )); - await tester.pump(); - await tester.pump(); - - expect(find.byType(CalendarDayList), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('shows error panda view when we fail to retrieve events', (tester) async { - Completer> completer = Completer>(); - when(api.getUserCalendarItems(any, any, any, ScheduleItem.apiTypeAssignment, - contexts: anyNamed('contexts'), forceRefresh: anyNamed('forceRefresh'))) - .thenAnswer((_) => completer.future); - - when(api.getUserCalendarItems(any, any, any, ScheduleItem.apiTypeCalendar, - contexts: anyNamed('contexts'), forceRefresh: anyNamed('forceRefresh'))) - .thenAnswer((_) => Future.value([])); - - await tester.pumpWidget(TestApp( - ChangeNotifierProvider( - create: (_) => fetcher, - child: CalendarDayPlanner(DateTime.now()), - ), - )); - await tester.pump(); - await tester.pump(); - - completer.completeError('Error'); - await tester.pumpAndSettle(); - - expect(find.byType(ErrorPandaWidget), findsOneWidget); - expect(find.text(l10n.errorLoadingEvents), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('shows empty panda view when we have no events', (tester) async { - when(api.getUserCalendarItems(any, any, any, any, - contexts: anyNamed('contexts'), forceRefresh: anyNamed('forceRefresh'))) - .thenAnswer((_) => Future.value([])); - - await tester.pumpWidget(TestApp( - ChangeNotifierProvider( - create: (_) => fetcher, - child: CalendarDayPlanner(DateTime.now()), - ), - )); - - await tester.pumpAndSettle(); - - expect(find.byType(EmptyPandaWidget), findsOneWidget); - }); - }); - - group('Interaction', () { - testWidgetsWithAccessibilityChecks('pull to refresh refreshes list', (tester) async { - when(api.getUserCalendarItems(any, any, any, any, - contexts: anyNamed('contexts'), forceRefresh: anyNamed('forceRefresh'))) - .thenAnswer((_) async => []); - - await tester.pumpWidget(TestApp( - ChangeNotifierProvider( - create: (_) => fetcher, - child: CalendarDayPlanner(DateTime.now()), - ), - )); - await tester.pumpAndSettle(); - - // Empty state - expect(find.byType(CalendarDayList), findsNothing); - expect(find.byType(EmptyPandaWidget), findsOneWidget); - - when(api.getUserCalendarItems(any, any, any, ScheduleItem.apiTypeAssignment, - contexts: anyNamed('contexts'), forceRefresh: anyNamed('forceRefresh'))) - .thenAnswer((_) async => [_createScheduleItem(contextName: courseName)]); - - // PTR - await tester.drag(find.byType(RefreshIndicator), Offset(0, 300)); - await tester.pumpAndSettle(); - - // Should now show list - expect(find.byType(EmptyPandaWidget), findsNothing); - expect(find.byType(CalendarDayList), findsOneWidget); - }); - }); -} - -ScheduleItem _createScheduleItem({String? contextName, String type = ScheduleItem.apiTypeAssignment}) => - ScheduleItem((b) => b - ..id = '' - ..title = '' - ..contextCode = 'course_123' - ..type = type - ..htmlUrl = '' - ..startAt = DateTime.now()); diff --git a/apps/flutter_parent/test/screens/calendar/calendar_screen_test.dart b/apps/flutter_parent/test/screens/calendar/calendar_screen_test.dart deleted file mode 100644 index 95401597de..0000000000 --- a/apps/flutter_parent/test/screens/calendar/calendar_screen_test.dart +++ /dev/null @@ -1,413 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'dart:async'; -import 'dart:convert'; - -import 'package:built_collection/built_collection.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_parent/l10n/app_localizations.dart'; -import 'package:flutter_parent/models/calendar_filter.dart'; -import 'package:flutter_parent/models/course.dart'; -import 'package:flutter_parent/models/enrollment.dart'; -import 'package:flutter_parent/models/login.dart'; -import 'package:flutter_parent/models/serializers.dart'; -import 'package:flutter_parent/models/user.dart'; -import 'package:flutter_parent/network/api/calendar_events_api.dart'; -import 'package:flutter_parent/network/utils/api_prefs.dart'; -import 'package:flutter_parent/screens/calendar/calendar_screen.dart'; -import 'package:flutter_parent/screens/calendar/calendar_today_click_notifier.dart'; -import 'package:flutter_parent/screens/calendar/calendar_today_notifier.dart'; -import 'package:flutter_parent/screens/calendar/calendar_widget/calendar_filter_screen/calendar_filter_list_interactor.dart'; -import 'package:flutter_parent/screens/calendar/calendar_widget/calendar_filter_screen/calendar_filter_list_screen.dart'; -import 'package:flutter_parent/screens/calendar/calendar_widget/calendar_widget.dart'; -import 'package:flutter_parent/screens/courses/courses_interactor.dart'; -import 'package:flutter_parent/screens/dashboard/selected_student_notifier.dart'; -import 'package:flutter_parent/utils/db/calendar_filter_db.dart'; -import 'package:flutter_parent/utils/quick_nav.dart'; -import 'package:flutter_test/flutter_test.dart'; -import 'package:mockito/mockito.dart'; -import 'package:provider/provider.dart'; - -import '../../utils/accessibility_utils.dart'; -import '../../utils/canvas_model_utils.dart'; -import '../../utils/platform_config.dart'; -import '../../utils/test_app.dart'; -import '../../utils/test_helpers/mock_helpers.dart'; -import '../../utils/test_helpers/mock_helpers.mocks.dart'; - -void main() { - MockCalendarEventsApi calendarApi = MockCalendarEventsApi(); - MockCalendarFilterDb filterDb = MockCalendarFilterDb(); - MockCalendarFilterListInteractor filterInteractor = MockCalendarFilterListInteractor(); - MockCoursesInteractor coursesInteractor = MockCoursesInteractor(); - - when(filterDb.getByObserveeId(any, any, any)) - .thenAnswer((_) => Future.value(CalendarFilter((b) => b.filters = SetBuilder({'course_123'})))); - - final String userDomain = 'user_domain'; - final String userId = 'user_123'; - final String observeeId = 'observee_123'; - final Set contexts = {'course_123'}; - - setupTestLocator((locator) { - locator.registerLazySingleton(() => filterDb); - locator.registerLazySingleton(() => filterInteractor); - locator.registerLazySingleton(() => coursesInteractor); - locator.registerLazySingleton(() => CalendarTodayClickNotifier()); - locator.registerLazySingleton(() => CalendarTodayNotifier()); - locator.registerLazySingleton(() => calendarApi); - locator.registerLazySingleton(() => QuickNav()); - }); - - setUp(() { - reset(calendarApi); - - // Reset db mock - reset(filterDb); - when(filterDb.getByObserveeId(any, any, any)).thenAnswer((_) async { - return CalendarFilter((b) => b - ..userDomain = userDomain - ..userId = userId - ..observeeId = observeeId - ..filters = SetBuilder(contexts)); - }); - - when(coursesInteractor.getCourses(isRefresh: anyNamed('isRefresh'))) - .thenAnswer((_) => Future.value(_mockCourses())); - }); - - tearDown(() { - ApiPrefs.clean(); - }); - - group('Render', () { - testWidgetsWithAccessibilityChecks('shows the calendar widget', (tester) async { - await tester.pumpWidget(_testableMaterialWidget()); - await tester.pumpAndSettle(Duration(seconds: 1)); // Wait for the timers in the calendar day widgets - - when(calendarApi.getUserCalendarItems(any, any, any, any, - contexts: anyNamed('contexts'), forceRefresh: anyNamed('forceRefresh'))) - .thenAnswer((_) => Future.value([])); - - expect(find.byType(CalendarWidget), findsOneWidget); - }); - }); - - group('Interaction', () { - testWidgetsWithAccessibilityChecks('clicking on filter navigates to filter screen', (tester) async { - await tester.pumpWidget(_testableMaterialWidget()); - await tester.pumpAndSettle(Duration(seconds: 1)); // Wait for the timers in the calendar day widgets - - when(calendarApi.getUserCalendarItems(any, any, any, any, - contexts: anyNamed('contexts'), forceRefresh: anyNamed('forceRefresh'))) - .thenAnswer((_) => Future.value([])); - - when(filterInteractor.getCoursesForSelectedStudent(isRefresh: anyNamed('isRefresh'))) - .thenAnswer((_) => Future.value(_mockCourses())); - - // Tap on the calendar filter button - await tester.tap(find.text(AppLocalizations().calendars)); - await tester.pump(); - await tester.pump(); - await tester.pumpAndSettle(); - - // Check for the filter screen - expect(find.byType(CalendarFilterListScreen), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('filter screen returns updated contexts', (tester) async { - var completer = Completer>(); - - final observer = MockNavigatorObserver(); - - when(filterInteractor.getCoursesForSelectedStudent(isRefresh: anyNamed('isRefresh'))) - .thenAnswer((_) => completer.future); - - await tester.pumpWidget(_testableMaterialWidget(observer: observer)); - await tester.pumpAndSettle(Duration(seconds: 1)); // Wait for the timers in the calendar day widgets - - when(calendarApi.getUserCalendarItems(any, any, any, any, - contexts: anyNamed('contexts'), forceRefresh: anyNamed('forceRefresh'))) - .thenAnswer((_) => Future.value([])); - - // Tap on the calendar filter button - await tester.tap(find.text(AppLocalizations().calendars)); - await tester.pump(); - await tester.pump(); - - // Setup the capture of navigation arguments - Route pushedRoute = verify(observer.didPush(captureAny, any)).captured[1]; - Set result = {}; - pushedRoute.popped.then((value) { - result = value; - }); - - completer.complete(Future.value(_mockCourses())); - await tester.pumpAndSettle(); - - // Check for the filter screen - expect(find.byType(CalendarFilterListScreen), findsOneWidget); - - // Tap on a context item - await tester.tap(find.text('Course2')); - await tester.pumpAndSettle(); - - // Tap on the back button - await tester.pageBack(); - await tester.pumpAndSettle(Duration(seconds: 1)); - - // Verify that the list of selected items was updated correctly - expect(result, ['course_123', 'course_234']); - }); - - testWidgetsWithAccessibilityChecks('planner updated if user filtered different contexts', (tester) async { - var completer = Completer>(); - - final observer = MockNavigatorObserver(); - - when(filterInteractor.getCoursesForSelectedStudent(isRefresh: anyNamed('isRefresh'))) - .thenAnswer((_) => completer.future); - - await tester.pumpWidget(_testableMaterialWidget(observer: observer)); - await tester.pumpAndSettle(Duration(seconds: 1)); // Wait for the timers in the calendar day widgets - - when(calendarApi.getUserCalendarItems(any, any, any, any, - contexts: anyNamed('contexts'), forceRefresh: anyNamed('forceRefresh'))) - .thenAnswer((_) => Future.value([])); - - // Tap on the calendar filter button - await tester.tap(find.text(AppLocalizations().calendars)); - await tester.pump(); - await tester.pump(); - - // Setup the capture of navigation arguments - Route pushedRoute = verify(observer.didPush(captureAny, any)).captured[1]; - Set result = {}; - pushedRoute.popped.then((value) { - result = value; - }); - - completer.complete(Future.value(_mockCourses())); - await tester.pumpAndSettle(); - - // Check for the filter screen - expect(find.byType(CalendarFilterListScreen), findsOneWidget); - - // Tap on a context item - await tester.tap(find.text('Course2')); - await tester.pumpAndSettle(); - - // Tap on the back button - await tester.pageBack(); - await tester.pumpAndSettle(Duration(seconds: 1)); - - // Verify that the list of selected items was updated correctly - expect(result, ['course_123', 'course_234']); - verify(filterDb.insertOrUpdate(any)).called(1); - }); - - testWidgetsWithAccessibilityChecks('planner not updated if user did not change filtered contexts', (tester) async { - var completer = Completer>(); - - final observer = MockNavigatorObserver(); - - when(filterInteractor.getCoursesForSelectedStudent(isRefresh: anyNamed('isRefresh'))) - .thenAnswer((_) => completer.future); - - await tester.pumpWidget(_testableMaterialWidget(observer: observer)); - await tester.pumpAndSettle(Duration(seconds: 1)); // Wait for the timers in the calendar day widgets - - when(calendarApi.getUserCalendarItems(any, any, any, any, - contexts: anyNamed('contexts'), forceRefresh: anyNamed('forceRefresh'))) - .thenAnswer((_) => Future.value([])); - - // Tap on the calendar filter button - await tester.tap(find.text(AppLocalizations().calendars)); - await tester.pump(); - await tester.pump(); - - // Setup the capture of navigation arguments - Route pushedRoute = verify(observer.didPush(captureAny, any)).captured[1]; - Set result = {}; - pushedRoute.popped.then((value) { - result = value; - }); - - completer.complete(Future.value(_mockCourses())); - await tester.pumpAndSettle(); - - // Check for the filter screen - expect(find.byType(CalendarFilterListScreen), findsOneWidget); - - // Tap on the back button - await tester.pageBack(); - await tester.pumpAndSettle(Duration(seconds: 1)); - - // Verify that the list of selected items was updated correctly - expect(result, ['course_123']); - verifyNever(filterDb.insertOrUpdate(any)); - }); - }); - - /* - testWidgetsWithAccessibilityChecks('filter returns empty list if all items selected', (tester) async { - var completer = Completer>(); - - final observer = _MockNavigatorObserver(); - - when(filterInteractor.getCoursesForSelectedStudent(isRefresh: anyNamed('isRefresh'))) - .thenAnswer((_) => completer.future); - - await tester.pumpWidget(_testableMaterialWidget(observer: observer)); - await tester.pumpAndSettle(Duration(seconds: 1)); // Wait for the timers in the calendar day widgets - - when(calendarApi.getUserCalendarItems(any, any, any, any, - contexts: anyNamed('contexts'), forceRefresh: anyNamed('forceRefresh'))) - .thenAnswer((_) => Future.value([])); - - // Tap on the calendar filter button - await tester.tap(find.text(AppLocalizations().calendars)); - await tester.pump(); - await tester.pump(); - - // Setup the capture of navigation arguments - Route pushedRoute = verify(observer.didPush(captureAny, any)).captured[1]; - Set result = {}; - pushedRoute.popped.then((value) { - result = value; - }); - - completer.complete(Future.value(_mockCourses())); - await tester.pumpAndSettle(); - - // Check for the filter screen - expect(find.byType(CalendarFilterListScreen), findsOneWidget); - - // Tap on unselected context items - await tester.tap(find.text('Course2')); - await tester.tap(find.text('Course3')); - await tester.pumpAndSettle(); - - // Tap on the back button - await tester.pageBack(); - await tester.pumpAndSettle(Duration(seconds: 1)); - - // Verify that the list of selected items was updated correctly - expect(result, []); - }); - */ -} - -Widget _testableMaterialWidget({Widget? widget, SelectedStudentNotifier? notifier = null, NavigatorObserver? observer}) { - var login = Login((b) => b - ..uuid = 'uuid' - ..domain = 'domain' - ..accessToken = 'token' - ..user = CanvasModelTestUtils.mockUser().toBuilder()); - - return TestApp( - ChangeNotifierProvider( - create: (context) => notifier ?? SelectedStudentNotifier() - ..value = _mockStudent('1'), - child: Consumer( - builder: (context, model, _) { - return Scaffold(body: widget ?? CalendarScreen()); - }, - ), - ), - darkMode: true, - navigatorObservers: observer != null ? [observer] : [], - platformConfig: PlatformConfig( - initLoggedInUser: login, - mockApiPrefs: {ApiPrefs.KEY_CURRENT_STUDENT: json.encode(serialize(_mockStudent('123')))}, - ), - ); -} - -User _mockStudent(String userId) => User((b) => b - ..id = userId - ..name = 'UserName' - ..sortableName = 'Sortable Name' - ..build()); - -final _enrollment = Enrollment((b) => b - ..enrollmentState = 'active' - ..userId = '123'); - -List _mockCourses() { - return [ - Course((b) => b - ..id = '123' - ..enrollments = ListBuilder([_enrollment]) - ..name = 'Course1'), - Course((b) => b - ..id = '234' - ..enrollments = ListBuilder([_enrollment]) - ..name = 'Course2'), - Course((b) => b - ..id = '345' - ..enrollments = ListBuilder([_enrollment]) - ..name = 'Course3') - ]; -} - -List _mockCoursesBigList() { - return [ - Course((b) => b - ..id = '123' - ..enrollments = ListBuilder([_enrollment]) - ..name = 'Course1'), - Course((b) => b - ..id = '234' - ..enrollments = ListBuilder([_enrollment]) - ..name = 'Course2'), - Course((b) => b - ..id = '345' - ..enrollments = ListBuilder([_enrollment]) - ..name = 'Course3'), - Course((b) => b - ..id = '678' - ..enrollments = ListBuilder([_enrollment]) - ..name = 'Course3'), - Course((b) => b - ..id = '678' - ..enrollments = ListBuilder([_enrollment]) - ..name = 'Course3'), - Course((b) => b - ..id = '1234' - ..enrollments = ListBuilder([_enrollment]) - ..name = 'Course3'), - Course((b) => b - ..id = '2345' - ..enrollments = ListBuilder([_enrollment]) - ..name = 'Course3'), - Course((b) => b - ..id = '3456' - ..enrollments = ListBuilder([_enrollment]) - ..name = 'Course3'), - Course((b) => b - ..id = '4567' - ..enrollments = ListBuilder([_enrollment]) - ..name = 'Course3'), - Course((b) => b - ..id = '5678' - ..enrollments = ListBuilder([_enrollment]) - ..name = 'Course3'), - Course((b) => b - ..id = '6789' - ..enrollments = ListBuilder([_enrollment]) - ..name = 'Course3'), - ]; -} diff --git a/apps/flutter_parent/test/screens/calendar/calendar_widget/calendar_day_of_week_headers_test.dart b/apps/flutter_parent/test/screens/calendar/calendar_widget/calendar_day_of_week_headers_test.dart deleted file mode 100644 index 24ef664b03..0000000000 --- a/apps/flutter_parent/test/screens/calendar/calendar_widget/calendar_day_of_week_headers_test.dart +++ /dev/null @@ -1,176 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:flutter/material.dart'; -import 'package:flutter_parent/screens/calendar/calendar_widget/calendar_day_of_week_headers.dart'; -import 'package:flutter_parent/utils/design/parent_colors.dart'; -import 'package:flutter_test/flutter_test.dart'; - -import '../../../utils/accessibility_utils.dart'; -import '../../../utils/test_app.dart'; - -void main() { - testWidgetsWithAccessibilityChecks('Displays correctly for US locale', (tester) async { - // Day names, in expected display order - final allDays = [ - find.text('Sun'), - find.text('Mon'), - find.text('Tue'), - find.text('Wed'), - find.text('Thu'), - find.text('Fri'), - find.text('Sat'), - ]; - - // Weekdays - final weekdays = [ - find.text('Mon'), - find.text('Tue'), - find.text('Wed'), - find.text('Thu'), - find.text('Fri'), - ]; - - // Weekend days - final weekends = [ - find.text('Sun'), - find.text('Sat'), - ]; - - await tester.pumpWidget(TestApp(DayOfWeekHeaders())); - await tester.pump(); - - // Confirm all weekday names are displayed - allDays.forEach((it) => expect(it, findsOneWidget)); - - // Confirm names are displayed in order - for (int i = 1; i < allDays.length; i++) { - expect(tester.getTopLeft(allDays[i - 1]).dx, lessThan(tester.getTopLeft(allDays[i]).dx)); - } - - // Week days should use dark text - weekdays.forEach((day) { - final textColor = tester.widget(day).style!.color; - expect(textColor, ParentColors.licorice); - }); - - // weekends should use faded text - weekends.forEach((day) { - final textColor = tester.widget(day).style!.color; - expect(textColor, ParentColors.oxford); - }); - }); - - testWidgetsWithAccessibilityChecks('Displays correctly for German locale', (tester) async { - // Weekday names in expected display order - final allDays = [ - find.text('Mo'), - find.text('Di'), - find.text('Mi'), - find.text('Do'), - find.text('Fr'), - find.text('Sa'), - find.text('So'), - ]; - - // Weekdays - final weekdays = [ - find.text('Mo'), - find.text('Di'), - find.text('Mi'), - find.text('Do'), - find.text('Fr'), - ]; - - // Weekend days - final weekends = [ - find.text('Sa'), - find.text('So'), - ]; - - await tester.pumpWidget(TestApp(DayOfWeekHeaders(), locale: Locale('de'))); - await tester.pump(); - - // Confirm all weekday names are displayed - allDays.forEach((it) => expect(it, findsOneWidget)); - - // Confirm names are displayed in order - for (int i = 1; i < allDays.length; i++) { - expect(tester.getTopLeft(allDays[i - 1]).dx, lessThan(tester.getTopLeft(allDays[i]).dx)); - } - - // Week days should use dark text - weekdays.forEach((day) { - final textColor = tester.widget(day).style!.color; - expect(textColor, ParentColors.licorice); - }); - - // weekends should use faded text - weekends.forEach((day) { - final textColor = tester.widget(day).style!.color; - expect(textColor, ParentColors.oxford); - }); - }); - - testWidgetsWithAccessibilityChecks('Displays correctly for Arabic locale - RTL', (tester) async { - // Weekday names in expected display order (RTL) - final allDays = [ - find.text('الجمعة'), - find.text('الخميس'), - find.text('الأربعاء'), - find.text('الثلاثاء'), - find.text('الاثنين'), - find.text('الأحد'), - find.text('السبت'), - ]; - - // Weekdays - final weekdays = [ - find.text('الخميس'), - find.text('الأربعاء'), - find.text('الثلاثاء'), - find.text('الاثنين'), - find.text('الأحد'), - ]; - - // Weekend days - final weekends = [ - find.text('الجمعة'), - find.text('السبت'), - ]; - - await tester.pumpWidget(TestApp(DayOfWeekHeaders(), locale: Locale('ar'))); - await tester.pump(); - - // Confirm all weekday names are displayed - allDays.forEach((it) => expect(it, findsOneWidget)); - - // Confirm names are displayed in order - for (int i = 1; i < allDays.length; i++) { - expect(tester.getTopLeft(allDays[i - 1]).dx, lessThan(tester.getTopLeft(allDays[i]).dx)); - } - - // Week days should use dark text - weekdays.forEach((day) { - final textColor = tester.widget(day).style!.color; - expect(textColor, ParentColors.licorice); - }); - - // weekends should use faded text - weekends.forEach((day) { - final textColor = tester.widget(day).style!.color; - expect(textColor, ParentColors.oxford); - }); - }); -} diff --git a/apps/flutter_parent/test/screens/calendar/calendar_widget/calendar_day_test.dart b/apps/flutter_parent/test/screens/calendar/calendar_widget/calendar_day_test.dart deleted file mode 100644 index 550eaeb124..0000000000 --- a/apps/flutter_parent/test/screens/calendar/calendar_widget/calendar_day_test.dart +++ /dev/null @@ -1,226 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:flutter/material.dart'; -import 'package:flutter_parent/models/plannable.dart'; -import 'package:flutter_parent/models/planner_item.dart'; -import 'package:flutter_parent/screens/calendar/calendar_widget/calendar_day.dart'; -import 'package:flutter_parent/screens/calendar/planner_fetcher.dart'; -import 'package:flutter_parent/utils/design/parent_colors.dart'; -import 'package:flutter_test/flutter_test.dart'; -import 'package:provider/provider.dart'; - -import '../../../utils/accessibility_utils.dart'; -import '../../../utils/test_app.dart'; - -void main() { - DateTime dayDate = DateTime(2000); // Jan 1 2000 - DateTime selectedDate = dayDate.add(Duration(days: 1)); // Jan 2 2000 - - testWidgetsWithAccessibilityChecks('Displays day of month', (tester) async { - await tester.pumpWidget(_appWithFetcher(CalendarDay( - date: dayDate, - selectedDay: selectedDate, - onDaySelected: (_) {}, - ))); - await tester.pumpAndSettle(); - - expect(find.text('1'), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('Sets a11y description', (tester) async { - await tester.pumpWidget(_appWithFetcher(CalendarDay( - date: dayDate, - selectedDay: selectedDate, - onDaySelected: (_) {}, - ))); - await tester.pump(); - - expect(find.bySemanticsLabel('Saturday, January 1, 0 events'), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('Uses dark text color for week days', (tester) async { - final date = DateTime(2000, 1, 3); // Jan 3 2000, a Monday - await tester.pumpWidget(_appWithFetcher(CalendarDay( - date: date, // Jan 3 - selectedDay: selectedDate, - onDaySelected: (_) {}, - ))); - await tester.pump(); - - final textStyle = tester.widget(find.byType(AnimatedDefaultTextStyle).last).style; - expect(textStyle.color, ParentColors.licorice); - }); - - testWidgetsWithAccessibilityChecks('Uses faded text color for weekends', (tester) async { - await tester.pumpWidget(_appWithFetcher(CalendarDay( - date: dayDate, // Jan 1 2000, a Saturday - selectedDay: selectedDate, - onDaySelected: (_) {}, - ))); - await tester.pump(); - - final textStyle = tester.widget(find.byType(AnimatedDefaultTextStyle).last).style; - expect(textStyle.color, ParentColors.ash); - }); - - testWidgetsWithAccessibilityChecks('Uses faded text color for week days if month is not selected', (tester) async { - await tester.pumpWidget(_appWithFetcher(CalendarDay( - date: DateTime(1999, 12, 31), // Dec 31 1999, a Friday - selectedDay: selectedDate, // Jan 2 2000 - onDaySelected: (_) {}, - ))); - await tester.pump(); - - final textStyle = tester.widget(find.byType(AnimatedDefaultTextStyle).last).style; - expect(textStyle.color, ParentColors.ash); - }); - - testWidgetsWithAccessibilityChecks('Uses no decoration if day is not selected and is not today', (tester) async { - await tester.pumpWidget(_appWithFetcher(CalendarDay( - date: dayDate, - selectedDay: selectedDate, - onDaySelected: (_) {}, - ))); - await tester.pump(); - - final container = find.ancestor(of: find.text('1'), matching: find.byType(Container)).first; - expect(tester.widget(container).decoration, isNull); - }); - - testWidgetsWithAccessibilityChecks('Uses accent text color and accent border for selected day', (tester) async { - await tester.pumpWidget(_appWithFetcher(CalendarDay( - date: selectedDate, - selectedDay: selectedDate, - onDaySelected: (_) {}, - ))); - await tester.pump(); - - final theme = Theme.of(tester.element(find.byType(CalendarDay))); - final textStyle = tester.widget(find.byType(AnimatedDefaultTextStyle).last).style; - expect(textStyle.color, theme.colorScheme.secondary); - - final container = find.ancestor(of: find.text('2'), matching: find.byType(Container)).first; - final decoration = tester.widget(container).decoration as BoxDecoration; - expect(decoration.borderRadius, BorderRadius.circular(16)); - expect(decoration.border, Border.all(color: theme.colorScheme.secondary, width: 2)); - }); - - testWidgetsWithAccessibilityChecks('Uses white text color and accent background for today', (tester) async { - final date = DateTime.now(); - await tester.pumpWidget(_appWithFetcher(CalendarDay( - date: date, - selectedDay: selectedDate, - onDaySelected: (_) {}, - ))); - await tester.pump(); - - final theme = Theme.of(tester.element(find.byType(CalendarDay))); - final textStyle = tester.widget(find.byType(AnimatedDefaultTextStyle).last).style; - expect(textStyle.color, Colors.white); - - final container = find.ancestor(of: find.text(date.day.toString()), matching: find.byType(Container)).first; - final decoration = tester.widget(container).decoration; - expect(decoration, BoxDecoration(color: theme.colorScheme.secondary, shape: BoxShape.circle)); - }); - - testWidgetsWithAccessibilityChecks('Displays activity dots', (tester) async { - final fetcher = _FakeFetcher( - observeeId: '', - userDomain: '', - userId: '', - ); - fetcher.nextSnapshot = AsyncSnapshot>.withData(ConnectionState.done, [ - _createPlannerItem(contextName: 'blank'), - _createPlannerItem(contextName: 'blank'), - _createPlannerItem(contextName: 'blank'), - ]); - await tester.pumpWidget( - _appWithFetcher( - CalendarDay( - date: dayDate, - selectedDay: selectedDate, - onDaySelected: (_) {}, - ), - fetcher: fetcher, - ), - ); - await tester.pump(); - - // Should show three dots - var activityDots = find.descendant(of: find.byType(Row), matching: find.byType(Container)).evaluate(); - expect(activityDots.length, 3); - - // Reset count and rebuild - fetcher.nextSnapshot = AsyncSnapshot>.withData(ConnectionState.done, []); - fetcher.reset(); - await tester.pumpAndSettle(); - - // Should not show any dots - activityDots = find.descendant(of: find.byType(Row), matching: find.byType(Container)).evaluate(); - expect(activityDots.length, 0); - }); - - testWidgetsWithAccessibilityChecks('Invokes onDaySelectedCallback', (tester) async { - DateTime? selection = null; - await tester.pumpWidget(_appWithFetcher(CalendarDay( - date: dayDate, - selectedDay: selectedDate, - onDaySelected: (day) { - selection = day; - }, - ))); - await tester.pump(); - - await tester.tap(find.byType(CalendarDay)); - await tester.pump(); - - expect(selection, dayDate); - }); -} - -Widget _appWithFetcher(Widget child, {PlannerFetcher? fetcher}) { - return TestApp( - ChangeNotifierProvider( - create: (BuildContext context) => fetcher ?? _FakeFetcher( - observeeId: '', - userDomain: '', - userId: '', - ), - child: child, - ), - ); -} - -class _FakeFetcher extends PlannerFetcher { - AsyncSnapshot> nextSnapshot = AsyncSnapshot>.withData(ConnectionState.done, []); - - _FakeFetcher({required super.observeeId, required super.userDomain, required super.userId}); - - @override - AsyncSnapshot> getSnapshotForDate(DateTime date) => nextSnapshot; -} - -Plannable _createPlannable() => Plannable((b) => b - ..id = '' - ..title = ''); - -PlannerItem _createPlannerItem({String? contextName}) => PlannerItem((b) => b - ..courseId = '' - ..plannable = _createPlannable().toBuilder() - ..contextType = '' - ..plannableDate = DateTime.now() - ..contextName = contextName ?? '' - ..htmlUrl = '' - ..plannableType = 'assignment'); diff --git a/apps/flutter_parent/test/screens/calendar/calendar_widget/calendar_filter_list_interactor_test.dart b/apps/flutter_parent/test/screens/calendar/calendar_widget/calendar_filter_list_interactor_test.dart deleted file mode 100644 index 358d1c4a9b..0000000000 --- a/apps/flutter_parent/test/screens/calendar/calendar_widget/calendar_filter_list_interactor_test.dart +++ /dev/null @@ -1,74 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'dart:convert'; - -import 'package:built_collection/built_collection.dart'; -import 'package:flutter_parent/models/course.dart'; -import 'package:flutter_parent/models/enrollment.dart'; -import 'package:flutter_parent/models/serializers.dart'; -import 'package:flutter_parent/network/api/course_api.dart'; -import 'package:flutter_parent/network/utils/api_prefs.dart'; -import 'package:flutter_parent/screens/calendar/calendar_widget/calendar_filter_screen/calendar_filter_list_interactor.dart'; -import 'package:mockito/mockito.dart'; -import 'package:test/test.dart'; - -import '../../../utils/canvas_model_utils.dart'; -import '../../../utils/platform_config.dart'; -import '../../../utils/test_app.dart'; -import '../../../utils/test_helpers/mock_helpers.dart'; -import '../../../utils/test_helpers/mock_helpers.mocks.dart'; - -void main() { - final _api = MockCourseApi(); - final _user = CanvasModelTestUtils.mockUser(id: '123'); - - setupTestLocator((locator) { - locator.registerLazySingleton(() => _api); - }); - - setUp(() async { - reset(_api); - await setupPlatformChannels( - config: PlatformConfig(mockApiPrefs: {ApiPrefs.KEY_CURRENT_STUDENT: json.encode(serialize(_user))})); - }); - - test('getCourses calls API', () async { - when(_api.getObserveeCourses(forceRefresh: true)).thenAnswer((_) async => []); - - await CalendarFilterListInteractor().getCoursesForSelectedStudent(isRefresh: true); - - verify(_api.getObserveeCourses(forceRefresh: true)); - }); - - test('getCourses filters by student enrollment', () async { - final apiCourses = [ - Course(), - Course((c) => c - ..enrollments = ListBuilder([ - Enrollment((e) => e - ..userId = _user.id - ..enrollmentState = '') - ])), - Course(), - ]; - final expectedCourses = [apiCourses[1]]; - - when(_api.getObserveeCourses(forceRefresh: true)).thenAnswer((_) async => apiCourses); - - final actualCourses = await CalendarFilterListInteractor().getCoursesForSelectedStudent(isRefresh: true); - - expect(actualCourses, expectedCourses); - }); -} diff --git a/apps/flutter_parent/test/screens/calendar/calendar_widget/calendar_filter_list_screen_test.dart b/apps/flutter_parent/test/screens/calendar/calendar_widget/calendar_filter_list_screen_test.dart deleted file mode 100644 index 5ae455a666..0000000000 --- a/apps/flutter_parent/test/screens/calendar/calendar_widget/calendar_filter_list_screen_test.dart +++ /dev/null @@ -1,430 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'dart:async'; - -import 'package:flutter/material.dart'; -import 'package:flutter_parent/l10n/app_localizations.dart'; -import 'package:flutter_parent/models/course.dart'; -import 'package:flutter_parent/screens/calendar/calendar_widget/calendar_filter_screen/calendar_filter_list_interactor.dart'; -import 'package:flutter_parent/screens/calendar/calendar_widget/calendar_filter_screen/calendar_filter_list_screen.dart'; -import 'package:flutter_parent/utils/common_widgets/empty_panda_widget.dart'; -import 'package:flutter_parent/utils/common_widgets/error_panda_widget.dart'; -import 'package:flutter_parent/utils/common_widgets/loading_indicator.dart'; -import 'package:flutter_test/flutter_test.dart'; -import 'package:mockito/mockito.dart'; - -import '../../../utils/accessibility_utils.dart'; -import '../../../utils/test_app.dart'; -import '../../../utils/test_helpers/mock_helpers.dart'; -import '../../../utils/test_helpers/mock_helpers.mocks.dart'; - -void main() { - group('Render', () { - testWidgetsWithAccessibilityChecks('shows loading indicator', (tester) async { - var interactor = MockCalendarFilterListInteractor(); - var completer = Completer>(); - - when(interactor.getCoursesForSelectedStudent(isRefresh: anyNamed('isRefresh'))) - .thenAnswer((_) => completer.future); - - setupTestLocator((locator) => locator.registerLazySingleton(() => interactor)); - - await tester.pumpWidget(TestApp( - CalendarFilterListScreen({}), - darkMode: true, - )); - await tester.pump(); - - expect(find.byType(LoadingIndicator), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('shows empty panda screen', (tester) async { - var interactor = MockCalendarFilterListInteractor(); - var completer = Completer>(); - - when(interactor.getCoursesForSelectedStudent(isRefresh: anyNamed('isRefresh'))) - .thenAnswer((_) => completer.future); - - setupTestLocator((locator) => locator.registerLazySingleton(() => interactor)); - - await tester.pumpWidget(TestApp( - CalendarFilterListScreen({}), - darkMode: true, - )); - await tester.pump(); - - completer.complete([]); - await tester.pumpAndSettle(); - - expect(find.byType(EmptyPandaWidget), findsOneWidget); - expect(find.text(AppLocalizations().noCoursesMessage), findsOneWidget); - expect(find.text(AppLocalizations().noCoursesTitle), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('shows error panda screen', (tester) async { - var interactor = MockCalendarFilterListInteractor(); - var completer = Completer>(); - - when(interactor.getCoursesForSelectedStudent(isRefresh: anyNamed('isRefresh'))) - .thenAnswer((_) => completer.future); - - setupTestLocator((locator) => locator.registerLazySingleton(() => interactor)); - - await tester.pumpWidget(TestApp( - CalendarFilterListScreen({}), - darkMode: true, - )); - await tester.pump(); - - completer.completeError('Error'); - await tester.pumpAndSettle(); - - expect(find.byType(ErrorPandaWidget), findsOneWidget); - expect(find.text(AppLocalizations().errorLoadingCourses), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('shows appbar title', (tester) async { - Set selectedCourses = {'course_123', 'course_234', 'course_345'}; - var interactor = MockCalendarFilterListInteractor(); - when(interactor.getCoursesForSelectedStudent(isRefresh: anyNamed('isRefresh'))) - .thenAnswer((_) => Future.value(_mockCourses())); - - setupTestLocator((locator) => locator.registerLazySingleton(() => interactor)); - - await tester.pumpWidget(TestApp( - CalendarFilterListScreen(selectedCourses), - )); - await tester.pump(); - await tester.pump(); - - expect(find.text(AppLocalizations().calendars), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('shows description', (tester) async { - var interactor = MockCalendarFilterListInteractor(); - when(interactor.getCoursesForSelectedStudent(isRefresh: anyNamed('isRefresh'))) - .thenAnswer((_) => Future.value(_mockCourses())); - - setupTestLocator((locator) => locator.registerLazySingleton(() => interactor)); - - await tester.pumpWidget(TestApp( - CalendarFilterListScreen({}), - )); - await tester.pump(); - await tester.pump(); - - expect(find.text(AppLocalizations().calendarTapToFavoriteDesc), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('shows course list with header item', (tester) async { - var interactor = MockCalendarFilterListInteractor(); - when(interactor.getCoursesForSelectedStudent(isRefresh: anyNamed('isRefresh'))) - .thenAnswer((_) => Future.value(_mockCourses())); - - setupTestLocator((locator) => locator.registerLazySingleton(() => interactor)); - - await tester.pumpWidget(TestApp( - CalendarFilterListScreen({}), - )); - await tester.pump(); - await tester.pump(); - - expect(find.text(AppLocalizations().coursesLabel), findsOneWidget); - expect(find.byType(LabeledCheckbox), findsNWidgets(3)); - }); - - testWidgetsWithAccessibilityChecks('empty selected list selects all items', (tester) async { - var interactor = MockCalendarFilterListInteractor(); - when(interactor.getCoursesForSelectedStudent(isRefresh: anyNamed('isRefresh'))) - .thenAnswer((_) => Future.value(_mockCourses())); - - setupTestLocator((locator) => locator.registerLazySingleton(() => interactor)); - - await tester.pumpWidget(TestApp( - CalendarFilterListScreen({}), - )); - await tester.pump(); - await tester.pump(); - - // Check for a text widget that has the 'pts' substring - expect(find.byWidgetPredicate((widget) { - if (widget is Checkbox) { - final Checkbox checkboxWidget = widget; - return checkboxWidget.value!; - } - return false; - }), findsNWidgets(3)); - }); - - testWidgetsWithAccessibilityChecks('items in initial selected list are selected', (tester) async { - var interactor = MockCalendarFilterListInteractor(); - when(interactor.getCoursesForSelectedStudent(isRefresh: anyNamed('isRefresh'))) - .thenAnswer((_) => Future.value(_mockCourses())); - - setupTestLocator((locator) => locator.registerLazySingleton(() => interactor)); - - await tester.pumpWidget(TestApp( - CalendarFilterListScreen({'course_123'}), - )); - await tester.pump(); - await tester.pump(); - - // Check for a checkbox widgets that are checked - expect(find.byWidgetPredicate((widget) { - if (widget is Checkbox) { - final Checkbox checkboxWidget = widget; - return checkboxWidget.value!; - } - return false; - }), findsNWidgets(1)); - }); - }); - - group('Interaction', () { - testWidgetsWithAccessibilityChecks('clicking list item updates selected list', (tester) async { - var interactor = MockCalendarFilterListInteractor(); - when(interactor.getCoursesForSelectedStudent(isRefresh: anyNamed('isRefresh'))) - .thenAnswer((_) => Future.value(_mockCourses())); - - Set selectedContexts = {'course_123'}; - setupTestLocator((locator) => locator.registerLazySingleton(() => interactor)); - - await tester.pumpWidget(TestApp( - CalendarFilterListScreen(selectedContexts), - )); - await tester.pump(); - await tester.pump(); - - CalendarFilterListScreenState state = await tester.state(find.byType(CalendarFilterListScreen)); - var initial = state.selectedContextIds.length; - - var checkedCheckBoxFinder = find.byWidgetPredicate((widget) { - if (widget is Checkbox) { - // Check for a checkbox widgets that are checked - final Checkbox checkboxWidget = widget; - return checkboxWidget.value!; - } - return false; - }); - - // Make sure we've got the correct selected number of items - expect(checkedCheckBoxFinder, findsNWidgets(1)); - - // Click on a context to add it to the selected list - await tester.tap(find.text('Course2')); - await tester.pumpAndSettle(); // Let checkbox animation finish - - // Check to make sure we have two items selected - expect(checkedCheckBoxFinder, findsNWidgets(2)); - - // Make sure the selected list was updated - var now = state.selectedContextIds.length; - expect(now > initial, true); - - // Tap the first course, deselecting it and removing it from the selected list - await tester.tap(find.text('Course1')); - await tester.pumpAndSettle(); // Let checkbox animation finish - - // Check to make sure we have one item selected - expect(checkedCheckBoxFinder, findsNWidgets(1)); - - // Make sure the selected list was updated - now = state.selectedContextIds.length; - expect(now == initial, true); - }); - - /* - testWidgetsWithAccessibilityChecks('deselecting all items empties the selected list', (tester) async { - var interactor = _MockCalendarFilterListInteractor(); - when(interactor.getCoursesForSelectedStudent(isRefresh: anyNamed('isRefresh'))) - .thenAnswer((_) => Future.value(_mockCourses())); - - Set selectedContexts = {'course_123'}; - setupTestLocator((locator) => locator.registerLazySingleton(() => interactor)); - - await tester.pumpWidget(TestApp( - CalendarFilterListScreen(selectedContexts), - )); - await tester.pump(); - await tester.pump(); - - CalendarFilterListScreenState state = await tester.state(find.byType(CalendarFilterListScreen)); - - expect(find.byType(Checkbox), findsNWidgets(3)); - - var checkedCheckBoxFinder = find.byWidgetPredicate((widget) { - if (widget is Checkbox) { - // Check for a checkbox widgets that are checked - final Checkbox checkboxWidget = widget; - return checkboxWidget.value; - } - return false; - }); - - // Make sure we've got the correct selected number of items - expect(checkedCheckBoxFinder, findsNWidgets(1)); - - // Click on the first course, the only selected context, to add it to the selected list - expect(find.text('Course1'), findsOneWidget); - await tester.tap(find.text('Course1')); - await tester.pumpAndSettle(Duration(seconds: 4)); // Let checkbox animation finish - - // Check to make sure we have no items selected - expect(checkedCheckBoxFinder, findsNothing); - - // Make sure the selected list was updated - var now = state.selectedContextIds.length; - expect(now == 0, true); - }); - */ - - testWidgetsWithAccessibilityChecks('deselecting items reduces the selected list', (tester) async { - var interactor = MockCalendarFilterListInteractor(); - when(interactor.getCoursesForSelectedStudent(isRefresh: anyNamed('isRefresh'))) - .thenAnswer((_) => Future.value(_mockCourses())); - - Set selectedContexts = {'course_123', 'course_234'}; - setupTestLocator((locator) => locator.registerLazySingleton(() => interactor)); - - await tester.pumpWidget(TestApp( - CalendarFilterListScreen(selectedContexts), - )); - await tester.pump(); - await tester.pump(); - - CalendarFilterListScreenState state = await tester.state(find.byType(CalendarFilterListScreen)); - - expect(find.byType(Checkbox), findsNWidgets(3)); - - var checkedCheckBoxFinder = find.byWidgetPredicate((widget) { - if (widget is Checkbox) { - // Check for a checkbox widgets that are checked - final Checkbox checkboxWidget = widget; - return checkboxWidget.value!; - } - return false; - }); - - // Make sure we've got the correct selected number of items - expect(checkedCheckBoxFinder, findsNWidgets(2)); - - // Click on the first course, deselecting it - expect(find.text('Course1'), findsOneWidget); - await tester.tap(find.text('Course1')); - await tester.pumpAndSettle(Duration(seconds: 4)); // Let checkbox animation finish - - // Check to make sure we have no items selected - expect(checkedCheckBoxFinder, findsOneWidget); - - // Make sure the selected list was updated - expect(state.selectedContextIds.length, 1); - }); - - testWidgetsWithAccessibilityChecks('attempting to deselect the last calendar shows an error', (tester) async { - var interactor = MockCalendarFilterListInteractor(); - when(interactor.getCoursesForSelectedStudent(isRefresh: anyNamed('isRefresh'))) - .thenAnswer((_) => Future.value(_mockCourses())); - - Set selectedContexts = { - 'course_123', - }; - setupTestLocator((locator) => locator.registerLazySingleton(() => interactor)); - - await tester.pumpWidget(TestApp( - CalendarFilterListScreen(selectedContexts), - )); - await tester.pump(); - await tester.pump(); - - CalendarFilterListScreenState state = await tester.state(find.byType(CalendarFilterListScreen)); - - expect(find.byType(Checkbox), findsNWidgets(3)); - - var checkedCheckBoxFinder = find.byWidgetPredicate((widget) { - if (widget is Checkbox) { - // Check for a checkbox widgets that are checked - final Checkbox checkboxWidget = widget; - return checkboxWidget.value!; - } - return false; - }, skipOffstage: false); - - // Make sure we've got the correct selected number of items - expect(checkedCheckBoxFinder, findsNWidgets(1)); - - // attempt to deselect the only selected course - expect(find.text('Course1'), findsOneWidget); - await tester.tap(find.text('Course1')); - await tester.pump(); - - expect(find.text(AppLocalizations().minimumCalendarsError), findsOneWidget); - - var selectedCount = state.selectedContextIds.length; - expect(selectedCount, 1); - }); - }); -} - -List _mockCourses() { - return [ - Course((b) => b - ..id = '123' - ..name = 'Course1'), - Course((b) => b - ..id = '234' - ..name = 'Course2'), - Course((b) => b - ..id = '345' - ..name = 'Course3') - ]; -} - -List _mockCoursesBigList() { - return [ - Course((b) => b - ..id = '1' - ..name = 'Course1'), - Course((b) => b - ..id = '2' - ..name = 'Course2'), - Course((b) => b - ..id = '3' - ..name = 'Course3'), - Course((b) => b - ..id = '4' - ..name = 'Course4'), - Course((b) => b - ..id = '5' - ..name = 'Course5'), - Course((b) => b - ..id = '6' - ..name = 'Course6'), - Course((b) => b - ..id = '7' - ..name = 'Course7'), - Course((b) => b - ..id = '8' - ..name = 'Course8'), - Course((b) => b - ..id = '9' - ..name = 'Course9'), - Course((b) => b - ..id = '10' - ..name = 'Course10'), - Course((b) => b - ..id = '11' - ..name = 'Course11'), - ]; -} diff --git a/apps/flutter_parent/test/screens/calendar/calendar_widget/calendar_month_test.dart b/apps/flutter_parent/test/screens/calendar/calendar_widget/calendar_month_test.dart deleted file mode 100644 index 9792f8e3ca..0000000000 --- a/apps/flutter_parent/test/screens/calendar/calendar_widget/calendar_month_test.dart +++ /dev/null @@ -1,252 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:flutter/cupertino.dart'; -import 'package:flutter_parent/models/planner_item.dart'; -import 'package:flutter_parent/screens/calendar/calendar_widget/calendar_day.dart'; -import 'package:flutter_parent/screens/calendar/calendar_widget/calendar_day_of_week_headers.dart'; -import 'package:flutter_parent/screens/calendar/calendar_widget/calendar_month.dart'; -import 'package:flutter_parent/screens/calendar/calendar_widget/calendar_week.dart'; -import 'package:flutter_parent/screens/calendar/planner_fetcher.dart'; -import 'package:flutter_test/flutter_test.dart'; -import 'package:provider/provider.dart'; - -import '../../../utils/accessibility_utils.dart'; -import '../../../utils/test_app.dart'; - -void main() { - DateTime selectedDate = DateTime(2020, 1, 15); // Jan 15 2020 - - testWidgetsWithAccessibilityChecks('Displays six weeks for a 6-week month', (tester) async { - await tester.pumpWidget( - _appWithFetcher( - CalendarMonth( - year: 2020, - month: 5, // May 2020, which spans six weeks in the en_US locale - onDaySelected: (_) {}, - selectedDay: selectedDate, - monthExpansionListener: MonthExpansionNotifier(1.0), - ), - ), - ); - await tester.pump(); - - expect(find.byType(CalendarWeek), findsNWidgets(6)); - }); - - testWidgetsWithAccessibilityChecks('Displays five weeks for a 5-week month', (tester) async { - await tester.pumpWidget( - _appWithFetcher( - CalendarMonth( - year: 2020, - month: 1, // Jan 2020, which spans five weeks in the en_US locale - onDaySelected: (_) {}, - selectedDay: selectedDate, - monthExpansionListener: MonthExpansionNotifier(1.0), - ), - ), - ); - await tester.pump(); - - expect(find.byType(CalendarWeek), findsNWidgets(5)); - }); - - testWidgetsWithAccessibilityChecks('Displays day-of-week headers', (tester) async { - await tester.pumpWidget( - _appWithFetcher( - CalendarMonth( - year: 2020, - month: 1, - onDaySelected: (_) {}, - selectedDay: selectedDate, - monthExpansionListener: MonthExpansionNotifier(1.0), - ), - ), - ); - await tester.pump(); - - expect(find.byType(DayOfWeekHeaders), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('Displays all days in all weeks spanned by the month', (tester) async { - await tester.pumpWidget( - _appWithFetcher( - CalendarMonth( - year: 2020, - month: 1, - onDaySelected: (_) {}, - selectedDay: selectedDate, - monthExpansionListener: MonthExpansionNotifier(1.0), - ), - ), - ); - await tester.pump(); - - /* Displayed days for January 2020: - 29 30 31 1 2 3 4 - 5 6 7 8 9 10 11 - 12 13 14 15 16 17 18 - 19 20 21 22 23 24 25 - 26 27 28 29 30 31 1 */ - - // Should show 35 days total - expect(find.byType(CalendarDay), findsNWidgets(35)); - - // Should show '1' twice - once for January, once for February - expect(find.text('1'), findsNWidgets(2)); - - // Should show '2' through '28' only once - for (int i = 2; i <= 28; i++) { - expect(find.text(i.toString()), findsOneWidget); - } - - // Should show '29' through '31' twice - once for December, once for January - for (int i = 29; i <= 31; i++) { - expect(find.text(i.toString()), findsNWidgets(2)); - } - }); - - testWidgetsWithAccessibilityChecks('Invokes onDaySelected callback', (tester) async { - DateTime? selected = null; - - await tester.pumpWidget( - _appWithFetcher( - CalendarMonth( - year: 2020, - month: 1, - onDaySelected: (day) { - selected = day; - }, - selectedDay: selectedDate, - monthExpansionListener: MonthExpansionNotifier(1.0), - ), - ), - ); - await tester.pump(); - - await tester.tap(find.text('13')); - await tester.pump(); - - expect(selected, DateTime(2020, 1, 13)); - }); - - testWidgetsWithAccessibilityChecks('Displays only selected week when collapsed', (tester) async { - await tester.pumpWidget( - _appWithFetcher( - CalendarMonth( - year: 2020, - month: 1, - onDaySelected: (_) {}, - selectedDay: selectedDate, - monthExpansionListener: MonthExpansionNotifier(0.0), - ), - ), - ); - await tester.pump(); - - for (int i = 0; i < 5; i++) { - final week = find.byType(CalendarWeek).at(i); - Opacity weekOpacity = tester.widget(find.ancestor(of: week, matching: find.byType(Opacity))); - if (tester.any(find.descendant(of: week, matching: find.text(selectedDate.day.toString())))) { - // If the week contains the selected day, it should be full opaque - expect(weekOpacity.opacity, 1.0); - } else { - // If the week does not contain the selected day, it should be fully transparent - expect(weekOpacity.opacity, 0.0); - } - } - }); - - testWidgetsWithAccessibilityChecks('Positions weeks according to expansion value', (tester) async { - final expansionValue = 0.12345; - await tester.pumpWidget( - _appWithFetcher( - CalendarMonth( - year: 2020, - month: 1, - onDaySelected: (_) {}, - selectedDay: selectedDate, - monthExpansionListener: MonthExpansionNotifier(expansionValue), - ), - ), - ); - await tester.pump(); - - for (int i = 0; i < 5; i++) { - final week = find.byType(CalendarWeek).at(i); - final position = tester.getTopLeft(week); - final expectedY = DayOfWeekHeaders.headerHeight + (i * CalendarDay.dayHeight * expansionValue); - expect(position.dy, moreOrLessEquals(expectedY)); - expect(position.dx, 0.0); - } - }); - - testWidgetsWithAccessibilityChecks('Updates week positions on expansion value change', (tester) async { - final expansionNotifier = MonthExpansionNotifier(0.0); - await tester.pumpWidget( - _appWithFetcher( - CalendarMonth( - year: 2020, - month: 1, - onDaySelected: (_) {}, - selectedDay: selectedDate, - monthExpansionListener: expansionNotifier, - ), - ), - ); - await tester.pump(); - - for (int i = 0; i < 5; i++) { - final week = find.byType(CalendarWeek).at(i); - final position = tester.getTopLeft(week); - expect(position.dy, DayOfWeekHeaders.headerHeight); - expect(position.dx, 0.0); - } - - final newExpansionValue = 0.5678; - expansionNotifier.value = newExpansionValue; - expansionNotifier.notify(); - await tester.pumpAndSettle(); - - for (int i = 0; i < 5; i++) { - final week = find.byType(CalendarWeek).at(i); - final position = tester.getTopLeft(week); - final expectedY = DayOfWeekHeaders.headerHeight + (i * CalendarDay.dayHeight * newExpansionValue); - expect(position.dy, moreOrLessEquals(expectedY)); - expect(position.dx, 0.0); - } - }); -} - -Widget _appWithFetcher(Widget child, {PlannerFetcher? fetcher}) { - return TestApp( - ChangeNotifierProvider( - create: (BuildContext context) => fetcher ?? _FakeFetcher( - observeeId: '', - userDomain: '', - userId: '', - ), - child: child, - ), - ); -} - -class _FakeFetcher extends PlannerFetcher { - AsyncSnapshot> nextSnapshot = AsyncSnapshot>.withData(ConnectionState.done, []); - - _FakeFetcher({required super.observeeId, required super.userDomain, required super.userId}); - - @override - AsyncSnapshot> getSnapshotForDate(DateTime date) => nextSnapshot; -} diff --git a/apps/flutter_parent/test/screens/calendar/calendar_widget/calendar_week_test.dart b/apps/flutter_parent/test/screens/calendar/calendar_widget/calendar_week_test.dart deleted file mode 100644 index 910268d062..0000000000 --- a/apps/flutter_parent/test/screens/calendar/calendar_widget/calendar_week_test.dart +++ /dev/null @@ -1,225 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:flutter/material.dart'; -import 'package:flutter_parent/models/planner_item.dart'; -import 'package:flutter_parent/screens/calendar/calendar_widget/calendar_day.dart'; -import 'package:flutter_parent/screens/calendar/calendar_widget/calendar_day_of_week_headers.dart'; -import 'package:flutter_parent/screens/calendar/calendar_widget/calendar_week.dart'; -import 'package:flutter_parent/screens/calendar/planner_fetcher.dart'; -import 'package:flutter_parent/utils/core_extensions/list_extensions.dart'; -import 'package:flutter_test/flutter_test.dart'; -import 'package:provider/provider.dart'; - -import '../../../utils/accessibility_utils.dart'; -import '../../../utils/test_app.dart'; - -void main() { - DateTime weekStart = DateTime(1999, 12, 26); // Dec 26, 1999 - week of 2000 new year - DateTime selectedDate = weekStart.add(Duration(days: 1)); // Dec 27, 1999 - - test('Generates week dates from week start', () { - final week = CalendarWeek( - firstDay: weekStart, - selectedDay: selectedDate, - onDaySelected: (_) {}, - displayDayOfWeekHeader: false, - ); - - expect(week.days.length, 7); - expect(week.days[0], DateTime(1999, 12, 26)); - expect(week.days[1], DateTime(1999, 12, 27)); - expect(week.days[2], DateTime(1999, 12, 28)); - expect(week.days[3], DateTime(1999, 12, 29)); - expect(week.days[4], DateTime(1999, 12, 30)); - expect(week.days[5], DateTime(1999, 12, 31)); - expect(week.days[6], DateTime(2000, 1, 1)); - }); - - testWidgetsWithAccessibilityChecks('Displays all days in week', (tester) async { - await tester.pumpWidget( - _appWithFetcher( - CalendarWeek( - firstDay: weekStart, - selectedDay: selectedDate, - onDaySelected: (_) {}, - displayDayOfWeekHeader: false, - ), - ), - ); - await tester.pump(); - - expect(find.byType(CalendarDay), findsNWidgets(7)); - expect(find.text('26'), findsOneWidget); - expect(find.text('27'), findsOneWidget); - expect(find.text('28'), findsOneWidget); - expect(find.text('29'), findsOneWidget); - expect(find.text('30'), findsOneWidget); - expect(find.text('31'), findsOneWidget); - expect(find.text('1'), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('Invokes onDaySelected callback', (tester) async { - DateTime? selected = null; - await tester.pumpWidget( - _appWithFetcher( - CalendarWeek( - firstDay: weekStart, - selectedDay: selectedDate, - onDaySelected: (day) { - selected = day; - }, - displayDayOfWeekHeader: false, - ), - ), - ); - await tester.pump(); - - await tester.tap(find.text('30')); - await tester.pump(); - - expect(selected, DateTime(1999, 12, 30)); - }); - - testWidgetsWithAccessibilityChecks('Displays day-of-week headers if specified', (tester) async { - await tester.pumpWidget( - _appWithFetcher( - CalendarWeek( - firstDay: weekStart, - selectedDay: selectedDate, - onDaySelected: (_) {}, - displayDayOfWeekHeader: true, - ), - ), - ); - await tester.pump(); - - expect(find.byType(DayOfWeekHeaders), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('Does not display day-of-week headers if not specified', (tester) async { - await tester.pumpWidget( - _appWithFetcher( - CalendarWeek( - firstDay: weekStart, - selectedDay: selectedDate, - onDaySelected: (_) {}, - displayDayOfWeekHeader: false, - ), - ), - ); - await tester.pump(); - - expect(find.byType(DayOfWeekHeaders), findsNothing); - }); - - testWidgetsWithAccessibilityChecks('Expands CalendarDay widgets across screen', (tester) async { - await tester.pumpWidget( - _appWithFetcher( - CalendarWeek( - firstDay: weekStart, - selectedDay: selectedDate, - onDaySelected: (_) {}, - displayDayOfWeekHeader: false, - ), - ), - ); - await tester.pump(); - - final window = tester.binding.window; - final windowWidth = window.physicalSize.width / window.devicePixelRatio; - final expectedWidgetWidth = windowWidth / 7; - - for (int i = 0; i < 7; i++) { - var widgetSize = tester.getSize(find.byType(CalendarDay).at(i)); - expect(widgetSize.width, moreOrLessEquals(expectedWidgetWidth)); - } - }); - - testWidgetsWithAccessibilityChecks('Correctly displays days LTR order', (tester) async { - final weekWidget = CalendarWeek( - firstDay: weekStart, - selectedDay: selectedDate, - onDaySelected: (_) {}, - displayDayOfWeekHeader: false, - ); - await tester.pumpWidget( - _appWithFetcher( - weekWidget, - ), - ); - await tester.pump(); - - // Get X position of day widget centers - final List centers = weekWidget.days.map((it) { - var finder = find.text(it.day.toString()); - return tester.getCenter(finder).dx; - }).toList(); - - // We expect X positions to be in ascending order - final List? expectedCenters = List.from(centers).sortBySelector([(it) => it]); - - expect(centers, expectedCenters); - }); - - testWidgetsWithAccessibilityChecks('Correctly displays days RTL order', (tester) async { - final weekWidget = CalendarWeek( - firstDay: weekStart, - selectedDay: selectedDate, - onDaySelected: (_) {}, - displayDayOfWeekHeader: false, - ); - await tester.pumpWidget( - _appWithFetcher( - weekWidget, - locale: Locale('ar'), - ), - ); - await tester.pump(); - - // Get X position of day widget centers - final List centers = weekWidget.days.map((it) { - var finder = find.text(it.day.toString()); - return tester.getCenter(finder).dx; - }).toList(); - - // We expect X positions to be in descending order - final List? expectedCenters = List.from(centers).sortBySelector([(it) => it], descending: true); - - expect(centers, expectedCenters); - }); -} - -Widget _appWithFetcher(Widget child, {PlannerFetcher? fetcher, Locale? locale}) { - return TestApp( - ChangeNotifierProvider( - create: (BuildContext context) => fetcher ?? _FakeFetcher( - observeeId: '', - userDomain: '', - userId: '', - ), - child: child, - ), - locale: locale, - ); -} - -class _FakeFetcher extends PlannerFetcher { - AsyncSnapshot> nextSnapshot = AsyncSnapshot>.withData(ConnectionState.done, []); - - _FakeFetcher({required super.observeeId, required super.userDomain, required super.userId}); - - @override - AsyncSnapshot> getSnapshotForDate(DateTime date) => nextSnapshot; -} diff --git a/apps/flutter_parent/test/screens/calendar/calendar_widget/calendar_widget_test.dart b/apps/flutter_parent/test/screens/calendar/calendar_widget/calendar_widget_test.dart deleted file mode 100644 index f171afaa9d..0000000000 --- a/apps/flutter_parent/test/screens/calendar/calendar_widget/calendar_widget_test.dart +++ /dev/null @@ -1,1112 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:flutter/foundation.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_parent/models/planner_item.dart'; -import 'package:flutter_parent/screens/calendar/calendar_today_click_notifier.dart'; -import 'package:flutter_parent/screens/calendar/calendar_today_notifier.dart'; -import 'package:flutter_parent/screens/calendar/calendar_widget/calendar_month.dart'; -import 'package:flutter_parent/screens/calendar/calendar_widget/calendar_week.dart'; -import 'package:flutter_parent/screens/calendar/calendar_widget/calendar_widget.dart'; -import 'package:flutter_parent/screens/calendar/planner_fetcher.dart'; -import 'package:flutter_parent/utils/common_widgets/dropdown_arrow.dart'; -import 'package:flutter_test/flutter_test.dart'; -import 'package:provider/provider.dart'; - -import '../../../utils/accessibility_utils.dart'; -import '../../../utils/test_app.dart'; - -void main() { - setupTestLocator((locator) { - locator.registerLazySingleton(() => CalendarTodayClickNotifier()); - }); - Future goToDate(WidgetTester tester, DateTime date) async { - CalendarWidgetState state = tester.state(find.byType(CalendarWidget)); - state.selectDay( - date, - dayPagerBehavior: CalendarPageChangeBehavior.jump, - weekPagerBehavior: CalendarPageChangeBehavior.jump, - monthPagerBehavior: CalendarPageChangeBehavior.jump, - ); - await tester.pumpAndSettle(); - return state; - } - - Widget calendarTestApp(Widget child, {Locale? locale}) { - return TestApp(ChangeNotifierProvider(create: (_) => CalendarTodayNotifier(), child: child), locale: locale); - } - - testWidgetsWithAccessibilityChecks('Displays week view by default', (tester) async { - await tester.pumpWidget( - calendarTestApp( - CalendarWidget( - dayBuilder: (_, __) => Container(), - fetcher: _FakeFetcher(), - ), - ), - ); - await tester.pumpAndSettle(); - - expect(find.byType(CalendarWeek), findsOneWidget); - expect(find.byType(CalendarMonth), findsNothing); - }); - - testWidgetsWithAccessibilityChecks('Displays month view when passed in', (tester) async { - await tester.pumpWidget( - calendarTestApp( - CalendarWidget( - dayBuilder: (_, __) => Container(), - fetcher: _FakeFetcher(), - startingView: CalendarView.Month, - ), - ), - ); - await tester.pumpAndSettle(); - - // Weeks can be 4, 5 or 6 in a month view, we just have to match greater than 4 - expect(find.byType(CalendarWeek).evaluate().length, greaterThanOrEqualTo(4), - reason: 'Not showing all weeks for the month'); - expect(find.byType(CalendarMonth), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('Switches to specified starting date', (tester) async { - DateTime startingDate = DateTime(2000, 1, 1); - DateTime? dateForDayBuilder = null; - await tester.pumpWidget( - calendarTestApp( - CalendarWidget( - startingDate: startingDate, - dayBuilder: (_, day) { - dateForDayBuilder = day; - return Container(); - }, - fetcher: _FakeFetcher(), - ), - ), - ); - await tester.pumpAndSettle(); - - // Day should have built using target date - expect(dateForDayBuilder, startingDate); - - // Week should start on Dec 26, 1999 - DateTime weekStart = tester.widget(find.byType(CalendarWeek)).firstDay; - expect(weekStart, DateTime(1999, 12, 26)); - - // Month should be Jan 2000 - final monthWidget = tester.widget(find.byType(CalendarMonth, skipOffstage: false)); - expect(monthWidget.year, 2000); - expect(monthWidget.month, 1); - }); - - testWidgetsWithAccessibilityChecks('Can click events in day content while month is visible', (tester) async { - var pressed = false; - - final calendar = CalendarWidget( - dayBuilder: (_, __) => TextButton( - onPressed: () => pressed = true, - child: Text('Press me!'), - ), - fetcher: _FakeFetcher(), - ); - - await tester.pumpWidget( - calendarTestApp( - calendar, - ), - ); - await tester.pumpAndSettle(); - - // Tap expand button - await tester.tap(find.byKey(Key('expand-button'))); - await tester.pumpAndSettle(); - - // Should show month now - expect(find.byType(CalendarMonth), findsOneWidget); - - // Tap on the 'event' - await tester.tap(find.byType(TextButton)); - await tester.pumpAndSettle(); - - // Should have our pressed value true - expect(pressed, true); - }); - - testWidgetsWithAccessibilityChecks('Can click events in day content while week is visible', (tester) async { - var pressed = false; - - final calendar = CalendarWidget( - dayBuilder: (_, __) => TextButton( - onPressed: () => pressed = true, - child: Text('Press me!'), - ), - fetcher: _FakeFetcher(), - ); - - await tester.pumpWidget( - calendarTestApp( - calendar, - ), - ); - await tester.pumpAndSettle(); - - // Should show month now - expect(find.byType(CalendarMonth), findsNothing); - expect(find.byType(CalendarWeek), findsOneWidget); - - // Tap on the 'event' - await tester.tap(find.byType(TextButton)); - await tester.pumpAndSettle(); - - // Should have our pressed value true - expect(pressed, true); - }); - - group('Month Expand/Collapse', () { - testWidgetsWithAccessibilityChecks('Expand button expands and collapses month', (tester) async { - final calendar = CalendarWidget( - dayBuilder: (_, __) => Container(), - fetcher: _FakeFetcher(), - ); - await tester.pumpWidget( - calendarTestApp( - calendar, - ), - ); - await tester.pumpAndSettle(); - - // Tap expand button - await tester.tap(find.byKey(Key('expand-button'))); - await tester.pumpAndSettle(); - - // Should show month w/ multiple weeks - expect(find.byType(CalendarMonth), findsOneWidget); - expect(find.byType(CalendarWeek).evaluate().length, greaterThan(1)); - - // Tap expand button again - await tester.tap(find.byKey(Key('expand-button'))); - await tester.pumpAndSettle(); - - // Should should one week view and no month - expect(find.byType(CalendarWeek), findsOneWidget); - expect(find.byType(CalendarMonth), findsNothing); - }); - - testWidgetsWithAccessibilityChecks('Can drag to expand and collapse month', (tester) async { - final calendar = CalendarWidget( - dayBuilder: (_, __) => Container(), - fetcher: _FakeFetcher(), - ); - await tester.pumpWidget( - calendarTestApp( - calendar, - ), - ); - await tester.pumpAndSettle(); - - // Drag down on week to expand - await tester.drag(find.byType(CalendarWeek), Offset(0, 400)); - await tester.pumpAndSettle(); - - // Should show month w/ multiple weeks - expect(find.byType(CalendarMonth), findsOneWidget); - expect(find.byType(CalendarWeek).evaluate().length, greaterThan(1)); - - // Drag up on month to collapse - await tester.drag(find.byType(CalendarMonth), Offset(0, -400)); - await tester.pumpAndSettle(); - - // Should should one week view and no month - expect(find.byType(CalendarWeek), findsOneWidget); - expect(find.byType(CalendarMonth), findsNothing); - }); - - testWidgetsWithAccessibilityChecks('Can fling to expand and collapse month', (tester) async { - final calendar = CalendarWidget( - dayBuilder: (_, __) => Container(), - fetcher: _FakeFetcher(), - ); - await tester.pumpWidget( - calendarTestApp( - calendar, - ), - ); - await tester.pumpAndSettle(); - - // Fling down on week to expand - await tester.fling(find.byType(CalendarWeek), Offset(0, 50), 300); - await tester.pumpAndSettle(); - - // Should show month w/ multiple weeks - expect(find.byType(CalendarMonth), findsOneWidget); - expect(find.byType(CalendarWeek).evaluate().length, greaterThan(1)); - - // Fling up on month to collapse - await tester.fling(find.byType(CalendarMonth), Offset(0, -50), 300); - await tester.pumpAndSettle(); - - // Should should one week view and no month - expect(find.byType(CalendarWeek), findsOneWidget); - expect(find.byType(CalendarMonth), findsNothing); - }); - - testWidgetsWithAccessibilityChecks('Can fling day content to collapse month', (tester) async { - final dayContentKey = Key('day-content'); - final calendar = CalendarWidget( - dayBuilder: (_, __) => Container(key: dayContentKey), - fetcher: _FakeFetcher(), - ); - await tester.pumpWidget( - calendarTestApp( - calendar, - ), - ); - await tester.pumpAndSettle(); - - // Tap expand button - await tester.tap(find.byKey(Key('expand-button'))); - await tester.pumpAndSettle(); - - // Should show month now - expect(find.byType(CalendarMonth), findsOneWidget); - - // Fling up on day content to collapse - await tester.fling(find.byKey(dayContentKey), Offset(0, -50), 300); - await tester.pumpAndSettle(); - - // Should should one week view and no month - expect(find.byType(CalendarWeek), findsOneWidget); - expect(find.byType(CalendarMonth), findsNothing); - }); - }); - - group('Set day/week/month', () { - testWidgetsWithAccessibilityChecks('Jumps to selected date', (tester) async { - DateTime? dateForDayBuilder = null; - await tester.pumpWidget( - calendarTestApp( - CalendarWidget( - dayBuilder: (_, day) { - dateForDayBuilder = day; - return Container(); - }, - fetcher: _FakeFetcher(), - ), - ), - ); - await tester.pumpAndSettle(); - - DateTime targetDate = DateTime(2000, 1, 1); - await goToDate(tester, targetDate); - - // Day should have built using target date - expect(dateForDayBuilder, targetDate); - - // Week should start on Dec 26, 1999 - DateTime weekStart = tester.widget(find.byType(CalendarWeek)).firstDay; - expect(weekStart, DateTime(1999, 12, 26)); - - // Month should be Jan 2000 - final monthWidget = tester.widget(find.byType(CalendarMonth, skipOffstage: false)); - expect(monthWidget.year, 2000); - expect(monthWidget.month, 1); - }); - - testWidgetsWithAccessibilityChecks('Animates to selected date', (tester) async { - DateTime? dateForDayBuilder = null; - await tester.pumpWidget( - calendarTestApp( - CalendarWidget( - dayBuilder: (_, day) { - dateForDayBuilder = day; - return Container(); - }, - fetcher: _FakeFetcher(), - ), - ), - ); - await tester.pumpAndSettle(); - - CalendarWidgetState state = await goToDate(tester, DateTime(2000, 1, 1)); - - DateTime targetDate = DateTime(1999, 12, 23); - state.selectDay( - targetDate, - dayPagerBehavior: CalendarPageChangeBehavior.animate, - weekPagerBehavior: CalendarPageChangeBehavior.animate, - monthPagerBehavior: CalendarPageChangeBehavior.animate, - ); - await tester.pumpAndSettle(); - - // Day should have built using target date - expect(dateForDayBuilder, targetDate); - - // Week should start on Dec 19, 1999 - DateTime weekStart = tester.widget(find.byType(CalendarWeek)).firstDay; - expect(weekStart, DateTime(1999, 12, 19)); - - // Month should be Dec 1999 - final monthWidget = tester.widget(find.byType(CalendarMonth, skipOffstage: false)); - expect(monthWidget.year, 1999); - expect(monthWidget.month, 12); - }); - }); - - group('Week and Month Swipe', () { - testWidgetsWithAccessibilityChecks('Swipes to previous week', (tester) async { - await tester.pumpWidget( - calendarTestApp( - CalendarWidget( - dayBuilder: (_, day) => Container(), - fetcher: _FakeFetcher(), - ), - ), - ); - await tester.pumpAndSettle(); - - DateTime targetDate = DateTime(2000, 1, 1); - CalendarWidgetState state = await goToDate(tester, targetDate); - - // Week should start on Dec 26, 1999 - DateTime weekStart = tester.widget(find.byType(CalendarWeek)).firstDay; - expect(weekStart, DateTime(1999, 12, 26)); - - // Selected day should be Saturday (Jan 1 2000) - expect(state.selectedDay, targetDate); - - // Fling to previous week - await tester.fling(find.byType(CalendarWeek), Offset(50, 0), 300); - await tester.pumpAndSettle(); - - // Week should now start on Dec 19, 1999 - weekStart = tester.widget(find.byType(CalendarWeek)).firstDay; - expect(weekStart, DateTime(1999, 12, 19)); - - // Selected day should be the same day of the week, Saturday (Dec 25, 1999) - expect(state.selectedDay, DateTime(1999, 12, 25)); - }); - - testWidgetsWithAccessibilityChecks('Swipes to next week', (tester) async { - await tester.pumpWidget( - calendarTestApp( - CalendarWidget( - dayBuilder: (_, day) => Container(), - fetcher: _FakeFetcher(), - ), - ), - ); - await tester.pumpAndSettle(); - - DateTime targetDate = DateTime(2000, 1, 1); - CalendarWidgetState state = await goToDate(tester, targetDate); - - // Week should start on Dec 26, 1999 - DateTime weekStart = tester.widget(find.byType(CalendarWeek)).firstDay; - expect(weekStart, DateTime(1999, 12, 26)); - - // Selected day should be Saturday (Jan 1 2000) - expect(state.selectedDay, targetDate); - - // Fling to previous month - await tester.fling(find.byType(CalendarWeek), Offset(-50, 0), 300); - await tester.pumpAndSettle(); - - // Week should now start on Jan 2, 2000 - weekStart = tester.widget(find.byType(CalendarWeek)).firstDay; - expect(weekStart, DateTime(2000, 1, 2)); - - // Selected day should be the same day of the week, Saturday (Jan 8, 2000) - expect(state.selectedDay, DateTime(2000, 1, 8)); - }); - - testWidgetsWithAccessibilityChecks('Swipes to previous month', (tester) async { - await tester.pumpWidget( - calendarTestApp( - CalendarWidget( - dayBuilder: (_, day) => Container(), - fetcher: _FakeFetcher(), - ), - ), - ); - await tester.pumpAndSettle(); - - DateTime targetDate = DateTime(2000, 1, 1); - CalendarWidgetState state = await goToDate(tester, targetDate); - - // Tap expand button - await tester.tap(find.byKey(Key('expand-button'))); - await tester.pumpAndSettle(); - - // Month should be January 2000 - CalendarMonth monthWidget = tester.widget(find.byType(CalendarMonth)); - expect(monthWidget.year, 2000); - expect(monthWidget.month, 1); - - // Selected day should be Jan 1 2000 - expect(state.selectedDay, targetDate); - - // Fling to previous month - await tester.fling(find.byType(CalendarMonth), Offset(50, 0), 300); - await tester.pumpAndSettle(); - - // Month should be December 1999 - monthWidget = tester.widget(find.byType(CalendarMonth)); - expect(monthWidget.year, 1999); - expect(monthWidget.month, 12); - - // Selected day should be Same day of the month (Dec 1, 1999) - expect(state.selectedDay, DateTime(1999, 12, 1)); - }); - testWidgetsWithAccessibilityChecks('Swipes to next month', (tester) async { - await tester.pumpWidget( - calendarTestApp( - CalendarWidget( - dayBuilder: (_, day) => Container(), - fetcher: _FakeFetcher(), - ), - ), - ); - await tester.pumpAndSettle(); - - DateTime targetDate = DateTime(2000, 1, 1); - CalendarWidgetState state = await goToDate(tester, targetDate); - - // Tap expand button - await tester.tap(find.byKey(Key('expand-button'))); - await tester.pumpAndSettle(); - - // Month should be January 2000 - CalendarMonth monthWidget = tester.widget(find.byType(CalendarMonth)); - expect(monthWidget.year, 2000); - expect(monthWidget.month, 1); - - // Selected day should be Jan 1 2000 - expect(state.selectedDay, targetDate); - - // Fling to next month - await tester.fling(find.byType(CalendarMonth), Offset(-50, 0), 300); - await tester.pumpAndSettle(); - - // Month should be February 2000 - monthWidget = tester.widget(find.byType(CalendarMonth)); - expect(monthWidget.year, 2000); - expect(monthWidget.month, 2); - - // Selected day should be same day of the month (Feb 1, 2000) - expect(state.selectedDay, DateTime(2000, 2, 1)); - }); - }); - - group('Accessibility', () { - testWidgetsWithAccessibilityChecks('Displays a11y arrows for week view', (tester) async { - await tester.pumpWidget( - calendarTestApp( - MediaQuery( - child: CalendarWidget( - dayBuilder: (_, __) => Container(), - fetcher: _FakeFetcher(), - ), - data: MediaQueryData(accessibleNavigation: true), - ), - ), - ); - await tester.pumpAndSettle(); - - // Jump to Jan 1 2000 - await goToDate(tester, DateTime(2000, 1, 1)); - - // Should show week a11y arrows - expect(find.byKey(Key('calendar-a11y-previous-week')), findsOneWidget); - expect(find.byKey(Key('calendar-a11y-next-week')), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('A11y arrow moves to previous week', (tester) async { - await tester.pumpWidget( - calendarTestApp( - MediaQuery( - child: CalendarWidget( - dayBuilder: (_, __) => Container(), - fetcher: _FakeFetcher(), - ), - data: MediaQueryData(accessibleNavigation: true), - ), - ), - ); - await tester.pumpAndSettle(); - - DateTime targetDate = DateTime(2000, 1, 1); - CalendarWidgetState state = await goToDate(tester, targetDate); - - // Tap previous arrow - await tester.tap(find.byKey(Key('calendar-a11y-previous-week'))); - await tester.pumpAndSettle(); - - // Week should start on Dec 19, 1999 - DateTime weekStart = tester.widget(find.byType(CalendarWeek)).firstDay; - expect(weekStart, DateTime(1999, 12, 19)); - - // Selected day should be the same day of the week, Saturday (Dec 25, 1999) - expect(state.selectedDay, DateTime(1999, 12, 25)); - }); - - testWidgetsWithAccessibilityChecks('A11y arrow moves to next week', (tester) async { - await tester.pumpWidget( - calendarTestApp( - MediaQuery( - child: CalendarWidget( - dayBuilder: (_, __) => Container(), - fetcher: _FakeFetcher(), - ), - data: MediaQueryData(accessibleNavigation: true), - ), - ), - ); - await tester.pumpAndSettle(); - - DateTime targetDate = DateTime(2000, 1, 1); - CalendarWidgetState state = await goToDate(tester, targetDate); - - // Tap next arrow - await tester.tap(find.byKey(Key('calendar-a11y-next-week'))); - await tester.pumpAndSettle(); - - // Week should now start on Jan 2, 2000 - DateTime weekStart = tester.widget(find.byType(CalendarWeek)).firstDay; - expect(weekStart, DateTime(2000, 1, 2)); - - // Selected day should be the same day of the week, Saturday (Jan 8, 2000) - expect(state.selectedDay, DateTime(2000, 1, 8)); - }); - - testWidgetsWithAccessibilityChecks('Displays a11y arrows for month view', (tester) async { - await tester.pumpWidget( - calendarTestApp( - MediaQuery( - child: CalendarWidget( - dayBuilder: (_, __) => Container(), - fetcher: _FakeFetcher(), - ), - data: MediaQueryData(accessibleNavigation: true), - ), - ), - ); - await tester.pumpAndSettle(); - - // Jump to Jan 1 2000 - await goToDate(tester, DateTime(2000, 1, 1)); - - // Tap to expand month view - await tester.tap(find.byKey(Key('expand-button'))); - await tester.pumpAndSettle(); - - // Should show week a11y arrows - expect(find.byKey(Key('calendar-a11y-previous-month')), findsOneWidget); - expect(find.byKey(Key('calendar-a11y-next-month')), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('A11y arrow moves to previous month', (tester) async { - await tester.pumpWidget( - calendarTestApp( - MediaQuery( - child: CalendarWidget( - dayBuilder: (_, __) => Container(), - fetcher: _FakeFetcher(), - ), - data: MediaQueryData(accessibleNavigation: true), - ), - ), - ); - await tester.pumpAndSettle(); - - DateTime targetDate = DateTime(2000, 1, 1); - CalendarWidgetState state = await goToDate(tester, targetDate); - - // Tap to expand month view - await tester.tap(find.byKey(Key('expand-button'))); - await tester.pumpAndSettle(); - - // Tap previous arrow - await tester.tap(find.byKey(Key('calendar-a11y-previous-month'))); - await tester.pumpAndSettle(); - - // Month should be December 1999 - var monthWidget = tester.widget(find.byType(CalendarMonth)); - expect(monthWidget.year, 1999); - expect(monthWidget.month, 12); - - // Selected day should be Same day of the month (Dec 1, 1999) - expect(state.selectedDay, DateTime(1999, 12, 1)); - }); - - testWidgetsWithAccessibilityChecks('A11y arrow moves to next month', (tester) async { - await tester.pumpWidget( - calendarTestApp( - MediaQuery( - child: CalendarWidget( - dayBuilder: (_, __) => Container(), - fetcher: _FakeFetcher(), - ), - data: MediaQueryData(accessibleNavigation: true), - ), - ), - ); - await tester.pumpAndSettle(); - - DateTime targetDate = DateTime(2000, 1, 1); - CalendarWidgetState state = await goToDate(tester, targetDate); - - // Tap to expand month view - await tester.tap(find.byKey(Key('expand-button'))); - await tester.pumpAndSettle(); - - // Tap next arrow - await tester.tap(find.byKey(Key('calendar-a11y-next-month'))); - await tester.pumpAndSettle(); - - // Month should be February 2000 - var monthWidget = tester.widget(find.byType(CalendarMonth)); - expect(monthWidget.year, 2000); - expect(monthWidget.month, 2); - - // Selected day should be same day of the month (Feb 1, 2000) - expect(state.selectedDay, DateTime(2000, 2, 1)); - }); - }); - - group('Date Selection', () { - testWidgetsWithAccessibilityChecks('Selects date from week view', (tester) async { - DateTime? dateForDayBuilder = null; - await tester.pumpWidget( - calendarTestApp( - CalendarWidget( - dayBuilder: (_, day) { - dateForDayBuilder = day; - return Container(); - }, - fetcher: _FakeFetcher(), - ), - ), - ); - await tester.pumpAndSettle(); - - await goToDate(tester, DateTime(2000, 1, 1)); - - await tester.tap(find.text('31')); - await tester.pumpAndSettle(); - - // Day should have built Dec 31 1999 - expect(dateForDayBuilder, DateTime(1999, 12, 31)); - - // Week should start Dec 26, 1999 - DateTime weekStart = tester.widget(find.byType(CalendarWeek)).firstDay; - expect(weekStart, DateTime(1999, 12, 26)); - - // Month should be December 1999 - final monthWidget = tester.widget(find.byType(CalendarMonth, skipOffstage: false)); - expect(monthWidget.year, 1999); - expect(monthWidget.month, 12); - }); - - testWidgetsWithAccessibilityChecks('Selects date from month view', (tester) async { - DateTime? dateForDayBuilder = null; - await tester.pumpWidget( - calendarTestApp( - CalendarWidget( - dayBuilder: (_, day) { - dateForDayBuilder = day; - return Container(); - }, - fetcher: _FakeFetcher(), - ), - ), - ); - await tester.pumpAndSettle(); - - await goToDate(tester, DateTime(2000, 1, 1)); - await tester.tap(find.byKey(Key('expand-button'))); - await tester.pumpAndSettle(); - - // Tap the last '1', which should be February 1 2000 - await tester.tap(find.text('1').last); - await tester.pumpAndSettle(); - - // Day should have built Feb 1 2000 - expect(dateForDayBuilder, DateTime(2000, 2, 1)); - - // Week should start Jan 30 2000 - DateTime weekStart = tester.widget(find.byType(CalendarWeek, skipOffstage: false).first).firstDay; - expect(weekStart, DateTime(2000, 1, 30)); - - // Month should be Feb 2000 - final monthWidget = tester.widget(find.byType(CalendarMonth)); - expect(monthWidget.year, 2000); - expect(monthWidget.month, 2); - }); - - testWidgetsWithAccessibilityChecks('Swipes to select adjacent day', (tester) async { - DateTime? dateForDayBuilder = null; - final dayContentKey = Key('day-content'); - - await tester.pumpWidget( - calendarTestApp( - CalendarWidget( - dayBuilder: (_, day) { - dateForDayBuilder = day; - return Container(key: dayContentKey); - }, - fetcher: _FakeFetcher(), - ), - ), - ); - await tester.pumpAndSettle(); - - await goToDate(tester, DateTime(2000, 1, 1)); - - // Swipe to next day, which should be Jan 2 2000 - await tester.fling(find.byKey(dayContentKey), Offset(-50, 0), 300); - await tester.pumpAndSettle(); - - // Day should have built Jan 2 2000 - expect(dateForDayBuilder, DateTime(2000, 1, 2)); - - // Week should start Jan 2 2000 - DateTime weekStart = tester.widget(find.byType(CalendarWeek)).firstDay; - expect(weekStart, DateTime(2000, 1, 2)); - - // Month should be Jan 2000 - final monthWidget = tester.widget(find.byType(CalendarMonth, skipOffstage: false)); - expect(monthWidget.year, 2000); - expect(monthWidget.month, 1); - }); - }); - - group('Insufficient Height', () { - testWidgetsWithAccessibilityChecks('disables expand/collapse button for insufficient height', (tester) async { - final calendarHeight = 200; - final screenHeight = tester.binding.window.physicalSize.height / tester.binding.window.devicePixelRatio; - final calendar = CalendarWidget( - dayBuilder: (_, __) => Container(), - fetcher: _FakeFetcher(), - ); - await tester.pumpWidget( - calendarTestApp( - Column( - children: [ - SizedBox(height: screenHeight - calendarHeight), - Expanded(child: calendar), - ], - ), - ), - ); - await tester.pumpAndSettle(); - - // Should not show dropdown arrow - expect(find.byType(DropdownArrow), findsNothing); - - // Tap expand button - await tester.tap(find.byKey(Key('expand-button'))); - await tester.pumpAndSettle(); - - // Should not show month - expect(find.byType(CalendarMonth), findsNothing); - }); - - testWidgetsWithAccessibilityChecks('disables swipe-to-expand for insufficient height', (tester) async { - final calendarHeight = 200; - final screenHeight = tester.binding.window.physicalSize.height / tester.binding.window.devicePixelRatio; - final calendar = CalendarWidget( - dayBuilder: (_, __) => Container(), - fetcher: _FakeFetcher(), - ); - await tester.pumpWidget( - calendarTestApp( - Column( - children: [ - SizedBox(height: screenHeight - calendarHeight), - Expanded(child: calendar), - ], - ), - ), - ); - await tester.pumpAndSettle(); - - // Fling down on week to try expand - await tester.fling(find.byType(CalendarWeek), Offset(0, 50), 300); - await tester.pumpAndSettle(); - - // Should not show month - expect(find.byType(CalendarMonth), findsNothing); - }); - - testWidgetsWithAccessibilityChecks('collapses month if height becomes insufficient', (tester) async { - // Due to how we must capture height changes, when the month view is open and the height becomes insufficient - // there will be at least one build pass where the month layout overflows its parent. This is acceptable while the - // month view is animating its collapse into the week view. However, because such overflows will fail the test, - // we must intercept and ignore those specific errors - FlutterExceptionHandler? onError = FlutterError.onError; - FlutterError.onError = (details) { - var exception = details.exception; - if (exception is FlutterError && exception.message.startsWith('A RenderFlex overflowed')) { - // Intentionally left blank - } else { - onError!(details); - } - }; - - try { - double calendarHeight = 600; - final screenHeight = tester.binding.window.physicalSize.height / tester.binding.window.devicePixelRatio; - - final calendar = CalendarWidget( - dayBuilder: (_, __) => Container(), - fetcher: _FakeFetcher(), - ); - - late StateSetter stateSetter; - - await tester.pumpWidget( - calendarTestApp( - StatefulBuilder( - builder: (context, setState) { - stateSetter = setState; - return Column( - children: [ - SizedBox(height: screenHeight - calendarHeight), - Expanded(child: OverflowBox(maxHeight: calendarHeight, child: calendar)), - ], - ); - }, - ), - ), - ); - await tester.pumpAndSettle(); - - // Tap expand button - await tester.tap(find.byKey(Key('expand-button'))); - await tester.pumpAndSettle(); - - // Should show month - expect(find.byType(CalendarMonth), findsOneWidget); - - // Shrink calendar height and rebuild - calendarHeight = 200; - stateSetter(() {}); - await tester.pumpAndSettle(); - - // Should no longer show month - expect(find.byType(CalendarMonth), findsNothing); - } finally { - // Restore exception handler - FlutterError.onError = onError; - } - }); - }); - - group('Right-to-Left', () { - testWidgetsWithAccessibilityChecks('Swipes to previous week in RTL', (tester) async { - await tester.pumpWidget( - calendarTestApp( - CalendarWidget( - dayBuilder: (_, day) => Container(), - fetcher: _FakeFetcher(), - ), - locale: Locale('ar', 'AR'), - ), - ); - await tester.pumpAndSettle(); - - DateTime targetDate = DateTime(2000, 1, 1); - CalendarWidgetState state = await goToDate(tester, targetDate); - - // 'ar' week should start on Jan 1, 2000 - DateTime weekStart = tester.widget(find.byType(CalendarWeek)).firstDay; - expect(weekStart, DateTime(2000, 1, 1)); - - // Selected day should be Saturday (Jan 1 2000) - expect(state.selectedDay, targetDate); - - // Fling to previous week - await tester.fling(find.byType(CalendarWeek), Offset(-50, 0), 300); - await tester.pumpAndSettle(); - - // Week should now start on Dec 25, 1999 - weekStart = tester.widget(find.byType(CalendarWeek)).firstDay; - expect(weekStart, DateTime(1999, 12, 25)); - - // Selected day should be the same day of the week, Saturday (Dec 25, 1999) - expect(state.selectedDay, DateTime(1999, 12, 25)); - }); - - testWidgetsWithAccessibilityChecks('Swipes to next week in RTL', (tester) async { - await tester.pumpWidget( - calendarTestApp( - CalendarWidget( - dayBuilder: (_, day) => Container(), - fetcher: _FakeFetcher(), - ), - locale: Locale('ar', 'AR'), - ), - ); - await tester.pumpAndSettle(); - - DateTime targetDate = DateTime(2000, 1, 1); - CalendarWidgetState state = await goToDate(tester, targetDate); - - // 'ar' week should start on Jan 1, 2000 - DateTime weekStart = tester.widget(find.byType(CalendarWeek)).firstDay; - expect(weekStart, DateTime(2000, 1, 1)); - - // Selected day should be Saturday (Jan 1 2000) - expect(state.selectedDay, targetDate); - - // Fling to next week - await tester.fling(find.byType(CalendarWeek), Offset(50, 0), 300); - await tester.pumpAndSettle(); - - // Week should now start on Jan 8, 2000 - weekStart = tester.widget(find.byType(CalendarWeek)).firstDay; - expect(weekStart, DateTime(2000, 1, 8)); - - // Selected day should be the same day of the week, Saturday (Jan 8, 2000) - expect(state.selectedDay, DateTime(2000, 1, 8)); - }); - - testWidgetsWithAccessibilityChecks('Swipes to previous month in RTL', (tester) async { - await tester.pumpWidget( - calendarTestApp( - CalendarWidget( - dayBuilder: (_, day) => Container(), - fetcher: _FakeFetcher(), - ), - locale: Locale('ar', 'AR'), - ), - ); - await tester.pumpAndSettle(); - - DateTime targetDate = DateTime(2000, 1, 1); - CalendarWidgetState state = await goToDate(tester, targetDate); - - // Tap expand button - await tester.tap(find.byKey(Key('expand-button'))); - await tester.pumpAndSettle(); - - // Month should be January 2000 - CalendarMonth monthWidget = tester.widget(find.byType(CalendarMonth)); - expect(monthWidget.year, 2000); - expect(monthWidget.month, 1); - - // Selected day should be Jan 1 2000 - expect(state.selectedDay, targetDate); - - // Fling to previous month - await tester.fling(find.byType(CalendarMonth), Offset(-50, 0), 300); - await tester.pumpAndSettle(); - - // Month should be December 1999 - monthWidget = tester.widget(find.byType(CalendarMonth)); - expect(monthWidget.year, 1999); - expect(monthWidget.month, 12); - - // Selected day should be Same day of the month (Dec 1, 1999) - expect(state.selectedDay, DateTime(1999, 12, 1)); - }); - - testWidgetsWithAccessibilityChecks('Swipes to next month in RTL', (tester) async { - await tester.pumpWidget( - calendarTestApp( - CalendarWidget( - dayBuilder: (_, day) => Container(), - fetcher: _FakeFetcher(), - ), - locale: Locale('ar', 'AR'), - ), - ); - await tester.pumpAndSettle(); - - DateTime targetDate = DateTime(2000, 1, 1); - CalendarWidgetState state = await goToDate(tester, targetDate); - - // Tap expand button - await tester.tap(find.byKey(Key('expand-button'))); - await tester.pumpAndSettle(); - - // Month should be January 2000 - CalendarMonth monthWidget = tester.widget(find.byType(CalendarMonth)); - expect(monthWidget.year, 2000); - expect(monthWidget.month, 1); - - // Selected day should be Jan 1 2000 - expect(state.selectedDay, targetDate); - - // Fling to next month - await tester.fling(find.byType(CalendarMonth), Offset(50, 0), 300); - await tester.pumpAndSettle(); - - // Month should be February 2000 - monthWidget = tester.widget(find.byType(CalendarMonth)); - expect(monthWidget.year, 2000); - expect(monthWidget.month, 2); - - // Selected day should be same day of the month (Feb 1, 2000) - expect(state.selectedDay, DateTime(2000, 2, 1)); - }); - - testWidgetsWithAccessibilityChecks('Swipes to select adjacent day in RTL', (tester) async { - DateTime? dateForDayBuilder = null; - final dayContentKey = Key('day-content'); - - await tester.pumpWidget( - calendarTestApp( - CalendarWidget( - dayBuilder: (_, day) { - dateForDayBuilder = day; - return Container(key: dayContentKey); - }, - fetcher: _FakeFetcher(), - ), - locale: Locale('ar', 'AR'), - ), - ); - await tester.pumpAndSettle(); - - await goToDate(tester, DateTime(2000, 1, 1)); - - // Swipe to next day, which should be Jan 2 2000 - await tester.fling(find.byKey(dayContentKey), Offset(50, 0), 300); - await tester.pumpAndSettle(); - - // Day should have built Jan 2 2000 - expect(dateForDayBuilder, DateTime(2000, 1, 2)); - - // Week should start Jan 1 2000 - DateTime weekStart = tester.widget(find.byType(CalendarWeek)).firstDay; - expect(weekStart, DateTime(2000, 1, 1)); - - // Month should be Jan 2000 - final monthWidget = tester.widget(find.byType(CalendarMonth, skipOffstage: false)); - expect(monthWidget.year, 2000); - expect(monthWidget.month, 1); - }); - }); -} - -class _FakeFetcher extends PlannerFetcher { - AsyncSnapshot> nextSnapshot = AsyncSnapshot>.withData(ConnectionState.done, []); - - _FakeFetcher({super.observeeId = '', super.userDomain = '', super.userId = ''}); - - @override - AsyncSnapshot> getSnapshotForDate(DateTime date) => nextSnapshot; -} diff --git a/apps/flutter_parent/test/screens/calendar/planner_fetcher_test.dart b/apps/flutter_parent/test/screens/calendar/planner_fetcher_test.dart deleted file mode 100644 index d4cb21e37b..0000000000 --- a/apps/flutter_parent/test/screens/calendar/planner_fetcher_test.dart +++ /dev/null @@ -1,444 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:built_collection/built_collection.dart'; -import 'package:flutter/cupertino.dart'; -import 'package:flutter_parent/models/calendar_filter.dart'; -import 'package:flutter_parent/models/course.dart'; -import 'package:flutter_parent/models/enrollment.dart'; -import 'package:flutter_parent/models/planner_item.dart'; -import 'package:flutter_parent/models/schedule_item.dart'; -import 'package:flutter_parent/network/api/calendar_events_api.dart'; -import 'package:flutter_parent/screens/calendar/planner_fetcher.dart'; -import 'package:flutter_parent/screens/courses/courses_interactor.dart'; -import 'package:flutter_parent/utils/core_extensions/date_time_extensions.dart'; -import 'package:flutter_parent/utils/db/calendar_filter_db.dart'; -import 'package:mockito/mockito.dart'; -import 'package:test/test.dart'; - -import '../../utils/test_app.dart'; -import '../../utils/test_helpers/mock_helpers.dart'; -import '../../utils/test_helpers/mock_helpers.mocks.dart'; - -void main() { - MockCalendarEventsApi api = MockCalendarEventsApi(); - MockCalendarFilterDb filterDb = MockCalendarFilterDb(); - MockCoursesInteractor interactor = MockCoursesInteractor(); - - final String userDomain = 'user_domain'; - final String userId = 'user_123'; - final String observeeId = 'observee_123'; - final Set contexts = {'course_123'}; - final course = Course((b) => b - ..id = '123' - ..name = 'hodor' - ..enrollments = BuiltList.of([ - Enrollment((enrollment) => enrollment - ..userId = '123' - ..courseId = '123' - ..enrollmentState = 'active') - ]).toBuilder()); - - setupTestLocator((locator) { - locator.registerLazySingleton(() => api); - locator.registerLazySingleton(() => filterDb); - locator.registerFactory(() => interactor); - }); - - setUp(() async { - // Reset APi mock - reset(api); - reset(interactor); - - // Reset db mock - reset(filterDb); - when(filterDb.getByObserveeId(any, any, any)).thenAnswer((_) async { - return CalendarFilter((b) => b - ..userDomain = userDomain - ..userId = userId - ..observeeId = observeeId - ..filters = SetBuilder(contexts)); - }); - - when(interactor.getCourses(isRefresh: anyNamed('isRefresh'))).thenAnswer((_) => Future.value(List.of([course]))); - }); - - test('fetches month for date', () async { - final date = DateTime(2000, 1, 15); // Jan 15 2000 - final fetcher = PlannerFetcher(userId: userId, userDomain: userDomain, observeeId: observeeId, fetchFirst: date); - - fetcher.getSnapshotForDate(date); - await untilCalled( - api.getUserCalendarItems(any, any, any, ScheduleItem.apiTypeAssignment, - contexts: anyNamed('contexts'), forceRefresh: anyNamed('forceRefresh')), - ); - - await untilCalled( - api.getUserCalendarItems(any, any, any, ScheduleItem.apiTypeCalendar, - contexts: anyNamed('contexts'), forceRefresh: anyNamed('forceRefresh')), - ); - - verify( - api.getUserCalendarItems( - observeeId, - DateTime(2000), // Start of day Jan 1 2000 - DateTime(2000, 1, 31, 23, 59, 59, 999), // End of day Jan 31 2000 - ScheduleItem.apiTypeAssignment, - contexts: contexts, - forceRefresh: false, - ), - ); - - verify( - api.getUserCalendarItems( - observeeId, - DateTime(2000), // Start of day Jan 1 2000 - DateTime(2000, 1, 31, 23, 59, 59, 999), // End of day Jan 31 2000 - ScheduleItem.apiTypeCalendar, - contexts: contexts, - forceRefresh: false, - ), - ); - }); - - test('fetches specified fetchFirst date', () async { - final date = DateTime.now(); - final userId = 'user_123'; - final contexts = {'course_123'}; - PlannerFetcher(userId: userId, userDomain: userDomain, observeeId: observeeId, fetchFirst: date); - - await untilCalled( - api.getUserCalendarItems(any, any, any, ScheduleItem.apiTypeAssignment, - contexts: anyNamed('contexts'), forceRefresh: anyNamed('forceRefresh')), - ); - - await untilCalled( - api.getUserCalendarItems(any, any, any, ScheduleItem.apiTypeCalendar, - contexts: anyNamed('contexts'), forceRefresh: anyNamed('forceRefresh')), - ); - - verify( - api.getUserCalendarItems( - observeeId, - date.withStartOfMonth()!, - date.withEndOfMonth()!, - ScheduleItem.apiTypeAssignment, - contexts: contexts, - forceRefresh: false, - ), - ); - - verify( - api.getUserCalendarItems( - observeeId, - date.withStartOfMonth()!, - date.withEndOfMonth()!, - ScheduleItem.apiTypeCalendar, - contexts: contexts, - forceRefresh: false, - ), - ); - }); - - test('does not perform fetch if snapshot exists for day', () { - final date = DateTime.now(); - final fetcher = PlannerFetcher(userId: '', userDomain: userDomain, observeeId: observeeId); - - final expectedSnapshot = AsyncSnapshot>.nothing(); - fetcher.daySnapshots[fetcher.dayKeyForDate(date)] = expectedSnapshot; - - final snapshot = fetcher.getSnapshotForDate(date); - - expect(snapshot, expectedSnapshot); - - verifyNever( - api.getUserCalendarItems( - any, - any, - any, - any, - contexts: anyNamed('contexts'), - forceRefresh: anyNamed('forceRefresh'), - ), - ); - }); - - test('refreshes single day if day has data', () async { - final date = DateTime.now(); - final fetcher = PlannerFetcher(userId: userId, userDomain: userDomain, observeeId: observeeId); - - final existingSnapshot = AsyncSnapshot>.withData(ConnectionState.done, []); - fetcher.daySnapshots[fetcher.dayKeyForDate(date)] = existingSnapshot; - - fetcher.refreshItemsForDate(date); - - await untilCalled( - api.getUserCalendarItems(any, any, any, ScheduleItem.apiTypeAssignment, - contexts: anyNamed('contexts'), forceRefresh: anyNamed('forceRefresh')), - ); - - await untilCalled( - api.getUserCalendarItems(any, any, any, ScheduleItem.apiTypeCalendar, - contexts: anyNamed('contexts'), forceRefresh: anyNamed('forceRefresh')), - ); - - verify( - api.getUserCalendarItems( - observeeId, - date.withStartOfDay()!, - date.withEndOfDay()!, - ScheduleItem.apiTypeAssignment, - contexts: contexts, - forceRefresh: true, - ), - ); - - verify( - api.getUserCalendarItems( - observeeId, - date.withStartOfDay()!, - date.withEndOfDay()!, - ScheduleItem.apiTypeCalendar, - contexts: contexts, - forceRefresh: true, - ), - ); - }); - - test('refreshes single day if day has failed', () async { - final date = DateTime.now(); - final fetcher = PlannerFetcher(userId: userId, userDomain: userDomain, observeeId: observeeId); - - final failedSnapshot = AsyncSnapshot>.withError(ConnectionState.done, Error()); - fetcher.daySnapshots[fetcher.dayKeyForDate(date)] = failedSnapshot; - fetcher.failedMonths[fetcher.monthKeyForDate(date)] = false; - - fetcher.refreshItemsForDate(date); - - await untilCalled( - api.getUserCalendarItems(any, any, any, ScheduleItem.apiTypeAssignment, - contexts: anyNamed('contexts'), forceRefresh: anyNamed('forceRefresh')), - ); - - await untilCalled( - api.getUserCalendarItems(any, any, any, ScheduleItem.apiTypeCalendar, - contexts: anyNamed('contexts'), forceRefresh: anyNamed('forceRefresh')), - ); - - verify( - api.getUserCalendarItems( - observeeId, - date.withStartOfDay()!, - date.withEndOfDay()!, - ScheduleItem.apiTypeAssignment, - contexts: contexts, - forceRefresh: true, - ), - ); - - verify( - api.getUserCalendarItems( - observeeId, - date.withStartOfDay()!, - date.withEndOfDay()!, - ScheduleItem.apiTypeCalendar, - contexts: contexts, - forceRefresh: true, - ), - ); - }); - - test('refreshes entire month if month has failed for day', () async { - final date = DateTime.now(); - final fetcher = PlannerFetcher(userId: userId, userDomain: userDomain, observeeId: observeeId); - - final failedSnapshot = AsyncSnapshot>.withError(ConnectionState.done, Error()); - fetcher.daySnapshots[fetcher.dayKeyForDate(date)] = failedSnapshot; - fetcher.failedMonths[fetcher.monthKeyForDate(date)] = true; - - fetcher.refreshItemsForDate(date); - - await untilCalled( - api.getUserCalendarItems(any, any, any, ScheduleItem.apiTypeAssignment, - contexts: anyNamed('contexts'), forceRefresh: anyNamed('forceRefresh')), - ); - - await untilCalled( - api.getUserCalendarItems(any, any, any, ScheduleItem.apiTypeCalendar, - contexts: anyNamed('contexts'), forceRefresh: anyNamed('forceRefresh')), - ); - - verify( - api.getUserCalendarItems( - observeeId, - date.withStartOfMonth()!, - date.withEndOfMonth()!, - ScheduleItem.apiTypeCalendar, - contexts: contexts, - forceRefresh: true, - ), - ); - - verify( - api.getUserCalendarItems( - observeeId, - date.withStartOfMonth()!, - date.withEndOfMonth()!, - ScheduleItem.apiTypeAssignment, - contexts: contexts, - forceRefresh: true, - ), - ); - }); - - test('sets error snapshot if refresh fails', () async { - final date = DateTime.now(); - final fetcher = PlannerFetcher(userId: userId, userDomain: userDomain, observeeId: observeeId); - - when(api.getUserCalendarItems(any, any, any, any, - contexts: anyNamed('contexts'), forceRefresh: anyNamed('forceRefresh'))) - .thenAnswer((_) async => throw Error); - - final existingSnapshot = AsyncSnapshot>.withData(ConnectionState.done, []); - fetcher.daySnapshots[fetcher.dayKeyForDate(date)] = existingSnapshot; - - await fetcher.refreshItemsForDate(date); - final snapshot = fetcher.getSnapshotForDate(date); - - expect(snapshot.hasError, isTrue); - }); - - test('reset clears data and notifies listeners', () { - final fetcher = PlannerFetcher(userId: userId, userDomain: userDomain, observeeId: observeeId); - fetcher.daySnapshots['ABC'] = null; - fetcher.failedMonths['JAN'] = true; - - int notifyCount = 0; - fetcher.addListener(() { - notifyCount++; - }); - - expect(fetcher.daySnapshots, isNotEmpty); - expect(fetcher.failedMonths, isNotEmpty); - - fetcher.reset(); - - expect(notifyCount, 1); - expect(fetcher.daySnapshots, isEmpty); - expect(fetcher.failedMonths, isEmpty); - }); - - test('setObserveeId resets fetcher and notifies listeners', () { - final fetcher = PlannerFetcher(userId: userId, userDomain: userDomain, observeeId: observeeId); - fetcher.daySnapshots['ABC'] = null; - fetcher.failedMonths['JAN'] = true; - - int notifyCount = 0; - fetcher.addListener(() { - notifyCount++; - }); - - expect(fetcher.observeeId, observeeId); - expect(fetcher.daySnapshots, isNotEmpty); - expect(fetcher.failedMonths, isNotEmpty); - - final newObserveeId = 'new-observee-id'; - fetcher.setObserveeId(newObserveeId); - - expect(notifyCount, 1); - expect(fetcher.observeeId, newObserveeId); - expect(fetcher.daySnapshots, isEmpty); - expect(fetcher.failedMonths, isEmpty); - }); - - test('setContexts calls insertOrUpdate on database, resets fetcher, and notifies listeners', () async { - final fetcher = PlannerFetcher(userId: userId, userDomain: userDomain, observeeId: observeeId); - fetcher.daySnapshots['ABC'] = null; - fetcher.failedMonths['JAN'] = true; - - int notifyCount = 0; - fetcher.addListener(() { - notifyCount++; - }); - - expect(fetcher.observeeId, observeeId); - expect(fetcher.daySnapshots, isNotEmpty); - expect(fetcher.failedMonths, isNotEmpty); - - final newContexts = {'course_123', 'course_456'}; - await fetcher.setContexts(newContexts); - - expect(notifyCount, 1); - expect(fetcher.daySnapshots, isEmpty); - expect(fetcher.failedMonths, isEmpty); - - final expectedFilterData = CalendarFilter((b) => b - ..userDomain = userDomain - ..userId = userId - ..observeeId = observeeId - ..filters = SetBuilder(newContexts)); - verify(filterDb.insertOrUpdate(expectedFilterData)); - }); - - test('getContexts fetches courses and sets courseNameMap', () async { - when(filterDb.getByObserveeId(any, any, any)).thenAnswer((_) => Future.value(null)); - - final fetcher = PlannerFetcher(userId: userId, userDomain: userDomain, observeeId: observeeId); - - final newContexts = await fetcher.getContexts(); - - await untilCalled(interactor.getCourses(isRefresh: anyNamed('isRefresh'))); - - verify(interactor.getCourses(isRefresh: anyNamed('isRefresh'))); - - expect(newContexts, contexts); - expect(fetcher.courseNameMap[observeeId], isNotNull); - expect(fetcher.courseNameMap[observeeId]?[course.id], course.name); - }); - - test('fetchPlannerItems excludes hidden items', () async { - var observeeId = "observee_123"; - var courseId = "456"; - var courseName = "Course 456"; - var now = DateTime.now(); - - var fetcher = PlannerFetcher(userId: "", userDomain: "", observeeId: observeeId); - fetcher.courseNameMap[observeeId] = {}; - fetcher.courseNameMap[observeeId]?[courseId] = courseName; - - var item = ScheduleItem((b) => b - ..title = "Item" - ..contextCode = "course_$courseId" - ..startAt = now); - - var hiddenItem = item.rebuild((b) => b - ..title = 'Hidden Item' - ..isHidden = true); - - when( - api.getUserCalendarItems(any, any, any, ScheduleItem.apiTypeAssignment, - contexts: anyNamed('contexts'), forceRefresh: anyNamed('forceRefresh')), - ).thenAnswer((realInvocation) async => []); - - when( - api.getUserCalendarItems(any, any, any, ScheduleItem.apiTypeCalendar, - contexts: anyNamed('contexts'), forceRefresh: anyNamed('forceRefresh')), - ).thenAnswer((realInvocation) async => [item, hiddenItem]); - - var expected = [item.toPlannerItem(courseName)]; - var actual = await fetcher.fetchPlannerItems(now, now, {}, false); - - expect(actual, expected); - }); -} diff --git a/apps/flutter_parent/test/screens/courses/course_details_interactor_test.dart b/apps/flutter_parent/test/screens/courses/course_details_interactor_test.dart deleted file mode 100644 index aa3f287b29..0000000000 --- a/apps/flutter_parent/test/screens/courses/course_details_interactor_test.dart +++ /dev/null @@ -1,106 +0,0 @@ -// Copyright (C) 2019 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:flutter_parent/network/api/assignment_api.dart'; -import 'package:flutter_parent/network/api/calendar_events_api.dart'; -import 'package:flutter_parent/network/api/course_api.dart'; -import 'package:flutter_parent/network/api/enrollments_api.dart'; -import 'package:flutter_parent/network/api/page_api.dart'; -import 'package:flutter_parent/screens/courses/details/course_details_interactor.dart'; -import 'package:mockito/mockito.dart'; -import 'package:test/test.dart'; - -import '../../utils/test_app.dart'; -import '../../utils/test_helpers/mock_helpers.dart'; -import '../../utils/test_helpers/mock_helpers.mocks.dart'; - -void main() { - final courseId = '123'; - final studentId = '1337'; - final gradingPeriodId = '321'; - - final MockCourseApi courseApi = MockCourseApi(); - final MockAssignmentApi assignmentApi = MockAssignmentApi(); - final enrollmentApi = MockEnrollmentsApi(); - final MockCalendarEventsApi calendarApi = MockCalendarEventsApi(); - final MockPageApi pageApi = MockPageApi(); - - setupTestLocator((locator) { - locator.registerLazySingleton(() => courseApi); - locator.registerLazySingleton(() => assignmentApi); - locator.registerLazySingleton(() => enrollmentApi); - locator.registerLazySingleton(() => calendarApi); - locator.registerLazySingleton(() => pageApi); - }); - - test('load course calls the api', () async { - CourseDetailsInteractor().loadCourse(courseId); - - verify(courseApi.getCourse(courseId)).called(1); - }); - - test('load assignments calls the api', () async { - CourseDetailsInteractor().loadAssignmentGroups(courseId, studentId, gradingPeriodId, forceRefresh: true); - - verify(assignmentApi.getAssignmentGroupsWithSubmissionsDepaginated(courseId, studentId, gradingPeriodId, - forceRefresh: true)) - .called(1); - }); - - test('load grading periods calls the api', () async { - CourseDetailsInteractor().loadGradingPeriods(courseId, forceRefresh: true); - - verify(courseApi.getGradingPeriods(courseId, forceRefresh: true)).called(1); - }); - - test('load enrollments calls the api', () async { - CourseDetailsInteractor().loadEnrollmentsForGradingPeriod(courseId, studentId, gradingPeriodId, forceRefresh: true); - - verify(enrollmentApi.getEnrollmentsByGradingPeriod(courseId, studentId, gradingPeriodId, forceRefresh: true)) - .called(1); - }); - - test('load schedule items calls the API', () async { - CourseDetailsInteractor().loadScheduleItems('123', 'type', true); - - verify( - calendarApi.getAllCalendarEvents( - allEvents: true, - type: 'type', - startDate: null, - endDate: null, - contexts: ['course_123'], - forceRefresh: true, - ), - ); - }); - - test('load home page calls the api', () { - final courseId = '123'; - CourseDetailsInteractor().loadFrontPage(courseId, forceRefresh: true); - verify(pageApi.getCourseFrontPage(courseId, forceRefresh: true)).called(1); - }); - - test('load course tabs calls the api', () { - final courseId = '123'; - CourseDetailsInteractor().loadCourseTabs(courseId, forceRefresh: true); - verify(courseApi.getCourseTabs(courseId, forceRefresh: true)).called(1); - }); - - test('load course settings calls the api', () { - final courseId = '123'; - CourseDetailsInteractor().loadCourseSettings(courseId, forceRefresh: true); - verify(courseApi.getCourseSettings(courseId, forceRefresh: true)).called(1); - }); -} diff --git a/apps/flutter_parent/test/screens/courses/course_details_model_test.dart b/apps/flutter_parent/test/screens/courses/course_details_model_test.dart deleted file mode 100644 index 745f2daf8f..0000000000 --- a/apps/flutter_parent/test/screens/courses/course_details_model_test.dart +++ /dev/null @@ -1,571 +0,0 @@ -// Copyright (C) 2019 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:built_collection/built_collection.dart'; -import 'package:flutter_parent/models/assignment.dart'; -import 'package:flutter_parent/models/assignment_group.dart'; -import 'package:flutter_parent/models/assignment_override.dart'; -import 'package:flutter_parent/models/course.dart'; -import 'package:flutter_parent/models/course_settings.dart'; -import 'package:flutter_parent/models/course_tab.dart'; -import 'package:flutter_parent/models/enrollment.dart'; -import 'package:flutter_parent/models/grading_period.dart'; -import 'package:flutter_parent/models/grading_period_response.dart'; -import 'package:flutter_parent/models/schedule_item.dart'; -import 'package:flutter_parent/models/user.dart'; -import 'package:flutter_parent/screens/courses/details/course_details_interactor.dart'; -import 'package:flutter_parent/screens/courses/details/course_details_model.dart'; -import 'package:mockito/mockito.dart'; -import 'package:test/test.dart'; -import 'package:tuple/tuple.dart'; - -import '../../utils/test_app.dart'; -import '../../utils/test_helpers/mock_helpers.dart'; -import '../../utils/test_helpers/mock_helpers.mocks.dart'; - -const _studentId = '123'; -const _studentName = 'billy jean'; -const _courseId = '321'; - -final _student = User((b) => b - ..id = _studentId - ..name = _studentName); - -final _course = Course((b) => b..id = _courseId); - -void main() { - final interactor = MockCourseDetailsInteractor(); - - setupTestLocator((locator) { - locator.registerFactory(() => interactor); - }); - - setUp(() { - reset(interactor); - }); - - test('constructing with a course updates the course id', () { - final model = CourseDetailsModel.withCourse(_student, _course); - - expect(model.courseId, _courseId); - }); - - group('loadData for course', () { - test('does not refresh course if it has data', () async { - final model = CourseDetailsModel.withCourse(_student, _course); - - await model.loadData(); - - verifyNever(interactor.loadCourse(_courseId)); - expect(model.course, _course); - }); - - test('refreshes course if course refresh forced', () async { - final expected = null; - when(interactor.loadCourse(_courseId, forceRefresh: true)).thenAnswer((_) => Future.value(expected)); - final model = CourseDetailsModel.withCourse(_student, _course); - - await model.loadData(refreshCourse: true); - - verify(interactor.loadCourse(_courseId, forceRefresh: true)).called(1); - expect(model.course, expected); - }); - - test('refreshes course if course is null', () async { - final expected = null; - when(interactor.loadCourse(_courseId)).thenAnswer((_) => Future.value(expected)); - final model = CourseDetailsModel(_student, _courseId); - - await model.loadData(); - - verify(interactor.loadCourse(_courseId)).called(1); - expect(model.course, expected); - }); - - test('sets grading period to enrollments active period', () async { - final gradingPeriodId = '101'; - final enrollment = Enrollment((b) => b - ..enrollmentState = 'active' - ..currentGradingPeriodId = '101' - ..multipleGradingPeriodsEnabled = true - ..userId = _studentId); - final course = _course.rebuild((b) => b..enrollments = ListBuilder([enrollment])); - final model = CourseDetailsModel.withCourse(_student, course); - - await model.loadData(); - await model.loadAssignments(); - - verify(interactor.loadAssignmentGroups(_courseId, _studentId, gradingPeriodId)).called(1); - }); - - test('does not set grading period when enrollment has no active period', () async { - final enrollment = Enrollment((b) => b - ..enrollmentState = 'active' - ..currentGradingPeriodId = null - ..multipleGradingPeriodsEnabled = true - ..userId = _studentId); - final course = _course.rebuild((b) => b..enrollments = ListBuilder([enrollment])); - final model = CourseDetailsModel.withCourse(_student, course); - - await model.loadData(); - await model.loadAssignments(); - - verify(interactor.loadAssignmentGroups(_courseId, _studentId, null)).called(1); - }); - - test('does not set grading period to enrollments active period if already set', () async { - final gradingPeriodId = '101'; - final badGradingPeriodId = '202'; - final enrollment = Enrollment((b) => b - ..enrollmentState = 'active' - ..currentGradingPeriodId = '101' - ..multipleGradingPeriodsEnabled = true - ..userId = _studentId); - final course = _course.rebuild((b) => b..enrollments = ListBuilder([enrollment])); - final model = CourseDetailsModel.withCourse(_student, course); - - when(interactor.loadCourse(_courseId)).thenAnswer((_) async => course.rebuild((b) => - b..enrollments = ListBuilder([enrollment.rebuild((e) => e..currentGradingPeriodId = badGradingPeriodId)]))); - await model.loadData(); - await model.loadData(refreshCourse: true); - await model.loadAssignments(); - - verify(interactor.loadAssignmentGroups(_courseId, _studentId, gradingPeriodId)).called(1); - verifyNever(interactor.loadAssignmentGroups(_courseId, _studentId, badGradingPeriodId)); - }); - }); - - group('loadAssignments', () { - test('returns grade details', () async { - // Initial setup - final termEnrollment = Enrollment((b) => b - ..id = '10' - ..enrollmentState = 'active'); - final gradingPeriods = [ - GradingPeriod((b) => b - ..id = '123' - ..title = 'Grade Period 1') - ]; - final assignmentGroups = [ - AssignmentGroup((b) => b - ..id = '111' - ..name = 'Assignment Group 1') - ]; - - // Mock the data - when(interactor.loadEnrollmentsForGradingPeriod(_courseId, _studentId, null, forceRefresh: false)) - .thenAnswer((_) async => [termEnrollment, termEnrollment.rebuild((b) => b..id = '20')]); - when(interactor.loadGradingPeriods(_courseId)).thenAnswer( - (_) async => GradingPeriodResponse((b) => b..gradingPeriods = BuiltList.of(gradingPeriods).toBuilder())); - when(interactor.loadAssignmentGroups(_courseId, _studentId, null, forceRefresh: false)) - .thenAnswer((_) async => assignmentGroups); - - // Make the call to test - final model = CourseDetailsModel.withCourse(_student, _course); - final gradeDetails = await model.loadAssignments(); - - expect(gradeDetails.termEnrollment, termEnrollment); // Should match only the first enrollment - expect(gradeDetails.gradingPeriods, gradingPeriods); - expect(gradeDetails.assignmentGroups, assignmentGroups); - }); - - test('Does not fail with an empty group response', () async { - // Mock the data with null response - when(interactor.loadAssignmentGroups(_courseId, _studentId, null, forceRefresh: false)) - .thenAnswer((_) async => Future.value(null)); - - // Make the call to test - final model = CourseDetailsModel.withCourse(_student, _course); - var gradeDetails = await model.loadAssignments(); - - expect(gradeDetails.assignmentGroups, null); - - // Test again with empty array - when(interactor.loadAssignmentGroups(_courseId, _studentId, null, forceRefresh: false)) - .thenAnswer((_) async => []); - gradeDetails = await model.loadAssignments(); - - expect(gradeDetails.assignmentGroups, []); - }); - - test('Removes unpublished assignments from assignment groups', () async { - // Init setup - final publishedAssignments = [ - Assignment((b) => b - ..id = '101' - ..courseId = _courseId - ..assignmentGroupId = '111' - ..position = 0 - ..published = true) - ]; - final unpublishedAssignments = [ - Assignment((b) => b - ..id = '102' - ..courseId = _courseId - ..assignmentGroupId = '222' - ..position = 0) - ]; - final publishedGroup = AssignmentGroup((b) => b - ..id = '111' - ..name = 'Group 1' - ..assignments = BuiltList.of(publishedAssignments).toBuilder()); - final unpublishedGroup = AssignmentGroup((b) => b - ..id = '222' - ..name = 'Group 2' - ..assignments = BuiltList.of(unpublishedAssignments).toBuilder()); - - final assignmentGroups = [ - publishedGroup, - unpublishedGroup, - ]; - - // Mock the data with null response - when(interactor.loadAssignmentGroups(_courseId, _studentId, null, forceRefresh: false)) - .thenAnswer((_) async => assignmentGroups); - - // Make the call to test - final model = CourseDetailsModel.withCourse(_student, _course); - final gradeDetails = await model.loadAssignments(); - - expect(gradeDetails.assignmentGroups, [ - publishedGroup, - unpublishedGroup.rebuild((b) => b..assignments = BuiltList.of([]).toBuilder()) - ]); - }); - - test('Updates currentGradingPeriod when load finishes', () async { - // Init setup - final gradingPeriod = GradingPeriod((b) => b - ..id = '1' - ..title = 'Period 1'); - - // Create the model - final model = CourseDetailsModel.withCourse(_student, _course); - - // Update the grading period, but it shouldn't percolate until a load is called - model.updateGradingPeriod(gradingPeriod); - expect(model.currentGradingPeriod(), null); - - await model.loadAssignments(); - expect(model.currentGradingPeriod(), gradingPeriod); - - // Verify the updated grading period was used in api calls - verify(interactor.loadAssignmentGroups(_courseId, _studentId, gradingPeriod.id, forceRefresh: false)).called(1); - verify(interactor.loadEnrollmentsForGradingPeriod(_courseId, _studentId, gradingPeriod.id, forceRefresh: false)) - .called(1); - }); - }); - - group('Load summary items', () { - test('loadSummary calls interactor with correct parameters', () async { - // Mock the data - final itemA = ScheduleItem((s) => s..title = 'A'); - final itemB = ScheduleItem((s) => s..title = 'B'); - - when(interactor.loadScheduleItems(_courseId, ScheduleItem.apiTypeCalendar, any)).thenAnswer((_) async => [itemA]); - when(interactor.loadScheduleItems(_courseId, ScheduleItem.apiTypeAssignment, any)) - .thenAnswer((_) async => [itemB]); - - // Use the model - final model = CourseDetailsModel.withCourse(_student, _course); - - final expected = [itemA, itemB]; - final actual = await model.loadSummary(refresh: true); - - expect(actual, expected); - verify(interactor.loadScheduleItems(_courseId, ScheduleItem.apiTypeCalendar, true)); - verify(interactor.loadScheduleItems(_courseId, ScheduleItem.apiTypeAssignment, true)); - }); - }); - - group('Process summary items', () { - test('processSummaryItems sorts by date', () { - List sourceItems = [ - ScheduleItem((s) => s..startAt = DateTime.now()), - ScheduleItem((s) => s..startAt = DateTime.now().subtract(Duration(days: 2))), - ScheduleItem((s) => s..startAt = DateTime.now().subtract(Duration(days: 1))), - ScheduleItem((s) => s..startAt = DateTime.now().subtract(Duration(days: 3))), - ]; - - var expected = [sourceItems[3], sourceItems[1], sourceItems[2], sourceItems[0]]; - var actual = CourseDetailsModel.processSummaryItems(Tuple2([sourceItems], '')); - - expect(actual, expected); - }); - - test('processSummaryItems sorts by title if items are undated', () { - List sourceItems = [ - ScheduleItem((s) => s..title = 'D'), - ScheduleItem((s) => s..title = 'B'), - ScheduleItem((s) => s..title = 'C'), - ScheduleItem((s) => s..title = 'A'), - ]; - - var expected = [sourceItems[3], sourceItems[1], sourceItems[2], sourceItems[0]]; - var actual = CourseDetailsModel.processSummaryItems(Tuple2([sourceItems], '')); - - expect(actual, expected); - }); - - test('processSummaryItems places undated items at end', () { - List sourceItems = [ - ScheduleItem((s) => s..title = 'C'), - ScheduleItem((s) => s - ..title = 'B' - ..startAt = DateTime.now()), - ScheduleItem((s) => s..title = 'A'), - ScheduleItem((s) => s - ..title = 'D' - ..startAt = DateTime.now().subtract(Duration(days: 1))), - ]; - - var expected = [sourceItems[3], sourceItems[1], sourceItems[2], sourceItems[0]]; - var actual = CourseDetailsModel.processSummaryItems(Tuple2([sourceItems], '')); - - expect(actual, expected); - }); - - test('processSummaryItems combines multiple sources', () { - List sourceItems1 = [ - ScheduleItem((s) => s..title = 'A'), - ScheduleItem((s) => s..title = 'B'), - ]; - List sourceItems2 = [ - ScheduleItem((s) => s..title = 'C'), - ScheduleItem((s) => s..title = 'D'), - ]; - - var expected = [sourceItems1[0], sourceItems1[1], sourceItems2[0], sourceItems2[1]]; - var actual = CourseDetailsModel.processSummaryItems(Tuple2([sourceItems1, sourceItems2], '')); - - expect(actual, expected); - }); - - test('processSummaryItems keeps duplicate item with override that matches student id', () { - String studentId = 'student1'; - List sourceItems = [ - ScheduleItem((s) => s - ..id = 'assignment_a' - ..title = 'A'), - ScheduleItem((s) => s - ..id = 'assignment_a' - ..title = 'A' - ..assignmentOverrides = ListBuilder([ - AssignmentOverride((o) => o..studentIds = ListBuilder([studentId])) - ])), - ScheduleItem((s) => s - ..id = 'assignment_a' - ..title = 'A' - ..assignmentOverrides = ListBuilder([ - AssignmentOverride((o) => o..studentIds = ListBuilder(['student2'])) - ])), - ScheduleItem((s) => s - ..id = 'assignment_b' - ..title = 'B'), - ]; - - var expected = [sourceItems[1], sourceItems[3]]; - var actual = CourseDetailsModel.processSummaryItems(Tuple2([sourceItems], studentId)); - - expect(actual, expected); - }); - - test('processSummaryItems only keeps base item if no overrides match the student id', () { - String studentId = 'student1'; - List sourceItems = [ - ScheduleItem((s) => s - ..id = 'assignment_a' - ..title = 'A'), - ScheduleItem((s) => s - ..id = 'assignment_a' - ..title = 'A' - ..assignmentOverrides = ListBuilder([ - AssignmentOverride((o) => o..studentIds = ListBuilder(['student2'])) - ])), - ScheduleItem((s) => s - ..id = 'assignment_a' - ..title = 'A' - ..assignmentOverrides = ListBuilder([ - AssignmentOverride((o) => o..studentIds = ListBuilder(['student3'])) - ])), - ScheduleItem((s) => s - ..id = 'assignment_b' - ..title = 'B'), - ]; - - var expected = [sourceItems[0], sourceItems[3]]; - var actual = CourseDetailsModel.processSummaryItems(Tuple2([sourceItems], studentId)); - - expect(actual, expected); - }); - }); - - group('tab count', () { - test('returns 1 when no home page or syllabus', () { - final course = _course.rebuild((b) => b - ..syllabusBody = null - ..homePage = null); - final model = CourseDetailsModel.withCourse(_student, course); - - expect(model.tabCount(), 1); - }); - - test('returns 2 when home page is front page', () { - final course = _course.rebuild((b) => b - ..syllabusBody = 'body' - ..homePage = HomePage.wiki); - final model = CourseDetailsModel.withCourse(_student, course); - - expect(model.tabCount(), 2); - }); - - test('returns 3 when home page is syllabus', () { - final course = _course.rebuild((b) => b - ..syllabusBody = 'body' - ..homePage = HomePage.syllabus); - final model = CourseDetailsModel.withCourse(_student, course); - model.courseSettings = CourseSettings((b) => b..courseSummary = true); - - expect(model.tabCount(), 3); - }); - - test('returns 3 when home page is not front page with a valid syllabus', () async { - final course = _course.rebuild((b) => b - ..syllabusBody = 'body' - ..homePage = null); - final model = CourseDetailsModel.withCourse(_student, course); - - when(interactor.loadCourseTabs(_courseId, forceRefresh: true)).thenAnswer((_) async => [ - CourseTab((b) => b..id = HomePage.syllabus.name), - ]); - when(interactor.loadCourseSettings(_courseId, forceRefresh: true)).thenAnswer((_) async { - return CourseSettings((b) => b..courseSummary = true); - }); - await model.loadData(); - - expect(model.tabCount(), 3); - }); - - test('returns 1 when no home page and syllabus tab is not visible', () async { - final course = _course.rebuild((b) => b - ..syllabusBody = 'body' - ..homePage = null); - final model = CourseDetailsModel.withCourse(_student, course); - - when(interactor.loadCourseTabs(_courseId, forceRefresh: true)).thenAnswer((_) async => [ - CourseTab((b) => b..id = HomePage.assignments.name), - ]); - await model.loadData(); - - expect(model.tabCount(), 1); - }); - }); - group('tab visibility', () { - test('returns syllabus and summary if the course has a syllabus home page', () { - final course = _course.rebuild((b) => b - ..syllabusBody = 'body' - ..homePage = HomePage.syllabus); - final model = CourseDetailsModel.withCourse(_student, course); - model.courseSettings = CourseSettings((b) => b..courseSummary = true); - - expect(model.hasHomePageAsSyllabus, true); - expect(model.showSummary, true); - expect(model.hasHomePageAsFrontPage, false); - }); - - test('returns syllabus but no summary summary if summary is disabled in course settings', () { - final course = _course.rebuild((b) => b - ..syllabusBody = 'body' - ..homePage = HomePage.syllabus); - final model = CourseDetailsModel.withCourse(_student, course); - model.courseSettings = CourseSettings((b) => b..courseSummary = false); - - expect(model.hasHomePageAsSyllabus, true); - expect(model.showSummary, false); - expect(model.hasHomePageAsFrontPage, false); - }); - - test('returns syllabus and summary if the course has a syllabus without a home page', () async { - final course = _course.rebuild((b) => b - ..syllabusBody = 'body' - ..homePage = null); - final model = CourseDetailsModel.withCourse(_student, course); - - when(interactor.loadCourseTabs(_courseId, forceRefresh: true)).thenAnswer((_) async => [ - CourseTab((b) => b..id = HomePage.syllabus.name), - ]); - when(interactor.loadCourseSettings(_courseId, forceRefresh: true)).thenAnswer((_) async { - return CourseSettings((b) => b..courseSummary = true); - }); - await model.loadData(); - - expect(model.hasHomePageAsSyllabus, true); - expect(model.showSummary, true); - expect(model.hasHomePageAsFrontPage, false); - }); - - test('returns false for all if the course has a syllabus without a syllabus tab', () async { - final course = _course.rebuild((b) => b - ..syllabusBody = 'body' - ..homePage = null); - final model = CourseDetailsModel.withCourse(_student, course); - - when(interactor.loadCourseTabs(_courseId, forceRefresh: true)).thenAnswer((_) async => []); - await model.loadData(); - - expect(model.hasHomePageAsSyllabus, false); - expect(model.showSummary, false); - expect(model.hasHomePageAsFrontPage, false); - }); - - test('returns front page if the course has a home page page', () { - final course = _course.rebuild((b) => b..homePage = HomePage.wiki); - final model = CourseDetailsModel.withCourse(_student, course); - - expect(model.hasHomePageAsFrontPage, true); - expect(model.hasHomePageAsSyllabus, false); - expect(model.showSummary, false); - }); - - test('returns front page if the course has a home page page and a syllabus', () { - final course = _course.rebuild((b) => b - ..homePage = HomePage.wiki - ..syllabusBody = 'body'); - final model = CourseDetailsModel.withCourse(_student, course); - - expect(model.hasHomePageAsFrontPage, true); - expect(model.hasHomePageAsSyllabus, false); - expect(model.showSummary, false); - }); - - test('returns false for all if the course does not have a home page page nor a syllabus body', () { - final course = _course.rebuild((b) => b - ..homePage = null - ..syllabusBody = null); - final model = CourseDetailsModel.withCourse(_student, course); - - expect(model.hasHomePageAsFrontPage, false); - expect(model.hasHomePageAsSyllabus, false); - expect(model.showSummary, false); - }); - - test('returns false for all if the course is null', () { - final model = CourseDetailsModel(_student, _courseId); - - expect(model.hasHomePageAsFrontPage, false); - expect(model.hasHomePageAsSyllabus, false); - expect(model.showSummary, false); - }); - }); -} diff --git a/apps/flutter_parent/test/screens/courses/course_details_screen_test.dart b/apps/flutter_parent/test/screens/courses/course_details_screen_test.dart deleted file mode 100644 index 99c15a65b8..0000000000 --- a/apps/flutter_parent/test/screens/courses/course_details_screen_test.dart +++ /dev/null @@ -1,466 +0,0 @@ -// Copyright (C) 2019 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'dart:convert'; - -import 'package:flutter/material.dart'; -import 'package:flutter_parent/l10n/app_localizations.dart'; -import 'package:flutter_parent/models/canvas_page.dart'; -import 'package:flutter_parent/models/course.dart'; -import 'package:flutter_parent/models/course_settings.dart'; -import 'package:flutter_parent/models/serializers.dart'; -import 'package:flutter_parent/models/user.dart'; -import 'package:flutter_parent/network/utils/api_prefs.dart'; -import 'package:flutter_parent/screens/courses/details/course_details_interactor.dart'; -import 'package:flutter_parent/screens/courses/details/course_details_screen.dart'; -import 'package:flutter_parent/screens/courses/details/course_front_page_screen.dart'; -import 'package:flutter_parent/screens/courses/details/course_grades_screen.dart'; -import 'package:flutter_parent/screens/courses/details/course_summary_screen.dart'; -import 'package:flutter_parent/screens/courses/details/course_syllabus_screen.dart'; -import 'package:flutter_parent/screens/inbox/create_conversation/create_conversation_interactor.dart'; -import 'package:flutter_parent/screens/inbox/create_conversation/create_conversation_screen.dart'; -import 'package:flutter_parent/utils/common_widgets/web_view/web_content_interactor.dart'; -import 'package:flutter_parent/utils/design/canvas_icons_solid.dart'; -import 'package:flutter_parent/utils/quick_nav.dart'; -import 'package:flutter_test/flutter_test.dart'; -import 'package:mockito/mockito.dart'; - -import '../../utils/accessibility_utils.dart'; -import '../../utils/platform_config.dart'; -import '../../utils/test_app.dart'; -import '../../utils/test_helpers/mock_helpers.mocks.dart'; - -void main() { - final studentId = '123'; - final courseId = '321'; - final studentName = 'Panda'; - final student = User((b) => b - ..id = studentId - ..name = studentName); - - final courseInteractor = MockCourseDetailsInteractor(); - final convoInteractor = MockCreateConversationInteractor(); - - setupTestLocator((_locator) { - _locator.registerFactory(() => courseInteractor); - _locator.registerFactory(() => convoInteractor); - _locator.registerFactory(() => WebContentInteractor()); - - _locator.registerLazySingleton(() => QuickNav()); - }); - - setUp(() async { - await setupPlatformChannels( - config: PlatformConfig( - mockApiPrefs: {ApiPrefs.KEY_CURRENT_STUDENT: json.encode(serialize(student))}, initWebview: true)); - - reset(courseInteractor); - reset(convoInteractor); - }); - - tearDown(() { - ApiPrefs.clean(); - }); - - testWidgetsWithAccessibilityChecks('Shows loading', (tester) async { - await tester.pumpWidget(TestApp(CourseDetailsScreen(courseId))); - await tester.pump(); - - expect(find.byType(CircularProgressIndicator), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('Shows error and can refresh', (tester) async { - when(courseInteractor.loadCourse(courseId)).thenAnswer((_) => Future.error('This is an error')); - - await tester.pumpWidget(TestApp(CourseDetailsScreen(courseId))); - await tester.pump(); // Widget creation - await tester.pump(); // Future resolved - - // Should have the error text - expect(find.text(AppLocalizations().unexpectedError), findsOneWidget); - - // Should have the refresh indicator - final matchedWidget = find.byType(RefreshIndicator); - expect(matchedWidget, findsOneWidget); - - // Try to refresh - await tester.drag(matchedWidget, const Offset(0, 200)); - await tester.pumpAndSettle(); // Loading indicator takes a lot of frames, pump and settle to wait - - // Once for initial load, another for the refresh - verify(courseInteractor.loadCourse(courseId, forceRefresh: anyNamed('forceRefresh'))).called(2); - }); - - testWidgetsWithAccessibilityChecks('Shows course name when given a course', (tester) async { - final course = Course((b) => b - ..id = courseId - ..name = 'Course Name'); - - await tester.pumpWidget(TestApp(CourseDetailsScreen.withCourse(course))); - await tester.pumpAndSettle(); // Widget creation - - expect(find.text(course.name), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('Updates course name', (tester) async { - final course = Course((b) => b - ..id = courseId - ..name = 'Course Name'); - when(courseInteractor.loadCourse(courseId)).thenAnswer((_) => Future.value(course)); - - await tester.pumpWidget(TestApp(CourseDetailsScreen(courseId))); - await tester.pump(); // Widget creation - await tester.pump(); // Future resolved - - expect(find.text(course.name), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('Shows all course tabs with syllabus body', (tester) async { - final course = Course((b) => b - ..id = courseId - ..syllabusBody = 'body' - ..homePage = HomePage.syllabus - ..name = 'Course Name'); - - when(courseInteractor.loadCourseSettings(courseId, forceRefresh: true)).thenAnswer((_) async { - return CourseSettings((b) => b..courseSummary = true); - }); - - await tester.pumpWidget(TestApp(CourseDetailsScreen.withCourse(course))); - await tester.pump(); // Widget creation - await tester.pump(); // Future resolved - - expect(find.text(AppLocalizations().courseGradesLabel.toUpperCase()), findsOneWidget); - expect(find.text(AppLocalizations().courseSyllabusLabel.toUpperCase()), findsOneWidget); - expect(find.text(AppLocalizations().courseSummaryLabel.toUpperCase()), findsOneWidget); - expect(find.byIcon(CanvasIconsSolid.refresh), findsOneWidget); - - expect(find.text(AppLocalizations().courseFrontPageLabel.toUpperCase()), findsNothing); - }); - - testWidgetsWithAccessibilityChecks('Does not show summary tab if summary disable in course settings', (tester) async { - final course = Course((b) => b - ..id = courseId - ..syllabusBody = 'body' - ..homePage = HomePage.syllabus - ..name = 'Course Name'); - - when(courseInteractor.loadCourseSettings(courseId, forceRefresh: true)).thenAnswer((_) async { - return CourseSettings((b) => b..courseSummary = false); - }); - - await tester.pumpWidget(TestApp(CourseDetailsScreen.withCourse(course))); - await tester.pump(); // Widget creation - await tester.pump(); // Future resolved - - expect(find.text(AppLocalizations().courseGradesLabel.toUpperCase()), findsOneWidget); - expect(find.text(AppLocalizations().courseSyllabusLabel.toUpperCase()), findsOneWidget); - expect(find.text(AppLocalizations().courseSummaryLabel.toUpperCase()), findsNothing); - expect(find.byIcon(CanvasIconsSolid.refresh), findsOneWidget); - - expect(find.text(AppLocalizations().courseFrontPageLabel.toUpperCase()), findsNothing); - }); - - testWidgetsWithAccessibilityChecks('Shows course tabs with home page', (tester) async { - final course = Course((b) => b - ..id = courseId - ..homePage = HomePage.wiki - ..name = 'Course Name'); - - await tester.pumpWidget(TestApp(CourseDetailsScreen.withCourse(course))); - await tester.pump(); // Widget creation - await tester.pump(); // Future resolved - - expect(find.text(AppLocalizations().courseGradesLabel.toUpperCase()), findsOneWidget); - expect(find.text(AppLocalizations().courseFrontPageLabel.toUpperCase()), findsOneWidget); - expect(find.byIcon(CanvasIconsSolid.refresh), findsOneWidget); - - expect(find.text(AppLocalizations().courseSummaryLabel.toUpperCase()), findsNothing); - }); - - testWidgetsWithAccessibilityChecks('Shows no tabs when no syllabus and no front page', (tester) async { - await tester.pumpWidget(TestApp(CourseDetailsScreen(courseId))); - await tester.pump(); // Widget creation - await tester.pump(); // Future resolved - - // Should show the view - expect(find.byType(CourseGradesScreen), findsOneWidget); - - // Should not show any tabs - expect(find.text(AppLocalizations().courseGradesLabel.toUpperCase()), findsNothing); - expect(find.text(AppLocalizations().courseSyllabusLabel.toUpperCase()), findsNothing); - expect(find.text(AppLocalizations().courseSummaryLabel.toUpperCase()), findsNothing); - expect(find.byIcon(CanvasIconsSolid.refresh), findsNothing); - }); - - testWidgetsWithAccessibilityChecks('Clicking grades tab shows the grades screen', (tester) async { - final course = Course((b) => b - ..id = courseId - ..syllabusBody = 'hi' - ..homePage = HomePage.syllabus - ..name = 'Course Name'); - - await tester.pumpWidget(TestApp(CourseDetailsScreen.withCourse(course))); - await tester.pump(); // Widget creation - await tester.pump(); // Future resolved - - await tester.tap(find.text(AppLocalizations().courseGradesLabel.toUpperCase())); - await tester.pumpAndSettle(); // Let the screen animate to the tab - - expect(find.byType(CourseGradesScreen), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('Clicking syllabus tab shows the syllabus screen', (tester) async { - final course = Course((b) => b - ..id = courseId - ..syllabusBody = 'hi' - ..homePage = HomePage.syllabus - ..name = 'Course Name'); - - await tester.pumpWidget(TestApp( - CourseDetailsScreen.withCourse(course), - platformConfig: PlatformConfig(initWebview: true), - )); - - await tester.pump(); // Widget creation - await tester.pump(); // Future resolved - - await tester.tap(find.text(AppLocalizations().courseSyllabusLabel.toUpperCase())); - await tester.pumpAndSettle(); // Let the screen animate to the tab - - expect(find.byType(CourseSyllabusScreen), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('Clicking front page tab shows the front page screen', (tester) async { - final course = Course((b) => b - ..id = courseId - ..homePage = HomePage.wiki - ..name = 'Course Name'); - - when(courseInteractor.loadFrontPage(courseId)).thenAnswer((_) async => CanvasPage((b) => b - ..id = '1' - ..body = 'hodor')); - - await tester.pumpWidget(TestApp( - CourseDetailsScreen.withCourse(course), - platformConfig: PlatformConfig(initWebview: true), - )); - - await tester.pump(); // Widget creation - await tester.pump(); // Future resolved - - await tester.tap(find.text(AppLocalizations().courseFrontPageLabel.toUpperCase())); - await tester.pumpAndSettle(); // Let the screen animate to the tab - - expect(find.byType(CourseFrontPageScreen), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('Clicking summary tab shows the summary screen', (tester) async { - final course = Course((b) => b - ..id = courseId - ..syllabusBody = 'hi' - ..homePage = HomePage.syllabus - ..name = 'Course Name'); - - when(courseInteractor.loadCourseSettings(courseId, forceRefresh: true)).thenAnswer((_) async { - return CourseSettings((b) => b..courseSummary = true); - }); - - await tester.pumpWidget(TestApp( - CourseDetailsScreen.withCourse(course), - )); - await tester.pump(); // Widget creation - await tester.pump(); // Future resolved - - await tester.tap(find.text(AppLocalizations().courseSummaryLabel.toUpperCase())); - await tester.pumpAndSettle(); // Let the screen animate to the tab - - expect(find.byType(CourseSummaryScreen), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('Tapping message button while on grades tab shows message screen', (tester) async { - final course = Course((b) => b - ..id = courseId - ..name = 'Course Name' - ..courseCode = '1234'); - - when(courseInteractor.loadCourse(courseId)).thenAnswer((_) => Future.value(course)); - when(convoInteractor.loadData(any, any)).thenAnswer((_) async => CreateConversationData(course, [])); - - String studentName = 'Panda'; - - await tester.pumpWidget(TestApp(CourseDetailsScreen(courseId))); - await tester.pump(); // Widget creation - await tester.pump(); // Future resolved - - // Should show the fab - final matchedWidget = find.byType(FloatingActionButton); - expect(matchedWidget, findsOneWidget); - - // Tap the FAB - await tester.tap(matchedWidget); - await tester.pumpAndSettle(); // Let the new screen create itself - - // Check to make sure we're on the conversation screen - expect(find.byType(CreateConversationScreen), findsOneWidget); - - // Check that we have the correct subject line - expect(find.text(AppLocalizations().gradesSubjectMessage(studentName)), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('Tapping message button while on syllabus tab shows message screen', - (tester) async { - final course = Course((b) => b - ..id = courseId - ..name = 'Course Name' - ..courseCode = '1234' - ..homePage = HomePage.syllabus - ..syllabusBody = 'test'); - - when(courseInteractor.loadCourse(courseId)).thenAnswer((_) => Future.value(course)); - when(convoInteractor.loadData(any, any)).thenAnswer((_) async => CreateConversationData(course, [])); - - String studentName = 'Panda'; - - await tester.pumpWidget(TestApp(CourseDetailsScreen(courseId))); - await tester.pump(); // Widget creation - await tester.pump(); // Future resolved - - // Should show the fab - final matchedWidget = find.byType(FloatingActionButton); - expect(matchedWidget, findsOneWidget); - - // Tap the Syllabus tab - await tester.tap( - find.ancestor(of: find.text(AppLocalizations().courseSyllabusLabel.toUpperCase()), matching: find.byType(Tab))); - await tester.pumpAndSettle(); // Let the screen creation settle - - // Tap the FAB - await tester.tap(matchedWidget); - await tester.pumpAndSettle(); // Let the new screen create itself - - // Check to make sure we're on the conversation screen - expect(find.byType(CreateConversationScreen), findsOneWidget); - - // Check that we have the correct subject line - expect(find.text(AppLocalizations().syllabusSubjectMessage(studentName)), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('Tapping message button while on front page tab shows message screen', - (tester) async { - final course = Course((b) => b - ..id = courseId - ..name = 'Course Name' - ..courseCode = '1234' - ..homePage = HomePage.wiki); - - when(courseInteractor.loadCourse(courseId)).thenAnswer((_) => Future.value(course)); - when(courseInteractor.loadFrontPage(courseId)).thenAnswer((_) async => CanvasPage((b) => b - ..id = '1' - ..body = 'hodor')); - when(convoInteractor.loadData(any, any)).thenAnswer((_) async => CreateConversationData(course, [])); - - String studentName = 'Panda'; - - await tester.pumpWidget(TestApp(CourseDetailsScreen(courseId))); - await tester.pump(); // Widget creation - await tester.pump(); // Future resolved - - // Should show the fab - final matchedWidget = find.byType(FloatingActionButton); - expect(matchedWidget, findsOneWidget); - - // Tap the Front Page tab - await tester.tap(find.ancestor( - of: find.text(AppLocalizations().courseFrontPageLabel.toUpperCase()), matching: find.byType(Tab))); - await tester.pumpAndSettle(); // Let the screen creation settle - - // Tap the FAB - await tester.tap(matchedWidget); - await tester.pumpAndSettle(); // Let the new screen create itself - - // Check to make sure we're on the conversation screen - expect(find.byType(CreateConversationScreen), findsOneWidget); - - // Check that we have the correct subject line - expect(find.text(AppLocalizations().frontPageSubjectMessage(studentName)), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks( - 'Tapping message button after selecting front page tab and then grades tab shows message screen', (tester) async { - final course = Course((b) => b - ..id = courseId - ..name = 'Course Name' - ..courseCode = '1234' - ..homePage = HomePage.wiki); - - when(courseInteractor.loadCourse(courseId)).thenAnswer((_) => Future.value(course)); - when(courseInteractor.loadFrontPage(courseId)).thenAnswer((_) async => CanvasPage((b) => b - ..id = '1' - ..body = 'hodor')); - when(convoInteractor.loadData(any, any)).thenAnswer((_) async => CreateConversationData(course, [])); - - String studentName = 'Panda'; - - await tester.pumpWidget(TestApp(CourseDetailsScreen(courseId))); - await tester.pump(); // Widget creation - await tester.pump(); // Future resolved - - // Should show the fab - final matchedWidget = find.byType(FloatingActionButton); - expect(matchedWidget, findsOneWidget); - - // Tap the Front Page tab - await tester.tap(find.ancestor( - of: find.text(AppLocalizations().courseFrontPageLabel.toUpperCase()), matching: find.byType(Tab))); - await tester.pumpAndSettle(); // Let the screen creation settle - - // Tap back to the grades tab - await tester.tap( - find.ancestor(of: find.text(AppLocalizations().courseGradesLabel.toUpperCase()), matching: find.byType(Tab))); - await tester.pumpAndSettle(); - - // Tap the FAB - await tester.tap(matchedWidget); - await tester.pumpAndSettle(); // Let the new screen create itself - - // Check to make sure we're on the conversation screen - expect(find.byType(CreateConversationScreen), findsOneWidget); - - // Check that we have the correct subject line - expect(find.text(AppLocalizations().gradesSubjectMessage(studentName)), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('Can refresh using app bar button', (tester) async { - final course = Course((b) => b - ..id = courseId - ..homePage = HomePage.wiki - ..name = 'Course Name'); - - when(courseInteractor.loadCourse(courseId, forceRefresh: anyNamed('forceRefresh'))) - .thenAnswer((_) => Future.value(course)); - when(courseInteractor.loadFrontPage(courseId)).thenAnswer((_) async => CanvasPage((b) => b - ..id = '1' - ..body = 'hodor')); - - await tester.pumpWidget(TestApp(CourseDetailsScreen.withCourse(course))); - await tester.pump(); // Widget creation - await tester.pump(); // Future resolved - - await tester.tap(find.byIcon(CanvasIconsSolid.refresh)); - await tester.pumpAndSettle(); - - verify(courseInteractor.loadCourse(courseId, forceRefresh: true)).called(1); // Refresh load - }); -} \ No newline at end of file diff --git a/apps/flutter_parent/test/screens/courses/course_front_page_screen_test.dart b/apps/flutter_parent/test/screens/courses/course_front_page_screen_test.dart deleted file mode 100644 index 35b9cb3cf8..0000000000 --- a/apps/flutter_parent/test/screens/courses/course_front_page_screen_test.dart +++ /dev/null @@ -1,83 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -import 'package:flutter_parent/l10n/app_localizations.dart'; -import 'package:flutter_parent/models/canvas_page.dart'; -import 'package:flutter_parent/screens/courses/details/course_details_interactor.dart'; -import 'package:flutter_parent/screens/courses/details/course_front_page_screen.dart'; -import 'package:flutter_parent/utils/common_widgets/error_panda_widget.dart'; -import 'package:flutter_parent/utils/common_widgets/loading_indicator.dart'; -import 'package:flutter_parent/utils/common_widgets/web_view/web_content_interactor.dart'; -import 'package:flutter_test/flutter_test.dart'; -import 'package:mockito/mockito.dart'; -import 'package:webview_flutter/webview_flutter.dart'; - -import '../../utils/accessibility_utils.dart'; -import '../../utils/platform_config.dart'; -import '../../utils/test_app.dart'; -import '../../utils/test_helpers/mock_helpers.mocks.dart'; - -void main() { - final l10n = AppLocalizations(); - - final _courseId = '123'; - final _page = CanvasPage((b) => b - ..id = '1' - ..body = ''); - final _interactor = MockCourseDetailsInteractor(); - - setupTestLocator((locator) { - locator.registerFactory(() => _interactor); - locator.registerFactory(() => WebContentInteractor()); - }); - - setUp(() { - reset(_interactor); - }); - - testWidgetsWithAccessibilityChecks('shows loading', (tester) async { - await tester.pumpWidget(TestApp(CourseFrontPageScreen(courseId: _courseId))); - await tester.pump(); // Wait for widget to build - - expect(find.byType(LoadingIndicator), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('shows error', (tester) async { - when(_interactor.loadFrontPage(_courseId)) - .thenAnswer((_) => Future.error('Failed to load course home page')); - - await tester.pumpWidget(TestApp(CourseFrontPageScreen(courseId: _courseId))); - await tester.pump(); // Wait for widget to build - await tester.pump(); // Wait for future to finish - - expect(find.byType(ErrorPandaWidget), findsOneWidget); - await tester.tap(find.text(l10n.retry)); - await tester.pump(); - - verify(_interactor.loadFrontPage(_courseId, forceRefresh: true)).called(1); - }); - - testWidgetsWithAccessibilityChecks('shows page content', (tester) async { - when(_interactor.loadFrontPage(_courseId)).thenAnswer((_) async => _page.rebuild((b) => b..body = 'body')); - - await tester.pumpWidget(TestApp( - CourseFrontPageScreen(courseId: _courseId), - platformConfig: PlatformConfig(initWebview: true), - )); - await tester.pump(); // Wait for widget to build - await tester.pump(); // Wait for future to finish - await tester.pump(); // Wait for the webview future to finish - - expect(find.byType(WebView), findsOneWidget); - }); -} \ No newline at end of file diff --git a/apps/flutter_parent/test/screens/courses/course_grades_screen_test.dart b/apps/flutter_parent/test/screens/courses/course_grades_screen_test.dart deleted file mode 100644 index 9ece106217..0000000000 --- a/apps/flutter_parent/test/screens/courses/course_grades_screen_test.dart +++ /dev/null @@ -1,889 +0,0 @@ -// Copyright (C) 2019 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'dart:convert'; - -import 'package:built_collection/built_collection.dart'; -import 'package:built_value/json_object.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_parent/l10n/app_localizations.dart'; -import 'package:flutter_parent/models/assignment.dart'; -import 'package:flutter_parent/models/assignment_group.dart'; -import 'package:flutter_parent/models/course.dart'; -import 'package:flutter_parent/models/course_settings.dart'; -import 'package:flutter_parent/models/enrollment.dart'; -import 'package:flutter_parent/models/grade.dart'; -import 'package:flutter_parent/models/grading_period.dart'; -import 'package:flutter_parent/models/grading_period_response.dart'; -import 'package:flutter_parent/models/serializers.dart'; -import 'package:flutter_parent/models/submission.dart'; -import 'package:flutter_parent/models/submission_wrapper.dart'; -import 'package:flutter_parent/models/user.dart'; -import 'package:flutter_parent/network/utils/api_prefs.dart'; -import 'package:flutter_parent/screens/assignments/assignment_details_interactor.dart'; -import 'package:flutter_parent/screens/assignments/assignment_details_screen.dart'; -import 'package:flutter_parent/screens/courses/details/course_details_interactor.dart'; -import 'package:flutter_parent/screens/courses/details/course_details_model.dart'; -import 'package:flutter_parent/screens/courses/details/course_grades_screen.dart'; -import 'package:flutter_parent/screens/courses/details/grading_period_modal.dart'; -import 'package:flutter_parent/utils/common_widgets/empty_panda_widget.dart'; -import 'package:flutter_parent/utils/common_widgets/error_panda_widget.dart'; -import 'package:flutter_parent/utils/common_widgets/loading_indicator.dart'; -import 'package:flutter_parent/utils/quick_nav.dart'; -import 'package:flutter_test/flutter_test.dart'; -import 'package:mockito/mockito.dart'; -import 'package:provider/provider.dart'; - -import '../../utils/accessibility_utils.dart'; -import '../../utils/platform_config.dart'; -import '../../utils/test_app.dart'; -import '../../utils/test_helpers/mock_helpers.dart'; -import '../../utils/test_helpers/mock_helpers.mocks.dart'; - -const _studentId = '123'; -const _courseId = '321'; -const _assignmentGroupId = '101'; -const _studentName = 'billy jean'; - -final _student = User((b) => b - ..id = _studentId - ..name = _studentName); - -void main() { - final interactor = MockCourseDetailsInteractor(); - - setupTestLocator((locator) { - locator.registerFactory(() => interactor); - locator.registerFactory(() => MockAssignmentDetailsInteractor()); - locator.registerLazySingleton(() => QuickNav()); - }); - - setUp(() { - reset(interactor); - }); - - testWidgetsWithAccessibilityChecks('Can refresh course and group data', (tester) async { - final model = CourseDetailsModel(_student, _courseId); - - // Pump the widget - await tester.pumpWidget(_testableWidget(model)); - await tester.pump(); - - // Should have the refresh indicator - final matchedWidget = find.byType(RefreshIndicator); - expect(matchedWidget, findsOneWidget); - - // Try to refresh - await tester.drag(matchedWidget, const Offset(0, 200)); - await tester.pumpAndSettle(); // Loading indicator takes a lot of frames, pump and settle to wait - - verify(interactor.loadAssignmentGroups(_courseId, _studentId, null, forceRefresh: false)).called(1); - }); - - testWidgetsWithAccessibilityChecks('Shows loading', (tester) async { - final model = CourseDetailsModel(_student, _courseId); - - await tester.pumpWidget(_testableWidget(model)); - await tester.pump(); - - expect(find.byType(LoadingIndicator), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('Shows error', (tester) async { - // Set the future to an error, expecting it to throw an uncaught exception. This expect just prevents the test from - // failing, the exception doesn't break the runtime code. The reason this happens is there are no listeners for the - // 'catchError' on the assignment group future, so flutter calls it 'unhandled' and fails the test even though it - // will still perform the rest of the test. - final model = CourseDetailsModel(_student, _courseId); - when(interactor.loadAssignmentGroups(_courseId, _studentId, null)) - .thenAnswer((_) async => Future>.error('Error getting assignment groups')); - - await tester.pumpWidget(_testableWidget(model)); - await tester.pump(); // Build the widget - await tester.pump(); // Let the future finish - - expect(find.byType(ErrorPandaWidget), findsOneWidget); - await tester.tap(find.text(AppLocalizations().retry)); - await tester.pumpAndSettle(); // Pump and settle since refresh animation - - verify(interactor.loadAssignmentGroups(_courseId, _studentId, null, forceRefresh: true)).called(1); - }); - - // We still want to show the grades page even if we can't get the term enrollment - testWidgetsWithAccessibilityChecks('Does not show error for term enrollment failure', (tester) async { - final model = CourseDetailsModel(_student, _courseId); - when(interactor.loadEnrollmentsForGradingPeriod(_courseId, _studentId, any, forceRefresh: anyNamed('forceRefresh'))) - .thenAnswer((_) async => Future>.error('Error getting term enrollment')); - - await tester.pumpWidget(_testableWidget(model)); - await tester.pump(); // Build the widget - await tester.pump(); // Let the future finish - - expect(find.text(AppLocalizations().noAssignmentsTitle), findsOneWidget); - expect(find.text(AppLocalizations().noAssignmentsMessage), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('Shows empty', (tester) async { - final model = CourseDetailsModel(_student, _courseId); - when(interactor.loadAssignmentGroups(_courseId, _studentId, null)).thenAnswer((_) async => []); - - await tester.pumpWidget(_testableWidget(model)); - await tester.pump(); // Build the widget - await tester.pump(); // Let the future finish - - expect(find.text(AppLocalizations().noAssignmentsTitle), findsOneWidget); - expect(find.text(AppLocalizations().noAssignmentsMessage), findsOneWidget); - }); - - // TODO Fix test - testWidgetsWithAccessibilityChecks('Shows empty with period header', (tester) async { - final model = CourseDetailsModel(_student, _courseId); - - final gradingPeriod = GradingPeriod((b) => b - ..id = '123' - ..title = 'test period'); - final enrollment = Enrollment((b) => b - ..enrollmentState = 'active' - ..grades = _mockGrade(currentScore: 12) - ..multipleGradingPeriodsEnabled = true); - model.updateGradingPeriod(gradingPeriod); - model.course = _mockCourse().rebuild((b) => b..hasGradingPeriods = true); - - // Mock stuff - when(interactor.loadAssignmentGroups(_courseId, _studentId, null)).thenAnswer((_) async => []); - when(interactor.loadGradingPeriods(_courseId)).thenAnswer( - (_) async => GradingPeriodResponse((b) => b..gradingPeriods = BuiltList.of([gradingPeriod]).toBuilder())); - when(interactor.loadEnrollmentsForGradingPeriod(_courseId, _studentId, null)).thenAnswer((_) async => [enrollment]); - - await tester.pumpWidget(_testableWidget(model)); - await tester.pump(); // Build the widget - await tester.pump(); // Let the future finish - - // Verify that we are showing the course grade when not locked - expect(find.text(AppLocalizations().courseTotalGradeLabel), findsOneWidget); - expect(find.text('test period'), findsOneWidget); - - // Verify that we are showing the empty message - expect(find.text(AppLocalizations().noAssignmentsTitle), findsOneWidget); - expect(find.text(AppLocalizations().noAssignmentsMessage), findsOneWidget); - }, skip: true); - - testWidgetsWithAccessibilityChecks('Shows empty without period header', (tester) async { - final model = CourseDetailsModel(_student, _courseId); - - GradingPeriod? gradingPeriod = null; - final enrollment = Enrollment((b) => b - ..enrollmentState = 'active' - ..grades = _mockGrade(currentScore: 12) - ..multipleGradingPeriodsEnabled = true); - model.updateGradingPeriod(gradingPeriod); - model.course = _mockCourse().rebuild((b) => b..hasGradingPeriods = true); - - // Mock stuff - when(interactor.loadAssignmentGroups(_courseId, _studentId, null)).thenAnswer((_) async => []); - when(interactor.loadGradingPeriods(_courseId)).thenAnswer( - (_) async => GradingPeriodResponse((b) => b..gradingPeriods = BuiltList.of([]).toBuilder())); - when(interactor.loadEnrollmentsForGradingPeriod(_courseId, _studentId, null)).thenAnswer((_) async => [enrollment]); - - await tester.pumpWidget(_testableWidget(model)); - await tester.pump(); // Build the widget - await tester.pump(); // Let the future finish - - // Verify that we are showing the course grade when not locked - expect(find.text(AppLocalizations().courseTotalGradeLabel), findsNothing); - expect(find.text('test period'), findsNothing); - - // Verify that we are showing the empty message - expect(find.text(AppLocalizations().noAssignmentsTitle), findsOneWidget); - expect(find.text(AppLocalizations().noAssignmentsMessage), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('Shows data', (tester) async { - final grade = '1'; - final date = DateTime(2000); - final group = _mockAssignmentGroup(assignments: [ - _mockAssignment(dueAt: date), - _mockAssignment(id: '1', pointsPossible: 2.2, submission: _mockSubmission(grade: grade)) - ]); - final enrollment = Enrollment((b) => b..enrollmentState = 'active'); - - final model = CourseDetailsModel(_student, _courseId); - when(interactor.loadAssignmentGroups(_courseId, _studentId, null)).thenAnswer((_) async => [group]); - when(interactor.loadGradingPeriods(_courseId)).thenAnswer( - (_) async => GradingPeriodResponse((b) => b..gradingPeriods = BuiltList.of([]).toBuilder())); - when(interactor.loadEnrollmentsForGradingPeriod(_courseId, _studentId, null)).thenAnswer((_) async => [enrollment]); - model.course = _mockCourse(); - - await tester.pumpWidget(_testableWidget(model)); - await tester.pump(); // Build the widget - await tester.pump(); // Let the future finish - - expect(find.text(AppLocalizations().noGrade), findsOneWidget); - - expect(find.text(group.name), findsOneWidget); - expect(find.text(group.assignments.first.name!), findsOneWidget); - expect(find.text('Due Jan 1 at 12:00 AM'), findsOneWidget); - expect(find.text('- / 0'), findsOneWidget); - - expect(find.text(group.assignments.last.name!), findsOneWidget); - expect(find.text('No Due Date'), findsOneWidget); - expect(find.text('$grade / 2.2'), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('Does not show empty assignment groups', (tester) async { - final groups = [ - _mockAssignmentGroup(), - _mockAssignmentGroup( - assignmentGroupId: _assignmentGroupId + '1', - assignments: [_mockAssignment(groupId: _assignmentGroupId + '1')]), - ]; - final enrollment = Enrollment((b) => b..enrollmentState = 'active'); - - final model = CourseDetailsModel(_student, _courseId); - model.course = _mockCourse(); - when(interactor.loadAssignmentGroups(_courseId, _studentId, null)).thenAnswer((_) async => groups); - when(interactor.loadGradingPeriods(_courseId)).thenAnswer( - (_) async => GradingPeriodResponse((b) => b..gradingPeriods = BuiltList.of([]).toBuilder())); - when(interactor.loadEnrollmentsForGradingPeriod(_courseId, _studentId, null)).thenAnswer((_) async => [enrollment]); - - await tester.pumpWidget(_testableWidget(model)); - await tester.pump(); // Build the widget - await tester.pump(); // Let the future finish - - expect(find.text(groups.first.name), findsNothing); - - expect(find.text(groups.last.name), findsOneWidget); - expect(find.text(groups.last.assignments.first.name!), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('Does not show assignments when group is collapsed', (tester) async { - final groups = [ - _mockAssignmentGroup(assignments: [_mockAssignment()]) - ]; - final enrollment = Enrollment((b) => b..enrollmentState = 'active'); - - final model = CourseDetailsModel(_student, _courseId); - model.course = _mockCourse(); - when(interactor.loadAssignmentGroups(_courseId, _studentId, null)).thenAnswer((_) async => groups); - when(interactor.loadGradingPeriods(_courseId)).thenAnswer( - (_) async => GradingPeriodResponse((b) => b..gradingPeriods = BuiltList.of([]).toBuilder())); - when(interactor.loadEnrollmentsForGradingPeriod(_courseId, _studentId, null)).thenAnswer((_) async => [enrollment]); - - await tester.pumpWidget(_testableWidget(model)); - await tester.pump(); // Build the widget - await tester.pump(); // Let the future finish - - final groupHeader = find.text(groups.first.name); - expect(groupHeader, findsOneWidget); - expect(find.text(groups.first.assignments.first.name!), findsOneWidget); - - await tester.tap(groupHeader); - await tester.pumpAndSettle(); - - expect(find.text(groups.first.assignments.first.name!), findsNothing); - }); - - testWidgetsWithAccessibilityChecks('Shows assignment statuses', (tester) async { - final date = DateTime(2000); - final group = _mockAssignmentGroup(assignments: [ - _mockAssignment(dueAt: date), // Missing - _mockAssignment(id: '1', submission: _mockSubmission(isLate: true)), // Late - _mockAssignment(id: '2', submission: _mockSubmission(submittedAt: date)), // Submitted - _mockAssignment( - id: '2', dueAt: DateTime.now().add(Duration(days: 1)), submission: _mockSubmission()), // Not submitted - ]); - final enrollment = Enrollment((b) => b..enrollmentState = 'active'); - - final model = CourseDetailsModel(_student, _courseId); - when(interactor.loadAssignmentGroups(_courseId, _studentId, null)).thenAnswer((_) async => [group]); - when(interactor.loadGradingPeriods(_courseId)).thenAnswer( - (_) async => GradingPeriodResponse((b) => b..gradingPeriods = BuiltList.of([]).toBuilder())); - when(interactor.loadEnrollmentsForGradingPeriod(_courseId, _studentId, null)).thenAnswer((_) async => [enrollment]); - model.course = _mockCourse(); - - await tester.pumpWidget(_testableWidget(model)); - await tester.pump(); // Build the widget - await tester.pump(); // Let the future finish - - expect(find.text(AppLocalizations().assignmentMissingSubmittedLabel), findsOneWidget); - expect(find.text(AppLocalizations().assignmentLateSubmittedLabel), findsOneWidget); - expect(find.text(AppLocalizations().assignmentSubmittedLabel), findsOneWidget); - expect(find.text(AppLocalizations().assignmentNotSubmittedLabel), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('Shows grade with possible points if not restricted', (tester) async { - final grade = 'FFF'; - final group = _mockAssignmentGroup(assignments: [_mockAssignment(id: '1', pointsPossible: 2.2, submission: _mockSubmission(grade: grade))]); - final enrollment = Enrollment((b) => b..enrollmentState = 'active'); - - final model = CourseDetailsModel(_student, _courseId); - when(interactor.loadAssignmentGroups(_courseId, _studentId, null)).thenAnswer((_) async => [group]); - when(interactor.loadGradingPeriods(_courseId)) - .thenAnswer((_) async => GradingPeriodResponse((b) => b..gradingPeriods = BuiltList.of([]).toBuilder())); - when(interactor.loadEnrollmentsForGradingPeriod(_courseId, _studentId, null)).thenAnswer((_) async => [enrollment]); - model.course = _mockCourse(); - - await tester.pumpWidget(_testableWidget(model)); - await tester.pump(); // Build the widget - await tester.pump(); // Let the future finish - - expect(find.text('$grade / 2.2'), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('Shows grade without possible points if restricted', (tester) async { - final grade = 'FFF'; - final group = _mockAssignmentGroup(assignments: [_mockAssignment(id: '1', pointsPossible: 2.2, submission: _mockSubmission(grade: grade))]); - final enrollment = Enrollment((b) => b..enrollmentState = 'active'); - - final model = CourseDetailsModel(_student, _courseId); - when(interactor.loadAssignmentGroups(_courseId, _studentId, null)).thenAnswer((_) async => [group]); - when(interactor.loadGradingPeriods(_courseId)) - .thenAnswer((_) async => GradingPeriodResponse((b) => b..gradingPeriods = BuiltList.of([]).toBuilder())); - when(interactor.loadEnrollmentsForGradingPeriod(_courseId, _studentId, null)).thenAnswer((_) async => [enrollment]); - model.course = _mockCourse().rebuild((b) => b..settings.restrictQuantitativeData = true); - - await tester.pumpWidget(_testableWidget(model)); - await tester.pump(); // Build the widget - await tester.pump(); // Let the future finish - - expect(find.text('$grade'), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('Shows grade by score and grading scheme if restricted', (tester) async { - final group = _mockAssignmentGroup(assignments: [ - _mockAssignment(id: '1', pointsPossible: 10, gradingType: GradingType.points, submission: _mockSubmission(grade: '', score: 1.0)) - ]); - final enrollment = Enrollment((b) => b..enrollmentState = 'active'); - - final model = CourseDetailsModel(_student, _courseId); - when(interactor.loadAssignmentGroups(_courseId, _studentId, null)).thenAnswer((_) async => [group]); - when(interactor.loadGradingPeriods(_courseId)) - .thenAnswer((_) async => GradingPeriodResponse((b) => b..gradingPeriods = BuiltList.of([]).toBuilder())); - when(interactor.loadEnrollmentsForGradingPeriod(_courseId, _studentId, null)).thenAnswer((_) async => [enrollment]); - model.course = _mockCourse().rebuild((b) => b..settings.restrictQuantitativeData = true); - - await tester.pumpWidget(_testableWidget(model)); - await tester.pump(); // Build the widget - await tester.pump(); // Let the future finish - - expect(find.text('F'), findsOneWidget); - }); - - group('CourseGradeHeader', () { - testWidgetsWithAccessibilityChecks('from current score, max 2 digits', (tester) async { - final groups = [ - _mockAssignmentGroup(assignments: [_mockAssignment()]) - ]; - final enrollment = Enrollment((b) => b - ..enrollmentState = 'active' - ..grades = _mockGrade(currentScore: 1.2345)); - - final model = CourseDetailsModel(_student, _courseId); - model.course = _mockCourse(); - when(interactor.loadAssignmentGroups(_courseId, _studentId, null)).thenAnswer((_) async => groups); - when(interactor.loadGradingPeriods(_courseId)).thenAnswer((_) async => - GradingPeriodResponse((b) => b..gradingPeriods = BuiltList.of([]).toBuilder())); - when(interactor.loadEnrollmentsForGradingPeriod(_courseId, _studentId, null)) - .thenAnswer((_) async => [enrollment]); - - await tester.pumpWidget(_testableWidget(model)); - await tester.pump(); // Build the widget - await tester.pump(); // Let the future finish - - expect(find.text('1.23%'), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('from current grade', (tester) async { - final grade = 'Big fat F'; - final groups = [ - _mockAssignmentGroup(assignments: [_mockAssignment()]) - ]; - final enrollment = Enrollment((b) => b - ..enrollmentState = 'active' - ..grades = _mockGrade(currentGrade: grade)); - final model = CourseDetailsModel(_student, _courseId); - model.course = _mockCourse(); - when(interactor.loadAssignmentGroups(_courseId, _studentId, null)).thenAnswer((_) async => groups); - when(interactor.loadGradingPeriods(_courseId)).thenAnswer((_) async => - GradingPeriodResponse((b) => b..gradingPeriods = BuiltList.of([]).toBuilder())); - when(interactor.loadEnrollmentsForGradingPeriod(_courseId, _studentId, null)) - .thenAnswer((_) async => [enrollment]); - - await tester.pumpWidget(_testableWidget(model)); - await tester.pump(); // Build the widget - await tester.pump(); // Let the future finish - - expect(find.text(grade), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('from current grade and score', (tester) async { - final grade = 'Big fat F'; - final score = 15.15; - final groups = [ - _mockAssignmentGroup(assignments: [_mockAssignment()]) - ]; - final enrollment = Enrollment((b) => b - ..enrollmentState = 'active' - ..grades = _mockGrade(currentScore: score, currentGrade: grade)); - final model = CourseDetailsModel(_student, _courseId); - model.course = _mockCourse(); - when(interactor.loadAssignmentGroups(_courseId, _studentId, null)).thenAnswer((_) async => groups); - when(interactor.loadGradingPeriods(_courseId)).thenAnswer((_) async => - GradingPeriodResponse((b) => b..gradingPeriods = BuiltList.of([]).toBuilder())); - when(interactor.loadEnrollmentsForGradingPeriod(_courseId, _studentId, null)) - .thenAnswer((_) async => [enrollment]); - - await tester.pumpWidget(_testableWidget(model)); - await tester.pump(); // Build the widget - await tester.pump(); // Let the future finish - - expect(find.text("$grade $score%"), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('is not shown when locked', (tester) async { - final groups = [ - _mockAssignmentGroup(assignments: [_mockAssignment()]) - ]; - final enrollment = Enrollment((b) => b - ..enrollmentState = 'active' - ..multipleGradingPeriodsEnabled = true); - final model = CourseDetailsModel(_student, _courseId); - model.course = _mockCourse().rebuild((b) => b..hasGradingPeriods = true); - when(interactor.loadAssignmentGroups(_courseId, _studentId, null)).thenAnswer((_) async => groups); - when(interactor.loadGradingPeriods(_courseId)).thenAnswer((_) async => - GradingPeriodResponse((b) => b..gradingPeriods = BuiltList.of([]).toBuilder())); - when(interactor.loadEnrollmentsForGradingPeriod(_courseId, _studentId, null)) - .thenAnswer((_) async => [enrollment]); - - await tester.pumpWidget(_testableWidget(model)); - await tester.pump(); // Build the widget - await tester.pump(); // Let the future finish - - // Verify that we aren't showing the course grade when locked - expect(find.text(AppLocalizations().courseTotalGradeLabel), findsNothing); - }); - - testWidgetsWithAccessibilityChecks('is not shown when restricted and its a score', (tester) async { - final groups = [ - _mockAssignmentGroup(assignments: [_mockAssignment()]) - ]; - final enrollment = Enrollment((b) => b - ..enrollmentState = 'active' - ..grades = _mockGrade(currentScore: 12)); - final model = CourseDetailsModel(_student, _courseId); - model.course = _mockCourse(); - model.courseSettings = CourseSettings((b) => b..restrictQuantitativeData = true); - when(interactor.loadAssignmentGroups(_courseId, _studentId, null)).thenAnswer((_) async => groups); - when(interactor.loadGradingPeriods(_courseId)) - .thenAnswer((_) async => GradingPeriodResponse((b) => b..gradingPeriods = BuiltList.of([]).toBuilder())); - when(interactor.loadEnrollmentsForGradingPeriod(_courseId, _studentId, null)).thenAnswer((_) async => [enrollment]); - - await tester.pumpWidget(_testableWidget(model)); - await tester.pump(); // Build the widget - await tester.pump(); // Let the future finish - - // Verify that we are not showing the course score if restricted - expect(find.text(AppLocalizations().courseTotalGradeLabel), findsNothing); - }); - - testWidgetsWithAccessibilityChecks('is shown when restricted and its a grade', (tester) async { - final grade = 'Big fat F'; - final groups = [ - _mockAssignmentGroup(assignments: [_mockAssignment()]) - ]; - final enrollment = Enrollment((b) => b - ..enrollmentState = 'active' - ..grades = _mockGrade(currentGrade: grade)); - final model = CourseDetailsModel(_student, _courseId); - model.course = _mockCourse(); - model.courseSettings = CourseSettings((b) => b..restrictQuantitativeData = true); - when(interactor.loadAssignmentGroups(_courseId, _studentId, null)).thenAnswer((_) async => groups); - when(interactor.loadGradingPeriods(_courseId)) - .thenAnswer((_) async => GradingPeriodResponse((b) => b..gradingPeriods = BuiltList.of([]).toBuilder())); - when(interactor.loadEnrollmentsForGradingPeriod(_courseId, _studentId, null)).thenAnswer((_) async => [enrollment]); - - await tester.pumpWidget(_testableWidget(model)); - await tester.pump(); // Build the widget - await tester.pump(); // Let the future finish - - // Verify that we are showing the course grade when restricted - expect(find.text(grade), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('only grade is shown when restricted', (tester) async { - final grade = 'Big fat F'; - final score = 15.15; - final groups = [ - _mockAssignmentGroup(assignments: [_mockAssignment()]) - ]; - final enrollment = Enrollment((b) => b - ..enrollmentState = 'active' - ..grades = _mockGrade(currentScore: score, currentGrade: grade)); - final model = CourseDetailsModel(_student, _courseId); - model.course = _mockCourse(); - model.courseSettings = CourseSettings((b) => b..restrictQuantitativeData = true); - when(interactor.loadAssignmentGroups(_courseId, _studentId, null)).thenAnswer((_) async => groups); - when(interactor.loadGradingPeriods(_courseId)) - .thenAnswer((_) async => GradingPeriodResponse((b) => b..gradingPeriods = BuiltList.of([]).toBuilder())); - when(interactor.loadEnrollmentsForGradingPeriod(_courseId, _studentId, null)).thenAnswer((_) async => [enrollment]); - - await tester.pumpWidget(_testableWidget(model)); - await tester.pump(); // Build the widget - await tester.pump(); // Let the future finish - - // Verify that we are showing the course grade when restricted - expect(find.text(grade), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('is shown when looking at a grading period', (tester) async { - final groups = [ - _mockAssignmentGroup(assignments: [_mockAssignment()]) - ]; - final gradingPeriod = GradingPeriod((b) => b - ..id = '123' - ..title = 'test period'); - final enrollment = Enrollment((b) => b - ..enrollmentState = 'active' - ..grades = _mockGrade(currentScore: 12) - ..multipleGradingPeriodsEnabled = true); - final model = CourseDetailsModel(_student, _courseId); - model.updateGradingPeriod(gradingPeriod); - model.course = _mockCourse().rebuild((b) => b..hasGradingPeriods = true); - - // Mock stuff - when(interactor.loadAssignmentGroups(_courseId, _studentId, gradingPeriod.id)).thenAnswer((_) async => groups); - when(interactor.loadGradingPeriods(_courseId)).thenAnswer( - (_) async => GradingPeriodResponse((b) => b..gradingPeriods = BuiltList.of([gradingPeriod]).toBuilder())); - when(interactor.loadEnrollmentsForGradingPeriod(_courseId, _studentId, null)) - .thenAnswer((_) async => [enrollment]); - - await tester.pumpWidget(_testableWidget(model)); - await tester.pump(); // Build the widget - await tester.pump(); // Let the future finish - - // Verify that we are showing the course grade when not locked - expect(find.text(AppLocalizations().courseTotalGradeLabel), findsOneWidget); - expect(find.text('test period'), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('is shown when looking at all grading periods with an active period set', - (tester) async { - final groups = [ - _mockAssignmentGroup(assignments: [_mockAssignment()]) - ]; - final gradingPeriod = GradingPeriod((b) => b - ..id = null - ..title = 'All Grading Periods'); - final enrollment = Enrollment((b) => b - ..enrollmentState = 'active' - ..role = 'observer' - ..userId = _studentId - ..currentGradingPeriodId = '1212' - ..totalsForAllGradingPeriodsOption = true - ..multipleGradingPeriodsEnabled = true - ..currentPeriodComputedCurrentScore = 12 - ..computedCurrentScore = 1); - final model = CourseDetailsModel(_student, _courseId); - model.updateGradingPeriod(gradingPeriod); - model.course = _mockCourse().rebuild((b) => b - ..hasGradingPeriods = true - ..enrollments = ListBuilder([enrollment])); - - // Mock stuff - when(interactor.loadAssignmentGroups(_courseId, _studentId, gradingPeriod.id)).thenAnswer((_) async => groups); - when(interactor.loadGradingPeriods(_courseId)).thenAnswer( - (_) async => GradingPeriodResponse((b) => b..gradingPeriods = BuiltList.of([gradingPeriod]).toBuilder())); - when(interactor.loadEnrollmentsForGradingPeriod(_courseId, _studentId, null)).thenAnswer((_) async => Future.value(null)); - - await tester.pumpWidget(_testableWidget(model)); - await tester.pump(); // Build the widget - await tester.pump(); // Let the future finish - - // Verify that we are showing the course grade when not locked - expect(find.text(AppLocalizations().courseTotalGradeLabel), findsOneWidget); - expect(find.text('1%'), findsOneWidget); - expect(find.text(AppLocalizations().noGrade), findsNothing); - }); - - testWidgetsWithAccessibilityChecks( - 'is shown when looking at a period with an active period set (given no enrollment response)', (tester) async { - final groups = [ - _mockAssignmentGroup(assignments: [_mockAssignment()]) - ]; - final gradingPeriod = GradingPeriod((b) => b - ..id = '1212' - ..title = 'All Grading Periods'); - final enrollment = Enrollment((b) => b - ..enrollmentState = 'active' - ..role = 'observer' - ..userId = _studentId - ..currentGradingPeriodId = gradingPeriod.id - ..totalsForAllGradingPeriodsOption = true - ..multipleGradingPeriodsEnabled = true - ..currentPeriodComputedCurrentScore = 12 - ..computedCurrentScore = 1); - final model = CourseDetailsModel(_student, _courseId); - model.updateGradingPeriod(gradingPeriod); - model.course = _mockCourse().rebuild((b) => b - ..hasGradingPeriods = true - ..enrollments = ListBuilder([enrollment])); - - // Mock stuff - when(interactor.loadAssignmentGroups(_courseId, _studentId, gradingPeriod.id)).thenAnswer((_) async => groups); - when(interactor.loadGradingPeriods(_courseId)).thenAnswer( - (_) async => GradingPeriodResponse((b) => b..gradingPeriods = BuiltList.of([gradingPeriod]).toBuilder())); - when(interactor.loadEnrollmentsForGradingPeriod(_courseId, _studentId, null)).thenAnswer((_) async => Future.value(null)); - - await tester.pumpWidget(_testableWidget(model)); - await tester.pump(); // Build the widget - await tester.pump(); // Let the future finish - - // Verify that we are showing the course grade when not locked - expect(find.text(AppLocalizations().courseTotalGradeLabel), findsOneWidget); - expect(find.text('12%'), findsOneWidget); - expect(find.text(AppLocalizations().noGrade), findsNothing); - }); - - testWidgetsWithAccessibilityChecks( - 'is not shown when looking at all grading periods with an active period set and final grades hidden', - (tester) async { - final groups = [ - _mockAssignmentGroup(assignments: [_mockAssignment()]) - ]; - final gradingPeriod = GradingPeriod((b) => b - ..id = null - ..title = 'All Grading Periods'); - final enrollment = Enrollment((b) => b - ..enrollmentState = 'active' - ..role = 'observer' - ..userId = _studentId - ..currentGradingPeriodId = '1212' - ..totalsForAllGradingPeriodsOption = true - ..multipleGradingPeriodsEnabled = true - ..currentPeriodComputedCurrentScore = 12 - ..computedCurrentScore = 1); - final model = CourseDetailsModel(_student, _courseId); - model.updateGradingPeriod(gradingPeriod); - model.course = _mockCourse().rebuild((b) => b - ..hasGradingPeriods = true - ..hideFinalGrades = true - ..enrollments = ListBuilder([enrollment])); - - // Mock stuff - when(interactor.loadAssignmentGroups(_courseId, _studentId, gradingPeriod.id)).thenAnswer((_) async => groups); - when(interactor.loadGradingPeriods(_courseId)).thenAnswer( - (_) async => GradingPeriodResponse((b) => b..gradingPeriods = BuiltList.of([gradingPeriod]).toBuilder())); - when(interactor.loadEnrollmentsForGradingPeriod(_courseId, _studentId, null)).thenAnswer((_) async => Future.value(null)); - - await tester.pumpWidget(_testableWidget(model)); - await tester.pump(); // Build the widget - await tester.pump(); // Let the future finish - - // Verify that we are showing the course grade when not locked - expect(find.text(AppLocalizations().courseTotalGradeLabel), findsNothing); - }); - }); - - testWidgetsWithAccessibilityChecks('grading period not shown when not multiple grading periods', (tester) async { - final groups = [ - _mockAssignmentGroup(assignments: [_mockAssignment()]) - ]; - final enrollment = Enrollment((b) => b..enrollmentState = 'active'); - final model = CourseDetailsModel(_student, _courseId); - model.course = _mockCourse(); - when(interactor.loadAssignmentGroups(_courseId, _studentId, null)).thenAnswer((_) async => groups); - when(interactor.loadGradingPeriods(_courseId)).thenAnswer( - (_) async => GradingPeriodResponse((b) => b..gradingPeriods = BuiltList.of([]).toBuilder())); - when(interactor.loadEnrollmentsForGradingPeriod(_courseId, _studentId, null)).thenAnswer((_) async => [enrollment]); - - await tester.pumpWidget(_testableWidget(model)); - await tester.pump(); // Build the widget - await tester.pump(); // Let the future finish - - // Verify that we aren't showing the grading period header when there are no periods - expect(find.text(AppLocalizations().filter), findsNothing); - expect(find.text(AppLocalizations().allGradingPeriods), findsNothing); - }); - - // TODO Fix test - testWidgetsWithAccessibilityChecks( - 'grading period is shown for multiple grading periods when all grading periods is selected and no assignments exist', - (tester) async { - final groups = []; - final gradingPeriod = GradingPeriod((b) => b - ..id = '123' - ..title = 'Other'); - final enrollment = Enrollment((b) => b..enrollmentState = 'active'); - final model = CourseDetailsModel(_student, _courseId); - model.course = _mockCourse(); - when(interactor.loadAssignmentGroups(_courseId, _studentId, null)).thenAnswer((_) async => groups); - when(interactor.loadGradingPeriods(_courseId)).thenAnswer((_) async => - GradingPeriodResponse((b) => b..gradingPeriods = BuiltList.from([gradingPeriod]).toBuilder())); - when(interactor.loadEnrollmentsForGradingPeriod(_courseId, _studentId, null)).thenAnswer((_) async => [enrollment]); - - await tester.pumpWidget(_testableWidget(model)); - await tester.pump(); // Build the widget - await tester.pump(); // Let the future finish - - // Verify that we aren't showing the grading period header when there are no periods - expect(find.byType(EmptyPandaWidget), findsOneWidget); - expect(find.text(AppLocalizations().filter), findsOneWidget); - expect(find.text(AppLocalizations().allGradingPeriods), findsOneWidget); - }, skip: true); - - testWidgetsWithAccessibilityChecks('filter tap shows grading period modal', (tester) async { - final grade = '1'; - final date = DateTime(2000); - final group = _mockAssignmentGroup(assignments: [ - _mockAssignment(dueAt: date), - _mockAssignment(id: '1', pointsPossible: 2.2, submission: _mockSubmission(grade: grade)) - ]); - final enrollment = Enrollment((b) => b..enrollmentState = 'active'); - final gradingPeriods = [GradingPeriod((b) => b..title = 'period 1'), GradingPeriod((b) => b..title = 'period 2')]; - - final model = CourseDetailsModel(_student, _courseId); - when(interactor.loadAssignmentGroups(_courseId, _studentId, null)).thenAnswer((_) async => [group]); - when(interactor.loadGradingPeriods(_courseId)).thenAnswer( - (_) async => GradingPeriodResponse((b) => b..gradingPeriods = BuiltList.of(gradingPeriods).toBuilder())); - when(interactor.loadEnrollmentsForGradingPeriod(_courseId, _studentId, null)).thenAnswer((_) async => [enrollment]); - model.course = _mockCourse(); - - await tester.pumpWidget(_testableWidget(model)); - await tester.pump(); // Build the widget - await tester.pump(); // Let the future finish - - // Expect all grading periods by default - expect(find.text(AppLocalizations().allGradingPeriods), findsOneWidget); - - await tester.tap(find.text(AppLocalizations().filter)); - await tester.pumpAndSettle(); // Wait for the inkwell and the modal showing to finish - - final modal = find.byType(GradingPeriodModal); - expect(modal, findsOneWidget); - expect(find.descendant(of: modal, matching: find.text(AppLocalizations().filterBy)), findsOneWidget); - expect(find.descendant(of: modal, matching: find.text(AppLocalizations().allGradingPeriods)), findsOneWidget); - expect(find.descendant(of: modal, matching: find.text('period 1')), findsOneWidget); - expect(find.descendant(of: modal, matching: find.text('period 2')), findsOneWidget); - - // Tap the new period and assert it's now shown - await tester.tap(find.text('period 1')); - await tester.pumpAndSettle(); - expect(find.text('period 1'), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('Tapping an assignment shows the details screen', (tester) async { - final groups = [ - _mockAssignmentGroup(assignments: [_mockAssignment()]) - ]; - final enrollment = Enrollment((b) => b..enrollmentState = 'active'); - - final model = CourseDetailsModel(_student, _courseId); - model.course = _mockCourse(); - when(interactor.loadAssignmentGroups(_courseId, _studentId, null)).thenAnswer((_) async => groups); - when(interactor.loadGradingPeriods(_courseId)).thenAnswer( - (_) async => GradingPeriodResponse((b) => b..gradingPeriods = BuiltList.of([]).toBuilder())); - when(interactor.loadEnrollmentsForGradingPeriod(_courseId, _studentId, null)).thenAnswer((_) async => [enrollment]); - - await tester.pumpWidget(_testableWidget(model, - platformConfig: - PlatformConfig(mockApiPrefs: {ApiPrefs.KEY_CURRENT_STUDENT: json.encode(serialize(_student))}))); - await tester.pump(); // Build the widget - await tester.pump(); // Let the future finish - - await tester.tap(find.text(groups.first.assignments.first.name!)); - await tester.pump(); // Process the tap - await tester.pump(); // Show the widget - - expect(find.byType(AssignmentDetailsScreen), findsOneWidget); - }); -} - -final _gradingSchemeBuilder = ListBuilder() - ..add(JsonObject(["A", 0.9])) - ..add(JsonObject(["F", 0.0])); - -Course _mockCourse() { - return Course((b) => b - ..id = _courseId - ..courseCode = 'Instructure 101' - ..enrollments = BuiltList.of([ - Enrollment((enrollment) => enrollment - ..userId = _studentId - ..courseId = _courseId - ..enrollmentState = 'active') - ]).toBuilder() - ..gradingScheme = _gradingSchemeBuilder); -} - -GradeBuilder _mockGrade({double? currentScore, double? finalScore, String? currentGrade, String? finalGrade}) { - return GradeBuilder() - ..htmlUrl = '' - ..currentScore = currentScore - ..finalScore = finalScore ?? 0 - ..currentGrade = currentGrade ?? '' - ..finalGrade = finalGrade ?? ''; -} - -AssignmentGroup _mockAssignmentGroup({ - String assignmentGroupId = _assignmentGroupId, - List assignments = const [], -}) { - return AssignmentGroup((b) => b - ..id = assignmentGroupId - ..name = 'Group $assignmentGroupId' - ..position = int.parse(assignmentGroupId) - ..groupWeight = 0 - ..assignments = BuiltList.of(assignments).toBuilder()); -} - -Assignment _mockAssignment({ - String id = '0', - String groupId = _assignmentGroupId, - Submission? submission, - DateTime? dueAt, - double pointsPossible = 0, - GradingType? gradingType -}) { - return Assignment((b) => b - ..id = id - ..name = 'Assignment $id' - ..courseId = _courseId - ..assignmentGroupId = groupId - ..position = int.parse(id) - ..dueAt = dueAt - ..submissionWrapper = - SubmissionWrapper((b) => b..submissionList = BuiltList.from(submission != null ? [submission] : []).toBuilder()).toBuilder() - ..pointsPossible = pointsPossible - ..published = true - ..gradingType = gradingType); -} - -Submission _mockSubmission({String assignmentId = '', String? grade, bool? isLate, DateTime? submittedAt, double? score}) { - return Submission((b) => b - ..userId = _studentId - ..assignmentId = assignmentId - ..grade = grade - ..submittedAt = submittedAt - ..isLate = isLate ?? false - ..score = score ?? 0); -} - -Widget _testableWidget(CourseDetailsModel model, {PlatformConfig platformConfig = const PlatformConfig()}) { - return TestApp( - Scaffold( - body: ChangeNotifierProvider.value(value: model, child: CourseGradesScreen()), - ), - platformConfig: platformConfig, - ); -} diff --git a/apps/flutter_parent/test/screens/courses/course_routing_shell_interactor_test.dart b/apps/flutter_parent/test/screens/courses/course_routing_shell_interactor_test.dart deleted file mode 100644 index 9be603f34f..0000000000 --- a/apps/flutter_parent/test/screens/courses/course_routing_shell_interactor_test.dart +++ /dev/null @@ -1,103 +0,0 @@ -/* - * Copyright (C) 2020 - present Instructure, Inc. - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, version 3 of the License. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -import 'package:flutter_parent/models/canvas_page.dart'; -import 'package:flutter_parent/models/course.dart'; -import 'package:flutter_parent/network/api/course_api.dart'; -import 'package:flutter_parent/network/api/page_api.dart'; -import 'package:flutter_parent/screens/courses/routing_shell/course_routing_shell_interactor.dart'; -import 'package:flutter_parent/screens/courses/routing_shell/course_routing_shell_screen.dart'; -import 'package:mockito/mockito.dart'; -import 'package:test/test.dart'; - -import '../../utils/test_app.dart'; -import '../../utils/test_helpers/mock_helpers.dart'; -import '../../utils/test_helpers/mock_helpers.mocks.dart'; - -void main() { - final mockCourseApi = MockCourseApi(); - final mockPageApi = MockPageApi(); - final interactor = CourseRoutingShellInteractor(); - - final course = Course((b) => b - ..id = '123' - ..name = 'course name' - ..syllabusBody = 'hodor'); - - final page = CanvasPage((b) => b - ..id = '123' - ..body = 'hodor' - ..hideFromStudents = false - ..frontPage = false - ..published = false); - - setupTestLocator((locator) { - locator.registerLazySingleton(() => mockCourseApi); - locator.registerLazySingleton(() => mockPageApi); - }); - - setUp(() { - reset(mockCourseApi); - reset(mockPageApi); - }); - - test('returns valid course and null front page for syllabus type', () async { - when(mockCourseApi.getCourse(any)).thenAnswer((_) => Future.value(course)); - - final result = await interactor.loadCourseShell(CourseShellType.syllabus, course.id); - - expect(result?.frontPage, isNull); - expect(result?.course, isNotNull); - }); - - test('returns error when course syllabus is null for syllabus type', () async { - final courseNullSyllabus = Course((b) => b - ..id = '123' - ..name = 'course name' - ..syllabusBody = null); - - when(mockCourseApi.getCourse(any)).thenAnswer((_) => Future.value(courseNullSyllabus)); - - bool fail = false; - await interactor.loadCourseShell(CourseShellType.syllabus, courseNullSyllabus.id).catchError((_) { - fail = true; - }); - - expect(fail, isTrue); - }); - - test('returns valid course and front page for frontPage type', () async { - when(mockCourseApi.getCourse(any)).thenAnswer((_) => Future.value(course)); - when(mockPageApi.getCourseFrontPage(course.id)).thenAnswer((_) => Future.value(page)); - - final result = await interactor.loadCourseShell(CourseShellType.frontPage, course.id); - - expect(result?.frontPage, isNotNull); - expect(result?.course, isNotNull); - }); - - test('returns error when course front page hass null body for frontPage type', () async { - when(mockCourseApi.getCourse(any)).thenAnswer((_) => Future.value(course)); - when(mockPageApi.getCourseFrontPage(course.id)).thenAnswer((_) => Future.value(null)); - - bool fail = false; - await interactor.loadCourseShell(CourseShellType.frontPage, course.id).catchError((_) { - fail = true; - }); - - expect(fail, isTrue); - }); -} diff --git a/apps/flutter_parent/test/screens/courses/course_routing_shell_screen_test.dart b/apps/flutter_parent/test/screens/courses/course_routing_shell_screen_test.dart deleted file mode 100644 index d578d325d8..0000000000 --- a/apps/flutter_parent/test/screens/courses/course_routing_shell_screen_test.dart +++ /dev/null @@ -1,139 +0,0 @@ -/* - * Copyright (C) 2020 - present Instructure, Inc. - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, version 3 of the License. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -import 'dart:async'; - -import 'package:flutter/material.dart'; -import 'package:flutter_parent/l10n/app_localizations.dart'; -import 'package:flutter_parent/models/canvas_page.dart'; -import 'package:flutter_parent/models/course.dart'; -import 'package:flutter_parent/screens/courses/routing_shell/course_routing_shell_interactor.dart'; -import 'package:flutter_parent/screens/courses/routing_shell/course_routing_shell_screen.dart'; -import 'package:flutter_parent/utils/common_widgets/loading_indicator.dart'; -import 'package:flutter_parent/utils/common_widgets/web_view/canvas_web_view.dart'; -import 'package:flutter_parent/utils/common_widgets/web_view/web_content_interactor.dart'; -import 'package:flutter_test/flutter_test.dart'; -import 'package:mockito/mockito.dart'; - -import '../../utils/accessibility_utils.dart'; -import '../../utils/platform_config.dart'; -import '../../utils/test_app.dart'; -import '../../utils/test_helpers/mock_helpers.dart'; -import '../../utils/test_helpers/mock_helpers.mocks.dart'; - -void main() { - final interactor = MockCourseRoutingShellInteractor(); - - final course = Course((b) => b - ..name = 'course name' - ..syllabusBody = 'hodor syllabus'); - - final page = CanvasPage((b) => b - ..id = '123' - ..body = 'hodor front page' - ..hideFromStudents = false - ..frontPage = true - ..published = true); - - setupTestLocator((locator) { - locator.registerFactory(() => interactor); - locator.registerFactory(() => WebContentInteractor()); - }); - - setUp(() { - reset(interactor); - }); - - testWidgetsWithAccessibilityChecks('syllabus type loads syllabus', (tester) async { - final result = CourseShellData(course); - when(interactor.loadCourseShell(CourseShellType.syllabus, any)).thenAnswer((_) => Future.value(result)); - - await tester.pumpWidget(TestApp(CourseRoutingShellScreen(course.id, CourseShellType.syllabus), - platformConfig: PlatformConfig(initWebview: true))); - await tester.pumpAndSettle(); - - expect(find.text(AppLocalizations().courseSyllabusLabel.toUpperCase()), findsOneWidget); - expect(find.text(course.name), findsOneWidget); - expect(find.byType(CanvasWebView), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('frontPage type loads frontPage', (tester) async { - final result = CourseShellData(course, frontPage: page); - when(interactor.loadCourseShell(CourseShellType.frontPage, any)).thenAnswer((_) => Future.value(result)); - - await tester.pumpWidget(TestApp(CourseRoutingShellScreen(course.id, CourseShellType.frontPage), - platformConfig: PlatformConfig(initWebview: true))); - await tester.pumpAndSettle(); - - expect(find.text(AppLocalizations().courseFrontPageLabel.toUpperCase()), findsOneWidget); - expect(find.text(course.name), findsOneWidget); - expect(find.byType(CanvasWebView), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('loading state displays loading indicator', (tester) async { - Completer completer = Completer(); - when(interactor.loadCourseShell(any, any)).thenAnswer((_) => completer.future); - await tester.pumpWidget(TestApp(CourseRoutingShellScreen(course.id, CourseShellType.syllabus))); - await tester.pump(); - - expect(find.byType(LoadingIndicator), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('Shows error and can refresh', (tester) async { - when(interactor.loadCourseShell(CourseShellType.syllabus, course.id)) - .thenAnswer((_) => Future.error('This is an error')); - - await tester.pumpWidget(TestApp(CourseRoutingShellScreen(course.id, CourseShellType.syllabus))); - await tester.pumpAndSettle(); - - // Should have the error text - expect(find.text(AppLocalizations().unexpectedError), findsOneWidget); - - // Should have the error widgets button for refresh - final matchedWidget = find.byType(TextButton); - expect(matchedWidget, findsOneWidget); - - // Try to refresh - await tester.tap(matchedWidget); - await tester.pumpAndSettle(); - - verify(interactor.loadCourseShell(any, any, forceRefresh: anyNamed('forceRefresh'))).called(2); // Once for initial load, another for the refresh - }); - - testWidgetsWithAccessibilityChecks('Refresh displays loading indicator and loads state', (tester) async { - final result = CourseShellData(course); - when(interactor.loadCourseShell(CourseShellType.syllabus, any, forceRefresh: anyNamed('forceRefresh'))) - .thenAnswer((_) => Future.value(result)); - - await tester.pumpWidget(TestApp(CourseRoutingShellScreen(course.id, CourseShellType.syllabus), - platformConfig: PlatformConfig(initWebview: true))); - await tester.pumpAndSettle(); - - await tester.tap(find.byType(IconButton)); - await tester.pump(); - - expect(find.byType(LoadingIndicator), findsOneWidget); - - await tester.pumpAndSettle(); - - verify(interactor.loadCourseShell(any, any, forceRefresh: true)).called(1); - expect(find.text(AppLocalizations().courseSyllabusLabel.toUpperCase()), findsOneWidget); - expect(find.text(course.name), findsOneWidget); - expect(find.byType(CanvasWebView), findsOneWidget); - expect(find.text(AppLocalizations().unexpectedError), findsNothing); - expect(find.byType(LoadingIndicator), findsNothing); - }); -} diff --git a/apps/flutter_parent/test/screens/courses/course_summary_screen_test.dart b/apps/flutter_parent/test/screens/courses/course_summary_screen_test.dart deleted file mode 100644 index 85f87208f9..0000000000 --- a/apps/flutter_parent/test/screens/courses/course_summary_screen_test.dart +++ /dev/null @@ -1,365 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'dart:async'; -import 'dart:convert'; - -import 'package:built_collection/built_collection.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_parent/l10n/app_localizations.dart'; -import 'package:flutter_parent/models/assignment.dart'; -import 'package:flutter_parent/models/course.dart'; -import 'package:flutter_parent/models/login.dart'; -import 'package:flutter_parent/models/schedule_item.dart'; -import 'package:flutter_parent/models/serializers.dart'; -import 'package:flutter_parent/models/user.dart'; -import 'package:flutter_parent/network/utils/api_prefs.dart'; -import 'package:flutter_parent/screens/assignments/assignment_details_interactor.dart'; -import 'package:flutter_parent/screens/assignments/assignment_details_screen.dart'; -import 'package:flutter_parent/screens/courses/details/course_details_model.dart'; -import 'package:flutter_parent/screens/courses/details/course_summary_screen.dart'; -import 'package:flutter_parent/screens/events/event_details_interactor.dart'; -import 'package:flutter_parent/screens/events/event_details_screen.dart'; -import 'package:flutter_parent/utils/common_widgets/empty_panda_widget.dart'; -import 'package:flutter_parent/utils/common_widgets/error_panda_widget.dart'; -import 'package:flutter_parent/utils/common_widgets/loading_indicator.dart'; -import 'package:flutter_parent/utils/core_extensions/date_time_extensions.dart'; -import 'package:flutter_parent/utils/design/canvas_icons.dart'; -import 'package:flutter_parent/utils/quick_nav.dart'; -import 'package:flutter_test/flutter_test.dart'; -import 'package:mockito/mockito.dart'; -import 'package:provider/provider.dart'; - -import '../../utils/accessibility_utils.dart'; -import '../../utils/canvas_model_utils.dart'; -import '../../utils/platform_config.dart'; -import '../../utils/test_app.dart'; -import '../../utils/test_helpers/mock_helpers.dart'; -import '../../utils/test_helpers/mock_helpers.mocks.dart'; - -final studentId = '1234'; -final studentName = 'billy jean'; - -final login = Login((b) => b - ..domain = 'domain' - ..accessToken = 'token' - ..user = CanvasModelTestUtils.mockUser().toBuilder()); - -final student = User((b) => b - ..id = studentId - ..name = studentName); -AppLocalizations l10n = AppLocalizations(); - -void main() { - tearDown(() { - ApiPrefs.clean(); - }); - - testWidgetsWithAccessibilityChecks('Loads data using model', (tester) async { - final model = MockCourseDetailsModel(); - when(model.loadSummary(refresh: false)).thenAnswer((_) async => []); - - await tester.pumpWidget(_testableWidget(model)); - await tester.pump(); - - verify(model.loadSummary(refresh: false)); - }); - - testWidgetsWithAccessibilityChecks('Displays loading indicator', (tester) async { - final model = MockCourseDetailsModel(); - - Completer> completer = Completer(); - when(model.loadSummary(refresh: false)).thenAnswer((_) => completer.future); - - await tester.pumpWidget(_testableWidget(model)); - await tester.pump(); - - expect(find.byType(LoadingIndicator), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('Displays empty state', (tester) async { - final model = MockCourseDetailsModel(); - when(model.loadSummary(refresh: false)).thenAnswer((_) async => []); - - await tester.pumpWidget(_testableWidget(model)); - await tester.pumpAndSettle(); - - expect(find.byType(EmptyPandaWidget), findsOneWidget); - expect(find.text(l10n.noCourseSummaryTitle), findsOneWidget); - expect(find.text(l10n.noCourseSummaryMessage), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('Displays error state', (tester) async { - final model = MockCourseDetailsModel(); - - when(model.loadSummary(refresh: false)).thenAnswer((_) => Future.error('')); - - await tester.pumpWidget(_testableWidget(model)); - await tester.pumpAndSettle(); - - expect(find.byType(ErrorPandaWidget), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('Refreshes from error state', (tester) async { - final model = MockCourseDetailsModel(); - - when(model.loadSummary(refresh: false)).thenAnswer((_) => Future.error('')); - - await tester.pumpWidget(_testableWidget(model)); - await tester.pumpAndSettle(); - - when(model.loadSummary(refresh: true)).thenAnswer((_) async => []); - - await tester.tap(find.text(l10n.retry)); - await tester.pumpAndSettle(); - - // Should no longer show error widget - expect(find.byType(ErrorPandaWidget), findsNothing); - }); - - testWidgetsWithAccessibilityChecks('Refreshes from empty state', (tester) async { - final model = MockCourseDetailsModel(); - - when(model.loadSummary(refresh: false)).thenAnswer((_) async => []); - - await tester.pumpWidget(_testableWidget(model)); - await tester.pumpAndSettle(); - - when(model.loadSummary(refresh: true)).thenAnswer((_) => Future.error('')); - - await tester.drag(find.byType(RefreshIndicator), Offset(0, 300)); - await tester.pumpAndSettle(); - - // Should now show error widgets and not empty widget - expect(find.byType(EmptyPandaWidget), findsNothing); - expect(find.byType(ErrorPandaWidget), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('Displays details for calendar event', (tester) async { - final model = MockCourseDetailsModel(); - - final event = ScheduleItem((s) => s - ..type = ScheduleItem.apiTypeCalendar - ..title = 'Calendar Event' - ..startAt = DateTime.now()); - when(model.loadSummary(refresh: false)).thenAnswer((_) async => [event]); - - await tester.pumpWidget(_testableWidget(model)); - await tester.pumpAndSettle(); - - expect(find.text(event.title!), findsOneWidget); - expect(find.text(event.startAt.l10nFormat(l10n.dateAtTime)!), findsOneWidget); - expect(find.byIcon(CanvasIcons.calendar_month), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('Displays details for assignment', (tester) async { - final model = MockCourseDetailsModel(); - - final event = ScheduleItem((s) => s - ..type = ScheduleItem.apiTypeAssignment - ..title = 'Normal Assignment' - ..startAt = DateTime.now() - ..assignment = (AssignmentBuilder() - ..id = '' - ..courseId = '' - ..assignmentGroupId = '' - ..position = 0 - ..submissionTypes = ListBuilder([]))); - when(model.loadSummary(refresh: false)).thenAnswer((_) async => [event]); - - await tester.pumpWidget(_testableWidget(model)); - await tester.pumpAndSettle(); - - expect(find.text(event.title!), findsOneWidget); - expect(find.text(event.startAt.l10nFormat(l10n.dateAtTime)!), findsOneWidget); - expect(find.byIcon(CanvasIcons.assignment), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('Displays details for discussion assignment', (tester) async { - final model = MockCourseDetailsModel(); - - final event = ScheduleItem((s) => s - ..type = ScheduleItem.apiTypeAssignment - ..title = 'Discussion Assignment' - ..startAt = DateTime.now() - ..assignment = (AssignmentBuilder() - ..id = '' - ..courseId = '' - ..assignmentGroupId = '' - ..position = 0 - ..submissionTypes = ListBuilder([SubmissionTypes.discussionTopic]))); - when(model.loadSummary(refresh: false)).thenAnswer((_) async => [event]); - - await tester.pumpWidget(_testableWidget(model)); - await tester.pumpAndSettle(); - - expect(find.text(event.title!), findsOneWidget); - expect(find.text(event.startAt.l10nFormat(l10n.dateAtTime)!), findsOneWidget); - expect(find.byIcon(CanvasIcons.discussion), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('Displays details for quiz assignment', (tester) async { - final model = MockCourseDetailsModel(); - - final event = ScheduleItem((s) => s - ..type = ScheduleItem.apiTypeAssignment - ..title = 'Quiz Assignment' - ..startAt = DateTime.now() - ..assignment = (AssignmentBuilder() - ..id = '' - ..courseId = '' - ..assignmentGroupId = '' - ..position = 0 - ..submissionTypes = ListBuilder([SubmissionTypes.onlineQuiz]))); - when(model.loadSummary(refresh: false)).thenAnswer((_) async => [event]); - - await tester.pumpWidget(_testableWidget(model)); - await tester.pumpAndSettle(); - - expect(find.text(event.title!), findsOneWidget); - expect(find.text(event.startAt.l10nFormat(l10n.dateAtTime)!), findsOneWidget); - expect(find.byIcon(CanvasIcons.quiz), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('Displays details for locked assignment', (tester) async { - final model = MockCourseDetailsModel(); - - final event = ScheduleItem((s) => s - ..type = ScheduleItem.apiTypeAssignment - ..title = 'Locked Assignment' - ..startAt = DateTime.now() - ..assignment = (AssignmentBuilder() - ..id = '' - ..courseId = '' - ..assignmentGroupId = '' - ..position = 0 - ..lockedForUser = true - ..submissionTypes = ListBuilder([SubmissionTypes.discussionTopic]))); - when(model.loadSummary(refresh: false)).thenAnswer((_) async => [event]); - - await tester.pumpWidget(_testableWidget(model)); - await tester.pumpAndSettle(); - - expect(find.text(event.title!), findsOneWidget); - expect(find.text(event.startAt.l10nFormat(l10n.dateAtTime)!), findsOneWidget); - expect(find.byIcon(CanvasIcons.lock), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('Displays details for undated assignment', (tester) async { - final model = MockCourseDetailsModel(); - - final event = ScheduleItem((s) => s - ..type = ScheduleItem.apiTypeAssignment - ..title = 'Undated Assignment' - ..startAt = null); - when(model.loadSummary(refresh: false)).thenAnswer((_) async => [event]); - - await tester.pumpWidget(_testableWidget(model)); - await tester.pumpAndSettle(); - - expect(find.text(event.title!), findsOneWidget); - expect(find.text(l10n.noDueDate), findsOneWidget); - expect(find.byIcon(CanvasIcons.assignment), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('Tapping assignment item loads assignment details', (tester) async { - await tester.runAsync(() async { - final event = ScheduleItem((s) - => - s - ..type = ScheduleItem.apiTypeAssignment - ..title = 'Normal Assignment' - ..startAt = DateTime.now() - ..assignment = (AssignmentBuilder() - ..id = 'assignment_123' - ..courseId = '' - ..assignmentGroupId = '' - ..position = 0 - ..submissionTypes = ListBuilder([])) - ); - - final model = MockCourseDetailsModel(); - when(model.courseId).thenReturn('course_123'); - when(model.student).thenReturn(student); - when(model.course).thenReturn(Course((c) => c..courseCode = 'CRS 123')); - when(model.loadSummary(refresh: false)).thenAnswer((_) async => [event]); - - var interactor = MockAssignmentDetailsInteractor(); - setupTestLocator((locator) { - locator.registerFactory(() => interactor); - locator.registerLazySingleton(() => QuickNav()); - }); - when(interactor.loadAssignmentDetails(any, 'course_123', 'assignment_123', studentId)) - .thenAnswer((_) async => Future.value(AssignmentDetails(course: model.course, assignment: event.assignment))); - - var observer = MockNavigatorObserver(); - await tester.pumpWidget(_testableWidget( - model, - observers: [observer], - platformConfig: PlatformConfig( - mockApiPrefs: {ApiPrefs.KEY_CURRENT_STUDENT: json.encode(serialize(student))}, initLoggedInUser: login), - )); - await tester.pump(Duration(seconds: 2)); - await tester.pumpAndSettle(); - - await tester.tap(find.text(event.title!)); - - await tester.pump(Duration(seconds: 2)); - await tester.pump(); - await tester.pump(); - await tester.pumpAndSettle(); - - expect(find.byType(AssignmentDetailsScreen), findsOneWidget); - }); - }); - - testWidgetsWithAccessibilityChecks('Tapping calendar event item loads event details', (tester) async { - final event = ScheduleItem((s) => s - ..type = ScheduleItem.apiTypeCalendar - ..title = 'Normal Event' - ..startAt = DateTime.now()); - - final model = MockCourseDetailsModel(); - when(model.loadSummary(refresh: false)).thenAnswer((_) async => [event]); - when(model.student).thenAnswer((_) => student); - - var interactor = MockEventDetailsInteractor(); - setupTestLocator((locator) { - locator.registerFactory(() => interactor); - locator.registerLazySingleton(() => QuickNav()); - }); - - await tester.pumpWidget(_testableWidget(model)); - await tester.pumpAndSettle(); - - await tester.tap(find.text(event.title!)); - - await tester.pump(); - await tester.pump(); - - expect(find.byType(EventDetailsScreen), findsOneWidget); - }); -} - -Widget _testableWidget(CourseDetailsModel model, - {List observers = const [], PlatformConfig platformConfig = const PlatformConfig()}) { - return TestApp( - Scaffold( - body: ChangeNotifierProvider.value(value: model, child: CourseSummaryScreen()), - ), - platformConfig: PlatformConfig( - mockApiPrefs: {ApiPrefs.KEY_CURRENT_STUDENT: json.encode(serialize(student))}, initLoggedInUser: login), - navigatorObservers: observers, - ); -} diff --git a/apps/flutter_parent/test/screens/courses/courses_interactor_test.dart b/apps/flutter_parent/test/screens/courses/courses_interactor_test.dart deleted file mode 100644 index 819135e45a..0000000000 --- a/apps/flutter_parent/test/screens/courses/courses_interactor_test.dart +++ /dev/null @@ -1,116 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'dart:convert'; - -import 'package:built_collection/built_collection.dart'; -import 'package:flutter_parent/models/course.dart'; -import 'package:flutter_parent/models/enrollment.dart'; -import 'package:flutter_parent/models/serializers.dart'; -import 'package:flutter_parent/models/user.dart'; -import 'package:flutter_parent/network/api/course_api.dart'; -import 'package:flutter_parent/network/utils/api_prefs.dart'; -import 'package:flutter_parent/screens/courses/courses_interactor.dart'; -import 'package:mockito/mockito.dart'; -import 'package:test/test.dart'; - -import '../../utils/platform_config.dart'; -import '../../utils/test_app.dart'; -import '../../utils/test_helpers/mock_helpers.dart'; -import '../../utils/test_helpers/mock_helpers.mocks.dart'; - -void main() { - final _api = MockCourseApi(); - - final _studentId = '123'; - final _invalidStudentId = '789'; - - final _futureDate = DateTime.now().add(Duration(days: 10)); - final _pastDate = DateTime.now().subtract(Duration(days: 10)); - - var _student = User((b) => b - ..id = _studentId - ..name = 'UserName' - ..sortableName = 'Sortable Name' - ..build()); - - final _enrollment = Enrollment((b) => b - ..enrollmentState = 'active' - ..userId = _studentId); - - final _invalidEnrollment = Enrollment((b) => b - ..enrollmentState = 'active' - ..userId = _invalidStudentId); - - final _course = Course((b) => b - ..id = 'course_123' - ..accessRestrictedByDate = false - ..restrictEnrollmentsToCourseDates = true - ..endAt = _futureDate - ..enrollments = ListBuilder([_enrollment])); - - final _invalidCourse = Course((b) => b - ..id = 'course_456' - ..accessRestrictedByDate = false - ..restrictEnrollmentsToCourseDates = true - ..endAt = _futureDate - ..enrollments = ListBuilder([_invalidEnrollment])); - - setupTestLocator((locator) { - locator.registerLazySingleton(() => _api); - }); - - setUp(() async { - reset(_api); - await setupPlatformChannels( - config: PlatformConfig(mockApiPrefs: {ApiPrefs.KEY_CURRENT_STUDENT: json.encode(serialize(_student))})); - }); - - test('getCourses calls API', () async { - when(_api.getObserveeCourses(forceRefresh: true)).thenAnswer((_) async => []); - - await CoursesInteractor().getCourses(isRefresh: true, studentId: null); - - verify(_api.getObserveeCourses(forceRefresh: true)); - }); - - test('getCourses returns only courses for ApiPrefs.currentStudent.id and is valid', () async { - when(_api.getObserveeCourses(forceRefresh: true)).thenAnswer((_) async => [_course, _invalidCourse]); - - final result = await CoursesInteractor().getCourses(isRefresh: true, studentId: null); - - verify(_api.getObserveeCourses(forceRefresh: true)); - expect(result?.length, 1); - expect(result?.first.id, _course.id); - }); - - test('getCourses returns only courses for studentId parameter and is valid', () async { - when(_api.getObserveeCourses(forceRefresh: true)).thenAnswer((_) async => [_course, _invalidCourse]); - - final result = await CoursesInteractor().getCourses(isRefresh: true, studentId: _invalidStudentId); - - verify(_api.getObserveeCourses(forceRefresh: true)); - expect(result?.length, 1); - expect(result?.first.id, _invalidCourse.id); - }); - - test('getCourses returns no courses for invalid studentId but valid dates', () async { - when(_api.getObserveeCourses(forceRefresh: true)).thenAnswer((_) async => [_invalidCourse]); - - final result = await CoursesInteractor().getCourses(isRefresh: true, studentId: _studentId); - - verify(_api.getObserveeCourses(forceRefresh: true)); - expect(result, isEmpty); - }); -} diff --git a/apps/flutter_parent/test/screens/courses/courses_screen_test.dart b/apps/flutter_parent/test/screens/courses/courses_screen_test.dart deleted file mode 100644 index 6dde78c2a0..0000000000 --- a/apps/flutter_parent/test/screens/courses/courses_screen_test.dart +++ /dev/null @@ -1,415 +0,0 @@ -// Copyright (C) 2019 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'dart:convert'; - -import 'package:built_collection/built_collection.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_parent/l10n/app_localizations.dart'; -import 'package:flutter_parent/models/course.dart'; -import 'package:flutter_parent/models/enrollment.dart'; -import 'package:flutter_parent/models/serializers.dart'; -import 'package:flutter_parent/models/user.dart'; -import 'package:flutter_parent/network/api/assignment_api.dart'; -import 'package:flutter_parent/network/api/course_api.dart'; -import 'package:flutter_parent/network/utils/analytics.dart'; -import 'package:flutter_parent/network/utils/api_prefs.dart'; -import 'package:flutter_parent/screens/courses/courses_interactor.dart'; -import 'package:flutter_parent/screens/courses/courses_screen.dart'; -import 'package:flutter_parent/screens/courses/details/course_details_interactor.dart'; -import 'package:flutter_parent/screens/courses/details/course_details_screen.dart'; -import 'package:flutter_parent/screens/dashboard/alert_notifier.dart'; -import 'package:flutter_parent/screens/dashboard/selected_student_notifier.dart'; -import 'package:flutter_parent/utils/common_widgets/empty_panda_widget.dart'; -import 'package:flutter_parent/utils/common_widgets/error_panda_widget.dart'; -import 'package:flutter_parent/utils/quick_nav.dart'; -import 'package:flutter_test/flutter_test.dart'; -import 'package:mockito/mockito.dart'; -import 'package:provider/provider.dart'; - -import '../../utils/accessibility_utils.dart'; -import '../../utils/platform_config.dart'; -import '../../utils/test_app.dart'; -import '../../utils/test_helpers/mock_helpers.mocks.dart'; - -void main() { - AppLocalizations l10n = AppLocalizations(); - - _setupLocator(CoursesInteractor mockInteractor, {SelectedStudentNotifier? notifier}) { - setupTestLocator((locator) { - locator.registerFactory(() => mockInteractor); - locator.registerFactory(() => _MockCourseDetailsInteractor()); - locator.registerFactory(() => MockAssignmentApi()); - locator.registerFactory(() => MockCourseApi()); - locator.registerFactory(() => QuickNav()); - locator.registerLazySingleton(() => Analytics()); - - locator.registerLazySingleton(() => notifier ?? SelectedStudentNotifier()); - locator.registerLazySingleton(() => _MockAlertCountNotifier()); - }); - } - - Widget _testableMaterialWidget({Widget? widget, SelectedStudentNotifier? notifier = null}) => TestApp( - ChangeNotifierProvider( - create: (context) => notifier ?? SelectedStudentNotifier() - ..value = _mockStudent('1'), - child: Consumer( - builder: (context, model, _) { - return Scaffold(body: widget ?? CoursesScreen()); - }, - )), - ); - - group('Render', () { - testWidgetsWithAccessibilityChecks('shows loading indicator when retrieving courses', (tester) async { - _setupLocator(_MockedCoursesInteractor()); - - await tester.pumpWidget(_testableMaterialWidget()); - await tester.pump(); - - final loadingWidget = find.byType(CircularProgressIndicator); - expect(loadingWidget, findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('does not show loading when courses are loaded', (tester) async { - var student = _mockStudent('1'); - var courses = generateCoursesForStudent(student.id); - - _setupLocator(_MockedCoursesInteractor(courses: courses)); - - await tester.pumpWidget(_testableMaterialWidget()); - await tester.pumpAndSettle(); - - final loadingWidget = find.byType(CircularProgressIndicator); - expect(loadingWidget, findsNothing); - }); - - testWidgetsWithAccessibilityChecks('shows courses after load', (tester) async { - var student = _mockStudent('1'); - var courses = generateCoursesForStudent(student.id); - - _setupLocator(_MockedCoursesInteractor(courses: courses)); - - await tester.pumpWidget(_testableMaterialWidget()); - await tester.pumpAndSettle(); - - final listTileWidget = find.byType(ListTile); - expect(listTileWidget, findsNWidgets(courses.length)); - }); - - testWidgetsWithAccessibilityChecks('shows empty message after load', (tester) async { - _setupLocator(_MockedCoursesInteractor(courses: [])); - - await tester.pumpWidget(_testableMaterialWidget()); - await tester.pumpAndSettle(); - - expect(find.text(l10n.noCoursesTitle), findsOneWidget); - expect(find.text(l10n.noCoursesMessage), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('Shows error state and performs refresh', (tester) async { - var interactor = _MockedCoursesInteractor(courses: []); - - _setupLocator(interactor); - - interactor.error = true; - - await tester.pumpWidget(_testableMaterialWidget()); - await tester.pumpAndSettle(); - - expect(find.byType(ErrorPandaWidget), findsOneWidget); - expect(find.text(l10n.errorLoadingCourses), findsOneWidget); - - interactor.error = false; - await tester.tap(find.text(l10n.retry)); - await tester.pumpAndSettle(); - - expect(find.text(l10n.noCoursesTitle), findsOneWidget); - expect(find.text(l10n.noCoursesMessage), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('shows no grade if there is no current grade', (tester) async { - var student = _mockStudent('1'); - var courses = generateCoursesForStudent(student.id); - - _setupLocator(_MockedCoursesInteractor(courses: courses)); - - await tester.pumpWidget(_testableMaterialWidget()); - await tester.pumpAndSettle(); - - final gradeWidget = find.text(l10n.noGrade); - expect(gradeWidget, findsNWidgets(courses.length)); - }); - - testWidgetsWithAccessibilityChecks('shows grade if there is a current grade', (tester) async { - var student = _mockStudent('1'); - var courses = List.generate( - 1, - (idx) => _mockCourse( - idx.toString(), - enrollments: ListBuilder( - [_mockEnrollment(idx.toString(), userId: student.id, computedCurrentGrade: 'A')], - ), - ), - ); - - _setupLocator(_MockedCoursesInteractor(courses: courses)); - - await tester.pumpWidget(_testableMaterialWidget()); - await tester.pumpAndSettle(); - - final gradeWidget = find.text('A'); - expect(gradeWidget, findsNWidgets(courses.length)); - }); - - testWidgetsWithAccessibilityChecks('shows grade and score if there is a current grade and score', (tester) async { - var student = _mockStudent('1'); - var courses = List.generate( - 1, - (idx) => _mockCourse( - idx.toString(), - enrollments: ListBuilder( - [_mockEnrollment(idx.toString(), userId: student.id, computedCurrentGrade: 'A', computedCurrentScore: 75)], - ), - ), - ); - - _setupLocator(_MockedCoursesInteractor(courses: courses)); - - await tester.pumpWidget(_testableMaterialWidget()); - await tester.pumpAndSettle(); - - final gradeWidget = find.text('A 75%'); - expect(gradeWidget, findsNWidgets(courses.length)); - }); - - testWidgetsWithAccessibilityChecks('shows grade only if there is a current grade and score and restricted', (tester) async { - var student = _mockStudent('1'); - var courses = List.generate( - 1, - (idx) => _mockCourse( - idx.toString(), - enrollments: ListBuilder( - [_mockEnrollment(idx.toString(), userId: student.id, computedCurrentGrade: 'A', computedCurrentScore: 75)], - ), - ).rebuild((b) => b..settings = (b.settings..restrictQuantitativeData = true)), - ); - - _setupLocator(_MockedCoursesInteractor(courses: courses)); - - await tester.pumpWidget(_testableMaterialWidget()); - await tester.pumpAndSettle(); - - final gradeWidget = find.text('A'); - expect(gradeWidget, findsNWidgets(courses.length)); - }); - - testWidgetsWithAccessibilityChecks('shows score if there is a grade but no grade string', (tester) async { - var student = _mockStudent('1'); - var courses = List.generate( - 1, - (idx) => _mockCourse( - idx.toString(), - enrollments: ListBuilder( - [_mockEnrollment(idx.toString(), userId: student.id, computedCurrentScore: 90)], - ), - ), - ); - - _setupLocator(_MockedCoursesInteractor(courses: courses)); - - await tester.pumpWidget(_testableMaterialWidget()); - await tester.pumpAndSettle(); - - final gradeWidget = find.text('90%'); - expect(gradeWidget, findsNWidgets(courses.length)); - }); - - testWidgetsWithAccessibilityChecks('hides score if there is a grade but no grade string and score is restricted', (tester) async { - var student = _mockStudent('1'); - var courses = List.generate( - 1, - (idx) => _mockCourse( - idx.toString(), - enrollments: ListBuilder( - [_mockEnrollment(idx.toString(), userId: student.id, computedCurrentScore: 90)], - ), - ).rebuild((b) => b..settings = (b.settings..restrictQuantitativeData = true)), - ); - - _setupLocator(_MockedCoursesInteractor(courses: courses)); - - await tester.pumpWidget(_testableMaterialWidget()); - await tester.pumpAndSettle(); - - final gradeWidget = find.text('90%'); - expect(gradeWidget, findsNothing); - }); - - testWidgetsWithAccessibilityChecks('shows score if there is a grade but no grade string and score is not restricted', (tester) async { - var student = _mockStudent('1'); - var courses = List.generate( - 1, - (idx) => _mockCourse( - idx.toString(), - enrollments: ListBuilder( - [_mockEnrollment(idx.toString(), userId: student.id, computedCurrentScore: 90)], - ), - ).rebuild((b) => b..settings = (b.settings..restrictQuantitativeData = false)), - ); - - _setupLocator(_MockedCoursesInteractor(courses: courses)); - - await tester.pumpWidget(_testableMaterialWidget()); - await tester.pumpAndSettle(); - - final gradeWidget = find.text('90%'); - expect(gradeWidget, findsNWidgets(courses.length)); - }); - - testWidgetsWithAccessibilityChecks('shows grade if restricted and its a letter grade', (tester) async { - var student = _mockStudent('1'); - var courses = List.generate( - 1, - (idx) => _mockCourse( - idx.toString(), - enrollments: ListBuilder( - [_mockEnrollment(idx.toString(), userId: student.id, computedCurrentGrade: 'A')], - ), - ).rebuild((b) => b..settings = (b.settings..restrictQuantitativeData = true)), - ); - - _setupLocator(_MockedCoursesInteractor(courses: courses)); - - await tester.pumpWidget(_testableMaterialWidget()); - await tester.pumpAndSettle(); - - final gradeWidget = find.text('A'); - expect(gradeWidget, findsNWidgets(courses.length)); - }); - }); - - group('Interaction', () { - testWidgetsWithAccessibilityChecks('Pulls to refresh', (tester) async { - var student = _mockStudent('1'); - var courses = generateCoursesForStudent(student.id); - var interactor = _MockedCoursesInteractor(courses: []); - - _setupLocator(interactor); - - await tester.pumpWidget(_testableMaterialWidget()); - await tester.pumpAndSettle(); - - expect(find.byType(EmptyPandaWidget), findsOneWidget); - - interactor.courses = courses; - await tester.drag(find.byType(RefreshIndicator), Offset(0, 300)); - await tester.pumpAndSettle(); - - expect(find.byType(EmptyPandaWidget), findsNothing); - expect(find.byType(ListTile), findsNWidgets(courses.length)); - }); - - testWidgetsWithAccessibilityChecks('launches course detail screen when tapping on a course', (tester) async { - var student = _mockStudent('1'); - await setupPlatformChannels( - config: PlatformConfig(mockApiPrefs: {ApiPrefs.KEY_CURRENT_STUDENT: json.encode(serialize(student))})); - var courses = List.generate( - 1, - (idx) => _mockCourse( - idx.toString(), - enrollments: ListBuilder( - [_mockEnrollment(idx.toString(), userId: student.id, computedCurrentScore: 90)], - ), - ), - ); - - _setupLocator(_MockedCoursesInteractor(courses: courses)); - - await tester.pumpWidget(_testableMaterialWidget()); - await tester.pumpAndSettle(); - - final matchedWidget = find.text(courses.first.name); - expect(matchedWidget, findsOneWidget); - await tester.tap(matchedWidget); - await tester.pumpAndSettle(); - - expect(find.byType(CourseDetailsScreen), findsOneWidget); - - await ApiPrefs.clean(); - }); - }); -} - -class _MockedCoursesInteractor extends CoursesInteractor { - List? courses; - - bool error = false; - - _MockedCoursesInteractor({this.courses}); - - @override - Future> getCourses({bool isRefresh = false, String? studentId = null}) async { - if (error) throw ''; - return courses ?? [_mockCourse('1')]; - } -} - -class _MockCourseDetailsInteractor extends CourseDetailsInteractor {} - -class _MockAlertCountNotifier extends Mock implements AlertCountNotifier {} - -List generateCoursesForStudent(String userId, {int numberOfCourses = 1}) { - var student = _mockStudent(userId); - return List.generate( - numberOfCourses, - (idx) => _mockCourse( - idx.toString(), - enrollments: ListBuilder([_mockEnrollment(idx.toString(), userId: student.id)]), - ), - ); -} - -Enrollment _mockEnrollment( - String courseId, { - String userId = '0', - String? computedCurrentGrade, - double? computedCurrentScore, -}) => - Enrollment((b) => b - ..courseId = courseId - ..userId = userId - ..courseSectionId = '0' - ..enrollmentState = '' - ..computedCurrentGrade = computedCurrentGrade - ..computedCurrentScore = computedCurrentScore - ..build()); - -Course _mockCourse(String courseId, - {ListBuilder? enrollments, bool? hasActiveGradingPeriod, double? currentScore, String? currentGrade}) => - Course((b) => b - ..id = courseId - ..name = 'CourseName' - ..imageDownloadUrl = '' - ..enrollments = enrollments ?? ListBuilder([_mockEnrollment('0')]) - ..hasGradingPeriods = hasActiveGradingPeriod ?? false - ..currentScore = currentScore - ..currentGrade = currentGrade - ..build()); - -User _mockStudent(String userId) => User((b) => b - ..id = userId - ..name = 'UserName' - ..sortableName = 'Sortable Name' - ..build()); diff --git a/apps/flutter_parent/test/screens/crash_screen_test.dart b/apps/flutter_parent/test/screens/crash_screen_test.dart deleted file mode 100644 index 04530d058c..0000000000 --- a/apps/flutter_parent/test/screens/crash_screen_test.dart +++ /dev/null @@ -1,225 +0,0 @@ -// Copyright (C) 2019 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:firebase_crashlytics/firebase_crashlytics.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_parent/l10n/app_localizations.dart'; -import 'package:flutter_parent/screens/crash_screen.dart'; -import 'package:flutter_parent/utils/common_widgets/error_report/error_report_dialog.dart'; -import 'package:flutter_parent/utils/crash_utils.dart'; -import 'package:flutter_parent/utils/quick_nav.dart'; -import 'package:flutter_svg/flutter_svg.dart'; -import 'package:flutter_test/flutter_test.dart'; - -import '../utils/accessibility_utils.dart'; -import '../utils/test_app.dart'; -import '../utils/test_helpers/mock_helpers.dart'; -import '../utils/test_helpers/mock_helpers.mocks.dart'; - -void main() { - setupTestLocator((locator) { - locator.registerLazySingleton(() => MockFirebaseCrashlytics()); - }); - - setUp(() { - CrashUtils.init(); - }); - - final l10n = AppLocalizations(); - - testWidgetsWithAccessibilityChecks('Displays and closes crash screen when widget crashes', (tester) async { - await tester.pumpWidget(TestApp(_CrashTestWidget())); - await tester.pump(); - - // Tap test button which should throw an exception - await tester.tap(find.byKey(_CrashTestWidget.crashKey)); - await tester.pumpAndSettle(); - await tester.takeException(); - - // Crash screen should now be showing - expect(find.byType(CrashScreen), findsOneWidget); - - // Tap back button - await tester.tap(find.byType(BackButton)); - await tester.pumpAndSettle(); - - // Crash screen should be gone and test button should be visible - expect(find.byType(CrashScreen), findsNothing); - expect(find.byKey(_CrashTestWidget.crashKey), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('Reset app button clears app state', (tester) async { - await tester.pumpWidget(TestApp(_CrashTestWidget())); - await tester.pump(); - - // Tap 'increment' button twice - await tester.tap(find.byKey(_CrashTestWidget.incrementKey)); - await tester.pump(); - await tester.tap(find.byKey(_CrashTestWidget.incrementKey)); - await tester.pump(); - - // Counter should now read 'Count: 2' - expect(find.text('Count: 2'), findsOneWidget); - - // Tap test button which should throw an exception - await tester.tap(find.byKey(_CrashTestWidget.crashKey)); - await tester.pumpAndSettle(); - await tester.takeException(); - - // Crash screen should now be showing - expect(find.byType(CrashScreen), findsOneWidget); - - // Tap reset button - await tester.tap(find.text(l10n.crashScreenRestart)); - await tester.pumpAndSettle(); - - // Crash screen should be gone and counter should have reset - expect(find.byType(CrashScreen), findsNothing); - expect(find.text('Count: 0'), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('Displays core elements', (tester) async { - await tester.pumpWidget(TestApp(CrashScreen(_makeError()))); - await tester.pumpAndSettle(); - - // Panda image - expect(find.byType(SvgPicture), findsOneWidget); - - // Title - expect(find.text(l10n.crashScreenTitle), findsOneWidget); - - // Message - expect(find.text(l10n.crashScreenMessage), findsOneWidget); - - // 'Contact support' button - expect(find.widgetWithText(TextButton, l10n.crashScreenContact), findsOneWidget); - - // 'View error details' button - expect(find.widgetWithText(TextButton, l10n.crashScreenViewDetails), findsOneWidget); - - // 'Restart app' button - expect(find.widgetWithText(TextButton, l10n.crashScreenRestart), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('Displays report error dialog', (tester) async { - await tester.pumpWidget(TestApp(CrashScreen(_makeError()))); - await tester.pumpAndSettle(); - - // 'Contact support' button - expect(find.widgetWithText(TextButton, l10n.crashScreenContact), findsOneWidget); - await tester.tap(find.widgetWithText(TextButton, l10n.crashScreenContact)); - await tester.pumpAndSettle(); - - expect(find.byType(ErrorReportDialog), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('Displays error info', (tester) async { - await tester.pumpWidget(TestApp(CrashScreen(_makeError()))); - await tester.pumpAndSettle(); - - // Tap 'View error details' button - await tester.tap(find.text(l10n.crashScreenViewDetails)); - await tester.pumpAndSettle(); - - expectTile(String title, String subtitle) { - var tile = find.widgetWithText(ListTile, title); - expect(tile, findsOneWidget); - expect(find.descendant(of: tile, matching: find.text(subtitle)), findsOneWidget); - } - - // App version - expectTile(l10n.crashDetailsAppVersion, '1.0.0 (3)'); - - // Device model - expectTile(l10n.crashDetailsDeviceModel, 'Instructure Canvas Phone'); - - // Android OS version - expectTile(l10n.crashDetailsAndroidVersion, 'FakeOS 9000'); - - // By default should show 'full error message' button, but not the message itself - expect(find.text(l10n.crashDetailsFullMessage), findsOneWidget); - expect(find.byKey(Key('full-error-message')), findsNothing); - - await tester.tap(find.text(l10n.done)); - await tester.pumpAndSettle(); - - expect(find.text(l10n.crashDetailsFullMessage), findsNothing); - }); - - testWidgetsWithAccessibilityChecks('Displays full error info', (tester) async { - await tester.pumpWidget(TestApp(CrashScreen(_makeError()))); - await tester.pumpAndSettle(); - - // Tap 'View error details' button - await tester.tap(find.text(l10n.crashScreenViewDetails)); - await tester.pumpAndSettle(); - - // Tap full error message button - await tester.tap(find.text(l10n.crashDetailsFullMessage)); - await tester.pumpAndSettle(); - - // Should show error message container and message - expect(find.byKey(Key('full-error-message')), findsOneWidget); - expect(find.text('Fake Error\n\nFake StackTrace'), findsOneWidget); - }); -} - -FlutterErrorDetails _makeError() => - FlutterErrorDetails(exception: 'Fake Error', stack: StackTrace.fromString('Fake StackTrace')); - -class _CrashTestWidget extends StatefulWidget { - static Key crashKey = Key('crash-button'); - static Key incrementKey = Key('increment-button'); - static Key counterKey = Key('counter'); - - @override - __CrashTestWidgetState createState() => __CrashTestWidgetState(); -} - -class __CrashTestWidgetState extends State<_CrashTestWidget> { - int _counter = 0; - - @override - Widget build(BuildContext context) { - return Center( - child: Column( - children: [ - Text( - 'Count: $_counter', - key: _CrashTestWidget.counterKey, - ), - TextButton( - key: _CrashTestWidget.incrementKey, - child: Text('Tap to increment'), - onPressed: () => setState(() => _counter++), - ), - TextButton( - key: _CrashTestWidget.crashKey, - child: Text('Tap to crash'), - onPressed: () { - QuickNav().push(context, _CrashingWidget()); - }, - ), - ], - ), - ); - } -} - -class _CrashingWidget extends StatelessWidget { - @override - Widget build(BuildContext context) { - throw 'Error message'; - } -} diff --git a/apps/flutter_parent/test/screens/dashboard/alert_notifier_test.dart b/apps/flutter_parent/test/screens/dashboard/alert_notifier_test.dart deleted file mode 100644 index 62834d1ad2..0000000000 --- a/apps/flutter_parent/test/screens/dashboard/alert_notifier_test.dart +++ /dev/null @@ -1,71 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -import 'package:built_value/json_object.dart'; -import 'package:flutter_parent/models/alert.dart'; -import 'package:flutter_parent/models/unread_count.dart'; -import 'package:flutter_parent/network/api/alert_api.dart'; -import 'package:flutter_parent/screens/dashboard/alert_notifier.dart'; -import 'package:flutter_parent/utils/alert_helper.dart'; -import 'package:mockito/mockito.dart'; -import 'package:test/test.dart'; - -import '../../utils/test_app.dart'; -import '../../utils/test_helpers/mock_helpers.dart'; -import '../../utils/test_helpers/mock_helpers.mocks.dart'; - -void main() { - final api = MockAlertsApi(); - final alertsHelper = AlertsHelper(); - - setUp(() { - reset(api); - }); - - setupTestLocator((locator) { - locator.registerLazySingleton(() => api); - locator.registerLazySingleton(() => alertsHelper); - }); - - test('calls the API with the provided student id', () async { - final studentId = '123'; - final count = 4; - final notifier = AlertCountNotifier(); - - final data = List.generate(4, (index) { - return Alert((b) => b - ..id = index.toString() - ..workflowState = AlertWorkflowState.unread - ..alertType = AlertType.unknown - ..lockedForUser = false); - }); - - when(api.getAlertsDepaginated(any, any)).thenAnswer((_) => Future.value(data.toList())); - expect(notifier.value, 0); - await notifier.update(studentId); - expect(notifier.value, count); - - verify(api.getAlertsDepaginated(studentId, any)).called(1); - }); - - test('handles null responses', () async { - final studentId = '123'; - final count = 4; - final notifier = AlertCountNotifier()..value = count; - - when(api.getUnreadCount(studentId)).thenAnswer((_) async => UnreadCount((b) => b..count = JsonObject('bad'))); - expect(notifier.value, count); - await notifier.update(studentId); - expect(notifier.value, count); - }); -} diff --git a/apps/flutter_parent/test/screens/dashboard/dashboard_interactor_test.dart b/apps/flutter_parent/test/screens/dashboard/dashboard_interactor_test.dart deleted file mode 100644 index 0d4b961172..0000000000 --- a/apps/flutter_parent/test/screens/dashboard/dashboard_interactor_test.dart +++ /dev/null @@ -1,161 +0,0 @@ -// Copyright (C) 2019 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'dart:math'; - -import 'package:flutter_parent/models/enrollment.dart'; -import 'package:flutter_parent/models/login.dart'; -import 'package:flutter_parent/models/user.dart'; -import 'package:flutter_parent/network/api/enrollments_api.dart'; -import 'package:flutter_parent/network/api/user_api.dart'; -import 'package:flutter_parent/screens/dashboard/dashboard_interactor.dart'; -import 'package:flutter_parent/screens/dashboard/inbox_notifier.dart'; -import 'package:flutter_parent/utils/old_app_migration.dart'; -import 'package:flutter_test/flutter_test.dart'; -import 'package:mockito/mockito.dart'; - -import '../../utils/canvas_model_utils.dart'; -import '../../utils/platform_config.dart'; -import '../../utils/test_app.dart'; -import '../../utils/test_helpers/mock_helpers.dart'; -import '../../utils/test_helpers/mock_helpers.mocks.dart'; - -void main() { - test('getStudents calls getObserveeEnrollments from EnrollmentsApi', () async { - var api = MockEnrollmentsApi(); - await setupTestLocator((l) => l.registerLazySingleton(() => api)); - when(api.getObserveeEnrollments(forceRefresh: anyNamed('forceRefresh'))) - .thenAnswer((_) => Future.value([])); - - var interactor = DashboardInteractor(); - interactor.getStudents(); - verify(api.getObserveeEnrollments(forceRefresh: anyNamed('forceRefresh'))).called(1); - }); - - test('getSelf calls UserApi', () async { - var api = MockUserApi(); - final initialUser = CanvasModelTestUtils.mockUser(); - final updatedUser = CanvasModelTestUtils.mockUser(name: 'Inst Panda'); - final permittedUser = updatedUser.rebuild((b) { - return b..permissions = UserPermission((p) => p..limitParentAppWebAccess = true).toBuilder(); - }); - - await setupTestLocator((l) => l.registerLazySingleton(() => api)); - when(api.getSelf()).thenAnswer((_) => Future.value(updatedUser)); - when(api.getSelfPermissions()).thenAnswer((_) => Future.value(permittedUser.permissions)); - - // Setup ApiPrefs - final login = Login((b) => b..user = initialUser.toBuilder()); - await setupPlatformChannels(config: PlatformConfig(initLoggedInUser: login)); - - var interactor = DashboardInteractor(); - final actual = await interactor.getSelf(); - - expect(actual, permittedUser); - verify(api.getSelf()).called(1); - verify(api.getSelfPermissions()).called(1); - }); - - test('getSelf calls UserApi and handles no permissions', () async { - var api = MockUserApi(); - final initialUser = CanvasModelTestUtils.mockUser(); - final updatedUser = CanvasModelTestUtils.mockUser(name: 'Inst Panda'); - - await setupTestLocator((l) => l.registerLazySingleton(() => api)); - when(api.getSelf()).thenAnswer((_) => Future.value(updatedUser)); - when(api.getSelfPermissions()).thenAnswer((_) => Future.error('No permissions for this user')); - - // Setup ApiPrefs - final login = Login((b) => b..user = initialUser.toBuilder()); - await setupPlatformChannels(config: PlatformConfig(initLoggedInUser: login)); - - var interactor = DashboardInteractor(); - final actual = await interactor.getSelf(); - - expect(actual, updatedUser); - verify(api.getSelf()).called(1); - verify(api.getSelfPermissions()).called(1); - }); - - test('Sort users in descending order', () { - // Create lists - var startingList = [_mockStudent('Zed'), _mockStudent('Alex'), _mockStudent('Billy')]; - var expectedSortedList = [_mockStudent('Alex'), _mockStudent('Billy'), _mockStudent('Zed')]; - - // Run the logic - var interactor = DashboardInteractor(); - interactor.sortUsers(startingList); - - expect(startingList, expectedSortedList); - }); - - test('Filter out enrollments with no observee', () { - // Create the lists - var startingList = [ - _mockEnrollment(null), - _mockEnrollment(_mockStudent('Alex').toBuilder()), - _mockEnrollment(null) - ]; - var expectedSortedList = [_mockStudent('Alex')]; - - // Run the logic - var interactor = DashboardInteractor(); - var result = interactor.filterStudents(startingList); - - expect(result, expectedSortedList); - }); - - test('Filter out duplicate enrollments', () { - var enrollment = _mockEnrollment(_mockStudent('Alex').toBuilder()); - // Create the lists - var startingList = [enrollment, enrollment, enrollment, enrollment]; - var expectedSortedList = [_mockStudent('Alex')]; - - // Run the logic - var interactor = DashboardInteractor(); - var result = interactor.filterStudents(startingList); - - expect(result, expectedSortedList); - }); - - test('Returns InboxCountNotifier from locator', () async { - var notifier = InboxCountNotifier(); - await setupTestLocator((locator) { - locator.registerLazySingleton(() => notifier); - }); - - var interactor = DashboardInteractor(); - expect(interactor.getInboxCountNotifier(), notifier); - }); - - test('shouldShowOldReminderMessage calls OldAppMigration.hasOldReminders', () async { - var migration = MockOldAppMigration(); - await setupTestLocator((locator) { - locator.registerLazySingleton(() => migration); - }); - - DashboardInteractor().shouldShowOldReminderMessage(); - verify(migration.hasOldReminders()); - }); -} - -User _mockStudent(String name) => User((b) => b - ..id = Random(name.hashCode).nextInt(100000).toString() - ..sortableName = name - ..build()); - -Enrollment _mockEnrollment(UserBuilder? observedUser) => Enrollment((b) => b - ..enrollmentState = '' - ..observedUser = observedUser - ..build()); diff --git a/apps/flutter_parent/test/screens/dashboard/dashboard_screen_test.dart b/apps/flutter_parent/test/screens/dashboard/dashboard_screen_test.dart deleted file mode 100644 index 14439b82e8..0000000000 --- a/apps/flutter_parent/test/screens/dashboard/dashboard_screen_test.dart +++ /dev/null @@ -1,1287 +0,0 @@ -// Copyright (C) 2019 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'dart:math'; - -import 'package:built_value/json_object.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_parent/l10n/app_localizations.dart'; -import 'package:flutter_parent/models/alert.dart'; -import 'package:flutter_parent/models/course.dart'; -import 'package:flutter_parent/models/help_link.dart'; -import 'package:flutter_parent/models/login.dart'; -import 'package:flutter_parent/models/unread_count.dart'; -import 'package:flutter_parent/models/user.dart'; -import 'package:flutter_parent/network/api/accounts_api.dart'; -import 'package:flutter_parent/network/api/alert_api.dart'; -import 'package:flutter_parent/network/api/auth_api.dart'; -import 'package:flutter_parent/network/api/inbox_api.dart'; -import 'package:flutter_parent/network/api/planner_api.dart'; -import 'package:flutter_parent/network/utils/analytics.dart'; -import 'package:flutter_parent/network/utils/api_prefs.dart'; -import 'package:flutter_parent/screens/alerts/alerts_interactor.dart'; -import 'package:flutter_parent/screens/alerts/alerts_screen.dart'; -import 'package:flutter_parent/screens/calendar/calendar_screen.dart'; -import 'package:flutter_parent/screens/calendar/calendar_today_click_notifier.dart'; -import 'package:flutter_parent/screens/calendar/calendar_widget/calendar_widget.dart'; -import 'package:flutter_parent/screens/courses/courses_interactor.dart'; -import 'package:flutter_parent/screens/courses/courses_screen.dart'; -import 'package:flutter_parent/screens/dashboard/alert_notifier.dart'; -import 'package:flutter_parent/screens/dashboard/dashboard_interactor.dart'; -import 'package:flutter_parent/screens/dashboard/dashboard_screen.dart'; -import 'package:flutter_parent/screens/dashboard/inbox_notifier.dart'; -import 'package:flutter_parent/screens/dashboard/selected_student_notifier.dart'; -import 'package:flutter_parent/screens/dashboard/student_expansion_widget.dart'; -import 'package:flutter_parent/screens/help/help_screen.dart'; -import 'package:flutter_parent/screens/help/help_screen_interactor.dart'; -import 'package:flutter_parent/screens/login_landing_screen.dart'; -import 'package:flutter_parent/screens/manage_students/manage_students_interactor.dart'; -import 'package:flutter_parent/screens/manage_students/manage_students_screen.dart'; -import 'package:flutter_parent/screens/masquerade/masquerade_screen.dart'; -import 'package:flutter_parent/screens/masquerade/masquerade_screen_interactor.dart'; -import 'package:flutter_parent/screens/pairing/pairing_util.dart'; -import 'package:flutter_parent/screens/settings/settings_interactor.dart'; -import 'package:flutter_parent/screens/settings/settings_screen.dart'; -import 'package:flutter_parent/utils/alert_helper.dart'; -import 'package:flutter_parent/utils/common_widgets/badges.dart'; -import 'package:flutter_parent/utils/common_widgets/empty_panda_widget.dart'; -import 'package:flutter_parent/utils/db/calendar_filter_db.dart'; -import 'package:flutter_parent/utils/db/reminder_db.dart'; -import 'package:flutter_parent/utils/notification_util.dart'; -import 'package:flutter_parent/utils/quick_nav.dart'; -import 'package:flutter_parent/utils/remote_config_utils.dart'; -import 'package:flutter_test/flutter_test.dart'; -import 'package:get_it/get_it.dart'; -import 'package:mockito/mockito.dart'; -import 'package:permission_handler/permission_handler.dart'; - -import '../../utils/accessibility_utils.dart'; -import '../../utils/canvas_model_utils.dart'; -import '../../utils/network_image_response.dart'; -import '../../utils/platform_config.dart'; -import '../../utils/test_app.dart'; -import '../../utils/test_helpers/mock_helpers.dart'; -import '../../utils/test_helpers/mock_helpers.mocks.dart'; -import '../../utils/test_utils.dart'; -import '../courses/course_summary_screen_test.dart'; - -/** - * NOTE: This test file is from the before times, please don't use as reference. - */ -void main() { - mockNetworkImageResponse(); - final analyticsMock = MockAnalytics(); - final alertsHelper = AlertsHelper(); - - _setupLocator({MockInteractor? interactor, AlertsApi? alertsApi, InboxApi? inboxApi}) async { - await setupTestLocator((locator) { - locator.registerFactory(() => MockAlertsInteractor()); - locator.registerFactory(() => MockCoursesInteractor()); - locator.registerFactory(() => interactor ?? MockInteractor()); - locator.registerFactory(() => MockHelpScreenInteractor()); - locator.registerFactory(() => MockManageStudentsInteractor()); - locator.registerFactory(() => MasqueradeScreenInteractor()); - locator.registerFactory(() => SettingsInteractor()); - locator.registerLazySingleton(() => alertsApi ?? MockAlertsApi()); - locator.registerLazySingleton(() => AlertCountNotifier()); - locator.registerLazySingleton(() => analyticsMock); - locator.registerLazySingleton(() => CalendarTodayClickNotifier()); - locator.registerLazySingleton(() => inboxApi ?? MockInboxApi()); - locator.registerLazySingleton(() => InboxCountNotifier()); - locator.registerLazySingleton(() => MockPlannerApi()); - locator.registerLazySingleton(() => QuickNav()); - locator.registerLazySingleton(() => SelectedStudentNotifier()); - locator.registerLazySingleton(() => StudentAddedNotifier()); - locator.registerLazySingleton(() => MockAccountsApi()); - locator.registerLazySingleton(() => alertsHelper); - }); - } - - setUp(() async { - reset(analyticsMock); - final mockRemoteConfig = setupMockRemoteConfig(valueSettings: {'qr_login_enabled_parent': 'true'}); - await setupPlatformChannels(config: PlatformConfig(initRemoteConfig: mockRemoteConfig)); - }); - - tearDown(() { - RemoteConfigUtils.clean(); - }); - - Widget _testableMaterialWidget({ - Login? initLogin, - Map? deepLinkParams, - DashboardContentScreens? startingPage, - }) => - TestApp( - Scaffold( - body: DashboardScreen( - deepLinkParams: deepLinkParams, - startingPage: startingPage, - ), - ), - platformConfig: PlatformConfig(initLoggedInUser: initLogin), - ); - - group('Render', () { - testWidgetsWithAccessibilityChecks('Displays name with pronouns when pronouns are not null', (tester) async { - await _setupLocator(interactor: MockInteractor(includePronouns: true)); - - // Get the first user - var interactor = GetIt.instance.get(); - late User? first; - interactor.getStudents().then((students) { - first = students?.first; - }); - - await tester.pumpWidget(_testableMaterialWidget()); - await tester.pumpAndSettle(); - - expect(find.text('${first?.shortName} (${first?.pronouns})'), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('Displays name without pronouns when pronouns are null', (tester) async { - await _setupLocator(); - - // Get the first user - var interactor = GetIt.instance.get(); - late User? first; - interactor.getStudents().then((students) { - first = students?.first; - }); - - await tester.pumpWidget(_testableMaterialWidget()); - await tester.pumpAndSettle(); - - // Will find two, one in the navbar header and one in the student switcher - expect(find.text('${first?.shortName}'), findsNWidgets(2)); - }); - - testWidgetsWithAccessibilityChecks( - 'Displays empty state when there are no students', - (tester) async { - var interactor = MockInteractor(generateStudents: false); - await _setupLocator(interactor: interactor); - - await tester.pumpWidget(_testableMaterialWidget()); - await tester.pumpAndSettle(); - - expect(find.byType(EmptyPandaWidget), findsOneWidget); - expect(find.text(l10n.emptyStudentList), findsOneWidget); - expect(find.descendant(of: find.byType(AppBar), matching: find.text(l10n.noStudents)), findsOneWidget); - expect( - find.descendant(of: find.byType(EmptyPandaWidget), matching: find.text(l10n.noStudents)), findsOneWidget); - }, - a11yExclusions: {A11yExclusion.multipleNodesWithSameLabel}, - ); - - testWidgetsWithAccessibilityChecks('Does not display Act As User button if user cannot masquerade', (tester) async { - await _setupLocator(); - - var login = Login((b) => b - ..domain = 'domain' - ..accessToken = 'token' - ..canMasquerade = false - ..user = CanvasModelTestUtils.mockUser().toBuilder()); - - await tester.pumpWidget(_testableMaterialWidget(initLogin: login)); - await tester.pumpAndSettle(); - - // Open the drawer - dashboardState(tester).scaffoldKey.currentState?.openDrawer(); - await tester.pumpAndSettle(); - - expect(find.text(l10n.actAsUser), findsNothing); - expect(find.text(l10n.stopActAsUser), findsNothing); - }); - - testWidgetsWithAccessibilityChecks('Displays Act As User button if user can masquerade', (tester) async { - await _setupLocator(); - - var login = Login((b) => b - ..domain = 'domain' - ..accessToken = 'token' - ..canMasquerade = true - ..user = CanvasModelTestUtils.mockUser().toBuilder()); - - await tester.pumpWidget(_testableMaterialWidget(initLogin: login)); - await tester.pumpAndSettle(); - - // Open the drawer - dashboardState(tester).scaffoldKey.currentState?.openDrawer(); - await tester.pumpAndSettle(); - - expect(find.text(l10n.actAsUser), findsOneWidget); - expect(find.text(l10n.stopActAsUser), findsNothing); - }); - - testWidgetsWithAccessibilityChecks('Displays Stop Acting As User button if user is masquerading', (tester) async { - await _setupLocator(); - - var login = Login((b) => b - ..domain = 'domain' - ..accessToken = 'token' - ..canMasquerade = true - ..user = CanvasModelTestUtils.mockUser().toBuilder() - ..masqueradeDomain = 'masqueradeDomain' - ..masqueradeUser = CanvasModelTestUtils.mockUser().toBuilder()); - - await tester.pumpWidget(_testableMaterialWidget(initLogin: login)); - await tester.pumpAndSettle(); - - // Open the drawer - dashboardState(tester).scaffoldKey.currentState?.openDrawer(); - await tester.pumpAndSettle(); - - expect(find.text(l10n.actAsUser), findsNothing); - expect(find.text(l10n.stopActAsUser), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('Nav drawer displays observer name (w/pronouns), and email address', - (tester) async { - await _setupLocator(interactor: MockInteractor(includePronouns: true)); - - // Get the first user - var interactor = GetIt.instance.get(); - late User observer; - interactor.getSelf().then((self) { - observer = self ?? User(); - }); - - await tester.pumpWidget(_testableMaterialWidget()); - await tester.pumpAndSettle(); - - // Open the drawer - dashboardState(tester).scaffoldKey.currentState?.openDrawer(); - await tester.pumpAndSettle(); - - expect(find.text('${observer.name} (${observer.pronouns})'), findsOneWidget); - expect(find.text('${observer.primaryEmail}'), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('Nav drawer displays observer name without pronouns, and email address', - (tester) async { - await _setupLocator(); - - // Get the first user - var interactor = GetIt.instance.get(); - late User observer; - interactor.getSelf().then((self) { - observer = self ?? User(); - }); - - await tester.pumpWidget(_testableMaterialWidget()); - await tester.pumpAndSettle(); - - // Open the drawer - dashboardState(tester).scaffoldKey.currentState?.openDrawer(); - await tester.pumpAndSettle(); - - expect(find.text('${observer.name}'), findsOneWidget); - expect(find.text('${observer.primaryEmail}'), findsOneWidget); - }); - - // TODO: Finish when we have specs -// testWidgetsWithAccessibilityChecks( -// 'Displays error when retrieving self (observee) results in a failure', (tester) async { -// }); - - testWidgetsWithAccessibilityChecks('Courses is the default content screen', (tester) async { - await _setupLocator(); - - await tester.pumpWidget(_testableMaterialWidget()); - await tester.pumpAndSettle(); - - expect(find.byType(CoursesScreen), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('Inbox count of zero hides badge', (tester) async { - final inboxApi = MockInboxApi(); - var interactor = MockInteractor(); - when(inboxApi.getUnreadCount()).thenAnswer((_) => Future.value(UnreadCount((b) => b..count = JsonObject('0')))); - await _setupLocator(interactor: interactor, inboxApi: inboxApi); - - await tester.pumpWidget(_testableMaterialWidget()); - await tester.pumpAndSettle(); - - // Open the nav drawer - dashboardState(tester).scaffoldKey.currentState?.openDrawer(); - await tester.pumpAndSettle(); - - // Assert there's no text in the inbox-count - expect(find.descendant(of: find.byKey(Key('inbox-count')), matching: find.byType(Text)), findsNothing); - }); - - testWidgetsWithAccessibilityChecks('Displays Inbox count', (tester) async { - final inboxApi = MockInboxApi(); - var interactor = MockInteractor(); - when(inboxApi.getUnreadCount()) - .thenAnswer((_) => Future.value(UnreadCount((b) => b..count = JsonObject('12321')))); - await _setupLocator(interactor: interactor, inboxApi: inboxApi); - - await tester.pumpWidget(_testableMaterialWidget()); - await tester.pumpAndSettle(); - - // Open the nav drawer - dashboardState(tester).scaffoldKey.currentState?.openDrawer(); - await tester.pumpAndSettle(); - - expect(find.text('12321'), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('Displays Inbox count on app bar', (tester) async { - final inboxCount = '12'; - - final inboxApi = MockInboxApi(); - var interactor = MockInteractor(); - when(inboxApi.getUnreadCount()) - .thenAnswer((_) => Future.value(UnreadCount((b) => b..count = JsonObject(inboxCount)))); - await _setupLocator(interactor: interactor, inboxApi: inboxApi); - - await tester.pumpWidget(_testableMaterialWidget()); - await tester.pumpAndSettle(); - - expect(find.descendant(of: find.byType(AppBar), matching: find.byKey(NumberBadge.backgroundKey)), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('Does not display Inbox count on app bar when 0', (tester) async { - final inboxCount = '0'; - - final inboxApi = MockInboxApi(); - var interactor = MockInteractor(); - when(inboxApi.getUnreadCount()) - .thenAnswer((_) => Future.value(UnreadCount((b) => b..count = JsonObject(inboxCount)))); - await _setupLocator(interactor: interactor, inboxApi: inboxApi); - - await tester.pumpWidget(_testableMaterialWidget()); - await tester.pumpAndSettle(); - - expect(find.descendant(of: find.byType(AppBar), matching: find.byKey(NumberBadge.backgroundKey)), findsNothing); - }); - - testWidgetsWithAccessibilityChecks('displays course when passed in as starting page', (tester) async { - await _setupLocator(); - - await tester.pumpWidget(_testableMaterialWidget(startingPage: DashboardContentScreens.Courses)); - await tester.pumpAndSettle(); - - expect(find.byType(CoursesScreen), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('displays calendar when passed in as starting page', (tester) async { - await _setupLocator(); - - var login = Login((b) => b - ..domain = 'domain' - ..accessToken = 'token' - ..user = CanvasModelTestUtils.mockUser().toBuilder()); - - await tester.pumpWidget(_testableMaterialWidget( - initLogin: login, - startingPage: DashboardContentScreens.Calendar, - )); - - // Wait for day activity dot animation delay to settle - await tester.pumpAndSettle(Duration(seconds: 1)); - - expect(find.byType(CalendarScreen), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('displays alerts when passed in as starting page', (tester) async { - await _setupLocator(); - - await tester.pumpWidget(_testableMaterialWidget(startingPage: DashboardContentScreens.Alerts)); - await tester.pumpAndSettle(); - - // Check for the alerts screen - expect(find.byType(AlertsScreen), findsOneWidget); - }); - }); - - group('Interactions', () { - testWidgetsWithAccessibilityChecks('tapping courses in the bottom nav shows courses screen', (tester) async { - await _setupLocator(); - - await tester.pumpWidget(_testableMaterialWidget()); - await tester.pumpAndSettle(); - - // Courses is the default content screen, so we'll navigate away from there, then try navigating - // back - - // Navigate to Alerts - await tester.tap(find.text(AppLocalizations().alertsLabel)); - await tester.pumpAndSettle(); - - // Navigate to Courses - await tester.tap(find.text(AppLocalizations().coursesLabel)); - await tester.pumpAndSettle(); - - expect(find.byType(CoursesScreen), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('tapping calendar sets correct current page index', (tester) async { - await _setupLocator(); - - var login = Login((b) => b - ..domain = 'domain' - ..accessToken = 'token' - ..user = CanvasModelTestUtils.mockUser().toBuilder()); - - await tester.pumpWidget(_testableMaterialWidget(initLogin: login)); - await tester.pumpAndSettle(); - - // Navigate to Calendar - await tester.tap(find.text(AppLocalizations().calendarLabel)); - - // Wait for day activity dot animation delay to settle - await tester.pumpAndSettle(Duration(seconds: 1)); - - expect(find.byType(CalendarScreen), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('tapping alerts sets correct current page index', (tester) async { - await _setupLocator(); - - await tester.pumpWidget(_testableMaterialWidget()); - await tester.pumpAndSettle(); - - // Navigate to Alerts - await tester.tap(find.text(AppLocalizations().alertsLabel)); - await tester.pumpAndSettle(); - - expect(find.byType(AlertsScreen), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('tapping Inbox from nav drawer opens inbox page', (tester) async { - await _setupLocator(); - - await tester.pumpWidget(_testableMaterialWidget()); - await tester.pumpAndSettle(); - - // Open the nav drawer - dashboardState(tester).scaffoldKey.currentState?.openDrawer(); - await tester.pumpAndSettle(); - - // Click on Inbox - await tester.tap(find.text(AppLocalizations().inbox)); - }); - - testWidgetsWithAccessibilityChecks('tapping Manage Students from nav drawer opens manage students page', - (tester) async { - await _setupLocator(); - - await tester.pumpWidget(_testableMaterialWidget()); - await tester.pumpAndSettle(); - - // Open the nav drawer - dashboardState(tester).scaffoldKey.currentState?.openDrawer(); - await tester.pumpAndSettle(); - - // Click on Manage Students - await tester.tap(find.text(AppLocalizations().manageStudents)); - await tester.pumpAndSettle(Duration(seconds: 3)); - - // Test that Manage Students screen was loaded - expect(find.byType(ManageStudentsScreen), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('tapping Settings in nav drawer opens settings screen', (tester) async { - await _setupLocator(); - - await tester.pumpWidget(_testableMaterialWidget()); - await tester.pumpAndSettle(); - - // Open the nav drawer - dashboardState(tester).scaffoldKey.currentState?.openDrawer(); - await tester.pumpAndSettle(); - - // Click on Settings - var settingsFinder = find.text(AppLocalizations().settings); - await ensureVisibleByScrolling(settingsFinder, tester, scrollFrom: ScreenVerticalLocation.MID_BOTTOM); - await tester.pumpAndSettle(); - await tester.tap(settingsFinder); - await tester.pumpAndSettle(); - - // Test that settings screen was loaded - expect(find.byType(SettingsScreen), findsOneWidget); - - await tester.pageBack(); - await tester.pumpAndSettle(); - - // Drawer should be closed - expect(find.byType(Drawer), findsNothing); - }); - - testWidgetsWithAccessibilityChecks('tapping Help from nav drawer shows help', (tester) async { - await _setupLocator(interactor: MockInteractor()); - - await tester.pumpWidget(_testableMaterialWidget()); - await tester.pumpAndSettle(); - - // Open the nav drawer - dashboardState(tester).scaffoldKey.currentState?.openDrawer(); - await tester.pumpAndSettle(); - - // Click on Help - var helpFinder = find.text(AppLocalizations().help); - await ensureVisibleByScrolling(helpFinder, tester, scrollFrom: ScreenVerticalLocation.MID_BOTTOM); - await tester.pumpAndSettle(); - await tester.tap(helpFinder); - await tester.pump(); - await tester.pump(); - - expect(find.byType(HelpScreen), findsOneWidget); - }); - - testWidgets( - 'tapping Sign Out from nav drawer displays confirmation dialog', - (tester) async { - final reminderDb = MockReminderDb(); - final notificationUtil = MockNotificationUtil(); - - await _setupLocator(); - final _locator = GetIt.instance; - _locator.registerLazySingleton(() => reminderDb); - _locator.registerLazySingleton(() => notificationUtil); - - when(reminderDb.getAllForUser(any, any)).thenAnswer((_) async => []); - - var login = Login((b) => b - ..domain = 'domain' - ..accessToken = 'token' - ..user = CanvasModelTestUtils.mockUser().toBuilder()); - - await tester.pumpWidget(_testableMaterialWidget(initLogin: login)); - await tester.pumpAndSettle(); - - expect(ApiPrefs.isLoggedIn(), true); - - // Open the nav drawer - dashboardState(tester).scaffoldKey.currentState?.openDrawer(); - await tester.pumpAndSettle(); - - // Click on Sign Out - var logoutFinder = find.text(AppLocalizations().logOut); - await ensureVisibleByScrolling(logoutFinder, tester, scrollFrom: ScreenVerticalLocation.MID_BOTTOM); - await tester.pumpAndSettle(); - await tester.tap(logoutFinder); - await tester.pumpAndSettle(); - - // Should show logout confirmation text - expect(find.text(AppLocalizations().logoutConfirmation), findsOneWidget); - - // Tap the cancel button - await tester.tap(find.text(DefaultMaterialLocalizations().cancelButtonLabel)); - await tester.pumpAndSettle(); - - // Dialog should be gone and we should still be logged in on the dashboard screen - expect(find.text(AppLocalizations().logoutConfirmation), findsNothing); - expect(find.byType(DashboardScreen), findsOneWidget); - expect(ApiPrefs.isLoggedIn(), true); - verifyNever(analyticsMock.logEvent(AnalyticsEventConstants.LOGOUT)); - }, - ); - - // Not using the accessibility tester due to an issue where the - // Login Landing screen fails a contrast ratio test after logging out - // (the tests for that screen all pass accessibility checks, however) - testWidgets('tapping Sign Out from nav drawer signs user out and returns to the Login Landing screen', - (tester) async { - final reminderDb = MockReminderDb(); - final calendarFilterDb = MockCalendarFilterDb(); - final notificationUtil = MockNotificationUtil(); - final authApi = MockAuthApi(); - - await _setupLocator(); - final _locator = GetIt.instance; - _locator.registerLazySingleton(() => reminderDb); - _locator.registerLazySingleton(() => calendarFilterDb); - _locator.registerLazySingleton(() => notificationUtil); - _locator.registerLazySingleton(() => authApi); - - when(reminderDb.getAllForUser(any, any)).thenAnswer((_) async => []); - - var login = Login((b) => b - ..domain = 'domain' - ..accessToken = 'token' - ..user = CanvasModelTestUtils.mockUser().toBuilder()); - - await tester.pumpWidget(_testableMaterialWidget(initLogin: login)); - await tester.pumpAndSettle(); - - expect(ApiPrefs.isLoggedIn(), true); - - // Open the nav drawer - dashboardState(tester).scaffoldKey.currentState?.openDrawer(); - await tester.pumpAndSettle(); - - // Click on Sign Out - var logoutFinder = find.text(AppLocalizations().logOut); - await ensureVisibleByScrolling(logoutFinder, tester, scrollFrom: ScreenVerticalLocation.MID_BOTTOM); - await tester.pumpAndSettle(); - await tester.tap(logoutFinder); - await tester.pumpAndSettle(); - - // Tap the OK button in the confirmation dialog - await tester.tap(find.text(DefaultMaterialLocalizations().okButtonLabel)); - await tester.pumpAndSettle(); - - // Test if we ended up on the Login Landing page and if we are logged out - expect(find.byType(LoginLandingScreen), findsOneWidget); - expect(ApiPrefs.isLoggedIn(), false); - verify(analyticsMock.logEvent(AnalyticsEventConstants.LOGOUT)).called(1); - }); - - // Not using the accessibility tester due to an issue where the - // Login Landing screen fails a contrast ratio test after logging out - // (the tests for that screen all pass accessibility checks, however) - testWidgets('tapping Switch Users from nav drawer signs user out and returns to the Login Landing screen', - (tester) async { - final reminderDb = MockReminderDb(); - final calendarFilterDb = MockCalendarFilterDb(); - final notificationUtil = MockNotificationUtil(); - - await _setupLocator(); - final _locator = GetIt.instance; - _locator.registerLazySingleton(() => reminderDb); - _locator.registerLazySingleton(() => calendarFilterDb); - _locator.registerLazySingleton(() => notificationUtil); - - when(reminderDb.getAllForUser(any, any)).thenAnswer((_) async => []); - - var login = Login((b) => b - ..domain = 'domain' - ..accessToken = 'token' - ..user = CanvasModelTestUtils.mockUser().toBuilder()); - - await tester.pumpWidget(_testableMaterialWidget(initLogin: login)); - await tester.pumpAndSettle(); - - expect(ApiPrefs.isLoggedIn(), true); - - // Open the nav drawer - dashboardState(tester).scaffoldKey.currentState?.openDrawer(); - await tester.pumpAndSettle(); - - // Click on Sign Out - var logoutFinder = find.text(AppLocalizations().switchUsers); - await ensureVisibleByScrolling(logoutFinder, tester, scrollFrom: ScreenVerticalLocation.MID_BOTTOM); - await tester.pumpAndSettle(); - await tester.tap(logoutFinder); - await tester.pumpAndSettle(); - - // Test if we ended up on the Login Landing page and if we are logged out - expect(find.byType(LoginLandingScreen), findsOneWidget); - expect(ApiPrefs.isLoggedIn(), false); - verify(analyticsMock.logEvent(AnalyticsEventConstants.SWITCH_USERS)).called(1); - }); - - testWidgetsWithAccessibilityChecks('tapping selected user opens and closes student selector', (tester) async { - // Animation values - int retracted = 0; - int expanded = 1; - - await _setupLocator(interactor: MockInteractor(includePronouns: false)); - - // Get the first user - var interactor = GetIt.instance.get(); - late User? first; - interactor.getStudents().then((students) { - first = students?.first; - }); - - // Load the screen - await tester.pumpWidget(_testableMaterialWidget()); - await tester.pumpAndSettle(); - - // Widget tree is built, we should have access to what we need to check the state of the expandable widget animation now - var slideAnimation = ((studentExpansionState(tester).animation)); - - // Make sure the expansion widget exists and is initially retracted - expect(find.byType(StudentExpansionWidget), findsOneWidget); - expect(slideAnimation.value, retracted); - - expect(first, isNotNull); - // Tap the user header, expanding it - // There will be two instances, one in the header and one in the student switcher - // we want to tap the first one (the one in the header) - await tester.tap(find.text(first!.shortName!).at(0)); - await tester.pumpAndSettle(); // Wait for user switcher to slide out - expect(slideAnimation.value, expanded); - - // Tap the user header, retracting it - // There will be two instances, one in the header and one in the student switcher - // we want to tap the first one (the one in the header) - await tester.tap(find.text(first!.shortName!).at(0)); - await tester.pumpAndSettle(); // Wait for user switcher to slide back - expect(slideAnimation.value, retracted); - }); - - testWidgetsWithAccessibilityChecks('tapping student from student selector closes selector', (tester) async { - // Animation values - int retracted = 0; - int expanded = 1; - - await _setupLocator(interactor: MockInteractor(includePronouns: false)); - - // Get the first user - var interactor = GetIt.instance.get(); - late User? first; - late User? second; - interactor.getStudents().then((students) { - first = students?.first; - second = students?[1]; - }); - - // Load the screen - await tester.pumpWidget(_testableMaterialWidget()); - await tester.pumpAndSettle(); - - // Widget tree is built, we should have access to what we need to check the state of the expandable widget animation now - var slideAnimation = ((studentExpansionState(tester).animation)); - - // Make sure the expansion widget exists and is initially retracted - expect(find.byType(StudentExpansionWidget), findsOneWidget); - expect(slideAnimation.value, retracted); - - expect(first, isNotNull); - expect(second, isNotNull); - - // Tap the user header, expanding it - // There will be two instances, one in the header and one in the student switcher - // we want to tap the first one (the one in the header) - await tester.tap(find.text(first!.shortName!).at(0)); - await tester.pumpAndSettle(); // Wait for user switcher to slide out - expect(slideAnimation.value, expanded); - - // Tap on a user - await tester.tap(find.text(second!.shortName!)); - await tester.pumpAndSettle(); // Wait for user switcher to slide back - - expect(slideAnimation.value, retracted); - }); - - testWidgetsWithAccessibilityChecks('deep link params is cleared after first screen is shown', (tester) async { - await _setupLocator(); - - Map params = {'test': 'Instructure Pandas'}; - - await tester.pumpWidget(_testableMaterialWidget(deepLinkParams: params)); - await tester.pump(); - - // Make sure our params made it into DashboardScreen - expect(dashboardState(tester).currentDeepLinkParams, params); - - // Finish loading the screen - await tester.pumpAndSettle(); - - // Check that the deep link params are null - expect(dashboardState(tester).currentDeepLinkParams, null); - }); - - testWidgetsWithAccessibilityChecks('Tapping Act As User button opens MasqueradeScreen', (tester) async { - await _setupLocator(); - - var login = Login((b) => b - ..domain = 'domain' - ..accessToken = 'token' - ..canMasquerade = true - ..user = CanvasModelTestUtils.mockUser().toBuilder()); - - await tester.pumpWidget(_testableMaterialWidget(initLogin: login)); - await tester.pumpAndSettle(); - - // Open the drawer - dashboardState(tester).scaffoldKey.currentState?.openDrawer(); - await tester.pumpAndSettle(); - - // Tap the 'Act As User' button - await tester.tap(find.text(l10n.actAsUser)); - await tester.pump(); - await tester.pump(); - await tester.pumpAndSettle(); - - expect(find.byType(MasqueradeScreen), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('Tapping Stop Acting As User button shows confirmation dialog', (tester) async { - await _setupLocator(); - - var login = Login((b) => b - ..domain = 'domain' - ..accessToken = 'token' - ..canMasquerade = true - ..user = CanvasModelTestUtils.mockUser().toBuilder() - ..masqueradeDomain = 'masqueradeDomain' - ..masqueradeUser = CanvasModelTestUtils.mockUser().toBuilder()); - - await tester.pumpWidget(_testableMaterialWidget(initLogin: login)); - await tester.pumpAndSettle(); - - // Open the drawer - dashboardState(tester).scaffoldKey.currentState?.openDrawer(); - await tester.pumpAndSettle(); - - // Tap the 'Stop Acting As User' button - await tester.tap(find.text(l10n.stopActAsUser)); - await tester.pump(); - await tester.pump(); - await tester.pumpAndSettle(); - - expect(find.byType(AlertDialog), findsOneWidget); - expect(find.text(l10n.endMasqueradeMessage(login.user.name)), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('Displays and dismisses Old Reminders dialog', (tester) async { - var interactor = MockInteractor(); - interactor.showOldReminderMessage = true; - await _setupLocator(interactor: interactor); - - // Load the screen - await tester.pumpWidget(_testableMaterialWidget()); - await tester.pumpAndSettle(); - - // Should display dialog - var dialog = find.byType(AlertDialog); - expect(dialog, findsOneWidget); - - // Should display correct title - var title = find.descendant(of: dialog, matching: find.text(AppLocalizations().oldReminderMessageTitle)); - expect(title, findsOneWidget); - - // Should display correct message - var message = find.descendant(of: dialog, matching: find.text(AppLocalizations().oldReminderMessage)); - expect(message, findsOneWidget); - - // Tap ok to dismiss - var ok = find.descendant(of: dialog, matching: find.text(AppLocalizations().ok)); - await tester.tap(ok); - await tester.pumpAndSettle(); - - // Dialog should no longer show - expect(find.byType(AlertDialog), findsNothing); - - // Should have logged analytics event - verify(analyticsMock.logEvent(AnalyticsEventConstants.VIEWED_OLD_REMINDER_MESSAGE)); - }); - - testWidgetsWithAccessibilityChecks('Does not display Old Reminders dialog if no reminders', (tester) async { - var interactor = MockInteractor(); - interactor.showOldReminderMessage = false; - await _setupLocator(interactor: interactor); - - // Load the screen - await tester.pumpWidget(_testableMaterialWidget()); - await tester.pumpAndSettle(); - - // Should not display dialog, title, or message - expect(find.byType(AlertDialog), findsNothing); - expect(find.text(AppLocalizations().oldReminderMessage), findsNothing); - expect(find.text(AppLocalizations().oldReminderMessageTitle), findsNothing); - }); - }); - - group('Loading', () { - testWidgetsWithAccessibilityChecks('Initiates call to update inbox count', (tester) async { - final inboxApi = MockInboxApi(); - var interactor = MockInteractor(); - await _setupLocator(interactor: interactor, inboxApi: inboxApi); - - await tester.pumpWidget(_testableMaterialWidget()); - await tester.pumpAndSettle(); - - // Open the nav drawer - dashboardState(tester).scaffoldKey.currentState?.openDrawer(); - await tester.pumpAndSettle(); - - verify(inboxApi.getUnreadCount()).called(1); - }); - - testWidgetsWithAccessibilityChecks('Updates Inbox count', (tester) async { - final inboxApi = MockInboxApi(); - var interactor = MockInteractor(); - when(inboxApi.getUnreadCount()) - .thenAnswer((_) => Future.value(UnreadCount((b) => b..count = JsonObject('12321')))); - await _setupLocator(interactor: interactor, inboxApi: inboxApi); - - await tester.pumpWidget(_testableMaterialWidget()); - await tester.pumpAndSettle(); - - // Open the nav drawer - dashboardState(tester).scaffoldKey.currentState?.openDrawer(); - await tester.pumpAndSettle(); - - when(inboxApi.getUnreadCount()) - .thenAnswer((_) => Future.value(UnreadCount((b) => b..count = JsonObject('78987')))); - - interactor.getInboxCountNotifier().update(); - await tester.pumpAndSettle(); - - expect(find.text('78987'), findsOneWidget); - }); - }); - - group('alert badge', () { - testWidgetsWithAccessibilityChecks('Initiates call to update alerts count', (tester) async { - final alertsApi = MockAlertsApi(); - var interactor = MockInteractor(); - await _setupLocator(interactor: interactor, alertsApi: alertsApi); - - await tester.pumpWidget(_testableMaterialWidget()); - await tester.pumpAndSettle(); - - // Open the nav drawer - dashboardState(tester).scaffoldKey.currentState?.openDrawer(); - await tester.pumpAndSettle(); - - verify(alertsApi.getAlertsDepaginated(any, any)).called(1); - }); - - testWidgetsWithAccessibilityChecks('Alerts count of zero hides badge', (tester) async { - final alertsApi = MockAlertsApi(); - var interactor = MockInteractor(); - when(alertsApi.getAlertsDepaginated(any, any)).thenAnswer((_) => Future.value([])); - await _setupLocator(interactor: interactor, alertsApi: alertsApi); - - await tester.pumpWidget(_testableMaterialWidget()); - await tester.pumpAndSettle(); - - // Open the nav drawer - dashboardState(tester).scaffoldKey.currentState?.openDrawer(); - await tester.pumpAndSettle(); - - // Assert there's no text in the alerts-count - expect(find.descendant(of: find.byKey(Key('alerts-count')), matching: find.byType(Text)), findsNothing); - }); - - testWidgetsWithAccessibilityChecks('Displays Alert count', (tester) async { - final alertsApi = MockAlertsApi(); - var interactor = MockInteractor(); - - final date = DateTime.now(); - final data = List.generate(5, (index) { - // Create a list of alerts with dates in ascending order (reversed) - return Alert((b) => b - ..id = index.toString() - ..workflowState = AlertWorkflowState.unread - ..actionDate = date.add(Duration(days: index)) - ..lockedForUser = false); - }); - - when(alertsApi.getAlertsDepaginated(any, any)).thenAnswer((_) => Future.value(data.toList())); - - await _setupLocator(interactor: interactor, alertsApi: alertsApi); - - await tester.pumpWidget(_testableMaterialWidget()); - await tester.pumpAndSettle(); - - // Open the nav drawer - dashboardState(tester).scaffoldKey.currentState?.openDrawer(); - await tester.pumpAndSettle(); - - expect(find.text('5'), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('Updates Alert count', (tester) async { - final alertsApi = MockAlertsApi(); - var interactor = MockInteractor(); - - final date = DateTime.now(); - final data = List.generate(5, (index) { - // Create a list of alerts with dates in ascending order (reversed) - return Alert((b) => b - ..id = index.toString() - ..workflowState = AlertWorkflowState.unread - ..actionDate = date.add(Duration(days: index)) - ..lockedForUser = false); - }); - - when(alertsApi.getAlertsDepaginated(any, any)).thenAnswer((_) => Future.value(data.toList())); - - await _setupLocator(interactor: interactor, alertsApi: alertsApi); - - await tester.pumpWidget(_testableMaterialWidget()); - await tester.pumpAndSettle(); - - // Open the nav drawer - dashboardState(tester).scaffoldKey.currentState?.openDrawer(); - await tester.pumpAndSettle(); - - when(alertsApi.getAlertsDepaginated(any, any)).thenAnswer((_) => Future.value(data.sublist(0, 4).toList())); - - interactor.getAlertCountNotifier().update('doesn\'t matter'); - await tester.pumpAndSettle(); - - expect(find.text('4'), findsOneWidget); - }); - }); - - // Need the Dashboard screen as well as the Calendar screen to test the today button. - // To avoid polluting the Calendar screen test file with Dashboard dependencies, these - // tests were put here instead of the Calendar screen - group('calendar today button', () { - testWidgetsWithAccessibilityChecks('today button not shown by default', (tester) async { - await _setupLocator(); - - var login = Login((b) => b - ..domain = 'domain' - ..accessToken = 'token' - ..user = CanvasModelTestUtils.mockUser().toBuilder()); - - // Start on the Calendar screen - await tester.pumpWidget(_testableMaterialWidget( - initLogin: login, - startingPage: DashboardContentScreens.Calendar, - )); - - // Wait for day activity dot animation delay to settle - await tester.pumpAndSettle(Duration(seconds: 1)); - - // Check we're on the Calendar screen - expect(find.byType(CalendarScreen), findsOneWidget); - - // Check to make sure the today button is hidden - expect(find.bySemanticsLabel(AppLocalizations().gotoTodayButtonLabel), findsNothing); - }); - - testWidgetsWithAccessibilityChecks('today button shown when date other than today selected', (tester) async { - await _setupLocator(); - - var login = Login((b) => b - ..domain = 'domain' - ..accessToken = 'token' - ..user = CanvasModelTestUtils.mockUser().toBuilder()); - - // Start on the Calendar screen - await tester.pumpWidget(_testableMaterialWidget( - initLogin: login, - startingPage: DashboardContentScreens.Calendar, - )); - - // Wait for day activity dot animation delay to settle - await tester.pumpAndSettle(Duration(seconds: 1)); - - // Check we're on the Calendar screen - expect(find.byType(CalendarScreen), findsOneWidget); - - // Make sure we aren't showing the today button - expect(find.bySemanticsLabel(AppLocalizations().gotoTodayButtonLabel), findsNothing); - - // Tap on another date - await goToDate(tester, DateTime.now().add(Duration(days: 2))); - - // Check to see if we are showing the today button - expect(find.bySemanticsLabel(AppLocalizations().gotoTodayButtonLabel), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('today button tap goes to now', (tester) async { - await _setupLocator(); - - var login = Login((b) => b - ..domain = 'domain' - ..accessToken = 'token' - ..user = CanvasModelTestUtils.mockUser().toBuilder()); - - // Start on the Calendar screen - await tester.pumpWidget(_testableMaterialWidget( - initLogin: login, - startingPage: DashboardContentScreens.Calendar, - )); - - Finder todayButton = find.bySemanticsLabel(AppLocalizations().gotoTodayButtonLabel); - - // Wait for day activity dot animation delay to settle - await tester.pumpAndSettle(Duration(seconds: 2)); - - // Check we're on the Calendar screen - expect(find.byType(CalendarScreen), findsOneWidget); - - // Make sure we aren't showing the today button - expect(todayButton, findsNothing); - - // Tap on another date - await goToDate(tester, DateTime.now().add(Duration(days: 2))); - - // Check to see if we are showing the today button - expect(todayButton, findsOneWidget); - - // Tap on today button - await tester.tap(todayButton); - - // Make sure we are on today's date - CalendarWidgetState state = tester.state(find.byType(CalendarWidget)); - expect(state.selectedDay.year, DateTime.now().year); - expect(state.selectedDay.month, DateTime.now().month); - expect(state.selectedDay.day, DateTime.now().day); - }); - - testWidgetsWithAccessibilityChecks('tapping today button hides button', (tester) async { - await _setupLocator(); - - var login = Login((b) => b - ..domain = 'domain' - ..accessToken = 'token' - ..user = CanvasModelTestUtils.mockUser().toBuilder()); - - // Start on the Calendar screen - await tester.pumpWidget(_testableMaterialWidget( - initLogin: login, - startingPage: DashboardContentScreens.Calendar, - )); - - Finder todayButton = find.bySemanticsLabel(AppLocalizations().gotoTodayButtonLabel); - - // Wait for day activity dot animation delay to settle - await tester.pumpAndSettle(Duration(seconds: 1)); - - // Check we're on the Calendar screen - expect(find.byType(CalendarScreen), findsOneWidget); - - // Check the today button is hidden - expect(todayButton, findsNothing); - - // Tap on another date - await goToDate(tester, DateTime.now().add(Duration(days: 2))); - - // Check to see if we are showing the today button - expect(todayButton, findsOneWidget); - - // Tap on today button - await tester.tap(todayButton); - - // Make sure we are on today's date - CalendarWidgetState state = tester.state(find.byType(CalendarWidget)); - expect(state.selectedDay.year, DateTime.now().year); - expect(state.selectedDay.month, DateTime.now().month); - expect(state.selectedDay.day, DateTime.now().day); - - // Wait for the button to be hidden - await tester.pumpAndSettle(); - - // Make sure we aren't showing the today button - expect(todayButton, findsNothing); - }); - - testWidgetsWithAccessibilityChecks('today button hides when not on calendar screen', (tester) async { - await _setupLocator(); - - var login = Login((b) => b - ..domain = 'domain' - ..accessToken = 'token' - ..user = CanvasModelTestUtils.mockUser().toBuilder()); - - // Start on the Calendar screen - await tester.pumpWidget(_testableMaterialWidget( - initLogin: login, - startingPage: DashboardContentScreens.Calendar, - )); - - Finder todayButton = find.bySemanticsLabel(AppLocalizations().gotoTodayButtonLabel); - - // Wait for day activity dot animation delay to settle - await tester.pumpAndSettle(Duration(seconds: 2)); - - expect(find.byType(CalendarScreen), findsOneWidget); - - // Check to make sure we aren't showing the today button - expect(todayButton, findsNothing); - - // Tap on another date - await goToDate(tester, DateTime.now().add(Duration(days: 2))); - - // Check to see if we are showing the today button - expect(todayButton, findsOneWidget); - - // Navigate to Courses - await tester.tap(find.text(AppLocalizations().coursesLabel)); - await tester.pumpAndSettle(); - - // Check to make sure we're on the Courses screen - expect(find.byType(CoursesScreen), findsOneWidget); - - // Check to make sure the today button is hidden - expect(todayButton, findsNothing); - }); - }); -} - -Future goToDate(WidgetTester tester, DateTime date) async { - CalendarWidgetState state = tester.state(find.byType(CalendarWidget)); - state.selectDay( - date, - dayPagerBehavior: CalendarPageChangeBehavior.jump, - weekPagerBehavior: CalendarPageChangeBehavior.jump, - monthPagerBehavior: CalendarPageChangeBehavior.jump, - ); - await tester.pumpAndSettle(Duration(seconds: 1)); - return state; -} - -DashboardState dashboardState(WidgetTester tester) => tester.state(find.byType(DashboardScreen)); - -StudentExpansionWidgetState studentExpansionState(WidgetTester tester) => - tester.state(find.byType(StudentExpansionWidget)); - -class MockHelpScreenInteractor extends HelpScreenInteractor { - @override - Future> getObserverCustomHelpLinks({bool forceRefresh = false}) => Future.value([]); -} - -class MockInteractor extends DashboardInteractor { - bool includePronouns; - bool generateStudents; - bool generateSelf; - bool showOldReminderMessage = false; - - MockInteractor({this.includePronouns = false, this.generateStudents = true, this.generateSelf = true}); - - @override - Future> getStudents({bool forceRefresh = false}) async => generateStudents - ? [ - CanvasModelTestUtils.mockUser( - name: 'Billy Name', shortName: 'Billy', pronouns: includePronouns ? 'he/him' : null), - CanvasModelTestUtils.mockUser( - name: 'Sally Name', shortName: 'Sally', pronouns: includePronouns ? 'she/her' : null), - CanvasModelTestUtils.mockUser( - name: 'Trevor Name', shortName: 'Trevor', pronouns: includePronouns ? 'he/him' : null), - ] - : []; - - @override - Future getSelf({app}) async => generateSelf - ? CanvasModelTestUtils.mockUser( - name: 'Marlene Name', - shortName: 'Marlene', - pronouns: includePronouns ? 'she/her' : null, - primaryEmail: 'marlene@instructure.com') - : null; - - @override - Future shouldShowOldReminderMessage() async => showOldReminderMessage; - - @override - Future requestNotificationPermission() async => PermissionStatus.granted; -} - -class MockCoursesInteractor extends CoursesInteractor { - @override - Future> getCourses({bool isRefresh = false, String? studentId = null}) async { - var courses = []; - return courses; - } -} - -class MockManageStudentsInteractor extends ManageStudentsInteractor { - @override - Future> getStudents({bool forceRefresh = false}) => Future.value([]); -} diff --git a/apps/flutter_parent/test/screens/dashboard/student_horizontal_list_view_test.dart b/apps/flutter_parent/test/screens/dashboard/student_horizontal_list_view_test.dart deleted file mode 100644 index 143f7ae923..0000000000 --- a/apps/flutter_parent/test/screens/dashboard/student_horizontal_list_view_test.dart +++ /dev/null @@ -1,198 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:flutter/material.dart'; -import 'package:flutter_parent/l10n/app_localizations.dart'; -import 'package:flutter_parent/network/api/accounts_api.dart'; -import 'package:flutter_parent/network/utils/analytics.dart'; -import 'package:flutter_parent/screens/dashboard/alert_notifier.dart'; -import 'package:flutter_parent/screens/dashboard/selected_student_notifier.dart'; -import 'package:flutter_parent/screens/dashboard/student_horizontal_list_view.dart'; -import 'package:flutter_parent/screens/pairing/pairing_util.dart'; -import 'package:flutter_parent/utils/design/parent_theme.dart'; -import 'package:flutter_parent/utils/design/student_color_set.dart'; -import 'package:flutter_parent/utils/quick_nav.dart'; -import 'package:flutter_test/flutter_test.dart'; -import 'package:mockito/mockito.dart'; -import 'package:provider/provider.dart'; - -import '../../utils/accessibility_utils.dart'; -import '../../utils/canvas_model_utils.dart'; -import '../../utils/test_app.dart'; -import '../../utils/test_helpers/mock_helpers.dart'; -import '../../utils/test_helpers/mock_helpers.mocks.dart'; - -void main() { - group('Render', () { - testWidgetsWithAccessibilityChecks('shows all students as well as add student button', (tester) async { - var student1 = CanvasModelTestUtils.mockUser(shortName: 'Billy'); - var student2 = CanvasModelTestUtils.mockUser(shortName: 'Sally'); - var student3 = CanvasModelTestUtils.mockUser(shortName: 'Trevor'); - var students = [student1, student2, student3]; - - AccountsApi accountsApi = MockAccountsApi(); - setupTestLocator((locator) { - locator.registerLazySingleton(() => accountsApi); - }); - - // Setup the widget - await tester.pumpWidget(TestApp(StudentHorizontalListView(students))); - await tester.pumpAndSettle(); - - // Check for the names of the students and the add student button - expect(find.text(student1.shortName!), findsOneWidget); - expect(find.text(student2.shortName!), findsOneWidget); - expect(find.text(student3.shortName!), findsOneWidget); - expect(find.text(AppLocalizations().addStudent), findsOneWidget); - }); - }); - - group('Interaction', () { - testWidgetsWithAccessibilityChecks('student tap updates selected student, theme, and calls onTap', (tester) async { - var student1 = CanvasModelTestUtils.mockUser(shortName: 'Billy'); - var student2 = CanvasModelTestUtils.mockUser(shortName: 'Sally'); - - var students = [student1, student2]; - - bool called = false; - Function tapped = () { - called = !called; - }; - - var notifier = SelectedStudentNotifier(); - final alertNotifier = _MockAlertCountNotifier(); - - setupTestLocator((locator) { - locator.registerLazySingleton(() => notifier); - locator.registerLazySingleton(() => alertNotifier); - locator.registerLazySingleton(() => MockAccountsApi()); - }); - - // Setup the widget - await tester - .pumpWidget(SelectedStudentNotifierTestApp(StudentHorizontalListView(students, onTap: tapped), notifier)); - await tester.pumpAndSettle(); - - // Check the initial value of the student notifier - expect(notifier.value, null); - - // Check the initial value of the theme, should be default student color (electric) - var state = ParentTheme.of(TestApp.navigatorKey.currentContext!); - expect(state?.studentColor, StudentColorSet.electric.light); - - // Check for the second student - expect(find.text(student2.shortName!), findsOneWidget); - - // Tap on the student - await tester.tap(find.text(student2.shortName!)); - await tester.pumpAndSettle(); // Wait for animations to settle - await tester.pump(); - - // Check the selected student notifier - expect(student2, notifier.value); - - // Check the theme, should be correct color for student - var expectedColor = (await state!.getColorsForStudent(student2.id)).light; - expect(state.studentColor, expectedColor); - - // Check to make sure we called the onTap function passed in - expect(called, true); - verify(alertNotifier.update(student2.id)).called(1); - }); - - testWidgetsWithAccessibilityChecks('add student tap calls PairingUtil', (tester) async { - var student1 = CanvasModelTestUtils.mockUser(name: 'Billy'); - - MockPairingUtil pairingUtil = MockPairingUtil(); - MockAccountsApi accountsApi = MockAccountsApi(); - - setupTestLocator((locator) { - locator.registerLazySingleton(() => QuickNav()); - locator.registerLazySingleton(() => pairingUtil); - locator.registerLazySingleton(() => MockAnalytics()); - locator.registerLazySingleton(() => accountsApi); - }); - - // Setup the widget - await tester.pumpWidget(TestApp(StudentHorizontalListView([student1]))); - await tester.pumpAndSettle(); - - expect(find.text(AppLocalizations().addStudent), findsOneWidget); - - // Tap the 'Add Student' button and wait for any transition animations to finish - await tester.tap(find.byType(ElevatedButton)); - await tester.pump(); - - // Check that PairingUtil was called - verify(pairingUtil.pairNewStudent(any, any)).called(1); - }); - }); - - testWidgetsWithAccessibilityChecks('attempt to pair with a student calls get students', (tester) async { - var student1 = CanvasModelTestUtils.mockUser(name: 'Billy'); - var callbackCalled = false; - - MockPairingUtil pairingUtil = MockPairingUtil(); - MockAccountsApi accountsApi = MockAccountsApi(); - final analytics = _MockAnalytics(); - - when(pairingUtil.pairNewStudent(any, any)).thenAnswer((inv) => inv.positionalArguments[1]()); - - setupTestLocator((locator) { - locator.registerLazySingleton(() => QuickNav()); - locator.registerLazySingleton(() => pairingUtil); - locator.registerLazySingleton(() => analytics); - locator.registerLazySingleton(() => accountsApi); - }); - - // Setup the widget - await tester.pumpWidget(TestApp(StudentHorizontalListView( - [student1], - onAddStudent: () { - callbackCalled = true; - }, - ))); - await tester.pumpAndSettle(); - - expect(find.text(AppLocalizations().addStudent), findsOneWidget); - - // Tap the 'Add Student' button and wait for any transition animations to finish - await tester.tap(find.byType(ElevatedButton)); - await tester.pumpAndSettle(); - - // Verify - expect(callbackCalled, true); - verify(pairingUtil.pairNewStudent(any, any)).called(1); - }); -} - -class SelectedStudentNotifierTestApp extends StatelessWidget { - final Widget child; - final SelectedStudentNotifier notifier; - SelectedStudentNotifierTestApp(this.child, this.notifier); - - @override - Widget build(BuildContext context) { - return ChangeNotifierProvider( - create: (context) => notifier, - child: Consumer(builder: (context, model, _) { - return TestApp(child); - }), - ); - } -} - -class _MockAnalytics extends Mock implements Analytics {} - -class _MockAlertCountNotifier extends Mock implements AlertCountNotifier {} diff --git a/apps/flutter_parent/test/screens/events/event_details_interactor_test.dart b/apps/flutter_parent/test/screens/events/event_details_interactor_test.dart deleted file mode 100644 index 9a3a72e4a9..0000000000 --- a/apps/flutter_parent/test/screens/events/event_details_interactor_test.dart +++ /dev/null @@ -1,134 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -import 'package:flutter_parent/l10n/app_localizations.dart'; -import 'package:flutter_parent/models/login.dart'; -import 'package:flutter_parent/models/reminder.dart'; -import 'package:flutter_parent/models/schedule_item.dart'; -import 'package:flutter_parent/models/user.dart'; -import 'package:flutter_parent/network/api/calendar_events_api.dart'; -import 'package:flutter_parent/network/utils/api_prefs.dart'; -import 'package:flutter_parent/screens/events/event_details_interactor.dart'; -import 'package:flutter_parent/utils/db/reminder_db.dart'; -import 'package:flutter_parent/utils/notification_util.dart'; -import 'package:mockito/mockito.dart'; -import 'package:test/test.dart'; - -import '../../utils/test_app.dart'; -import '../../utils/test_helpers/mock_helpers.mocks.dart'; - -void main() { - // Setup - final eventsApi = MockCalendarEventsApi(); - final reminderDb = MockReminderDb(); - final notificationUtil = MockNotificationUtil(); - final login = Login((b) => b - ..domain = 'test-domain' - ..user = User((u) => u..id = '123').toBuilder()); - - setupTestLocator((locator) { - locator.registerLazySingleton(() => eventsApi); - locator.registerLazySingleton(() => reminderDb); - locator.registerLazySingleton(() => notificationUtil); - }); - - setUp(() async { - reset(eventsApi); - reset(reminderDb); - reset(notificationUtil); - await setupPlatformChannels(); - await ApiPrefs.switchLogins(login); - }); - - // Start tests - test('loadEvent calls api', () { - final itemId = 'id'; - final interactor = EventDetailsInteractor(); - interactor.loadEvent(itemId, true); - verify(eventsApi.getEvent(itemId, true)).called(1); - }); - - test('loadReminder calls ReminderDb', () async { - final eventId = 'event-123'; - when(reminderDb.getByItem(any, any, any, any)).thenAnswer((_) async => null); - - await EventDetailsInteractor().loadReminder(eventId); - - verify(reminderDb.getByItem(login.domain, login.user.id, Reminder.TYPE_EVENT, eventId)); - }); - - test('loadReminder returns reminder if reminder date has not passed', () async { - final expected = Reminder((b) => b..date = DateTime.now().add(Duration(minutes: 1))); - when(reminderDb.getByItem(any, any, any, any)).thenAnswer((_) async => expected); - - final actual = await EventDetailsInteractor().loadReminder(''); - - expect(actual, expected); - }); - - test('loadReminder returns null if none exist for the event', () async { - when(reminderDb.getByItem(any, any, any, any)).thenAnswer((_) async => null); - - final actual = await EventDetailsInteractor().loadReminder(''); - - expect(actual, isNull); - }); - - test('loadReminder returns null if reminder date has passed', () async { - final reminder = Reminder((b) => b - ..id = 123 - ..date = DateTime.now().subtract(Duration(minutes: 1))); - when(reminderDb.getByItem(any, any, any, any)).thenAnswer((_) async => reminder); - - final actual = await EventDetailsInteractor().loadReminder(''); - - expect(actual, isNull); - verify(notificationUtil.deleteNotification(reminder.id)); - verify(reminderDb.deleteById(reminder.id)); - }); - - test('deleteReminder deletes reminder from database and notifications', () async { - final reminder = Reminder((b) => b..id = 123); - - await EventDetailsInteractor().deleteReminder(reminder); - - verify(notificationUtil.deleteNotification(reminder.id)); - verify(reminderDb.deleteById(reminder.id)); - }); - - test('createReminder inserts reminder into database and schedules a notification', () async { - final date = DateTime.now(); - final formattedDate = 'Febtember 34, 3031'; - final courseId = 'course_123'; - final event = ScheduleItem((b) => b - ..id = 'event-123' - ..title = 'Event title'); - - final reminder = Reminder((b) => b - ..userDomain = login.domain - ..userId = login.user.id - ..type = Reminder.TYPE_EVENT - ..itemId = event.id - ..courseId = courseId - ..date = date.toUtc()); - - final savedReminder = reminder.rebuild((b) => b..id = 123); - when(reminderDb.insert(reminder)).thenAnswer((_) async => savedReminder); - - final l10n = AppLocalizations(); - await EventDetailsInteractor().createReminder(l10n, date, event.id, courseId, event.title, formattedDate); - - verify(reminderDb.insert(reminder)); - verify(notificationUtil.scheduleReminder(l10n, event.title, formattedDate, savedReminder)); - }); -} \ No newline at end of file diff --git a/apps/flutter_parent/test/screens/events/event_details_screen_test.dart b/apps/flutter_parent/test/screens/events/event_details_screen_test.dart deleted file mode 100644 index b771d744ac..0000000000 --- a/apps/flutter_parent/test/screens/events/event_details_screen_test.dart +++ /dev/null @@ -1,480 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -import 'dart:convert'; - -import 'package:flutter/material.dart'; -import 'package:flutter_parent/l10n/app_localizations.dart'; -import 'package:flutter_parent/models/reminder.dart'; -import 'package:flutter_parent/models/schedule_item.dart'; -import 'package:flutter_parent/models/serializers.dart'; -import 'package:flutter_parent/models/user.dart'; -import 'package:flutter_parent/network/utils/api_prefs.dart'; -import 'package:flutter_parent/screens/events/event_details_interactor.dart'; -import 'package:flutter_parent/screens/events/event_details_screen.dart'; -import 'package:flutter_parent/screens/inbox/create_conversation/create_conversation_screen.dart'; -import 'package:flutter_parent/utils/common_widgets/error_panda_widget.dart'; -import 'package:flutter_parent/utils/common_widgets/loading_indicator.dart'; -import 'package:flutter_parent/utils/common_widgets/web_view/html_description_tile.dart'; -import 'package:flutter_parent/utils/common_widgets/web_view/web_content_interactor.dart'; -import 'package:flutter_parent/utils/core_extensions/date_time_extensions.dart'; -import 'package:flutter_parent/utils/quick_nav.dart'; -import 'package:flutter_test/flutter_test.dart'; -import 'package:mockito/mockito.dart'; - -import '../../utils/accessibility_utils.dart'; -import '../../utils/platform_config.dart'; -import '../../utils/test_app.dart'; -import '../../utils/test_helpers/mock_helpers.mocks.dart'; -import '../../utils/test_utils.dart'; - -void main() { - // Setup - final studentName = 'Panda'; - final studentId = '123'; - final student = User((b) => b - ..id = studentId - ..name = studentName); - - final eventId = '123'; - final courseId = 'course_123'; - final baseEvent = ScheduleItem((b) => b - ..id = eventId - ..type = ScheduleItem.apiTypeCalendar); - final reminder = Reminder((b) => b - ..id = 123 - ..userId = 'user-123' - ..type = 'type' - ..itemId = eventId - ..courseId = courseId - ..date = DateTime(2100) - ..userDomain = 'domain'); - - final interactor = MockEventDetailsInteractor(); - final mockNav = MockQuickNav(); - - final l10n = AppLocalizations(); - - setupTestLocator((locator) { - locator.registerLazySingleton(() => interactor); - locator.registerLazySingleton(() => mockNav); - locator.registerFactory(() => WebContentInteractor()); - }); - - tearDown(() { - ApiPrefs.clean(); - }); - - setUp(() async { - reset(interactor); - await setupPlatformChannels( - config: PlatformConfig(mockApiPrefs: {ApiPrefs.KEY_CURRENT_STUDENT: json.encode(serialize(student))}), - ); - }); - - // Start tests - test('with id throws if id is null', () { - expect(() => EventDetailsScreen.withId(eventId: null), throwsAssertionError); - }); - - test('with event throws if event is null', () { - expect(() => EventDetailsScreen.withEvent(event: null), throwsAssertionError); - }); - - testWidgetsWithAccessibilityChecks('shows error', (tester) async { - when(interactor.loadEvent(eventId, any)).thenAnswer((_) => Future.error('Failed to load event')); - - await tester.pumpWidget(_testableWidget(EventDetailsScreen.withId(eventId: eventId))); - await tester.pumpAndSettle(); // Let the future finish - - expect(find.byType(ErrorPandaWidget), findsOneWidget); - expect(find.text(l10n.unexpectedError), findsOneWidget); - - await tester.tap(find.text(l10n.retry)); - await tester.pumpAndSettle(); - - verify(interactor.loadEvent(eventId, any)).called(2); // Once for initial load, second for retry - }); - - group('shows loading', () { - testWidgetsWithAccessibilityChecks('with id', (tester) async { - await tester.pumpWidget(_testableWidget(EventDetailsScreen.withId(eventId: eventId))); - await tester.pump(); // Let the widget build - - expect(find.byType(LoadingIndicator), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('with event', (tester) async { - await tester.pumpWidget(_testableWidget(EventDetailsScreen.withEvent(event: baseEvent))); - await tester.pump(); // Let the widget build - - expect(find.byType(LoadingIndicator), findsOneWidget); - }); - }); - - group('can refresh', () { - testWidgetsWithAccessibilityChecks('with id', (tester) async { - when(interactor.loadEvent(eventId, any)).thenAnswer((_) async => baseEvent); - - await tester.pumpWidget(_testableWidget(EventDetailsScreen.withId(eventId: eventId))); - await tester.pump(); // Let the widget build - await tester.pump(); // Let the future finish - - final refresh = find.byType(RefreshIndicator); - expect(refresh, findsOneWidget); - await tester.drag(refresh, const Offset(0, 200)); - await tester.pumpAndSettle(); - - verify(interactor.loadEvent(eventId, any)).called(2); // Once for initial load, second for refresh - }); - - testWidgetsWithAccessibilityChecks('with event', (tester) async { - when(interactor.loadEvent(eventId, any)).thenAnswer((_) async => baseEvent); - - await tester.pumpWidget(_testableWidget(EventDetailsScreen.withId(eventId: eventId))); - await tester.pump(); // Let the widget build - await tester.pump(); // Let the future finish - - final refresh = find.byType(RefreshIndicator); - expect(refresh, findsOneWidget); - await tester.drag(refresh, const Offset(0, 200)); - await tester.pumpAndSettle(); - - verify(interactor.loadEvent(eventId, true)).called(1); // Only once for refresh, since initial load isn't required - }); - }); - - group('date', () { - testWidgetsWithAccessibilityChecks('shows all day events', (tester) async { - final date = DateTime(2000); - final event = baseEvent.rebuild((b) => b - ..isAllDay = true - ..startAt = date); - - await tester.pumpWidget(_testableWidget(EventDetailsScreen.withEvent(event: event))); - await tester.pump(); // Let the widget build - await tester.pump(); // Let the future finish - - expect(find.text(l10n.eventDateLabel), findsOneWidget); - expect(find.text('Saturday Jan 1, 2000'), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('shows all day events for endAt', (tester) async { - final date = DateTime(2000); - final event = baseEvent.rebuild((b) => b - ..isAllDay = true - ..endAt = date); - - await tester.pumpWidget(_testableWidget(EventDetailsScreen.withEvent(event: event))); - await tester.pump(); // Let the widget build - await tester.pump(); // Let the future finish - - expect(find.text(l10n.eventDateLabel), findsOneWidget); - expect(find.text('Saturday Jan 1, 2000'), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('shows events with a duration', (tester) async { - final startDate = DateTime(2000); - final endDate = startDate.add(Duration(hours: 2)); - final event = baseEvent.rebuild((b) => b - ..startAt = startDate - ..endAt = endDate); - - await tester.pumpWidget(_testableWidget(EventDetailsScreen.withEvent(event: event))); - await tester.pump(); // Let the widget build - await tester.pump(); // Let the future finish - - expect(find.text(l10n.eventDateLabel), findsOneWidget); - expect(find.text('Saturday Jan 1, 2000'), findsOneWidget); - expect(find.text(l10n.eventTime('12:00 AM', '2:00 AM')), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('shows events with only a start time', (tester) async { - final date = DateTime(2000); - final event = baseEvent.rebuild((b) => b..startAt = date); - - await tester.pumpWidget(_testableWidget(EventDetailsScreen.withEvent(event: event))); - await tester.pump(); // Let the widget build - await tester.pump(); // Let the future finish - - expect(find.text(l10n.eventDateLabel), findsOneWidget); - expect(find.text('Saturday Jan 1, 2000'), findsOneWidget); - expect(find.text('12:00 AM'), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('shows events with only an end time', (tester) async { - final date = DateTime(2000); - final event = baseEvent.rebuild((b) => b..endAt = date); - - await tester.pumpWidget(_testableWidget(EventDetailsScreen.withEvent(event: event))); - await tester.pump(); // Let the widget build - await tester.pump(); // Let the future finish - - expect(find.text(l10n.eventDateLabel), findsOneWidget); - expect(find.text('Saturday Jan 1, 2000'), findsOneWidget); - expect(find.text('12:00 AM'), findsOneWidget); - }); - }); - - group('location', () { - testWidgetsWithAccessibilityChecks('shows name and address', (tester) async { - final name = 'loc name'; - final address = 'loc address'; - final event = baseEvent.rebuild((b) => b - ..locationName = name - ..locationAddress = address); - - await tester.pumpWidget(_testableWidget(EventDetailsScreen.withEvent(event: event))); - await tester.pump(); // Let the widget build - await tester.pump(); // Let the future finish - - expect(find.text(l10n.eventLocationLabel), findsOneWidget); - expect(find.text(name), findsOneWidget); - expect(find.text(address), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('shows location name without address', (tester) async { - final name = 'loc name'; - final event = baseEvent.rebuild((b) => b..locationName = name); - - await tester.pumpWidget(_testableWidget(EventDetailsScreen.withEvent(event: event))); - await tester.pump(); // Let the widget build - await tester.pump(); // Let the future finish - - expect(find.text(l10n.eventLocationLabel), findsOneWidget); - expect(find.text(name), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('shows address without location name', (tester) async { - final address = 'loc address'; - final event = baseEvent.rebuild((b) => b..locationAddress = address); - - await tester.pumpWidget(_testableWidget(EventDetailsScreen.withEvent(event: event))); - await tester.pump(); // Let the widget build - await tester.pump(); // Let the future finish - - expect(find.text(l10n.eventLocationLabel), findsOneWidget); - expect(find.text(address), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('shows no location message', (tester) async { - final event = baseEvent; - - await tester.pumpWidget(_testableWidget(EventDetailsScreen.withEvent(event: event))); - await tester.pump(); // Let the widget build - await tester.pump(); // Let the future finish - - expect(find.text(l10n.eventLocationLabel), findsOneWidget); - expect(find.text(l10n.eventNoLocation), findsOneWidget); - }); - }); - - group('reminder', () { - testWidgetsWithAccessibilityChecks('shows correct state when reminder is set', (tester) async { - final title = 'Event Test Title'; - final event = baseEvent.rebuild((b) => b..title = title); - - when(interactor.loadReminder(any)).thenAnswer((_) async => reminder); - - await tester.pumpWidget(_testableWidget(EventDetailsScreen.withEvent(event: event))); - await tester.pump(); // Let the widget build - await tester.pump(); // Let the event future finish - await tester.pump(); // Let the reminder future finish - - expect(find.text(l10n.eventRemindMeDescription), findsNothing); - expect(find.text(l10n.eventRemindMeSet), findsOneWidget); - expect((tester.widget(find.byType(Switch)) as Switch).value, true); - expect(find.text(reminder.date.l10nFormat(AppLocalizations().dateAtTime)!), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('shows correct state when no reminder is set', (tester) async { - final title = 'Event Test Title'; - final event = baseEvent.rebuild((b) => b..title = title); - - await tester.pumpWidget(_testableWidget(EventDetailsScreen.withEvent(event: event))); - await tester.pump(); // Let the widget build - await tester.pump(); // Let the event future finish - await tester.pump(); // Let the reminder future finish - - expect(find.text(l10n.eventRemindMeDescription), findsOneWidget); - expect((tester.widget(find.byType(Switch)) as Switch).value, false); - }); - - testWidgetsWithAccessibilityChecks('creates reminder with all day date', (tester) async { - final title = 'Event Test Title'; - final event = baseEvent.rebuild((b) => b - ..title = title - ..isAllDay = true - ..startAt = DateTime(2000) - ..allDayDate = DateTime(2000)); - - when(interactor.loadReminder(any)).thenAnswer((_) async => null); - - await tester.pumpWidget(_testableWidget(EventDetailsScreen.withEvent(event: event, courseId: courseId))); - await tester.pump(); // Let the widget build - await tester.pump(); // Let the event future finish - await tester.pump(); // Let the reminder future finish - - when(interactor.loadReminder(any)).thenAnswer((_) async => reminder); - - // Tap on switch to open date picker - await ensureVisibleByScrolling(find.byType(Switch), tester, scrollFrom: ScreenVerticalLocation.MID_BOTTOM); - await tester.pumpAndSettle(); - await tester.tap(find.byType(Switch)); - await tester.pumpAndSettle(); - - // Tap on 'OK' button in date picker to open time picker - await tester.tap(find.text(DefaultMaterialLocalizations().okButtonLabel)); - await tester.pumpAndSettle(); - - // Tap on 'OK' button in time picker - await tester.tap(find.text(DefaultMaterialLocalizations().okButtonLabel)); - await tester.pumpAndSettle(); - - verify(interactor.createReminder(any, any, eventId, courseId, event.title, 'Saturday Jan 1, 2000')); - - expect(find.text(AppLocalizations().eventRemindMeSet), findsOneWidget); - expect((tester.widget(find.byType(Switch)) as Switch).value, true); - }); - - testWidgetsWithAccessibilityChecks('creates reminder with date range', (tester) async { - final title = 'Event Test Title'; - final startDate = DateTime(2000); - final endDate = startDate.add(Duration(hours: 2)); - final event = baseEvent.rebuild((b) => b - ..title = title - ..startAt = startDate - ..endAt = endDate); - - when(interactor.loadReminder(any)).thenAnswer((_) async => null); - - await tester.pumpWidget(_testableWidget(EventDetailsScreen.withEvent(event: event, courseId: courseId))); - await tester.pump(); // Let the widget build - await tester.pump(); // Let the event future finish - await tester.pump(); // Let the reminder future finish - - when(interactor.loadReminder(any)).thenAnswer((_) async => reminder); - - // Tap on switch to open date picker - await ensureVisibleByScrolling(find.byType(Switch), tester, scrollFrom: ScreenVerticalLocation.MID_BOTTOM); - await tester.pumpAndSettle(); - await tester.tap(find.byType(Switch)); - await tester.pumpAndSettle(); - - // Tap on 'OK' button in date picker to open time picker - await tester.tap(find.text(DefaultMaterialLocalizations().okButtonLabel)); - await tester.pumpAndSettle(); - - // Tap on 'OK' button in time picker - await tester.tap(find.text(DefaultMaterialLocalizations().okButtonLabel)); - await tester.pumpAndSettle(); - - verify(interactor.createReminder( - any, - any, - eventId, - courseId, - event.title, - 'Saturday Jan 1, 2000\n12:00 AM - 2:00 AM', - )); - - expect(find.text(AppLocalizations().eventRemindMeSet), findsOneWidget); - expect((tester.widget(find.byType(Switch)) as Switch).value, true); - }); - - testWidgetsWithAccessibilityChecks('deletes reminder', (tester) async { - final title = 'Event Test Title'; - final event = baseEvent.rebuild((b) => b..title = title); - - when(interactor.loadReminder(any)).thenAnswer((_) async => reminder); - - await tester.pumpWidget(_testableWidget(EventDetailsScreen.withEvent(event: event))); - await tester.pump(); // Let the widget build - await tester.pump(); // Let the event future finish - await tester.pump(); // Let the reminder future finish - - expect(find.text(l10n.eventRemindMeDescription), findsNothing); - expect(find.text(l10n.eventRemindMeSet), findsOneWidget); - expect((tester.widget(find.byType(Switch)) as Switch).value, true); - - when(interactor.loadReminder(any)).thenAnswer((_) async => null); - - await ensureVisibleByScrolling(find.byType(Switch), tester, scrollFrom: ScreenVerticalLocation.MID_BOTTOM); - await tester.pumpAndSettle(); - await tester.tap(find.byType(Switch)); - await tester.pumpAndSettle(); - - expect(find.text(l10n.eventRemindMeSet), findsNothing); - expect(find.text(l10n.eventRemindMeDescription), findsOneWidget); - expect((tester.widget(find.byType(Switch)) as Switch).value, false); - }); - }); - - testWidgetsWithAccessibilityChecks('shows event title', (tester) async { - final title = 'Event Test Title'; - final event = baseEvent.rebuild((b) => b..title = title); - - await tester.pumpWidget(_testableWidget(EventDetailsScreen.withEvent(event: event))); - await tester.pump(); // Let the widget build - await tester.pump(); // Let the future finish - - expect(find.text(l10n.eventDetailsTitle), findsOneWidget); - expect(find.text(title), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('shows description button', (tester) async { - final description = 'test description'; - final event = baseEvent.rebuild((b) => b..description = description); - - await tester.pumpWidget(_testableWidget( - EventDetailsScreen.withEvent(event: event), - // Set mockApiPrefs to null so our initial mockApiPrefs are not overridden - config: PlatformConfig(initWebview: true, mockApiPrefs: null), - )); - await tester.pump(); // Let the widget build - await tester.pump(); // Let the future finish - await tester.pump(); // Let the webview future finish - - expect(find.text(l10n.descriptionTitle), findsOneWidget); - await ensureVisibleByScrolling(find.byType(HtmlDescriptionTile), tester, - scrollFrom: ScreenVerticalLocation.MID_BOTTOM); - await tester.pumpAndSettle(); - expect(find.byType(HtmlDescriptionTile), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('shows create conversation screen with correct subject', (tester) async { - final title = 'Event Test Title'; - final event = baseEvent.rebuild((b) => b..title = title); - - await tester.pumpWidget(_testableWidget(EventDetailsScreen.withEvent(event: event, courseId: 'whatever'))); - await tester.pumpAndSettle(); // Let the widget build - - final fab = find.byType(FloatingActionButton); - expect(fab, findsOneWidget); - await tester.tap(fab); - - final widget = verify(mockNav.push(any, captureAny)).captured[0] as CreateConversationScreen; - expect(widget.subjectTemplate, l10n.eventSubjectMessage(studentName, title)); - }); -} - -// Default to null mock prefs, since set up is already called with a current student -Widget _testableWidget( - EventDetailsScreen eventDetailsScreen, { - PlatformConfig config = const PlatformConfig(mockApiPrefs: null), -}) { - return TestApp( - eventDetailsScreen, - platformConfig: config, - ); -} \ No newline at end of file diff --git a/apps/flutter_parent/test/screens/help/help_screen_interactor_test.dart b/apps/flutter_parent/test/screens/help/help_screen_interactor_test.dart deleted file mode 100644 index 2b827e1103..0000000000 --- a/apps/flutter_parent/test/screens/help/help_screen_interactor_test.dart +++ /dev/null @@ -1,169 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:built_collection/built_collection.dart'; -import 'package:flutter_parent/models/help_link.dart'; -import 'package:flutter_parent/models/help_links.dart'; -import 'package:flutter_parent/network/api/help_links_api.dart'; -import 'package:flutter_parent/screens/help/help_screen_interactor.dart'; -import 'package:flutter_test/flutter_test.dart'; -import 'package:mockito/mockito.dart'; - -import '../../utils/test_app.dart'; -import '../../utils/test_helpers/mock_helpers.mocks.dart'; - -void main() { - test('getObserverCustomHelpLinks calls to HelpLinksApi', () async { - var api = MockHelpLinksApi(); - await setupTestLocator((locator) => locator.registerLazySingleton(() => api)); - when(api.getHelpLinks(forceRefresh: anyNamed('forceRefresh'))).thenAnswer((_) => Future.value(createHelpLinks())); - - HelpScreenInteractor().getObserverCustomHelpLinks(); - - verify(api.getHelpLinks(forceRefresh: false)).called(1); - }); - - test('getObserverCustomHelpLinks only returns links for observers', () async { - var api = MockHelpLinksApi(); - var customLinks = [ - createHelpLink(availableTo: [AvailableTo.observer]), - createHelpLink(availableTo: [AvailableTo.user]), - createHelpLink(availableTo: [AvailableTo.unenrolled]), - createHelpLink(availableTo: [AvailableTo.teacher]) - ]; - - await setupTestLocator((locator) => locator.registerLazySingleton(() => api)); - when(api.getHelpLinks(forceRefresh: anyNamed('forceRefresh'))) - .thenAnswer((_) => Future.value(createHelpLinks(customLinks: customLinks))); - - var list = await HelpScreenInteractor().getObserverCustomHelpLinks(); - - // Verify that we called the api - verify(api.getHelpLinks(forceRefresh: false)).called(1); - - // Make sure the link available only to teachers is not in the returned list, but everything else is - expect(list.any((l) => l.availableTo.contains(AvailableTo.teacher)), false); - expect(list.any((l) => l.availableTo.contains(AvailableTo.observer)), true); - expect(list.any((l) => l.availableTo.contains(AvailableTo.user)), true); - expect(list.any((l) => l.availableTo.contains(AvailableTo.unenrolled)), false); - }); - - test('containsObserverLinks returns true when observer links present in list, false otherwise', () async { - var observerLinks = [ - createHelpLink(availableTo: [AvailableTo.observer]), - createHelpLink(availableTo: [AvailableTo.user]), - createHelpLink(availableTo: [AvailableTo.unenrolled]), - createHelpLink(availableTo: [AvailableTo.teacher]), - ]; - - var nonObserverLinks = [ - createHelpLink(availableTo: [AvailableTo.student]), - createHelpLink(availableTo: [AvailableTo.teacher]), - createHelpLink(availableTo: [AvailableTo.admin]), - createHelpLink(availableTo: [AvailableTo.admin]), - ]; - - expect(HelpScreenInteractor().containsObserverLinks(BuiltList.from(observerLinks)), true); - expect(HelpScreenInteractor().containsObserverLinks(BuiltList.from(nonObserverLinks)), false); - }); - - test('filterObserverLinks only returns observer links', () async { - var observerLinks = [ - createHelpLink(availableTo: [AvailableTo.observer]), - createHelpLink(availableTo: [AvailableTo.user]), - ]; - - var nonObserverLinks = [ - createHelpLink(availableTo: [AvailableTo.student]), - createHelpLink(availableTo: [AvailableTo.teacher]), - createHelpLink(availableTo: [AvailableTo.admin]), - createHelpLink(availableTo: [AvailableTo.admin]), - createHelpLink(availableTo: [AvailableTo.unenrolled]), - ]; - - expect(HelpScreenInteractor().filterObserverLinks(BuiltList.from([...observerLinks, ...nonObserverLinks])), - observerLinks); - }); - - test('filterObserverLinks only returns links that has text and url', () async { - var validLinks = [ - createHelpLink(availableTo: [AvailableTo.observer]), - createHelpLink(availableTo: [AvailableTo.user]), - ]; - - var invalidLinks = [ - createNullableHelpLink(url: 'url', availableTo: [AvailableTo.observer]), - createNullableHelpLink(text: 'text', availableTo: [AvailableTo.observer]), - ]; - - expect(HelpScreenInteractor().filterObserverLinks(BuiltList.from([...validLinks, ...invalidLinks])), - validLinks); - }); - - test('custom list is returned if there are any custom lists', () async { - var api = MockHelpLinksApi(); - var customLinks = [ - createHelpLink(availableTo: [AvailableTo.observer]), - createHelpLink(availableTo: [AvailableTo.user]), - ]; - - var defaultLinks = [ - createHelpLink(availableTo: [AvailableTo.unenrolled]), - createHelpLink(availableTo: [AvailableTo.student]), - createHelpLink(availableTo: [AvailableTo.teacher]), - createHelpLink(availableTo: [AvailableTo.admin]), - createHelpLink(availableTo: [AvailableTo.admin]), - ]; - - await setupTestLocator((locator) => locator.registerLazySingleton(() => api)); - when(api.getHelpLinks(forceRefresh: anyNamed('forceRefresh'))) - .thenAnswer((_) => Future.value(createHelpLinks(customLinks: customLinks, defaultLinks: defaultLinks))); - - expect(await HelpScreenInteractor().getObserverCustomHelpLinks(), customLinks); - }); - - test('default list is returned if there are no custom lists', () async { - var api = MockHelpLinksApi(); - var defaultLinks = [ - createHelpLink(availableTo: [AvailableTo.user]), - createHelpLink(availableTo: [AvailableTo.observer]), - ]; - - await setupTestLocator((locator) => locator.registerLazySingleton(() => api)); - when(api.getHelpLinks(forceRefresh: anyNamed('forceRefresh'))) - .thenAnswer((_) => Future.value(createHelpLinks(customLinks: [], defaultLinks: defaultLinks))); - - expect(await HelpScreenInteractor().getObserverCustomHelpLinks(), defaultLinks); - }); -} - -HelpLinks createHelpLinks({List? customLinks, List? defaultLinks}) => HelpLinks((b) => b - ..customHelpLinks = ListBuilder(customLinks != null ? customLinks : [createHelpLink()]) - ..defaultHelpLinks = ListBuilder(defaultLinks != null ? defaultLinks : [createHelpLink()])); - -HelpLink createHelpLink({String? id, String? text, String? url, List? availableTo}) => HelpLink((b) => b - ..id = id ?? '' - ..type = '' - ..availableTo = ListBuilder(availableTo != null ? availableTo : []) - ..url = url ?? 'https://www.instructure.com' - ..text = text ?? 'text' - ..subtext = 'subtext'); - -HelpLink createNullableHelpLink({String? id, String? text, String? url, List? availableTo}) => HelpLink((b) => b - ..id = id - ..type = '' - ..availableTo = ListBuilder(availableTo != null ? availableTo : []) - ..url = url - ..text = text - ..subtext = 'subtext'); \ No newline at end of file diff --git a/apps/flutter_parent/test/screens/help/help_screen_test.dart b/apps/flutter_parent/test/screens/help/help_screen_test.dart deleted file mode 100644 index 4e941449fc..0000000000 --- a/apps/flutter_parent/test/screens/help/help_screen_test.dart +++ /dev/null @@ -1,214 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -import 'package:built_collection/built_collection.dart'; -import 'package:flutter_parent/l10n/app_localizations.dart'; -import 'package:flutter_parent/models/help_link.dart'; -import 'package:flutter_parent/models/login.dart'; -import 'package:flutter_parent/models/user.dart'; -import 'package:flutter_parent/screens/help/help_screen.dart'; -import 'package:flutter_parent/screens/help/help_screen_interactor.dart'; -import 'package:flutter_parent/utils/common_widgets/error_report/error_report_dialog.dart'; -import 'package:flutter_parent/utils/quick_nav.dart'; -import 'package:flutter_parent/utils/url_launcher.dart'; -import 'package:flutter_parent/utils/veneers/android_intent_veneer.dart'; -import 'package:flutter_test/flutter_test.dart'; -import 'package:mockito/mockito.dart'; - -import '../../utils/accessibility_utils.dart'; -import '../../utils/platform_config.dart'; -import '../../utils/test_app.dart'; -import '../../utils/test_helpers/mock_helpers.mocks.dart'; - -void main() { - final l10n = AppLocalizations(); - MockUrlLauncher launcher = MockUrlLauncher(); - MockAndroidIntentVeneer intentVeneer = MockAndroidIntentVeneer(); - MockHelpScreenInteractor interactor = MockHelpScreenInteractor(); - - setupTestLocator((locator) { - locator.registerSingleton(QuickNav()); - locator.registerLazySingleton(() => intentVeneer); - locator.registerLazySingleton(() => interactor); - locator.registerLazySingleton(() => launcher); - }); - - setUp(() { - reset(intentVeneer); - reset(interactor); - reset(launcher); - }); - - testWidgetsWithAccessibilityChecks('displays links', (tester) async { - when(interactor.getObserverCustomHelpLinks(forceRefresh: anyNamed('forceRefresh'))) - .thenAnswer((_) => Future.value([_createHelpLink()])); - - await tester.pumpWidget(TestApp(HelpScreen())); - await tester.pumpAndSettle(); - - expect(find.text('text'), findsOneWidget); - expect(find.text('subtext'), findsOneWidget); - - expect(find.text(l10n.helpShareLoveLabel), findsOneWidget); - expect(find.text(l10n.helpShareLoveDescription), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('tapping search launches url', (tester) async { - when(interactor.getObserverCustomHelpLinks(forceRefresh: anyNamed('forceRefresh'))).thenAnswer( - (_) => Future.value([_createHelpLink(id: 'search_the_canvas_guides', text: 'Search the Canvas Guides')])); - - await tester.pumpWidget(TestApp(HelpScreen())); - await tester.pumpAndSettle(); - - await tester.tap(find.text('Search the Canvas Guides')); - await tester.pumpAndSettle(); - - verify( - launcher.launch( - 'https://community.canvaslms.com/community/answers/guides/mobile-guide/content?filterID=contentstatus%5Bpublished%5D~category%5Btable-of-contents%5D', - ), - ).called(1); - }); - - testWidgetsWithAccessibilityChecks('tapping share love launches url', (tester) async { - when(interactor.getObserverCustomHelpLinks(forceRefresh: anyNamed('forceRefresh'))) - .thenAnswer((_) => Future.value([])); - - await tester.pumpWidget(TestApp(HelpScreen())); - await tester.pumpAndSettle(); - - await tester.tap(find.text(l10n.helpShareLoveLabel)); - await tester.pumpAndSettle(); - - verify( - launcher.launchAppStore(), - ).called(1); - }); - - testWidgetsWithAccessibilityChecks('tapping report problem shows error report dialog', (tester) async { - when(interactor.getObserverCustomHelpLinks(forceRefresh: anyNamed('forceRefresh'))) - .thenAnswer((_) => Future.value([_createHelpLink(url: '#create_ticket', text: 'Report a Problem')])); - - await tester.pumpWidget(TestApp(HelpScreen())); - await tester.pumpAndSettle(); - - await tester.tap(find.text('Report a Problem')); - await tester.pumpAndSettle(); - - expect(find.byType(ErrorReportDialog), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('tapping request feature launches email intent', (tester) async { - when(interactor.getObserverCustomHelpLinks(forceRefresh: anyNamed('forceRefresh'))) - .thenAnswer((_) => Future.value([_createHelpLink(id: 'submit_feature_idea', text: 'Request a Feature')])); - - final user = User((b) => b - ..id = '123' - ..primaryEmail = '123@321.com' - ..effectiveLocale = 'en-jp'); - final login = Login((b) => b - ..user = user.toBuilder() - ..domain = 'dough main'); - - String emailBody = '' + - '${l10n.featureRequestHeader}\r\n' + - '${l10n.helpUserId} ${user.id}\r\n' + - '${l10n.helpEmail} ${user.primaryEmail}\r\n' + - '${l10n.helpDomain} ${login.domain}\r\n' + - '${l10n.versionNumber}: Canvas v1.0.0 (3)\r\n' + - '${l10n.helpLocale} ${user.effectiveLocale}\r\n' + - '----------------------------------------------\r\n'; - - await tester.pumpWidget(TestApp( - HelpScreen(), - platformConfig: PlatformConfig(initLoggedInUser: login), - )); - await tester.pumpAndSettle(); - - await tester.tap(find.text('Request a Feature')); - await tester.pumpAndSettle(); - - verify(intentVeneer.launchEmailWithBody(l10n.featureRequestSubject, emailBody)).called(1); - }); - - testWidgetsWithAccessibilityChecks('tapping telephone link launches correct intent', (tester) async { - var telUri = 'tel:+123'; - var text = 'Telephone'; - - when(interactor.getObserverCustomHelpLinks(forceRefresh: anyNamed('forceRefresh'))) - .thenAnswer((_) => Future.value([_createHelpLink(url: telUri, text: text)])); - - await tester.pumpWidget(TestApp(HelpScreen(), highContrast: true)); - await tester.pumpAndSettle(); - - await tester.tap(find.text(text)); - await tester.pumpAndSettle(); - - verify(intentVeneer.launchPhone(telUri)).called(1); - }); - - testWidgetsWithAccessibilityChecks('tapping canvas chat support launches mobile browser intent', (tester) async { - var url = 'https://cases.canvaslms.com/liveagentchat'; - var text = 'Chat'; - - when(interactor.getObserverCustomHelpLinks(forceRefresh: anyNamed('forceRefresh'))) - .thenAnswer((_) => Future.value([_createHelpLink(url: url, text: text)])); - - await tester.pumpWidget(TestApp(HelpScreen(), highContrast: true)); - await tester.pumpAndSettle(); - - await tester.tap(find.text(text)); - await tester.pumpAndSettle(); - - verify(launcher.launch(url)).called(1); - }); - - testWidgetsWithAccessibilityChecks('tapping mailto link launches correct intent', (tester) async { - var mailto = 'mailto:pandas@instructure.com'; - var text = 'Mailto'; - - when(interactor.getObserverCustomHelpLinks(forceRefresh: anyNamed('forceRefresh'))) - .thenAnswer((_) => Future.value([_createHelpLink(url: mailto, text: text)])); - - await tester.pumpWidget(TestApp(HelpScreen(), highContrast: true)); - await tester.pumpAndSettle(); - - await tester.tap(find.text(text)); - await tester.pumpAndSettle(); - - verify(intentVeneer.launchEmail(mailto)).called(1); - }); - - testWidgetsWithAccessibilityChecks('tapping an unhandled link launches', (tester) async { - var url = 'https://www.instructure.com'; - var text = 'Some link'; - when(interactor.getObserverCustomHelpLinks(forceRefresh: anyNamed('forceRefresh'))) - .thenAnswer((_) => Future.value([_createHelpLink(url: url, text: text)])); - - await tester.pumpWidget(TestApp(HelpScreen(), highContrast: true)); - await tester.pumpAndSettle(); - - await tester.tap(find.text(text)); - await tester.pumpAndSettle(); - - verify(launcher.launch(url)).called(1); - }); -} - -HelpLink _createHelpLink({String? id, String? text, String? url}) => HelpLink((b) => b - ..id = id ?? '' - ..type = '' - ..availableTo = BuiltList.of([]).toBuilder() - ..url = url ?? 'https://www.instructure.com' - ..text = text ?? 'text' - ..subtext = 'subtext'); diff --git a/apps/flutter_parent/test/screens/help/terms_of_service_screen_test.dart b/apps/flutter_parent/test/screens/help/terms_of_service_screen_test.dart deleted file mode 100644 index 41d3865b83..0000000000 --- a/apps/flutter_parent/test/screens/help/terms_of_service_screen_test.dart +++ /dev/null @@ -1,90 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'dart:async'; - -import 'package:flutter_parent/l10n/app_localizations.dart'; -import 'package:flutter_parent/models/terms_of_service.dart'; -import 'package:flutter_parent/network/api/accounts_api.dart'; -import 'package:flutter_parent/screens/help/terms_of_use_screen.dart'; -import 'package:flutter_parent/utils/common_widgets/error_panda_widget.dart'; -import 'package:flutter_parent/utils/common_widgets/loading_indicator.dart'; -import 'package:flutter_test/flutter_test.dart'; -import 'package:mockito/mockito.dart'; -import 'package:webview_flutter/webview_flutter.dart'; - -import '../../utils/accessibility_utils.dart'; -import '../../utils/platform_config.dart'; -import '../../utils/test_app.dart'; -import '../../utils/test_helpers/mock_helpers.mocks.dart'; - -void main() { - AppLocalizations l10n = AppLocalizations(); - - final accountApi = MockAccountsApi(); - - setupTestLocator((locator) { - locator.registerLazySingleton(() => accountApi); - }); - - setUpAll(() { - reset(accountApi); - }); - - testWidgetsWithAccessibilityChecks('Displays title and loading indicator', (tester) async { - Completer completer = Completer(); - when(accountApi.getTermsOfService()).thenAnswer((_) => completer.future); - - await tester.pumpWidget(TestApp(TermsOfUseScreen())); - await tester.pump(); - - expect(find.text(l10n.termsOfUse), findsOneWidget); - expect(find.byType(LoadingIndicator), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('Displays error state and reloads', (tester) async { - when(accountApi.getTermsOfService()).thenAnswer((_) => Future.error('')); - - await tester.pumpWidget(TestApp(TermsOfUseScreen())); - await tester.pumpAndSettle(); - - expect(find.byType(ErrorPandaWidget), findsOneWidget); - expect(find.text(l10n.errorLoadingTermsOfUse), findsOneWidget); - - Completer completer = Completer(); - when(accountApi.getTermsOfService()).thenAnswer((_) => completer.future); - - await tester.tap(find.text(l10n.retry)); - await tester.pump(); - - expect(find.byType(ErrorPandaWidget), findsNothing); - expect(find.byType(LoadingIndicator), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('Displays WebView', (tester) async { - when(accountApi.getTermsOfService()).thenAnswer((_) async => TermsOfService((b) => b - ..id = '123' - ..passive = false - ..accountId = '1' - ..content = 'Fake Terms of Service')); - - await tester.pumpWidget(TestApp( - TermsOfUseScreen(), - platformConfig: PlatformConfig(initWebview: true), - )); - await tester.pumpAndSettle(); - - expect(find.byType(WebView), findsOneWidget); - }); -} \ No newline at end of file diff --git a/apps/flutter_parent/test/screens/inbox/attachment_utils/attachment_handler_test.dart b/apps/flutter_parent/test/screens/inbox/attachment_utils/attachment_handler_test.dart deleted file mode 100644 index 06d88a921a..0000000000 --- a/apps/flutter_parent/test/screens/inbox/attachment_utils/attachment_handler_test.dart +++ /dev/null @@ -1,285 +0,0 @@ -// Copyright (C) 2019 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'dart:async'; -import 'dart:io'; - -import 'package:built_value/json_object.dart'; -import 'package:dio/dio.dart'; -import 'package:flutter_parent/models/attachment.dart'; -import 'package:flutter_parent/network/api/file_api.dart'; -import 'package:flutter_parent/screens/inbox/attachment_utils/attachment_handler.dart'; -import 'package:flutter_parent/utils/veneers/path_provider_veneer.dart'; -import 'package:flutter_test/flutter_test.dart'; -import 'package:mockito/mockito.dart'; - -import '../../../utils/test_app.dart'; -import '../../../utils/test_helpers/mock_helpers.mocks.dart'; - -void main() { - setUpAll(() async { - // Move to a temp dir so we don't write test files to the project dir - Directory.current = Directory.systemTemp; - await Directory('cache').create(); - }); - - tearDownAll(() async { - // Delete cache dir and contents - await Directory('cache').delete(recursive: true); - }); - - test('Is constructed in "created" stage with indeterminate progress', () { - var handler = AttachmentHandler(File('')); - expect(handler.stage, equals(AttachmentUploadStage.CREATED)); - expect(handler.progress, isNull); - }); - - test('Calls onStageChange when stage changes', () { - var handler = AttachmentHandler(File('')); - - AttachmentUploadStage? lastStage = null; - handler.onStageChange = (stage) => lastStage = stage; - - handler.stage = AttachmentUploadStage.CREATED; - expect(lastStage, equals(AttachmentUploadStage.CREATED)); - - handler.stage = AttachmentUploadStage.UPLOADING; - expect(lastStage, equals(AttachmentUploadStage.UPLOADING)); - - handler.stage = AttachmentUploadStage.FAILED; - expect(lastStage, equals(AttachmentUploadStage.FAILED)); - - handler.stage = AttachmentUploadStage.FINISHED; - expect(lastStage, equals(AttachmentUploadStage.FINISHED)); - }); - - test('Notifies listeners during upload', () async { - final api = MockFileApi(); - final pathProvider = MockPathProviderVeneer(); - - await setupTestLocator((locator) { - locator.registerLazySingleton(() => api); - locator.registerLazySingleton(() => pathProvider); - }); - - when(pathProvider.getTemporaryDirectory()).thenAnswer((_) async => Directory('other')); - when(pathProvider.getApplicationSupportDirectory()).thenAnswer((_) async => Directory('other')); - when(pathProvider.getExternalStorageDirectory()).thenAnswer((_) async => Directory('other')); - - final completer = Completer(); - - when(api.uploadConversationFile(any, any)).thenAnswer((_) => completer.future); - - // Create file - var file = File('cache/test-file.txt'); - file.writeAsStringSync('This is a test!'); - - var handler = AttachmentHandler(file); - - // Expect updates for: - // 1 - Change to 'uploading' stage - // 3 - Mock API updates progress with null (i.e. indeterminate) - // 2 - Mock API updates progress with value - // 4 - Upload completes internally, progress updated to indeterminate - // 5 - Change to 'finished' stage after short delay to allow thumbnail generation on the server - final expectedCount = 5; - - var actualCount = 0; - handler.addListener(() { - actualCount++; - }); - - var uploadFuture = handler.performUpload(); - - expect(handler.stage, equals(AttachmentUploadStage.UPLOADING)); - - ProgressCallback callback = verify(api.uploadConversationFile(any, captureAny)).captured.single; - - callback(0, -1); - expect(handler.progress, isNull); - - callback(5, 10); - expect(handler.progress, equals(0.5)); - - completer.complete(Attachment()); - - await uploadFuture; - expect(handler.stage, equals(AttachmentUploadStage.FINISHED)); - expect(actualCount, equals(expectedCount)); - }); - - test('Sets failed state when API fails', () async { - final api = MockFileApi(); - await setupTestLocator((locator) => locator.registerLazySingleton(() => api)); - - when(api.uploadConversationFile(any, any)).thenAnswer((_) => Future.error('Error!')); - - var handler = AttachmentHandler(File('')); - await handler.performUpload(); - expect(handler.stage, equals(AttachmentUploadStage.FAILED)); - }); - - test('performUpload does nothing if stage is uploading or finished', () async { - final api = MockFileApi(); - await setupTestLocator((locator) => locator.registerLazySingleton(() => api)); - - var handler = AttachmentHandler(File('')) - ..stage = AttachmentUploadStage.UPLOADING - ..progress = 0.25; - - handler.performUpload(); - - // Stage and progress should remain unchanged - expect(handler.stage, equals(AttachmentUploadStage.UPLOADING)); - expect(handler.progress, equals(0.25)); - - handler.stage = AttachmentUploadStage.FINISHED; - handler.progress = 1.0; - - handler.performUpload(); - - expect(handler.stage, equals(AttachmentUploadStage.FINISHED)); - expect(handler.progress, equals(1.0)); - - // Ensure the API was not called - verifyNever(api.uploadConversationFile(any, any)); - }); - - test('displayName returns attachment display name', () { - var attachment = Attachment((b) => b - ..displayName = 'Attachment display name' - ..filename = 'file.txt'); - var handler = AttachmentHandler(File('/path/to/file.txt'))..attachment = attachment; - expect(handler.displayName, attachment.displayName); - }); - - test('displayName falls back to attachment file name when attachment display name is null', () { - var attachment = Attachment((b) => b - ..displayName = null - ..filename = 'file.txt'); - var handler = AttachmentHandler(File('/path/to/file.txt'))..attachment = attachment; - expect(handler.displayName, attachment.filename); - }); - - test('displayName falls back to file name when attachment is null', () { - var handler = AttachmentHandler(File('/path/to/file.txt'))..attachment = null; - expect(handler.displayName, 'file.txt'); - }); - - test('displayName falls back to empty string when attachment is null and file is null', () { - var handler = AttachmentHandler(null)..attachment = null; - expect(handler.displayName, ''); - }); - - test('cleans up file if local', () async { - final pathProvider = MockPathProviderVeneer(); - - await setupTestLocator((locator) { - locator.registerLazySingleton(() => pathProvider); - }); - - when(pathProvider.getTemporaryDirectory()).thenAnswer((_) async => Directory('cache')); - when(pathProvider.getApplicationSupportDirectory()).thenAnswer((_) async => Directory('cache')); - when(pathProvider.getExternalStorageDirectory()).thenAnswer((_) async => Directory('cache')); - - // Create file - var file = File('cache/test-file.txt'); - file.writeAsStringSync('This is a test!'); - - expect(file.existsSync(), isTrue); - - var handler = AttachmentHandler(file); - await handler.cleanUpFile(); - - expect(file.existsSync(), isFalse); - }); - - test('does not clean up file if not local', () async { - final pathProvider = MockPathProviderVeneer(); - - await setupTestLocator((locator) { - locator.registerLazySingleton(() => pathProvider); - }); - - when(pathProvider.getTemporaryDirectory()).thenAnswer((_) async => Directory('other')); - when(pathProvider.getApplicationSupportDirectory()).thenAnswer((_) async => Directory('other')); - when(pathProvider.getExternalStorageDirectory()).thenAnswer((_) async => Directory('other')); - - // Create file - var file = File('cache/test-file.txt'); - file.writeAsStringSync('This is a test!'); - - expect(file.existsSync(), isTrue); - - var handler = AttachmentHandler(file); - await handler.cleanUpFile(); - - expect(file.existsSync(), isTrue); - }); - - test('cleanUpFile prints error on failure', interceptPrint((log) async { - final pathProvider = MockPathProviderVeneer(); - - await setupTestLocator((locator) { - locator.registerLazySingleton(() => pathProvider); - }); - - when(pathProvider.getTemporaryDirectory()).thenAnswer((_) => Future.error(Error())); - - var handler = AttachmentHandler(null); - await handler.cleanUpFile(); - - expect(log.length, greaterThan(0)); - expect(log.first, 'Unable to clean up attachment source file'); - })); - - test('deleteAttachment calls API if attachment exists', () async { - final api = MockFileApi(); - await setupTestLocator((locator) => locator.registerLazySingleton(() => api)); - when(api.deleteFile(any)).thenAnswer((_) async {}); - - var handler = AttachmentHandler(null)..attachment = Attachment((a) => a..jsonId = JsonObject('attachment_123')); - await handler.deleteAttachment(); - - verify(api.deleteFile('attachment_123')); - }); - - test('deleteAttachment does not call API if attachment is null', () async { - final api = MockFileApi(); - await setupTestLocator((locator) => locator.registerLazySingleton(() => api)); - - var handler = AttachmentHandler(null); - await handler.deleteAttachment(); - - verifyNever(api.deleteFile(any)); - }); - - test('deleteAttachment prints error on failure', interceptPrint((log) async { - final api = MockFileApi(); - await setupTestLocator((locator) => locator.registerLazySingleton(() => api)); - when(api.deleteFile(any)).thenAnswer((_) => Future.error(Error())); - - var handler = AttachmentHandler(null)..attachment = Attachment((a) => a..jsonId = JsonObject('attachment_123')); - await handler.deleteAttachment(); - - expect(log.length, greaterThan(0)); - expect(log.first, 'Unable to delete attachment'); - })); -} - -interceptPrint(testBody(List log)) => () { - final List log = []; - final spec = ZoneSpecification(print: (self, parent, zone, String msg) => log.add(msg)); - return Zone.current.fork(specification: spec).run(() => testBody(log)); - }; diff --git a/apps/flutter_parent/test/screens/inbox/attachment_utils/attachment_picker_test.dart b/apps/flutter_parent/test/screens/inbox/attachment_utils/attachment_picker_test.dart deleted file mode 100644 index baf6d1f162..0000000000 --- a/apps/flutter_parent/test/screens/inbox/attachment_utils/attachment_picker_test.dart +++ /dev/null @@ -1,252 +0,0 @@ -// Copyright (C) 2019 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'dart:async'; -import 'dart:io'; - -import 'package:flutter/material.dart'; -import 'package:flutter_parent/l10n/app_localizations.dart'; -import 'package:flutter_parent/screens/inbox/attachment_utils/attachment_handler.dart'; -import 'package:flutter_parent/screens/inbox/attachment_utils/attachment_picker.dart'; -import 'package:flutter_parent/screens/inbox/attachment_utils/attachment_picker_interactor.dart'; -import 'package:flutter_parent/screens/inbox/create_conversation/create_conversation_interactor.dart'; -import 'package:flutter_test/flutter_test.dart'; -import 'package:mockito/mockito.dart'; - -import '../../../utils/accessibility_utils.dart'; -import '../../../utils/test_app.dart'; -import '../../../utils/test_helpers/mock_helpers.mocks.dart'; - -void main() { - final l10n = AppLocalizations(); - - testWidgetsWithAccessibilityChecks('Tapping camera option shows preparing UI', (tester) async { - final interactor = MockAttachmentPickerInteractor(); - _setupLocator(interactor); - - when(interactor.getImageFromCamera()).thenAnswer((_) => Completer().future); - - await tester.pumpWidget(TestApp(AttachmentPicker())); - await tester.pump(); - - // Tap camera option - await tester.tap(find.text(l10n.useCamera)); - await tester.pump(); - - expect(find.text(l10n.attachmentPreparing), findsOneWidget); - expect(find.byType(LinearProgressIndicator), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('Tapping gallery option shows preparing UI', (tester) async { - final interactor = MockAttachmentPickerInteractor(); - _setupLocator(interactor); - - when(interactor.getImageFromGallery()).thenAnswer((_) => Completer().future); - - await tester.pumpWidget(TestApp(AttachmentPicker())); - await tester.pump(); - - // Tap gallery option - await tester.tap(find.text(l10n.chooseFromGallery)); - await tester.pump(); - - expect(find.text(l10n.attachmentPreparing), findsOneWidget); - expect(find.byType(LinearProgressIndicator), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('Tapping file option shows preparing UI', (tester) async { - final interactor = MockAttachmentPickerInteractor(); - _setupLocator(interactor); - - when(interactor.getFileFromDevice()).thenAnswer((_) => Completer().future); - - await tester.pumpWidget(TestApp(AttachmentPicker())); - await tester.pump(); - - // Tap file option - await tester.tap(find.text(l10n.uploadFile)); - await tester.pump(); - - expect(find.text(l10n.attachmentPreparing), findsOneWidget); - expect(find.byType(LinearProgressIndicator), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('Tapping camera option invokes interactor methods', (tester) async { - final interactor = MockAttachmentPickerInteractor(); - _setupLocator(interactor); - - await tester.pumpWidget(TestApp(AttachmentPicker())); - await tester.pump(); - - // Tap camera option - await tester.tap(find.text(l10n.useCamera)); - await tester.pump(); - - verify(interactor.getImageFromCamera()).called(1); - }); - - testWidgetsWithAccessibilityChecks('Tapping gallery option invokes interactor methods', (tester) async { - final interactor = MockAttachmentPickerInteractor(); - _setupLocator(interactor); - - await tester.pumpWidget(TestApp(AttachmentPicker())); - await tester.pump(); - - // Tap gallery option - await tester.tap(find.text(l10n.chooseFromGallery)); - await tester.pump(); - - verify(interactor.getImageFromGallery()).called(1); - }); - - testWidgetsWithAccessibilityChecks('Tapping file option invokes interactor methods', (tester) async { - final interactor = MockAttachmentPickerInteractor(); - _setupLocator(interactor); - - await tester.pumpWidget(TestApp(AttachmentPicker())); - await tester.pump(); - - // Tap file option - await tester.tap(find.text(l10n.uploadFile)); - await tester.pump(); - - verify(interactor.getFileFromDevice()).called(1); - }); - - testWidgetsWithAccessibilityChecks('Canceling camera option returns to picker ui', (tester) async { - final interactor = MockAttachmentPickerInteractor(); - _setupLocator(interactor); - - final completer = Completer(); - when(interactor.getImageFromCamera()).thenAnswer((_) => completer.future); - - await tester.pumpWidget(TestApp(AttachmentPicker())); - await tester.pump(); - - // Tap camera option - await tester.tap(find.text(l10n.useCamera)); - await tester.pump(); - - // Should show 'preparing' UI - expect(find.text(l10n.attachmentPreparing), findsOneWidget); - expect(find.byType(LinearProgressIndicator), findsOneWidget); - - // Complete with nul (i.e. canceled) value - completer.complete(null); - await tester.pumpAndSettle(); - - // Should no longer show 'preparing' UI - expect(find.text(l10n.attachmentPreparing), findsNothing); - expect(find.byType(LinearProgressIndicator), findsNothing); - - // Should show picker options - expect(find.text(l10n.useCamera), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('Canceling gallery option returns to picker ui', (tester) async { - final interactor = MockAttachmentPickerInteractor(); - _setupLocator(interactor); - - final completer = Completer(); - when(interactor.getImageFromGallery()).thenAnswer((_) => completer.future); - - await tester.pumpWidget(TestApp(AttachmentPicker())); - await tester.pump(); - - // Tap gallery option - await tester.tap(find.text(l10n.chooseFromGallery)); - await tester.pump(); - - // Should show 'preparing' UI - expect(find.text(l10n.attachmentPreparing), findsOneWidget); - expect(find.byType(LinearProgressIndicator), findsOneWidget); - - // Complete with nul (i.e. canceled) value - completer.complete(null); - await tester.pumpAndSettle(); - - // Should no longer show 'preparing' UI - expect(find.text(l10n.attachmentPreparing), findsNothing); - expect(find.byType(LinearProgressIndicator), findsNothing); - - // Should show picker options - expect(find.text(l10n.chooseFromGallery), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('Canceling file option returns to picker ui', (tester) async { - final interactor = MockAttachmentPickerInteractor(); - _setupLocator(interactor); - - final completer = Completer(); - when(interactor.getFileFromDevice()).thenAnswer((_) => completer.future); - - await tester.pumpWidget(TestApp(AttachmentPicker())); - await tester.pump(); - - // Tap file option - await tester.tap(find.text(l10n.uploadFile)); - await tester.pump(); - - // Should show 'preparing' UI - expect(find.text(l10n.attachmentPreparing), findsOneWidget); - expect(find.byType(LinearProgressIndicator), findsOneWidget); - - // Complete with nul (i.e. canceled) value - completer.complete(null); - await tester.pumpAndSettle(); - - // Should no longer show 'preparing' UI - expect(find.text(l10n.attachmentPreparing), findsNothing); - expect(find.byType(LinearProgressIndicator), findsNothing); - - // Should show picker options - expect(find.text(l10n.uploadFile), findsOneWidget); - }); - - testWidgets('Returns non-null result when successful', (tester) async { - final interactor = MockAttachmentPickerInteractor(); - _setupLocator(interactor); - - final file = File('/fake/path'); - when(interactor.getFileFromDevice()).thenAnswer((_) => Future.value(file)); - - AttachmentHandler? result = null; - - await tester.pumpWidget(TestApp(Builder( - builder: (context) => Container( - child: ElevatedButton( - child: Container(), - onPressed: () async { - result = await CreateConversationInteractor().addAttachment(context); - }, - ), - ), - ))); - await tester.pump(); - - await tester.tap(find.byType(ElevatedButton)); - await tester.pumpAndSettle(); - - // Tap file option - await tester.tap(find.text(l10n.uploadFile)); - await tester.pumpAndSettle(); - - expect(find.byType(ElevatedButton), findsOneWidget); - - expect(result, isNotNull); - }); -} - -_setupLocator(MockAttachmentPickerInteractor interactor) => - setupTestLocator((locator) => locator.registerFactory(() => interactor)); diff --git a/apps/flutter_parent/test/screens/inbox/conversation_details/conversation_details_interactor_test.dart b/apps/flutter_parent/test/screens/inbox/conversation_details/conversation_details_interactor_test.dart deleted file mode 100644 index 4a4937ca50..0000000000 --- a/apps/flutter_parent/test/screens/inbox/conversation_details/conversation_details_interactor_test.dart +++ /dev/null @@ -1,114 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:flutter/widgets.dart'; -import 'package:flutter_parent/models/attachment.dart'; -import 'package:flutter_parent/models/conversation.dart'; -import 'package:flutter_parent/models/login.dart'; -import 'package:flutter_parent/models/message.dart'; -import 'package:flutter_parent/models/user.dart'; -import 'package:flutter_parent/network/api/inbox_api.dart'; -import 'package:flutter_parent/screens/dashboard/inbox_notifier.dart'; -import 'package:flutter_parent/screens/inbox/conversation_details/conversation_details_interactor.dart'; -import 'package:flutter_parent/screens/inbox/reply/conversation_reply_screen.dart'; -import 'package:flutter_parent/utils/common_widgets/view_attachment/view_attachment_screen.dart'; -import 'package:flutter_parent/utils/quick_nav.dart'; -import 'package:mockito/mockito.dart'; -import 'package:test/test.dart'; - -import '../../../utils/platform_config.dart'; -import '../../../utils/test_app.dart'; -import '../../../utils/test_helpers/mock_helpers.mocks.dart'; - -void main() { - test('getConversation calls InboxApi with correct parameters', () async { - final conversationId = '123'; - - var api = MockInboxApi(); - await setupTestLocator((locator) { - locator.registerLazySingleton(() => api); - locator.registerLazySingleton(() => MockInboxCountNotifier()); - }); - - await ConversationDetailsInteractor().getConversation(conversationId); - verify(api.getConversation(conversationId, refresh: true)).called(1); - }); - - test('getConversation updates InboxCountNotifier when successful', () async { - var api = MockInboxApi(); - var notifier = MockInboxCountNotifier(); - - await setupTestLocator((locator) { - locator.registerLazySingleton(() => api); - locator.registerLazySingleton(() => notifier); - }); - - when(api.getConversation(any, refresh: anyNamed('refresh'))).thenAnswer((_) => Future.value(Conversation())); - - await ConversationDetailsInteractor().getConversation(''); - - verify(notifier.update()).called(1); - }); - - test('getCurrentUserId gets user ID from ApiPrefs', () async { - var expectedId = 'self_1234'; - - final login = Login((b) => b..user = User((u) => u..id = expectedId).toBuilder()); - await setupPlatformChannels(config: PlatformConfig(initLoggedInUser: login)); - - var actualId = ConversationDetailsInteractor().getCurrentUserId(); - - expect(actualId, expectedId); - }); - - test('addReply calls QuickNav with correct parameters', () async { - var nav = MockQuickNav(); - await setupTestLocator((locator) { - locator.registerLazySingleton(() => nav); - }); - - Conversation conversation = Conversation(); - Message message = Message(); - bool replyAll = true; - BuildContext context = MockBuildContext(); - - await ConversationDetailsInteractor().addReply(context, conversation, message, replyAll); - var verification = verify(nav.push(context, captureAny)); - - verification.called(1); - expect(verification.captured[0], isA()); - - var screen = verification.captured[0] as ConversationReplyScreen; - expect(screen.conversation, conversation); - expect(screen.message, message); - expect(screen.replyAll, replyAll); - }); - - test('viewAttachment calls QuickNav with correct parameters', () async { - var nav = MockQuickNav(); - await setupTestLocator((locator) { - locator.registerLazySingleton(() => nav); - }); - - Attachment attachment = Attachment(); - BuildContext context = MockBuildContext(); - - await ConversationDetailsInteractor().viewAttachment(context, attachment); - var verification = verify(nav.push(context, captureAny)); - - verification.called(1); - expect(verification.captured[0], isA()); - expect((verification.captured[0] as ViewAttachmentScreen).attachment, attachment); - }); -} \ No newline at end of file diff --git a/apps/flutter_parent/test/screens/inbox/conversation_details/conversation_details_screen_test.dart b/apps/flutter_parent/test/screens/inbox/conversation_details/conversation_details_screen_test.dart deleted file mode 100644 index 9bd4cd6344..0000000000 --- a/apps/flutter_parent/test/screens/inbox/conversation_details/conversation_details_screen_test.dart +++ /dev/null @@ -1,619 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'dart:async'; - -import 'package:built_collection/built_collection.dart'; -import 'package:built_value/json_object.dart'; -import 'package:flutter/foundation.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter/widgets.dart'; -import 'package:flutter_parent/l10n/app_localizations.dart'; -import 'package:flutter_parent/models/attachment.dart'; -import 'package:flutter_parent/models/basic_user.dart'; -import 'package:flutter_parent/models/conversation.dart'; -import 'package:flutter_parent/models/message.dart'; -import 'package:flutter_parent/screens/inbox/conversation_details/conversation_details_interactor.dart'; -import 'package:flutter_parent/screens/inbox/conversation_details/conversation_details_screen.dart'; -import 'package:flutter_parent/screens/inbox/conversation_details/message_widget.dart'; -import 'package:flutter_parent/utils/common_widgets/error_panda_widget.dart'; -import 'package:flutter_parent/utils/common_widgets/loading_indicator.dart'; -import 'package:flutter_parent/utils/quick_nav.dart'; -import 'package:flutter_test/flutter_test.dart'; -import 'package:mockito/mockito.dart'; - -import '../../../utils/accessibility_utils.dart'; -import '../../../utils/finders.dart'; -import '../../../utils/network_image_response.dart'; -import '../../../utils/test_app.dart'; -import '../../../utils/test_helpers/mock_helpers.mocks.dart'; - -void main() { - mockNetworkImageResponse(); - - final AppLocalizations l10n = AppLocalizations(); - - group('Displays messages', () { - testWidgetsWithAccessibilityChecks('displays single message', (tester) async { - var interactor = MockConversationDetailsInteractor(); - setupTestLocator((locator) => locator.registerFactory(() => interactor)); - - var conversation = Conversation((c) => c - ..messages = ListBuilder([ - Message((m) => m - ..authorId = '123' - ..createdAt = DateTime.now() - ..body = 'This is a message' - ..attachments = ListBuilder([]) - ..participatingUserIds = ListBuilder(['123'])) - ]) - ..participants = ListBuilder([ - BasicUser((b) => b - ..id = '123' - ..name = 'Myself'), - ])); - - when(interactor.getConversation(any)).thenAnswer((_) => Future.value(conversation)); - when(interactor.getCurrentUserId()).thenReturn('123'); - - await tester.pumpWidget( - TestApp( - ConversationDetailsScreen(conversationId: '', conversationSubject: '', courseName: ''), - ), - ); - await tester.pumpAndSettle(); - - var messageWidget = find.byType(MessageWidget); - expect(messageWidget, findsOneWidget); - expect( - find.descendant(of: messageWidget, matching: find.richText(conversation.messages![0].body!)), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('displays multiple messages in correct order', (tester) async { - var interactor = MockConversationDetailsInteractor(); - setupTestLocator((locator) => locator.registerFactory(() => interactor)); - - var conversation = Conversation((c) => c - ..messages = ListBuilder([ - Message((m) => m - ..authorId = '123' - ..createdAt = DateTime.now().subtract(Duration(seconds: 5)) - ..body = 'This is message 1' - ..attachments = ListBuilder([]) - ..participatingUserIds = ListBuilder(['123'])), - Message((m) => m - ..authorId = '124' - ..createdAt = DateTime.now().subtract(Duration(minutes: 1)) - ..body = 'This is message 2' - ..attachments = ListBuilder([]) - ..participatingUserIds = ListBuilder(['123'])), - Message((m) => m - ..authorId = '125' - ..createdAt = DateTime.now().subtract(Duration(minutes: 5)) - ..body = 'This is message 3' - ..attachments = ListBuilder([]) - ..participatingUserIds = ListBuilder(['123'])) - ]) - ..participants = ListBuilder([ - BasicUser((b) => b - ..id = '123' - ..name = 'Myself'), - BasicUser((b) => b - ..id = '124' - ..name = 'Some Person'), - BasicUser((b) => b - ..id = '125' - ..name = 'Some Other Person'), - ])); - - when(interactor.getConversation(any)).thenAnswer((_) => Future.value(conversation)); - when(interactor.getCurrentUserId()).thenReturn('123'); - - await tester.pumpWidget( - TestApp( - ConversationDetailsScreen(conversationId: '', conversationSubject: '', courseName: ''), - ), - ); - await tester.pumpAndSettle(); - - // Should have three MessageWidgets - expect(find.byType(MessageWidget).evaluate().length, 3); - - // Get widget positions in the same order as the messages in the conversation - var messageWidgetOffsets = conversation.messages! - .map((it) => find.ancestor(of: find.richText(it.body!), matching: find.byType(MessageWidget))) - .map((it) => tester.getTopLeft(it)) - .toList(); - - // The second message should be displayed below the first message - expect(messageWidgetOffsets[1].dy, greaterThan(messageWidgetOffsets[0].dy)); - - // The third message should be displayed below the second message - expect(messageWidgetOffsets[2].dy, greaterThan(messageWidgetOffsets[1].dy)); - }); - }); - - group('Displays base details', () { - testWidgetsWithAccessibilityChecks('loading state', (tester) async { - final subject = 'This is a subject'; - var interactor = MockConversationDetailsInteractor(); - setupTestLocator((locator) => locator.registerFactory(() => interactor)); - - Completer completer = Completer(); - when(interactor.getConversation(any)).thenAnswer((_) => completer.future); - - await tester.pumpWidget( - TestApp(ConversationDetailsScreen(conversationId: '', conversationSubject: subject, courseName: '')), - ); - await tester.pump(); - - expect(find.byType(LoadingIndicator), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('conversation subject', (tester) async { - final subject = 'This is a subject'; - var interactor = MockConversationDetailsInteractor(); - setupTestLocator((locator) => locator.registerFactory(() => interactor)); - when(interactor.getConversation(any)).thenAnswer((_) => Future.value(Conversation())); - - await tester.pumpWidget( - TestApp(ConversationDetailsScreen(conversationId: '', conversationSubject: subject, courseName: '')), - ); - await tester.pumpAndSettle(); - - expect(find.descendant(of: find.byType(AppBar), matching: find.text(subject)), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('course name', (tester) async { - final courseName = 'BIO 101'; - var interactor = MockConversationDetailsInteractor(); - setupTestLocator((locator) => locator.registerFactory(() => interactor)); - when(interactor.getConversation(any)).thenAnswer((_) => Future.value(Conversation())); - - await tester.pumpWidget( - TestApp(ConversationDetailsScreen(conversationId: '', conversationSubject: '', courseName: courseName)), - ); - await tester.pumpAndSettle(); - - expect(find.descendant(of: find.byType(AppBar), matching: find.text(courseName)), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('reply FAB', (tester) async { - var interactor = MockConversationDetailsInteractor(); - setupTestLocator((locator) => locator.registerFactory(() => interactor)); - when(interactor.getConversation(any)).thenAnswer((_) => Future.value(Conversation())); - - await tester.pumpWidget( - TestApp(ConversationDetailsScreen(conversationId: '', conversationSubject: '', courseName: '')), - ); - await tester.pumpAndSettle(); - - expect(find.byType(FloatingActionButton), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('error state', (tester) async { - var interactor = MockConversationDetailsInteractor(); - setupTestLocator((locator) => locator.registerFactory(() => interactor)); - when(interactor.getConversation(any)).thenAnswer((_) => Future.error('')); - - await tester.pumpWidget( - TestApp( - ConversationDetailsScreen(conversationId: '', conversationSubject: '', courseName: ''), - ), - ); - await tester.pumpAndSettle(); - - var errorWidget = find.byType(ErrorPandaWidget); - var errorMessage = find.descendant(of: errorWidget, matching: find.text(l10n.errorLoadingConversation)); - - expect(errorWidget, findsOneWidget); - expect(errorMessage, findsOneWidget); - expect(find.byType(FloatingActionButton), findsNothing); - }); - }); - - group('interactions', () { - testWidgetsWithAccessibilityChecks('Displays conversation reply options', (tester) async { - var interactor = MockConversationDetailsInteractor(); - setupTestLocator((locator) => locator.registerFactory(() => interactor)); - when(interactor.getConversation(any)).thenAnswer((_) => Future.value(Conversation())); - - await tester.pumpWidget( - TestApp(ConversationDetailsScreen(conversationId: '', conversationSubject: '', courseName: '')), - ); - await tester.pumpAndSettle(); - - var fab = find.byType(FloatingActionButton); - expect(fab, findsOneWidget); - - await tester.tap(fab); - await tester.pumpAndSettle(); - - expect(find.text(l10n.reply), findsOneWidget); - expect(find.text(l10n.replyAll), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('Clicking attachment calls interactor', (tester) async { - final attachments = [ - Attachment((b) => b - ..jsonId = JsonObject('1') - ..displayName = 'Attachment 1'), - ]; - var interactor = MockConversationDetailsInteractor(); - setupTestLocator((locator) => locator.registerFactory(() => interactor)); - - var conversation = Conversation((c) => c - ..messages = ListBuilder([ - Message((m) => m - ..authorId = '123' - ..createdAt = DateTime(2020, 12, 25, 8, 34, 0, 0, 0) - ..body = '' - ..attachments = ListBuilder(attachments) - ..participatingUserIds = ListBuilder(['123'])) - ]) - ..participants = ListBuilder([ - BasicUser((b) => b - ..id = '123' - ..name = 'Myself'), - ])); - - when(interactor.getConversation(any)).thenAnswer((_) => Future.value(conversation)); - when(interactor.getCurrentUserId()).thenReturn('123'); - - await tester.pumpWidget( - TestApp( - ConversationDetailsScreen(conversationId: '', conversationSubject: '', courseName: ''), - ), - ); - await tester.pumpAndSettle(); - - var attachment1 = find.byKey(Key('attachment-1')); - expect(attachment1, findsOneWidget); - - await tester.tap(attachment1); - - verify(interactor.viewAttachment(any, attachments[0])).called(1); - }); - - testWidgetsWithAccessibilityChecks('Replying to conversation calls interactor', (tester) async { - final conversation = Conversation(); - var interactor = MockConversationDetailsInteractor(); - setupTestLocator((locator) => locator.registerFactory(() => interactor)); - when(interactor.getConversation(any)).thenAnswer((_) => Future.value(conversation)); - - await tester.pumpWidget( - TestApp(ConversationDetailsScreen(conversationId: '', conversationSubject: '', courseName: '')), - ); - await tester.pumpAndSettle(); - - var fab = find.byType(FloatingActionButton); - expect(fab, findsOneWidget); - - await tester.tap(fab); - await tester.pumpAndSettle(); - - await tester.tap(find.text(l10n.reply)); - await tester.pumpAndSettle(); - - verify(interactor.addReply(any, conversation, null, false)).called(1); - }); - - testWidgetsWithAccessibilityChecks('Replying all to conversation calls interactor', (tester) async { - final conversation = Conversation(); - var interactor = MockConversationDetailsInteractor(); - setupTestLocator((locator) => locator.registerFactory(() => interactor)); - when(interactor.getConversation(any)).thenAnswer((_) => Future.value(conversation)); - - await tester.pumpWidget( - TestApp(ConversationDetailsScreen(conversationId: '', conversationSubject: '', courseName: '')), - ); - await tester.pumpAndSettle(); - - var fab = find.byType(FloatingActionButton); - expect(fab, findsOneWidget); - - await tester.tap(fab); - await tester.pumpAndSettle(); - - await tester.tap(find.text(l10n.replyAll)); - await tester.pumpAndSettle(); - - verify(interactor.addReply(any, conversation, null, true)).called(1); - }); - - testWidgetsWithAccessibilityChecks('Swiping message reveals reply options', (tester) async { - var interactor = MockConversationDetailsInteractor(); - setupTestLocator((locator) => locator.registerFactory(() => interactor)); - - var conversation = Conversation((c) => c - ..messages = ListBuilder([ - Message((m) => m - ..id = '1' - ..authorId = '123' - ..createdAt = DateTime(2020, 12, 25, 8, 34, 0, 0, 0) - ..body = '' - ..participatingUserIds = ListBuilder(['123'])) - ]) - ..participants = ListBuilder([ - BasicUser((b) => b - ..id = '123' - ..name = 'Myself'), - ])); - - when(interactor.getConversation(any)).thenAnswer((_) => Future.value(conversation)); - when(interactor.getCurrentUserId()).thenReturn('123'); - - await tester.pumpWidget( - TestApp( - ConversationDetailsScreen(conversationId: '', conversationSubject: '', courseName: ''), - ), - ); - await tester.pumpAndSettle(); - await tester.drag(find.byKey(Key('message-1')), Offset(-300, 0)); - await tester.pumpAndSettle(); - - expect(find.text(l10n.reply), findsOneWidget); - expect(find.text(l10n.replyAll), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('Replying to individual message calls interactor', (tester) async { - var interactor = MockConversationDetailsInteractor(); - setupTestLocator((locator) => locator.registerFactory(() => interactor)); - - var conversation = Conversation((c) => c - ..messages = ListBuilder([ - Message((m) => m - ..id = '1' - ..authorId = '123' - ..createdAt = DateTime(2020, 12, 25, 8, 34, 0, 0, 0) - ..body = '' - ..participatingUserIds = ListBuilder(['123'])) - ]) - ..participants = ListBuilder([ - BasicUser((b) => b - ..id = '123' - ..name = 'Myself'), - ])); - - when(interactor.getConversation(any)).thenAnswer((_) => Future.value(conversation)); - when(interactor.getCurrentUserId()).thenReturn('123'); - - await tester.pumpWidget( - TestApp( - ConversationDetailsScreen(conversationId: '', conversationSubject: '', courseName: ''), - ), - ); - await tester.pumpAndSettle(); - await tester.drag(find.byKey(Key('message-1')), Offset(-300, 0)); - await tester.pumpAndSettle(); - - await tester.tap(find.text(l10n.reply)); - await tester.pumpAndSettle(); - - verify(interactor.addReply(any, conversation, conversation.messages![0], false)).called(1); - }); - - testWidgetsWithAccessibilityChecks('Replying all to individual message calls interactor', (tester) async { - var interactor = MockConversationDetailsInteractor(); - setupTestLocator((locator) => locator.registerFactory(() => interactor)); - - var conversation = Conversation((c) => c - ..messages = ListBuilder([ - Message((m) => m - ..id = '1' - ..authorId = '123' - ..createdAt = DateTime(2020, 12, 25, 8, 34, 0, 0, 0) - ..body = '' - ..participatingUserIds = ListBuilder(['123'])) - ]) - ..participants = ListBuilder([ - BasicUser((b) => b - ..id = '123' - ..name = 'Myself'), - ])); - - when(interactor.getConversation(any)).thenAnswer((_) => Future.value(conversation)); - when(interactor.getCurrentUserId()).thenReturn('123'); - - await tester.pumpWidget( - TestApp( - ConversationDetailsScreen(conversationId: '', conversationSubject: '', courseName: ''), - ), - ); - await tester.pumpAndSettle(); - await tester.drag(find.byKey(Key('message-1')), Offset(-300, 0)); - await tester.pumpAndSettle(); - - await tester.tap(find.text(l10n.replyAll)); - await tester.pumpAndSettle(); - - verify(interactor.addReply(any, conversation, conversation.messages![0], true)).called(1); - }); - - testWidgetsWithAccessibilityChecks('error state refresh calls interactor', (tester) async { - final conversationId = '100'; - var interactor = MockConversationDetailsInteractor(); - setupTestLocator((locator) => locator.registerFactory(() => interactor)); - when(interactor.getConversation(any)).thenAnswer((_) => Future.error('')); - - await tester.pumpWidget( - TestApp( - ConversationDetailsScreen(conversationId: conversationId, conversationSubject: '', courseName: ''), - ), - ); - await tester.pumpAndSettle(); - - verify(interactor.getConversation(conversationId)).called(1); - - when(interactor.getConversation(any)).thenAnswer((_) => Future.value(Conversation())); - await tester.tap(find.text(l10n.retry)); - await tester.pumpAndSettle(); - - verify(interactor.getConversation(conversationId)).called(1); - expect(find.byType(ErrorPandaWidget), findsNothing); - }); - - testWidgetsWithAccessibilityChecks('pull-to-refresh calls interactor', (tester) async { - final conversationId = '100'; - var interactor = MockConversationDetailsInteractor(); - setupTestLocator((locator) => locator.registerFactory(() => interactor)); - when(interactor.getConversation(any)).thenAnswer((_) => Future.value(Conversation())); - - await tester.pumpWidget( - TestApp( - ConversationDetailsScreen(conversationId: conversationId, conversationSubject: '', courseName: ''), - ), - ); - await tester.pumpAndSettle(); - - verify(interactor.getConversation(conversationId)).called(1); - - await tester.drag(find.byType(RefreshIndicator), Offset(0, 300)); - await tester.pumpAndSettle(); - - verify(interactor.getConversation(conversationId)).called(1); - }); - - testWidgetsWithAccessibilityChecks('updates after adding message', (tester) async { - var interactor = MockConversationDetailsInteractor(); - setupTestLocator((locator) => locator.registerFactory(() => interactor)); - - var message1Body = 'Original message'; - var message2Body = 'Message reply'; - - var conversation = Conversation((c) => c - ..messages = ListBuilder([ - Message((m) => m - ..id = '1' - ..authorId = '123' - ..createdAt = DateTime(2020, 12, 25, 8, 34, 0, 0, 0) - ..body = message1Body - ..participatingUserIds = ListBuilder(['123'])) - ]) - ..participants = ListBuilder([ - BasicUser((b) => b - ..id = '123' - ..name = 'Myself'), - ])); - - var updatedConversation = conversation.rebuild((c) => c - ..messages = ListBuilder([ - c.messages[0], - c.messages[0].rebuild((m) => m - ..body = message2Body - ..createdAt = DateTime.now()), - ])); - - when(interactor.getConversation(any)).thenAnswer((_) => Future.value(conversation)); - when(interactor.addReply(any, any, any, any)).thenAnswer((_) => Future.value(updatedConversation)); - - await tester.pumpWidget( - TestApp( - ConversationDetailsScreen(conversationId: '', conversationSubject: '', courseName: ''), - ), - ); - await tester.pumpAndSettle(); - - expect(find.richText(message1Body), findsOneWidget); - expect(find.richText(message2Body), findsNothing); - - await tester.tap(find.byType(FloatingActionButton)); - await tester.pumpAndSettle(); - await tester.tap(find.text(l10n.reply)); - await tester.pumpAndSettle(); - - expect(find.richText(message1Body), findsOneWidget); - expect(find.richText(message2Body), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('route returns true if conversation was updated', (tester) async { - var interactor = MockConversationDetailsInteractor(); - setupTestLocator((locator) { - locator.registerFactory(() => interactor); - }); - when(interactor.getConversation(any)).thenAnswer((_) => Future.value(Conversation())); - when(interactor.addReply(any, any, any, any)).thenAnswer((_) => Future.value(Conversation())); - - var returnValue = false; - - await tester.pumpWidget( - TestApp( - Builder( - builder: (context) => Material( - child: TextButton( - child: Text('Click me'), - onPressed: () async { - returnValue = await QuickNav().push( - context, - ConversationDetailsScreen(conversationId: '', conversationSubject: '', courseName: ''), - ); - }, - ), - ), - ), - ), - ); - await tester.pumpAndSettle(); - - await tester.tap(find.byType(InkWell)); - await tester.pumpAndSettle(); - - await tester.tap(find.byType(FloatingActionButton)); - await tester.pumpAndSettle(); - await tester.tap(find.text(l10n.reply)); - await tester.pumpAndSettle(); - await tester.tap(find.byType(BackButton)); - await tester.pumpAndSettle(); - - expect(returnValue, isTrue); - }); - - testWidgetsWithAccessibilityChecks('route returns false if conversation was not updated', (tester) async { - var interactor = MockConversationDetailsInteractor(); - setupTestLocator((locator) { - locator.registerFactory(() => interactor); - }); - when(interactor.getConversation(any)).thenAnswer((_) => Future.value(Conversation())); - - var returnValue = false; - - await tester.pumpWidget( - TestApp( - Builder( - builder: (context) => Material( - child: TextButton( - child: Text('Click me'), - onPressed: () async { - returnValue = await QuickNav().push( - context, - ConversationDetailsScreen(conversationId: '', conversationSubject: '', courseName: ''), - ); - }, - ), - ), - ), - ), - ); - await tester.pumpAndSettle(); - - await tester.tap(find.byType(InkWell)); - await tester.pumpAndSettle(); - - await tester.tap(find.byType(BackButton)); - await tester.pumpAndSettle(); - - expect(returnValue, isFalse); - }); - }); -} diff --git a/apps/flutter_parent/test/screens/inbox/conversation_details/message_widget_test.dart b/apps/flutter_parent/test/screens/inbox/conversation_details/message_widget_test.dart deleted file mode 100644 index 5bb6a2f50d..0000000000 --- a/apps/flutter_parent/test/screens/inbox/conversation_details/message_widget_test.dart +++ /dev/null @@ -1,715 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:built_collection/built_collection.dart'; -import 'package:built_value/json_object.dart'; -import 'package:flutter/widgets.dart'; -import 'package:flutter_parent/models/attachment.dart'; -import 'package:flutter_parent/models/basic_user.dart'; -import 'package:flutter_parent/models/conversation.dart'; -import 'package:flutter_parent/models/media_comment.dart'; -import 'package:flutter_parent/models/message.dart'; -import 'package:flutter_parent/screens/inbox/conversation_details/message_widget.dart'; -import 'package:flutter_parent/utils/quick_nav.dart'; -import 'package:flutter_test/flutter_test.dart'; -import 'package:mockito/mockito.dart'; - -import '../../../utils/accessibility_utils.dart'; -import '../../../utils/finders.dart'; -import '../../../utils/network_image_response.dart'; -import '../../../utils/test_app.dart'; -import '../../../utils/test_helpers/mock_helpers.mocks.dart'; - -void main() { - mockNetworkImageResponse(); - - final String currentUserId = '123'; - - group('Displays correct Author info', () { - testWidgetsWithAccessibilityChecks('for monologue message', (tester) async { - final message = Message((m) => m - ..authorId = '123' - ..createdAt = DateTime.now() - ..body = '' - ..participatingUserIds = ListBuilder(['123'])); - - final conversation = Conversation((c) => c - ..messages = ListBuilder([message]) - ..participants = ListBuilder([ - BasicUser((b) => b - ..id = '123' - ..name = 'Myself'), - ])); - - await tester.pumpWidget( - TestApp( - MessageWidget(conversation: conversation, message: message, currentUserId: currentUserId), - ), - ); - await tester.pumpAndSettle(); - - expect(find.byKey(Key('author-info')), findsOneWidget); - - var widget = find.byKey(Key('author-info')).evaluate().first.widget as Text; - expect(widget.textSpan?.toPlainText(), 'Me'); - }); - - testWidgetsWithAccessibilityChecks('for message to one other', (tester) async { - final message = Message((m) => m - ..authorId = '123' - ..createdAt = DateTime.now() - ..body = '' - ..participatingUserIds = ListBuilder(['123', '456'])); - - final conversation = Conversation((c) => c - ..messages = ListBuilder([message]) - ..participants = ListBuilder([ - BasicUser((b) => b - ..id = '123' - ..name = 'Myself'), - BasicUser((b) => b - ..id = '456' - ..name = 'User 1'), - ])); - - await tester.pumpWidget( - TestApp( - MessageWidget(conversation: conversation, message: message, currentUserId: currentUserId), - ), - ); - await tester.pumpAndSettle(); - - expect(find.byKey(Key('author-info')), findsOneWidget); - - var widget = find.byKey(Key('author-info')).evaluate().first.widget as Text; - expect(widget.textSpan?.toPlainText(), 'Me to User 1'); - }); - - testWidgetsWithAccessibilityChecks('for message to multiple others', (tester) async { - final message = Message((m) => m - ..authorId = '123' - ..createdAt = DateTime.now() - ..body = '' - ..participatingUserIds = ListBuilder(['123', '456', '789', '111', '222'])); - - final conversation = Conversation((c) => c - ..messages = ListBuilder([message]) - ..participants = ListBuilder([ - BasicUser((b) => b - ..id = '123' - ..name = 'Myself'), - BasicUser((b) => b - ..id = '456' - ..name = 'User 1'), - BasicUser((b) => b - ..id = '789' - ..name = 'User 2'), - BasicUser((b) => b - ..id = '111' - ..name = 'User 3'), - BasicUser((b) => b - ..id = '422256' - ..name = 'User 4'), - ])); - - await tester.pumpWidget( - TestApp( - MessageWidget(conversation: conversation, message: message, currentUserId: currentUserId), - ), - ); - await tester.pumpAndSettle(); - - expect(find.byKey(Key('author-info')), findsOneWidget); - - var widget = find.byKey(Key('author-info')).evaluate().first.widget as Text; - expect(widget.textSpan?.toPlainText(), 'Me to 4 others'); - }); - - testWidgetsWithAccessibilityChecks('expands to show participant info', (tester) async { - final message = Message((m) => m - ..authorId = '123' - ..createdAt = DateTime.now() - ..body = '' - ..participatingUserIds = ListBuilder(['123', '456', '789', '111', '222'])); - - final conversation = Conversation((c) => c - ..messages = ListBuilder([message]) - ..participants = ListBuilder([ - BasicUser((b) => b - ..id = '123' - ..name = 'Author'), - BasicUser((b) => b - ..id = '456' - ..name = 'User 1'), - BasicUser((b) => b - ..id = '789' - ..name = 'User 2'), - BasicUser((b) => b - ..id = '111' - ..name = 'User 3'), - BasicUser((b) => b - ..id = '222' - ..name = 'User 4'), - ])); - - await tester.pumpWidget( - TestApp( - MessageWidget(conversation: conversation, message: message, currentUserId: currentUserId), - ), - ); - await tester.pumpAndSettle(); - - // Should not display participant info by default - expect(find.byKey(Key('participants')), findsNothing); - - // Tap header to expand participant info - await tester.tap(find.byKey(Key('message-header'))); - await tester.pumpAndSettle(); - - // Participant info show now be displayed - var participants = find.byKey(Key('participants')); - expect(participants, findsOneWidget); - - // Should show all non-author participants - expect(find.descendant(of: participants, matching: find.text('Author')), findsNothing); - expect(find.descendant(of: participants, matching: find.text('User 1')), findsOneWidget); - expect(find.descendant(of: participants, matching: find.text('User 2')), findsOneWidget); - expect(find.descendant(of: participants, matching: find.text('User 3')), findsOneWidget); - expect(find.descendant(of: participants, matching: find.text('User 4')), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('does not expand participant info for monologue', (tester) async { - final message = Message((m) => m - ..authorId = '123' - ..createdAt = DateTime.now() - ..body = '' - ..participatingUserIds = ListBuilder(['123'])); - - final conversation = Conversation((c) => c - ..messages = ListBuilder([message]) - ..participants = ListBuilder([ - BasicUser((b) => b - ..id = '123' - ..name = 'Author'), - ])); - - await tester.pumpWidget( - TestApp( - MessageWidget(conversation: conversation, message: message, currentUserId: currentUserId), - ), - ); - await tester.pumpAndSettle(); - - // Should not display participant info by default - expect(find.byKey(Key('participants')), findsNothing); - - // Tap header to attempt expanding participant info - await tester.tap(find.byKey(Key('message-header'))); - await tester.pumpAndSettle(); - - // Participant info should still not be displayed - expect(find.byKey(Key('participants')), findsNothing); - }); - - testWidgetsWithAccessibilityChecks('for message from another', (tester) async { - final message = Message((m) => m - ..authorId = '456' - ..createdAt = DateTime.now() - ..body = '' - ..participatingUserIds = ListBuilder(['123', '456'])); - - final conversation = Conversation((c) => c - ..messages = ListBuilder([message]) - ..participants = ListBuilder([ - BasicUser((b) => b - ..id = '123' - ..name = 'Myself'), - BasicUser((b) => b - ..id = '456' - ..name = 'User 1'), - ])); - - await tester.pumpWidget( - TestApp( - MessageWidget(conversation: conversation, message: message, currentUserId: currentUserId), - ), - ); - await tester.pumpAndSettle(); - - expect(find.byKey(Key('author-info')), findsOneWidget); - - var widget = find.byKey(Key('author-info')).evaluate().first.widget as Text; - expect(widget.textSpan?.toPlainText(), 'User 1 to me'); - }); - - testWidgetsWithAccessibilityChecks('for message from another to multiple others', (tester) async { - final message = Message((m) => m - ..authorId = '456' - ..createdAt = DateTime.now() - ..body = '' - ..participatingUserIds = ListBuilder(['123', '456', '789', '111', '222'])); - - final conversation = Conversation((c) => c - ..messages = ListBuilder([message]) - ..participants = ListBuilder([ - BasicUser((b) => b - ..id = '123' - ..name = 'Myself'), - BasicUser((b) => b - ..id = '456' - ..name = 'User 1'), - BasicUser((b) => b - ..id = '789' - ..name = 'User 2'), - BasicUser((b) => b - ..id = '111' - ..name = 'User 3'), - BasicUser((b) => b - ..id = '422256' - ..name = 'User 4'), - ])); - - await tester.pumpWidget( - TestApp( - MessageWidget(conversation: conversation, message: message, currentUserId: currentUserId), - ), - ); - await tester.pumpAndSettle(); - - expect(find.byKey(Key('author-info')), findsOneWidget); - - var widget = find.byKey(Key('author-info')).evaluate().first.widget as Text; - expect(widget.textSpan?.toPlainText(), 'User 1 to me & 3 others'); - }); - - testWidgetsWithAccessibilityChecks('with pronoun', (tester) async { - final message = Message((m) => m - ..authorId = '456' - ..createdAt = DateTime.now() - ..body = '' - ..participatingUserIds = ListBuilder(['123', '456'])); - - final conversation = Conversation((c) => c - ..messages = ListBuilder([message]) - ..participants = ListBuilder([ - BasicUser((b) => b - ..id = '123' - ..name = 'Myself'), - BasicUser((b) => b - ..id = '456' - ..pronouns = 'pro/noun' - ..name = 'User 1'), - ])); - - await tester.pumpWidget( - TestApp( - MessageWidget(conversation: conversation, message: message, currentUserId: currentUserId), - ), - ); - await tester.pumpAndSettle(); - - expect(find.byKey(Key('author-info')), findsOneWidget); - - var widget = find.byKey(Key('author-info')).evaluate().first.widget as Text; - expect(widget.textSpan?.toPlainText(), 'User 1 (pro/noun) to me'); - }); - - testWidgetsWithAccessibilityChecks('for message to one other with pronouns', (tester) async { - final message = Message((m) => m - ..authorId = '123' - ..createdAt = DateTime.now() - ..body = '' - ..participatingUserIds = ListBuilder(['123', '456'])); - - final conversation = Conversation((c) => c - ..messages = ListBuilder([message]) - ..participants = ListBuilder([ - BasicUser((b) => b - ..id = '123' - ..name = 'Myself'), - BasicUser((b) => b - ..id = '456' - ..pronouns = 'pro/noun' - ..name = 'User 1'), - ])); - - await tester.pumpWidget( - TestApp( - MessageWidget(conversation: conversation, message: message, currentUserId: currentUserId), - ), - ); - await tester.pumpAndSettle(); - - expect(find.byKey(Key('author-info')), findsOneWidget); - - var widget = find.byKey(Key('author-info')).evaluate().first.widget as Text; - expect(widget.textSpan?.toPlainText(), 'Me to User 1 (pro/noun)'); - }); - - testWidgetsWithAccessibilityChecks('for message to unknown user', (tester) async { - final message = Message((m) => m - ..authorId = '123' - ..createdAt = DateTime.now() - ..body = '' - ..participatingUserIds = ListBuilder(['123', '456'])); - - final conversation = Conversation((c) => c - ..messages = ListBuilder([message]) - ..participants = ListBuilder([ - BasicUser((b) => b - ..id = '123' - ..name = 'Myself'), - ])); - - await tester.pumpWidget( - TestApp( - MessageWidget(conversation: conversation, message: message, currentUserId: currentUserId), - ), - ); - await tester.pumpAndSettle(); - - expect(find.byKey(Key('author-info')), findsOneWidget); - - var widget = find.byKey(Key('author-info')).evaluate().first.widget as Text; - expect(widget.textSpan?.toPlainText(), 'Me to Unknown User'); - }); - - testWidgetsWithAccessibilityChecks('for message from unknown user', (tester) async { - final message = Message((m) => m - ..authorId = '456' - ..createdAt = DateTime.now() - ..body = '' - ..participatingUserIds = ListBuilder(['123', '456'])); - - final conversation = Conversation((c) => c - ..messages = ListBuilder([message]) - ..participants = ListBuilder([ - BasicUser((b) => b - ..id = '123' - ..name = 'Myself'), - ])); - - await tester.pumpWidget( - TestApp( - MessageWidget(conversation: conversation, message: message, currentUserId: currentUserId), - ), - ); - await tester.pumpAndSettle(); - - expect(find.byKey(Key('author-info')), findsOneWidget); - - var widget = find.byKey(Key('author-info')).evaluate().first.widget as Text; - expect(widget.textSpan?.toPlainText(), 'Unknown User to me'); - }); - }); - - group('Displays message details', () { - testWidgetsWithAccessibilityChecks('author info does not cause overflow', (tester) async { - final message = Message((m) => m - ..authorId = '123' - ..createdAt = DateTime.now() - ..body = '' - ..participatingUserIds = ListBuilder(['123', '456'])); - - // Make a really long name - final longUserName = List.generate(100, (_) => 'Name').join(' '); - - final conversation = Conversation((c) => c - ..messages = ListBuilder([message]) - ..participants = ListBuilder([ - BasicUser((b) => b - ..id = '123' - ..name = 'Myself'), - BasicUser((b) => b - ..id = '456' - ..name = longUserName), - ])); - - await tester.pumpWidget( - TestApp( - SingleChildScrollView( - child: MessageWidget(conversation: conversation, message: message, currentUserId: currentUserId)), - ), - ); - await tester.pumpAndSettle(); - - var widget = find.byKey(Key('author-info')).evaluate().first.widget as Text; - expect(widget.textSpan?.toPlainText(), 'Me to $longUserName'); - // At this point the test should have succeeded without throwing an overflow error - }); - - testWidgetsWithAccessibilityChecks('message date', (tester) async { - final message = Message((m) => m - ..authorId = '123' - ..createdAt = DateTime(2020, 12, 25, 8, 34, 0, 0, 0) - ..body = '' - ..participatingUserIds = ListBuilder(['123'])); - - final conversation = Conversation((c) => c - ..messages = ListBuilder([message]) - ..participants = ListBuilder([ - BasicUser((b) => b - ..id = '123' - ..name = 'Myself'), - ])); - - await tester.pumpWidget( - TestApp( - MessageWidget(conversation: conversation, message: message, currentUserId: currentUserId), - ), - ); - await tester.pumpAndSettle(); - - var date = find.byKey(Key('message-date')); - expect(date, findsOneWidget); - - var dateText = await tester.widget(date) as Text; - expect(dateText.data, 'Dec 25 at 8:34 AM'); - }); - - testWidgetsWithAccessibilityChecks('message body', (tester) async { - final body = 'This is a message body'; - final message = Message((m) => m - ..authorId = '123' - ..createdAt = DateTime(2020, 12, 25, 8, 34, 0, 0, 0) - ..body = body - ..participatingUserIds = ListBuilder(['123'])); - - final conversation = Conversation((c) => c - ..messages = ListBuilder([message]) - ..participants = ListBuilder([ - BasicUser((b) => b - ..id = '123' - ..name = 'Myself'), - ])); - - await tester.pumpWidget( - TestApp( - MessageWidget(conversation: conversation, message: message, currentUserId: currentUserId), - ), - ); - await tester.pumpAndSettle(); - - expect(find.richText(body), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('attachments', (tester) async { - final attachments = [ - Attachment((b) => b - ..jsonId = JsonObject('1') - ..displayName = 'Attachment 1'), - Attachment((b) => b - ..jsonId = JsonObject('2') - ..thumbnailUrl = 'https://fake.url.com' - ..displayName = 'Attachment 2'), - ]; - - final message = Message((m) => m - ..authorId = '123' - ..createdAt = DateTime(2020, 12, 25, 8, 34, 0, 0, 0) - ..body = '' - ..attachments = ListBuilder(attachments) - ..participatingUserIds = ListBuilder(['123'])); - - final conversation = Conversation((c) => c - ..messages = ListBuilder([message]) - ..participants = ListBuilder([ - BasicUser((b) => b - ..id = '123' - ..name = 'Myself'), - ])); - - await tester.pumpWidget( - TestApp( - MessageWidget(conversation: conversation, message: message, currentUserId: currentUserId), - ), - ); - await tester.pumpAndSettle(); - - var attachment1 = find.byKey(Key('attachment-1')); - expect(attachment1, findsOneWidget); - expect(find.descendant(of: attachment1, matching: find.text(attachments[0].displayName!)), findsOneWidget); - expect(find.descendant(of: attachment1, matching: find.byType(FadeInImage)), findsNothing); - - var attachment2 = find.byKey(Key('attachment-2')); - expect(attachment2, findsOneWidget); - expect(find.descendant(of: attachment2, matching: find.text(attachments[1].displayName!)), findsOneWidget); - expect(find.descendant(of: attachment2, matching: find.byType(FadeInImage)), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('media comment as attachment', (tester) async { - final mediaComment = MediaCommentBuilder() - ..mediaId = 'fake-id' - ..displayName = 'Display Name' - ..url = 'fake url' - ..mediaType = MediaType.video - ..contentType = 'video/mp4'; - - final message = Message((m) => m - ..authorId = '123' - ..createdAt = DateTime(2020, 12, 25, 8, 34, 0, 0, 0) - ..body = '' - ..mediaComment = mediaComment - ..participatingUserIds = ListBuilder(['123'])); - - final conversation = Conversation((c) => c - ..messages = ListBuilder([message]) - ..participants = ListBuilder([ - BasicUser((b) => b - ..id = '123' - ..name = 'Myself'), - ])); - - await tester.pumpWidget( - TestApp( - MessageWidget(conversation: conversation, message: message, currentUserId: currentUserId), - ), - ); - await tester.pumpAndSettle(); - - var attachment1 = find.byKey(Key('attachment-media-comment-fake-id')); - expect(attachment1, findsOneWidget); - expect(find.descendant(of: attachment1, matching: find.text(mediaComment.displayName!)), findsOneWidget); - }); - }); - - group('interactions', () { - testWidgetsWithAccessibilityChecks('Clicking attachment invokes callback', (tester) async { - final attachment = Attachment((b) => b - ..jsonId = JsonObject('1') - ..displayName = 'Attachment 1'); - - final message = Message((m) => m - ..authorId = '123' - ..createdAt = DateTime.now() - ..body = '' - ..attachments = ListBuilder([attachment]) - ..participatingUserIds = ListBuilder(['123'])); - - final conversation = Conversation((c) => c - ..messages = ListBuilder([message]) - ..participants = ListBuilder([ - BasicUser((b) => b - ..id = '123' - ..name = 'Myself'), - ])); - - Attachment? actual = null; - - await tester.pumpWidget( - TestApp( - MessageWidget( - conversation: conversation, - message: message, - currentUserId: currentUserId, - onAttachmentClicked: (attachment) { - actual = attachment; - }, - ), - ), - ); - await tester.pumpAndSettle(); - await tester.tap(find.byKey(Key('attachment-1'))); - expect(actual, attachment); - }); - - // Can't use a11y checks here because it doesn't account for scroll offset and fails when an attachment is partially scrolled off screen - testWidgets('Scroll to view additional attachments', (tester) async { - final attachments = List.generate( - 30, - (index) => Attachment((b) => b - ..jsonId = JsonObject(index) - ..displayName = 'Attachment $index')); - - final message = Message((m) => m - ..authorId = '123' - ..createdAt = DateTime.now() - ..body = '' - ..attachments = ListBuilder(attachments) - ..participatingUserIds = ListBuilder(['123'])); - - final conversation = Conversation((c) => c - ..messages = ListBuilder([message]) - ..participants = ListBuilder([ - BasicUser((b) => b - ..id = '123' - ..name = 'Myself'), - ])); - - await tester.pumpWidget( - TestApp( - MessageWidget( - conversation: conversation, - message: message, - currentUserId: currentUserId, - onAttachmentClicked: (attachment) {}, - ), - ), - ); - await tester.pumpAndSettle(); - - var firstAttachment = find.byKey(Key('attachment-0')); - var lastAttachment = find.byKey(Key('attachment-29')); - var attachmentList = find.byKey(Key('message_attachment_list')); - - expect(firstAttachment, findsOneWidget); - expect(lastAttachment, findsNothing); - - await tester.drag(attachmentList, Offset(-5000, 0)); - await tester.pumpAndSettle(); - - expect(firstAttachment, findsNothing); - expect(lastAttachment, findsOneWidget); - }); - - // TODO Fix test - testWidgetsWithAccessibilityChecks( - 'links are selectable', - (tester) async { - final nav = MockQuickNav(); - setupTestLocator((locator) => locator.registerLazySingleton(() => nav)); - - final url = 'https://www.google.com'; - final body = 'Tap this $url link here'; - final message = Message((m) => m - ..authorId = '123' - ..createdAt = DateTime(2020, 12, 25, 8, 34, 0, 0, 0) - ..body = body - ..participatingUserIds = ListBuilder(['123'])); - - final conversation = Conversation((c) => c - ..messages = ListBuilder([message]) - ..participants = ListBuilder([ - BasicUser((b) => b - ..id = '123' - ..name = 'Myself'), - ])); - - await tester.pumpWidget( - TestApp( - MessageWidget(conversation: conversation, message: message, currentUserId: currentUserId), - ), - ); - await tester.pumpAndSettle(); - - // Tap link - await tester.tap(find.richText(body)); - await tester.pumpAndSettle(); - - verify(nav.routeInternally(any, url)); - }, - a11yExclusions: {A11yExclusion.minTapSize}, skip: true // inline links are not required to meet the min tap target size - ); - }); -} \ No newline at end of file diff --git a/apps/flutter_parent/test/screens/inbox/conversation_list/conversation_list_interactor_test.dart b/apps/flutter_parent/test/screens/inbox/conversation_list/conversation_list_interactor_test.dart deleted file mode 100644 index 3d4ed507ee..0000000000 --- a/apps/flutter_parent/test/screens/inbox/conversation_list/conversation_list_interactor_test.dart +++ /dev/null @@ -1,321 +0,0 @@ -// Copyright (C) 2019 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:built_collection/built_collection.dart'; -import 'package:flutter/foundation.dart'; -import 'package:flutter_parent/models/conversation.dart'; -import 'package:flutter_parent/models/course.dart'; -import 'package:flutter_parent/models/enrollment.dart'; -import 'package:flutter_parent/models/user.dart'; -import 'package:flutter_parent/network/api/course_api.dart'; -import 'package:flutter_parent/network/api/enrollments_api.dart'; -import 'package:flutter_parent/network/api/inbox_api.dart'; -import 'package:flutter_parent/screens/inbox/conversation_list/conversation_list_interactor.dart'; -import 'package:flutter_test/flutter_test.dart'; -import 'package:mockito/mockito.dart'; -import 'package:tuple/tuple.dart'; - -import '../../../utils/test_app.dart'; -import '../../../utils/test_helpers/mock_helpers.dart'; -import '../../../utils/test_helpers/mock_helpers.mocks.dart'; - -void main() { - test('getConversations calls api for normal scope and sent scope', () async { - var inboxApi = MockInboxApi(); - - when(inboxApi.getConversations( - scope: anyNamed('scope'), - forceRefresh: anyNamed('forceRefresh'), - )).thenAnswer((_) => Future.value([])); - - await setupTestLocator((locator) { - locator.registerLazySingleton(() => inboxApi); - }); - - var interactor = ConversationListInteractor(); - interactor.getConversations(); - verify(inboxApi.getConversations(forceRefresh: false)).called(1); - verify(inboxApi.getConversations(scope: 'sent', forceRefresh: false)).called(1); - }); - - test('getConversations merges scopes and removes duplicates from sent scope', () async { - var inboxApi = MockInboxApi(); - - await setupTestLocator((locator) { - locator.registerLazySingleton(() => inboxApi); - }); - - var normalScopeItems = [ - Conversation((c) => c - ..id = '0' - ..lastMessageAt = DateTime.now() - ..lastMessage = 'Message to user'), - Conversation((c) => c - ..id = '1' - ..lastMessageAt = DateTime.now().subtract(Duration(days: 1)) - ..lastMessage = 'Message to user'), - ]; - - var sentScopeItems = [ - Conversation((c) => c - ..id = '1' - ..lastMessageAt = DateTime.now().subtract(Duration(days: 1, hours: 1)) - ..lastMessage = 'Message from User'), - Conversation((c) => c - ..id = '2' - ..lastMessageAt = DateTime.now().subtract(Duration(days: 2)) - ..lastMessage = 'Message from User'), - ]; - - var expectedItems = [normalScopeItems[0], normalScopeItems[1], sentScopeItems[1]]; - - when(inboxApi.getConversations( - scope: anyNamed('scope'), - forceRefresh: anyNamed('forceRefresh'), - )).thenAnswer((_) => Future.value(normalScopeItems)); - - when(inboxApi.getConversations( - scope: argThat(equals('sent'), named: 'scope'), - forceRefresh: anyNamed('forceRefresh'), - )).thenAnswer((_) => Future.value(sentScopeItems)); - - var interactor = ConversationListInteractor(); - var actualItems = await interactor.getConversations(); - expect(listEquals(expectedItems, actualItems), isTrue); - }); - - test('getConversations orders items by date (descending)', () async { - var inboxApi = MockInboxApi(); - - await setupTestLocator((locator) { - locator.registerLazySingleton(() => inboxApi); - }); - - var apiItems = [ - Conversation((c) => c - ..id = '0' - ..lastMessageAt = DateTime.now().subtract(Duration(days: 3)) - ..lastMessage = 'Message to user'), - Conversation((c) => c - ..id = '1' - ..lastMessageAt = DateTime.now().subtract(Duration(days: 5)) - ..lastMessage = 'Message to user'), - Conversation((c) => c - ..id = '2' - ..lastMessageAt = DateTime.now().subtract(Duration(days: 1)) - ..lastMessage = 'Message to user'), - Conversation((c) => c - ..id = '3' - ..lastMessageAt = DateTime.now().subtract(Duration(days: 2)) - ..lastMessage = 'Message to user'), - Conversation((c) => c - ..id = '4' - ..lastMessageAt = DateTime.now().subtract(Duration(days: 4)) - ..lastMessage = 'Message to user'), - ]; - - var expectedItems = [ - apiItems[2], - apiItems[3], - apiItems[0], - apiItems[4], - apiItems[1], - ]; - - when(inboxApi.getConversations( - scope: anyNamed('scope'), - forceRefresh: anyNamed('forceRefresh'), - )).thenAnswer((_) => Future.value(List.from(apiItems))); - - var interactor = ConversationListInteractor(); - var actualItems = await interactor.getConversations(); - expect(listEquals(expectedItems, actualItems), isTrue); - }); - - test('getConversations produces error when API fails', () async { - var inboxApi = MockInboxApi(); - - await setupTestLocator((locator) { - locator.registerLazySingleton(() => inboxApi); - }); - - var expectedError = 'fail'; - when(inboxApi.getConversations( - scope: anyNamed('scope'), - forceRefresh: anyNamed('forceRefresh'), - )).thenAnswer((_) => Future.error(expectedError)); - - try { - await ConversationListInteractor().getConversations(); - fail('Interactor did not propogate failure'); - } catch (e) { - expect(e, equals(expectedError)); - } - }); - - test('getCoursesForCompose calls CourseApi', () async { - var api = MockCourseApi(); - await setupTestLocator((locator) => locator.registerLazySingleton(() => api)); - ConversationListInteractor().getCoursesForCompose(); - verify(api.getObserveeCourses()).called(1); - }); - - test('getStudentEnrollments calls EnrollmentsApi', () async { - var api = MockEnrollmentsApi(); - await setupTestLocator((locator) => locator.registerLazySingleton(() => api)); - ConversationListInteractor().getStudentEnrollments(); - verify(api.getObserveeEnrollments(forceRefresh: anyNamed('forceRefresh'))).called(1); - }); - - test('combineEnrollmentsAndCourses creates a map of courses with a sorted list of corresponding enorllments', () { - String arithmetic = 'Arithmetic'; - String boxing = 'Boxing'; - String choir = 'Choir'; - - List andyEnrollments = _createEnrollments('Andy', [boxing, choir]); - List billEnrollments = _createEnrollments('Bill', [choir, arithmetic]); - List chericeEnrollments = _createEnrollments('Cherice', [choir, arithmetic, boxing]); - - var enrollments = [...andyEnrollments, ...billEnrollments, ...chericeEnrollments]; - - Course arithmeticCourse = Course((b) => b - ..id = arithmetic - ..name = arithmetic - ..enrollments = ListBuilder(enrollments.where((e) => e.courseId == arithmetic))); - Course boxingCourse = Course((b) => b - ..id = boxing - ..name = boxing - ..enrollments = ListBuilder(enrollments.where((e) => e.courseId == boxing))); - Course choirCourse = Course((b) => b - ..id = choir - ..name = choir - ..enrollments = ListBuilder(enrollments.where((e) => e.courseId == choir))); - - List> expectedResult = [ - Tuple2(andyEnrollments[0].observedUser!, boxingCourse), - Tuple2(andyEnrollments[1].observedUser!, choirCourse), - Tuple2(billEnrollments[1].observedUser!, arithmeticCourse), - Tuple2(billEnrollments[0].observedUser!, choirCourse), - Tuple2(chericeEnrollments[1].observedUser!, arithmeticCourse), - Tuple2(chericeEnrollments[2].observedUser!, boxingCourse), - Tuple2(chericeEnrollments[0].observedUser!, choirCourse), - ]; - - List> actual = ConversationListInteractor() - .combineEnrollmentsAndCourses([choirCourse, boxingCourse, arithmeticCourse], enrollments); - - for (var i = 0; i < expectedResult.length; i++) { - expect(actual[i].item1, expectedResult[i].item1); - expect(actual[i].item2, expectedResult[i].item2); - } - }); - - // This test simulates a 'pending' enrollment situation, where we get the enrollment but not the course - test('combineEnrollmentsAndCourses handles enrollments without matching courses', () { - String arithmetic = 'Arithmetic'; - String boxing = 'Boxing'; - String choir = 'Choir'; - - List andyEnrollments = _createEnrollments('Andy', [boxing, choir]); - List billEnrollments = _createEnrollments('Bill', [choir, arithmetic]); - List chericeEnrollments = _createEnrollments('Cherice', [choir, arithmetic, boxing]); - List pendingEnrollments = _createEnrollments('pending', ['pending']); - - var enrollments = [...andyEnrollments, ...billEnrollments, ...chericeEnrollments, ...pendingEnrollments]; - - Course arithmeticCourse = Course((b) => b - ..id = arithmetic - ..name = arithmetic - ..enrollments = ListBuilder(enrollments.where((e) => e.courseId == arithmetic))); - Course boxingCourse = Course((b) => b - ..id = boxing - ..name = boxing - ..enrollments = ListBuilder(enrollments.where((e) => e.courseId == boxing))); - Course choirCourse = Course((b) => b - ..id = choir - ..name = choir - ..enrollments = ListBuilder(enrollments.where((e) => e.courseId == choir))); - - List> expectedResult = [ - Tuple2(andyEnrollments[0].observedUser!, boxingCourse), - Tuple2(andyEnrollments[1].observedUser!, choirCourse), - Tuple2(billEnrollments[1].observedUser!, arithmeticCourse), - Tuple2(billEnrollments[0].observedUser!, choirCourse), - Tuple2(chericeEnrollments[1].observedUser!, arithmeticCourse), - Tuple2(chericeEnrollments[2].observedUser!, boxingCourse), - Tuple2(chericeEnrollments[0].observedUser!, choirCourse), - ]; - - List> actual = ConversationListInteractor() - .combineEnrollmentsAndCourses([choirCourse, boxingCourse, arithmeticCourse], enrollments); - - for (var i = 0; i < expectedResult.length; i++) { - expect(actual[i].item1, expectedResult[i].item1); - expect(actual[i].item2, expectedResult[i].item2); - } - }); - - test('sortCourses sorts courses by the first enrolled student in that course', () { - String arithmetic = 'Arithmetic'; - String boxing = 'Boxing'; - String choir = 'Choir'; - - List andyEnrollments = _createEnrollments('Andy', [boxing, choir]); - List billEnrollments = _createEnrollments('Bill', [choir, arithmetic]); - List chericeEnrollments = _createEnrollments('Cherice', [choir, arithmetic, boxing]); - - var enrollments = [...andyEnrollments, ...billEnrollments, ...chericeEnrollments]; - - Course arithmeticCourse = Course((b) => b - ..id = arithmetic - ..name = arithmetic - ..enrollments = ListBuilder(enrollments.where((e) => e.courseId == arithmetic))); - Course boxingCourse = Course((b) => b - ..id = boxing - ..name = boxing - ..enrollments = ListBuilder(enrollments.where((e) => e.courseId == boxing))); - Course choirCourse = Course((b) => b - ..id = choir - ..name = choir - ..enrollments = ListBuilder(enrollments.where((e) => e.courseId == choir))); - - List> expected = [ - Tuple2(andyEnrollments[0].observedUser!, boxingCourse), - Tuple2(andyEnrollments[1].observedUser!, choirCourse), - Tuple2(billEnrollments[1].observedUser!, arithmeticCourse), - Tuple2(billEnrollments[0].observedUser!, choirCourse), - Tuple2(chericeEnrollments[1].observedUser!, arithmeticCourse), - Tuple2(chericeEnrollments[2].observedUser!, boxingCourse), - Tuple2(chericeEnrollments[0].observedUser!, choirCourse), - ]; - - List> actual = ConversationListInteractor().combineEnrollmentsAndCourses( - [choirCourse, boxingCourse, arithmeticCourse], [...billEnrollments, ...andyEnrollments, ...chericeEnrollments]); - - for (int item = 0; item < actual.length; item++) { - expect(actual[item].item1, expected[item].item1); - expect(actual[item].item2, expected[item].item2); - } - }); -} - -List _createEnrollments(String studentName, List courseIds) { - return courseIds - .map((id) => Enrollment((b) => b - ..observedUser = User((b) => b - ..shortName = studentName - ..id = studentName).toBuilder() - ..courseId = id)) - .toList(); -} \ No newline at end of file diff --git a/apps/flutter_parent/test/screens/inbox/conversation_list/conversation_list_screen_test.dart b/apps/flutter_parent/test/screens/inbox/conversation_list/conversation_list_screen_test.dart deleted file mode 100644 index 4a9bffaff5..0000000000 --- a/apps/flutter_parent/test/screens/inbox/conversation_list/conversation_list_screen_test.dart +++ /dev/null @@ -1,424 +0,0 @@ -// Copyright (C) 2019 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'dart:async'; - -import 'package:built_collection/built_collection.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_parent/l10n/app_localizations.dart'; -import 'package:flutter_parent/models/basic_user.dart'; -import 'package:flutter_parent/models/conversation.dart'; -import 'package:flutter_parent/models/course.dart'; -import 'package:flutter_parent/models/enrollment.dart'; -import 'package:flutter_parent/models/user.dart'; -import 'package:flutter_parent/screens/inbox/conversation_list/conversation_list_interactor.dart'; -import 'package:flutter_parent/screens/inbox/conversation_list/conversation_list_screen.dart'; -import 'package:flutter_parent/utils/common_widgets/avatar.dart'; -import 'package:flutter_parent/utils/design/canvas_icons.dart'; -import 'package:flutter_parent/utils/quick_nav.dart'; -import 'package:flutter_svg/svg.dart'; -import 'package:flutter_test/flutter_test.dart'; -import 'package:intl/intl.dart'; -import 'package:mockito/mockito.dart'; - -import '../../../utils/accessibility_utils.dart'; -import '../../../utils/network_image_response.dart'; -import '../../../utils/test_app.dart'; -import '../../../utils/test_helpers/mock_helpers.mocks.dart'; - -void main() { - mockNetworkImageResponse(); - final l10n = AppLocalizations(); - - testWidgetsWithAccessibilityChecks('Displays loading state', (tester) async { - var interactor = MockConversationListInteractor(); - setupTestLocator((locator) => locator.registerFactory(() => interactor)); - - var completer = Completer>(); - when(interactor.getConversations()).thenAnswer((_) => completer.future); - - await tester.pumpWidget(TestApp(ConversationListScreen())); - await tester.pump(); - - expect(find.byType(CircularProgressIndicator), findsOneWidget); - }); - - // TODO Fix test - testWidgetsWithAccessibilityChecks('Displays empty state', (tester) async { - var interactor = MockConversationListInteractor(); - setupTestLocator((locator) => locator.registerFactory(() => interactor)); - - when(interactor.getConversations()).thenAnswer((_) => Future.value([])); - - await tester.pumpWidget(TestApp(ConversationListScreen())); - await tester.pumpAndSettle(); - - expect(find.byType(SvgPicture), findsOneWidget); - expect(find.text(l10n.emptyInboxTitle), findsOneWidget); - expect(find.text(l10n.emptyInboxSubtitle), findsOneWidget); - }, skip: true); - - // TODO Fix test - testWidgetsWithAccessibilityChecks('Displays error state with retry', (tester) async { - var interactor = MockConversationListInteractor(); - setupTestLocator((locator) => locator.registerFactory(() => interactor)); - - when(interactor.getConversations()).thenAnswer((_) => Future.error('Error')); - - await tester.pumpWidget(TestApp(ConversationListScreen())); - await tester.pumpAndSettle(); - - // Expect error state - var errorIcon = await tester.widget(find.byType(Icon).first).icon; - expect(errorIcon, equals(CanvasIcons.warning)); - expect(find.text('There was an error loading your inbox messages.'), findsOneWidget); - expect(find.widgetWithText(TextButton, l10n.retry), findsOneWidget); - - // Retry with success - reset(interactor); - when(interactor.getConversations(forceRefresh: anyNamed('forceRefresh'))).thenAnswer((_) => Future.value([])); - await tester.tap(find.text(l10n.retry)); - await tester.pumpAndSettle(Duration(seconds: 1)); - - // Should no longer show error state - expect(find.text('There was an error loading your inbox messages.'), findsNothing); - expect(find.widgetWithText(TextButton, l10n.retry), findsNothing); - }, skip: true); - - testWidgetsWithAccessibilityChecks('Displays subject, course name, message preview, and date', (tester) async { - var interactor = MockConversationListInteractor(); - setupTestLocator((locator) => locator.registerFactory(() => interactor)); - - var now = DateTime.now(); - var messageDate = DateTime(now.year, 12, 25, now.hour, now.minute, 0, 0, 0); - - var conversation = Conversation((b) => b - ..contextName = 'Test Course' - ..subject = 'Message Subject' - ..lastMessage = 'Last Message' - ..lastMessageAt = messageDate); - - when(interactor.getConversations()).thenAnswer((_) => Future.value([conversation])); - await tester.pumpWidget(TestApp(ConversationListScreen())); - await tester.pumpAndSettle(); - - expect(find.text(conversation.subject), findsOneWidget); - expect(find.text(conversation.contextName!), findsOneWidget); - expect(find.text(conversation.lastMessage!), findsOneWidget); - expect(find.text('Dec 25'), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('Adds year to date if not this year', (tester) async { - var interactor = MockConversationListInteractor(); - setupTestLocator((locator) => locator.registerFactory(() => interactor)); - - var now = DateTime.now(); - var messageDate = DateTime(now.year - 1, 12, 25, now.hour, 0, 0, 0, 0); - - var conversation = Conversation((b) => b - ..contextName = '' - ..lastMessage = '' - ..lastMessageAt = messageDate); - - when(interactor.getConversations()).thenAnswer((_) => Future.value([conversation])); - await tester.pumpWidget(TestApp(ConversationListScreen())); - await tester.pumpAndSettle(); - - expect(find.text('Dec 25 ${now.year - 1}'), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('Displays time if date is today', (tester) async { - var interactor = MockConversationListInteractor(); - setupTestLocator((locator) => locator.registerFactory(() => interactor)); - - var now = DateTime.now(); - - var conversation = Conversation((b) => b - ..contextName = '' - ..lastMessage = '' - ..lastMessageAt = now); - - when(interactor.getConversations()).thenAnswer((_) => Future.value([conversation])); - await tester.pumpWidget(TestApp(ConversationListScreen())); - await tester.pumpAndSettle(); - - expect(find.text(DateFormat.jm().format(now)), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('Displays single avatar for single participant', (tester) async { - var interactor = MockConversationListInteractor(); - setupTestLocator((locator) => locator.registerFactory(() => interactor)); - - var now = DateTime.now(); - var messageDate = DateTime(now.year, 12, 25, now.hour, 0, 0, 0, 0); - - var conversation = Conversation((b) => b - ..contextName = '' - ..lastMessage = '' - ..lastMessageAt = messageDate - ..audience = ListBuilder(['123']) - ..participants = ListBuilder( - [BasicUser((b) => b..id = '123')], - )); - - when(interactor.getConversations()).thenAnswer((_) => Future.value([conversation])); - await tester.pumpWidget(TestApp(ConversationListScreen())); - await tester.pumpAndSettle(); - - expect(find.byType(Avatar), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('Displays double avatar for two participants', (tester) async { - var interactor = MockConversationListInteractor(); - setupTestLocator((locator) => locator.registerFactory(() => interactor)); - - var now = DateTime.now(); - var messageDate = DateTime(now.year, 12, 25, now.hour, 0, 0, 0, 0); - - var conversation = Conversation((b) => b - ..contextName = '' - ..lastMessage = '' - ..lastMessageAt = messageDate - ..audience = ListBuilder(['123', '456']) // Only two users in audience, UI should filter out third user - ..participants = ListBuilder([ - BasicUser((b) => b..id = '123'), - BasicUser((b) => b..id = '456'), - BasicUser((b) => b..id = '789'), - ])); - - when(interactor.getConversations()).thenAnswer((_) => Future.value([conversation])); - await tester.pumpWidget(TestApp(ConversationListScreen())); - await tester.pumpAndSettle(); - - expect(find.byType(Avatar), findsNWidgets(2)); - }); - - testWidgetsWithAccessibilityChecks('Displays group icon for more than two participants', (tester) async { - var interactor = MockConversationListInteractor(); - setupTestLocator((locator) => locator.registerFactory(() => interactor)); - - var now = DateTime.now(); - var messageDate = DateTime(now.year, 12, 25, now.hour, 0, 0, 0, 0); - - var conversation = Conversation((b) => b - ..contextName = '' - ..lastMessage = '' - ..lastMessageAt = messageDate - ..audience = ListBuilder(['123', '456', '789']) - ..participants = ListBuilder([ - BasicUser((b) => b..id = '123'), - BasicUser((b) => b..id = '456'), - BasicUser((b) => b..id = '789'), - ])); - - when(interactor.getConversations()).thenAnswer((_) => Future.value([conversation])); - await tester.pumpWidget(TestApp(ConversationListScreen())); - await tester.pumpAndSettle(); - - expect(find.byType(Icon), findsNWidgets(2)); // One for group icon, one for app bar nav button - - var icon = await tester.widget(find.byType(Icon).first).icon; - expect(icon, equals(CanvasIcons.group)); - }); - - testWidgetsWithAccessibilityChecks('Tapping add button shows messageable course list', (tester) async { - var interactor = MockConversationListInteractor(); - setupTestLocator((locator) => locator.registerFactory(() => interactor)); - - when(interactor.getConversations()).thenAnswer((_) => Future.error('')); - - await tester.pumpWidget(TestApp(ConversationListScreen())); - await tester.pumpAndSettle(); - - var courseCompleter = Completer>(); - var enrollmentCompleter = Completer>(); - - when(interactor.getCoursesForCompose()).thenAnswer((_) => courseCompleter.future); - when(interactor.getStudentEnrollments()).thenAnswer((_) => enrollmentCompleter.future); - - await tester.tap(find.byTooltip(l10n.newMessageTitle)); - await tester.pump(); - - expect(find.byType(CircularProgressIndicator), findsOneWidget); - - var enrollments = [ - Enrollment((b) => b - ..courseId = 'Course 1' - ..observedUser = User((b) => b - ..shortName = 'Bill' - ..id = 'Bill').toBuilder()), - Enrollment((b) => b - ..courseId = 'Course 2' - ..observedUser = User((b) => b - ..shortName = 'Ted' - ..id = 'Ted').toBuilder()), - ]; - - var courses = [ - Course((b) => b - ..id = 'Course 1' - ..name = 'Course 1' - ..enrollments = ListBuilder([enrollments[0]])), - Course((b) => b - ..id = 'Course 2' - ..name = 'Course 2' - ..enrollments = ListBuilder([enrollments[1]])), - ]; - - var _combined = ConversationListInteractor().combineEnrollmentsAndCourses(courses, enrollments); - when(interactor.combineEnrollmentsAndCourses(any, any)).thenAnswer((_) => _combined); - - courseCompleter.complete(courses); - enrollmentCompleter.complete(enrollments); - await tester.pumpAndSettle(); - - expect(find.text('Course 1'), findsOneWidget); - expect(find.text('Course 2'), findsOneWidget); - - expect(find.text('for Bill'), findsOneWidget); - expect(find.text('for Ted'), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('Shows error in messegable course list', (tester) async { - var interactor = MockConversationListInteractor(); - setupTestLocator((locator) => locator.registerFactory(() => interactor)); - - var completer = Completer>(); - when(interactor.getCoursesForCompose()).thenAnswer((_) => completer.future); - when(interactor.getConversations()).thenAnswer((_) => Future.error('')); - - await tester.pumpWidget(TestApp(ConversationListScreen())); - await tester.pumpAndSettle(); - - await tester.tap(find.byTooltip(l10n.newMessageTitle)); - await tester.pump(); - - completer.completeError(''); - await tester.pumpAndSettle(); - - expect(find.text(l10n.errorFetchingCourses), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('Displays unread message indicator', (tester) async { - var interactor = MockConversationListInteractor(); - setupTestLocator((locator) => locator.registerFactory(() => interactor)); - - var now = DateTime.now(); - var messageDate = DateTime(now.year, 12, 25, now.hour, 0, 0, 0, 0); - - var read = Conversation((b) => b - ..contextName = '' - ..lastMessage = '' - ..workflowState = ConversationWorkflowState.read - ..lastMessageAt = messageDate); - - var unread = read.rebuild((b) => b..workflowState = ConversationWorkflowState.unread); - - when(interactor.getConversations()).thenAnswer((_) => Future.value([read, unread, unread])); - await tester.pumpWidget(TestApp(ConversationListScreen())); - await tester.pumpAndSettle(); - - expect(find.byKey(Key('unread-indicator')), findsNWidgets(2)); - }); - - testWidgetsWithAccessibilityChecks('Refreshes on new message created', (tester) async { - var interactor = MockConversationListInteractor(); - var nav = MockQuickNav(); - setupTestLocator((locator) { - locator.registerFactory(() => nav); - locator.registerFactory(() => interactor); - }); - - when(interactor.getConversations()).thenAnswer((_) => Future.error('')); - when(nav.push(any, any)).thenAnswer((_) => Future.value(true)); - - await tester.pumpWidget(TestApp(ConversationListScreen())); - await tester.pumpAndSettle(); - - var courseCompleter = Completer>(); - var enrollmentCompleter = Completer>(); - when(interactor.getCoursesForCompose()).thenAnswer((_) => courseCompleter.future); - when(interactor.getStudentEnrollments()).thenAnswer((_) => enrollmentCompleter.future); - - await tester.tap(find.byTooltip(l10n.newMessageTitle)); - await tester.pump(); - - expect(find.byType(CircularProgressIndicator), findsOneWidget); - - var enrollment = Enrollment((b) => b - ..courseId = 'Course 1' - ..observedUser = User((b) => b..shortName = 'Bill').toBuilder()); - - var course = Course((b) => b - ..name = 'Course 1' - ..id = 'Course 1' - ..enrollments = ListBuilder([enrollment])); - - var _combined = ConversationListInteractor().combineEnrollmentsAndCourses([course], [enrollment]); - when(interactor.combineEnrollmentsAndCourses(any, any)).thenAnswer((_) => _combined); - - courseCompleter.complete([course]); - enrollmentCompleter.complete([enrollment]); - await tester.pumpAndSettle(); - - var conversation = Conversation((b) => b - ..contextName = '' - ..lastMessage = 'This is a new message!' - ..lastMessageAt = DateTime.now()); - when(interactor.getConversations(forceRefresh: anyNamed('forceRefresh'))) - .thenAnswer((_) => Future.value([conversation])); - - await tester.tap(find.text('Course 1')); - await tester.pumpAndSettle(Duration(seconds: 1)); - - expect(find.text(conversation.lastMessage!), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('Refreshes on conversation updated', (tester) async { - var interactor = MockConversationListInteractor(); - var nav = MockQuickNav(); - setupTestLocator((locator) { - locator.registerFactory(() => nav); - locator.registerFactory(() => interactor); - }); - - final conversation = Conversation((b) => b - ..contextName = '' - ..subject = '' - ..lastMessage = 'Message 1' - ..workflowState = ConversationWorkflowState.unread - ..lastMessageAt = DateTime.now()); - - when(interactor.getConversations()).thenAnswer((_) => Future.value([conversation])); - when(nav.push(any, any)).thenAnswer((_) async => true); // return 'true', meaning conversation was updated - - await tester.pumpWidget(TestApp(ConversationListScreen())); - await tester.pumpAndSettle(); - - expect(find.text(conversation.lastMessage!), findsOneWidget); - expect(find.byKey(Key('unread-indicator')), findsOneWidget); - - final updatedConversation = conversation.rebuild((b) => b - ..lastMessage = 'Message 2' - ..workflowState = ConversationWorkflowState.read); - when(interactor.getConversations(forceRefresh: anyNamed('forceRefresh'))) - .thenAnswer((_) => Future.value([updatedConversation])); - - await tester.tap(find.text(conversation.lastMessage!)); - await tester.pumpAndSettle(); - - expect(find.text(updatedConversation.lastMessage!), findsOneWidget); - expect(find.byKey(Key('unread-indicator')), findsNothing); - }); -} \ No newline at end of file diff --git a/apps/flutter_parent/test/screens/inbox/create_conversation/create_conversation_interactor_test.dart b/apps/flutter_parent/test/screens/inbox/create_conversation/create_conversation_interactor_test.dart deleted file mode 100644 index 7fc53218ed..0000000000 --- a/apps/flutter_parent/test/screens/inbox/create_conversation/create_conversation_interactor_test.dart +++ /dev/null @@ -1,188 +0,0 @@ -// Copyright (C) 2019 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:built_collection/built_collection.dart'; -import 'package:flutter_parent/models/course.dart'; -import 'package:flutter_parent/models/course_permissions.dart'; -import 'package:flutter_parent/models/login.dart'; -import 'package:flutter_parent/models/recipient.dart'; -import 'package:flutter_parent/network/api/course_api.dart'; -import 'package:flutter_parent/network/api/inbox_api.dart'; -import 'package:flutter_parent/screens/inbox/create_conversation/create_conversation_interactor.dart'; -import 'package:flutter_test/flutter_test.dart'; -import 'package:mockito/mockito.dart'; - -import '../../../utils/canvas_model_utils.dart'; -import '../../../utils/platform_config.dart'; -import '../../../utils/test_app.dart'; -import '../../../utils/test_helpers/mock_helpers.mocks.dart'; - -void main() { - String studentId = 'student_123'; - var user = CanvasModelTestUtils.mockUser(id: 'user_123'); - - final inboxApi = MockInboxApi(); - final courseApi = MockCourseApi(); - - setupTestLocator((locator) { - locator.registerLazySingleton(() => inboxApi); - locator.registerLazySingleton(() => courseApi); - }); - - setUp(() async { - await setupPlatformChannels(config: PlatformConfig(initLoggedInUser: Login((b) => b..user = user.toBuilder()))); - reset(inboxApi); - reset(courseApi); - }); - - test('createConversation calls InboxApi.createConversation', () { - var interactor = CreateConversationInteractor(); - final course = Course(); - final recipients = ['1', '2', '3']; - final subject = 'Message Subject'; - final body = 'Message Body'; - final attachments = ['4', '5', '6']; - - interactor.createConversation(course.id, recipients, subject, body, attachments); - verify(inboxApi.createConversation(course.id, recipients, subject, body, attachments)).called(1); - }); - - test('loadData calls InboxApi and CourseApi', () async { - when(inboxApi.getRecipients(any)).thenAnswer((_) async => []); - when(courseApi.getCourse(any)).thenAnswer((_) async => Course()); - when(courseApi.getCoursePermissions(any)).thenAnswer((_) async => CoursePermissions()); - - final course = Course(); - await CreateConversationInteractor().loadData(course.id, studentId); - - verify(inboxApi.getRecipients(course.id)); - verify(courseApi.getCourse(course.id)); - verify(courseApi.getCoursePermissions(course.id)); - }); - - test('loadData returns only instructors, specified student, and current user', () async { - final course = Course((c) => c..id = 'course_1'); - when(courseApi.getCourse(any)).thenAnswer((_) async => course); - when(courseApi.getCoursePermissions(any)).thenAnswer((_) async => CoursePermissions((b) => b..sendMessages = true)); - - var teacher = Recipient((r) => r - ..id = 'teacher_789' - ..name = 'Teacher' - ..commonCourses = MapBuilder({ - course.id: BuiltList(['TeacherEnrollment']) - })); - - var ta = Recipient((r) => r - ..id = 'ta_789' - ..name = 'TA' - ..commonCourses = MapBuilder({ - course.id: BuiltList(['TaEnrollment']) - })); - - var observer = Recipient((r) => r - ..id = 'observer_456' - ..name = 'Observer' - ..commonCourses = MapBuilder({ - course.id: BuiltList(['ObserverEnrollment']) - })); - - var currentUser = Recipient((r) => r - ..id = user.id - ..name = 'Current User' - ..commonCourses = MapBuilder({ - course.id: BuiltList(['ObserverEnrollment']) - })); - - var student = Recipient((r) => r - ..id = studentId - ..name = 'Student' - ..commonCourses = MapBuilder({ - course.id: BuiltList(['StudentEnrollment']) - })); - - var otherStudent = Recipient((r) => r - ..id = 'other_student' - ..name = 'Other student' - ..commonCourses = MapBuilder({ - 'course_2': BuiltList(['StudentEnrollment']) - })); - - final allRecipients = [teacher, ta, observer, currentUser, student, otherStudent]; - final expectedRecipients = [teacher, ta, currentUser, student]; - - when(inboxApi.getRecipients(any)).thenAnswer((_) async => allRecipients); - - final actual = await CreateConversationInteractor().loadData(course.id, studentId); - - expect(actual.recipients, expectedRecipients); - }); - - test('loadData returns only instructors if sendMessages permission is not granted', () async { - final course = Course((c) => c..id = 'course_1'); - when(courseApi.getCourse(any)).thenAnswer((_) async => course); - when(courseApi.getCoursePermissions(any)) - .thenAnswer((_) async => CoursePermissions((b) => b..sendMessages = false)); - - var teacher = Recipient((r) => r - ..id = 'teacher_789' - ..name = 'Teacher' - ..commonCourses = MapBuilder({ - course.id: BuiltList(['TeacherEnrollment']) - })); - - var ta = Recipient((r) => r - ..id = 'ta_789' - ..name = 'TA' - ..commonCourses = MapBuilder({ - course.id: BuiltList(['TaEnrollment']) - })); - - var observer = Recipient((r) => r - ..id = 'observer_456' - ..name = 'Observer' - ..commonCourses = MapBuilder({ - course.id: BuiltList(['ObserverEnrollment']) - })); - - var currentUser = Recipient((r) => r - ..id = user.id - ..name = 'Current User' - ..commonCourses = MapBuilder({ - course.id: BuiltList(['ObserverEnrollment']) - })); - - var student = Recipient((r) => r - ..id = studentId - ..name = 'Student' - ..commonCourses = MapBuilder({ - course.id: BuiltList(['StudentEnrollment']) - })); - - var otherStudent = Recipient((r) => r - ..id = 'other_student' - ..name = 'Other student' - ..commonCourses = MapBuilder({ - 'course_2': BuiltList(['StudentEnrollment']) - })); - - final allRecipients = [teacher, ta, observer, currentUser, student, otherStudent]; - final expectedRecipients = [teacher, ta]; - - when(inboxApi.getRecipients(any)).thenAnswer((_) async => allRecipients); - - final actual = await CreateConversationInteractor().loadData(course.id, studentId); - - expect(actual.recipients, expectedRecipients); - }); -} \ No newline at end of file diff --git a/apps/flutter_parent/test/screens/inbox/create_conversation/create_conversation_screen_test.dart b/apps/flutter_parent/test/screens/inbox/create_conversation/create_conversation_screen_test.dart deleted file mode 100644 index b4fdf189ce..0000000000 --- a/apps/flutter_parent/test/screens/inbox/create_conversation/create_conversation_screen_test.dart +++ /dev/null @@ -1,1024 +0,0 @@ -// Copyright (C) 2019 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'dart:async'; -import 'dart:io'; - -import 'package:built_collection/built_collection.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_parent/l10n/app_localizations.dart'; -import 'package:flutter_parent/models/attachment.dart'; -import 'package:flutter_parent/models/conversation.dart'; -import 'package:flutter_parent/models/course.dart'; -import 'package:flutter_parent/models/recipient.dart'; -import 'package:flutter_parent/screens/inbox/attachment_utils/attachment_handler.dart'; -import 'package:flutter_parent/screens/inbox/create_conversation/create_conversation_interactor.dart'; -import 'package:flutter_parent/screens/inbox/create_conversation/create_conversation_screen.dart'; -import 'package:flutter_parent/utils/design/canvas_icons.dart'; -import 'package:flutter_test/flutter_test.dart'; -import 'package:get_it/get_it.dart'; -import 'package:mockito/mockito.dart'; - -import '../../../utils/accessibility_utils.dart'; -import '../../../utils/network_image_response.dart'; -import '../../../utils/test_app.dart'; -import '../../../utils/test_helpers/mock_helpers.mocks.dart'; -import '../../../utils/test_utils.dart'; - -/** - * NOTE: This test file is from the before times, please don't use as reference. - */ -void main() { - //String studentName = 'Student Name'; - String studentId = 'student_123'; - - mockNetworkImageResponse(); - - final l10n = AppLocalizations(); - - _setupLocator( - {int recipientCount = 4, - AttachmentHandler? attachmentHandler, - int fetchFailCount = 0, - int sendFailCount = 0, - bool pronouns = false}) async { - await setupTestLocator((locator) { - locator.registerFactory( - () => _MockInteractor(recipientCount, attachmentHandler, fetchFailCount, sendFailCount, pronouns)); - }); - } - - Widget _testableWidget({Course? course, String? subject, String? postscript, MockNavigatorObserver? observer}) { - if (course == null) course = _mockCourse('0'); - return TestApp( - CreateConversationScreen(course.id, studentId, subject ?? course.name, postscript), - navigatorObservers: [if (observer != null) observer], - ); - } - - testWidgetsWithAccessibilityChecks('shows loading when retrieving participants', (tester) async { - await _setupLocator(); - await tester.pumpWidget(_testableWidget()); - await tester.pump(); - final matchedWidget = find.byType(CircularProgressIndicator); - expect(matchedWidget, findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('does not show loading when participants are loaded', (tester) async { - await _setupLocator(); - - await tester.pumpWidget(_testableWidget()); - await tester.pumpAndSettle(); - - final matchedWidget = find.byType(CircularProgressIndicator); - expect(matchedWidget, findsNothing); - }); - - testWidgetsWithAccessibilityChecks('sending disabled when no message is present', (tester) async { - await _setupLocator(); - - await tester.pumpWidget(_testableWidget()); - await tester.pumpAndSettle(); - - final matchedWidget = find.byKey(CreateConversationScreen.sendKey); - expect(matchedWidget, findsOneWidget); - expect(tester.widget(matchedWidget).onPressed == null, isTrue); - }); - - testWidgetsWithAccessibilityChecks('Shows error state on fetch fail, allows retry', (tester) async { - await _setupLocator(fetchFailCount: 1); - - await tester.pumpWidget(_testableWidget()); - await tester.pumpAndSettle(); - - // Should show error message and retry button - expect(find.text(l10n.errorLoadingRecipients), findsOneWidget); - expect(find.text(l10n.retry), findsOneWidget); - - // Show not show attachment button - expect(find.byTooltip(l10n.addAttachment), findsNothing); - - // Tap retry button, wait for success state - await tester.tap(find.text(l10n.retry)); - await tester.pumpAndSettle(); - - // Should no longer show error message or retry button - expect(find.text(l10n.errorLoadingRecipients), findsNothing); - expect(find.text(l10n.retry), findsNothing); - - // Attachment button show now be visible - expect(find.byTooltip(l10n.addAttachment), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('can enter message text', (tester) async { - await _setupLocator(); - - await tester.pumpWidget(_testableWidget()); - await tester.pumpAndSettle(); - - final messageText = 'Some text here'; - var matchedWidget = find.byKey(CreateConversationScreen.messageKey); - await tester.enterText(matchedWidget, messageText); - - matchedWidget = find.text(messageText); - expect(matchedWidget, findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('sending is enabled once message is present', (tester) async { - await _setupLocator(); - - await tester.pumpWidget(_testableWidget()); - await tester.pumpAndSettle(); - - var matchedWidget = find.byKey(CreateConversationScreen.messageKey); - await tester.enterText(matchedWidget, 'Some text here'); - await tester.pump(); - - matchedWidget = find.byKey(CreateConversationScreen.sendKey); - expect(matchedWidget, findsOneWidget); - expect(tester.widget(matchedWidget).onPressed != null, isTrue); - }); - - testWidgetsWithAccessibilityChecks('sending is disabled when subject is empty and message is present', - (tester) async { - await _setupLocator(); - - await tester.pumpWidget(_testableWidget()); - await tester.pumpAndSettle(); - - // Set message body - var matchedWidget = find.byKey(CreateConversationScreen.messageKey); - await tester.enterText(matchedWidget, 'Some text here'); - - // Clear out subject - matchedWidget = find.byKey(CreateConversationScreen.subjectKey); - await tester.enterText(matchedWidget, ''); - await tester.pump(); - - matchedWidget = find.byKey(CreateConversationScreen.sendKey); - expect(matchedWidget, findsOneWidget); - expect(tester.widget(matchedWidget).onPressed == null, isTrue); - }); - - testWidgetsWithAccessibilityChecks( - 'sending is disabled when attachment is uploading or failed, enabled when finished', (tester) async { - // Set up attachment handler in 'uploading' stage - var handler = _MockAttachmentHandler()..stage = AttachmentUploadStage.UPLOADING; - - await _setupLocator(attachmentHandler: handler); - - await tester.pumpWidget(_testableWidget()); - await tester.pumpAndSettle(); - - // Set message body - var matchedWidget = find.byKey(CreateConversationScreen.messageKey); - await tester.enterText(matchedWidget, 'Some text here'); - await tester.pump(); - - // Make sure send button is enabled at this point - matchedWidget = find.byKey(CreateConversationScreen.sendKey); - expect(tester.widget(matchedWidget).onPressed != null, isTrue); - - // Add attachment - await tester.tap(find.byKey(CreateConversationScreen.attachmentKey)); - await tester.pump(); - - // Assert sending is disabled - matchedWidget = find.byKey(CreateConversationScreen.sendKey); - expect(tester.widget(matchedWidget).onPressed == null, isTrue); - - // Move to failed state - handler.stage = AttachmentUploadStage.FAILED; - - // Assert sending is still disabled - matchedWidget = find.byKey(CreateConversationScreen.sendKey); - expect(tester.widget(matchedWidget).onPressed == null, isTrue); - - // Move to finished state - handler.attachment = Attachment((b) => b - ..displayName = 'File' - ..thumbnailUrl = 'fake url'); - handler.stage = AttachmentUploadStage.FINISHED; - await tester.pump(); - - // Sending should now be enabled - matchedWidget = find.byKey(CreateConversationScreen.sendKey); - expect(tester.widget(matchedWidget).onPressed != null, isTrue); - }); - - testWidgetsWithAccessibilityChecks( - 'sending is disabled when no participants are selected, but subject and message are present', (tester) async { - await _setupLocator(recipientCount: 0); - - await tester.pumpWidget(_testableWidget()); - await tester.pumpAndSettle(); - - // Set message body - var matchedWidget = find.byKey(CreateConversationScreen.messageKey); - await tester.enterText(matchedWidget, 'Some text here'); - await tester.pump(); - - matchedWidget = find.byKey(CreateConversationScreen.sendKey); - expect(matchedWidget, findsOneWidget); - expect(tester.widget(matchedWidget).onPressed == null, isTrue); - }); - - testWidgetsWithAccessibilityChecks('prepopulates course name as subject', (tester) async { - await _setupLocator(); - - final course = _mockCourse('0'); - await tester.pumpWidget(_testableWidget(course: course)); - await tester.pumpAndSettle(); - - var matchedWidget = find.byKey(CreateConversationScreen.subjectKey); - expect(tester.widget(matchedWidget).controller!.text, course.name); - }); - - testWidgetsWithAccessibilityChecks('subject can be edited', (tester) async { - await _setupLocator(); - - final course = _mockCourse('0'); - await tester.pumpWidget(_testableWidget(course: course)); - await tester.pumpAndSettle(); - - var matchedWidget = find.byKey(CreateConversationScreen.subjectKey); - await tester.enterText(matchedWidget, course.courseCode!); - await tester.pump(); - - expect(tester.widget(matchedWidget).controller!.text, course.courseCode); - }); - - testWidgetsWithAccessibilityChecks('prepopulates recipients', (tester) async { - final recipientCount = 2; - await _setupLocator(recipientCount: recipientCount); - - final course = _mockCourse('0'); - await tester.pumpWidget(_testableWidget(course: course)); - await tester.pumpAndSettle(); - - var matchedWidget = find.byKey(CreateConversationScreen.recipientsKey); - - // Our MockInteractor sets odd enrollments as teachers, which are the only recipients pre-populated - expect(tester.widget(matchedWidget).children.length, recipientCount / 2); - }); - - testWidgetsWithAccessibilityChecks('backing out without text in the body does not show a dialog', (tester) async { - await _setupLocator(); - final course = _mockCourse('0'); - - // Load up a temp page with a button to navigate to our screen, that way the back button exists in the app bar - await _pumpTestableWidgetWithBackButton( - tester, - CreateConversationScreen(course.id, studentId, '', null), - ); - - var matchedWidget = find.byKey(CreateConversationScreen.messageKey); - - await tester.pageBack(); - await tester.pump(); - - matchedWidget = find.text(l10n.unsavedChangesDialogBody); - expect(matchedWidget, findsNothing); - }); - - testWidgetsWithAccessibilityChecks('backing out with text in the body will show confirmation dialog', (tester) async { - await _setupLocator(); - final course = _mockCourse('0'); - - await _pumpTestableWidgetWithBackButton( - tester, - CreateConversationScreen(course.id, studentId, '', null), - ); - - var matchedWidget = find.byKey(CreateConversationScreen.messageKey); - await tester.enterText(matchedWidget, 'Some text here'); - await tester.pump(); - - await tester.pageBack(); - await tester.pump(); - - matchedWidget = find.text(l10n.unsavedChangesDialogBody); - expect(matchedWidget, findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('backing out and pressing yes on the dialog closes the screen', (tester) async { - await _setupLocator(); - final course = _mockCourse('0'); - final observer = MockNavigatorObserver(); - - await _pumpTestableWidgetWithBackButton( - tester, - CreateConversationScreen(course.id, studentId, '', null), - observer: observer, - ); - - var matchedWidget = find.byKey(CreateConversationScreen.messageKey); - await tester.enterText(matchedWidget, 'Some text here'); - await tester.pump(); - - await tester.pageBack(); - await tester.pump(); - - matchedWidget = find.text(l10n.yes); - await tester.tap(matchedWidget); - - verify(observer.didPop(any, any)).called(2); // Twice, first for the dialog, then for the screen - }); - - testWidgetsWithAccessibilityChecks('backing out and pressing no on the dialog keeps screen open', (tester) async { - await _setupLocator(); - final course = _mockCourse('0'); - final observer = MockNavigatorObserver(); - - await _pumpTestableWidgetWithBackButton( - tester, - CreateConversationScreen(course.id, studentId, '', null), - observer: observer, - ); - - var matchedWidget = find.byKey(CreateConversationScreen.messageKey); - await tester.enterText(matchedWidget, 'Some text here'); - await tester.pump(); - - await tester.pageBack(); - await tester.pump(); - - matchedWidget = find.text(l10n.no); - await tester.tap(matchedWidget); - - verify(observer.didPop(any, any)).called(1); // Only once, for the dialog - }); - - testWidgetsWithAccessibilityChecks('backing out deletes attachments', (tester) async { - final course = _mockCourse('0'); - - // Set up attachment handler in 'uploading' stage - var handler = MockAttachmentHandler(); - when(handler.stage).thenReturn(AttachmentUploadStage.FINISHED); - when(handler.attachment).thenReturn(Attachment((b) => b - ..displayName = 'File' - ..thumbnailUrl = 'fake url')); - - await _setupLocator(attachmentHandler: handler); - - // Create page and add attachment - await _pumpTestableWidgetWithBackButton(tester, CreateConversationScreen(course.id, studentId, '', null)); - await tester.pumpAndSettle(); - await tester.tap(find.byKey(CreateConversationScreen.attachmentKey)); - await tester.pumpAndSettle(); - - // Attempt to go back - await tester.pageBack(); - await tester.pump(); - - // Press 'yes' on confirmation dialog - await tester.tap(find.text(l10n.yes)); - await tester.pumpAndSettle(); - - verify(handler.deleteAttachment()); - }); - - testWidgetsWithAccessibilityChecks('clicking the add participants button shows the modal', (tester) async { - await _setupLocator(); - final course = _mockCourse('0'); - final observer = MockNavigatorObserver(); - - await tester.pumpWidget(_testableWidget(course: course, observer: observer)); - await tester.pumpAndSettle(); - - var matchedWidget = find.byKey(CreateConversationScreen.recipientsAddKey); - await tester.tap(matchedWidget); - await tester.pumpAndSettle(); - - matchedWidget = find.text(l10n.recipients); - expect(matchedWidget, findsOneWidget); - verify(observer.didPush(any, any)).called(2); // Twice, first for the initial page, then for the modal - - // Test that clicking outside closes the modal - await tester.tapAt(Offset(0, 0)); - await tester.pumpAndSettle(); - verify(observer.didPop(any, any)).called(1); // Only once, for the modal - }); - - testWidgetsWithAccessibilityChecks('displays attachment upload state', (tester) async { - // Set up attachment handler in 'uploading' stage - var handler = _MockAttachmentHandler() - ..stage = AttachmentUploadStage.UPLOADING - ..progress = 0.25; - - await _setupLocator(attachmentHandler: handler); - - // Create page and add attachment - await tester.pumpWidget(_testableWidget()); - await tester.pumpAndSettle(); - await tester.tap(find.byKey(CreateConversationScreen.attachmentKey)); - await tester.pump(); - - // Assert attachment widget is displayed - var attachmentWidget = find.byType(AttachmentWidget); - expect(attachmentWidget, findsOneWidget); - - // Assert attachment widget displays progress - var progressWidget = find.descendant(of: attachmentWidget, matching: find.byType(CircularProgressIndicator)); - expect(tester.widget(progressWidget).value, handler.progress); - var percentageWidget = find.descendant(of: attachmentWidget, matching: find.byType(Text)); - expect(tester.widget(percentageWidget).data, '25%'); - - // Update progress - handler.progress = 0.75; - handler.notifyListeners(); - await tester.pump(); - - // Assert progress UI is updated - progressWidget = find.descendant(of: attachmentWidget, matching: find.byType(CircularProgressIndicator)); - expect(tester.widget(progressWidget).value, handler.progress); - percentageWidget = find.descendant(of: attachmentWidget, matching: find.byType(Text)); - expect(tester.widget(percentageWidget).data, '75%'); - }); - - testWidgetsWithAccessibilityChecks('displays attachment failed state with retry and delete options', (tester) async { - // Set up attachment handler in 'failed' stage - var handler = _MockAttachmentHandler()..stage = AttachmentUploadStage.FAILED; - - await _setupLocator(attachmentHandler: handler); - - // Create page and add attachment - await tester.pumpWidget(_testableWidget()); - await tester.pumpAndSettle(); - await tester.tap(find.byKey(CreateConversationScreen.attachmentKey)); - await tester.pump(); - - // Assert attachment widget is displayed - var attachmentWidget = find.byType(AttachmentWidget); - expect(attachmentWidget, findsOneWidget); - - // Assert attachment widget displays failed state - var warningIcon = find.descendant(of: attachmentWidget, matching: find.byType(Icon)); - expect(tester.widget(warningIcon).icon, CanvasIcons.warning); - expect(find.text(l10n.attachmentFailed), findsOneWidget); - - // Tap attachment - await tester.tap(attachmentWidget); - await tester.pumpAndSettle(); - - // Tap retry button and move to uploading state - await tester.tap(find.text(l10n.retry)); - handler.stage = AttachmentUploadStage.UPLOADING; - handler.progress = 0.25; - handler.notifyListeners(); - await tester.pump(); - - // Assert attachment widget displays progress - attachmentWidget = find.byType(AttachmentWidget); - var progressWidget = find.descendant(of: attachmentWidget, matching: find.byType(CircularProgressIndicator)); - expect(tester.widget(progressWidget).value, handler.progress); - var percentageWidget = find.descendant(of: attachmentWidget, matching: find.byType(Text)); - expect(tester.widget(percentageWidget).data, '25%'); - - // Move to failed state - handler.stage = AttachmentUploadStage.FAILED; - handler.notifyListeners(); - await tester.pump(); - - // Tap delete button - attachmentWidget = find.byType(AttachmentWidget); - await tester.tap(attachmentWidget); - await tester.pumpAndSettle(); - await tester.tap(find.text(l10n.delete)); - await tester.pumpAndSettle(); - - // Ensure attachment widget has been removed - attachmentWidget = find.byType(AttachmentWidget); - expect(attachmentWidget, findsNothing); - }); - - testWidgetsWithAccessibilityChecks('can delete successful attachment', (tester) async { - // Set up attachment handler in 'uploading' stage - var handler = _MockAttachmentHandler() - ..stage = AttachmentUploadStage.FINISHED - ..attachment = Attachment((b) => b - ..displayName = 'File' - ..thumbnailUrl = 'fake url'); - - await _setupLocator(attachmentHandler: handler); - - // Create page and add attachment - await tester.pumpWidget(_testableWidget()); - await tester.pumpAndSettle(); - await tester.tap(find.byKey(CreateConversationScreen.attachmentKey)); - await tester.pump(); - - // Assert attachment widget is displayed - var attachmentWidget = find.byType(AttachmentWidget); - expect(attachmentWidget, findsOneWidget); - - // Tap delete button - await tester.tap(attachmentWidget); - await tester.pumpAndSettle(); - await tester.tap(find.text(l10n.delete)); - await tester.pumpAndSettle(); - - // Ensure attachment widget has been removed - attachmentWidget = find.byType(AttachmentWidget); - expect(attachmentWidget, findsNothing); - }); - - testWidgetsWithAccessibilityChecks('deleting an attachment calls AttachmentHandler.deleteAttachment', (tester) async { - // Set up attachment handler in 'uploading' stage - var handler = MockAttachmentHandler(); - when(handler.stage).thenReturn(AttachmentUploadStage.FINISHED); - when(handler.attachment).thenReturn(Attachment((b) => b - ..displayName = 'File' - ..thumbnailUrl = 'fake url')); - - await _setupLocator(attachmentHandler: handler); - - // Create page and add attachment - await tester.pumpWidget(_testableWidget()); - await tester.pumpAndSettle(); - await tester.tap(find.byKey(CreateConversationScreen.attachmentKey)); - await tester.pump(); - - // Assert attachment widget is displayed - var attachmentWidget = find.byType(AttachmentWidget); - expect(attachmentWidget, findsOneWidget); - - // Tap delete button - await tester.tap(attachmentWidget); - await tester.pumpAndSettle(); - await tester.tap(find.text(l10n.delete)); - await tester.pumpAndSettle(); - - verify(handler.deleteAttachment()); - }); - - testWidgetsWithAccessibilityChecks('displays attachment tooltip in upload state', (tester) async { - // Set up attachment handler in 'uploading' stage - var handler = AttachmentHandler(File('path/to/file.txt')) - ..stage = AttachmentUploadStage.UPLOADING - ..progress = 0.25; - - await _setupLocator(attachmentHandler: handler); - - // Create page and add attachment - await tester.pumpWidget(_testableWidget()); - await tester.pumpAndSettle(); - await tester.tap(find.byKey(CreateConversationScreen.attachmentKey)); - await tester.pump(); - await tester.pumpAndSettle(); - - // Assert attachment widget is displayed - var attachmentWidget = find.byType(AttachmentWidget); - expect(attachmentWidget, findsOneWidget); - - await tester.longPress(attachmentWidget); - await tester.pump(Duration(milliseconds: 100)); - await tester.pumpAndSettle(); - - expect(find.text('file.txt'), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('displays attachment tooltip in failed state', (tester) async { - // Set up attachment handler in 'uploading' stage - var handler = AttachmentHandler(File('path/to/file.txt'))..stage = AttachmentUploadStage.FAILED; - - await _setupLocator(attachmentHandler: handler); - - // Create page and add attachment - await tester.pumpWidget(_testableWidget()); - await tester.pumpAndSettle(); - await tester.tap(find.byKey(CreateConversationScreen.attachmentKey)); - await tester.pump(); - await tester.pumpAndSettle(); - - // Assert attachment widget is displayed - var attachmentWidget = find.byType(AttachmentWidget); - expect(attachmentWidget, findsOneWidget); - - await tester.longPress(attachmentWidget); - await tester.pump(Duration(milliseconds: 100)); - await tester.pumpAndSettle(); - - expect(find.text('file.txt'), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('displays attachment tooltip in finished state', (tester) async { - // Set up attachment handler in 'uploading' stage - var handler = AttachmentHandler(File('path/to/file.txt')) - ..attachment = Attachment((b) => b..displayName = 'upload.txt') - ..stage = AttachmentUploadStage.FINISHED; - - await _setupLocator(attachmentHandler: handler); - - // Create page and add attachment - await tester.pumpWidget(_testableWidget()); - await tester.pumpAndSettle(); - await tester.tap(find.byKey(CreateConversationScreen.attachmentKey)); - await tester.pump(); - await tester.pumpAndSettle(); - - // Assert attachment widget is displayed - var attachmentWidget = find.byType(AttachmentWidget); - expect(attachmentWidget, findsOneWidget); - - await tester.longPress(attachmentWidget); - await tester.pump(Duration(milliseconds: 100)); - await tester.pumpAndSettle(); - - expect(find.text('upload.txt'), findsNWidgets(2)); // 2 widgets: one is the tooltip and one is the regular label - }); - - testWidgetsWithAccessibilityChecks('disables attachment interactions while sending', (tester) async { - // Set up attachment handler in 'uploading' stage - var handler = _MockAttachmentHandler() - ..stage = AttachmentUploadStage.FINISHED - ..attachment = Attachment((b) => b - ..displayName = 'File' - ..thumbnailUrl = 'fake url'); - - await _setupLocator(attachmentHandler: handler); - - // Create page and add attachment - await tester.pumpWidget(_testableWidget()); - await tester.pumpAndSettle(); - await tester.tap(find.byKey(CreateConversationScreen.attachmentKey)); - await tester.pump(); - - // Assert attachment widget is displayed - var attachmentWidget = find.byType(AttachmentWidget); - expect(attachmentWidget, findsOneWidget); - - // Tap attachment - await tester.tap(attachmentWidget); - await tester.pumpAndSettle(); - - // Should display delete option - expect(find.text(l10n.delete), findsOneWidget); - - // Tap outside to dismiss attachment options - await tester.tapAt(Offset(0, 0)); - await tester.pumpAndSettle(); - - // Add text to enable sending - var matchedWidget = find.byKey(CreateConversationScreen.messageKey); - await tester.enterText(matchedWidget, 'Some text here'); - await tester.pump(); - - // Tap send button - await tester.tap(find.byKey(CreateConversationScreen.sendKey)); - await tester.pump(); - - // Tap attachment - await tester.tap(attachmentWidget); - await tester.pump(Duration(milliseconds: 150)); - - // Should not display delete option - expect(find.text(l10n.delete), findsNothing); - await tester.pump(Duration(milliseconds: 200)); - }); - - testWidgetsWithAccessibilityChecks('Expands and collapses recipient box', (tester) async { - await _setupLocator(); - - await tester.pumpWidget(_testableWidget()); - await tester.pumpAndSettle(); - - // Should show one chip and the text '+1' - expect(find.byType(Chip), findsOneWidget); - expect(find.text('+1'), findsOneWidget); - - // Tap recipient box to expand - await tester.tap(find.byKey(CreateConversationScreen.recipientsKey)); - await tester.pump(); - - // Should show two recipient chips - expect(find.byType(Chip), findsNWidgets(2)); - expect(find.text('+1'), findsNothing); - }); - - testWidgetsWithAccessibilityChecks('Selects recipients from list', (tester) async { - await _setupLocator(recipientCount: 2); // One teacher, one student - final course = _mockCourse('0'); - - await tester.pumpWidget(_testableWidget(course: course)); - await tester.pumpAndSettle(); - - // Should show one teacher recipient (User 1) - var chip = find.byType(Chip); - expect(chip, findsOneWidget); - expect(find.descendant(of: chip, matching: find.text('User 1')), findsOneWidget); - - var recipientsButton = find.byKey(CreateConversationScreen.recipientsAddKey); - await tester.tap(recipientsButton); - await tester.pumpAndSettle(); - - // Deselect User 1, select User 0 - await tester.tap(find.text('User 1').last); - await tester.tap(find.text('User 0')); - await tester.tapAt(Offset(0, 0)); - await tester.pumpAndSettle(); - - // Should show one student recipient (User 1) - chip = find.byType(Chip); - expect(chip, findsOneWidget); - expect(find.descendant(of: chip, matching: find.text('User 0')), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('Shows error on send fail', (tester) async { - await _setupLocator(sendFailCount: 1); - final course = _mockCourse('0'); - - await tester.pumpWidget(_testableWidget(course: course)); - await tester.pumpAndSettle(); - - // Set message body - var matchedWidget = find.byKey(CreateConversationScreen.messageKey); - await tester.enterText(matchedWidget, 'Some text here'); - await tester.pump(); - - await tester.tap(find.byKey(CreateConversationScreen.sendKey)); - await tester.pumpAndSettle(); - - expect(find.text(l10n.errorSendingMessage), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('Shows sending indicator and closes after success', (tester) async { - await _setupLocator(); - final course = _mockCourse('0'); - final observer = MockNavigatorObserver(); - - await _pumpTestableWidgetWithBackButton( - tester, - CreateConversationScreen(course.id, studentId, course.name, null), - ); - await tester.pumpWidget(_testableWidget(course: course, observer: observer)); - await tester.pumpAndSettle(); - - // Set message body - var matchedWidget = find.byKey(CreateConversationScreen.messageKey); - await tester.enterText(matchedWidget, 'Some text here'); - await tester.pump(); - - await tester.tap(find.byKey(CreateConversationScreen.sendKey)); - await tester.pump(); - await tester.pump(); - - // Should show progressbar in app bar - var appBar = find.byType(AppBar); - expect(appBar, findsOneWidget); - var progressBar = find.descendant(of: appBar, matching: find.byType(CircularProgressIndicator)); - expect(progressBar, findsOneWidget); - - await tester.pumpAndSettle(); - verify(observer.didPop(any, any)).called(1); - }); - - testWidgetsWithAccessibilityChecks('Displays pronouns for recipients', (tester) async { - await _setupLocator(recipientCount: 2, pronouns: true); // One teacher, one student - final course = _mockCourse('0'); - - await tester.pumpWidget(_testableWidget(course: course)); - await tester.pumpAndSettle(); - - // Should show one teacher recipient (User 1) - var chip = find.byType(Chip); - expect(chip, findsOneWidget); - expect(find.descendant(of: chip, matching: find.text('User 1 (They/them)')), findsOneWidget); - - var recipientsButton = find.byKey(CreateConversationScreen.recipientsAddKey); - await tester.tap(recipientsButton); - await tester.pumpAndSettle(); - }); - - testWidgetsWithAccessibilityChecks('Displays enrollment type in recipient chip', (tester) async { - await _setupLocator(recipientCount: 2); - final course = _mockCourse('0'); - - await tester.pumpWidget(_testableWidget(course: course)); - await tester.pumpAndSettle(); - - var chip = find.byType(Chip); - expect(chip, findsOneWidget); - expect(find.descendant(of: chip, matching: find.text('Teacher')), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('Displays enrollment types', (tester) async { - var interactor = MockCreateConversationInteractor(); - await GetIt.instance.reset(); - GetIt.instance.registerFactory(() => interactor); - - Recipient _makeRecipient(String id, String type) { - return Recipient((b) => b - ..id = id - ..name = 'User $id' - ..commonCourses = MapBuilder>({ - '0': BuiltList([type]) - })); - } - - var recipients = [ - _makeRecipient('0', 'StudentEnrollment'), - _makeRecipient('1', 'TeacherEnrollment'), - _makeRecipient('2', 'TaEnrollment'), - _makeRecipient('3', 'ObserverEnrollment'), - ]; - - when(interactor.loadData(any, any)).thenAnswer((_) async => CreateConversationData(_mockCourse('0'), recipients)); - - await tester.pumpWidget(_testableWidget()); - await tester.pumpAndSettle(); - - var recipientsButton = find.byKey(CreateConversationScreen.recipientsAddKey); - await tester.tap(recipientsButton); - await tester.pumpAndSettle(); - - _expectRole(String userName, String enrollmentType) { - var tile = find.ancestor(of: find.text(userName), matching: find.byType(ListTile)); - expect(tile, findsOneWidget); - var role = find.descendant(of: tile, matching: find.text(enrollmentType)); - expect(role, findsOneWidget); - } - - _makeTileVisible(String withText) async { - var finder = find.ancestor(of: find.text(withText), matching: find.byType(ListTile)); - await ensureVisibleByScrolling(finder, tester, scrollFrom: ScreenVerticalLocation.MID_BOTTOM); - await tester.pumpAndSettle(); - } - - await _makeTileVisible(l10n.enrollmentTypeStudent); - _expectRole('User 0', l10n.enrollmentTypeStudent); - await _makeTileVisible(l10n.enrollmentTypeTeacher); - _expectRole('User 1', l10n.enrollmentTypeTeacher); - await _makeTileVisible(l10n.enrollmentTypeTA); - _expectRole('User 2', l10n.enrollmentTypeTA); - await _makeTileVisible(l10n.enrollmentTypeObserver); - _expectRole('User 3', l10n.enrollmentTypeObserver); - - await tester.tapAt(Offset(0, 0)); - await tester.pumpAndSettle(); - }); - - testWidgetsWithAccessibilityChecks('passing in subject shows in subject text widget', (tester) async { - await _setupLocator(); - - final course = _mockCourse('0'); - final subject = 'Instructure Rocks!'; - - await tester.pumpWidget(_testableWidget(course: course, subject: subject)); - await tester.pumpAndSettle(); - - expect(find.text(subject), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('appends postscript if present', (tester) async { - final course = _mockCourse('0'); - Recipient _makeRecipient(String id, String type) { - return Recipient((b) => b - ..id = id - ..name = 'User $id' - ..commonCourses = MapBuilder>({ - '0': BuiltList([type]) - })); - } - - var interactor = MockCreateConversationInteractor(); - final data = CreateConversationData(course, [_makeRecipient('123', 'TeacherEnrollment')]); - when(interactor.loadData(any, any)).thenAnswer((_) async => data); - await GetIt.instance.reset(); - GetIt.instance.registerFactory(() => interactor); - - final subject = 'Regarding Instructure Pandas'; - final bodyText = 'Instructure Pandas'; - final postscript = 'P. S. More Pandas'; - final sendText = ['$bodyText\n\n$postscript']; - - await tester.pumpWidget(_testableWidget(course: course, subject: subject, postscript: postscript)); - await tester.pumpAndSettle(); - - // Check for the subject - expect(find.text(subject), findsOneWidget); - - // Type some text into the message body to enable the send button - var bodyMatcher = find.byKey(CreateConversationScreen.messageKey); - await tester.enterText(bodyMatcher, 'Instructure Pandas'); - await tester.pump(); - - // Verify send button exists and is enabled - final sendMatcher = find.byKey(CreateConversationScreen.sendKey); - expect(sendMatcher, findsOneWidget); - expect(tester.widget(sendMatcher).onPressed == null, isFalse); - - // Click on the send button - await tester.tap(sendMatcher); - await tester.pump(); - - // Check the outgoing message for the url - expect(verify(interactor.createConversation(any, any, any, captureAny, any)).captured, sendText); - }); -} - -/// Load up a temp page with a button to navigate to our screen, that way the back button exists in the app bar -Future _pumpTestableWidgetWithBackButton(tester, Widget widget, {MockNavigatorObserver? observer}) async { - final app = TestApp( - Builder( - builder: (context) => TextButton( - child: Semantics(label: 'test', child: const SizedBox()), - onPressed: () => Navigator.of(context).push(MaterialPageRoute(builder: (context) => widget)), - ), - ), - navigatorObservers: [if (observer != null) observer], - ); - - await tester.pumpWidget(app); - await tester.pumpAndSettle(); - await tester.tap(find.byType(TextButton)); - await tester.pumpAndSettle(); - if (observer != null) { - verify(observer.didPush(any, any)).called(2); // Twice, first for the initial page, then for the navigator route - } -} - -class _MockInteractor extends CreateConversationInteractor { - final _recipientCount; - - final AttachmentHandler? mockAttachmentHandler; - - int _fetchFailCount; - - int _sendFailCount; - - bool _pronouns; - - _MockInteractor(this._recipientCount, this.mockAttachmentHandler, this._fetchFailCount, this._sendFailCount, - [this._pronouns = false]); - - @override - Future loadData(String courseId, String? studentId) async { - if (_fetchFailCount > 0) { - _fetchFailCount--; - return Future.error('Error!'); - } - final list = List.generate( - _recipientCount, - (index) => Recipient((r) => r - ..id = index.toString() - ..name = 'User $index' - ..pronouns = _pronouns ? 'They/them' : null - ..avatarUrl = '' - ..commonCourses = _generateCourseMap(courseId, index.toString()))); - - return CreateConversationData(_mockCourse(courseId), list); - } - - MapBuilder> _generateCourseMap(String courseId, String userId) { - return MapBuilder>({ - courseId.toString(): BuiltList([int.parse(userId) % 2 == 0 ? 'StudentEnrollment' : 'TeacherEnrollment']) - }); - } - - @override - Future addAttachment(BuildContext context) { - return Future.value(mockAttachmentHandler); - } - - @override - Future createConversation( - String courseId, - List recipientIds, - String subject, - String body, - List attachmentIds, - ) { - if (_sendFailCount > 0) { - _sendFailCount--; - return Future.delayed(Duration(milliseconds: 200), () => Future.error('Error!')); - } - return Future.delayed(Duration(milliseconds: 200), () => Conversation((b) => b)); - } -} - -class _MockAttachmentHandler extends AttachmentHandler { - _MockAttachmentHandler() : super(null); - - @override - Future performUpload() => Future.value(); -} - -Course _mockCourse(String courseId) { - return Course((c) => c - ..id = courseId - ..name = 'Course Name' - ..courseCode = 'Course Code' - ..build()); -} diff --git a/apps/flutter_parent/test/screens/inbox/reply/conversation_reply_interactor_test.dart b/apps/flutter_parent/test/screens/inbox/reply/conversation_reply_interactor_test.dart deleted file mode 100644 index d736ce9297..0000000000 --- a/apps/flutter_parent/test/screens/inbox/reply/conversation_reply_interactor_test.dart +++ /dev/null @@ -1,340 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:built_collection/built_collection.dart'; -import 'package:flutter_parent/models/conversation.dart'; -import 'package:flutter_parent/models/course_permissions.dart'; -import 'package:flutter_parent/models/enrollment.dart'; -import 'package:flutter_parent/models/login.dart'; -import 'package:flutter_parent/models/message.dart'; -import 'package:flutter_parent/models/recipient.dart'; -import 'package:flutter_parent/models/user.dart'; -import 'package:flutter_parent/network/api/course_api.dart'; -import 'package:flutter_parent/network/api/enrollments_api.dart'; -import 'package:flutter_parent/network/api/inbox_api.dart'; -import 'package:flutter_parent/screens/inbox/reply/conversation_reply_interactor.dart'; -import 'package:mockito/mockito.dart'; -import 'package:test/test.dart'; - -import '../../../utils/platform_config.dart'; -import '../../../utils/test_app.dart'; -import '../../../utils/test_helpers/mock_helpers.dart'; -import '../../../utils/test_helpers/mock_helpers.mocks.dart'; - -void main() { - setUp(() async { - final login = Login((b) => b..user = User((u) => u.id = 'self').toBuilder()); - await setupPlatformChannels(config: PlatformConfig(initLoggedInUser: login)); - }); - - test('getCurrentUserId calls ApiPrefs', () { - var userId = ConversationReplyInteractor().getCurrentUserId(); - expect(userId, 'self'); - }); - - group('createReply calls InboxApi with correct params', () { - test('for conversation reply', () async { - var api = MockInboxApi(); - await setupTestLocator((locator) { - locator.registerLazySingleton(() => api); - }); - - var interactor = ConversationReplyInteractor(); - - Conversation conversation = _makeConversation(); - String body = 'This is a reply'; - List attachmentIds = ['a', 'b', 'c']; - bool replyAll = false; - - interactor.createReply(conversation, null, body, attachmentIds, replyAll); - - verify(api.addMessage(conversation.id, body, ['author1'], attachmentIds, ['message4'])).called(1); - }); - - test('for conversation reply all', () async { - var api = MockInboxApi(); - var enrollmentsApi = MockEnrollmentsApi(); - var courseApi = MockCourseApi(); - await setupTestLocator((locator) { - locator.registerLazySingleton(() => api); - locator.registerLazySingleton(() => enrollmentsApi); - locator.registerLazySingleton(() => courseApi); - }); - - when(enrollmentsApi.getObserveeEnrollments()) - .thenAnswer((_) => Future.value([_mockEnrollment(_mockStudent('hodor', '123').toBuilder())])); - when(api.getRecipients(any)).thenAnswer((_) => Future.value([])); - when(courseApi.getCoursePermissions(any)).thenAnswer((_) => Future.value(CoursePermissions())); - - var interactor = ConversationReplyInteractor(); - - Conversation conversation = _makeConversation(); - String body = 'This is a reply'; - List attachmentIds = ['a', 'b', 'c']; - bool replyAll = true; - - await interactor.createReply(conversation, null, body, attachmentIds, replyAll); - - verify(api.addMessage(conversation.id, body, [], attachmentIds, [])).called(1); - }); - - test('for message reply', () async { - var api = MockInboxApi(); - await setupTestLocator((locator) { - locator.registerLazySingleton(() => api); - }); - - var interactor = ConversationReplyInteractor(); - - Conversation conversation = _makeConversation(); - String body = 'This is a reply'; - List attachmentIds = ['a', 'b', 'c']; - bool replyAll = false; - Message message = conversation.messages![1]; - - interactor.createReply(conversation, message, body, attachmentIds, replyAll); - - verify(api.addMessage(conversation.id, body, ['author2'], attachmentIds, ['message3'])).called(1); - }); - - test('for message reply all', () async { - var api = MockInboxApi(); - var enrollmentsApi = MockEnrollmentsApi(); - var courseApi = MockCourseApi(); - await setupTestLocator((locator) { - locator.registerLazySingleton(() => api); - locator.registerLazySingleton(() => enrollmentsApi); - locator.registerLazySingleton(() => courseApi); - }); - - when(enrollmentsApi.getObserveeEnrollments()).thenAnswer((_) => Future.value([])); - - var recipientList = [ - _makeRecipient('self', 'ObserverEnrollment'), - _makeRecipient('author1', 'TeacherEnrollment'), - _makeRecipient('author2', 'TaEnrollment'), - _makeRecipient('author3', 'TeacherEnrollment'), - ]; - when(api.getRecipients(any)).thenAnswer((_) => Future.value(recipientList)); - - when(courseApi.getCoursePermissions(any)) - .thenAnswer((_) => Future.value(CoursePermissions((b) => b..sendMessages = true))); - - var interactor = ConversationReplyInteractor(); - - Conversation conversation = _makeConversation(); - String body = 'This is a reply'; - List attachmentIds = ['a', 'b', 'c']; - bool replyAll = true; - Message message = conversation.messages![3]; - - await interactor.createReply(conversation, message, body, attachmentIds, replyAll); - - verify( - api.addMessage(conversation.id, body, ['self', 'author1', 'author2', 'author3'], attachmentIds, ['message1']), - ).called(1); - }); - - test('for message reply all filters out non-observed students', () async { - var api = MockInboxApi(); - var enrollmentsApi = MockEnrollmentsApi(); - var courseApi = MockCourseApi(); - await setupTestLocator((locator) { - locator.registerLazySingleton(() => api); - locator.registerLazySingleton(() => enrollmentsApi); - locator.registerLazySingleton(() => courseApi); - }); - - var enrollmentsList = [_mockEnrollment(_mockStudent('student2', 'student2').toBuilder())]; - when(enrollmentsApi.getObserveeEnrollments()).thenAnswer((_) => Future.value(enrollmentsList)); - - var recipientList = [ - _makeRecipient('self', 'ObserverEnrollment'), - _makeRecipient('author1', 'TeacherEnrollment'), - _makeRecipient('author2', 'TaEnrollment'), - _makeRecipient('author3', 'TeacherEnrollment'), - _makeRecipient('student1', 'StudentEnrollment'), - _makeRecipient('student2', 'StudentEnrollment'), - ]; - when(api.getRecipients(any)).thenAnswer((_) => Future.value(recipientList)); - - when(courseApi.getCoursePermissions(any)) - .thenAnswer((_) => Future.value(CoursePermissions((b) => b..sendMessages = true))); - - var interactor = ConversationReplyInteractor(); - - Conversation conversation = _makeConversation(); - String body = 'This is a reply'; - List attachmentIds = ['a', 'b', 'c']; - bool replyAll = true; - Message message = conversation.messages![4]; - - await interactor.createReply(conversation, message, body, attachmentIds, replyAll); - - verify( - api.addMessage( - conversation.id, body, ['self', 'author1', 'author2', 'author3', 'student2'], attachmentIds, ['message1']), - ).called(1); - }); - - test('for self-authored message reply', () async { - var api = MockInboxApi(); - await setupTestLocator((locator) { - locator.registerLazySingleton(() => api); - }); - - var interactor = ConversationReplyInteractor(); - - Conversation conversation = _makeConversation(); - String body = 'This is a reply'; - List attachmentIds = ['a', 'b', 'c']; - bool replyAll = false; - Message message = conversation.messages![2]; - - interactor.createReply(conversation, message, body, attachmentIds, replyAll); - - verify( - api.addMessage(conversation.id, body, ['self', 'author1', 'author2', 'author3'], attachmentIds, ['message2']), - ).called(1); - }); - - test('for self-authored conversation reply', () async { - var api = MockInboxApi(); - await setupTestLocator((locator) { - locator.registerLazySingleton(() => api); - }); - - var interactor = ConversationReplyInteractor(); - - Conversation conversation = _makeConversation().rebuild((c) => c - ..messages = ListBuilder([ - c.messages[2], // self-authored message moved to first position - c.messages[0], - c.messages[1], - c.messages[3], - ])); - String body = 'This is a reply'; - List attachmentIds = ['a', 'b', 'c']; - bool replyAll = false; - - interactor.createReply(conversation, null, body, attachmentIds, replyAll); - - verify( - api.addMessage(conversation.id, body, ['self', 'author1', 'author2', 'author3'], attachmentIds, ['message2']), - ).called(1); - }); - - test('for monologue message reply', () async { - var api = MockInboxApi(); - await setupTestLocator((locator) { - locator.registerLazySingleton(() => api); - }); - - var interactor = ConversationReplyInteractor(); - - Conversation conversation = Conversation((c) => c - ..id = 'conversation1' - ..messages = ListBuilder([ - Message((m) => m - ..id = 'message1' - ..authorId = 'self' - ..participatingUserIds = ListBuilder(['self'])), - ])); - String body = 'This is a reply'; - List attachmentIds = ['a', 'b', 'c']; - bool replyAll = false; - Message message = conversation.messages![0]; - - interactor.createReply(conversation, message, body, attachmentIds, replyAll); - - verify( - api.addMessage(conversation.id, body, ['self'], attachmentIds, ['message1']), - ).called(1); - }); - - test('for monologue conversation reply', () async { - var api = MockInboxApi(); - await setupTestLocator((locator) { - locator.registerLazySingleton(() => api); - }); - - var interactor = ConversationReplyInteractor(); - - Conversation conversation = Conversation((c) => c - ..id = 'conversation1' - ..messages = ListBuilder([ - Message((m) => m - ..id = 'message1' - ..authorId = 'self' - ..participatingUserIds = ListBuilder(['self'])), - ])); - String body = 'This is a reply'; - List attachmentIds = ['a', 'b', 'c']; - bool replyAll = false; - - interactor.createReply(conversation, null, body, attachmentIds, replyAll); - - verify( - api.addMessage(conversation.id, body, ['self'], attachmentIds, ['message1']), - ).called(1); - }); - }); -} - -Conversation _makeConversation() { - return Conversation((c) => c - ..id = 'conversation1' - ..contextCode = "course_123" - ..messages = ListBuilder([ - Message((m) => m - ..id = 'message4' - ..authorId = 'author1' - ..participatingUserIds = ListBuilder(['self', 'author1', 'author2', 'author3'])), - Message((m) => m - ..id = 'message3' - ..authorId = 'author2' - ..participatingUserIds = ListBuilder(['self', 'author2', 'author4'])), - Message((m) => m - ..id = 'message2' - ..authorId = 'self' - ..participatingUserIds = ListBuilder(['self', 'author1', 'author2', 'author3'])), - Message((m) => m - ..id = 'message1' - ..authorId = 'author3' - ..participatingUserIds = ListBuilder(['self', 'author1', 'author2', 'author3'])), - Message((m) => m - ..id = 'message1' - ..authorId = 'author3' - ..participatingUserIds = ListBuilder(['self', 'author1', 'author2', 'author3', 'student1', 'student2'])), - ])); -} - -User _mockStudent(String name, String id) => User((b) => b - ..id = id - ..sortableName = name - ..build()); - -Enrollment _mockEnrollment(UserBuilder observedUser) => Enrollment((b) => b - ..enrollmentState = '' - ..observedUser = observedUser - ..build()); - -Recipient _makeRecipient(String id, String type) { - return Recipient((b) => b - ..id = id - ..name = 'User $id' - ..commonCourses = MapBuilder>({ - '123': BuiltList([type]) - })); -} diff --git a/apps/flutter_parent/test/screens/inbox/reply/conversation_reply_screen_test.dart b/apps/flutter_parent/test/screens/inbox/reply/conversation_reply_screen_test.dart deleted file mode 100644 index 5fe8338b01..0000000000 --- a/apps/flutter_parent/test/screens/inbox/reply/conversation_reply_screen_test.dart +++ /dev/null @@ -1,707 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'dart:async'; -import 'dart:io'; - -import 'package:built_collection/built_collection.dart'; -import 'package:built_value/json_object.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_parent/l10n/app_localizations.dart'; -import 'package:flutter_parent/models/attachment.dart'; -import 'package:flutter_parent/models/basic_user.dart'; -import 'package:flutter_parent/models/conversation.dart'; -import 'package:flutter_parent/models/message.dart'; -import 'package:flutter_parent/screens/inbox/attachment_utils/attachment_handler.dart'; -import 'package:flutter_parent/screens/inbox/attachment_utils/attachment_picker.dart'; -import 'package:flutter_parent/screens/inbox/attachment_utils/attachment_picker_interactor.dart'; -import 'package:flutter_parent/screens/inbox/conversation_details/message_widget.dart'; -import 'package:flutter_parent/screens/inbox/create_conversation/create_conversation_screen.dart'; -import 'package:flutter_parent/screens/inbox/reply/conversation_reply_interactor.dart'; -import 'package:flutter_parent/screens/inbox/reply/conversation_reply_screen.dart'; -import 'package:flutter_parent/utils/common_widgets/view_attachment/view_attachment_interactor.dart'; -import 'package:flutter_parent/utils/common_widgets/view_attachment/view_attachment_screen.dart'; -import 'package:flutter_parent/utils/design/canvas_icons.dart'; -import 'package:flutter_parent/utils/quick_nav.dart'; -import 'package:flutter_test/flutter_test.dart'; -import 'package:get_it/get_it.dart'; -import 'package:mockito/mockito.dart'; - -import '../../../utils/accessibility_utils.dart'; -import '../../../utils/finders.dart'; -import '../../../utils/network_image_response.dart'; -import '../../../utils/test_app.dart'; -import '../../../utils/test_helpers/mock_helpers.mocks.dart'; -import '../create_conversation/create_conversation_screen_test.dart'; - -void main() { - mockNetworkImageResponse(); - - final l10n = AppLocalizations(); - - testWidgetsWithAccessibilityChecks('displays "Reply" as as title for reply', (tester) async { - await _setupInteractor(); - - await tester.pumpWidget(TestApp(ConversationReplyScreen(_makeConversation(), null, false))); - await tester.pumpAndSettle(); - - expect(find.descendant(of: find.byType(AppBar), matching: find.text(l10n.reply)), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('displays "Reply All" as as title for reply all', (tester) async { - await _setupInteractor(); - - await tester.pumpWidget(TestApp(ConversationReplyScreen(_makeConversation(), null, true))); - await tester.pumpAndSettle(); - - expect(find.descendant(of: find.byType(AppBar), matching: find.text(l10n.replyAll)), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('displays subject as subtitle', (tester) async { - await _setupInteractor(); - - final conversation = _makeConversation(); - - await tester.pumpWidget(TestApp(ConversationReplyScreen(conversation, null, false))); - await tester.pumpAndSettle(); - - expect(find.descendant(of: find.byType(AppBar), matching: find.text(conversation.subject)), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('displays details of message being replied to', (tester) async { - await _setupInteractor(); - - final conversation = _makeConversation(); - final message = conversation.messages![1]; - - await tester.pumpWidget(TestApp(ConversationReplyScreen(conversation, message, false))); - await tester.pumpAndSettle(); - - expect(find.descendant(of: find.byType(MessageWidget), matching: find.richText(message.body!)), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('tapping attachment on message being replied to shows viewer', (tester) async { - await _setupInteractor(); - GetIt.instance.registerLazySingleton(() => QuickNav()); - GetIt.instance.registerLazySingleton(() => ViewAttachmentInteractor()); - - final attachment = Attachment((b) => b - ..jsonId = JsonObject('1') - ..displayName = 'Attachment 1'); - - final message = Message((m) => m - ..authorId = '123' - ..createdAt = DateTime.now() - ..body = '' - ..attachments = ListBuilder([attachment]) - ..participatingUserIds = ListBuilder(['123'])); - - final conversation = Conversation((c) => c - ..messages = ListBuilder([message]) - ..participants = ListBuilder([ - BasicUser((b) => b - ..id = '123' - ..name = 'Myself'), - ])); - - await tester.pumpWidget(TestApp(ConversationReplyScreen(conversation, message, false))); - await tester.pumpAndSettle(); - - await tester.tap(find.byKey(Key('attachment-1'))); - await tester.pumpAndSettle(); - - expect(find.byType(ViewAttachmentScreen), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('displays details of top message if no message is specified', (tester) async { - await _setupInteractor(); - - final conversation = _makeConversation(); - - await tester.pumpWidget(TestApp(ConversationReplyScreen(conversation, null, false))); - await tester.pumpAndSettle(); - - final expectedMessage = conversation.messages![0]; - expect( - find.descendant(of: find.byType(MessageWidget), matching: find.richText(expectedMessage.body!)), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('sending disabled when no message is present', (tester) async { - await _setupInteractor(); - - await tester.pumpWidget(TestApp(ConversationReplyScreen(_makeConversation(), null, false))); - await tester.pumpAndSettle(); - - final sendButton = find.byKey(ConversationReplyScreen.sendKey); - expect(sendButton, findsOneWidget); - expect(tester.widget(sendButton).onPressed == null, isTrue); - }); - - testWidgetsWithAccessibilityChecks('can enter message text', (tester) async { - await _setupInteractor(); - - await tester.pumpWidget(TestApp(ConversationReplyScreen(_makeConversation(), null, false))); - await tester.pumpAndSettle(); - - final messageText = 'Some text here'; - var matchedWidget = find.byKey(ConversationReplyScreen.messageKey); - await tester.enterText(matchedWidget, messageText); - - matchedWidget = find.text(messageText); - expect(matchedWidget, findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('sending is enabled once message is present', (tester) async { - await _setupInteractor(); - - await tester.pumpWidget(TestApp(ConversationReplyScreen(_makeConversation(), null, false))); - await tester.pumpAndSettle(); - - var matchedWidget = find.byKey(ConversationReplyScreen.messageKey); - await tester.enterText(matchedWidget, 'Some text here'); - await tester.pump(); - - matchedWidget = find.byKey(ConversationReplyScreen.sendKey); - expect(matchedWidget, findsOneWidget); - expect(tester.widget(matchedWidget).onPressed != null, isTrue); - }); - - testWidgetsWithAccessibilityChecks('sending calls interactor with correct parameters', (tester) async { - final interactor = await _setupInteractor(); - final conversation = _makeConversation(); - final message = conversation.messages![0]; - final replyAll = true; - final text = 'some text here'; - - await tester.pumpWidget(TestApp(ConversationReplyScreen(conversation, message, replyAll))); - await tester.pumpAndSettle(); - - await tester.enterText(find.byKey(ConversationReplyScreen.messageKey), text); - await tester.pump(); - - await tester.tap(find.byKey(ConversationReplyScreen.sendKey)); - await tester.pump(); - - verify(interactor.createReply(conversation, message, text, [], replyAll)); - }); - - testWidgetsWithAccessibilityChecks('backing out with text in the body will show confirmation dialog', (tester) async { - await _setupInteractor(); - - await _pumpTestableWidgetWithBackButton(tester, ConversationReplyScreen(_makeConversation(), null, false)); - - var matchedWidget = find.byKey(ConversationReplyScreen.messageKey); - await tester.enterText(matchedWidget, 'Some text here'); - await tester.pump(); - - await tester.pageBack(); - await tester.pump(); - - matchedWidget = find.text(l10n.unsavedChangesDialogBody); - expect(matchedWidget, findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('backing out without text in the body does not show a dialog', (tester) async { - await _setupInteractor(); - // Load up a temp page with a button to navigate to our screen so we are able to navigate backward - await _pumpTestableWidgetWithBackButton(tester, ConversationReplyScreen(_makeConversation(), null, false)); - - await tester.pageBack(); - await tester.pump(); - - expect(find.text(l10n.unsavedChangesDialogBody), findsNothing); - }); - - testWidgetsWithAccessibilityChecks('backing out and pressing yes on the dialog closes the screen', (tester) async { - await _setupInteractor(); - final observer = MockNavigatorObserver(); - - await _pumpTestableWidgetWithBackButton( - tester, - ConversationReplyScreen(_makeConversation(), null, false), - observer: observer, - ); - - await tester.enterText(find.byKey(ConversationReplyScreen.messageKey), 'Some text here'); - await tester.pump(); - - await tester.pageBack(); - await tester.pump(); - - expect(find.text(l10n.unsavedChangesDialogBody), findsOneWidget); - await tester.tap(find.text(l10n.yes)); - await tester.pumpAndSettle(); - - verify(observer.didPop(any, any)).called(2); // Twice, first for the dialog, then for the screen - }); - - testWidgetsWithAccessibilityChecks('choosing no on the dialog does not close the screen', (tester) async { - await _setupInteractor(); - final observer = MockNavigatorObserver(); - - await _pumpTestableWidgetWithBackButton( - tester, - ConversationReplyScreen(_makeConversation(), null, false), - observer: observer, - ); - - await tester.enterText(find.byKey(ConversationReplyScreen.messageKey), 'Some text here'); - await tester.pump(); - - await tester.pageBack(); - await tester.pump(); - - expect(find.text(l10n.unsavedChangesDialogBody), findsOneWidget); - await tester.tap(find.text(l10n.no)); - await tester.pump(); - - verify(observer.didPop(any, any)).called(1); // Only once, for the dialog - }); - - testWidgetsWithAccessibilityChecks('Shows error on send fail', (tester) async { - final interactor = await _setupInteractor(); - when(interactor.createReply(any, any, any, any, any)).thenAnswer((_) => Future.error('')); - - await tester.pumpWidget(TestApp(ConversationReplyScreen(_makeConversation(), null, false))); - await tester.pumpAndSettle(); - - // Set message body - var matchedWidget = find.byKey(ConversationReplyScreen.messageKey); - await tester.enterText(matchedWidget, 'Some text here'); - await tester.pump(); - - await tester.tap(find.byKey(ConversationReplyScreen.sendKey)); - await tester.pumpAndSettle(); - - expect(find.text(l10n.errorSendingMessage), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('Shows sending indicator and closes after success', (tester) async { - final interactor = await _setupInteractor(); - final observer = MockNavigatorObserver(); - - await _pumpTestableWidgetWithBackButton( - tester, - ConversationReplyScreen(_makeConversation(), null, false), - observer: observer, - ); - - // Set message body - var matchedWidget = find.byKey(ConversationReplyScreen.messageKey); - await tester.enterText(matchedWidget, 'Some text here'); - await tester.pump(); - - Completer completer = Completer(); - - when(interactor.createReply(any, any, any, any, any)).thenAnswer((_) => completer.future); - - await tester.tap(find.byKey(ConversationReplyScreen.sendKey)); - await tester.pump(); - - // Should show progressbar in app bar - var progressBar = find.descendant(of: find.byType(AppBar), matching: find.byType(CircularProgressIndicator)); - expect(progressBar, findsOneWidget); - - completer.complete(_makeConversation()); - await tester.pumpAndSettle(); - - verify(observer.didPop(any, any)).called(1); - }); - - testWidgetsWithAccessibilityChecks('send disabled for unsuccessful attachment, enabled on success', (tester) async { - // Set up attachment handler in 'uploading' stage - var handler = _MockAttachmentHandler()..stage = AttachmentUploadStage.UPLOADING; - final interactor = await _setupInteractor(); - - when(interactor.addAttachment(any)).thenAnswer((_) => Future.value(handler)); - - await tester.pumpWidget(TestApp(ConversationReplyScreen(_makeConversation(), null, false))); - await tester.pumpAndSettle(); - - // Set message body - var matchedWidget = find.byKey(ConversationReplyScreen.messageKey); - await tester.enterText(matchedWidget, 'Some text here'); - await tester.pump(); - - // Make sure send button is enabled at this point - matchedWidget = find.byKey(ConversationReplyScreen.sendKey); - expect(tester.widget(matchedWidget).onPressed != null, isTrue); - - // Add attachment - await tester.tap(find.byKey(ConversationReplyScreen.attachmentKey)); - await tester.pump(); - - // Assert sending is disabled - matchedWidget = find.byKey(ConversationReplyScreen.sendKey); - expect(tester.widget(matchedWidget).onPressed == null, isTrue); - - // Move to failed state - handler.stage = AttachmentUploadStage.FAILED; - - // Assert sending is still disabled - matchedWidget = find.byKey(ConversationReplyScreen.sendKey); - expect(tester.widget(matchedWidget).onPressed == null, isTrue); - - // Move to finished state - handler.attachment = Attachment((b) => b - ..displayName = 'File' - ..thumbnailUrl = 'fake url'); - handler.stage = AttachmentUploadStage.FINISHED; - await tester.pump(); - - // Sending should now be enabled - matchedWidget = find.byKey(ConversationReplyScreen.sendKey); - expect(tester.widget(matchedWidget).onPressed != null, isTrue); - }); - - testWidgetsWithAccessibilityChecks('displays attachment upload state', (tester) async { - // Set up attachment handler in 'uploading' stage - var handler = _MockAttachmentHandler() - ..stage = AttachmentUploadStage.UPLOADING - ..progress = 0.25; - - final interactor = await _setupInteractor(); - when(interactor.addAttachment(any)).thenAnswer((_) => Future.value(handler)); - - // Create page and add attachment - await tester.pumpWidget(TestApp(ConversationReplyScreen(_makeConversation(), null, false))); - await tester.pumpAndSettle(); - - await tester.tap(find.byKey(ConversationReplyScreen.attachmentKey)); - await tester.pump(); - - // Assert attachment widget is displayed - var attachmentWidget = find.byType(AttachmentWidget); - expect(attachmentWidget, findsOneWidget); - - // Assert attachment widget displays progress - var progressWidget = find.descendant(of: attachmentWidget, matching: find.byType(CircularProgressIndicator)); - expect(tester.widget(progressWidget).value, handler.progress); - var percentageWidget = find.descendant(of: attachmentWidget, matching: find.byType(Text)); - expect(tester.widget(percentageWidget).data, '25%'); - - // Update progress - handler.progress = 0.75; - handler.notifyListeners(); - await tester.pump(); - - // Assert progress UI is updated - progressWidget = find.descendant(of: attachmentWidget, matching: find.byType(CircularProgressIndicator)); - expect(tester.widget(progressWidget).value, handler.progress); - percentageWidget = find.descendant(of: attachmentWidget, matching: find.byType(Text)); - expect(tester.widget(percentageWidget).data, '75%'); - }); - - testWidgetsWithAccessibilityChecks('displays attachment failed state with retry and delete options', (tester) async { - // Set up attachment handler in 'failed' stage - var handler = _MockAttachmentHandler()..stage = AttachmentUploadStage.FAILED; - - final interactor = await _setupInteractor(); - when(interactor.addAttachment(any)).thenAnswer((_) => Future.value(handler)); - - // Create page and add attachment - await tester.pumpWidget(TestApp(ConversationReplyScreen(_makeConversation(), null, false))); - await tester.pumpAndSettle(); - await tester.tap(find.byKey(CreateConversationScreen.attachmentKey)); - await tester.pump(); - - // Assert attachment widget is displayed - var attachmentWidget = find.byType(AttachmentWidget); - expect(attachmentWidget, findsOneWidget); - - // Assert attachment widget displays failed state - var warningIcon = find.descendant(of: attachmentWidget, matching: find.byType(Icon)); - expect(tester.widget(warningIcon).icon, CanvasIcons.warning); - expect(find.text(l10n.attachmentFailed), findsOneWidget); - - // Tap attachment - await tester.tap(attachmentWidget); - await tester.pumpAndSettle(); - - // Tap retry button and move to uploading state - await tester.tap(find.text(l10n.retry)); - handler.stage = AttachmentUploadStage.UPLOADING; - handler.progress = 0.25; - handler.notifyListeners(); - await tester.pump(); - - // Assert attachment widget displays progress - attachmentWidget = find.byType(AttachmentWidget); - var progressWidget = find.descendant(of: attachmentWidget, matching: find.byType(CircularProgressIndicator)); - expect(tester.widget(progressWidget).value, handler.progress); - var percentageWidget = find.descendant(of: attachmentWidget, matching: find.byType(Text)); - expect(tester.widget(percentageWidget).data, '25%'); - - // Move to failed state - handler.stage = AttachmentUploadStage.FAILED; - handler.notifyListeners(); - await tester.pump(); - - // Tap delete button - attachmentWidget = find.byType(AttachmentWidget); - await tester.tap(attachmentWidget); - await tester.pumpAndSettle(); - await tester.tap(find.text(l10n.delete)); - await tester.pumpAndSettle(); - - // Ensure attachment widget has been removed - attachmentWidget = find.byType(AttachmentWidget); - expect(attachmentWidget, findsNothing); - }); - - testWidgetsWithAccessibilityChecks('can delete successful attachment', (tester) async { - // Set up attachment handler in 'uploading' stage - var handler = _MockAttachmentHandler() - ..stage = AttachmentUploadStage.FINISHED - ..attachment = Attachment((b) => b - ..displayName = 'File' - ..thumbnailUrl = 'fake url'); - - final interactor = await _setupInteractor(); - when(interactor.addAttachment(any)).thenAnswer((_) => Future.value(handler)); - - // Create page and add attachment - await tester.pumpWidget(TestApp(ConversationReplyScreen(_makeConversation(), null, false))); - await tester.pumpAndSettle(); - await tester.tap(find.byKey(CreateConversationScreen.attachmentKey)); - await tester.pump(); - - // Assert attachment widget is displayed - var attachmentWidget = find.byType(AttachmentWidget); - expect(attachmentWidget, findsOneWidget); - - // Tap delete button - await tester.tap(attachmentWidget); - await tester.pumpAndSettle(); - await tester.tap(find.text(l10n.delete)); - await tester.pumpAndSettle(); - - // Ensure attachment widget has been removed - attachmentWidget = find.byType(AttachmentWidget); - expect(attachmentWidget, findsNothing); - }); - - testWidgetsWithAccessibilityChecks('displays attachment tooltip in upload state', (tester) async { - // Set up attachment handler in 'uploading' stage - var handler = AttachmentHandler(File('path/to/file.txt')) - ..stage = AttachmentUploadStage.UPLOADING - ..progress = 0.25; - - final interactor = await _setupInteractor(); - when(interactor.addAttachment(any)).thenAnswer((_) => Future.value(handler)); - - // Create page and add attachment - await tester.pumpWidget(TestApp(ConversationReplyScreen(_makeConversation(), null, false))); - await tester.pumpAndSettle(); - await tester.tap(find.byKey(CreateConversationScreen.attachmentKey)); - await tester.pump(); - await tester.pumpAndSettle(); - - // Assert attachment widget is displayed - var attachmentWidget = find.byType(AttachmentWidget); - expect(attachmentWidget, findsOneWidget); - - await tester.longPress(attachmentWidget); - await tester.pump(Duration(milliseconds: 100)); - await tester.pumpAndSettle(); - - expect(find.text('file.txt'), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('displays attachment tooltip in failed state', (tester) async { - // Set up attachment handler in 'uploading' stage - var handler = AttachmentHandler(File('path/to/file.txt'))..stage = AttachmentUploadStage.FAILED; - - final interactor = await _setupInteractor(); - when(interactor.addAttachment(any)).thenAnswer((_) => Future.value(handler)); - - // Create page and add attachment - await tester.pumpWidget(TestApp(ConversationReplyScreen(_makeConversation(), null, false))); - await tester.pumpAndSettle(); - await tester.tap(find.byKey(CreateConversationScreen.attachmentKey)); - await tester.pump(); - await tester.pumpAndSettle(); - - // Assert attachment widget is displayed - var attachmentWidget = find.byType(AttachmentWidget); - expect(attachmentWidget, findsOneWidget); - - await tester.longPress(attachmentWidget); - await tester.pump(Duration(milliseconds: 100)); - await tester.pumpAndSettle(); - - expect(find.text('file.txt'), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('displays attachment tooltip in finished state', (tester) async { - // Set up attachment handler in 'uploading' stage - var handler = AttachmentHandler(File('path/to/file.txt')) - ..attachment = Attachment((b) => b..displayName = 'upload.txt') - ..stage = AttachmentUploadStage.FINISHED; - - final interactor = await _setupInteractor(); - when(interactor.addAttachment(any)).thenAnswer((_) => Future.value(handler)); - - // Create page and add attachment - await tester.pumpWidget(TestApp(ConversationReplyScreen(_makeConversation(), null, false))); - await tester.pumpAndSettle(); - await tester.tap(find.byKey(CreateConversationScreen.attachmentKey)); - await tester.pump(); - await tester.pumpAndSettle(); - - // Assert attachment widget is displayed - var attachmentWidget = find.byType(AttachmentWidget); - expect(attachmentWidget, findsOneWidget); - - await tester.longPress(attachmentWidget); - await tester.pump(Duration(milliseconds: 100)); - await tester.pumpAndSettle(); - - expect(find.text('upload.txt'), findsNWidgets(2)); // 2 widgets: one is the tooltip and one is the regular label - }); - - testWidgetsWithAccessibilityChecks('disables attachment interactions while sending', (tester) async { - var handler = AttachmentHandler(File('path/to/file.txt')) - ..attachment = Attachment((b) => b..displayName = 'upload.txt') - ..stage = AttachmentUploadStage.FINISHED; - - final interactor = await _setupInteractor(); - when(interactor.addAttachment(any)).thenAnswer((_) => Future.value(handler)); - - Completer completer = Completer(); - when(interactor.createReply(any, any, any, any, any)).thenAnswer((_) => completer.future); - - // Create page and add attachment - await tester.pumpWidget(TestApp(ConversationReplyScreen(_makeConversation(), null, false))); - await tester.pumpAndSettle(); - await tester.tap(find.byKey(CreateConversationScreen.attachmentKey)); - await tester.pump(); - - // Assert attachment widget is displayed - var attachmentWidget = find.byType(AttachmentWidget); - expect(attachmentWidget, findsOneWidget); - - // Tap attachment - await tester.tap(attachmentWidget); - await tester.pumpAndSettle(); - - // Should display delete option - expect(find.text(l10n.delete), findsOneWidget); - - // Tap outside to dismiss attachment options - await tester.tapAt(Offset(0, 0)); - await tester.pumpAndSettle(); - - // Add text to enable sending - var matchedWidget = find.byKey(CreateConversationScreen.messageKey); - await tester.enterText(matchedWidget, 'Some text here'); - await tester.pump(); - - // Tap send button - await tester.tap(find.byKey(CreateConversationScreen.sendKey)); - await tester.pump(); - - // Tap attachment - await tester.tap(attachmentWidget); - await tester.pump(Duration(milliseconds: 150)); - - // Should not display delete option - expect(find.text(l10n.delete), findsNothing); - }); - - testWidgetsWithAccessibilityChecks('tapping attachment button shows AttachmentPicker', (tester) async { - final interactor = await _setupInteractor(); - GetIt.instance.registerLazySingleton(() => AttachmentPickerInteractor()); - when(interactor.addAttachment(any)) - .thenAnswer((answer) => ConversationReplyInteractor().addAttachment(answer.positionalArguments[0])); - - // Create page - await tester.pumpWidget(TestApp(ConversationReplyScreen(_makeConversation(), null, false))); - await tester.pumpAndSettle(); - - // Tap attachment button - await tester.tap(find.byKey(CreateConversationScreen.attachmentKey)); - await tester.pumpAndSettle(); - - // AttachmentPicker should be displayed - expect(find.byType(AttachmentPicker), findsOneWidget); - }); -} - -/// Load up a temp page with a button to navigate to our screen, that way the back button exists in the app bar -Future _pumpTestableWidgetWithBackButton(tester, Widget widget, {MockNavigatorObserver? observer}) async { - if (observer == null) observer = MockNavigatorObserver(); - final app = TestApp( - Builder( - builder: (context) => TextButton( - child: Semantics(label: 'test', child: const SizedBox()), - onPressed: () => Navigator.of(context).push(MaterialPageRoute(builder: (context) => widget)), - ), - ), - navigatorObservers: [observer], - ); - - await tester.pumpWidget(app); - await tester.pumpAndSettle(); - await tester.tap(find.byType(TextButton)); - await tester.pumpAndSettle(); - verify(observer.didPush(any, any)).called(2); // Twice, first for the initial page, then for the navigator route -} - -Future _setupInteractor() async { - final interactor = MockConversationReplyInteractor(); - await setupTestLocator((locator) { - locator.registerFactory(() => interactor); - }); - when(interactor.getCurrentUserId()).thenReturn('self'); - return interactor; -} - -Conversation _makeConversation() { - return Conversation((c) => c - ..id = 'conversation1' - ..subject = 'Conversation subject' - ..participants = ListBuilder([ - BasicUser((b) => b - ..id = 'self' - ..name = 'Myself'), - BasicUser((b) => b - ..id = 'author1' - ..name = 'User 1'), - BasicUser((b) => b - ..id = 'author2' - ..name = 'User 1'), - ]) - ..messages = ListBuilder([ - Message((m) => m - ..id = 'message2' - ..body = 'This is message 2' - ..createdAt = DateTime.now() - ..authorId = 'author2' - ..participatingUserIds = ListBuilder(['self', 'author1', 'author2'])), - Message((m) => m - ..id = 'message1' - ..body = 'This is message 1' - ..createdAt = DateTime.now() - ..authorId = 'author1' - ..participatingUserIds = ListBuilder(['self', 'author1', 'author2'])), - ])); -} - -class _MockAttachmentHandler extends AttachmentHandler { - _MockAttachmentHandler() : super(null); - - @override - Future performUpload() => Future.value(); -} diff --git a/apps/flutter_parent/test/screens/login/domain_search_interactor_test.dart b/apps/flutter_parent/test/screens/login/domain_search_interactor_test.dart deleted file mode 100644 index bc773beb81..0000000000 --- a/apps/flutter_parent/test/screens/login/domain_search_interactor_test.dart +++ /dev/null @@ -1,56 +0,0 @@ -// Copyright (C) 2019 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:flutter_parent/network/api/accounts_api.dart'; -import 'package:flutter_parent/screens/domain_search/domain_search_interactor.dart'; -import 'package:flutter_parent/utils/url_launcher.dart'; -import 'package:mockito/mockito.dart'; -import 'package:test/test.dart'; - -import '../../utils/test_app.dart'; -import '../../utils/test_helpers/mock_helpers.dart'; -import '../../utils/test_helpers/mock_helpers.mocks.dart'; - -void main() { - final launcher = MockUrlLauncher(); - final api = MockAccountsApi(); - - setupTestLocator((locator) { - locator.registerLazySingleton(() => api); - locator.registerLazySingleton(() => launcher); - }); - - setUp(() { - reset(launcher); - reset(api); - }); - - test('perform search calls the api', () { - final search = 'xyz'; - DomainSearchInteractor().performSearch(search); - verify(api.searchDomains(search)).called(1); - }); - - test('open canvas guides calls the url launcher', () { - DomainSearchInteractor().openCanvasGuides(); - verify( - launcher.launch('https://community.canvaslms.com/docs/DOC-9902-canvas-parent-android-guide-table-of-contents'), - ).called(1); - }); - - test('open canvas support calls the url launcher', () { - DomainSearchInteractor().openCanvasSupport(); - verify(launcher.launch('https://community.canvaslms.com/docs/DOC-17624-how-to-contact-canvas-support')).called(1); - }); -} diff --git a/apps/flutter_parent/test/screens/login/domain_search_screen_test.dart b/apps/flutter_parent/test/screens/login/domain_search_screen_test.dart deleted file mode 100644 index 6d23483109..0000000000 --- a/apps/flutter_parent/test/screens/login/domain_search_screen_test.dart +++ /dev/null @@ -1,487 +0,0 @@ -// Copyright (C) 2019 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'dart:async'; - -import 'package:flutter/material.dart'; -import 'package:flutter/rendering.dart'; -import 'package:flutter_parent/l10n/app_localizations.dart'; -import 'package:flutter_parent/models/mobile_verify_result.dart'; -import 'package:flutter_parent/models/school_domain.dart'; -import 'package:flutter_parent/network/utils/analytics.dart'; -import 'package:flutter_parent/screens/domain_search/domain_search_interactor.dart'; -import 'package:flutter_parent/screens/domain_search/domain_search_screen.dart'; -import 'package:flutter_parent/screens/web_login/web_login_interactor.dart'; -import 'package:flutter_parent/screens/web_login/web_login_screen.dart'; -import 'package:flutter_parent/utils/quick_nav.dart'; -import 'package:flutter_test/flutter_test.dart'; -import 'package:mockito/mockito.dart'; - -import '../../utils/test_app.dart'; -import '../../utils/test_helpers/mock_helpers.dart'; -import '../../utils/test_helpers/mock_helpers.mocks.dart'; - -void main() { - AppLocalizations l10n = AppLocalizations(); - final analytics = MockAnalytics(); - final webInteractor = MockWebLoginInteractor(); - final interactor = MockDomainSearchInteractor(); - - setUp(() async { - reset(analytics); - reset(webInteractor); - reset(interactor); - await setupTestLocator((locator) { - locator.registerLazySingleton(() => QuickNav()); - locator.registerLazySingleton(() => analytics); - - locator.registerFactory(() => interactor); - locator.registerFactory(() => webInteractor); - }); - }); - - testWidgets('default state', (tester) async { - await tester.pumpWidget(TestApp(DomainSearchScreen())); - await tester.pumpAndSettle(); - - expect(find.text(l10n.findSchool), findsOneWidget); - expect(find.text(l10n.next), findsOneWidget); - expect( - tester - .widget(find.ancestor(of: find.text(l10n.next), matching: find.byType(MaterialButton))) - .enabled, - false, - ); - expect(find.text(l10n.domainSearchInputHint), findsOneWidget); - expect(find.text(l10n.domainSearchHelpLabel), findsOneWidget); - }); - - testWidgets('Displays search results', (WidgetTester tester) async { - int count = 5; - when(interactor.performSearch(any)).thenAnswer((_) => Future.value(List.generate( - count, - (idx) => SchoolDomain((sd) => sd - ..domain = 'test$idx.domains.com' - ..name = 'Test domain $idx'), - ))); - await tester.pumpWidget(TestApp(DomainSearchScreen())); - await tester.pumpAndSettle(); - await tester.enterText(find.byType(TextField), 'test'); - await tester.pumpAndSettle(Duration(milliseconds: 500)); // Add in debounce time - - for (int i = 0; i < count; i++) { - expect(find.text('Test domain $i'), findsOneWidget); - } - }); - - testWidgets('Enables "next" button if query is not empty', (WidgetTester tester) async { - int count = 5; - when(interactor.performSearch(any)).thenAnswer((_) => Future.value(List.generate( - count, - (idx) => SchoolDomain((sd) => sd - ..domain = 'test$idx.domains.com' - ..name = 'Test domain $idx'), - ))); - await tester.pumpWidget(TestApp(DomainSearchScreen())); - await tester.pumpAndSettle(); - - var nextButton = - tester.widget(find.ancestor(of: find.text(l10n.next), matching: find.byType(MaterialButton))); - expect(nextButton.enabled, false); - - await tester.enterText(find.byType(TextField), 'aa'); - await tester.pumpAndSettle(); - - nextButton = - tester.widget(find.ancestor(of: find.text(l10n.next), matching: find.byType(MaterialButton))); - expect(nextButton.enabled, true); - - // Wait for debounce to finish so test doesn't fail - await tester.pump(Duration(milliseconds: 500)); - }); - - testWidgets('Large result sets do not hide help button', (WidgetTester tester) async { - when(interactor.performSearch(any)).thenAnswer((_) => Future.value(List.generate( - 100, - (idx) => SchoolDomain((sd) => sd - ..domain = 'test$idx.domains.com' - ..name = 'Test domain $idx'), - ))); - await tester.pumpWidget(TestApp(DomainSearchScreen())); - await tester.pumpAndSettle(); - await tester.enterText(find.byType(TextField), 'test'); - await tester.pumpAndSettle(Duration(milliseconds: 500)); // Add in debounce time - - expect(find.text(l10n.domainSearchHelpLabel), findsOneWidget); - }); - - testWidgets('Displays results for 2-character query', (WidgetTester tester) async { - when(interactor.performSearch(any)).thenAnswer((_) => Future.value([ - SchoolDomain((sd) => sd - ..domain = '' - ..name = 'Domain Result'), - ])); - await tester.pumpWidget(TestApp(DomainSearchScreen())); - await tester.pumpAndSettle(); - - // Two characters should perform a search - await tester.enterText(find.byType(TextField), 'aa'); - await tester.pumpAndSettle(Duration(milliseconds: 500)); // Add in debounce time - expect(find.text('Domain Result'), findsOneWidget); - - // One character should not search and should remove results - await tester.enterText(find.byType(TextField), 'a'); - await tester.pumpAndSettle(Duration(milliseconds: 500)); // Add in debounce time - expect(find.text('Domain Result'), findsNothing); - }); - - testWidgets('Displays error', (WidgetTester tester) async { - when(interactor.performSearch(any)).thenAnswer((_) => Future.error('')); - await tester.pumpWidget(TestApp(DomainSearchScreen())); - await tester.pumpAndSettle(); - await tester.enterText(find.byType(TextField), 'test'); - await tester.pumpAndSettle(Duration(milliseconds: 500)); // Add in debounce time - - expect(find.text(l10n.noDomainResults('test')), findsOneWidget); - }); - - testWidgets('debounces for 500 milliseconds', (tester) async { - when(interactor.performSearch(any)).thenAnswer((_) => Future.value([ - SchoolDomain((sd) => sd - ..domain = '' - ..name = 'Domain Result'), - ])); - await tester.pumpWidget(TestApp(DomainSearchScreen())); - await tester.pumpAndSettle(); - - // Two characters should perform a search - await tester.enterText(find.byType(TextField), 'aa'); - - await tester.pumpAndSettle(); - expect(find.text('Domain Result'), findsNothing); - - await tester.pumpAndSettle(Duration(milliseconds: 500)); // Add in debounce time - expect(find.text('Domain Result'), findsOneWidget); - }); - - testWidgets('Clear button shows for non-empty query', (WidgetTester tester) async { - await tester.pumpWidget(TestApp(DomainSearchScreen())); - await tester.pumpAndSettle(); - - // Should not show by default - expect(find.byKey(Key('clear-query')), findsNothing); - - // Add single character query - await tester.enterText(find.byType(TextField), 'a'); - await tester.pumpAndSettle(); - - // Button should now show - expect(find.byKey(Key('clear-query')), findsOneWidget); - - // Add single character query - await tester.enterText(find.byType(TextField), ''); - await tester.pumpAndSettle(); - - // Button should no longer show - expect(find.byKey(Key('clear-query')), findsNothing); - - // Wait for debounce to finish so test doesn't fail - await tester.pump(Duration(milliseconds: 500)); - }); - - testWidgets('Clear button clears text', (WidgetTester tester) async { - int count = 5; - when(interactor.performSearch(any)).thenAnswer((_) => Future.value(List.generate( - count, - (idx) => SchoolDomain((sd) => sd - ..domain = 'test$idx.domains.com' - ..name = 'Test domain $idx'), - ))); - await tester.pumpWidget(TestApp(DomainSearchScreen())); - await tester.pumpAndSettle(); - - await tester.tap(find.byType(TextField)); - await tester.enterText(find.byType(TextField), 'testing123'); - await tester.pumpAndSettle(); // Add in debounce time - expect(tester.widget(find.byType(TextField)).controller?.text, 'testing123'); - expect(find.byKey(Key('clear-query')), findsOneWidget); - - await tester.tap(find.byKey(Key('clear-query'))); - await tester.pump(); - expect(tester.widget(find.byType(TextField)).controller?.text, ''); - - // Wait for debounce to finish so test doesn't fail - await tester.pump(Duration(milliseconds: 500)); - }); - - testWidgets('Does not show stale search results', (WidgetTester tester) async { - int queryCount = 0; - - when(interactor.performSearch(any)).thenAnswer((_) => Future.sync(() { - if (queryCount == 0) { - queryCount++; - return Future.delayed( - Duration(milliseconds: 1000), - () => [ - SchoolDomain((sd) => sd - ..domain = '1' - ..name = 'Query One') - ]); - } else if (queryCount == 1) { - queryCount++; - return Future.delayed( - Duration(milliseconds: 100), - () => [ - SchoolDomain((sd) => sd - ..domain = '2' - ..name = 'Query Two') - ]); - } else { - return Future.delayed( - Duration(milliseconds: 500), - () => [ - SchoolDomain((sd) => sd - ..domain = '3' - ..name = 'Query Three') - ]); - } - })); - - await tester.pumpWidget(TestApp(DomainSearchScreen())); - await tester.pumpAndSettle(); - - await tester.enterText(find.byType(TextField), 'one'); - await tester.pumpAndSettle(Duration(milliseconds: 500)); // Add in debounce time - await tester.enterText(find.byType(TextField), 'two'); - await tester.pumpAndSettle(Duration(milliseconds: 500)); // Add in debounce time - await tester.enterText(find.byType(TextField), 'three'); - await tester.pumpAndSettle(Duration(milliseconds: 1000)); // Allow plenty of time for first async call to finish - expect(find.text('Query One'), findsNothing); - expect(find.text('Query Two'), findsNothing); - expect(find.text('Query Three'), findsOneWidget); - }); - - testWidgets('Displays and hides help dialog', (WidgetTester tester) async { - await tester.pumpWidget(TestApp(DomainSearchScreen())); - await tester.pumpAndSettle(); - - // Tap the help button - await tester.tap(find.byKey(Key('help-button'))); - await tester.pump(); - - // Make sure alert dialog is showing - expect(find.byType(AlertDialog), findsOneWidget); - verify(analytics.logEvent(AnalyticsEventConstants.HELP_DOMAIN_SEARCH)); - - // Tap the Ok button - await tester.tap(find.descendant(of: find.byType(AlertDialog), matching: find.text('OK'))); - await tester.pump(); - - // Make sure alert dialog is no longer showing - expect(find.byType(AlertDialog), findsNothing); - }); - - testWidgets('Tapping "Canvas Guides" launches url', (WidgetTester tester) async { - await tester.pumpWidget(TestApp(DomainSearchScreen())); - await tester.pumpAndSettle(); - - // Tap the help button - await tester.tap(find.byKey(Key('help-button'))); - await tester.pump(); - - // Get text selection for 'Canvas Support' span - var targetText = l10n.canvasGuides; - var bodyWidget = tester.widget(find.byKey(DomainSearchScreen.helpDialogBodyKey)); - var bodyText = bodyWidget.textSpan?.toPlainText() ?? ''; - var index = bodyText.indexOf(targetText); - var selection = TextSelection(baseOffset: index, extentOffset: index + targetText.length); - - // Get clickable area - RenderParagraph box = DomainSearchScreen.helpDialogBodyKey.currentContext?.findRenderObject() as RenderParagraph; - var bodyOffset = box.localToGlobal(Offset.zero); - var textOffset = box.getBoxesForSelection(selection)[0].toRect().center; - - await tester.tapAt(bodyOffset + textOffset); - - verify(interactor.openCanvasGuides()); - }); - - testWidgets('Tapping "Canvas Support" launches url', (WidgetTester tester) async { - await tester.pumpWidget(TestApp(DomainSearchScreen())); - await tester.pumpAndSettle(); - - // Tap the help button - await tester.tap(find.byKey(Key('help-button'))); - await tester.pump(); - - // Get text selection for 'Canvas Support' span - var targetText = l10n.canvasSupport; - var bodyWidget = tester.widget(find.byKey(DomainSearchScreen.helpDialogBodyKey)); - var bodyText = bodyWidget.textSpan?.toPlainText() ?? ''; - var index = bodyText.indexOf(targetText); - var selection = TextSelection(baseOffset: index, extentOffset: index + targetText.length); - - // Get clickable area - RenderParagraph box = DomainSearchScreen.helpDialogBodyKey.currentContext?.findRenderObject() as RenderParagraph; - var bodyOffset = box.localToGlobal(Offset.zero); - var textOffset = box.getBoxesForSelection(selection)[0].toRect().center; - - await tester.tapAt(bodyOffset + textOffset); - verify(interactor.openCanvasSupport()); - }); - - testWidgets('Navigates to Login page from search result', (WidgetTester tester) async { - when(interactor.performSearch(any)).thenAnswer((_) => Future.value([ - SchoolDomain((sd) => sd - ..domain = 'mobileqa.instructure.com' - ..name = 'Result') - ])); - when(webInteractor.mobileVerify(any)).thenAnswer((_) => Future.value(MobileVerifyResult())); - await tester.pumpWidget(TestApp(DomainSearchScreen())); - await tester.pumpAndSettle(); - - await tester.enterText(find.byType(TextField), 'test'); - await tester.pumpAndSettle(Duration(milliseconds: 500)); - expect(find.text('Result'), findsOneWidget); - - await tester.tap(find.text('Result')); - await tester.pumpAndSettle(); - - expect(find.byType(WebLoginScreen), findsOneWidget); - }); - - testWidgets('Navigates to Login page from "Next" button', (WidgetTester tester) async { - when(interactor.performSearch(any)).thenAnswer((_) => Future.value([ - SchoolDomain((sd) => sd - ..domain = 'mobileqa' - ..name = 'Result') - ])); - when(webInteractor.mobileVerify(any)).thenAnswer((_) => Future.value(MobileVerifyResult())); - - await tester.pumpWidget(TestApp(DomainSearchScreen())); - await tester.pumpAndSettle(); - - await tester.enterText(find.byType(TextField), 'mobileqa'); - await tester.pumpAndSettle(); - - await tester.tap(find.text(l10n.next)); - await tester.pumpAndSettle(); - - final webLogin = find.byType(WebLoginScreen); - expect(webLogin, findsOneWidget); - // Should also append .instructure.com to single word queries - expect(tester.widget(webLogin).domain, "mobileqa.instructure.com"); - }); - - testWidgets('Navigates to Login page from keyboard submit button', (WidgetTester tester) async { - when(interactor.performSearch(any)).thenAnswer((_) => Future.value([ - SchoolDomain((sd) => sd - ..domain = 'mobileqa.instructure.com' - ..name = 'Result') - ])); - when(webInteractor.mobileVerify(any)).thenAnswer((_) => Future.value(MobileVerifyResult())); - - await tester.pumpWidget(TestApp(DomainSearchScreen())); - await tester.pumpAndSettle(); - - await tester.enterText(find.byType(TextField), 'mobileqa'); - await tester.pumpAndSettle(); - - await tester.testTextInput.receiveAction(TextInputAction.done); - await tester.pumpAndSettle(); - - expect(find.byType(WebLoginScreen), findsOneWidget); - }); - - testWidgets('Navigates to Login page with correct LoginFlow', (WidgetTester tester) async { - when(interactor.performSearch(any)).thenAnswer((_) => Future.value([ - SchoolDomain((sd) => sd - ..domain = 'mobileqa' - ..name = 'Result') - ])); - when(webInteractor.mobileVerify(any)).thenAnswer((_) => Future.value(MobileVerifyResult())); - - LoginFlow flow = LoginFlow.siteAdmin; - await tester.pumpWidget(TestApp(DomainSearchScreen(loginFlow: flow))); - await tester.pumpAndSettle(); - - await tester.enterText(find.byType(TextField), 'mobileqa'); - await tester.pumpAndSettle(); - - await tester.tap(find.text(l10n.next)); - await tester.pumpAndSettle(); - - expect(find.byType(WebLoginScreen), findsOneWidget); - - WebLoginScreen webLogin = tester.widget(find.byType(WebLoginScreen)); - expect(webLogin.loginFlow, flow); - }); - - testWidgets('Adds .instructure.com to .beta search text', (WidgetTester tester) async { - when(interactor.performSearch(any)).thenAnswer((_) => Future.value([])); - when(webInteractor.mobileVerify(any)).thenAnswer((_) => Future.value(MobileVerifyResult())); - - await tester.pumpWidget(TestApp(DomainSearchScreen())); - await tester.pumpAndSettle(); - - await tester.enterText(find.byType(TextField), 'mobileqa.beta'); - await tester.pumpAndSettle(); - - await tester.tap(find.text(l10n.next)); - await tester.pumpAndSettle(); - - expect(find.byType(WebLoginScreen), findsOneWidget); - - WebLoginScreen webLogin = tester.widget(find.byType(WebLoginScreen)); - expect(webLogin.domain, 'mobileqa.beta.instructure.com'); - }); - - testWidgets('clears leading www. from search text', (WidgetTester tester) async { - when(interactor.performSearch(any)).thenAnswer((_) => Future.value([])); - when(webInteractor.mobileVerify(any)).thenAnswer((_) => Future.value(MobileVerifyResult())); - - await tester.pumpWidget(TestApp(DomainSearchScreen())); - await tester.pumpAndSettle(); - - await tester.enterText(find.byType(TextField), 'www.mobileqa.beta'); - await tester.pumpAndSettle(); - - await tester.tap(find.text(l10n.next)); - await tester.pumpAndSettle(); - - expect(find.byType(WebLoginScreen), findsOneWidget); - - WebLoginScreen webLogin = tester.widget(find.byType(WebLoginScreen)); - expect(webLogin.domain, 'mobileqa.beta.instructure.com'); - }); - - testWidgets('clears period at the end of the domain', (WidgetTester tester) async { - when(interactor.performSearch(any)).thenAnswer((_) => Future.value([])); - when(webInteractor.mobileVerify(any)).thenAnswer((_) => Future.value(MobileVerifyResult())); - - await tester.pumpWidget(TestApp(DomainSearchScreen())); - await tester.pumpAndSettle(); - - await tester.enterText(find.byType(TextField), 'mobileqa.beta.'); - await tester.pumpAndSettle(); - - await tester.tap(find.text(l10n.next)); - await tester.pumpAndSettle(); - - expect(find.byType(WebLoginScreen), findsOneWidget); - - WebLoginScreen webLogin = tester.widget(find.byType(WebLoginScreen)); - expect(webLogin.domain, 'mobileqa.beta.instructure.com'); - }); -} diff --git a/apps/flutter_parent/test/screens/login/login_landing_screen_test.dart b/apps/flutter_parent/test/screens/login/login_landing_screen_test.dart deleted file mode 100644 index 2d0625c7c6..0000000000 --- a/apps/flutter_parent/test/screens/login/login_landing_screen_test.dart +++ /dev/null @@ -1,343 +0,0 @@ -// Copyright (C) 2019 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:flutter/material.dart'; -import 'package:flutter_parent/l10n/app_localizations.dart'; -import 'package:flutter_parent/models/login.dart'; -import 'package:flutter_parent/network/api/auth_api.dart'; -import 'package:flutter_parent/network/utils/analytics.dart'; -import 'package:flutter_parent/network/utils/api_prefs.dart'; -import 'package:flutter_parent/screens/dashboard/dashboard_interactor.dart'; -import 'package:flutter_parent/screens/domain_search/domain_search_interactor.dart'; -import 'package:flutter_parent/screens/domain_search/domain_search_screen.dart'; -import 'package:flutter_parent/screens/login_landing_screen.dart'; -import 'package:flutter_parent/screens/pairing/pairing_interactor.dart'; -import 'package:flutter_parent/screens/pairing/qr_pairing_screen.dart'; -import 'package:flutter_parent/screens/qr_login/qr_login_tutorial_screen.dart'; -import 'package:flutter_parent/screens/qr_login/qr_login_util.dart'; -import 'package:flutter_parent/screens/splash/splash_screen.dart'; -import 'package:flutter_parent/screens/splash/splash_screen_interactor.dart'; -import 'package:flutter_parent/screens/web_login/web_login_screen.dart'; -import 'package:flutter_parent/utils/common_widgets/avatar.dart'; -import 'package:flutter_parent/utils/common_widgets/error_report/error_report_dialog.dart'; -import 'package:flutter_parent/utils/common_widgets/two_finger_double_tap_gesture_detector.dart'; -import 'package:flutter_parent/utils/design/canvas_icons.dart'; -import 'package:flutter_parent/utils/design/canvas_icons_solid.dart'; -import 'package:flutter_parent/utils/quick_nav.dart'; -import 'package:flutter_parent/utils/remote_config_utils.dart'; -import 'package:flutter_test/flutter_test.dart'; -import 'package:mockito/mockito.dart'; - -import '../../utils/accessibility_utils.dart'; -import '../../utils/canvas_model_utils.dart'; -import '../../utils/platform_config.dart'; -import '../../utils/test_app.dart'; -import '../../utils/test_helpers/mock_helpers.dart'; -import '../../utils/test_helpers/mock_helpers.mocks.dart'; - -void main() async { - final analytics = MockAnalytics(); - final interactor = MockDashboardInteractor(); - final authApi = MockAuthApi(); - final pairingInteractor = MockPairingInteractor(); - - final login = Login((b) => b - ..domain = 'domain' - ..accessToken = 'token' - ..user = CanvasModelTestUtils.mockUser().toBuilder()); - - await setupTestLocator((locator) { - locator.registerLazySingleton(() => QuickNav()); - locator.registerLazySingleton(() => analytics); - locator.registerLazySingleton(() => authApi); - locator.registerLazySingleton(() => QRLoginUtil()); - - locator.registerLazySingleton(() => pairingInteractor); - locator.registerFactory(() => interactor); - locator.registerFactory(() => SplashScreenInteractor()); - locator.registerFactory(() => MockDomainSearchInteractor()); - }); - - setUp(() async { - reset(analytics); - reset(interactor); - reset(authApi); - final mockRemoteConfig = setupMockRemoteConfig( - valueSettings: {'qr_login_enabled_parent': 'true', 'qr_account_creation_enabled': 'true'}); - await setupPlatformChannels(config: PlatformConfig(initRemoteConfig: mockRemoteConfig)); - await ApiPrefs.init(); - }); - - tearDown(() { - RemoteConfigUtils.clean(); - }); - - Future twoFingerDoubleTap(WidgetTester tester) async { - Offset center = tester.getCenter(find.byType(TwoFingerDoubleTapGestureDetector)); - - // Perform first two-finger tap - TestGesture pointer1 = await tester.startGesture(center.translate(-64, 64)); - TestGesture pointer2 = await tester.startGesture(center.translate(64, 64)); - await pointer1.up(); - await pointer2.up(); - - // Perform second two-finger tap - await tester.pump(Duration(milliseconds: 100)); - pointer1 = await tester.startGesture(center.translate(-64, 64)); - pointer2 = await tester.startGesture(center.translate(64, 64)); - await pointer1.up(); - await pointer2.up(); - await tester.pump(); - } - - testWidgetsWithAccessibilityChecks('Opens domain search screen', (tester) async { - await tester.pumpWidget(TestApp(LoginLandingScreen())); - await tester.pumpAndSettle(); - - expect(find.text(AppLocalizations().findSchool), findsOneWidget); - await tester.tap(find.text(AppLocalizations().findSchool)); - await tester.pumpAndSettle(); - - expect(find.byType(DomainSearchScreen), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('Displays Snicker Doodles drawer', (tester) async { - await tester.pumpWidget(TestApp(LoginLandingScreen())); - await tester.pumpAndSettle(); - - var size = tester.getSize(find.byType(LoginLandingScreen)); - await tester.flingFrom(Offset(size.width - 5, size.height / 2), Offset(-size.width / 2, 0), 1000); - await tester.pumpAndSettle(); - - expect(find.byType(Drawer), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('Does not display login list if there are no previous logins', (tester) async { - await tester.pumpWidget(TestApp(LoginLandingScreen())); - await tester.pumpAndSettle(); - - expect(find.text(AppLocalizations().previousLogins), findsNothing); - expect(find.byKey(Key('previous-logins')), findsNothing); - }); - - testWidgetsWithAccessibilityChecks('Displays login list if there are previous logins', (tester) async { - - List logins = [ - Login((b) => b - ..domain = 'domain1' - ..user = CanvasModelTestUtils.mockUser(name: 'user 1').toBuilder()), - Login((b) => b - ..domain = 'domain2' - ..user = CanvasModelTestUtils.mockUser(name: 'user 2').toBuilder()), - ]; - - - await tester.pumpWidget(TestApp(LoginLandingScreen())); - await ApiPrefs.saveLogins(logins); - await tester.pumpAndSettle(); - - - expect(find.text(AppLocalizations().previousLogins), findsOneWidget); - expect(find.byKey(Key('previous-logins')), findsOneWidget); - - expect(find.text(logins[0].user.name), findsOneWidget); - expect(find.text(logins[1].user.name), findsOneWidget); - - expect(find.text(logins[0].domain), findsOneWidget); - expect(find.text(logins[1].domain), findsOneWidget); - - expect(find.byType(Avatar), findsNWidgets(2)); - expect(find.byIcon(Icons.clear), findsNWidgets(2)); - - }); - - testWidgetsWithAccessibilityChecks('Displays Previous Login correctly for masquerade', (tester) async { - await tester.runAsync(() async { - - Login login = Login((b) => b - ..domain = 'domain1' - ..masqueradeDomain = 'masqueradeDomain' - ..user = CanvasModelTestUtils.mockUser(name: 'user 1').toBuilder() - ..masqueradeUser = CanvasModelTestUtils.mockUser(name: 'masqueradeUser').toBuilder()); - - await tester.pumpWidget(TestApp(LoginLandingScreen())); - await ApiPrefs.saveLogins([login]); - await tester.pumpAndSettle(); - - expect(find.text(AppLocalizations().previousLogins), findsOneWidget); - expect(find.byKey(Key('previous-logins')), findsOneWidget); - - expect(find.text(login.user.name), findsNothing); - expect(find.text(login.masqueradeUser!.name), findsOneWidget); - - expect(find.text(login.domain), findsNothing); - expect(find.text(login.masqueradeDomain!), findsOneWidget); - - expect(find.byType(Avatar), findsOneWidget); - expect(find.byIcon(Icons.clear), findsOneWidget); - expect(find.byIcon(CanvasIconsSolid.masquerade), findsOneWidget); - }); - }); - - testWidgetsWithAccessibilityChecks('Clearing previous login removes it from the list', (tester) async { - await tester.runAsync(() async { - - List logins = [ - Login((b) => b - ..domain = 'domain1' - ..user = CanvasModelTestUtils.mockUser(name: 'user 1').toBuilder()), - Login((b) => b - ..domain = 'domain2' - ..user = CanvasModelTestUtils.mockUser(name: 'user 2').toBuilder()), - ]; - - await tester.pumpWidget(TestApp(LoginLandingScreen())); - await ApiPrefs.saveLogins(logins); - await tester.pumpAndSettle(); - - expect(find.byKey(Key('previous-logins')), findsOneWidget); - expect(find.text(logins[0].user.name), findsOneWidget); - expect(find.text(logins[1].user.name), findsOneWidget); - - // Remove second login - await tester.tap(find.byIcon(Icons.clear).last); - await tester.pumpAndSettle(); - - expect(find.byKey(Key('previous-logins')), findsOneWidget); - expect(find.text(logins[0].user.name), findsOneWidget); - expect(find.text(logins[1].user.name), findsNothing); - - // Remove first login - await tester.tap(find.byIcon(Icons.clear)); - await tester.pumpAndSettle(); - - expect(find.byKey(Key('previous-logins')), findsNothing); - expect(find.text(logins[0].user.name), findsNothing); - expect(find.text(logins[1].user.name), findsNothing); - - }); - }); - - testWidgetsWithAccessibilityChecks('Tapping a login sets the current login and loads splash screen', (tester) async { - List logins = [ - Login((b) => b - ..domain = 'domain1' - ..user = CanvasModelTestUtils.mockUser(name: 'user 1').toBuilder()), - ]; - - await tester.pumpWidget(TestApp(LoginLandingScreen(), platformConfig: PlatformConfig(initLoggedInUser: login))); - await ApiPrefs.saveLogins(logins); - await tester.pumpAndSettle(); - - await tester.tap(find.text(logins[0].user.name)); - await tester.pump(); - await tester.pump(const Duration(milliseconds: 350)); - - expect(find.byType(SplashScreen), findsOneWidget); - expect(ApiPrefs.getCurrentLogin(), logins[0]); - await ApiPrefs.clean(); - }); - - testWidgetsWithAccessibilityChecks('Uses two-finger double-tap to cycle login flows', (tester) async { - await tester.pumpWidget(TestApp(LoginLandingScreen())); - await tester.pumpAndSettle(); - - // First tap should move to the 'Canvas' login flow - await twoFingerDoubleTap(tester); - expect(find.text(AppLocalizations().loginFlowCanvas), findsOneWidget); - - // Second tap should move to the 'Site Admin' login flow - await twoFingerDoubleTap(tester); - expect(find.text(AppLocalizations().loginFlowSiteAdmin), findsOneWidget); - - // Third tap should move to the 'Skip mobile verify' login flow - await twoFingerDoubleTap(tester); - expect(find.text(AppLocalizations().loginFlowSkipMobileVerify), findsOneWidget); - - // Final tap should cycle back to the 'Normal' login flow - await twoFingerDoubleTap(tester); - expect(find.text(AppLocalizations().loginFlowNormal), findsOneWidget); - - await tester.pumpAndSettle(); // Wait for SnackBar to finish displaying - }); - - testWidgetsWithAccessibilityChecks('Passes selected LoginFlow to DomainSearchScreen', (tester) async { - await tester.pumpWidget(TestApp(LoginLandingScreen())); - await tester.pumpAndSettle(); - - // Tap three times to move to the 'Skip mobile verify' login flow - await twoFingerDoubleTap(tester); - await twoFingerDoubleTap(tester); - await twoFingerDoubleTap(tester); - - expect(find.text(AppLocalizations().findSchool), findsOneWidget); - await tester.tap(find.text(AppLocalizations().findSchool)); - await tester.pumpAndSettle(); - - expect(find.byType(DomainSearchScreen), findsOneWidget); - - DomainSearchScreen domainSearch = tester.widget(find.byType(DomainSearchScreen)); - expect(domainSearch.loginFlow, LoginFlow.skipMobileVerify); - - }); - - testWidgetsWithAccessibilityChecks('Tapping QR login shows QR Login picker', (tester) async { - await tester.pumpWidget(TestApp(LoginLandingScreen())); - await ApiPrefs.setCameraCount(2); - await tester.pumpAndSettle(); - - await tester.tap(find.text(AppLocalizations().qrCode)); - await tester.pumpAndSettle(); - - expect(find.byType(BottomSheet), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('Tapping have account in QR Login picker shows QR Login Tutorial screen', - (tester) async { - await tester.pumpWidget(TestApp(LoginLandingScreen())); - await ApiPrefs.setCameraCount(2); - await tester.pumpAndSettle(); - - await tester.tap(find.text(AppLocalizations().qrCode)); - await tester.pumpAndSettle(); - - await tester.tap(find.text(AppLocalizations().qrLoginHaveAccount)); - await tester.pumpAndSettle(); - - expect(find.byType(QRLoginTutorialScreen), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('Tapping new account in QR Login picker shows QR Pairing Tutorial screen', - (tester) async { - await tester.pumpWidget(TestApp(LoginLandingScreen())); - await ApiPrefs.setCameraCount(2); - await tester.pumpAndSettle(); - - await tester.tap(find.text(AppLocalizations().qrCode)); - await tester.pumpAndSettle(); - - await tester.tap(find.text(AppLocalizations().qrLoginNewAccount)); - await tester.pumpAndSettle(); - - expect(find.byType(QRPairingScreen), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('QR login does not display when camera count is 0', (tester) async { - await tester.pumpWidget(TestApp(LoginLandingScreen())); - await ApiPrefs.setCameraCount(0); - await tester.pumpAndSettle(); - - expect(find.text(AppLocalizations().qrCode), findsNothing); - }); -} diff --git a/apps/flutter_parent/test/screens/login/qr_login_tutorial_screen_interactor_test.dart b/apps/flutter_parent/test/screens/login/qr_login_tutorial_screen_interactor_test.dart deleted file mode 100644 index 4a777b3b19..0000000000 --- a/apps/flutter_parent/test/screens/login/qr_login_tutorial_screen_interactor_test.dart +++ /dev/null @@ -1,123 +0,0 @@ -/* - * Copyright (C) 2020 - present Instructure, Inc. - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, version 3 of the License. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -import 'package:barcode_scan2/barcode_scan2.dart'; -import 'package:flutter/services.dart'; -import 'package:flutter_parent/screens/qr_login/qr_login_tutorial_screen_interactor.dart'; -import 'package:flutter_parent/utils/qr_utils.dart'; -import 'package:flutter_parent/utils/veneers/barcode_scan_veneer.dart'; -import 'package:mockito/mockito.dart'; -import 'package:test/test.dart'; - -import '../../utils/test_app.dart'; -import '../../utils/test_helpers/mock_helpers.dart'; -import '../../utils/test_helpers/mock_helpers.mocks.dart'; - -void main() { - final interactor = QRLoginTutorialScreenInteractor(); - final mockScanner = MockBarcodeScanVeneer(); - - setupTestLocator((locator) { - locator.registerLazySingleton(() => mockScanner); - }); - - setUp(() { - reset(mockScanner); - }); - - test('returns success when given valid barcode', () async { - final barcodeResultUrl = 'https://${QRUtils.QR_HOST}/canvas/login?${QRUtils.QR_AUTH_CODE}=1234' - '&${QRUtils.QR_DOMAIN}=mobiledev.instructure.com'; - final scanResult = ScanResult(rawContent: barcodeResultUrl); - - when(mockScanner.scanBarcode()).thenAnswer((_) => Future.value(scanResult)); - - final result = await interactor.scan(); - expect(result.isSuccess, isTrue); - expect(result.result, barcodeResultUrl); - }); - - test('returns failure when given invalid barcode', () async { - final barcodeResultUrl = 'https://hodor.com/canvas/login?hodor_code=1234' - '&hodor_domain=mobiledev.instructure.com'; - final scanResult = ScanResult(rawContent: barcodeResultUrl); - - when(mockScanner.scanBarcode()).thenAnswer((_) => Future.value(scanResult)); - - final result = await interactor.scan(); - expect(result.isSuccess, isFalse); - expect(result.errorType, QRError.invalidQR); - expect(result.result, isNull); - }); - - test('returns camera error camera access denied', () async { - when(mockScanner.scanBarcode()).thenAnswer((_) => throw PlatformException(code: BarcodeScanner.cameraAccessDenied)); - - final result = await interactor.scan(); - expect(result.isSuccess, isFalse); - expect(result.errorType, QRError.cameraError); - expect(result.result, isNull); - }); - - test('returns error when given platform error occurs', () async { - when(mockScanner.scanBarcode()).thenAnswer((_) => throw PlatformException(code: '')); - - final result = await interactor.scan(); - expect(result.isSuccess, isFalse); - expect(result.errorType, QRError.invalidQR); - expect(result.result, isNull); - }); - - test('returns cancelled error when given ResultType.Cancelled', () async { - final scanResult = ScanResult(type: ResultType.Cancelled); - when(mockScanner.scanBarcode()).thenAnswer((_) => Future.value(scanResult)); - - final result = await interactor.scan(); - expect(result.isSuccess, isFalse); - expect(result.errorType, QRError.cancelled); - expect(result.result, isNull); - }); - - test('returns error when given ResultType.Error', () async { - final scanResult = ScanResult(type: ResultType.Error); - when(mockScanner.scanBarcode()).thenAnswer((_) => Future.value(scanResult)); - - final result = await interactor.scan(); - expect(result.isSuccess, isFalse); - expect(result.errorType, QRError.invalidQR); - expect(result.result, isNull); - }); - - test('returns default error case on generic exception', () async { - when(mockScanner.scanBarcode()).thenAnswer((_) => throw Exception()); - - final result = await interactor.scan(); - expect(result.isSuccess, isFalse); - expect(result.errorType, QRError.invalidQR); - expect(result.result, isNull); - }); - - test('returns error when given generic Exception', () async { - when(mockScanner.scanBarcode()).thenAnswer((_) => throw Exception('ErRoR')); - - var interactor = QRLoginTutorialScreenInteractor(); - - final result = await interactor.scan(); - expect(result.isSuccess, isFalse); - expect(result.errorType, QRError.invalidQR); - expect(result.result, isNull); - }); -} diff --git a/apps/flutter_parent/test/screens/login/qr_login_tutorial_screen_test.dart b/apps/flutter_parent/test/screens/login/qr_login_tutorial_screen_test.dart deleted file mode 100644 index 5e8608fa10..0000000000 --- a/apps/flutter_parent/test/screens/login/qr_login_tutorial_screen_test.dart +++ /dev/null @@ -1,120 +0,0 @@ -/* - * Copyright (C) 2020 - present Instructure, Inc. - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, version 3 of the License. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -import 'package:flutter/cupertino.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_parent/l10n/app_localizations.dart'; -import 'package:flutter_parent/screens/qr_login/qr_login_tutorial_screen.dart'; -import 'package:flutter_parent/screens/qr_login/qr_login_tutorial_screen_interactor.dart'; -import 'package:flutter_parent/utils/qr_utils.dart'; -import 'package:flutter_parent/utils/quick_nav.dart'; -import 'package:flutter_test/flutter_test.dart'; -import 'package:mockito/mockito.dart'; - -import '../../utils/accessibility_utils.dart'; -import '../../utils/test_app.dart'; -import '../../utils/test_helpers/mock_helpers.mocks.dart'; - -void main() { - final barcodeResultUrl = 'https://${QRUtils.QR_HOST}/canvas/login?${QRUtils.QR_AUTH_CODE}=1234' - '&${QRUtils.QR_DOMAIN}=mobiledev.instructure.com'; - final interactor = MockQRLoginTutorialScreenInteractor(); - final mockNav = MockQuickNav(); - - setupTestLocator((locator) { - locator.registerFactory(() => interactor); - locator.registerLazySingleton(() => mockNav); - }); - - setUp(() { - reset(interactor); - reset(mockNav); - }); - - testWidgetsWithAccessibilityChecks('Displays page objects and text correctly', (tester) async { - await tester.pumpWidget(TestApp(QRLoginTutorialScreen())); - await tester.pumpAndSettle(); - - await tester.runAsync(() async { - Element element = tester.element(find.byType(FractionallySizedBox)); - final FractionallySizedBox widget = element.widget as FractionallySizedBox; - final Image image = widget.child as Image; - final ImageProvider imageProvider = image.image; - await precacheImage(imageProvider, element); - await tester.pumpAndSettle(); - }); - - await expectLater(find.text(AppLocalizations().locateQRCode), findsOneWidget); - await expectLater(find.text(AppLocalizations().qrCodeExplanation), findsOneWidget); - await expectLater(find.text(AppLocalizations().next.toUpperCase()), findsOneWidget); - await expectLater(find.bySemanticsLabel(AppLocalizations().qrCodeScreenshotContentDescription, skipOffstage: false), - findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('Clicking next scans, returns valid result, and pushes route', (tester) async { - when(interactor.scan()).thenAnswer((_) => Future.value(BarcodeScanResult(true, result: barcodeResultUrl))); - await tester.pumpWidget(TestApp(QRLoginTutorialScreen())); - await tester.pumpAndSettle(); - - await tester.tap(find.text(AppLocalizations().next.toUpperCase())); - await tester.pumpAndSettle(); - verify(mockNav.pushRoute(any, '/qr_login?qrLoginUrl=${Uri.encodeQueryComponent(barcodeResultUrl)}')); - }); - - testWidgetsWithAccessibilityChecks('Clicking next scans, returns invalid result, and displays camera error', - (tester) async { - when(interactor.scan()).thenAnswer((_) => Future.value(BarcodeScanResult(false, errorType: QRError.cameraError))); - await tester.pumpWidget(TestApp(QRLoginTutorialScreen())); - await tester.pumpAndSettle(); - - await tester.tap(find.text(AppLocalizations().next.toUpperCase())); - await tester.pump(); - expect(find.text(AppLocalizations().qrCodeNoCameraError), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('Clicking next scans, returns invalid result, and displays qr error', - (tester) async { - when(interactor.scan()).thenAnswer((_) => Future.value(BarcodeScanResult(false, errorType: QRError.invalidQR))); - await tester.pumpWidget(TestApp(QRLoginTutorialScreen())); - await tester.pumpAndSettle(); - - await tester.tap(find.text(AppLocalizations().next.toUpperCase())); - await tester.pump(); - expect(find.text(AppLocalizations().invalidQRCodeError), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('Clicking next scans, user cancels, and displays no error', (tester) async { - when(interactor.scan()).thenAnswer((_) => Future.value(BarcodeScanResult(false, errorType: QRError.cancelled))); - await tester.pumpWidget(TestApp(QRLoginTutorialScreen())); - await tester.pumpAndSettle(); - - await tester.tap(find.text(AppLocalizations().next.toUpperCase())); - await tester.pump(); - expect(find.byType(SnackBar), findsNothing); - }); - - testWidgetsWithAccessibilityChecks( - 'Clicking next scans, returns valid result, but then displays qr login error on login failure', (tester) async { - when(interactor.scan()).thenAnswer((_) => Future.value(BarcodeScanResult(true, result: barcodeResultUrl))); - when(mockNav.pushRoute(any, any)).thenAnswer((_) => Future.value(AppLocalizations().loginWithQRCodeError)); - await tester.pumpWidget(TestApp(QRLoginTutorialScreen())); - await tester.pumpAndSettle(); - - await tester.tap(find.text(AppLocalizations().next.toUpperCase())); - await tester.pumpAndSettle(); - expect(find.text(AppLocalizations().loginWithQRCodeError), findsOneWidget); - }); -} \ No newline at end of file diff --git a/apps/flutter_parent/test/screens/login/web_login_interactor_test.dart b/apps/flutter_parent/test/screens/login/web_login_interactor_test.dart deleted file mode 100644 index 352d6079af..0000000000 --- a/apps/flutter_parent/test/screens/login/web_login_interactor_test.dart +++ /dev/null @@ -1,65 +0,0 @@ -// Copyright (C) 2019 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:flutter_parent/models/canvas_token.dart'; -import 'package:flutter_parent/models/mobile_verify_result.dart'; -import 'package:flutter_parent/models/user.dart'; -import 'package:flutter_parent/network/api/auth_api.dart'; -import 'package:flutter_parent/network/utils/api_prefs.dart'; -import 'package:flutter_parent/screens/web_login/web_login_interactor.dart'; -import 'package:flutter_test/flutter_test.dart'; -import 'package:mockito/mockito.dart'; - -import '../../utils/test_app.dart'; -import '../../utils/test_helpers/mock_helpers.mocks.dart'; - -void main() { - final api = MockAuthApi(); - - setupTestLocator((locator) { - locator.registerLazySingleton(() => api); - }); - - setUp(() { - reset(api); - }); - - test('mobileVerify calls to the api', () async { - final domain = 'domain'; - - await WebLoginInteractor().mobileVerify(domain); - - verify(api.mobileVerify(domain)).called(1); - }); - - test('performLogin updates the ApiPrefs', () async { - await setupPlatformChannels(); - - final request = 'request'; - final accessToken = 'accessToken'; - final user = User((b) => b..name = 'interactor student name'); - final mobileVerify = MobileVerifyResult(); - final tokens = CanvasToken((b) => b - ..refreshToken = 'refresh' - ..accessToken = accessToken - ..user = user.toBuilder()); - - when(api.getTokens(mobileVerify, request)).thenAnswer((_) async => tokens); - - await WebLoginInteractor().performLogin(mobileVerify, request); - - verify(api.getTokens(mobileVerify, request)).called(1); - expect(ApiPrefs.getUser(), user); - }); -} diff --git a/apps/flutter_parent/test/screens/login/web_login_screen_test.dart b/apps/flutter_parent/test/screens/login/web_login_screen_test.dart deleted file mode 100644 index 96328bacfa..0000000000 --- a/apps/flutter_parent/test/screens/login/web_login_screen_test.dart +++ /dev/null @@ -1,319 +0,0 @@ -// Copyright (C) 2019 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:flutter/material.dart'; -import 'package:flutter/services.dart'; -import 'package:flutter_parent/l10n/app_localizations.dart'; -import 'package:flutter_parent/models/mobile_verify_result.dart'; -import 'package:flutter_parent/network/utils/analytics.dart'; -import 'package:flutter_parent/screens/web_login/web_login_interactor.dart'; -import 'package:flutter_parent/screens/web_login/web_login_screen.dart'; -import 'package:flutter_test/flutter_test.dart'; -import 'package:mockito/mockito.dart'; -import 'package:webview_flutter/webview_flutter.dart'; - -import '../../utils/accessibility_utils.dart'; -import '../../utils/platform_config.dart'; -import '../../utils/test_app.dart'; -import '../../utils/test_helpers/mock_helpers.dart'; -import '../../utils/test_helpers/mock_helpers.mocks.dart'; - -void main() { - final interactor = MockWebLoginInteractor(); - final analytics = MockAnalytics(); - - setupTestLocator((locator) { - locator.registerFactory(() => interactor); - locator.registerFactory(() => analytics); - }); - - setUp(() { - reset(interactor); - reset(analytics); - }); - - testWidgetsWithAccessibilityChecks('Shows the domain in the toolbar', (tester) async { - final domain = 'domain'; - when(interactor.mobileVerify(domain)).thenAnswer((_) => Future.value(MobileVerifyResult())); - - await tester.pumpWidget(TestApp(WebLoginScreen(domain))); - await tester.pump(); - - expect(find.text(domain), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('Shows loading while doing mobile verify', (tester) async { - final domain = 'domain'; - when(interactor.mobileVerify(domain)).thenAnswer((_) => Future.value(MobileVerifyResult())); - - await tester.pumpWidget(TestApp(WebLoginScreen(domain))); - await tester.pump(); - - expect(find.byType(CircularProgressIndicator), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('Does not show loading when mobile verify is finished', (tester) async { - final domain = 'domain'; - when(interactor.mobileVerify(domain)).thenAnswer((_) => Future.value(MobileVerifyResult())); - - await tester.pumpWidget(TestApp(WebLoginScreen(domain), platformConfig: PlatformConfig(initWebview: true))); - await tester.pump(); - await tester.pump(); - - expect(find.byType(CircularProgressIndicator), findsNothing); - }); - - testWidgetsWithAccessibilityChecks('Shows a web view when mobile verify is finished', (tester) async { - final domain = 'domain'; - when(interactor.mobileVerify(domain)).thenAnswer((_) => Future.value(MobileVerifyResult())); - - await tester.pumpWidget(TestApp(WebLoginScreen(domain), platformConfig: PlatformConfig(initWebview: true))); - await tester.pump(); - await tester.pump(); - - expect(find.byType(WebView), findsOneWidget); - expect(find.byType(Dialog), findsNothing); - }); - - testWidgetsWithAccessibilityChecks('Logs when using an authentication provider', (tester) async { - final domain = 'domain'; - when(interactor.mobileVerify(any)) - .thenAnswer((_) => Future.value(MobileVerifyResult((b) => b..baseUrl = '$domain/'))); - - final provider = 'asdf'; - await tester.pumpWidget(TestApp( - WebLoginScreen(domain, authenticationProvider: provider), - platformConfig: PlatformConfig(initWebview: true), - )); - await tester.pump(); - await tester.pump(); - - expect(find.byType(WebView), findsOneWidget); - expect(find.byType(Dialog), findsNothing); - - verify(analytics.logMessage('authentication_provider=$provider')).called(1); - }); - - testWidgetsWithAccessibilityChecks('Handles siteadmin login flow with inst domain', (tester) async { - final domain = 'domain.instructure.com'; - when(interactor.mobileVerify(any)).thenAnswer((_) => Future.value(MobileVerifyResult())); - - await tester.pumpWidget(TestApp( - WebLoginScreen(domain, loginFlow: LoginFlow.siteAdmin), - platformConfig: PlatformConfig(initWebview: true), - )); - await tester.pump(); - await tester.pump(); - - expect(find.byType(WebView), findsOneWidget); - expect(find.byType(Dialog), findsNothing); - }); - - testWidgetsWithAccessibilityChecks('Handles siteadmin login flow without inst domain', (tester) async { - final domain = 'domain'; - when(interactor.mobileVerify(any)).thenAnswer((_) => Future.value(MobileVerifyResult())); - - await tester.pumpWidget(TestApp( - WebLoginScreen(domain, loginFlow: LoginFlow.siteAdmin), - platformConfig: PlatformConfig(initWebview: true), - )); - await tester.pump(); - await tester.pump(); - - expect(find.byType(WebView), findsOneWidget); - expect(find.byType(Dialog), findsNothing); - }); - - testWidgetsWithAccessibilityChecks('Shows a dialog when mobile verify failed with general error', (tester) async { - final domain = 'domain'; - when(interactor.mobileVerify(domain)) - .thenAnswer((_) => Future.value(MobileVerifyResult((b) => b..result = VerifyResultEnum.generalError))); - - await tester.pumpWidget(TestApp( - WebLoginScreen(domain), - platformConfig: PlatformConfig(initWebview: true), - )); - await tester.pumpAndSettle(); - - expect(find.byType(WebView), findsOneWidget); - expect(find.byType(Dialog), findsOneWidget); - expect(find.text(AppLocalizations().domainVerificationErrorGeneral), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('Shows a dialog when mobile verify failed because of domain', (tester) async { - final domain = 'domain'; - when(interactor.mobileVerify(domain)) - .thenAnswer((_) => Future.value(MobileVerifyResult((b) => b..result = VerifyResultEnum.domainNotAuthorized))); - - await tester.pumpWidget(TestApp( - WebLoginScreen(domain), - platformConfig: PlatformConfig(initWebview: true), - )); - await tester.pumpAndSettle(); - - expect(find.byType(WebView), findsOneWidget); - expect(find.byType(Dialog), findsOneWidget); - expect(find.text(AppLocalizations().domainVerificationErrorDomain), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('Shows a dialog when mobile verify failed because of user agent', (tester) async { - final domain = 'domain'; - when(interactor.mobileVerify(domain)) - .thenAnswer((_) => Future.value(MobileVerifyResult((b) => b..result = VerifyResultEnum.unknownUserAgent))); - - await tester.pumpWidget(TestApp( - WebLoginScreen(domain), - platformConfig: PlatformConfig(initWebview: true), - )); - await tester.pumpAndSettle(); - - expect(find.byType(WebView), findsOneWidget); - expect(find.byType(Dialog), findsOneWidget); - expect(find.text(AppLocalizations().domainVerificationErrorUserAgent), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('Shows a dialog when mobile verify failed when unknown', (tester) async { - final domain = 'domain'; - when(interactor.mobileVerify(domain)) - .thenAnswer((_) => Future.value(MobileVerifyResult((b) => b..result = VerifyResultEnum.unknownError))); - - await tester.pumpWidget(TestApp( - WebLoginScreen(domain), - platformConfig: PlatformConfig(initWebview: true), - )); - await tester.pumpAndSettle(); - - expect(find.byType(WebView), findsOneWidget); - expect(find.byType(Dialog), findsOneWidget); - expect(find.text(AppLocalizations().domainVerificationErrorUnknown), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('Shows a dialog when mobile verify failed', (tester) async { - final domain = 'domain'; - when(interactor.mobileVerify(domain)).thenAnswer((_) => Future.error('Fake Error')); - - await tester.pumpWidget(TestApp( - WebLoginScreen(domain), - platformConfig: PlatformConfig(initWebview: true), - )); - await tester.pumpAndSettle(); - - expect(find.byType(WebView), findsOneWidget); - expect(find.byType(Dialog), findsOneWidget); - expect(find.text(AppLocalizations().domainVerificationErrorUnknown), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('Shows a dialog that can be closed', (tester) async { - final domain = 'domain'; - when(interactor.mobileVerify(domain)).thenAnswer((_) => Future.error('Fake Error')); - - await tester.pumpWidget(TestApp(WebLoginScreen(domain), platformConfig: PlatformConfig(initWebview: true))); - await tester.pumpAndSettle(); - - expect(find.byType(WebView), findsOneWidget); - expect(find.byType(Dialog), findsOneWidget); - - final matchedWidget = find.text(AppLocalizations().ok); - expect(matchedWidget, findsOneWidget); - await tester.tap(matchedWidget); - await tester.pumpAndSettle(); - - expect(find.byType(Dialog), findsNothing); - }); - - testWidgetsWithAccessibilityChecks('Shows a skip verify dialog when that is the login type', (tester) async { - final domain = 'domain'; - when(interactor.mobileVerify(domain)).thenAnswer((_) => Future.value()); - when(interactor.performLogin(any, any)).thenAnswer((_) => Future.value()); - - await tester.pumpWidget(TestApp( - WebLoginScreen(domain, loginFlow: LoginFlow.skipMobileVerify), - platformConfig: PlatformConfig(initWebview: true), - )); - await tester.pump(); - await tester.pump(); - await tester.pump(Duration(milliseconds: 1000)); - - expect(find.byType(Dialog), findsOneWidget); - expect(find.text(AppLocalizations().skipMobileVerifyTitle), findsOneWidget); - await tester.enterText(find.byKey(Key(WebLoginScreen.PROTOCOL_SKIP_VERIFY_KEY)), ''); - - // Tap ok, verify we still have a dialog when id/secret are empty - await tester.tap(find.text(AppLocalizations().ok)); - await tester.pump(); - expect(find.byType(Dialog), findsOneWidget); - - await tester.enterText(find.byKey(Key(WebLoginScreen.PROTOCOL_SKIP_VERIFY_KEY)), 'https'); - await tester.testTextInput.receiveAction(TextInputAction.done); - await tester.enterText(find.byKey(Key(WebLoginScreen.ID_SKIP_VERIFY_KEY)), 'id'); - await tester.testTextInput.receiveAction(TextInputAction.done); - await tester.enterText(find.byKey(Key(WebLoginScreen.SECRET_SKIP_VERIFY_KEY)), 'secret'); - - // Hit done on the last field, verify the dialog is gone now - await tester.testTextInput.receiveAction(TextInputAction.done); - await tester.pump(); - await tester.pump(); - expect(find.byType(Dialog), findsNothing); - - verifyNever(interactor.mobileVerify(any)); - }); - - testWidgetsWithAccessibilityChecks('Can cancel a skip verify dialog when that is the login type', (tester) async { - final domain = 'domain'; - when(interactor.mobileVerify(domain)).thenAnswer((_) => Future.value()); - when(interactor.performLogin(any, any)).thenAnswer((_) => Future.value()); - - await tester.pumpWidget(TestApp( - WebLoginScreen(domain, loginFlow: LoginFlow.skipMobileVerify), - platformConfig: PlatformConfig(initWebview: true), - )); - await tester.pump(); - await tester.pump(); - await tester.pump(Duration(milliseconds: 1000)); - - expect(find.byType(Dialog), findsOneWidget); - expect(find.text(AppLocalizations().skipMobileVerifyTitle), findsOneWidget); - - await tester.tap(find.text(AppLocalizations().cancel.toUpperCase())); - await tester.pump(); - await tester.pump(); - - expect(find.byType(Dialog), findsNothing); - verify(interactor.mobileVerify(any)); - }); - - testWidgetsWithAccessibilityChecks('Can cancel a skip verify dialog when that is the login type', (tester) async { - final domain = 'domain'; - when(interactor.mobileVerify(domain)).thenAnswer((_) => Future.value()); - when(interactor.performLogin(any, any)).thenAnswer((_) => Future.value()); - - await tester.pumpWidget(TestApp( - WebLoginScreen(domain, loginFlow: LoginFlow.skipMobileVerify), - platformConfig: PlatformConfig(initWebview: true), - )); - await tester.pump(); - await tester.pump(); - await tester.pump(Duration(milliseconds: 1000)); - - expect(find.byType(Dialog), findsOneWidget); - expect(find.text(AppLocalizations().skipMobileVerifyTitle), findsOneWidget); - - await tester.tap(find.text(AppLocalizations().cancel.toUpperCase())); - await tester.pump(); - await tester.pump(); - - expect(find.byType(Dialog), findsNothing); - verify(interactor.mobileVerify(any)); - }); -} diff --git a/apps/flutter_parent/test/screens/manage_students/manage_students_interactor_test.dart b/apps/flutter_parent/test/screens/manage_students/manage_students_interactor_test.dart deleted file mode 100644 index b0f51297c7..0000000000 --- a/apps/flutter_parent/test/screens/manage_students/manage_students_interactor_test.dart +++ /dev/null @@ -1,107 +0,0 @@ -// Copyright (C) 2019 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'dart:math'; - -import 'package:flutter_parent/models/enrollment.dart'; -import 'package:flutter_parent/models/user.dart'; -import 'package:flutter_parent/network/api/accounts_api.dart'; -import 'package:flutter_parent/network/api/enrollments_api.dart'; -import 'package:flutter_parent/screens/manage_students/manage_students_interactor.dart'; -import 'package:mockito/mockito.dart'; -import 'package:test/test.dart'; - -import '../../utils/test_app.dart'; -import '../../utils/test_helpers/mock_helpers.dart'; -import '../../utils/test_helpers/mock_helpers.mocks.dart'; - -void main() { - final api = MockEnrollmentsApi(); - final AccountsApi accountsApi = MockAccountsApi(); - - setupTestLocator((locator) { - locator.registerLazySingleton(() => api); - locator.registerLazySingleton(() => accountsApi); - }); - - setUp(() { - reset(api); - reset(accountsApi); - }); - - test('getStudents returns a list of students', () async { - var startingList = [ - _mockEnrollment(null), - _mockEnrollment(_mockStudent('Zed').toBuilder()), - _mockEnrollment(_mockStudent('Alex').toBuilder()), - _mockEnrollment(null) - ]; - var expectedList = [_mockStudent('Alex'), _mockStudent('Zed')]; - - when(api.getObserveeEnrollments(forceRefresh: anyNamed('forceRefresh'))).thenAnswer((_) async => startingList); - - expect(await ManageStudentsInteractor().getStudents(), expectedList); - }); - - test('Sort users in descending order', () { - // Create lists - var startingList = [_mockStudent('Zed'), _mockStudent('Alex'), _mockStudent('Billy')]; - var expectedSortedList = [_mockStudent('Alex'), _mockStudent('Billy'), _mockStudent('Zed')]; - - // Run the logic - var interactor = ManageStudentsInteractor(); - interactor.sortUsers(startingList); - - expect(startingList, expectedSortedList); - }); - - test('Filter out enrollments with no observee', () { - // Create the lists - var startingList = [ - _mockEnrollment(null), - _mockEnrollment(_mockStudent('Alex').toBuilder()), - _mockEnrollment(null) - ]; - var expectedSortedList = [_mockStudent('Alex')]; - - // Run the logic - var interactor = ManageStudentsInteractor(); - var result = interactor.filterStudents(startingList); - - expect(result, expectedSortedList); - }); - - test('Filter out duplicate enrollments', () { - var enrollment = _mockEnrollment(_mockStudent('Alex').toBuilder()); - // Create the lists - var startingList = [enrollment, enrollment, enrollment, enrollment]; - var expectedSortedList = [_mockStudent('Alex')]; - - // Run the logic - var interactor = ManageStudentsInteractor(); - var result = interactor.filterStudents(startingList); - - expect(result, expectedSortedList); - }); -} - -User _mockStudent(String name) => User((b) => b - ..id = Random(name.hashCode).nextInt(100000).toString() - ..sortableName = name - ..build()); - -Enrollment _mockEnrollment(UserBuilder? observedUser) => Enrollment((b) => b - ..enrollmentState = '' - ..observedUser = observedUser - ..build()); diff --git a/apps/flutter_parent/test/screens/manage_students/manage_students_screen_test.dart b/apps/flutter_parent/test/screens/manage_students/manage_students_screen_test.dart deleted file mode 100644 index 970beac970..0000000000 --- a/apps/flutter_parent/test/screens/manage_students/manage_students_screen_test.dart +++ /dev/null @@ -1,467 +0,0 @@ -// Copyright (C) 2019 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'dart:async'; -import 'dart:ui'; - -import 'package:flutter/material.dart'; -import 'package:flutter_parent/l10n/app_localizations.dart'; -import 'package:flutter_parent/models/user.dart'; -import 'package:flutter_parent/models/user_color.dart'; -import 'package:flutter_parent/network/utils/analytics.dart'; -import 'package:flutter_parent/screens/alert_thresholds/alert_thresholds_interactor.dart'; -import 'package:flutter_parent/screens/alert_thresholds/alert_thresholds_screen.dart'; -import 'package:flutter_parent/screens/manage_students/manage_students_interactor.dart'; -import 'package:flutter_parent/screens/manage_students/manage_students_screen.dart'; -import 'package:flutter_parent/screens/manage_students/student_color_picker_dialog.dart'; -import 'package:flutter_parent/screens/pairing/pairing_util.dart'; -import 'package:flutter_parent/utils/db/user_colors_db.dart'; -import 'package:flutter_parent/utils/design/student_color_set.dart'; -import 'package:flutter_parent/utils/quick_nav.dart'; -import 'package:flutter_test/flutter_test.dart'; -import 'package:get_it/get_it.dart'; -import 'package:mockito/mockito.dart'; - -import '../../utils/accessibility_utils.dart'; -import '../../utils/canvas_model_utils.dart'; -import '../../utils/network_image_response.dart'; -import '../../utils/test_app.dart'; -import '../../utils/test_helpers/mock_helpers.dart'; -import '../../utils/test_helpers/mock_helpers.mocks.dart'; - -void main() { - mockNetworkImageResponse(); - final analytics = MockAnalytics(); - final MockPairingUtil pairingUtil = MockPairingUtil(); - final MockUserColorsDb userColorsDb = MockUserColorsDb(); - - _setupLocator([MockManageStudentsInteractor? interactor]) async { - final locator = GetIt.instance; - await locator.reset(); - - var thresholdInteractor = MockAlertThresholdsInteractor(); - when(thresholdInteractor.getAlertThresholdsForStudent(any)).thenAnswer((_) => Future.value([])); - - locator.registerFactory(() => thresholdInteractor); - locator.registerFactory(() => interactor ?? MockManageStudentsInteractor()); - locator.registerFactory(() => QuickNav()); - locator.registerLazySingleton(() => analytics); - locator.registerLazySingleton(() => pairingUtil); - locator.registerLazySingleton(() => userColorsDb); - } - - setUp(() { - reset(analytics); - reset(pairingUtil); - reset(userColorsDb); - }); - - Future _clickFAB(WidgetTester? tester) async { - await tester?.tap(find.byType(FloatingActionButton)); - await tester?.pumpAndSettle(); - } - - group('Refresh', () { - testWidgetsWithAccessibilityChecks('Pulling gets list of students', (tester) async { - var preRefreshStudent = [CanvasModelTestUtils.mockUser(shortName: 'Billy')]; - var postRefreshStudent = [CanvasModelTestUtils.mockUser(shortName: 'Sally')]; - - // Mock the behavior of the interactor to return a student - final interactor = MockManageStudentsInteractor(); - when(interactor.getStudents(forceRefresh: anyNamed('forceRefresh'))) - .thenAnswer((_) => Future.value(postRefreshStudent)); - _setupLocator(interactor); - - // Start the page with a single student - await tester.pumpWidget(TestApp(ManageStudentsScreen(preRefreshStudent))); - await tester.pumpAndSettle(); - - // Check if we're showing the initial student - expect(find.text('Billy'), findsOneWidget); - - // Pull to refresh\ - final matchedWidget = find.byType(RefreshIndicator); - await tester.drag(matchedWidget, const Offset(0, 200)); - await tester.pumpAndSettle(); - - // See if we got our new student - expect(find.text('Sally'), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('Error on pull to refresh', (tester) async { - var interactor = MockManageStudentsInteractor(); - Completer?> completer = Completer?>(); - when(interactor.getStudents(forceRefresh: anyNamed('forceRefresh'))).thenAnswer((_) => completer.future); - _setupLocator(interactor); - - // Start the screen with no users - await tester.pumpWidget(TestApp(ManageStudentsScreen([]))); - await tester.pumpAndSettle(); - - // Pull to refresh - await tester.drag(find.byType(RefreshIndicator), const Offset(0, 250)); - await tester.pump(); - await tester.pump(Duration(milliseconds: 300)); - - // Make sure we called into the interactor to get the student list - verify(interactor.getStudents(forceRefresh: true)).called(1); - - completer.completeError('Fake Error'); - await tester.pumpAndSettle(); - - // Check if we show the error message - expect(find.text(AppLocalizations().errorLoadingStudents), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('Retry button on error page loads students', (tester) async { - var observedStudents = [CanvasModelTestUtils.mockUser(shortName: 'Billy')]; - - // Mock interactor to return an error when retrieving student list - var interactor = MockManageStudentsInteractor(); - Completer?> completer = Completer?>(); - when(interactor.getStudents(forceRefresh: anyNamed('forceRefresh'))).thenAnswer((_) => completer.future); - _setupLocator(interactor); - - // Start the page with a single student - await tester.pumpWidget(TestApp(ManageStudentsScreen(observedStudents))); - await tester.pumpAndSettle(); - - // Pull to refresh, causing an error which will show the error screen with the retry button - await tester.drag(find.byType(RefreshIndicator), const Offset(0, 250)); - await tester.pump(); - await tester.pump(Duration(milliseconds: 300)); - - // Make sure we called into the interactor to get the student list - verify(interactor.getStudents(forceRefresh: true)).called(1); - - completer.completeError('Fake Error'); - await tester.pumpAndSettle(); - - // Tap retry button to refresh list - await tester.tap(find.text(AppLocalizations().retry)); - await tester.pumpAndSettle(); - - // Change the interactor to return a student instead of an error - when(interactor.getStudents(forceRefresh: anyNamed('forceRefresh'))) - .thenAnswer((_) => Future.value(observedStudents)); - - await tester.drag(find.byType(RefreshIndicator), const Offset(0, 200)); - await tester.pumpAndSettle(); - - // See if we got the student back from the retry - expect(find.text('Billy'), findsOneWidget); - }); - }); - - group('Student List', () { - testWidgetsWithAccessibilityChecks('Displays', (tester) async { - _setupLocator(); - - var observedStudents = [ - CanvasModelTestUtils.mockUser(name: 'Billy'), - CanvasModelTestUtils.mockUser(name: 'Sally'), - CanvasModelTestUtils.mockUser(name: 'Trevor'), - ]; - - // Start the page with three students - await tester.pumpWidget(TestApp(ManageStudentsScreen(observedStudents))); - await tester.pumpAndSettle(); - - // See if we are showing the list tiles for those students - expect(find.byType(ListTile), findsNWidgets(3)); - }); - - testWidgetsWithAccessibilityChecks('Displays username', (tester) async { - _setupLocator(); - - var observedStudents = [ - CanvasModelTestUtils.mockUser(shortName: 'Billy', pronouns: null), - ]; - - // Start the page with a user that has no pronouns set - await tester.pumpWidget(TestApp(ManageStudentsScreen(observedStudents))); - await tester.pumpAndSettle(); - - // See if we displaying the username - expect(find.text('Billy'), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('Display username and pronouns ', (tester) async { - _setupLocator(); - - var observedStudents = [ - CanvasModelTestUtils.mockUser(shortName: 'Billy', pronouns: 'he/him'), - ]; - - // Start the page with a user that has pronouns set - await tester.pumpWidget(TestApp(ManageStudentsScreen(observedStudents))); - await tester.pumpAndSettle(); - - // See if we are correctly displaying the username and pronouns of the user - expect(find.text('Billy (he/him)'), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('Displays stored user color', (tester) async { - _setupLocator(); - - var observedStudents = [ - CanvasModelTestUtils.mockUser(shortName: 'Billy', id: '123'), - ]; - - UserColor userColor = UserColor((b) => b..color = Colors.pinkAccent); - when(userColorsDb.getByContext(any, any, 'user_123')).thenAnswer((_) async => userColor); - - await tester.pumpWidget(TestApp(ManageStudentsScreen(observedStudents))); - await tester.pumpAndSettle(); - - // Should show the color circle - var key = Key('color-circle-123'); - expect(find.byKey(key), findsOneWidget); - - // Circle should be the correct color - Container circleContainer = tester.widget(find.byKey(key)); - expect((circleContainer.decoration as BoxDecoration).color, userColor.color); - }); - - testWidgetsWithAccessibilityChecks('Displays default user color', (tester) async { - _setupLocator(); - - int studentIndex = 2; - var expectedColor = StudentColorSet.all[studentIndex].light; - - var observedStudents = [ - CanvasModelTestUtils.mockUser(shortName: 'Billy', id: studentIndex.toString()), - ]; - - await tester.pumpWidget(TestApp(ManageStudentsScreen(observedStudents))); - await tester.pumpAndSettle(); - - // Should show the color circle - var key = Key('color-circle-$studentIndex'); - expect(find.byKey(key), findsOneWidget); - - // Circle should be the correct color - Container circleContainer = tester.widget(find.byKey(key)); - expect((circleContainer.decoration as BoxDecoration).color, expectedColor); - }); - - testWidgetsWithAccessibilityChecks('Clicking student color opens color picker', (tester) async { - _setupLocator(); - - var observedStudents = [ - CanvasModelTestUtils.mockUser(shortName: 'Billy', id: '123'), - ]; - - // Start the page with the user - await tester.pumpWidget(TestApp(ManageStudentsScreen(observedStudents))); - await tester.pumpAndSettle(); - - // Tap the color circle - var key = Key('color-circle-123'); - await tester.tap(find.byKey(key)); - await tester.pumpAndSettle(); - - // Should show the color picker dialog - expect(find.byType(StudentColorPickerDialog), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('Empty when null', (tester) async { - _setupLocator(); - - // Start the page with a 'null' list of students - await tester.pumpWidget(TestApp( - ManageStudentsScreen(null), - )); - await tester.pumpAndSettle(); - - // See if we are showing the empty message - expect(find.text(AppLocalizations().emptyStudentList), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('Empty when… empty', (tester) async { - _setupLocator(); - - List observedStudents = []; - - // Start the page with an empty list of students - await tester.pumpWidget(TestApp( - ManageStudentsScreen(observedStudents), - )); - await tester.pumpAndSettle(); - - // See if we are showing the empty message - expect(find.text(AppLocalizations().emptyStudentList), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('Tap goes to the Threshold Screen', (tester) async { - _setupLocator(); - - var observedStudent = [CanvasModelTestUtils.mockUser(shortName: 'Billy')]; - - await tester.pumpWidget(TestApp(ManageStudentsScreen(observedStudent))); - await tester.pumpAndSettle(); - - // Make sure the user was loaded - expect(find.text('Billy'), findsOneWidget); - - // Tap on the user - await tester.tap(find.text('Billy')); - - // Pump and settle the page transition animation - await tester.pump(); - await tester.pump(); - await tester.pumpAndSettle(); - - // Find the thresholds screen - expect(find.byType(AlertThresholdsScreen), findsOneWidget); - }); - }); - - group('Add Student', () { - testWidgetsWithAccessibilityChecks('Displays FAB for pairing', (tester) async { - var interactor = MockManageStudentsInteractor(); - _setupLocator(interactor); - - await tester.pumpWidget(TestApp( - ManageStudentsScreen([]), - )); - await tester.pumpAndSettle(); - - // Should display FAB - expect(find.byType(FloatingActionButton), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('Tapping FAB calls PairingUtil', (tester) async { - var interactor = MockManageStudentsInteractor(); - _setupLocator(interactor); - - var observedStudents = [CanvasModelTestUtils.mockUser(name: 'Billy')]; - - await tester.pumpWidget(TestApp( - ManageStudentsScreen(observedStudents), - )); - await tester.pumpAndSettle(); - - await _clickFAB(tester); - await tester.pumpAndSettle(); - - // Verify that PairingUtil was called - verify(pairingUtil.pairNewStudent(any, any)); - }); - - testWidgetsWithAccessibilityChecks('Refresh list on success', (tester) async { - var observedStudent = [CanvasModelTestUtils.mockUser(shortName: 'Billy')]; - - // Mock return value for success when pairing a student - final interactor = MockManageStudentsInteractor(); - when(pairingUtil.pairNewStudent(any, any)).thenAnswer((inv) => inv.positionalArguments[1]()); - - // Mock retrieving students, also add an extra student to the list - when(interactor.getStudents(forceRefresh: anyNamed('forceRefresh'))).thenAnswer((_) { - observedStudent.add(CanvasModelTestUtils.mockUser(shortName: 'Trevor')); - return Future.value(observedStudent); - }); - - _setupLocator(interactor); - - // Setup page - await tester.pumpWidget(TestApp(ManageStudentsScreen(observedStudent))); - await tester.pumpAndSettle(); - - // Make sure we only have one student - expect(find.byType(ListTile), findsNWidgets(1)); - expect(find.text('Billy'), findsOneWidget); - - // Click FAB - await _clickFAB(tester); - await tester.pumpAndSettle(); - - // Make sure we made the call to get students - verify(interactor.getStudents(forceRefresh: true)).called(1); - - // Check for two students in the list - expect(find.byType(ListTile), findsNWidgets(2)); - expect(find.text('Billy'), findsOneWidget); - expect(find.text('Trevor'), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('screen returns true when paired successfully', (tester) async { - var observedStudent = [CanvasModelTestUtils.mockUser(shortName: 'Billy', id: "1771")]; - - // Mock return value for success when pairing a student - final interactor = MockManageStudentsInteractor(); - when(pairingUtil.pairNewStudent(any, any)).thenAnswer((inv) => inv.positionalArguments[1]()); - - // Mock retrieving students, also add an extra student to the list - when(interactor.getStudents(forceRefresh: anyNamed('forceRefresh'))).thenAnswer((_) { - observedStudent.add(CanvasModelTestUtils.mockUser(shortName: 'Trevor')); - return Future.value(observedStudent); - }); - - _setupLocator(interactor); - - final observer = MockNavigatorObserver(); - - // Setup page - await _pumpTestableWidgetWithBackButton(tester, ManageStudentsScreen(observedStudent), observer); - - // Make sure we only have one student - expect(find.byType(ListTile), findsNWidgets(1)); - expect(find.text('Billy'), findsOneWidget); - - // Click FAB - await _clickFAB(tester); - await tester.pumpAndSettle(); - - // Make sure we made the call to get students - verify(interactor.getStudents(forceRefresh: true)).called(1); - - // Check for two students in the list - expect(find.byType(ListTile), findsNWidgets(2)); - expect(find.text('Billy'), findsOneWidget); - expect(find.text('Trevor'), findsOneWidget); - - // Setup for getting the popped result from the Manage Students screen - bool studentAdded = false; - Route route = verify(observer.didPush(captureAny, any)).captured[1]; - route.popped.then((value) => studentAdded = value); - - // Go back to the widget with the back button - await tester.pageBack(); - await tester.pumpAndSettle(Duration(seconds: 1)); - - expect(studentAdded, true); - }); - }); -} - -/// Load up a temp page with a button to navigate to our screen, that way the back button exists in the app bar -Future _pumpTestableWidgetWithBackButton(tester, Widget widget, MockNavigatorObserver observer) async { - var mockObserver = MockNavigatorObserver(); - final app = TestApp( - Builder( - builder: (context) => TextButton( - child: Semantics(label: 'test', child: const SizedBox()), - onPressed: () => Navigator.of(context).push(MaterialPageRoute(builder: (context) => widget)), - ), - ), - navigatorObservers: [mockObserver, if (observer != null) observer], - ); - - await tester.pumpWidget(app); - await tester.pumpAndSettle(); - await tester.tap(find.byType(TextButton)); - await tester.pumpAndSettle(); - verify(mockObserver.didPush(any, any)).called(2); // Twice, first for the initial page, then for the navigator route -} \ No newline at end of file diff --git a/apps/flutter_parent/test/screens/manage_students/student_color_picker_dialog_test.dart b/apps/flutter_parent/test/screens/manage_students/student_color_picker_dialog_test.dart deleted file mode 100644 index 5530ab2f3b..0000000000 --- a/apps/flutter_parent/test/screens/manage_students/student_color_picker_dialog_test.dart +++ /dev/null @@ -1,178 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'dart:async'; - -import 'package:flutter/material.dart'; -import 'package:flutter_parent/l10n/app_localizations.dart'; -import 'package:flutter_parent/models/user_colors.dart'; -import 'package:flutter_parent/screens/manage_students/student_color_picker_dialog.dart'; -import 'package:flutter_parent/screens/manage_students/student_color_picker_interactor.dart'; -import 'package:flutter_parent/utils/design/parent_theme.dart'; -import 'package:flutter_parent/utils/design/student_color_set.dart'; -import 'package:flutter_test/flutter_test.dart'; -import 'package:mockito/mockito.dart'; - -import '../../utils/accessibility_utils.dart'; -import '../../utils/test_app.dart'; -import '../../utils/test_helpers/mock_helpers.mocks.dart'; -import '../pairing/pairing_util_test.dart'; - -void main() { - AppLocalizations l10n = AppLocalizations(); - MockStudentColorPickerInteractor interactor = MockStudentColorPickerInteractor(); - - setupTestLocator((locator) { - locator.registerLazySingleton(() => interactor); - }); - - setUp(() { - reset(interactor); - }); - - testWidgetsWithAccessibilityChecks('Displays colors with semantic labels', (tester) async { - await tester.pumpWidget(TestApp(StudentColorPickerDialog(initialColor: Colors.white, studentId: ''))); - await tester.pumpAndSettle(); - - // The number of color options should match the number of available color sets - Row options = tester.widget(find.byKey(Key('color-options'))); - expect(options.children.length, StudentColorSet.all.length); - - // Should have semantic labels - expect(find.bySemanticsLabel(l10n.colorElectric), findsOneWidget); - expect(find.bySemanticsLabel(l10n.colorPlum), findsOneWidget); - expect(find.bySemanticsLabel(l10n.colorBarney), findsOneWidget); - expect(find.bySemanticsLabel(l10n.colorRaspberry), findsOneWidget); - expect(find.bySemanticsLabel(l10n.colorFire), findsOneWidget); - expect(find.bySemanticsLabel(l10n.colorShamrock), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('Selects initial color', (tester) async { - var color = StudentColorSet.jeffGoldplum.light; - await tester.pumpWidget(TestApp(StudentColorPickerDialog(initialColor: color, studentId: ''))); - await tester.pumpAndSettle(); - - // 'Plum' color should be selected - var predicate = (Widget w) => w is Semantics && w.properties.label == l10n.colorPlum && w.properties.selected!; - expect(find.byWidgetPredicate(predicate), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('Displays indicator and hides buttons while saving', (tester) async { - Completer completer = Completer(); - - when(interactor.save(any, any)).thenAnswer((_) => completer.future); - await tester.pumpWidget(TestApp(StudentColorPickerDialog(initialColor: Colors.white, studentId: ''))); - await tester.pumpAndSettle(); - - // Select 'shamrock' - await tester.tap(find.bySemanticsLabel(l10n.colorShamrock)); - await tester.pumpAndSettle(); - - // Tap 'Ok' - await tester.tap(find.bySemanticsLabel(l10n.ok)); - await tester.pump(); - - // Should hide buttons and display saving indicator - expect(find.byType(CircularProgressIndicator), findsOneWidget); - expect(find.text(l10n.ok), findsNothing); - expect(find.text(l10n.cancel), findsNothing); - }); - - testWidgetsWithAccessibilityChecks('Returns true on successful save', (tester) async { - await tester.pumpWidget(TestApp(DummyWidget())); - await tester.pumpAndSettle(); - - BuildContext context = tester.state(find.byType(DummyWidget)).context; - - var resultFuture = showDialog( - context: context, - builder:(_) => StudentColorPickerDialog(initialColor: Colors.white, studentId: ''), - ); - await tester.pumpAndSettle(); - - // Select a color - await tester.tap(find.bySemanticsLabel(l10n.colorShamrock)); - await tester.pumpAndSettle(); - - // Tap 'Ok' and wait for the result - await tester.tap(find.text(l10n.ok)); - await tester.pumpAndSettle(); - var result = await resultFuture; - - // Should have returned true - expect(result, isTrue); - }); - - testWidgetsWithAccessibilityChecks('Returns false if color did not change on save', (tester) async { - await tester.pumpWidget(TestApp(DummyWidget())); - await tester.pumpAndSettle(); - - BuildContext context = tester.state(find.byType(DummyWidget)).context; - - // Set initial color to 'shamrock' - var resultFuture = showDialog( - context: context, - builder:(_) => StudentColorPickerDialog(initialColor: StudentColorSet.shamrock.light, studentId: ''), - ); - await tester.pumpAndSettle(); - - // Select 'shamrock' - await tester.tap(find.bySemanticsLabel(l10n.colorShamrock)); - await tester.pumpAndSettle(); - - // Tap 'Ok' and wait for the result - await tester.tap(find.bySemanticsLabel(l10n.ok)); - var result = await resultFuture; - - // Should have returned false - expect(result, isFalse); - }); - - testWidgetsWithAccessibilityChecks('Returns false if canceled', (tester) async { - await tester.pumpWidget(TestApp(DummyWidget())); - await tester.pumpAndSettle(); - - BuildContext context = tester.state(find.byType(DummyWidget)).context; - var resultFuture = showDialog( - context: context, - builder:(_) => StudentColorPickerDialog(initialColor: Colors.white, studentId: ''), - ); - await tester.pumpAndSettle(); - - // Tap 'cancel' and wait for the result - await tester.tap(find.bySemanticsLabel(l10n.cancel)); - var result = await resultFuture; - - // Should have returned false - expect(result, isFalse); - }); - - testWidgetsWithAccessibilityChecks('Displays error message if saving failed', (tester) async { - when(interactor.save(any, any)).thenAnswer((_) async => throw 'Fake error'); - - await tester.pumpWidget(TestApp(StudentColorPickerDialog(initialColor: Colors.white, studentId: ''))); - await tester.pumpAndSettle(); - - // Select a color - await tester.tap(find.bySemanticsLabel(l10n.colorShamrock)); - await tester.pumpAndSettle(); - - // Tap 'Ok' - await tester.tap(find.bySemanticsLabel(l10n.ok)); - await tester.pumpAndSettle(); - - // Should show error message - expect(find.text(l10n.errorSavingColor), findsOneWidget); - }); -} \ No newline at end of file diff --git a/apps/flutter_parent/test/screens/manage_students/student_color_picker_interactor_test.dart b/apps/flutter_parent/test/screens/manage_students/student_color_picker_interactor_test.dart deleted file mode 100644 index 328dc13421..0000000000 --- a/apps/flutter_parent/test/screens/manage_students/student_color_picker_interactor_test.dart +++ /dev/null @@ -1,93 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:flutter/material.dart'; -import 'package:flutter_parent/models/color_change_response.dart'; -import 'package:flutter_parent/models/login.dart'; -import 'package:flutter_parent/models/user_color.dart'; -import 'package:flutter_parent/network/api/user_api.dart'; -import 'package:flutter_parent/screens/manage_students/student_color_picker_interactor.dart'; -import 'package:flutter_parent/utils/db/user_colors_db.dart'; -import 'package:flutter_test/flutter_test.dart'; -import 'package:mockito/mockito.dart'; - -import '../../utils/canvas_model_utils.dart'; -import '../../utils/platform_config.dart'; -import '../../utils/test_app.dart'; -import '../../utils/test_helpers/mock_helpers.dart'; -import '../../utils/test_helpers/mock_helpers.mocks.dart'; - -void main() async { - Login login = Login((b) => b - ..user = CanvasModelTestUtils.mockUser(id: '123').toBuilder() - ..domain = 'test-domain'); - MockUserApi userApi = MockUserApi(); - MockUserColorsDb db = MockUserColorsDb(); - - await setupTestLocator((locator) { - locator.registerLazySingleton(() => userApi); - locator.registerLazySingleton(() => db); - }); - - setUp(() async { - await setupPlatformChannels(config: PlatformConfig(initLoggedInUser: login)); - reset(userApi); - reset(db); - }); - - test('Calls UserApi with correct parameters', () async { - String studentId = '456'; - Color color = Colors.pinkAccent; - - final colorChangeResponse = - ColorChangeResponse((b) => b..hexCode = '#123456'); - when(userApi.setUserColor('user_456', color)) - .thenAnswer((_) async => Future.value(colorChangeResponse)); - - await StudentColorPickerInteractor().save(studentId, color); - verify(userApi.setUserColor('user_456', color)); - }); - - test('Throws exception when color change response color is null', () async { - String studentId = '456'; - Color color = Colors.pinkAccent; - - final colorChangeResponse = ColorChangeResponse((b) => b..hexCode = null); - when(userApi.setUserColor('user_456', color)) - .thenAnswer((_) async => Future.value(colorChangeResponse)); - - expect( - () async => await StudentColorPickerInteractor().save(studentId, color), - throwsException); - }); - - test('Calls database with correct data', () async { - String studentId = '456'; - Color color = Colors.pinkAccent; - - final colorChangeResponse = - ColorChangeResponse((b) => b..hexCode = '#123456'); - when(userApi.setUserColor('user_456', color)) - .thenAnswer((_) async => Future.value(colorChangeResponse)); - - UserColor expectedData = UserColor((b) => b - ..userId = login.user.id - ..userDomain = login.domain - ..canvasContext = 'user_456' - ..color = color); - - await StudentColorPickerInteractor().save(studentId, color); - verify(db.insertOrUpdate(expectedData)); - }); -} diff --git a/apps/flutter_parent/test/screens/masquerade/masquerade_screen_interactor_test.dart b/apps/flutter_parent/test/screens/masquerade/masquerade_screen_interactor_test.dart deleted file mode 100644 index 11dd6545a5..0000000000 --- a/apps/flutter_parent/test/screens/masquerade/masquerade_screen_interactor_test.dart +++ /dev/null @@ -1,160 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:flutter_parent/models/login.dart'; -import 'package:flutter_parent/models/user.dart'; -import 'package:flutter_parent/network/api/user_api.dart'; -import 'package:flutter_parent/network/utils/api_prefs.dart'; -import 'package:flutter_parent/screens/masquerade/masquerade_screen_interactor.dart'; -import 'package:mockito/mockito.dart'; -import 'package:test/test.dart'; - -import '../../utils/canvas_model_utils.dart'; -import '../../utils/test_app.dart'; -import '../../utils/test_helpers/mock_helpers.mocks.dart'; - -void main() { - MockUserApi userApi = MockUserApi(); - - setupTestLocator((locator) { - locator.registerLazySingleton(() => userApi); - }); - - setUp(() async { - reset(userApi); - await setupPlatformChannels(); - }); - - test('Gets domain from ApiPrefs', () { - String expectedDomain = 'domain'; - ApiPrefs.switchLogins(Login((b) => b..domain = expectedDomain)); - - String? actualDomain = MasqueradeScreenInteractor().getDomain(); - expect(actualDomain, expectedDomain); - }); - - group('startMasquerading', () { - test('startMasquerading returns fails on API error', () async { - when(userApi.getUserForDomain(any, any)).thenAnswer((_) => Future.error('fake error')); - - bool result = await MasqueradeScreenInteractor().startMasquerading('', ''); - expect(result, isFalse); - }); - - test('startMasquerading calls API with correct userId and domain', () async { - String userId = 'user_123'; - String domain = 'testDomain'; - when(userApi.getUserForDomain(any, any)).thenAnswer((_) => Future.error('fake error')); - - await MasqueradeScreenInteractor().startMasquerading(userId, domain); - verify(userApi.getUserForDomain(domain, userId)); - }); - - test('startMasquerading returns true on success and updates current Login', () async { - String originalDomain = 'domain'; - User originalUser = CanvasModelTestUtils.mockUser(name: 'Original User'); - Login originalLogin = Login((b) => b - ..domain = originalDomain - ..user = originalUser.toBuilder()); - - String masqueradeUserId = 'user_123'; - String masqueradeDomain = 'masqueradeDomain'; - User masqueradeUser = CanvasModelTestUtils.mockUser(name: 'Masked User', id: masqueradeUserId); - Login masqueradeLogin = originalLogin.rebuild((b) => b - ..masqueradeDomain = masqueradeDomain - ..masqueradeUser = masqueradeUser.toBuilder()); - - when(userApi.getUserForDomain(any, any)).thenAnswer((_) async => masqueradeUser); - ApiPrefs.switchLogins(originalLogin); - - bool result = await MasqueradeScreenInteractor().startMasquerading(masqueradeUserId, masqueradeDomain); - expect(result, isTrue); - expect(ApiPrefs.getCurrentLogin(), masqueradeLogin); - }); - }); - - group('sanitizeDomain', () { - test('sanitizeDomain removes white space', () { - String input = ' htt ps://example . instructure. com '; - String expected = 'https://example.instructure.com'; - - String actual = MasqueradeScreenInteractor().sanitizeDomain(input); - expect(actual, expected); - }); - - test('sanitizeDomain adds ".instructure.com" if missing', () { - String input = 'https://example'; - String expected = 'https://example.instructure.com'; - - String actual = MasqueradeScreenInteractor().sanitizeDomain(input); - expect(actual, expected); - }); - - test('sanitizeDomain adds ".instructure.com" if missing on beta domains', () { - String input = 'https://example.beta'; - String expected = 'https://example.beta.instructure.com'; - - String actual = MasqueradeScreenInteractor().sanitizeDomain(input); - expect(actual, expected); - }); - - test('sanitizeDomain adds https protocol if missing', () { - String input = 'example.instructure.com'; - String expected = 'https://example.instructure.com'; - - String actual = MasqueradeScreenInteractor().sanitizeDomain(input); - expect(actual, expected); - }); - - test('sanitizeDomain does not add https protocol if a protocol is already present', () { - String input = 'http://example'; - String expected = 'http://example.instructure.com'; - - String actual = MasqueradeScreenInteractor().sanitizeDomain(input); - expect(actual, expected); - }); - - test('sanitizeDomain returns unmodified input if already sanitized', () { - String input = 'https://example.instructure.com'; - String expected = 'https://example.instructure.com'; - - String actual = MasqueradeScreenInteractor().sanitizeDomain(input); - expect(actual, expected); - }); - - test('sanitizeDomain returns an empty string for blank input', () { - String input = ''; - String expected = ''; - - String actual = MasqueradeScreenInteractor().sanitizeDomain(input); - expect(actual, expected); - }); - - test('sanitizeDomain returns an empty string for null input', () { - String? input = null; - String expected = ''; - - String actual = MasqueradeScreenInteractor().sanitizeDomain(input); - expect(actual, expected); - }); - - test('sanitizeDomain returns an empty string for invalid input', () { - String input = 'www.🎯.com'; - String expected = ''; - - String actual = MasqueradeScreenInteractor().sanitizeDomain(input); - expect(actual, expected); - }); - }); -} \ No newline at end of file diff --git a/apps/flutter_parent/test/screens/masquerade/masquerade_screen_test.dart b/apps/flutter_parent/test/screens/masquerade/masquerade_screen_test.dart deleted file mode 100644 index babd223e8b..0000000000 --- a/apps/flutter_parent/test/screens/masquerade/masquerade_screen_test.dart +++ /dev/null @@ -1,271 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'dart:async'; - -import 'package:flutter/cupertino.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_parent/l10n/app_localizations.dart'; -import 'package:flutter_parent/screens/masquerade/masquerade_screen.dart'; -import 'package:flutter_parent/screens/masquerade/masquerade_screen_interactor.dart'; -import 'package:flutter_test/flutter_test.dart'; -import 'package:mockito/mockito.dart'; - -import '../../utils/accessibility_utils.dart'; -import '../../utils/test_app.dart'; -import '../../utils/test_helpers/mock_helpers.mocks.dart'; - -void main() { - MockMasqueradeScreenInteractor interactor = MockMasqueradeScreenInteractor(); - String siteAdminDomain = 'https://siteadmin.instructure.com'; - String normalDomain = 'https://example.instructure.com'; - - AppLocalizations l10n = AppLocalizations(); - - Key domainKey = Key('domain-input'); - Key userIdKey = Key('user-id-input'); - - setupTestLocator((locator) { - locator.registerFactory(() => interactor); - }); - - setUp(() { - reset(interactor); - - // For getDomain, return normalDomain by default - when(interactor.getDomain()).thenReturn(normalDomain); - - // For sanitizeDomain, return actual implementation - when(interactor.sanitizeDomain(any)).thenAnswer((inv) { - String domain = inv.positionalArguments[0]; - return MasqueradeScreenInteractor().sanitizeDomain(domain); - }); - }); - - // TODO Fix test - testWidgetsWithAccessibilityChecks( - 'Animates red panda mask', - (tester) async { - Duration animationInterval = Duration(milliseconds: 2000); - double epsilon = 1.0; // Allow variance within one logical pixel - - var screenCenter = WidgetsBinding.instance.renderView.configuration.size.width / 2; - var offset = MasqueradeScreenState.pandaMaskOffset.dx / 2; - - Offset left = Offset(screenCenter - offset, 137.0); - Offset center = Offset(screenCenter, 97.0); - Offset right = Offset(screenCenter + offset, 137.0); - - await tester.pumpWidget(TestApp(MasqueradeScreen())); - await tester.pump(); - await tester.pump(); - - var mask = find.byKey(Key('red-panda-mask')); - - // Mask should start at the left offset - expect(tester.getCenter(mask), offsetMoreOrLessEquals(left, epsilon: epsilon)); - - // After the first animation interval it should be at the center offset - await tester.pump(animationInterval); - expect(tester.getCenter(mask), offsetMoreOrLessEquals(center, epsilon: epsilon)); - - // At the next interval it should be at the right offset - await tester.pump(animationInterval); - expect(tester.getCenter(mask), offsetMoreOrLessEquals(right, epsilon: epsilon)); - - // It should then reverse and go back to the center offset - await tester.pump(animationInterval); - expect(tester.getCenter(mask), offsetMoreOrLessEquals(center, epsilon: epsilon)); - - // And finally it should go back to the starting offset - await tester.pump(animationInterval); - expect(tester.getCenter(mask), offsetMoreOrLessEquals(left, epsilon: epsilon)); - }, - a11yExclusions: {A11yExclusion.multipleNodesWithSameLabel}, skip: true); - - testWidgetsWithAccessibilityChecks( - 'Disables domain input and populates with domain if not siteadmin', - (tester) async { - await tester.pumpWidget(TestApp(MasqueradeScreen())); - await tester.pump(); - - TextField input = tester.widget(find.byKey(domainKey)); - expect(input.enabled, isFalse); - expect(input.controller!.text, normalDomain); - }, - a11yExclusions: {A11yExclusion.multipleNodesWithSameLabel}, - ); - - testWidgetsWithAccessibilityChecks( - 'Enables domain input if siteadmin', - (tester) async { - when(interactor.getDomain()).thenReturn(siteAdminDomain); - await tester.pumpWidget(TestApp(MasqueradeScreen())); - await tester.pump(); - - TextField input = tester.widget(find.byKey(domainKey)); - expect(input.enabled, isTrue); - expect(input.controller!.text, isEmpty); - }, - a11yExclusions: {A11yExclusion.multipleNodesWithSameLabel}, - ); - - testWidgetsWithAccessibilityChecks( - 'Shows error for invalid domain', - (tester) async { - when(interactor.getDomain()).thenReturn(siteAdminDomain); - await tester.pumpWidget(TestApp(MasqueradeScreen())); - await tester.pump(); - - // Tap the 'Act As User' button - domain input should be empty - await tester.tap(find.byType(ElevatedButton)); - await tester.pump(); - - // Error message should show - TextField input = tester.widget(find.byKey(domainKey)); - expect(input.decoration?.errorText, l10n.domainInputError); - expect(find.text(l10n.domainInputError), findsOneWidget); - - // Input a valid domain - await tester.enterText(find.byKey(domainKey), normalDomain); - await tester.pump(); - - // Entering text should have cleared the error - input = tester.widget(find.byKey(domainKey)); - expect(input.decoration?.errorText, isNull); - expect(find.text(l10n.domainInputError), findsNothing); - - // Tap the 'Act As User' button again - await tester.tap(find.byType(ElevatedButton)); - await tester.pump(); - - // The error should not be displayed - input = tester.widget(find.byKey(domainKey)); - expect(input.decoration?.errorText, isNull); - expect(find.text(l10n.domainInputError), findsNothing); - }, - a11yExclusions: {A11yExclusion.multipleNodesWithSameLabel}, - ); - - testWidgetsWithAccessibilityChecks( - 'Shows error for invalid userId', - (tester) async { - when(interactor.getDomain()).thenReturn(siteAdminDomain); - await tester.pumpWidget(TestApp(MasqueradeScreen())); - await tester.pump(); - - // Tap the 'Act As User' button - user id input should be empty - await tester.tap(find.byType(ElevatedButton)); - await tester.pump(); - - // Error message should show - TextField input = tester.widget(find.byKey(userIdKey)); - expect(input.decoration?.errorText, l10n.userIdInputError); - expect(find.text(l10n.userIdInputError), findsOneWidget); - - // Input a valid user id - await tester.enterText(find.byKey(userIdKey), '123'); - await tester.pump(); - - // Entering text should have cleared the error - input = tester.widget(find.byKey(userIdKey)); - expect(input.decoration?.errorText, isNull); - expect(find.text(l10n.userIdInputError), findsNothing); - - // Tap the 'Act As User' button again - await tester.tap(find.byType(ElevatedButton)); - await tester.pump(); - - // The error should not be displayed - input = tester.widget(find.byKey(userIdKey)); - expect(input.decoration?.errorText, isNull); - expect(find.text(l10n.userIdInputError), findsNothing); - }, - a11yExclusions: {A11yExclusion.multipleNodesWithSameLabel}, - ); - - testWidgetsWithAccessibilityChecks( - 'Displays loading indicator while attempting to start the masquerade', - (tester) async { - Completer completer = Completer(); - when(interactor.startMasquerading(any, any)).thenAnswer((_) => completer.future); - - await tester.pumpWidget(TestApp(MasqueradeScreen())); - await tester.pump(); - - // Enter a user id and press the button - await tester.enterText(find.byKey(userIdKey), '123'); - await tester.tap(find.byType(ElevatedButton)); - await tester.pump(); - - expect(find.byType(ElevatedButton), findsNothing); - expect(find.byType(CircularProgressIndicator), findsOneWidget); - }, - a11yExclusions: {A11yExclusion.multipleNodesWithSameLabel}, - ); - - testWidgetsWithAccessibilityChecks( - 'Displays error message on masquerade fail', - (tester) async { - Completer completer = Completer(); - when(interactor.startMasquerading(any, any)).thenAnswer((_) => completer.future); - - await tester.pumpWidget(TestApp(MasqueradeScreen())); - await tester.pump(); - - // Enter a user id and press the button - await tester.enterText(find.byKey(userIdKey), '123'); - await tester.tap(find.byType(ElevatedButton)); - await tester.pump(); - - // Should show loading state - expect(find.byType(ElevatedButton), findsNothing); - expect(find.byType(CircularProgressIndicator), findsOneWidget); - - completer.complete(false); - await tester.pump(); - - // Should show error message and no loading state - expect(find.text(l10n.actAsUserError), findsOneWidget); - expect(find.byType(ElevatedButton), findsOneWidget); - expect(find.byType(CircularProgressIndicator), findsNothing); - }, - a11yExclusions: {A11yExclusion.multipleNodesWithSameLabel}, - ); - - testWidgetsWithAccessibilityChecks( - 'Respawns on masquerade success', - (tester) async { - when(interactor.getDomain()).thenReturn(siteAdminDomain); - when(interactor.startMasquerading(any, any)).thenAnswer((_) async => true); - - await tester.pumpWidget(TestApp(MasqueradeScreen())); - await tester.pump(); - - // Enter data and tap the button - await tester.enterText(find.byKey(domainKey), normalDomain); - await tester.enterText(find.byKey(userIdKey), '123'); - await tester.tap(find.byType(ElevatedButton)); - await tester.pumpAndSettle(); - - // Respawn should have created a new screen with empty fields - TextField domainInput = tester.widget(find.byKey(domainKey)); - expect(domainInput.controller?.text, isEmpty); - - TextField userIdInput = tester.widget(find.byKey(userIdKey)); - expect(userIdInput.controller?.text, isEmpty); - }, - a11yExclusions: {A11yExclusion.multipleNodesWithSameLabel}, - ); -} diff --git a/apps/flutter_parent/test/screens/not_a_parent_screen_test.dart b/apps/flutter_parent/test/screens/not_a_parent_screen_test.dart deleted file mode 100644 index cb468b7e83..0000000000 --- a/apps/flutter_parent/test/screens/not_a_parent_screen_test.dart +++ /dev/null @@ -1,123 +0,0 @@ -// Copyright (C) 2019 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:flutter_parent/l10n/app_localizations.dart'; -import 'package:flutter_parent/models/login.dart'; -import 'package:flutter_parent/models/user.dart'; -import 'package:flutter_parent/network/api/auth_api.dart'; -import 'package:flutter_parent/router/panda_router.dart'; -import 'package:flutter_parent/screens/not_a_parent_screen.dart'; -import 'package:flutter_parent/utils/db/calendar_filter_db.dart'; -import 'package:flutter_parent/utils/db/reminder_db.dart'; -import 'package:flutter_parent/utils/notification_util.dart'; -import 'package:flutter_parent/utils/quick_nav.dart'; -import 'package:flutter_parent/utils/url_launcher.dart'; -import 'package:flutter_svg/svg.dart'; -import 'package:flutter_test/flutter_test.dart'; -import 'package:mockito/mockito.dart'; - -import '../utils/accessibility_utils.dart'; -import '../utils/platform_config.dart'; -import '../utils/test_app.dart'; -import '../utils/test_helpers/mock_helpers.mocks.dart'; - -void main() { - AppLocalizations l10n = AppLocalizations(); - - testWidgetsWithAccessibilityChecks('Displays panda, text, and buttons', (tester) async { - await tester.pumpWidget(TestApp(NotAParentScreen())); - await tester.pump(); - - expect(find.byType(SvgPicture), findsOneWidget); // Panda image - expect(find.text(l10n.notAParentTitle), findsOneWidget); // Title - expect(find.text(l10n.notAParentSubtitle), findsOneWidget); // Subtitle - expect(find.text(l10n.returnToLogin), findsOneWidget); // 'Return to Login' button - expect(find.text(l10n.studentOrTeacherTitle), findsOneWidget); // 'Student or teacher' button - }); - - testWidgetsWithAccessibilityChecks('Can return to login', (tester) async { - final mockNav = MockQuickNav(); - setupTestLocator((locator) { - locator.registerLazySingleton(() => mockNav); - locator.registerLazySingleton(() => MockReminderDb()); - locator.registerLazySingleton(() => MockNotificationUtil()); - locator.registerLazySingleton(() => MockCalendarFilterDb()); - locator.registerLazySingleton(() => MockAuthApi()); - }); - - await tester.pumpWidget(TestApp( - NotAParentScreen(), - platformConfig: PlatformConfig(initLoggedInUser: Login((b) => b..user = User((u) => u..id = '123').toBuilder())), - )); - await tester.pump(); - - expect(find.text(l10n.returnToLogin), findsOneWidget); - await tester.tap(find.text(l10n.returnToLogin)); - await tester.pump(); - - verify(mockNav.pushRouteAndClearStack(any, PandaRouter.login())); - }); - - testWidgetsWithAccessibilityChecks('Expands to show app options', (tester) async { - await tester.pumpWidget(TestApp(NotAParentScreen())); - await tester.pump(); - - // Tap 'Are you a student or teacher?' button and wait for options to animate open - await tester.tap(find.text(l10n.studentOrTeacherTitle)); - await tester.pumpAndSettle(); - - expect(find.text(l10n.studentOrTeacherTitle), findsOneWidget); // 'Student or teacher' button - expect(find.text(l10n.studentOrTeacherSubtitle), findsOneWidget); // App options text - expect(find.bySemanticsLabel(l10n.canvasStudentApp), findsOneWidget); // Student app button - expect(find.bySemanticsLabel(l10n.canvasTeacherApp), findsOneWidget); // Teacher app button - }); - - testWidgetsWithAccessibilityChecks('Launches intent to open student app in play store', (tester) async { - var mockLauncher = MockUrlLauncher(); - setupTestLocator((locator) => locator.registerLazySingleton(() => mockLauncher)); - - await tester.pumpWidget(TestApp(NotAParentScreen())); - await tester.pump(); - - // Tap 'Are you a student or teacher?' button and wait for options to animate open - await tester.tap(find.text(l10n.studentOrTeacherTitle)); - await tester.pumpAndSettle(); - - // Tap the student app button - await tester.tap(find.text(l10n.studentApp)); - await tester.pump(); - - var actualUrl = verify(mockLauncher.launch(captureAny)).captured[0]; - expect(actualUrl, 'market://details?id=com.instructure.candroid'); - }); - - testWidgetsWithAccessibilityChecks('Launches intent to open teacher app in play store', (tester) async { - var mockLauncher = MockUrlLauncher(); - setupTestLocator((locator) => locator.registerLazySingleton(() => mockLauncher)); - - await tester.pumpWidget(TestApp(NotAParentScreen())); - await tester.pump(); - - // Tap 'Are you a student or teacher?' button and wait for options to animate open - await tester.tap(find.text(l10n.studentOrTeacherTitle)); - await tester.pumpAndSettle(); - - // Tap the student app button - await tester.tap(find.text(l10n.teacherApp)); - await tester.pump(); - - var actualUrl = verify(mockLauncher.launch(captureAny)).captured[0]; - expect(actualUrl, 'market://details?id=com.instructure.teacher'); - }); -} \ No newline at end of file diff --git a/apps/flutter_parent/test/screens/pairing/pairing_code_dialog_test.dart b/apps/flutter_parent/test/screens/pairing/pairing_code_dialog_test.dart deleted file mode 100644 index 9c2bd1e9a8..0000000000 --- a/apps/flutter_parent/test/screens/pairing/pairing_code_dialog_test.dart +++ /dev/null @@ -1,109 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:flutter/material.dart'; -import 'package:flutter_parent/l10n/app_localizations.dart'; -import 'package:flutter_parent/screens/pairing/pairing_code_dialog.dart'; -import 'package:flutter_parent/screens/pairing/pairing_interactor.dart'; -import 'package:flutter_test/flutter_test.dart'; -import 'package:mockito/mockito.dart'; - -import '../../utils/accessibility_utils.dart'; -import '../../utils/test_app.dart'; -import '../../utils/test_helpers/mock_helpers.dart'; -import '../../utils/test_helpers/mock_helpers.mocks.dart'; -import 'pairing_util_test.dart'; - -void main() { - AppLocalizations l10n = AppLocalizations(); - - MockPairingInteractor interactor = MockPairingInteractor(); - - setupTestLocator((locator) { - locator.registerLazySingleton(() => interactor); - }); - - setUp(() { - reset(interactor); - }); - - testWidgetsWithAccessibilityChecks('Displays UI elements', (tester) async { - await tester.pumpWidget(TestApp(DummyWidget())); - await tester.pumpAndSettle(); - - BuildContext context = tester.state(find.byType(DummyWidget)).context; - showDialog(context: context, builder: (_) => PairingCodeDialog(null)); - await tester.pumpAndSettle(); - - // Title - expect(find.text(l10n.addStudent), findsOneWidget); - - // Message - expect(find.text(l10n.pairingCodeEntryExplanation), findsOneWidget); - - // Input - expect(find.byType(TextFormField), findsOneWidget); - - // Buttons - var button = find.byType(TextButton); - expect(find.descendant(of: button, matching: find.text(l10n.cancel.toUpperCase())), findsOneWidget); - expect(find.descendant(of: button, matching: find.text(l10n.ok.toUpperCase())), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('Displays error on fail', (tester) async { - await tester.pumpWidget(TestApp(DummyWidget())); - await tester.pumpAndSettle(); - - BuildContext context = tester.state(find.byType(DummyWidget)).context; - showDialog(context: context, builder: (_) => PairingCodeDialog(null)); - await tester.pumpAndSettle(); - - when(interactor.pairWithStudent(any)).thenAnswer((_) async => false); - await tester.tap(find.text(l10n.ok)); - await tester.pumpAndSettle(); - - expect(find.text(l10n.errorPairingFailed), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('screen returns true when paired successfully', (tester) async { - await tester.pumpWidget(TestApp(DummyWidget())); - await tester.pumpAndSettle(); - - BuildContext context = tester.state(find.byType(DummyWidget)).context; - var dialogFuture = showDialog(context: context, builder: (_) => PairingCodeDialog(null)); - await tester.pumpAndSettle(); - - when(interactor.pairWithStudent(any)).thenAnswer((_) async => true); - await tester.tap(find.text(l10n.ok)); - await tester.pumpAndSettle(); - - expect(await dialogFuture, isTrue); - expect(find.byType(PairingCodeDialog), findsNothing); - }); - - testWidgetsWithAccessibilityChecks('screen returns false when no pairing performed', (tester) async { - await tester.pumpWidget(TestApp(DummyWidget())); - await tester.pumpAndSettle(); - - BuildContext context = tester.state(find.byType(DummyWidget)).context; - var dialogFuture = showDialog(context: context, builder: (_) => PairingCodeDialog(null)); - await tester.pumpAndSettle(); - - await tester.tap(find.text(l10n.cancel.toUpperCase())); - await tester.pumpAndSettle(); - - expect(await dialogFuture, isFalse); - expect(find.byType(PairingCodeDialog), findsNothing); - }); -} diff --git a/apps/flutter_parent/test/screens/pairing/pairing_interactor_test.dart b/apps/flutter_parent/test/screens/pairing/pairing_interactor_test.dart deleted file mode 100644 index 88882e0382..0000000000 --- a/apps/flutter_parent/test/screens/pairing/pairing_interactor_test.dart +++ /dev/null @@ -1,55 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:barcode_scan2/barcode_scan2.dart'; -import 'package:flutter_parent/network/api/enrollments_api.dart'; -import 'package:flutter_parent/screens/pairing/pairing_interactor.dart'; -import 'package:flutter_parent/utils/qr_utils.dart'; -import 'package:flutter_parent/utils/veneers/barcode_scan_veneer.dart'; -import 'package:flutter_test/flutter_test.dart'; -import 'package:mockito/mockito.dart'; - -import '../../utils/test_app.dart'; -import '../../utils/test_helpers/mock_helpers.dart'; -import '../../utils/test_helpers/mock_helpers.mocks.dart'; - -void main() { - MockBarcodeScanVeneer scanner = MockBarcodeScanVeneer(); - MockEnrollmentsApi enrollmentsApi = MockEnrollmentsApi(); - - setupTestLocator((locator) { - locator.registerLazySingleton(() => scanner); - locator.registerLazySingleton(() => enrollmentsApi); - }); - - setUp(() { - reset(scanner); - reset(enrollmentsApi); - }); - - test('scanQRCode calls barcode scan veneer', () async { - when(scanner.scanBarcode()).thenAnswer((_) async => ScanResult(type: ResultType.Error)); - var result = await PairingInteractor().scanQRCode(); - verify(scanner.scanBarcode()); - expect(result, isA()); - }); - - test('pairWithStudent calls EnrollmentsApi', () async { - String pairingCode = '123aBc'; - when(enrollmentsApi.pairWithStudent(any)).thenAnswer((_) async => true); - var result = await PairingInteractor().pairWithStudent(pairingCode); - verify(enrollmentsApi.pairWithStudent(pairingCode)); - expect(result, isTrue); - }); -} diff --git a/apps/flutter_parent/test/screens/pairing/pairing_util_test.dart b/apps/flutter_parent/test/screens/pairing/pairing_util_test.dart deleted file mode 100644 index d6af326024..0000000000 --- a/apps/flutter_parent/test/screens/pairing/pairing_util_test.dart +++ /dev/null @@ -1,172 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:flutter/material.dart'; -import 'package:flutter_parent/l10n/app_localizations.dart'; -import 'package:flutter_parent/network/utils/api_prefs.dart'; -import 'package:flutter_parent/router/panda_router.dart'; -import 'package:flutter_parent/screens/pairing/pairing_util.dart'; -import 'package:flutter_parent/utils/quick_nav.dart'; -import 'package:flutter_test/flutter_test.dart'; -import 'package:mockito/mockito.dart'; - -import '../../utils/accessibility_utils.dart'; -import '../../utils/platform_config.dart'; -import '../../utils/test_app.dart'; -import '../../utils/test_helpers/mock_helpers.dart'; -import '../../utils/test_helpers/mock_helpers.mocks.dart'; - -void main() { - AppLocalizations l10n = AppLocalizations(); - - MockQuickNav nav = MockQuickNav(); - - setupTestLocator((locator) { - locator.registerLazySingleton(() => nav); - }); - - setUp(() async { - final mockRemoteConfig = setupMockRemoteConfig(valueSettings: {'qr_pair_observer_enabled': 'true'}); - await setupPlatformChannels(config: PlatformConfig(initRemoteConfig: mockRemoteConfig)); - reset(nav); - }); - - testWidgetsWithAccessibilityChecks('Displays Pairing Code and QR options if device has cameras', (tester) async { - await tester.pumpWidget(TestApp(DummyWidget())); - await tester.pumpAndSettle(); - - ApiPrefs.setCameraCount(1); - - BuildContext context = tester.state(find.byType(DummyWidget)).context; - PairingUtil().pairNewStudent(context, () => null); - await tester.pumpAndSettle(); - - expect(find.text(l10n.pairingCode), findsOneWidget); - expect(find.text(l10n.qrCode), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('Only displays Pairing Code option if device has no cameras', (tester) async { - await tester.pumpWidget(TestApp(DummyWidget())); - await tester.pump(); - - ApiPrefs.setCameraCount(0); - - BuildContext context = tester.state(find.byType(DummyWidget)).context; - PairingUtil().pairNewStudent(context, () => {}); - await tester.pumpAndSettle(); - - expect(find.text(l10n.pairingCode), findsOneWidget); - expect(find.text(l10n.qrCode), findsNothing); - }); - - testWidgetsWithAccessibilityChecks('Pairing Code option opens dialog', (tester) async { - await tester.pumpWidget(TestApp(DummyWidget())); - await tester.pumpAndSettle(); - - BuildContext context = tester.state(find.byType(DummyWidget)).context; - PairingUtil().pairNewStudent(context, () => null); - await tester.pumpAndSettle(); - - when( - nav.showDialog( - context: anyNamed('context'), - barrierDismissible: anyNamed('barrierDismissible'), - builder: anyNamed('builder'), - ), - ).thenAnswer((_) async => true); - - await tester.tap(find.text(l10n.pairingCode)); - await tester.pumpAndSettle(); - - verify( - nav.showDialog( - context: anyNamed('context'), - barrierDismissible: anyNamed('barrierDismissible'), - builder: anyNamed('builder'), - ) - ); - }); - - testWidgetsWithAccessibilityChecks('QR Code option navigates to QR pairing screen', (tester) async { - await tester.pumpWidget(TestApp(DummyWidget())); - await tester.pumpAndSettle(); - - ApiPrefs.setCameraCount(1); - - BuildContext context = tester.state(find.byType(DummyWidget)).context; - PairingUtil().pairNewStudent(context, () => null); - await tester.pumpAndSettle(); - - await tester.tap(find.text(l10n.qrCode)); - await tester.pumpAndSettle(); - - logInvocations([nav]); - - verify(nav.pushRoute(any, PandaRouter.qrPairing())); - }); - - testWidgetsWithAccessibilityChecks('Pairing Code success calls onSuccess', (tester) async { - await tester.pumpWidget(TestApp(DummyWidget())); - await tester.pumpAndSettle(); - - bool onSuccessCalled = false; - - BuildContext context = tester.state(find.byType(DummyWidget)).context; - PairingUtil().pairNewStudent(context, () => onSuccessCalled = true); - await tester.pumpAndSettle(); - - when( - nav.showDialog( - context: anyNamed('context'), - barrierDismissible: anyNamed('barrierDismissible'), - builder: anyNamed('builder'), - ), - ).thenAnswer((_) async => true); - - await tester.tap(find.text(l10n.pairingCode)); - await tester.pumpAndSettle(); - - expect(onSuccessCalled, isTrue); - }); - - testWidgetsWithAccessibilityChecks('QR Code success calls onSuccess', (tester) async { - await tester.pumpWidget(TestApp(DummyWidget())); - await tester.pumpAndSettle(); - - ApiPrefs.setCameraCount(1); - - bool onSuccessCalled = false; - - BuildContext context = tester.state(find.byType(DummyWidget)).context; - PairingUtil().pairNewStudent(context, () => onSuccessCalled = true); - await tester.pumpAndSettle(); - - when(nav.pushRoute(any, PandaRouter.qrPairing())).thenAnswer((_) async => true); - - await tester.tap(find.text(l10n.qrCode)); - await tester.pumpAndSettle(); - - expect(onSuccessCalled, isTrue); - }); -} - -class DummyWidget extends StatefulWidget { - @override - _DummyWidgetState createState() => _DummyWidgetState(); -} - -class _DummyWidgetState extends State { - @override - Widget build(Object context) => Material(); -} diff --git a/apps/flutter_parent/test/screens/pairing/qr_pairing_screen_test.dart b/apps/flutter_parent/test/screens/pairing/qr_pairing_screen_test.dart deleted file mode 100644 index 62a31947b8..0000000000 --- a/apps/flutter_parent/test/screens/pairing/qr_pairing_screen_test.dart +++ /dev/null @@ -1,277 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'dart:async'; - -import 'package:flutter/cupertino.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_parent/l10n/app_localizations.dart'; -import 'package:flutter_parent/models/login.dart'; -import 'package:flutter_parent/router/panda_router.dart'; -import 'package:flutter_parent/screens/pairing/pairing_interactor.dart'; -import 'package:flutter_parent/screens/pairing/pairing_util.dart'; -import 'package:flutter_parent/screens/pairing/qr_pairing_screen.dart'; -import 'package:flutter_parent/utils/common_widgets/empty_panda_widget.dart'; -import 'package:flutter_parent/utils/qr_utils.dart'; -import 'package:flutter_parent/utils/quick_nav.dart'; -import 'package:flutter_test/flutter_test.dart'; -import 'package:mockito/mockito.dart'; - -import '../../utils/accessibility_utils.dart'; -import '../../utils/canvas_model_utils.dart'; -import '../../utils/platform_config.dart'; -import '../../utils/test_app.dart'; -import '../../utils/test_helpers/mock_helpers.dart'; -import '../../utils/test_helpers/mock_helpers.mocks.dart'; -import 'pairing_util_test.dart'; - -void main() { - AppLocalizations l10n = AppLocalizations(); - - MockPairingInteractor interactor = MockPairingInteractor(); - MockQuickNav nav = MockQuickNav(); - MockStudentAddedNotifier studentAddedNotifier = MockStudentAddedNotifier(); - - setupTestLocator((locator) { - locator.registerLazySingleton(() => interactor); - locator.registerLazySingleton(() => nav); - locator.registerLazySingleton(() => studentAddedNotifier); - }); - - setUp(() { - reset(interactor); - reset(nav); - reset(studentAddedNotifier); - }); - - testWidgetsWithAccessibilityChecks('Displays tutorial', (tester) async { - await tester.pumpWidget(TestApp(QRPairingScreen())); - await tester.pumpAndSettle(); - - expect(find.text(l10n.qrPairingTutorialTitle), findsOneWidget); - expect(find.text(l10n.qrPairingTutorialMessage), findsOneWidget); - expect(find.byType(Image), findsOneWidget); - expect(find.text(l10n.next.toUpperCase()), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('Displays pairing state', (tester) async { - await tester.pumpWidget(TestApp(QRPairingScreen())); - await tester.pumpAndSettle(); - - when(interactor.scanQRCode()).thenAnswer((_) async => QRPairingScanResult.success('', '', '')); - - Completer completer = Completer(); - when(interactor.pairWithStudent(any)).thenAnswer((_) async => completer.future); - - await tester.tap(find.text(l10n.next.toUpperCase())); - await tester.pump(); - - expect(find.byType(CircularProgressIndicator), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('Pops with true value on success', (tester) async { - when(interactor.scanQRCode()).thenAnswer((_) async => QRPairingScanResult.success('', '', '')); - when(interactor.pairWithStudent(any)).thenAnswer((_) async => true); - - await tester.pumpWidget(TestApp(DummyWidget())); - await tester.pumpAndSettle(); - - BuildContext context = tester.state(find.byType(DummyWidget)).context; - var pairingFuture = QuickNav().push(context, QRPairingScreen()); - await tester.pumpAndSettle(); - - await tester.tap(find.text(l10n.next.toUpperCase())); - await tester.pumpAndSettle(); - - expect(find.byType(QRPairingScreen), findsNothing); - expect(await pairingFuture, isTrue); - verify(studentAddedNotifier.notify()); - }); - - testWidgetsWithAccessibilityChecks('Navigates to splash screen on success if first route', (tester) async { - when(interactor.pairWithStudent(any)).thenAnswer((_) async => true); - - await tester.pumpWidget(TestApp(QRPairingScreen(pairingInfo: QRPairingScanResult.success('', '', '') as QRPairingInfo))); - await tester.pump(); - - verify(nav.replaceRoute(any, PandaRouter.rootSplash())); - }); - - testWidgetsWithAccessibilityChecks('Navigates to account creation screen on success if is account creation', - (tester) async { - var code = '123'; - var domain = 'hodor.com'; - var accountId = '12345'; - when(interactor.scanQRCode()).thenAnswer((_) async => QRPairingScanResult.success(code, domain, accountId)); - - await tester.pumpWidget(TestApp(DummyWidget())); - await tester.pumpAndSettle(); - - BuildContext context = tester.state(find.byType(DummyWidget)).context; - QuickNav().push(context, QRPairingScreen(isCreatingAccount: true)); - await tester.pumpAndSettle(); - - await tester.tap(find.text(l10n.next.toUpperCase())); - await tester.pumpAndSettle(); - - verify(nav.pushRoute(any, PandaRouter.accountCreation(code, domain, accountId))); - }); - - testWidgetsWithAccessibilityChecks('Displays camera permission error', (tester) async { - await tester.pumpWidget(TestApp(QRPairingScreen())); - await tester.pumpAndSettle(); - - when(interactor.scanQRCode()) - .thenAnswer((_) async => QRPairingScanResult.error(QRPairingScanErrorType.cameraError)); - - await tester.tap(find.text(l10n.next.toUpperCase())); - await tester.pump(); - - expect(find.byType(EmptyPandaWidget), findsOneWidget); - expect(find.text(l10n.qrPairingCameraPermissionTitle), findsOneWidget); - expect(find.text(l10n.qrCodeNoCameraError), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('Displays invalid QR error', (tester) async { - await tester.pumpWidget(TestApp(QRPairingScreen())); - await tester.pumpAndSettle(); - - when(interactor.scanQRCode()) - .thenAnswer((_) async => QRPairingScanResult.error(QRPairingScanErrorType.invalidCode)); - - await tester.tap(find.text(l10n.next.toUpperCase())); - await tester.pump(); - - expect(find.byType(EmptyPandaWidget), findsOneWidget); - expect(find.text(l10n.qrPairingInvalidCodeTitle), findsOneWidget); - expect(find.text(l10n.invalidQRCodeError), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('Displays unknown error', (tester) async { - await tester.pumpWidget(TestApp(QRPairingScreen())); - await tester.pumpAndSettle(); - - when(interactor.scanQRCode()).thenAnswer((_) async => QRPairingScanResult.error(QRPairingScanErrorType.unknown)); - - await tester.tap(find.text(l10n.next.toUpperCase())); - await tester.pump(); - - expect(find.byType(EmptyPandaWidget), findsOneWidget); - expect(find.text(l10n.qrPairingFailedTitle), findsOneWidget); - expect(find.text(l10n.qrPairingFailedSubtitle), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('Does not show error if scan is canceled', (tester) async { - await tester.pumpWidget(TestApp(QRPairingScreen())); - await tester.pumpAndSettle(); - - when(interactor.scanQRCode()).thenAnswer((_) async => QRPairingScanResult.error(QRPairingScanErrorType.canceled)); - - await tester.tap(find.text(l10n.next.toUpperCase())); - await tester.pump(); - - expect(find.byType(EmptyPandaWidget), findsNothing); - expect(find.text(l10n.qrPairingTutorialMessage), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('Displays network error', (tester) async { - await tester.pumpWidget(TestApp(QRPairingScreen())); - await tester.pumpAndSettle(); - - when(interactor.scanQRCode()).thenAnswer((_) async => QRPairingScanResult.success('', '', '')); - when(interactor.pairWithStudent(any)).thenAnswer((_) async => null); // null represents network error - - await tester.tap(find.text(l10n.next.toUpperCase())); - await tester.pumpAndSettle(); - - expect(find.byType(EmptyPandaWidget), findsOneWidget); - expect(find.text(l10n.genericNetworkError), findsOneWidget); - expect(find.text(l10n.qrPairingNetworkError), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('Displays pairing failure error', (tester) async { - await tester.pumpWidget(TestApp(QRPairingScreen())); - await tester.pumpAndSettle(); - - when(interactor.scanQRCode()).thenAnswer((_) async => QRPairingScanResult.success('', '', '')); - when(interactor.pairWithStudent(any)).thenAnswer((_) async => false); // false represents pairing failure - - await tester.tap(find.text(l10n.next.toUpperCase())); - await tester.pumpAndSettle(); - - expect(find.byType(EmptyPandaWidget), findsOneWidget); - expect(find.text(l10n.qrPairingFailedTitle), findsOneWidget); - expect(find.text(l10n.qrPairingFailedSubtitle), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('Displays incorrect domain error', (tester) async { - Login login = Login((b) => b - ..user = CanvasModelTestUtils.mockUser().toBuilder() - ..accessToken = 'token' - ..domain = 'test.instructure.com'); - - await tester.pumpWidget(TestApp( - QRPairingScreen(), - platformConfig: PlatformConfig(initLoggedInUser: login), - )); - await tester.pumpAndSettle(); - - when(interactor.scanQRCode()) - .thenAnswer((_) async => QRPairingScanResult.success('123abc', 'other.instructure.com', '123')); - when(interactor.pairWithStudent(any)).thenAnswer((_) async => false); - - await tester.tap(find.text(l10n.next.toUpperCase())); - await tester.pumpAndSettle(); - - expect(find.byType(EmptyPandaWidget), findsOneWidget); - expect(find.text(l10n.qrPairingWrongDomainTitle), findsOneWidget); - expect(find.text(l10n.qrPairingWrongDomainSubtitle), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('Error state allows retry', (tester) async { - await tester.pumpWidget(TestApp(QRPairingScreen())); - await tester.pumpAndSettle(); - - when(interactor.scanQRCode()).thenAnswer((_) async => QRPairingScanResult.success('', '', '')); - when(interactor.pairWithStudent(any)).thenAnswer((_) async => null); - - await tester.tap(find.text(l10n.next.toUpperCase())); - await tester.pumpAndSettle(); - - // Should show network error - expect(find.byType(EmptyPandaWidget), findsOneWidget); - expect(find.text(l10n.genericNetworkError), findsOneWidget); - expect(find.text(l10n.qrPairingNetworkError), findsOneWidget); - - when(interactor.scanQRCode()) - .thenAnswer((_) async => QRPairingScanResult.error(QRPairingScanErrorType.invalidCode)); - - // Tap retry - await tester.tap(find.text(l10n.retry)); - await tester.pumpAndSettle(); - - // Should now show invalid code error - expect(find.byType(EmptyPandaWidget), findsOneWidget); - expect(find.text(l10n.qrPairingInvalidCodeTitle), findsOneWidget); - expect(find.text(l10n.invalidQRCodeError), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('Initiates pairing on launch if pairing info is provided', (tester) async { - QRPairingInfo pairingInfo = QRPairingScanResult.success('123acb', '', '') as QRPairingInfo; - await tester.pumpWidget(TestApp(QRPairingScreen(pairingInfo: pairingInfo))); - await tester.pump(); - - verify(interactor.pairWithStudent(pairingInfo.code)); - }); -} diff --git a/apps/flutter_parent/test/screens/remote_config_params/remote_config_interactor_test.dart b/apps/flutter_parent/test/screens/remote_config_params/remote_config_interactor_test.dart deleted file mode 100644 index 04be99ec7a..0000000000 --- a/apps/flutter_parent/test/screens/remote_config_params/remote_config_interactor_test.dart +++ /dev/null @@ -1,31 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -import 'package:flutter/widgets.dart'; -import 'package:flutter_parent/screens/remote_config/remote_config_interactor.dart'; -import 'package:flutter_parent/utils/remote_config_utils.dart'; -import 'package:flutter_test/flutter_test.dart'; -import 'package:mockito/mockito.dart'; - -import '../../utils/platform_config.dart'; -import '../../utils/test_app.dart'; -import '../../utils/test_helpers/mock_helpers.dart'; - -void main() { - test('getRemoteConfigParams returns correct map', () async { - final mockRemoteConfig = setupMockRemoteConfig(valueSettings: {'test_string': 'fetched value', 'mobile_verify_beta_enabled' : 'false'}); - await setupPlatformChannels( - config: PlatformConfig(initRemoteConfig: mockRemoteConfig)); - expect(RemoteConfigInteractor().getRemoteConfigParams(), equals({RemoteConfigParams.TEST_STRING: 'fetched value', RemoteConfigParams.MOBILE_VERIFY_BETA_ENABLED: 'false'})); - }); -} \ No newline at end of file diff --git a/apps/flutter_parent/test/screens/remote_config_params/remote_config_screen_test.dart b/apps/flutter_parent/test/screens/remote_config_params/remote_config_screen_test.dart deleted file mode 100644 index ea11ba657e..0000000000 --- a/apps/flutter_parent/test/screens/remote_config_params/remote_config_screen_test.dart +++ /dev/null @@ -1,49 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:flutter/widgets.dart'; -import 'package:flutter_parent/screens/remote_config/remote_config_interactor.dart'; -import 'package:flutter_parent/screens/remote_config/remote_config_screen.dart'; -import 'package:flutter_parent/utils/remote_config_utils.dart'; -import 'package:flutter_test/flutter_test.dart'; -import 'package:mockito/mockito.dart'; - -import '../../utils/accessibility_utils.dart'; -import '../../utils/platform_config.dart'; -import '../../utils/test_app.dart'; -import '../../utils/test_helpers/mock_helpers.dart'; -import '../../utils/test_helpers/mock_helpers.mocks.dart'; - -void main() { - - testWidgetsWithAccessibilityChecks('Shows the correct list', (tester) async { - var interactor = MockRemoteConfigInteractor(); - setupTestLocator((locator) => locator.registerFactory(() => interactor)); - - Map remoteConfigs = { - RemoteConfigParams.MOBILE_VERIFY_BETA_ENABLED: 'false', - RemoteConfigParams.TEST_STRING: 'fetched value' - }; - - when(interactor.getRemoteConfigParams()).thenReturn(remoteConfigs); - - await tester.pumpWidget(TestApp(RemoteConfigScreen())); - await tester.pumpAndSettle(); - - expect(find.text(RemoteConfigUtils.getRemoteConfigName(RemoteConfigParams.MOBILE_VERIFY_BETA_ENABLED)), findsOneWidget); - expect(find.text('false'), findsOneWidget); - expect(find.text(RemoteConfigUtils.getRemoteConfigName(RemoteConfigParams.TEST_STRING)), findsOneWidget); - expect(find.text('fetched value'), findsOneWidget); - }); -} diff --git a/apps/flutter_parent/test/screens/settings/legal_screen_test.dart b/apps/flutter_parent/test/screens/settings/legal_screen_test.dart deleted file mode 100644 index bd6ce8d482..0000000000 --- a/apps/flutter_parent/test/screens/settings/legal_screen_test.dart +++ /dev/null @@ -1,78 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -import 'package:flutter_parent/l10n/app_localizations.dart'; -import 'package:flutter_parent/router/panda_router.dart'; -import 'package:flutter_parent/screens/settings/legal_screen.dart'; -import 'package:flutter_parent/utils/quick_nav.dart'; -import 'package:flutter_parent/utils/url_launcher.dart'; -import 'package:flutter_test/flutter_test.dart'; -import 'package:mockito/mockito.dart'; - -import '../../utils/accessibility_utils.dart'; -import '../../utils/test_app.dart'; -import '../../utils/test_helpers/mock_helpers.mocks.dart'; - -void main() { - final l10n = AppLocalizations(); - - testWidgetsWithAccessibilityChecks('displays all options', (tester) async { - await tester.pumpWidget(TestApp(LegalScreen())); - await tester.pump(); - - expect(find.text(l10n.helpLegalLabel), findsOneWidget); - - expect(find.text(l10n.privacyPolicy), findsOneWidget); - expect(find.text(l10n.termsOfUse), findsOneWidget); - expect(find.text(l10n.canvasOnGithub), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('tapping privacy policy launches url', (tester) async { - var mockLauncher = MockUrlLauncher(); - setupTestLocator((locator) => locator.registerLazySingleton(() => mockLauncher)); - - await tester.pumpWidget(TestApp(LegalScreen())); - await tester.pump(); - - await tester.tap(find.text(l10n.privacyPolicy)); - await tester.pumpAndSettle(); - - verify(mockLauncher.launch('https://www.instructure.com/policies/product-privacy-policy')).called(1); - }); - - testWidgetsWithAccessibilityChecks('tapping github launches url', (tester) async { - var mockLauncher = MockUrlLauncher(); - setupTestLocator((locator) => locator.registerLazySingleton(() => mockLauncher)); - - await tester.pumpWidget(TestApp(LegalScreen())); - await tester.pump(); - - await tester.tap(find.text(l10n.canvasOnGithub)); - await tester.pumpAndSettle(); - - verify(mockLauncher.launch('https://github.com/instructure/canvas-android')).called(1); - }); - - testWidgetsWithAccessibilityChecks('tapping terms of use navigates to Terms of Use screen', (tester) async { - final nav = MockQuickNav(); - setupTestLocator((locator) => locator.registerSingleton(nav)); - - await tester.pumpWidget(TestApp(LegalScreen())); - await tester.pump(); - - await tester.tap(find.text(l10n.termsOfUse)); - await tester.pumpAndSettle(); - - verify(nav.pushRoute(any, argThat(matches(PandaRouter.termsOfUse())))); - }); -} \ No newline at end of file diff --git a/apps/flutter_parent/test/screens/settings/settings_interactor_test.dart b/apps/flutter_parent/test/screens/settings/settings_interactor_test.dart deleted file mode 100644 index 820183aa22..0000000000 --- a/apps/flutter_parent/test/screens/settings/settings_interactor_test.dart +++ /dev/null @@ -1,117 +0,0 @@ -// Copyright (C) 2019 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:flutter/material.dart'; -import 'package:flutter_parent/network/utils/analytics.dart'; -import 'package:flutter_parent/router/panda_router.dart'; -import 'package:flutter_parent/screens/remote_config/remote_config_screen.dart'; -import 'package:flutter_parent/screens/settings/settings_interactor.dart'; -import 'package:flutter_parent/screens/theme_viewer_screen.dart'; -import 'package:flutter_parent/utils/design/parent_theme.dart'; -import 'package:flutter_parent/utils/quick_nav.dart'; -import 'package:flutter_test/flutter_test.dart'; -import 'package:mockito/mockito.dart'; - -import '../../utils/accessibility_utils.dart'; -import '../../utils/test_app.dart'; -import '../../utils/test_helpers/mock_helpers.mocks.dart'; - -void main() { - test('Returns true for debug mode', () { - // This test is just for coverage since there's no way to change the debug flag at test time - expect(SettingsInteractor().isDebugMode(), isTrue); - }); - - test('routeToThemeViewer call through to navigator', () async { - var nav = MockQuickNav(); - await setupTestLocator((locator) { - locator.registerLazySingleton(() => nav); - }); - - var context = MockBuildContext(); - SettingsInteractor().routeToThemeViewer(context); - - var screen = verify(nav.push(context, captureAny)).captured[0]; - expect(screen, isA()); - }); - - test('routeToRemoteConfig call through to navigator', () async { - var nav = MockQuickNav(); - await setupTestLocator((locator) { - locator.registerLazySingleton(() => nav); - }); - - var context = MockBuildContext(); - SettingsInteractor().routeToRemoteConfig(context); - - var screen = verify(nav.push(context, captureAny)).captured[0]; - expect(screen, isA()); - }); - - test('routeToLegal call through to navigator', () async { - var nav = MockQuickNav(); - await setupTestLocator((locator) { - locator.registerLazySingleton(() => nav); - }); - - var context = MockBuildContext(); - SettingsInteractor().routeToLegal(context); - - verify(nav.pushRoute(any, argThat(matches(PandaRouter.legal())))); - }); - - testNonWidgetsWithContext('toggle dark mode sets dark mode to true', (tester) async { - await setupPlatformChannels(); - final analytics = MockAnalytics(); - - await setupTestLocator((locator) => locator.registerLazySingleton(() => analytics)); - - await tester.pumpWidget(TestApp(Container())); - await tester.pumpAndSettle(); - - final context = tester.state(find.byType(MaterialApp)).context; - expect(ParentTheme.of(context)?.isDarkMode, false); - - SettingsInteractor().toggleDarkMode(context, null); - expect(ParentTheme.of(context)?.isDarkMode, true); - - SettingsInteractor().toggleDarkMode(context, null); - expect(ParentTheme.of(context)?.isDarkMode, false); - - verify(analytics.logEvent(AnalyticsEventConstants.DARK_MODE_OFF)).called(1); - verify(analytics.logEvent(AnalyticsEventConstants.DARK_MODE_ON)).called(1); - }); - - testNonWidgetsWithContext('toggle hc mode sets hc mode to true', (tester) async { - await setupPlatformChannels(); - final analytics = MockAnalytics(); - - await setupTestLocator((locator) => locator.registerLazySingleton(() => analytics)); - - await tester.pumpWidget(TestApp(Container())); - await tester.pumpAndSettle(); - - final context = tester.state(find.byType(MaterialApp)).context; - expect(ParentTheme.of(context)?.isHC, false); - - SettingsInteractor().toggleHCMode(context); - expect(ParentTheme.of(context)?.isHC, true); - - SettingsInteractor().toggleHCMode(context); - expect(ParentTheme.of(context)?.isHC, false); - - verify(analytics.logEvent(AnalyticsEventConstants.HC_MODE_OFF)).called(1); - verify(analytics.logEvent(AnalyticsEventConstants.HC_MODE_ON)).called(1); - }); -} \ No newline at end of file diff --git a/apps/flutter_parent/test/screens/settings/settings_screen_test.dart b/apps/flutter_parent/test/screens/settings/settings_screen_test.dart deleted file mode 100644 index 2b28e6a3da..0000000000 --- a/apps/flutter_parent/test/screens/settings/settings_screen_test.dart +++ /dev/null @@ -1,208 +0,0 @@ -// Copyright (C) 2019 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:flutter/material.dart'; -import 'package:flutter_parent/l10n/app_localizations.dart'; -import 'package:flutter_parent/network/utils/analytics.dart'; -import 'package:flutter_parent/screens/settings/settings_interactor.dart'; -import 'package:flutter_parent/screens/settings/settings_screen.dart'; -import 'package:flutter_parent/utils/design/parent_theme.dart'; -import 'package:flutter_test/flutter_test.dart'; -import 'package:mockito/mockito.dart'; - -import '../../utils/accessibility_utils.dart'; -import '../../utils/test_app.dart'; -import '../../utils/test_helpers/mock_helpers.mocks.dart'; -import '../../utils/test_utils.dart'; - -void main() { - late MockSettingsInteractor interactor; - final analytics = MockAnalytics(); - AppLocalizations l10n = AppLocalizations(); - - themeViewerButton() => find.byKey(Key('theme-viewer')); - remoteConfigsButton() => find.byKey(Key('remote-configs')); - darkModeButton() => find.byKey(Key('dark-mode-button')); - lightModeButton() => find.byKey(Key('light-mode-button')); - hcToggle() => find.text(l10n.highContrastLabel); - webViewDarkModeToggle() => find.text(l10n.webViewDarkModeLabel); - - setUpAll(() { - interactor = MockSettingsInteractor(); - when(interactor.isDebugMode()).thenReturn(true); - when(interactor.toggleDarkMode(any, any)).thenAnswer((invocation) { - ParentTheme.of(invocation.positionalArguments[0])?.toggleDarkMode(); - }); - when(interactor.toggleHCMode(any)).thenAnswer((invocation) { - ParentTheme.of(invocation.positionalArguments[0])?.toggleHC(); - }); - setupTestLocator((locator) { - locator.registerFactory(() => interactor); - locator.registerFactory(() => analytics); - }); - }); - - setUp(() { - reset(analytics); - }); - - testWidgetsWithAccessibilityChecks('Displays about button', (tester) async { - await tester.pumpWidget(TestApp(SettingsScreen())); - await tester.pumpAndSettle(); - expect(find.text(l10n.about), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('Displays legal button', (tester) async { - await tester.pumpWidget(TestApp(SettingsScreen())); - await tester.pumpAndSettle(); - expect(find.text(l10n.helpLegalLabel), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('Displays theme viewer button in debug mode', (tester) async { - await tester.pumpWidget(TestApp(SettingsScreen())); - await tester.pumpAndSettle(); - await ensureVisibleByScrolling(themeViewerButton(), tester, scrollFrom: ScreenVerticalLocation.MID_BOTTOM); - await tester.pumpAndSettle(); - expect(themeViewerButton(), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('Displays remote config params button in debug mode', (tester) async { - await tester.pumpWidget(TestApp(SettingsScreen())); - await tester.pumpAndSettle(); - await ensureVisibleByScrolling(themeViewerButton(), tester, scrollFrom: ScreenVerticalLocation.MID_BOTTOM); - await tester.pumpAndSettle(); - expect(remoteConfigsButton(), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('Hides theme viewer button in non-debug mode', (tester) async { - when(interactor.isDebugMode()).thenReturn(false); - await tester.pumpWidget(TestApp(SettingsScreen())); - await tester.pumpAndSettle(); - expect(themeViewerButton(), findsNothing); - }); - - testWidgetsWithAccessibilityChecks('Hide remote config params button in non-debug mode', (tester) async { - when(interactor.isDebugMode()).thenReturn(false); - await tester.pumpWidget(TestApp(SettingsScreen())); - await tester.pumpAndSettle(); - expect(remoteConfigsButton(), findsNothing); - }); - - testWidgetsWithAccessibilityChecks( - '(In light mode) Dark mode button is enabled, light mode button is disabled', - (tester) async { - await tester.pumpWidget(TestApp(SettingsScreen())); - await tester.pumpAndSettle(); - - InkWell lightMode = tester.widget(lightModeButton()); - InkWell darkMode = tester.widget(darkModeButton()); - - expect(darkMode.onTap, isNotNull); - expect(lightMode.onTap, isNull); - }, - ); - - testWidgetsWithAccessibilityChecks( - '(In dark mode) Dark mode button is disabled, light mode button is enabled', - (tester) async { - await tester.pumpWidget(TestApp(SettingsScreen(), darkMode: true)); - await tester.pumpAndSettle(); - - InkWell lightMode = tester.widget(lightModeButton()); - InkWell darkMode = tester.widget(darkModeButton()); - - expect(darkMode.onTap, isNull); - expect(lightMode.onTap, isNotNull); - }, - ); - - testWidgetsWithAccessibilityChecks('Switches to dark mode', (tester) async { - await tester.pumpWidget(TestApp(SettingsScreen())); - await tester.pumpAndSettle(); - - var state = tester.state(find.byType(SettingsScreen)); - expect(ParentTheme.of(state.context)?.isDarkMode, isFalse); - - await tester.tap(darkModeButton()); - await tester.pumpAndSettle(); - - state = tester.state(find.byType(SettingsScreen)); - expect(ParentTheme.of(state.context)?.isDarkMode, isTrue); - }); - - testWidgetsWithAccessibilityChecks('Switches to light mode', (tester) async { - await tester.pumpWidget(TestApp(SettingsScreen(), darkMode: true)); - await tester.pumpAndSettle(); - - var state = tester.state(find.byType(SettingsScreen)); - expect(ParentTheme.of(state.context)?.isDarkMode, isTrue); - - await tester.tap(lightModeButton()); - await tester.pumpAndSettle(); - - state = tester.state(find.byType(SettingsScreen)); - expect(ParentTheme.of(state.context)?.isDarkMode, isFalse); - }); - - testWidgetsWithAccessibilityChecks('Enables high contrast mode', (tester) async { - await tester.pumpWidget(TestApp(SettingsScreen())); - await tester.pumpAndSettle(); - - var state = tester.state(find.byType(SettingsScreen)); - expect(ParentTheme.of(state.context)?.isHC, isFalse); - - await tester.tap(hcToggle()); - await tester.pumpAndSettle(); - - state = tester.state(find.byType(SettingsScreen)); - expect(ParentTheme.of(state.context)?.isHC, isTrue); - }); - - testWidgetsWithAccessibilityChecks('Hides WebView dark mode toggle in light mode', (tester) async { - await tester.pumpWidget(TestApp(SettingsScreen())); - await tester.pumpAndSettle(); - - expect(webViewDarkModeToggle(), findsNothing); - }); - - testWidgetsWithAccessibilityChecks('Shows WebView dark mode toggle in dark mode', (tester) async { - await tester.pumpWidget(TestApp(SettingsScreen(), darkMode: true)); - await tester.pumpAndSettle(); - - expect(webViewDarkModeToggle(), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('Enables WebView dark mode', (tester) async { - await tester.pumpWidget(TestApp(SettingsScreen(), darkMode: true)); - await tester.pumpAndSettle(); - - var state = tester.state(find.byType(SettingsScreen)); - expect(ParentTheme.of(state.context)?.isWebViewDarkMode, isFalse); - - await tester.tap(webViewDarkModeToggle()); - await tester.pumpAndSettle(); - - state = tester.state(find.byType(SettingsScreen)); - expect(ParentTheme.of(state.context)?.isWebViewDarkMode, isTrue); - - await tester.tap(webViewDarkModeToggle()); - await tester.pumpAndSettle(); - - state = tester.state(find.byType(SettingsScreen)); - expect(ParentTheme.of(state.context)?.isWebViewDarkMode, isFalse); - - verify(analytics.logEvent(AnalyticsEventConstants.DARK_WEB_MODE_ON)).called(1); - verify(analytics.logEvent(AnalyticsEventConstants.DARK_WEB_MODE_OFF)).called(1); - }); -} \ No newline at end of file diff --git a/apps/flutter_parent/test/screens/splash/splash_screen_interactor_test.dart b/apps/flutter_parent/test/screens/splash/splash_screen_interactor_test.dart deleted file mode 100644 index a1b0628c92..0000000000 --- a/apps/flutter_parent/test/screens/splash/splash_screen_interactor_test.dart +++ /dev/null @@ -1,276 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:built_collection/built_collection.dart'; -import 'package:flutter_parent/models/account_permissions.dart'; -import 'package:flutter_parent/models/canvas_token.dart'; -import 'package:flutter_parent/models/feature_flags.dart'; -import 'package:flutter_parent/models/login.dart'; -import 'package:flutter_parent/models/mobile_verify_result.dart'; -import 'package:flutter_parent/models/user_colors.dart'; -import 'package:flutter_parent/network/api/accounts_api.dart'; -import 'package:flutter_parent/network/api/auth_api.dart'; -import 'package:flutter_parent/network/api/features_api.dart'; -import 'package:flutter_parent/network/api/user_api.dart'; -import 'package:flutter_parent/network/utils/api_prefs.dart'; -import 'package:flutter_parent/screens/dashboard/dashboard_interactor.dart'; -import 'package:flutter_parent/screens/splash/splash_screen_interactor.dart'; -import 'package:flutter_parent/utils/db/user_colors_db.dart'; -import 'package:flutter_parent/utils/service_locator.dart'; -import 'package:flutter_parent/utils/veneers/barcode_scan_veneer.dart'; -import 'package:mockito/mockito.dart'; -import 'package:test/test.dart'; - -import '../../utils/canvas_model_utils.dart'; -import '../../utils/test_app.dart'; -import '../../utils/test_helpers/mock_helpers.dart'; -import '../../utils/test_helpers/mock_helpers.mocks.dart'; - -void main() { - MockDashboardInteractor dashboardInteractor = MockDashboardInteractor(); - MockAccountsApi accountsApi = MockAccountsApi(); - MockAuthApi authApi = MockAuthApi(); - final mockScanner = MockBarcodeScanVeneer(); - MockUserApi userApi = MockUserApi(); - MockFeaturesApi featuresApi = MockFeaturesApi(); - - Login login = Login((b) => b - ..domain = 'domain' - ..user = CanvasModelTestUtils.mockUser().toBuilder()); - - MobileVerifyResult mobileVerifyResult = MobileVerifyResult((b) => b - ..authorized = true - ..result = VerifyResultEnum.success - ..clientId = '123' - ..clientSecret = '123' - ..apiKey = '123' - ..baseUrl = '123'); - - CanvasToken canvasToken = CanvasToken((b) => b - ..accessToken = '123' - ..refreshToken = '123' - ..user = CanvasModelTestUtils.mockUser().toBuilder() - ..realUser = null); - - setupTestLocator((locator) { - locator.registerFactory(() => dashboardInteractor); - locator.registerLazySingleton(() => accountsApi); - locator.registerLazySingleton(() => authApi); - locator.registerLazySingleton(() => mockScanner); - locator.registerLazySingleton(() => userApi); - locator.registerLazySingleton(() => featuresApi); - }); - - setUp(() async { - reset(dashboardInteractor); - reset(accountsApi); - reset(authApi); - reset(userApi); - ApiPrefs.clean(); - - // Default return value for getStudents is an empty list - when(dashboardInteractor.getStudents(forceRefresh: true)).thenAnswer((_) async => []); - - // Default return value for getAccountPermissions is default AccountPermissions - when(accountsApi.getAccountPermissions()).thenAnswer((_) async => AccountPermissions()); - - // Default return value for auth apis - when(authApi.mobileVerify(any)).thenAnswer((_) async => mobileVerifyResult); - when(authApi.getTokens(any, any)).thenAnswer((_) async => canvasToken); - - // Default return value for user api - when(userApi.getUserColors()).thenAnswer((_) async => UserColors()); - - when(featuresApi.getFeatureFlags()).thenAnswer((_) async => FeatureFlags()); - - await setupPlatformChannels(); - }); - - test('getData uses same getStudents call as DashboardInteractor', () async { - ApiPrefs.switchLogins(login); - await SplashScreenInteractor().getData(); - - // getStudents should have been called - verify(dashboardInteractor.getStudents(forceRefresh: true)); - }); - - test('Calls getAccountPermissions if canMasquerade is not set and domain is not siteadmin', () async { - ApiPrefs.switchLogins(login); - await SplashScreenInteractor().getData(); - - // getAccountPermissions should have been called - verify(accountsApi.getAccountPermissions()); - }); - - test('Does not call getAccountPermissions if canMasquerade is not set and domain is siteadmin', () async { - ApiPrefs.switchLogins(login.rebuild((b) => b..domain = 'https://siteadmin.instructure.com')); - await SplashScreenInteractor().getData(); - - // getAccountPermissions should not have been called - verifyNever(accountsApi.getAccountPermissions()); - - // canMasquerade should be set to true - expect(ApiPrefs.getCurrentLogin()?.canMasquerade, isTrue); - }); - - test('Sets canMasquerade to false if getAccountPermissions returns false', () async { - ApiPrefs.switchLogins(login); - - // canMasquerade should not be set at this point - expect(ApiPrefs.getCurrentLogin()?.canMasquerade, isNull); - - await SplashScreenInteractor().getData(); - - // canMasquerade should now be set to false - expect(ApiPrefs.getCurrentLogin()?.canMasquerade, isFalse); - }); - - test('Sets canMasquerade to true if getAccountPermissions returns true', () async { - when(accountsApi.getAccountPermissions()).thenAnswer((_) async => AccountPermissions((b) => b..becomeUser = true)); - ApiPrefs.switchLogins(login); - - // canMasquerade should not be set at this point - expect(ApiPrefs.getCurrentLogin()?.canMasquerade, isNull); - - await SplashScreenInteractor().getData(); - - // canMasquerade should now be set to false - expect(ApiPrefs.getCurrentLogin()?.canMasquerade, isTrue); - }); - - test('Sets canMasquerade to false if getAccountPermissions call fails', () async { - when(accountsApi.getAccountPermissions()).thenAnswer((_) async => throw 'Fake Error'); - ApiPrefs.switchLogins(login); - - // canMasquerade should not be set at this point - expect(ApiPrefs.getCurrentLogin()?.canMasquerade, isNull); - - await SplashScreenInteractor().getData(); - - // canMasquerade should now be set to false - expect(ApiPrefs.getCurrentLogin()?.canMasquerade, isFalse); - }); - - test('getData returns false for isObserver if user is not observing any students', () async { - ApiPrefs.switchLogins(login); - var data = await SplashScreenInteractor().getData(); - - // isObserver should be false - expect(data?.isObserver, isFalse); - }); - - test('getData returns true for isObserver if user is observing students', () async { - when(dashboardInteractor.getStudents(forceRefresh: true)).thenAnswer((_) async => [ - CanvasModelTestUtils.mockUser(name: 'User 1'), - CanvasModelTestUtils.mockUser(name: 'User 2'), - ]); - ApiPrefs.switchLogins(login); - var data = await SplashScreenInteractor().getData(); - - // isObserver should be true - expect(data?.isObserver, isTrue); - }); - - test('getData should return existing value for canMasquerade', () async { - ApiPrefs.switchLogins(login.rebuild((b) => b..canMasquerade = true)); - var data = await SplashScreenInteractor().getData(); - - // canMasquerade should be true - expect(data?.canMasquerade, isTrue); - }); - - test('getData returns QRLoginError for invalid qrLoginUrl', () async { - bool fail = false; - await SplashScreenInteractor().getData(qrLoginUrl: 'https://hodor.com').catchError((_) { - fail = true; // Don't return, just update the flag - return Future.value(null); - }); - expect(fail, isTrue); - }); - - test('getData returns valid data for valid qrLoginUrl', () async { - when(dashboardInteractor.getStudents(forceRefresh: true)).thenAnswer((_) async => [ - CanvasModelTestUtils.mockUser(name: 'User 1'), - CanvasModelTestUtils.mockUser(name: 'User 2'), - ]); - ApiPrefs.switchLogins(login); - final url = 'https://sso.canvaslms.com/canvas/login?code_android_parent=1234&domain=mobiledev.instructure.com'; - var data = await SplashScreenInteractor().getData(qrLoginUrl: url); - expect(data?.isObserver, isTrue); - expect(data?.canMasquerade, isFalse); - }); - - test('getData returns valid data for valid qrLoginUrl, canMasquerade true for real user', () async { - CanvasToken altToken = CanvasToken((b) => b - ..accessToken = '123' - ..refreshToken = '123' - ..user = CanvasModelTestUtils.mockUser().toBuilder() - ..realUser = CanvasModelTestUtils.mockUser().toBuilder()); - when(dashboardInteractor.getStudents(forceRefresh: true)).thenAnswer((_) async => [ - CanvasModelTestUtils.mockUser(name: 'User 1'), - CanvasModelTestUtils.mockUser(name: 'User 2'), - ]); - when(authApi.getTokens(any, any)).thenAnswer((_) async => altToken); - ApiPrefs.switchLogins(login); - final url = 'https://sso.canvaslms.com/canvas/login?code_android_parent=1234&domain=mobiledev.instructure.com'; - var data = await SplashScreenInteractor().getData(qrLoginUrl: url); - expect(data?.isObserver, isTrue); - expect(data?.canMasquerade, isTrue); - }); - - test('getData returns QRLoginError for invalid auth code', () async { - when(authApi.getTokens(any, any)).thenAnswer((_) async => Future.error('')); - final url = 'https://sso.canvaslms.com/canvas/login?code_android_parent=1234&domain=mobiledev.instructure.com'; - bool fail = false; - await SplashScreenInteractor().getData(qrLoginUrl: url).catchError((_) { - fail = true; // Don't return, just update the flag - return Future.value(null); - }); - expect(fail, isTrue); - }); - - test('getData returns QRLoginError for error in mobile verify', () async { - when(authApi.mobileVerify(any)).thenAnswer((_) async => Future.error('')); - final url = 'https://sso.canvaslms.com/canvas/login?code_android_parent=1234&domain=mobiledev.instructure.com'; - bool fail = false; - await SplashScreenInteractor().getData(qrLoginUrl: url).catchError((_) { - fail = true; // Don't return, just update the flag - return Future.value(null); - }); - expect(fail, isTrue); - }); - - test('getCameraCount returns valid camera count and sets ApiPrefs', () async { - when(mockScanner.getNumberOfCameras()).thenAnswer((_) => Future.value(2)); - - final count = await SplashScreenInteractor().getCameraCount(); - - final prefCount = await ApiPrefs.getCameraCount(); - - expect(count, prefCount); - }); - - test('updateUserColors calls UserApi and saves result to database', () async { - var expectedColors = UserColors((b) => b..customColors = MapBuilder({'user_1234': '#FFFFFFFF'})); - when(userApi.getUserColors(refresh: true)).thenAnswer((_) async => expectedColors); - await ApiPrefs.switchLogins(login); - - await SplashScreenInteractor().updateUserColors(); - - verify(userApi.getUserColors(refresh: true)); - - var db = (locator() as MockUserColorsDb); - verify(db.insertOrUpdateAll(login.domain, login.user.id, expectedColors)); - }); -} \ No newline at end of file diff --git a/apps/flutter_parent/test/screens/splash/splash_screen_test.dart b/apps/flutter_parent/test/screens/splash/splash_screen_test.dart deleted file mode 100644 index 1e0e7c9898..0000000000 --- a/apps/flutter_parent/test/screens/splash/splash_screen_test.dart +++ /dev/null @@ -1,291 +0,0 @@ -// Copyright (C) 2019 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'dart:async'; - -import 'package:flutter_parent/l10n/app_localizations.dart'; -import 'package:flutter_parent/models/login.dart'; -import 'package:flutter_parent/network/utils/api_prefs.dart'; -import 'package:flutter_parent/screens/aup/acceptable_use_policy_screen.dart'; -import 'package:flutter_parent/screens/login_landing_screen.dart'; -import 'package:flutter_parent/screens/not_a_parent_screen.dart'; -import 'package:flutter_parent/screens/splash/splash_screen.dart'; -import 'package:flutter_parent/screens/splash/splash_screen_interactor.dart'; -import 'package:flutter_parent/utils/common_widgets/canvas_loading_indicator.dart'; -import 'package:flutter_parent/utils/quick_nav.dart'; -import 'package:flutter_parent/utils/remote_config_utils.dart'; -import 'package:flutter_test/flutter_test.dart'; -import 'package:mockito/mockito.dart'; - -import '../../utils/accessibility_utils.dart'; -import '../../utils/canvas_model_utils.dart'; -import '../../utils/platform_config.dart'; -import '../../utils/test_app.dart'; -import '../../utils/test_helpers/mock_helpers.dart'; -import '../../utils/test_helpers/mock_helpers.mocks.dart'; - -void main() { - final login = Login((b) => b - ..domain = 'domain' - ..accessToken = 'token' - ..user = CanvasModelTestUtils.mockUser().toBuilder()); - - setUp(() async { - final mockRemoteConfig = setupMockRemoteConfig(valueSettings: {'qr_login_enabled_parent': 'true'}); - await setupPlatformChannels(config: PlatformConfig(initRemoteConfig: mockRemoteConfig)); - }); - - tearDown(() { - RemoteConfigUtils.clean(); - }); - - testWidgetsWithAccessibilityChecks('Displays loadingIndicator', (tester) async { - var interactor = MockSplashScreenInteractor(); - var nav = MockQuickNav(); - setupTestLocator((locator) { - locator.registerFactory(() => interactor); - locator.registerLazySingleton(() => nav); - }); - - final completer = Completer(); - when(interactor.getData()).thenAnswer((_) => completer.future); - when(interactor.isTermsAcceptanceRequired()).thenAnswer((_) async => false); - - await tester.pumpWidget(TestApp(SplashScreen())); - await tester.pump(); - await tester.pump(); - - expect(find.byType(CanvasLoadingIndicator), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('Routes to not-a-parent screen if not an observer and cannot masquerade', - (tester) async { - var interactor = MockSplashScreenInteractor(); - setupTestLocator((locator) { - locator.registerFactory(() => interactor); - locator.registerLazySingleton(() => QuickNav()); - }); - - when(interactor.isTermsAcceptanceRequired()).thenAnswer((_) async => false); - when(interactor.getData()).thenAnswer((_) async => SplashScreenData(false, false)); - - await tester.pumpWidget(TestApp( - SplashScreen(), - platformConfig: PlatformConfig(initLoggedInUser: login), - )); - await tester.pumpAndSettle(); - await tester.pump(); - await tester.pump(); - - expect(find.byType(NotAParentScreen), findsOneWidget); - await ApiPrefs.clean(); - }); - - testWidgetsWithAccessibilityChecks('Routes to Acceptable Use Policy screen if needed', (tester) async { - var interactor = MockSplashScreenInteractor(); - var mockNav = MockQuickNav(); - setupTestLocator((locator) { - locator.registerFactory(() => interactor); - locator.registerLazySingleton(() => mockNav); - }); - - when(interactor.getData()).thenAnswer((_) async => SplashScreenData(true, false)); - when(interactor.isTermsAcceptanceRequired()).thenAnswer((_) async => true); - - await tester.pumpWidget(TestApp( - SplashScreen(), - platformConfig: PlatformConfig(initLoggedInUser: login), - )); - await tester.pump(); // Pump to get data - await tester.pump(); // Pump to update with result - await tester.pump(); // Pump to update with result - await tester.pump(const Duration(milliseconds: 350)); // Pump for animation finish - - verify(mockNav.pushRouteWithCustomTransition(any, '/aup', any, any, any)); - await ApiPrefs.clean(); - }); - - testWidgetsWithAccessibilityChecks('Routes to dashboard if not an observer but can masquerade', (tester) async { - var interactor = MockSplashScreenInteractor(); - var mockNav = MockQuickNav(); - setupTestLocator((locator) { - locator.registerFactory(() => interactor); - locator.registerLazySingleton(() => mockNav); - }); - - when(interactor.getData()).thenAnswer((_) async => SplashScreenData(false, true)); - when(interactor.isTermsAcceptanceRequired()).thenAnswer((_) async => false); - - await tester.pumpWidget(TestApp( - SplashScreen(), - platformConfig: PlatformConfig(initLoggedInUser: login), - )); - await tester.pump(); // Pump to get data - await tester.pump(); // Pump to update with result - await tester.pump(); // Pump to update with result - await tester.pump(const Duration(milliseconds: 350)); // Pump for animation finish - - verify(mockNav.pushRouteWithCustomTransition(any, '/dashboard', any, any, any)); - await ApiPrefs.clean(); - }); - - testWidgetsWithAccessibilityChecks('Routes to dashboard if an observer but cannot masquerade', (tester) async { - var interactor = MockSplashScreenInteractor(); - var mockNav = MockQuickNav(); - setupTestLocator((locator) { - locator.registerFactory(() => interactor); - locator.registerLazySingleton(() => mockNav); - }); - - when(interactor.getData()).thenAnswer((_) async => SplashScreenData(true, false)); - when(interactor.isTermsAcceptanceRequired()).thenAnswer((_) async => false); - - await tester.pumpWidget(TestApp( - SplashScreen(), - platformConfig: PlatformConfig(initLoggedInUser: login), - )); - await tester.pump(); // Pump to get data - await tester.pump(); // Pump to update with result - await tester.pump(); // Pump to update with result - await tester.pump(const Duration(milliseconds: 350)); // Pump for animation finish - - verify(mockNav.pushRouteWithCustomTransition(any, '/dashboard', any, any, any)); - await ApiPrefs.clean(); - }); - - testWidgetsWithAccessibilityChecks('Routes to login screen when the user is not logged in', (tester) async { - var interactor = MockSplashScreenInteractor(); - setupTestLocator((locator) { - locator.registerFactory(() => interactor); - locator.registerLazySingleton(() => QuickNav()); - }); - - when(interactor.getCameraCount()).thenAnswer((_) => Future.value(2)); - - await tester.pumpWidget(TestApp(SplashScreen())); - await tester.pumpAndSettle(); - - expect(find.byType(LoginLandingScreen), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks( - 'Routes to login screen when the user is not logged in and camera count throws error', (tester) async { - var interactor = MockSplashScreenInteractor(); - setupTestLocator((locator) { - locator.registerFactory(() => interactor); - locator.registerLazySingleton(() => QuickNav()); - }); - - when(interactor.getCameraCount()).thenAnswer((_) => Future.error('error')); - - await tester.pumpWidget(TestApp(SplashScreen())); - await tester.pumpAndSettle(); - - expect(find.byType(LoginLandingScreen), findsOneWidget); - }); - - /* - TODO - fix this up if this route starts to pre-fetch students again - testWidgetsWithAccessibilityChecks('Routes to dashboard when there are students', (tester) async { - var interactor = _MockInteractor(); - var nav = _MockNav(); - setupTestLocator((locator) { - locator.registerFactory(() => interactor); - locator.registerLazySingleton(() => nav); - }); - - var students = [User()]; - final completer = Completer>(); - when(interactor.getStudents(forceRefresh: true)).thenAnswer((_) => completer.future); - - await tester.pumpWidget(TestApp(SplashScreen())); - await tester.pump(); - - completer.complete(students); - await tester.pump(); - await tester.pump(Duration(milliseconds: 350)); - - var route = verify(nav.replaceRoute(any, captureAny)).captured[0]; - expect(route.runtimeType, PageRouteBuilder); - - var screen = route.pageBuilder(null, null, null); - expect(screen.runtimeType, DashboardScreen); - expect((screen as DashboardScreen).students, students); - }); - */ - - testWidgetsWithAccessibilityChecks('Routes to dashboard without students on error', (tester) async { - var interactor = MockSplashScreenInteractor(); - var mockNav = MockQuickNav(); - setupTestLocator((locator) { - locator.registerFactory(() => interactor); - locator.registerLazySingleton(() => mockNav); - }); - - final completer = Completer(); - when(interactor.getData()).thenAnswer((_) => completer.future); - when(interactor.isTermsAcceptanceRequired()).thenAnswer((_) async => false); - - await tester.pumpWidget(TestApp( - SplashScreen(), - platformConfig: PlatformConfig(initLoggedInUser: login), - )); - await tester.pump(); - - completer.completeError('Fake error'); - await tester.pump(); - await tester.pump(); - await tester.pump(const Duration(milliseconds: 350)); - - verify(mockNav.pushRouteWithCustomTransition(any, '/dashboard', any, any, any)); - await ApiPrefs.clean(); - }); - - testWidgetsWithAccessibilityChecks('Requests MasqueradeUI refresh', (tester) async { - var masqueradeUser = CanvasModelTestUtils.mockUser(name: "Masked User"); - var maskedLogin = login.rebuild((b) => b - ..masqueradeDomain = 'masqueradeDomain' - ..masqueradeUser = masqueradeUser.toBuilder()); - var masqueradeInfo = AppLocalizations().actingAsUser(masqueradeUser.name); - - var interactor = MockSplashScreenInteractor(); - var mockNav = MockQuickNav(); - setupTestLocator((locator) { - locator.registerFactory(() => interactor); - locator.registerLazySingleton(() => mockNav); - }); - - when(interactor.getData()).thenAnswer((_) async { - ApiPrefs.switchLogins(maskedLogin); - return SplashScreenData(true, false); - }); - when(interactor.isTermsAcceptanceRequired()).thenAnswer((_) async => false); - - await tester.pumpWidget(TestApp( - SplashScreen(), - platformConfig: PlatformConfig(initLoggedInUser: login), - )); - await tester.pump(); // Pump to get data - - // Should not show masquerade info at this point - expect(find.text(masqueradeInfo), findsNothing); - - await tester.pump(); // Pump to update with result - await tester.pump(); // Pump to update with result - await tester.pump(const Duration(milliseconds: 350)); // Pump for animation finish - - // Should now show masquerade info - expect(find.text(masqueradeInfo), findsOneWidget); - await ApiPrefs.clean(); - }); -} \ No newline at end of file diff --git a/apps/flutter_parent/test/screens/theme_viewer_screen_test.dart b/apps/flutter_parent/test/screens/theme_viewer_screen_test.dart deleted file mode 100644 index 00f1ba4f79..0000000000 --- a/apps/flutter_parent/test/screens/theme_viewer_screen_test.dart +++ /dev/null @@ -1,145 +0,0 @@ -// Copyright (C) 2019 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -/// -import 'package:flutter/widgets.dart'; -import 'package:flutter_parent/screens/theme_viewer_screen.dart'; -import 'package:flutter_parent/utils/design/parent_colors.dart'; -import 'package:flutter_parent/utils/design/parent_theme.dart'; -import 'package:flutter_parent/utils/design/student_color_set.dart'; -import 'package:flutter_test/flutter_test.dart'; - -import '../utils/test_app.dart'; - -void main() { - Finder darkToggle() => find.text('Dark Mode'); - Finder hcToggle() => find.text('High Contrast Mode'); - Finder title() => find.text('Theme configuration'); - Finder subtitle() => find.text('Play around with some values'); - Finder studentColor() => find.byKey(ThemeViewerScreen.studentColorKey); - - testWidgets('Changes text color for dark and high-contrast modes', (tester) async { - await tester.pumpWidget(TestApp(ThemeViewerScreen())); - await tester.pumpAndSettle(); - - // Open the drawer - ThemeViewerScreen.scaffoldKey.currentState?.openDrawer(); - await tester.pumpAndSettle(); - - // Light mode, normal contrast. Title should be dark, subtitle should be gray. - expect(tester.widget(title()).style!.color, ParentColors.licorice); - expect(tester.widget(subtitle()).style!.color, ParentColors.oxford); - - // Enable dark mode - await tester.tap(darkToggle()); - await tester.pumpAndSettle(); - - // Dark mode, normal contrast. Title should be light, subtitle should be gray. - expect(tester.widget(title()).style!.color, ParentColors.tiara); - expect(tester.widget(subtitle()).style!.color, ParentColors.ash); - - // Enable High-Contrast mode - await tester.tap(hcToggle()); - await tester.pumpAndSettle(); - - // Dark mode, high contrast. Both title and subtitle should be light - expect(tester.widget(title()).style!.color, ParentColors.tiara); - expect(tester.widget(subtitle()).style!.color, ParentColors.tiara); - - // Disable dark mode - await tester.tap(darkToggle()); - await tester.pumpAndSettle(); - - // Light mode, high contrast. Both title and subtitle should be dark - expect(tester.widget(title()).style!.color, ParentColors.licorice); - expect(tester.widget(subtitle()).style!.color, ParentColors.licorice); - }); - - testWidgets('Set and returns correct values for dark and high-contrast modes', (tester) async { - await tester.pumpWidget(TestApp(ThemeViewerScreen())); - await tester.pumpAndSettle(); - - var state = ParentTheme.of(ThemeViewerScreen.scaffoldKey.currentContext!); - - state!.isDarkMode = false; - state.isHC = false; - expect(state.isLightNormal, isTrue); - expect(state.isLightHC, isFalse); - expect(state.isDarkNormal, isFalse); - expect(state.isDarkHC, isFalse); - - state.isDarkMode = true; - state.isHC = false; - expect(state.isLightNormal, isFalse); - expect(state.isLightHC, isFalse); - expect(state.isDarkNormal, isTrue); - expect(state.isDarkHC, isFalse); - - state.isDarkMode = false; - state.isHC = true; - expect(state.isLightNormal, isFalse); - expect(state.isLightHC, isTrue); - expect(state.isDarkNormal, isFalse); - expect(state.isDarkHC, isFalse); - - state.isDarkMode = true; - state.isHC = true; - expect(state.isLightNormal, isFalse); - expect(state.isLightHC, isFalse); - expect(state.isDarkNormal, isFalse); - expect(state.isDarkHC, isTrue); - }); - - testWidgets('Uses correct student color variants', (tester) async { - setupTestLocator((_) {}); - await tester.pumpWidget(TestApp(ThemeViewerScreen())); - await tester.pumpAndSettle(); - - // Open the drawer - ThemeViewerScreen.scaffoldKey.currentState?.openDrawer(); - await tester.pumpAndSettle(); - - // Switch student color to 'raspberry' - await tester.tap(find.text('Student Color 1')); - await tester.pump(); - await tester.tap(find.text('Student Color 4').last); - await tester.pumpAndSettle(); - - StudentColorSet expected = StudentColorSet.raspberry; - Color actualColor() => tester.widget(studentColor()).color!; - - // Light mode, normal contrast. - expect(actualColor(), expected.light); - - // Enable dark mode - await tester.tap(darkToggle()); - await tester.pumpAndSettle(); - - // Dark mode, normal contrast. - expect(actualColor(), expected.dark); - - // Enable High-Contrast mode - await tester.tap(hcToggle()); - await tester.pumpAndSettle(); - - // Dark mode, high contrast. - expect(actualColor(), expected.darkHC); - - // Disable dark mode - await tester.tap(darkToggle()); - await tester.pumpAndSettle(); - - // Light mode, high contrast - expect(actualColor(), expected.lightHC); - }); -} diff --git a/apps/flutter_parent/test/screens/under_construction_screen_test.dart b/apps/flutter_parent/test/screens/under_construction_screen_test.dart deleted file mode 100644 index fbbc257be9..0000000000 --- a/apps/flutter_parent/test/screens/under_construction_screen_test.dart +++ /dev/null @@ -1,65 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -import 'package:flutter/material.dart'; -import 'package:flutter_parent/l10n/app_localizations.dart'; -import 'package:flutter_parent/screens/under_construction_screen.dart'; -import 'package:flutter_svg/flutter_svg.dart'; -import 'package:flutter_test/flutter_test.dart'; - -import '../utils/accessibility_utils.dart'; -import '../utils/test_app.dart'; - -void main() { - final l10n = AppLocalizations(); - - testWidgetsWithAccessibilityChecks('Shows under construction widget without app bar', (tester) async { - await tester.pumpWidget(TestApp(UnderConstructionScreen())); - await tester.pump(); // Wait for the widget to finish building - - expect(find.byType(UnderConstructionScreen), findsOneWidget); - expect(find.byType(AppBar), findsNothing); - - expect(find.byType(SvgPicture), findsOneWidget); - expect(find.text(l10n.underConstruction), findsOneWidget); - expect(find.text(l10n.currentlyBuildingThisFeature), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('Shows under construction widget without app bar when no back stack exists', - (tester) async { - await tester.pumpWidget(TestApp(UnderConstructionScreen(showAppBar: true))); - await tester.pump(); // Wait for the widget to finish building - - expect(find.byType(UnderConstructionScreen), findsOneWidget); - expect(find.byType(AppBar), findsNothing); - - expect(find.byType(SvgPicture), findsOneWidget); - expect(find.text(l10n.underConstruction), findsOneWidget); - expect(find.text(l10n.currentlyBuildingThisFeature), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('Shows under construction widget with app bar', (tester) async { - await TestApp.showWidgetFromTap(tester, (context) { - return Navigator.of(context) - .push(MaterialPageRoute(builder: (context) => UnderConstructionScreen(showAppBar: true))); - }); - await tester.pump(); // Wait for the widget to finish building - - expect(find.byType(UnderConstructionScreen), findsOneWidget); - - expect(find.byType(AppBar), findsOneWidget); - expect(find.byType(SvgPicture), findsOneWidget); - expect(find.text(l10n.underConstruction), findsOneWidget); - expect(find.text(l10n.currentlyBuildingThisFeature), findsOneWidget); - }); -} diff --git a/apps/flutter_parent/test/utils/accessibility_utils.dart b/apps/flutter_parent/test/utils/accessibility_utils.dart deleted file mode 100644 index 0d98f6e91b..0000000000 --- a/apps/flutter_parent/test/utils/accessibility_utils.dart +++ /dev/null @@ -1,263 +0,0 @@ -// Copyright (C) 2019 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -// Accessibility-related utilities for our widget tests. - -import 'dart:async'; -import 'dart:io'; -import 'dart:ui'; - -import 'package:flutter/material.dart'; -import 'package:flutter/rendering.dart'; -import 'package:flutter/services.dart'; -import 'package:flutter_test/flutter_test.dart'; -import 'package:meta/meta.dart'; -import 'package:test/test.dart' as test_package; - -/// Exclusions for the [AccessibilityGuideline] checks. -/// -/// Note that, due to how the built-in guidelines work, it is possible that specifying one or more exclusions can -/// unintentionally mask additional check failures for the same guideline to which the exclusion applies. -/// -/// For example, [multipleNodesWithSameLabel] and [minContrastRatio] both apply to the [textContrastGuideline]. If a -/// widget test that would normally fail, say due to having two nodes with the same semantic label, has the -/// [multipleNodesWithSameLabel] exclusion applied, any issues with the minimum contrast that would have been caught -/// *after* the ignored issue will also be ignored. -enum A11yExclusion { - multipleNodesWithSameLabel, - minContrastRatio, - minTapSize, -} - -extension A11yExclusionExtension on A11yExclusion { - String get errorMessageContents { - switch (this) { - case A11yExclusion.multipleNodesWithSameLabel: - return 'Multiple nodes with the same label'; - case A11yExclusion.minContrastRatio: - return 'Expected contrast ratio of at least'; - case A11yExclusion.minTapSize: - return 'expected tap target size of at least'; - } - } -} - -/// A testWidgets() wrapper that does not run accessibility checks. This should not be used by things that are actually -/// rendering widgets for a meaningful purpose. This should only be used by non widget tests that need access to a -/// context and a WidgetTester. (example, interactors that need a context as a parameter) -@isTest -void testNonWidgetsWithContext( - String description, - WidgetTesterCallback callback, -) { - testWidgets(description, (tester) async => await callback(tester)); -} - -/// A testWidgets() wrapper that runs accessibility checks -@isTest -void testWidgetsWithAccessibilityChecks( - String description, - WidgetTesterCallback callback, { - bool skip = false, - test_package.Timeout? timeout, - bool semanticsEnabled = true, - Set a11yExclusions = const {}, -}) { - Map envVars = Platform.environment; - - testWidgets(description, (tester) async { - if (envVars["deviceWidth"] != null && envVars["deviceHeight"] != null) { - var width = double.parse(envVars["deviceWidth"]!); - var height = double.parse(envVars["deviceHeight"]!); - double ratio = 1.0; - if (envVars["pixelRatio"] != null) { - ratio = double.parse(envVars["pixelRatio"]!); - } - - print("Changing device res to width=$width, height=$height, ratio=$ratio"); - tester.binding.window.physicalSizeTestValue = Size(width, height); - tester.binding.window.devicePixelRatioTestValue = ratio; - } - final handle = tester.ensureSemantics(); - await callback(tester); - - // Run our accessibility test suite at the end of the test. - await runAccessibilityTests(tester); - - handle.dispose(); - }, skip: skip, timeout: timeout, semanticsEnabled: semanticsEnabled); -} - -// Break this out into its own method, so that it can be used mid-test. -Future runAccessibilityTests(WidgetTester tester) async { - await expectLater(tester, meetsGuideline(textContrastGuideline)); - await expectLater(tester, meetsGuideline(labeledTapTargetGuideline)); - await expectLater(tester, meetsGuideline(androidTapTargetGuideline)); - // Needs to be last, because it fiddles with UI - await expectLater(tester, meetsGuideline(TextFieldNavigationGuideline())); -} - -// Here's an example of a custom guideline. We can conceivably write -// additional custom guidelines to pick up the slack of what the out-of-the-box -// guidelines don't cover. -// -// This is just a sample. Of course it's normally OK for widgets to have hints. -class NoHintsGuideline extends AccessibilityGuideline { - @override - String get description => 'Widgets should not have hints'; - - @override - FutureOr evaluate(WidgetTester tester) { - final SemanticsNode? root = tester.binding.pipelineOwner.semanticsOwner?.rootSemanticsNode; - - // Traversal logic that recurses to children - Evaluation traverse(SemanticsNode node) { - Evaluation result = const Evaluation.pass(); - node.visitChildren((SemanticsNode child) { - result += traverse(child); - return true; - }); - - if (node.hint.isNotEmpty) { - //print("Node $node hint = ${node.hint}"); - result += Evaluation.fail('$node has hint \'${node.hint}\'!\n'); - } - - return result; // Returns aggregate result - } - - return traverse(root!); // Start traversing at the root. - } -} - -/* - * An a11y checker that insures that we can navigate out of TextFields using dpad arrows. - */ -class TextFieldNavigationGuideline extends AccessibilityGuideline { - @override - String get description => 'You should be able to direction-arrow out of TextFields'; - - // Grab the focusable SemanticsNodes associated with this screen. - List _getFocusableSemanticsNodes(SemanticsNode root) { - List result = []; - if (root.hasFlag(SemanticsFlag.isFocusable) && - !root.isMergedIntoParent && - !root.isInvisible && - !root.hasFlag(SemanticsFlag.isHidden)) { - result.add(root); - } - - root.visitChildren((SemanticsNode child) { - result.addAll(_getFocusableSemanticsNodes(child)); - return true; - }); - - return result; - } - - // Attempt to find the SemanticsNode that is currently focused. - SemanticsNode _findFocusedNode(SemanticsNode root) { - if (root.hasFlag(SemanticsFlag.isFocused)) { - return root; - } - - SemanticsNode? result = null; - root.visitChildren((SemanticsNode child) { - if (result == null) { - result = _findFocusedNode(child); - } - return true; - }); - - return result!; - } - - // - //region arrow-key operations - // - - // Cause an arrow-down to be sent to the screen - Future _moveDown(WidgetTester tester) async { - return _move(tester, LogicalKeyboardKey.arrowDown); - } - - // Cause an arrow-up to be sent to the screen - Future _moveUp(WidgetTester tester) async { - return _move(tester, LogicalKeyboardKey.arrowUp); - } - - // Cause an arrow-left to be sent to the screen - Future _moveLeft(WidgetTester tester) async { - return _move(tester, LogicalKeyboardKey.arrowLeft); - } - - // Cause an arrow-right to be sent to the screen - Future _moveRight(WidgetTester tester) async { - return _move(tester, LogicalKeyboardKey.arrowRight); - } - - // Common logic for arrow-moving - Future _move(WidgetTester tester, LogicalKeyboardKey key) async { - await tester.sendKeyEvent(key); - await tester.pumpAndSettle(); - FocusNode newFocus = tester.binding.focusManager.primaryFocus!; - return newFocus; - } - - //endregion - - @override - FutureOr evaluate(WidgetTester tester) async { - final SemanticsNode? root = tester.binding.pipelineOwner.semanticsOwner?.rootSemanticsNode; - - // Default result - Evaluation result = Evaluation.pass(); - - // Gather all focusable SemanticsNodes for our screen - // We can't get this info through the focus node tree. - List focusableSemanticsNodes = _getFocusableSemanticsNodes(root!); - - Iterable editableTextFocusNodes = tester.binding.focusManager.rootScope.descendants - .where((fn) => fn.context != null && fn.context?.widget is EditableText); - - if (focusableSemanticsNodes.length > 1) { - // Only test navigability if there is something else to which to navigate. - for (FocusNode fn in editableTextFocusNodes) { - // For each EditableText that we encounter, tap on it to focus it... - fn.requestFocus(); - await tester.pumpAndSettle(); - - // and then try to navigate out of it. - FocusNode? currFocus = tester.binding.focusManager.primaryFocus; - FocusNode newFocus = await _moveUp(tester); - if (newFocus == currFocus) { - newFocus = await _moveDown(tester); - } - if (newFocus == currFocus) { - newFocus = await _moveRight(tester); - } - if (newFocus == currFocus) { - newFocus = await _moveLeft(tester); - } - if (newFocus == currFocus) { - // Attempt to correlate a SemanticsNode with our failed FocusNode - SemanticsNode focusedSemanticsNode = _findFocusedNode(root); - result += Evaluation.fail('Directional nav stuck in $currFocus, Semantics: $focusedSemanticsNode\n'); - } - } - } - - return result; - } -} diff --git a/apps/flutter_parent/test/utils/alert_helper_test.dart b/apps/flutter_parent/test/utils/alert_helper_test.dart deleted file mode 100644 index ea3fc1369f..0000000000 --- a/apps/flutter_parent/test/utils/alert_helper_test.dart +++ /dev/null @@ -1,186 +0,0 @@ -// Copyright (C) 2023 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:flutter_parent/models/alert.dart'; -import 'package:flutter_parent/models/course.dart'; -import 'package:flutter_parent/models/course_settings.dart'; -import 'package:flutter_parent/network/api/course_api.dart'; -import 'package:flutter_parent/utils/alert_helper.dart'; -import 'package:flutter_test/flutter_test.dart'; -import 'package:mockito/mockito.dart'; - -import 'test_app.dart'; -import 'test_helpers/mock_helpers.dart'; -import 'test_helpers/mock_helpers.mocks.dart'; - -void main() { - final courseApi = MockCourseApi(); - - final course = Course((b) => b..settings = CourseSettings((b) => b..restrictQuantitativeData = false).toBuilder()); - - final restrictedCourse = Course((b) => b..settings = CourseSettings((b) => b..restrictQuantitativeData = true).toBuilder()); - - setupTestLocator((_locator) { - _locator.registerFactory(() => courseApi); - }); - - setUp(() { - reset(courseApi); - }); - - test('filter course grade alerts if restrictQuantitativeData is true in course settings', () async { - List alerts = [ - Alert((b) => b - ..id = '1' - ..contextId = '1' - ..alertType = AlertType.courseGradeLow - ..lockedForUser = false), - Alert((b) => b - ..id = '2' - ..contextId = '2' - ..alertType = AlertType.courseGradeHigh - ..lockedForUser = false), - Alert((b) => b - ..id = '3' - ..contextId = '3' - ..alertType = AlertType.unknown - ..lockedForUser = false), - ]; - - final alertsHelper = AlertsHelper(); - - when(courseApi.getCourse(any)).thenAnswer((_) => Future.value(restrictedCourse)); - - expect((await alertsHelper.filterAlerts(alerts)), alerts.sublist(2, 3)); - }); - - test('keep course grade alerts if restrictQuantitativeData is false in course settings', () async { - List alerts = [ - Alert((b) => b - ..id = '1' - ..contextId = '1' - ..alertType = AlertType.courseGradeLow - ..lockedForUser = false), - Alert((b) => b - ..id = '2' - ..contextId = '2' - ..alertType = AlertType.courseGradeHigh - ..lockedForUser = false), - Alert((b) => b - ..id = '3' - ..contextId = '3' - ..alertType = AlertType.unknown - ..lockedForUser = false), - ]; - - final alertsHelper = AlertsHelper(); - - when(courseApi.getCourse(any)).thenAnswer((_) => Future.value(course)); - - expect((await alertsHelper.filterAlerts(alerts)), alerts); - }); - - test('filter assignment grade alerts if restrictQuantitativeData is true in course settings', () async { - List alerts = [ - Alert((b) => b - ..id = '1' - ..contextId = '1' - ..alertType = AlertType.assignmentGradeLow - ..htmlUrl = 'https://canvas.instructure.com/courses/1/assignments/1' - ..lockedForUser = false), - Alert((b) => b - ..id = '2' - ..contextId = '2' - ..alertType = AlertType.assignmentGradeHigh - ..htmlUrl = 'https://canvas.instructure.com/courses/2/assignments/2' - ..lockedForUser = false), - Alert((b) => b - ..id = '3' - ..contextId = '3' - ..alertType = AlertType.unknown - ..lockedForUser = false), - ]; - - final alertsHelper = AlertsHelper(); - - when(courseApi.getCourse(any)).thenAnswer((_) => Future.value(restrictedCourse)); - - expect((await alertsHelper.filterAlerts(alerts)), alerts.sublist(2, 3)); - }); - - test('keep assignment grade alerts if restrictQuantitativeData is false in course settings', () async { - List alerts = [ - Alert((b) => b - ..id = '1' - ..contextId = '1' - ..alertType = AlertType.assignmentGradeLow - ..htmlUrl = 'https://canvas.instructure.com/courses/1/assignments/1' - ..lockedForUser = false), - Alert((b) => b - ..id = '2' - ..contextId = '2' - ..alertType = AlertType.assignmentGradeHigh - ..htmlUrl = 'https://canvas.instructure.com/courses/2/assignments/2' - ..lockedForUser = false), - Alert((b) => b - ..id = '3' - ..contextId = '3' - ..alertType = AlertType.unknown - ..lockedForUser = false), - ]; - - final alertsHelper = AlertsHelper(); - - when(courseApi.getCourse(any)).thenAnswer((_) => Future.value(course)); - - expect((await alertsHelper.filterAlerts(alerts)), alerts); - }); - - test('keep non-grade alerts', () async { - List alerts = [ - Alert((b) => b - ..id = '1' - ..contextId = '1' - ..alertType = AlertType.courseGradeHigh - ..lockedForUser = false), - Alert((b) => b - ..id = '2' - ..contextId = '2' - ..alertType = AlertType.assignmentGradeHigh - ..htmlUrl = 'https://canvas.instructure.com/courses/2/assignments/2' - ..lockedForUser = false), - Alert((b) => b - ..id = '3' - ..contextId = '3' - ..alertType = AlertType.assignmentMissing - ..lockedForUser = false), - Alert((b) => b - ..id = '4' - ..contextId = '4' - ..alertType = AlertType.courseAnnouncement - ..lockedForUser = false), - Alert((b) => b - ..id = '5' - ..contextId = '5' - ..alertType = AlertType.institutionAnnouncement - ..lockedForUser = false), - ]; - - final alertsHelper = AlertsHelper(); - - when(courseApi.getCourse(any)).thenAnswer((_) => Future.value(restrictedCourse)); - - expect((await alertsHelper.filterAlerts(alerts)), alerts.sublist(2)); - }); -} diff --git a/apps/flutter_parent/test/utils/base_model_test.dart b/apps/flutter_parent/test/utils/base_model_test.dart deleted file mode 100644 index e1be5a0090..0000000000 --- a/apps/flutter_parent/test/utils/base_model_test.dart +++ /dev/null @@ -1,63 +0,0 @@ -// Copyright (C) 2019 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:flutter_parent/utils/base_model.dart'; -import 'package:test/test.dart'; - -void main() { - test('Initializes BaseModel state to Idle', () { - final model = BaseModel(); - expect(model.state, ViewState.Idle); - }); - - test('Calling setState to Busy notifies the liseners', () { - final model = BaseModel(); - model.addListener(() => expect(model.state, ViewState.Busy)); - model.setState(viewState: ViewState.Busy); - }); - - test('Calling work notifies listeners that the state is busy', () async { - final model = BaseModel(); - final busyListener = () => expect(model.state, ViewState.Busy); - model.addListener(busyListener); - await model.work(() async { - // Remove the listener, otherwise it will fail for future listener updates - model.removeListener(busyListener); - }); - }); - - test('Calling work notifies listeners that the state is Idle after the block is run', () async { - final model = BaseModel(); - await model.work(() async { - expect(model.state, ViewState.Busy); - model.addListener(() => expect(model.state, ViewState.Idle)); - }); - expect(model.state, ViewState.Idle); - }); - - test('Calling work notifies listeners that the state is Error if the block throws an exception', () async { - final model = BaseModel(); - await model.work(() { - model.addListener(() => expect(model.state, ViewState.Error)); - return Future.error('This failed'); - }); - expect(model.state, ViewState.Error); - }); - - test('Calling work ends with a state of Idle if the block is null', () async { - final model = BaseModel(); - await model.work(null); - expect(model.state, ViewState.Idle); - }); -} diff --git a/apps/flutter_parent/test/utils/canvas_model_utils.dart b/apps/flutter_parent/test/utils/canvas_model_utils.dart deleted file mode 100644 index 26b9da28ec..0000000000 --- a/apps/flutter_parent/test/utils/canvas_model_utils.dart +++ /dev/null @@ -1,32 +0,0 @@ -// Copyright (C) 2019 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'dart:math'; - -import 'package:flutter_parent/models/user.dart'; - -class CanvasModelTestUtils { - static User mockUser({String? name, String? pronouns, String? primaryEmail, String? id, String? shortName}) => - User((b) => b - ..id = id ?? Random(name.hashCode).nextInt(100000).toString() - ..sortableName = name ?? 'sortableName' - ..name = '$name Panda' ?? 'name' - ..shortName = shortName ?? 'shortName_${Random(name.hashCode).nextInt(100000).toString()}' - ..primaryEmail = primaryEmail ?? 'email' - ..pronouns = pronouns ?? null - ..locale = 'en' - ..effectiveLocale = 'jp' - ..avatarUrl = '' - ..build()); -} diff --git a/apps/flutter_parent/test/utils/core_extensions/date_time_extensions_test.dart b/apps/flutter_parent/test/utils/core_extensions/date_time_extensions_test.dart deleted file mode 100644 index 7f477120e3..0000000000 --- a/apps/flutter_parent/test/utils/core_extensions/date_time_extensions_test.dart +++ /dev/null @@ -1,255 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:flutter_parent/utils/core_extensions/date_time_extensions.dart'; -import 'package:intl/date_symbol_data_local.dart'; -import 'package:intl/intl.dart'; -import 'package:test/test.dart'; - -void main() { - group('l10nFormat', () { - String localize(String date, String time) => 'Due $date at $time'; - - DateTime now = DateTime.now(); - DateTime nowUtc = now.toUtc(); - - String expectedDefaultDate = DateFormat.MMMd().format(now); - String expectedDefaultTime = DateFormat.jm().format(now); - String expectedDefaultOutput = localize(expectedDefaultDate, expectedDefaultTime); - - test('returns null if DateTime is null', () { - DateTime? date = null; - expect(date.l10nFormat(localize), isNull); - }); - - test('returns null if localizer is null', () { - expect(now.l10nFormat(null), isNull); - }); - - test('correctly formats DateTime', () { - expect(now.l10nFormat(localize), expectedDefaultOutput); - }); - - test('converts to local DateTime', () { - expect(nowUtc.l10nFormat(localize), expectedDefaultOutput); - }); - - test('uses correct default formats', () { - expect(now.l10nFormat(localize, dateFormat: null, timeFormat: null), expectedDefaultOutput); - }); - - test('applies specified date format', () { - String expectedDate = DateFormat.MMMMEEEEd().format(now); - String expected = localize(expectedDate, expectedDefaultTime); - String? actual = now.l10nFormat(localize, dateFormat: DateFormat.MMMMEEEEd()); - expect(actual, expected); - }); - - test('applies specified time format', () { - String expectedTime = DateFormat.MMMMEEEEd().format(now); - String expected = localize(expectedDefaultDate, expectedTime); - String? actual = now.l10nFormat(localize, timeFormat: DateFormat.MMMMEEEEd()); - expect(actual, expected); - }); - }); - - group('isSameDayAs', () { - test('returns true for the same DateTime', () { - DateTime date = DateTime.now(); - expect(date.isSameDayAs(date), isTrue); - }); - - test('returns false if this date is null', () { - DateTime? date1 = null; - DateTime date2 = DateTime.now(); - expect(date1.isSameDayAs(date2), isFalse); - }); - - test('returns false if other date is null', () { - DateTime date1 = DateTime.now(); - DateTime? date2 = null; - expect(date1.isSameDayAs(date2), isFalse); - }); - - test('returns false if both dates are null', () { - DateTime? date1 = null; - DateTime? date2 = null; - expect(date1.isSameDayAs(date2), isFalse); - }); - - test('returns true if dates are identical but times are not', () { - DateTime date1 = DateTime(2000, 1, 1, 0, 0); - DateTime date2 = DateTime(2000, 1, 1, 23, 59); - expect(date1.isSameDayAs(date2), isTrue); - }); - - test('returns false if dates are not the same', () { - DateTime date1 = DateTime(2000, 1, 1); - DateTime date2 = DateTime(2000, 1, 2); - expect(date1.isSameDayAs(date2), isFalse); - }); - }); - - group('withFirstDayOfWeek', () { - initializeDateFormatting(); - - tearDownAll(() { - Intl.defaultLocale = Intl.systemLocale; - }); - - test('returns null if date is null', () { - DateTime? date = null; - expect(date.withFirstDayOfWeek(), isNull); - }); - - test('returns correct date for every day of week for US locale', () { - DateTime weekStart = DateTime(1999, 12, 26); // Week starting December 26, 2000 - DateTime nextWeekStart = DateTime(2000, 1, 2); // Week starting January 2, 2000 - - // First day of week is Sunday, December 26, 1999 - expect(DateTime(1999, 12, 26).withFirstDayOfWeek(), weekStart); - - // Last day of week is Saturday, January 1, 2000 - expect(DateTime(2000, 1, 1).withFirstDayOfWeek(), weekStart); - - // First day of next week is Sunday, January 2, 2000 - expect(DateTime(2000, 1, 2).withFirstDayOfWeek(), nextWeekStart); - }); - - test('returns correct date for every day of week for German locale', () { - DateTime weekStart = DateTime(1999, 12, 27); // Week starting December 27, 1999 - DateTime nextWeekStart = DateTime(2000, 1, 3); // Week starting January 3, 2000 - - // Set locale to German - Intl.defaultLocale = 'de'; - - // First day of week is Monday, December 27, 1999 - expect(DateTime(1999, 12, 27).withFirstDayOfWeek(), weekStart); - - // Last day of week is Sunday, January 2, 2000 - expect(DateTime(2000, 1, 2).withFirstDayOfWeek(), weekStart); - - // First day of next week is Monday, January 3, 2000 - expect(DateTime(2000, 1, 3).withFirstDayOfWeek(), nextWeekStart); - }); - - test('returns correct date for every day of week for Arabic locale', () { - DateTime weekStart = DateTime(2000, 1, 1); // Week starting January 1, 2000 - DateTime nextWeekStart = DateTime(2000, 1, 8); // Week starting January 8, 2000 - - // Set locale to Arabic - Intl.defaultLocale = 'ar'; - - // First day of week is Saturday, January 1, 2000 - expect(DateTime(2000, 1, 1).withFirstDayOfWeek(), weekStart); - - // Last day of week is Sunday, January - expect(DateTime(2000, 1, 7).withFirstDayOfWeek(), weekStart); - - // First day of next week is Monday, January 3, 2000 - expect(DateTime(2000, 1, 8).withFirstDayOfWeek(), nextWeekStart); - }); - }); - - group('isWeekend', () { - initializeDateFormatting(); - - tearDownAll(() { - Intl.defaultLocale = Intl.systemLocale; - }); - - test('returns false if date is null', () { - DateTime? date = null; - expect(date.isWeekend(), isFalse); - }); - - test('returns correct values for US locale', () { - expect(DateTime(2000, 1, 3).isWeekend(), isFalse); // Monday - expect(DateTime(2000, 1, 4).isWeekend(), isFalse); // Tuesday - expect(DateTime(2000, 1, 5).isWeekend(), isFalse); // Wednesday - expect(DateTime(2000, 1, 6).isWeekend(), isFalse); // Thursday - expect(DateTime(2000, 1, 7).isWeekend(), isFalse); // Friday - expect(DateTime(2000, 1, 8).isWeekend(), isTrue); // Saturday - expect(DateTime(2000, 1, 9).isWeekend(), isTrue); // Sunday - }); - - test('returns correct values for German locale', () { - // Set locale to German - Intl.defaultLocale = 'de'; - - expect(DateTime(2000, 1, 3).isWeekend(), isFalse); // Monday - expect(DateTime(2000, 1, 4).isWeekend(), isFalse); // Tuesday - expect(DateTime(2000, 1, 5).isWeekend(), isFalse); // Wednesday - expect(DateTime(2000, 1, 6).isWeekend(), isFalse); // Thursday - expect(DateTime(2000, 1, 7).isWeekend(), isFalse); // Friday - expect(DateTime(2000, 1, 8).isWeekend(), isTrue); // Saturday - expect(DateTime(2000, 1, 9).isWeekend(), isTrue); // Sunday - }); - - test('returns correct values for Arabic locale', () { - // Set locale to Arabic - Intl.defaultLocale = 'ar'; - - expect(DateTime(2000, 1, 3).isWeekend(), isFalse); // Monday - expect(DateTime(2000, 1, 4).isWeekend(), isFalse); // Tuesday - expect(DateTime(2000, 1, 5).isWeekend(), isFalse); // Wednesday - expect(DateTime(2000, 1, 6).isWeekend(), isFalse); // Thursday - expect(DateTime(2000, 1, 7).isWeekend(), isTrue); // Friday - expect(DateTime(2000, 1, 8).isWeekend(), isTrue); // Saturday - expect(DateTime(2000, 1, 9).isWeekend(), isFalse); // Sunday - }); - - test('returns correct values for Pashto locale', () { - // Set locale to Pashto - Intl.defaultLocale = 'ps'; - - expect(DateTime(2000, 1, 3).isWeekend(), isFalse); // Monday - expect(DateTime(2000, 1, 4).isWeekend(), isFalse); // Tuesday - expect(DateTime(2000, 1, 5).isWeekend(), isFalse); // Wednesday - expect(DateTime(2000, 1, 6).isWeekend(), isTrue); // Thursday - expect(DateTime(2000, 1, 7).isWeekend(), isTrue); // Friday - expect(DateTime(2000, 1, 8).isWeekend(), isFalse); // Saturday - expect(DateTime(2000, 1, 9).isWeekend(), isFalse); // Sunday - }); - }); - - group('roundToMidnight', () { - test('returns same date if already midnight', () { - final date = DateTime(2000, 1, 12); - final actual = date.roundToMidnight(); - expect(actual, date); - }); - - test('returns same date if hour is less than 12', () { - final date = DateTime(2000, 1, 12, 7); - final expected = DateTime(2000, 1, 12); - final actual = date.roundToMidnight(); - expect(actual, expected); - }); - - test('returns next day if hour is 12', () { - final date = DateTime(2000, 1, 12, 12); - final expected = DateTime(2000, 1, 13); - final actual = date.roundToMidnight(); - expect(actual, expected); - }); - - test('returns next day if hour is greater than 12', () { - final date = DateTime(2000, 1, 12, 23); - final expected = DateTime(2000, 1, 13); - final actual = date.roundToMidnight(); - expect(actual, expected); - }); - }); -} diff --git a/apps/flutter_parent/test/utils/core_extensions/list_extensions_test.dart b/apps/flutter_parent/test/utils/core_extensions/list_extensions_test.dart deleted file mode 100644 index 884f09380c..0000000000 --- a/apps/flutter_parent/test/utils/core_extensions/list_extensions_test.dart +++ /dev/null @@ -1,186 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:flutter_parent/utils/core_extensions/list_extensions.dart'; -import 'package:flutter_test/flutter_test.dart'; - -void main() { - group('sortBy', () { - test('sortBy returns null if list is null', () { - final List? unsorted = null; - final List? actual = unsorted.sortBySelector([(it) => it]); - expect(actual, isNull); - }); - - test('sortBy correctly sorts in ascending order', () { - final List unsorted = [3, 4, 2, 5, 1]; - final List expected = [1, 2, 3, 4, 5]; - final List? actual = unsorted.sortBySelector([(it) => it]); - expect(actual, expected); - }); - - test('sortBy correctly sorts in descending order', () { - final List unsorted = [3, 4, 2, 5, 1]; - final List expected = [5, 4, 3, 2, 1]; - final List? actual = unsorted.sortBySelector([(it) => it], descending: true); - expect(actual, expected); - }); - - test('sortBy throws ArgumentError for NullSortOrder.none when comparing null and non-null values', () { - final unsorted = [ - _TestClass(number: 1), - _TestClass(number: 2), - _TestClass(number: null), - ]; - expect( - () => unsorted.sortBySelector([(it) => it?.number], nullSortOrder: NullSortOrder.none), - throwsArgumentError, - ); - }); - - test('sortBy does not throw ArgumentError for NullSortOrder.none when comparing all null values', () { - final unsorted = [ - _TestClass(number: null), - _TestClass(number: null), - _TestClass(number: null), - ]; - expect( - unsorted.sortBySelector([(it) => it?.number], nullSortOrder: NullSortOrder.none), - unsorted, - ); - }); - - test('sortBy correctly sorts with NullSortOrder.greaterThan', () { - final unsorted = [ - _TestClass(number: null, text: '1'), - _TestClass(number: 2, text: '2'), - _TestClass(number: null, text: '3'), - ]; - final expected = [unsorted[1], unsorted[0], unsorted[2]]; - final actual = unsorted.sortBySelector([(it) => it?.number, (it) => it?.text], nullSortOrder: NullSortOrder.greaterThan); - expect(actual, expected); - }); - - test('sortBy correctly sorts with NullSortOrder.lessThan', () { - final unsorted = [ - _TestClass(number: null, text: '1'), - _TestClass(number: 2, text: '2'), - _TestClass(number: null, text: '3'), - ]; - final expected = [unsorted[0], unsorted[2], unsorted[1]]; - final actual = unsorted.sortBySelector([(it) => it?.number, (it) => it?.text], nullSortOrder: NullSortOrder.lessThan); - expect(actual, expected); - }); - - test('sortBy correctly sorts with NullSortOrder.equal', () { - final unsorted = [ - _TestClass(number: null, text: '1'), - _TestClass(number: 2, text: '2'), - _TestClass(number: null, text: '3'), - ]; - final expected = [unsorted[0], unsorted[1], unsorted[2]]; - final actual = unsorted.sortBySelector([(it) => it?.number, (it) => it?.text], nullSortOrder: NullSortOrder.equal); - expect(actual, expected); - }); - - test('sortBy performs a stable sort with null comparisons', () { - final unsorted = [ - _TestClass(number: 1, text: '1'), - _TestClass(number: null, text: '2'), - _TestClass(number: 3, text: '3'), - _TestClass(number: null, text: '4'), - _TestClass(number: 5, text: '5'), - _TestClass(number: null, text: '6'), - _TestClass(number: 7, text: '7'), - ]; - final expected = [unsorted[0], unsorted[2], unsorted[4], unsorted[6], unsorted[1], unsorted[3], unsorted[5]]; - final actual = unsorted.sortBySelector([(it) => it?.number]); - expect(actual, expected); - }); - - test('sortBy falls back to subsequent selectors', () { - DateTime now = DateTime.now(); - final unsorted = [ - _TestClass(date: now, number: 123, text: '4'), - _TestClass(date: now, number: 123, text: '2'), - _TestClass(date: now, number: 123, text: '3'), - _TestClass(date: now, number: 123, text: '1'), - _TestClass(date: now, number: 123, text: '0'), - _TestClass(date: now, number: 123, text: '6'), - _TestClass(date: now, number: 123, text: '5'), - ]; - final expected = [unsorted[4], unsorted[3], unsorted[1], unsorted[2], unsorted[0], unsorted[6], unsorted[5]]; - final actual = unsorted.sortBySelector([(it) => it?.date, (it) => it?.number, (it) => it?.text]); - expect(actual, expected); - }); - }); - - group('count', () { - test('count returns 0 for empty list', () { - List<_TestClass> list = []; - expect(list.count((it) => it?.number != null ? false : it!.number! < 5), 0); - }); - - test('count returns 0 if predicate is always false', () { - List<_TestClass> list = List<_TestClass>.generate(100, (index) => _TestClass(number: index)); - expect(list.count((_) => false), 0); - }); - - test('count returns 0 if list is null', () { - List<_TestClass>? list = null; - expect(list.count((_) => false), 0); - }); - - test('count returns correct count based on predicate', () { - List<_TestClass> list = List<_TestClass>.generate(100, (index) => _TestClass(number: index)); - expect(list.count((it) => it?.number == null ? false : it!.number! < 50), 50); - }); - - test('count returns list size if predicate is always true', () { - List<_TestClass> list = List<_TestClass>.generate(100, (index) => _TestClass(number: index)); - expect(list.count((_) => true), 100); - }); - }); - - group('mapIndexed', () { - test('Maps items with index', () { - List original = ['', 'A', 'AB', 'ABC']; - List expected = ['0', '1', '2', '3']; - - List? actual = original.mapIndexed((index, item) { - expect(item, original[index]); - return item?.length.toString(); - }); - - expect(actual, expected); - }); - - test('Returns null if list is null', () { - List? original = null; - List? actual = original.mapIndexed((index, item) => ''); - expect(actual, isNull); - }); - }); -} - -class _TestClass { - final int? number; - final String? text; - final DateTime? date; - - _TestClass({this.number, this.text, this.date}); - - @override - String toString() => 'number: $number, text: $text, date: $date'; -} diff --git a/apps/flutter_parent/test/utils/db/calendar_filter_db_test.dart b/apps/flutter_parent/test/utils/db/calendar_filter_db_test.dart deleted file mode 100644 index d41ebb13f1..0000000000 --- a/apps/flutter_parent/test/utils/db/calendar_filter_db_test.dart +++ /dev/null @@ -1,258 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:built_collection/built_collection.dart'; -import 'package:flutter_parent/models/calendar_filter.dart'; -import 'package:flutter_parent/utils/db/calendar_filter_db.dart'; -import 'package:mockito/mockito.dart'; -import 'package:sqflite/sqflite.dart'; -import 'package:test/test.dart'; - -import '../test_app.dart'; -import '../test_helpers/mock_helpers.dart'; -import '../test_helpers/mock_helpers.mocks.dart'; - -void main() { - final database = MockDatabase(); - - setupTestLocator((locator) { - locator.registerLazySingleton(() => database); - }); - - setUp(() { - reset(database); - }); - - test('createTable executes a create table statement', () async { - CalendarFilterDb.createTable(database, 0); - verify(database.execute(argThat(contains('create table ${CalendarFilterDb.tableName}')))); - }); - - test('updateTable executes a create table statement if last db version was less than 2', () async { - final lastVersion = 1; - final thisVersion = 100; - CalendarFilterDb.updateTable(database, lastVersion, thisVersion); - verify(database.execute(argThat(contains('create table ${CalendarFilterDb.tableName}')))); - }); - - test('updateTable does not create table if last db version was 2 or higher', () async { - final lastVersion = 2; - final thisVersion = 3; - CalendarFilterDb.updateTable(database, lastVersion, thisVersion); - verifyNever(database.execute(argThat(contains('create table ${CalendarFilterDb.tableName}')))); - }); - - test('insertOrUpdate performs insert if there is no existing item, and returns inserted item with id', () async { - final calendarFilter = CalendarFilter((b) => b - ..userDomain = 'domain' - ..userId = 'user-id' - ..observeeId = 'observee-id' - ..filters = SetBuilder()); - - final expected = calendarFilter.rebuild((b) => b..id = 123); - - // Mock no existing item, i.e. return nothing for 'getByObserveeId' - when(database.query( - any, - columns: CalendarFilterDb.allColumns, - where: - '${CalendarFilterDb.columnUserDomain} = ? AND ${CalendarFilterDb.columnUserId} = ? AND ${CalendarFilterDb.columnObserveeId} = ?', - whereArgs: anyNamed('whereArgs'), - )).thenAnswer((_) async => []); - - // Mock inserted item - when(database.query( - any, - columns: CalendarFilterDb.allColumns, - where: '${CalendarFilterDb.columnId} = ?', - whereArgs: anyNamed('whereArgs'), - )).thenAnswer((_) async => [CalendarFilterDb.toMap(expected)]); - - var actual = await CalendarFilterDb().insertOrUpdate(calendarFilter); - - expect(actual, expected); - - verify(database.insert(CalendarFilterDb.tableName, CalendarFilterDb.toMap(calendarFilter))); - }); - - test('insertOrUpdate performs update if there is an existing item, and returns updated item', () async { - final calendarFilter = CalendarFilter((b) => b - ..userDomain = 'domain' - ..userId = 'user-id' - ..observeeId = 'observee-id' - ..filters = SetBuilder({'course_123'})); - - final existing = calendarFilter.rebuild((b) => b - ..id = 123 - ..filters = SetBuilder()); - - final expected = calendarFilter.rebuild((b) => b..id = 123); - - // Mock existing item - when(database.query( - any, - columns: CalendarFilterDb.allColumns, - where: - '${CalendarFilterDb.columnUserDomain} = ? AND ${CalendarFilterDb.columnUserId} = ? AND ${CalendarFilterDb.columnObserveeId} = ?', - whereArgs: anyNamed('whereArgs'), - )).thenAnswer((_) async => [CalendarFilterDb.toMap(existing)]); - - // Mock updated item - when(database.query( - any, - columns: CalendarFilterDb.allColumns, - where: '${CalendarFilterDb.columnId} = ?', - whereArgs: anyNamed('whereArgs'), - )).thenAnswer((_) async => [CalendarFilterDb.toMap(expected)]); - - var actual = await CalendarFilterDb().insertOrUpdate(calendarFilter); - - expect(actual, expected); - - verify(database.update( - CalendarFilterDb.tableName, - CalendarFilterDb.toMap(expected), - where: '${CalendarFilterDb.columnId} = ?', - whereArgs: [123], - )); - }); - - test('getById queries the database', () async { - final calendarFilterId = 123; - - when(database.query( - any, - columns: anyNamed('columns'), - where: anyNamed('where'), - whereArgs: anyNamed('whereArgs'), - )).thenAnswer((_) async => []); - - await CalendarFilterDb().getById(calendarFilterId); - - verify(database.query( - CalendarFilterDb.tableName, - columns: CalendarFilterDb.allColumns, - where: '${CalendarFilterDb.columnId} = ?', - whereArgs: [calendarFilterId], - )); - }); - - test('getByObserveeId queries the database', () async { - final domain = 'domain'; - final userId = 'userId'; - final observeeId = 'observeeId'; - - when(database.query( - any, - columns: anyNamed('columns'), - where: anyNamed('where'), - whereArgs: anyNamed('whereArgs'), - )).thenAnswer((_) async => []); - - await CalendarFilterDb().getByObserveeId(domain, userId, observeeId); - - verify(database.query( - CalendarFilterDb.tableName, - columns: CalendarFilterDb.allColumns, - where: - '${CalendarFilterDb.columnUserDomain} = ? AND ${CalendarFilterDb.columnUserId} = ? AND ${CalendarFilterDb.columnObserveeId} = ?', - whereArgs: [domain, userId, observeeId], - )); - }); - - test('deleteById deletes from the database', () async { - final calendarFilterId = 123; - - await CalendarFilterDb().deleteById(calendarFilterId); - - verify(database.delete( - CalendarFilterDb.tableName, - where: '${CalendarFilterDb.columnId} = ?', - whereArgs: [calendarFilterId], - )); - }); - - test('deleteAllForUser deletes from the database', () async { - final domain = 'domain'; - final userId = 'userId'; - - await CalendarFilterDb().deleteAllForUser(domain, userId); - - verify(database.delete( - CalendarFilterDb.tableName, - where: '${CalendarFilterDb.columnUserDomain} = ? AND ${CalendarFilterDb.columnUserId} = ?', - whereArgs: [domain, userId], - )); - }); - - group('joinFilters', () { - test('joinfilters returns empty string for empty filter list', () { - Set filters = {}; - final expected = ''; - final actual = CalendarFilterDb.joinFilters(filters); - expect(actual, expected); - }); - - test('joinfilters returns empty string for null filter list', () { - Set? filters = null; - final expected = ''; - final actual = CalendarFilterDb.joinFilters(filters); - expect(actual, expected); - }); - - test('joinfilters returns correct string for single-item filter list', () { - Set filters = {'ABC'}; - final expected = 'ABC'; - final actual = CalendarFilterDb.joinFilters(filters); - expect(actual, expected); - }); - - test('joinfilters returns correct string for multi-item filter list', () { - Set filters = {'ABC', '123', 'DEF', '456'}; - final expected = 'ABC|123|DEF|456'; - final actual = CalendarFilterDb.joinFilters(filters); - expect(actual, expected); - }); - }); - - group('splitFilters', () { - test('splitFilters returns empty list for empty string', () { - String input = ''; - List expected = []; - final actual = CalendarFilterDb.splitFilters(input); - expect(actual, expected); - }); - - test('splitFilters returns empty list for null string', () { - String? input = null; - List expected = []; - final actual = CalendarFilterDb.splitFilters(input); - expect(actual, expected); - }); - - test('splitFilters returns single-item list for single-item string', () { - String input = 'ABC'; - List expected = ['ABC']; - final actual = CalendarFilterDb.splitFilters(input); - expect(actual, expected); - }); - - test('splitFilters returns multi-item list for multi-item string', () { - String input = 'ABC|123|DEF|456'; - List expected = ['ABC', '123', 'DEF', '456']; - final actual = CalendarFilterDb.splitFilters(input); - expect(actual, expected); - }); - }); -} diff --git a/apps/flutter_parent/test/utils/db/db_utils_test.dart b/apps/flutter_parent/test/utils/db/db_utils_test.dart deleted file mode 100644 index fa3d02324c..0000000000 --- a/apps/flutter_parent/test/utils/db/db_utils_test.dart +++ /dev/null @@ -1,23 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:flutter_parent/utils/db/db_util.dart'; -import 'package:flutter_test/flutter_test.dart'; - -void main() { - - test('instance throws StateError if not initialized', () async { - expect(() => DbUtil.instance, throwsStateError); - }); -} diff --git a/apps/flutter_parent/test/utils/db/reminder_db_test.dart b/apps/flutter_parent/test/utils/db/reminder_db_test.dart deleted file mode 100644 index 04691f2c96..0000000000 --- a/apps/flutter_parent/test/utils/db/reminder_db_test.dart +++ /dev/null @@ -1,153 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:flutter_parent/models/reminder.dart'; -import 'package:flutter_parent/utils/db/reminder_db.dart'; -import 'package:mockito/mockito.dart'; -import 'package:sqflite/sqflite.dart'; -import 'package:test/test.dart'; - -import '../test_app.dart'; -import '../test_helpers/mock_helpers.dart'; -import '../test_helpers/mock_helpers.mocks.dart'; - -void main() { - final database = MockDatabase(); - - setupTestLocator((locator) { - locator.registerLazySingleton(() => database); - }); - - setUp(() { - reset(database); - }); - - test('createTable executes a create table statement', () async { - ReminderDb.createTable(database, 0); - verify(database.execute(argThat(contains('create table ${ReminderDb.tableName}')))); - }); - - test('insert performs insert on database and returns inserted item with id', () async { - final reminder = Reminder((b) => b - ..userDomain = 'domain' - ..userId = 'user-id' - ..type = 'type' - ..itemId = 'item-id' - ..date = DateTime.now()); - - final expected = reminder.rebuild((b) => b..id = 123); - - when(database.query( - any, - columns: anyNamed('columns'), - where: anyNamed('where'), - whereArgs: anyNamed('whereArgs'), - )).thenAnswer((_) async => [ReminderDb.toMap(expected)]); - - var actual = await ReminderDb().insert(reminder); - - expect(actual, expected); - verify(database.insert(ReminderDb.tableName, ReminderDb.toMap(reminder))); - }); - - test('getById queries the database', () async { - final reminderId = 123; - - when(database.query( - any, - columns: anyNamed('columns'), - where: anyNamed('where'), - whereArgs: anyNamed('whereArgs'), - )).thenAnswer((_) async => []); - - await ReminderDb().getById(reminderId); - - verify(database.query( - ReminderDb.tableName, - columns: ReminderDb.allColumns, - where: '${ReminderDb.columnId} = ?', - whereArgs: [reminderId], - )); - }); - - test('getByItem queries the database', () async { - final domain = 'domain'; - final userId = 'userId'; - final type = 'type'; - final itemId = 'itemId'; - - when(database.query( - any, - columns: anyNamed('columns'), - where: anyNamed('where'), - whereArgs: anyNamed('whereArgs'), - )).thenAnswer((_) async => []); - - await ReminderDb().getByItem(domain, userId, type, itemId); - - verify(database.query( - ReminderDb.tableName, - columns: ReminderDb.allColumns, - where: - '${ReminderDb.columnUserDomain} = ? AND ${ReminderDb.columnUserId} = ? AND ${ReminderDb.columnType} = ? AND ${ReminderDb.columnItemId} = ?', - whereArgs: [domain, userId, type, itemId], - )); - }); - - test('getAllForUser queries the database', () async { - final domain = 'domain'; - final userId = 'userId'; - - when(database.query( - any, - columns: anyNamed('columns'), - where: anyNamed('where'), - whereArgs: anyNamed('whereArgs'), - )).thenAnswer((_) async => []); - - await ReminderDb().getAllForUser(domain, userId); - - verify(database.query( - ReminderDb.tableName, - columns: ReminderDb.allColumns, - where: '${ReminderDb.columnUserDomain} = ? AND ${ReminderDb.columnUserId} = ?', - whereArgs: [domain, userId], - )); - }); - - test('deleteById deletes from the database', () async { - final reminderId = 123; - - await ReminderDb().deleteById(reminderId); - - verify(database.delete( - ReminderDb.tableName, - where: '${ReminderDb.columnId} = ?', - whereArgs: [reminderId], - )); - }); - - test('deleteAllForUser deletes from the database', () async { - final domain = 'domain'; - final userId = 'userId'; - - await ReminderDb().deleteAllForUser(domain, userId); - - verify(database.delete( - ReminderDb.tableName, - where: '${ReminderDb.columnUserDomain} = ? AND ${ReminderDb.columnUserId} = ?', - whereArgs: [domain, userId], - )); - }); -} diff --git a/apps/flutter_parent/test/utils/db/user_colors_db_test.dart b/apps/flutter_parent/test/utils/db/user_colors_db_test.dart deleted file mode 100644 index 84be2733da..0000000000 --- a/apps/flutter_parent/test/utils/db/user_colors_db_test.dart +++ /dev/null @@ -1,251 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:built_collection/built_collection.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_parent/models/user_color.dart'; -import 'package:flutter_parent/models/user_colors.dart'; -import 'package:flutter_parent/utils/db/user_colors_db.dart'; -import 'package:mockito/mockito.dart'; -import 'package:sqflite/sqflite.dart'; -import 'package:test/test.dart'; - -import '../test_app.dart'; -import '../test_helpers/mock_helpers.dart'; -import '../test_helpers/mock_helpers.mocks.dart'; - -void main() { - final database = MockDatabase(); - - setupTestLocator((locator) { - locator.registerLazySingleton(() => database); - }); - - setUp(() { - reset(database); - }); - - test('createTable executes a create table statement', () async { - UserColorsDb.createTable(database, 0); - verify(database.execute(argThat(contains('create table ${UserColorsDb.tableName}')))); - }); - - test('updateTable executes a create table statement if last db version was less than 4', () async { - final lastVersion = 3; - final thisVersion = 100; - UserColorsDb.updateTable(database, lastVersion, thisVersion); - verify(database.execute(argThat(contains('create table ${UserColorsDb.tableName}')))); - }); - - test('updateTable does not create table if last db version was 4 or higher', () async { - final lastVersion = 4; - final thisVersion = 5; - UserColorsDb.updateTable(database, lastVersion, thisVersion); - verifyNever(database.execute(argThat(contains('create table ${UserColorsDb.tableName}')))); - }); - - test('insertOrUpdate performs insert if there is no existing item, and returns inserted item with id', () async { - final userColor = UserColor((b) => b - ..userDomain = 'domain' - ..userId = 'user-id' - ..canvasContext = 'canvas-context' - ..color = Color(0xFF00ACEC)); - - final expected = userColor.rebuild((b) => b..id = 123); - - // Mock no existing item, i.e. return nothing for 'getByContext' - when(database.query( - any, - columns: UserColorsDb.allColumns, - where: - '${UserColorsDb.columnUserDomain} = ? AND ${UserColorsDb.columnUserId} = ? AND ${UserColorsDb.columnCanvasContext} = ?', - whereArgs: anyNamed('whereArgs'), - )).thenAnswer((_) async => []); - - // Mock inserted item - when(database.query( - any, - columns: UserColorsDb.allColumns, - where: '${UserColorsDb.columnId} = ?', - whereArgs: anyNamed('whereArgs'), - )).thenAnswer((_) async => [UserColorsDb.toMap(expected)]); - - var actual = await UserColorsDb().insertOrUpdate(userColor); - - expect(actual, expected); - - verify(database.insert(UserColorsDb.tableName, UserColorsDb.toMap(userColor))); - }); - - test('insertOrUpdate performs update if there is an existing item, and returns updated item', () async { - Color oldColor = Color(0xFF00ACEC); - Color newColor = Color(0xFFACEC00); - - final userColor = UserColor((b) => b - ..userDomain = 'domain' - ..userId = 'user-id' - ..canvasContext = 'canvas-context' - ..color = newColor); - - final existing = userColor.rebuild((b) => b - ..id = 123 - ..color = oldColor); - - final expected = userColor.rebuild((b) => b..id = 123); - - // Mock existing item - when(database.query( - any, - columns: UserColorsDb.allColumns, - where: - '${UserColorsDb.columnUserDomain} = ? AND ${UserColorsDb.columnUserId} = ? AND ${UserColorsDb.columnCanvasContext} = ?', - whereArgs: anyNamed('whereArgs'), - )).thenAnswer((_) async => [UserColorsDb.toMap(existing)]); - - // Mock updated item - when(database.query( - any, - columns: UserColorsDb.allColumns, - where: '${UserColorsDb.columnId} = ?', - whereArgs: anyNamed('whereArgs'), - )).thenAnswer((_) async => [UserColorsDb.toMap(expected)]); - - var actual = await UserColorsDb().insertOrUpdate(userColor); - - expect(actual, expected); - - verify(database.update( - UserColorsDb.tableName, - UserColorsDb.toMap(expected), - where: '${UserColorsDb.columnId} = ?', - whereArgs: [123], - )); - }); - - test('getById queries the database', () async { - final userColorId = 123; - - when(database.query( - any, - columns: anyNamed('columns'), - where: anyNamed('where'), - whereArgs: anyNamed('whereArgs'), - )).thenAnswer((_) async => []); - - await UserColorsDb().getById(userColorId); - - verify(database.query( - UserColorsDb.tableName, - columns: UserColorsDb.allColumns, - where: '${UserColorsDb.columnId} = ?', - whereArgs: [userColorId], - )); - }); - - test('getByContext queries the database', () async { - final domain = 'domain'; - final userId = 'userId'; - final canvasContext = 'user_123'; - - when(database.query( - any, - columns: anyNamed('columns'), - where: anyNamed('where'), - whereArgs: anyNamed('whereArgs'), - )).thenAnswer((_) async => []); - - await UserColorsDb().getByContext(domain, userId, canvasContext); - - verify(database.query( - UserColorsDb.tableName, - columns: UserColorsDb.allColumns, - where: - '${UserColorsDb.columnUserDomain} = ? AND ${UserColorsDb.columnUserId} = ? AND ${UserColorsDb.columnCanvasContext} = ?', - whereArgs: [domain, userId, canvasContext], - )); - }); - - test('deleteById deletes from the database', () async { - final userColorId = 123; - - await UserColorsDb().deleteById(userColorId); - - verify(database.delete( - UserColorsDb.tableName, - where: '${UserColorsDb.columnId} = ?', - whereArgs: [userColorId], - )); - }); - - test('deleteAllForUser deletes from the database', () async { - final domain = 'domain'; - final userId = 'userId'; - - await UserColorsDb().deleteAllForUser(domain, userId); - - verify(database.delete( - UserColorsDb.tableName, - where: '${UserColorsDb.columnUserDomain} = ? AND ${UserColorsDb.columnUserId} = ?', - whereArgs: [domain, userId], - )); - }); - - test('parseColor parses 6 digit CSS colors', () { - String colorString = '#00ACEC'; - Color expectedColor = Color(0xFF00ACEC); - - expect(UserColorsDb.parseColor(colorString), expectedColor); - }); - - test('insertOrUpdateAll inserts all colors', () async { - String domain = 'domain'; - String userId = 'user-id'; - - UserColors colors = UserColors((b) => b - ..customColors = MapBuilder({ - 'student_1': '#00ACEC', - 'student_2': '#ACEC00', - 'student_3': '#EC00AC', - })); - - // Mock no existing items, i.e. return nothing for 'getByContext' - when(database.query( - any, - columns: UserColorsDb.allColumns, - where: - '${UserColorsDb.columnUserDomain} = ? AND ${UserColorsDb.columnUserId} = ? AND ${UserColorsDb.columnCanvasContext} = ?', - whereArgs: anyNamed('whereArgs'), - )).thenAnswer((_) async => []); - - // Mock inserted items - when(database.query( - any, - columns: UserColorsDb.allColumns, - where: '${UserColorsDb.columnId} = ?', - whereArgs: anyNamed('whereArgs'), - )).thenAnswer((_) async => []); - - await UserColorsDb().insertOrUpdateAll(domain, userId, colors); - - for (var entry in colors.customColors.entries) { - final userColor = UserColor((b) => b - ..userDomain = 'domain' - ..userId = 'user-id' - ..canvasContext = entry.key - ..color = UserColorsDb.parseColor(entry.value)); - - verify(database.insert(UserColorsDb.tableName, UserColorsDb.toMap(userColor))); - } - }); -} diff --git a/apps/flutter_parent/test/utils/debouncer_test.dart b/apps/flutter_parent/test/utils/debouncer_test.dart deleted file mode 100644 index 49e26dcfba..0000000000 --- a/apps/flutter_parent/test/utils/debouncer_test.dart +++ /dev/null @@ -1,69 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:flutter_parent/utils/debouncer.dart'; -import 'package:test/test.dart'; - -void main() { - test('debouncer calls callback', () async { - var called = false; - - var debouncer = Debouncer(Duration(milliseconds: 10)); - debouncer.debounce(() { - called = true; - }); - - await Future.delayed(const Duration(milliseconds: 20), () {}); - expect(called, true); - }); - - test('debouncer calls callback after duration', () async { - var called = false; - - var debouncer = Debouncer(Duration(milliseconds: 30)); - debouncer.debounce(() { - called = true; - }); - - // Make sure we haven't been called yet - await Future.delayed(const Duration(milliseconds: 10), () {}); - expect(called, false); - - // Check to make sure we got called - await Future.delayed(const Duration(milliseconds: 20), () {}); - expect(called, true); - }); - - test('debouncer does not call callback if called again before debounce', () async { - var called = false; - - // First debounce call - var debouncer = Debouncer(Duration(milliseconds: 50)); - debouncer.debounce(() { - called = true; - }); - - // Second one should cancel out the first - await Future.delayed(const Duration(milliseconds: 20), () {}); - debouncer.debounce(() { - called = true; - }); - - // Should be at the threshold for the first debounce after this call - await Future.delayed(const Duration(milliseconds: 30), () {}); - - // Make sure we didn't call either of the debounce callbacks - expect(called, false); - }); -} diff --git a/apps/flutter_parent/test/utils/design/theme_prefs_test.dart b/apps/flutter_parent/test/utils/design/theme_prefs_test.dart deleted file mode 100644 index bb0e495140..0000000000 --- a/apps/flutter_parent/test/utils/design/theme_prefs_test.dart +++ /dev/null @@ -1,57 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -import 'package:flutter_parent/utils/design/theme_prefs.dart'; -import 'package:test/test.dart'; - -import '../platform_config.dart'; -import '../test_app.dart'; - -void main() async { - setUp(() async { - // Setup the platform channel with an empty map so our prefs work - await setupPlatformChannels(config: PlatformConfig(mockPrefs: {})); - await ThemePrefs.init(); - await ThemePrefs.clear(); - }); - - test('defaults dark mode to false', () { - expect(ThemePrefs().darkMode, isFalse); - }); - - test('defaults webview dark mode to false', () { - expect(ThemePrefs().webViewDarkMode, isFalse); - }); - - test('defaults hc mode to false', () { - expect(ThemePrefs().hcMode, isFalse); - }); - - test('can set dark mode', () { - final prefs = ThemePrefs(); - prefs.darkMode = true; - expect(prefs.darkMode, isTrue); - }); - - test('can set webview dark mode', () { - final prefs = ThemePrefs(); - prefs.webViewDarkMode = true; - expect(prefs.webViewDarkMode, isTrue); - }); - - test('can set hc mode', () { - final prefs = ThemePrefs(); - prefs.hcMode = true; - expect(prefs.hcMode, isTrue); - }); -} diff --git a/apps/flutter_parent/test/utils/finders.dart b/apps/flutter_parent/test/utils/finders.dart deleted file mode 100644 index 05ac27ef84..0000000000 --- a/apps/flutter_parent/test/utils/finders.dart +++ /dev/null @@ -1,38 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:flutter/widgets.dart'; -import 'package:flutter_test/flutter_test.dart'; - -extension Finders on CommonFinders { - Finder richText(String text, {bool skipOffstage = true}) => RichTextFinder(text, skipOffstage: skipOffstage); -} - -class RichTextFinder extends MatchFinder { - RichTextFinder(this.text, {bool skipOffstage = true}) : super(skipOffstage: skipOffstage); - - final String text; - - @override - String get description => 'rich text "$text"'; - - @override - bool matches(Element candidate) { - final Widget widget = candidate.widget; - if (widget is RichText) { - return widget.text.toPlainText() == text; - } - return false; - } -} diff --git a/apps/flutter_parent/test/utils/network_image_response.dart b/apps/flutter_parent/test/utils/network_image_response.dart deleted file mode 100644 index 0dbd430888..0000000000 --- a/apps/flutter_parent/test/utils/network_image_response.dart +++ /dev/null @@ -1,59 +0,0 @@ -// Copyright (C) 2019 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -// Sourced from https://github.com/flutter/flutter/blob/1ce4a4f36fc063ec78af56ea8df06e15e80c1dc8/dev/manual_tests/test/mock_image_http.dart - -import 'dart:io'; - -import 'package:flutter_test/flutter_test.dart'; -import 'package:mockito/mockito.dart'; -import 'package:transparent_image/transparent_image.dart'; - -import 'test_helpers/mock_helpers.dart'; -import 'test_helpers/mock_helpers.mocks.dart'; - -void mockNetworkImageResponse() { - final TestWidgetsFlutterBinding binding = TestWidgetsFlutterBinding.ensureInitialized(); - binding.runAsync(() async { - HttpOverrides.global = _ImageHttpOverrides(); - }); - ; -} - -class _ImageHttpOverrides extends HttpOverrides { - @override - HttpClient createHttpClient(SecurityContext? _) { - final client = MockHttpClient(); - final request = MockHttpClientRequest(); - final response = MockHttpClientResponse(); - final headers = MockHttpHeaders(); - - when(client.getUrl(any)).thenAnswer((_) => Future.value(request)); - when(request.headers).thenReturn(headers); - when(request.close()).thenAnswer((_) => Future.value(response)); - when(response.contentLength).thenReturn(kTransparentImage.length); - when(response.statusCode).thenReturn(HttpStatus.ok); - when(response.compressionState).thenReturn(HttpClientResponseCompressionState.compressed); - when(response.listen(any)).thenAnswer((Invocation invocation) { - final void Function(List) onData = invocation.positionalArguments[0]; - final void Function() onDone = invocation.namedArguments[#onDone]; - final void Function(Object, [StackTrace]) onError = invocation.namedArguments[#onError]; - final bool cancelOnError = invocation.namedArguments[#cancelOnError]; - - return Stream>.fromIterable(>[kTransparentImage]) - .listen(onData, onDone: onDone, onError: onError, cancelOnError: cancelOnError); - }); - return client; - } -} diff --git a/apps/flutter_parent/test/utils/notification_util_test.dart b/apps/flutter_parent/test/utils/notification_util_test.dart deleted file mode 100644 index 65d5fd0495..0000000000 --- a/apps/flutter_parent/test/utils/notification_util_test.dart +++ /dev/null @@ -1,202 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'dart:async'; -import 'dart:convert'; - -import 'package:flutter_local_notifications/flutter_local_notifications.dart'; -import 'package:flutter_parent/l10n/app_localizations.dart'; -import 'package:flutter_parent/models/notification_payload.dart'; -import 'package:flutter_parent/models/reminder.dart'; -import 'package:flutter_parent/models/serializers.dart'; -import 'package:flutter_parent/network/utils/analytics.dart'; -import 'package:flutter_parent/utils/db/reminder_db.dart'; -import 'package:flutter_parent/utils/notification_util.dart'; -import 'package:mockito/mockito.dart'; -import 'package:test/test.dart'; -import 'package:timezone/data/latest_all.dart' as tz; -import 'package:timezone/timezone.dart' as tz; - -import 'test_app.dart'; -import 'test_helpers/mock_helpers.mocks.dart'; - -void main() { - final plugin = MockAndroidFlutterLocalNotificationsPlugin(); - final database = MockReminderDb(); - final analytics = MockAnalytics(); - - setupTestLocator((locator) { - locator.registerLazySingleton(() => database); - locator.registerLazySingleton(() => analytics); - }); - - setUp(() { - reset(plugin); - reset(database); - NotificationUtil.initForTest(plugin); - tz.initializeTimeZones(); - }); - - test('initializes plugin with expected parameters', () async { - await NotificationUtil.init(null); - - final verification = verify(plugin.initialize( - captureAny, - onDidReceiveNotificationResponse: captureAnyNamed('onDidReceiveNotificationResponse'), - )); - - AndroidInitializationSettings initSettings = verification.captured[0]; - expect(initSettings.defaultIcon, 'ic_notification_canvas_logo'); - - var callback = verification.captured[1]; - expect(callback, isNotNull); - }); - - test('handleReminder deletes reminder from database', () async { - final Completer _appCompleter = Completer(); - final reminder = Reminder((b) => b - ..id = 123 - ..date = DateTime.now().toUtc()); - final payload = NotificationPayload((b) => b - ..type = NotificationPayloadType.reminder - ..data = json.encode(serialize(reminder))); - - await NotificationUtil.handleReminder(payload, _appCompleter); - - verify(database.deleteById(reminder.id)); - }); - - test('handlePayload handles reminders', () async { - final reminder = Reminder((b) => b - ..id = 123 - ..date = DateTime.now().toUtc()); - final payload = NotificationPayload((b) => b - ..type = NotificationPayloadType.reminder - ..data = json.encode(serialize(reminder))); - - final rawPayload = json.encode(serialize(payload)); - - await NotificationUtil.handlePayload(rawPayload, null); - - verify(database.deleteById(reminder.id)); - }); - - test('handlePayload handles other types', () async { - final payload = NotificationPayload((b) => b..type = NotificationPayloadType.other); - - final rawPayload = json.encode(serialize(payload)); - - await NotificationUtil.handlePayload(rawPayload, null); - // Nothing uses 'other' notification types at the moment, so this test should simply complete without errors - }); - - test('handlePayload catches deserialization errors', () async { - await NotificationUtil.handlePayload('', null); - // No error should be thrown and test should complete successfully - }); - - test('deleteNotification calls cancel on the plugin', () async { - final notificationId = 123; - await NotificationUtil().deleteNotification(notificationId); - - verify(plugin.cancel(notificationId)); - }); - - test('deleteNotifications calls cancel on the plugin for each id', () async { - final notificationIds = [123, 234, 345]; - await NotificationUtil().deleteNotifications(notificationIds); - - verify(plugin.cancel(notificationIds[0])); - verify(plugin.cancel(notificationIds[1])); - verify(plugin.cancel(notificationIds[2])); - }); - - test('scheduleReminder calls plugin with expected parameters for an event', () async { - await setupPlatformChannels(); - - final reminder = Reminder((b) => b - ..id = 123 - ..date = DateTime.now().toUtc()); - - final expectedPayload = NotificationPayload((b) => b - ..type = NotificationPayloadType.reminder - ..data = json.encode(serialize(reminder))); - - await NotificationUtil().scheduleReminder(AppLocalizations(), 'title', 'body', reminder); - - tz.initializeTimeZones(); - var d = reminder.date!.toUtc(); - var date = tz.TZDateTime.utc(d.year, d.month, d.day, d.hour, d.minute, d.second); - - final AndroidNotificationDetails details = verify(plugin.zonedSchedule( - reminder.id, - 'title', - 'body', - date, - captureAny, - scheduleMode: AndroidScheduleMode.exactAllowWhileIdle, - payload: json.encode(serialize(expectedPayload)) - )).captured.first; - - expect(details.channelId, NotificationUtil.notificationChannelReminders); - expect(details.channelName, AppLocalizations().remindersNotificationChannelName); - expect(details.channelDescription, AppLocalizations().remindersNotificationChannelDescription); - - verify(analytics.logEvent(AnalyticsEventConstants.REMINDER_EVENT_CREATE)); - }); - - test('scheduleReminder calls plugin with expected parameters for an assignment', () async { - await setupPlatformChannels(); - - final reminder = Reminder((b) => b - ..id = 123 - ..type = Reminder.TYPE_ASSIGNMENT - ..date = DateTime.now().toUtc()); - - final expectedPayload = NotificationPayload((b) => b - ..type = NotificationPayloadType.reminder - ..data = json.encode(serialize(reminder))); - - await NotificationUtil().scheduleReminder(AppLocalizations(), 'title', 'body', reminder); - - tz.initializeTimeZones(); - var d = reminder.date!.toUtc(); - var date = tz.TZDateTime.utc(d.year, d.month, d.day, d.hour, d.minute, d.second); - - final AndroidNotificationDetails details = verify(plugin.zonedSchedule( - reminder.id, - 'title', - 'body', - date, - captureAny, - scheduleMode: AndroidScheduleMode.exactAllowWhileIdle, - payload: json.encode(serialize(expectedPayload)), - )).captured.first; - - expect(details.channelId, NotificationUtil.notificationChannelReminders); - expect(details.channelName, AppLocalizations().remindersNotificationChannelName); - expect(details.channelDescription, AppLocalizations().remindersNotificationChannelDescription); - - verify(analytics.logEvent(AnalyticsEventConstants.REMINDER_ASSIGNMENT_CREATE)); - }); - - test('Request exact alarm permission', () async { - when(plugin.requestExactAlarmsPermission()).thenAnswer((_) => Future.value(true)); - - final result = await NotificationUtil().requestScheduleExactAlarmPermission(); - - expect(result, true); - verify(plugin.requestExactAlarmsPermission()); - }); -} diff --git a/apps/flutter_parent/test/utils/old_app_migrations_test.dart b/apps/flutter_parent/test/utils/old_app_migrations_test.dart deleted file mode 100644 index a10c69927b..0000000000 --- a/apps/flutter_parent/test/utils/old_app_migrations_test.dart +++ /dev/null @@ -1,108 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'dart:convert'; - -import 'package:flutter/services.dart'; -import 'package:flutter_parent/models/login.dart'; -import 'package:flutter_parent/models/serializers.dart'; -import 'package:flutter_parent/network/utils/api_prefs.dart'; -import 'package:flutter_parent/utils/old_app_migration.dart'; -import 'package:flutter_test/src/deprecated.dart'; -import 'package:test/test.dart'; - -import 'canvas_model_utils.dart'; -import 'test_app.dart'; - -void main() { - setUp(() async { - await setupPlatformChannels(); - }); - - group('performMigrationIfNecessary', () { - test('does nothing if already migrated', () async { - var channelCalled = false; - OldAppMigration.channel.setMockMethodCallHandler((MethodCall methodCall) async { - channelCalled = true; - return null; - }); - - await ApiPrefs.setHasMigrated(true); - await OldAppMigration().performMigrationIfNecessary(); - - expect(channelCalled, false); - }); - - test('calls channel and sets prefs during migration', () async { - List logins = [ - Login((b) => b..user = CanvasModelTestUtils.mockUser(name: 'User 1').toBuilder()), - Login((b) => b..user = CanvasModelTestUtils.mockUser(name: 'User 2').toBuilder()), - Login((b) => b..user = CanvasModelTestUtils.mockUser(name: 'User 3').toBuilder()), - ]; - - List serializedLogins = logins.map((it) => json.encode(serialize(it))).toList(); - - String? calledMethod; - OldAppMigration.channel.setMockMethodCallHandler((MethodCall methodCall) async { - calledMethod = methodCall.method; - return serializedLogins; - }); - - await ApiPrefs.setHasMigrated(false); - await OldAppMigration().performMigrationIfNecessary(); - - // Should have called correct method - expect(calledMethod, OldAppMigration.methodGetLogins); - - // Should have set hasMigrated to true - expect(ApiPrefs.getHasMigrated(), isTrue); - - // Should have saved all logins - expect(ApiPrefs.getLogins(), logins); - - // Should have current login to first migrated login - expect(ApiPrefs.getCurrentLogin(), logins[0]); - }); - }); - - group('hasOldReminders', () { - test('returns false if already checked', () async { - await ApiPrefs.setHasCheckedOldReminders(true); - var hasReminders = await OldAppMigration().hasOldReminders(); - expect(hasReminders, false); - }); - - test('calls platform channel and sets checked value', () async { - bool channelReturnValue = true; - String? calledMethod; - - OldAppMigration.channel.setMockMethodCallHandler((MethodCall methodCall) async { - calledMethod = methodCall.method; - return channelReturnValue; - }); - - await ApiPrefs.setHasCheckedOldReminders(false); - var hasReminders = await OldAppMigration().hasOldReminders(); - - // Should have called correct channel method - expect(calledMethod, OldAppMigration.methodHasOldReminders); - - // Should have returned value provided by channel - expect(hasReminders, channelReturnValue); - - // Should have updated checked value in prefs - expect(ApiPrefs.getHasCheckedOldReminders(), true); - }); - }); -} diff --git a/apps/flutter_parent/test/utils/platform_config.dart b/apps/flutter_parent/test/utils/platform_config.dart deleted file mode 100644 index 88ee3bfdc1..0000000000 --- a/apps/flutter_parent/test/utils/platform_config.dart +++ /dev/null @@ -1,66 +0,0 @@ -// Copyright (C) 2019 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'dart:core'; - -import 'package:firebase_remote_config/firebase_remote_config.dart'; -import 'package:flutter_parent/models/login.dart'; - -class PlatformConfig { - final bool initDeviceInfo; - final Login? initLoggedInUser; - final bool initPackageInfo; - final bool initPathProvider; - final FirebaseRemoteConfig? initRemoteConfig; - final bool initWebview; - - final Map? _mockApiPrefs; - - final Map? _mockPrefs; - - static const _testPrefix = 'flutter.'; - - /// A helper class to setup initial configuration of platform channels - /// - /// [initDeviceInfo] Initializes the device info plugin with mock data - /// [initLoggedInUser] Sets a user as the current login in ApiPrefs - /// [initPackageInfo] Initializes the package info plugin with mock data - /// [initRemoteConfig] Sets initial data for [RemoteConfigUtils] - /// [initWebview] Initializes web views to be used in widgets during tests - /// [mockApiPrefs] A map of initial ApiPrefs to mock. If null is set, then the EncryptedSharedPreferences platform channel won't be initialized (or reset) - /// [mockPrefs] A map of initial prefs to mock for ThemePrefs and RemoteConfigUtils. If null is set, then the SharedPreferences platform channel won't be initialized (or reset) - const PlatformConfig({ - this.initDeviceInfo = true, - this.initLoggedInUser = null, - this.initPackageInfo = true, - this.initPathProvider = true, - this.initRemoteConfig = null, - this.initWebview = false, - - Map? mockApiPrefs = const {}, - Map? mockPrefs = null, - }) : this._mockApiPrefs = mockApiPrefs, - this._mockPrefs = mockPrefs; - - /// SharedPreferences requires that test configurations use 'flutter.' at the beginning of keys in the map - Map? get mockApiPrefs => _safeMap(_mockApiPrefs); - - Map? get mockPrefs => _safeMap(_mockPrefs); - - Map? _safeMap(Map? map) => map?.map((k, v) => MapEntry(_testKey(k), v)); - - String _testKey(String key) { - return key.startsWith(_testPrefix) ? key : '$_testPrefix$key'; - } -} diff --git a/apps/flutter_parent/test/utils/qr_utils_test.dart b/apps/flutter_parent/test/utils/qr_utils_test.dart deleted file mode 100644 index fc73edc7de..0000000000 --- a/apps/flutter_parent/test/utils/qr_utils_test.dart +++ /dev/null @@ -1,152 +0,0 @@ -/* - * Copyright (C) 2020 - present Instructure, Inc. - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, version 3 of the License. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -import 'package:barcode_scan2/barcode_scan2.dart'; -import 'package:flutter/services.dart'; -import 'package:flutter_parent/utils/qr_utils.dart'; -import 'package:flutter_parent/utils/veneers/barcode_scan_veneer.dart'; -import 'package:mockito/mockito.dart'; -import 'package:test/test.dart'; - -import 'test_app.dart'; -import 'test_helpers/mock_helpers.dart'; -import 'test_helpers/mock_helpers.mocks.dart'; - -void main() { - String _getQRUrl( - {String host = QRUtils.QR_HOST, String code = QRUtils.QR_AUTH_CODE, String domain = QRUtils.QR_DOMAIN}) { - return 'https://$host/canvas/login?$code=1234' - '&$domain=mobiledev.instructure.com'; - } - - group('verifySSOLogin', () { - test('verifySSOLogin returns true with valid Uri', () { - var verified = QRUtils.verifySSOLogin(_getQRUrl()); - expect(verified, isNotNull); - }); - - test('verifySSOLogin returns false with null Uri', () { - var verified = QRUtils.verifySSOLogin(null); - expect(verified, isNull); - }); - - test('verifySSOLogin returns false with invalid host param', () { - var verified = QRUtils.verifySSOLogin(_getQRUrl(host: 'hodor')); - expect(verified, isNull); - }); - - test('verifySSOLogin returns false with missing domain param', () { - var verified = QRUtils.verifySSOLogin(_getQRUrl(domain: 'hodor')); - expect(verified, isNull); - }); - - test('verifySSOLogin returns false with missing auth code param', () { - var verified = QRUtils.verifySSOLogin(_getQRUrl(code: 'hodor')); - expect(verified, isNull); - }); - }); - - group('parsePairingInfo', () { - test('parsePairingInfo returns invalidCode error for null input', () { - var result = QRUtils.parsePairingInfo(null); - expect(result, isA()); - expect((result as QRPairingScanError).type, QRPairingScanErrorType.invalidCode); - }); - - test('parsePairingInfo returns invalidCode error for empty input', () { - var result = QRUtils.parsePairingInfo(''); - expect(result, isA()); - expect((result as QRPairingScanError).type, QRPairingScanErrorType.invalidCode); - }); - - test('parsePairingInfo returns invalidCode error for invalid input', () { - var result = QRUtils.parsePairingInfo('invalid input'); - expect(result, isA()); - expect((result as QRPairingScanError).type, QRPairingScanErrorType.invalidCode); - }); - - test('parsePairingInfo returns invalidCode error if input has wrong path', () { - var input = 'canvas-parent://test.instructure.com/addStudent?code=abcd&account_id=1234'; - var result = QRUtils.parsePairingInfo(input); - expect(result, isA()); - expect((result as QRPairingScanError).type, QRPairingScanErrorType.invalidCode); - }); - - test('parsePairingInfo returns invalidCode error if input is missing pairing code', () { - var input = 'canvas-parent://test.instructure.com/pair?account_id=1234'; - var result = QRUtils.parsePairingInfo(input); - expect(result, isA()); - expect((result as QRPairingScanError).type, QRPairingScanErrorType.invalidCode); - }); - - test('parsePairingInfo returns QRPairingInfo on successful parse', () { - var input = 'canvas-parent://test.instructure.com/pair?code=aBc123&account_id=1234'; - var result = QRUtils.parsePairingInfo(input); - expect(result, isA()); - expect((result as QRPairingInfo).domain, 'test.instructure.com'); - expect((result as QRPairingInfo).code, 'aBc123'); - expect((result as QRPairingInfo).accountId, '1234'); - }); - }); - - group('scanPairingCode', () { - MockBarcodeScanVeneer barcodeScanner = MockBarcodeScanVeneer(); - setupTestLocator((locator) => locator.registerLazySingleton(() => barcodeScanner)); - - setUp(() { - reset(barcodeScanner); - }); - - test('scanPairingCode returns QRPairingInfo on successful scan of a valid code', () async { - var validCode = 'canvas-parent://test.instructure.com/pair?code=aBc123&account_id=1234'; - when(barcodeScanner.scanBarcode()).thenAnswer((_) async => ScanResult(rawContent: validCode)); - var result = await QRUtils.scanPairingCode(); - expect(result, isA()); - expect((result as QRPairingInfo).domain, 'test.instructure.com'); - expect((result).code, 'aBc123'); - expect((result).accountId, '1234'); - }); - - test('scanPairingCode returns canceled result if scan was canceled', () async { - when(barcodeScanner.scanBarcode()).thenAnswer((_) async => ScanResult(type: ResultType.Cancelled)); - var result = await QRUtils.scanPairingCode(); - expect(result, isA()); - expect((result as QRPairingScanError).type, QRPairingScanErrorType.canceled); - }); - - test('scanPairingCode returns invalidCode error if there was a scan error', () async { - when(barcodeScanner.scanBarcode()).thenAnswer((_) async => ScanResult(type: ResultType.Error)); - var result = await QRUtils.scanPairingCode(); - expect(result, isA()); - expect((result as QRPairingScanError).type, QRPairingScanErrorType.invalidCode); - }); - - test('scanPairingCode returns camera error if camera permission was denied', () async { - var exception = PlatformException(code: BarcodeScanner.cameraAccessDenied); - when(barcodeScanner.scanBarcode()).thenAnswer((_) async => throw exception); - var result = await QRUtils.scanPairingCode(); - expect(result, isA()); - expect((result as QRPairingScanError).type, QRPairingScanErrorType.cameraError); - }); - - test('scanPairingCode returns unknown error if camera permission was denied', () async { - when(barcodeScanner.scanBarcode()).thenAnswer((_) async => throw 'Fake Exception'); - var result = await QRUtils.scanPairingCode(); - expect(result, isA()); - expect((result as QRPairingScanError).type, QRPairingScanErrorType.unknown); - }); - }); -} diff --git a/apps/flutter_parent/test/utils/remote_config_utils_test.dart b/apps/flutter_parent/test/utils/remote_config_utils_test.dart deleted file mode 100644 index 069c689caa..0000000000 --- a/apps/flutter_parent/test/utils/remote_config_utils_test.dart +++ /dev/null @@ -1,84 +0,0 @@ -// Copyright (C) 2019 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:flutter_parent/utils/remote_config_utils.dart'; -import 'package:flutter_test/flutter_test.dart'; - -import 'platform_config.dart'; -import 'test_app.dart'; -import 'test_helpers/mock_helpers.dart'; - -void main() { - tearDown(() { - RemoteConfigUtils.clean(); - }); - - test('retrieval without initialization throws', () { - expect(() => RemoteConfigUtils.getStringValue(RemoteConfigParams.TEST_STRING), throwsStateError); - }); - - test('double initialization throws', () async { - await setupPlatformChannels(config: PlatformConfig(mockPrefs: {})); - final mockRemoteConfig = setupMockRemoteConfig(); - await RemoteConfigUtils.initializeExplicit(mockRemoteConfig); - expect(() async => await RemoteConfigUtils.initializeExplicit(mockRemoteConfig), throwsStateError); - }); - - test('unfetched, uncached value yields default', () async { - // No cached values, no fetched values - await setupPlatformChannels(config: PlatformConfig(initRemoteConfig: setupMockRemoteConfig())); - - // default value = 'hey there' - expect(RemoteConfigUtils.getStringValue(RemoteConfigParams.TEST_STRING), 'hey there'); - }); - - test('fetched value trumps default value', () async { - // Create a mocked RemoteConfig object that will fetch a 'test_string' value - final mockRemoteConfig = setupMockRemoteConfig(valueSettings: {'test_string': 'fetched value'}); - await setupPlatformChannels(config: PlatformConfig(initRemoteConfig: mockRemoteConfig)); - - expect(RemoteConfigUtils.getStringValue(RemoteConfigParams.TEST_STRING), 'fetched value'); - }); - - test('cached value trumps default value', () async { - // Create a cached value for the 'test string' flag. - final mockRemoteConfig = setupMockRemoteConfig(); - final platformConfig = - PlatformConfig(mockPrefs: {'rc_test_string': 'cached value'}, initRemoteConfig: mockRemoteConfig); - await setupPlatformChannels(config: platformConfig); - - expect(RemoteConfigUtils.getStringValue(RemoteConfigParams.TEST_STRING), 'cached value'); - }); - - test('fetched value trumps cached value', () async { - // Create a cached value for the 'test string' flag. - final mockRemoteConfig = setupMockRemoteConfig(valueSettings: {'test_string': 'fetched value'}); - final platformConfig = - PlatformConfig(mockPrefs: {'rc_test_string': 'cached value'}, initRemoteConfig: mockRemoteConfig); - await setupPlatformChannels(config: platformConfig); - - expect(RemoteConfigUtils.getStringValue(RemoteConfigParams.TEST_STRING), 'fetched value'); - }); - - test('update cached value', () async { - final mockRemoteConfig = setupMockRemoteConfig(); - final platformConfig = - PlatformConfig(mockPrefs: {'rc_test_string': 'cached value'}, initRemoteConfig: mockRemoteConfig); - await setupPlatformChannels(config: platformConfig); - - RemoteConfigUtils.updateRemoteConfig(RemoteConfigParams.TEST_STRING, 'updated cached value'); - - expect(RemoteConfigUtils.getStringValue(RemoteConfigParams.TEST_STRING), 'updated cached value'); - }); -} diff --git a/apps/flutter_parent/test/utils/style_slicer_test.dart b/apps/flutter_parent/test/utils/style_slicer_test.dart deleted file mode 100644 index dbd9d4b2c1..0000000000 --- a/apps/flutter_parent/test/utils/style_slicer_test.dart +++ /dev/null @@ -1,315 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:flutter/gestures.dart'; -import 'package:flutter/widgets.dart'; -import 'package:flutter_parent/utils/style_slicer.dart'; -import 'package:flutter_test/flutter_test.dart'; - -void main() { - test('returns basic span if slicer list is null', () { - final String source = 'User Name'; - final List? slicers = null; - - TextSpan actual = StyleSlicer.apply(source, slicers); - - expect(actual.text, source); - expect(actual.children, null); - }); - - test('returns basic span if slicer list is empty', () { - final String source = 'User Name'; - final List slicers = []; - - TextSpan actual = StyleSlicer.apply(source, slicers); - - expect(actual.text, source); - expect(actual.children, null); - }); - - test('ignores empty pronouns', () { - final String source = 'User Name'; - final List slicers = [PronounSlice('')]; - - TextSpan actual = StyleSlicer.apply(source, slicers); - - expect(actual.text, source); - expect(actual.children, null); - }); - - test('ignores null slicers', () { - final String source = 'User Name'; - final List slicers = []; - - TextSpan actual = StyleSlicer.apply(source, slicers); - - expect(actual.text, source); - expect(actual.children, null); - }); - - test('returns empty span if source is empty', () { - final String source = ''; - final List slicers = []; - - TextSpan actual = StyleSlicer.apply(source, slicers); - - expect(actual.text, ''); - expect(actual.children, null); - }); - - test('returns empty span if source is null', () { - final String? source = null; - final List slicers = []; - - TextSpan actual = StyleSlicer.apply(source, slicers); - - expect(actual.text, ''); - expect(actual.children, null); - }); - - test('returns basic span if source contains no matches', () { - final String source = 'User Name'; - final List slicers = [PronounSlice('pro/noun')]; - - TextSpan actual = StyleSlicer.apply(source, slicers); - - expect(actual.text, source); - expect(actual.children, null); - }); - - test('returns correct span for single middle match', () { - final String source = 'user (pro/noun) name'; - final List slicers = [PronounSlice('pro/noun')]; - - TextSpan actual = StyleSlicer.apply(source, slicers); - - expect(actual.children?.length, 3); - - var spans = actual.children?.map((it) => it as TextSpan).toList(); - expect(spans?[0].text, 'user '); - expect(spans?[1].text, '(pro/noun)'); - expect(spans?[1].style?.fontStyle, FontStyle.italic); - expect(spans?[2].text, ' name'); - }); - - test('returns correct span for single beginning match', () { - final String source = '(pro/noun) user name'; - final List slicers = [PronounSlice('pro/noun')]; - - TextSpan actual = StyleSlicer.apply(source, slicers); - - expect(actual.children?.length, 2); - - var spans = actual.children?.map((it) => it as TextSpan).toList(); - expect(spans?[0].text, '(pro/noun)'); - expect(spans?[0].style?.fontStyle, FontStyle.italic); - expect(spans?[1].text, ' user name'); - }); - - test('returns correct span for single end match', () { - final String source = 'user name (pro/noun)'; - final List slicers = [PronounSlice('pro/noun')]; - - TextSpan actual = StyleSlicer.apply(source, slicers); - - expect(actual.children?.length, 2); - - var spans = actual.children?.map((it) => it as TextSpan).toList(); - expect(spans?[0].text, 'user name '); - expect(spans?[1].text, '(pro/noun)'); - expect(spans?[1].style?.fontStyle, FontStyle.italic); - }); - - test('returns correct span for multiple middle match', () { - final String source = 'user (pro/noun) middle (pro/noun) name'; - final List slicers = [PronounSlice('pro/noun')]; - - TextSpan actual = StyleSlicer.apply(source, slicers); - - expect(actual.children?.length, 5); - - var spans = actual.children?.map((it) => it as TextSpan).toList(); - expect(spans?[0].text, 'user '); - expect(spans?[1].text, '(pro/noun)'); - expect(spans?[1].style?.fontStyle, FontStyle.italic); - expect(spans?[2].text, ' middle '); - expect(spans?[3].text, '(pro/noun)'); - expect(spans?[3].style?.fontStyle, FontStyle.italic); - expect(spans?[4].text, ' name'); - }); - - test('returns correct span for duplicate pronouns', () { - final String source = 'user (pro/noun) middle (pro/noun) name'; - final List slicers = [PronounSlice('pro/noun'), PronounSlice('pro/noun')]; - - TextSpan actual = StyleSlicer.apply(source, slicers); - - expect(actual.children?.length, 5); - - var spans = actual.children?.map((it) => it as TextSpan).toList(); - expect(spans?[0].text, 'user '); - expect(spans?[1].text, '(pro/noun)'); - expect(spans?[1].style?.fontStyle, FontStyle.italic); - expect(spans?[2].text, ' middle '); - expect(spans?[3].text, '(pro/noun)'); - expect(spans?[3].style?.fontStyle, FontStyle.italic); - expect(spans?[4].text, ' name'); - }); - - test('returns correct span for multiple beginning match', () { - final String source = '(pro/noun) user middle (pro/noun) name'; - final List slicers = [PronounSlice('pro/noun')]; - - TextSpan actual = StyleSlicer.apply(source, slicers); - - expect(actual.children?.length, 4); - - var spans = actual.children?.map((it) => it as TextSpan).toList(); - expect(spans?[0].text, '(pro/noun)'); - expect(spans?[0].style?.fontStyle, FontStyle.italic); - expect(spans?[1].text, ' user middle '); - expect(spans?[2].text, '(pro/noun)'); - expect(spans?[2].style?.fontStyle, FontStyle.italic); - expect(spans?[3].text, ' name'); - }); - - test('returns correct span for multiple end match', () { - final String source = 'user (pro/noun) middle name (pro/noun)'; - final List slicers = [PronounSlice('pro/noun')]; - - TextSpan actual = StyleSlicer.apply(source, slicers); - - expect(actual.children?.length, 4); - - var spans = actual.children?.map((it) => it as TextSpan).toList(); - expect(spans?[0].text, 'user '); - expect(spans?[1].text, '(pro/noun)'); - expect(spans?[1].style?.fontStyle, FontStyle.italic); - expect(spans?[2].text, ' middle name '); - expect(spans?[3].text, '(pro/noun)'); - expect(spans?[3].style?.fontStyle, FontStyle.italic); - }); - - test('returns correct span for multiple pronouns', () { - final String source = 'user (pro/noun) middle (noun/pro) name'; - final List slicers = [PronounSlice('pro/noun'), PronounSlice('noun/pro')]; - - TextSpan actual = StyleSlicer.apply(source, slicers); - - expect(actual.children?.length, 5); - - var spans = actual.children?.map((it) => it as TextSpan).toList(); - expect(spans?[0].text, 'user '); - expect(spans?[1].text, '(pro/noun)'); - expect(spans?[1].style?.fontStyle, FontStyle.italic); - expect(spans?[2].text, ' middle '); - expect(spans?[3].text, '(noun/pro)'); - expect(spans?[3].style?.fontStyle, FontStyle.italic); - expect(spans?[4].text, ' name'); - }); - - test('returns correct span for adjacent pronouns', () { - final String source = 'user (pro/noun)(noun/pro) name'; - final List slicers = [PronounSlice('pro/noun'), PronounSlice('noun/pro')]; - - TextSpan actual = StyleSlicer.apply(source, slicers); - - expect(actual.children?.length, 4); - - var spans = actual.children?.map((it) => it as TextSpan).toList(); - expect(spans?[0].text, 'user '); - expect(spans?[1].text, '(pro/noun)'); - expect(spans?[1].style?.fontStyle, FontStyle.italic); - expect(spans?[2].text, '(noun/pro)'); - expect(spans?[2].style?.fontStyle, FontStyle.italic); - expect(spans?[3].text, ' name'); - }); - - test('returns correct span for overlapping styles', () { - final String source = 'Normal Bold Bold-Small Small Normal'; - final List slicers = [ - PatternSlice('Bold Bold-Small', style: TextStyle(fontWeight: FontWeight.bold)), - PatternSlice('Bold-Small Small', style: TextStyle(fontSize: 8)), - ]; - - TextSpan actual = StyleSlicer.apply(source, slicers); - - expect(actual.children?.length, 5); - - var spans = actual.children?.map((it) => it as TextSpan).toList(); - expect(spans?[0].text, 'Normal '); - expect(spans?[0].style, TextStyle()); - - expect(spans?[1].text, 'Bold '); - expect(spans?[1].style, TextStyle(fontWeight: FontWeight.bold)); - - expect(spans?[2].text, 'Bold-Small'); - expect(spans?[2].style, TextStyle(fontWeight: FontWeight.bold, fontSize: 8)); - - expect(spans?[3].text, ' Small'); - expect(spans?[3].style, TextStyle(fontSize: 8)); - - expect(spans?[4].text, ' Normal'); - expect(spans?[4].style, TextStyle()); - }); - - test('uses last-declared gesture recognizer', () { - final String source = 'Click here or here to proceed'; - final GestureRecognizer recognizer1 = TapGestureRecognizer(); - final GestureRecognizer recognizer2 = TapGestureRecognizer(); - - final List slicers = [ - PatternSlice('here or here to', style: TextStyle(), recognizer: recognizer1), - PatternSlice('or here', style: TextStyle(), recognizer: recognizer2), - ]; - - TextSpan actual = StyleSlicer.apply(source, slicers); - - expect(actual.children?.length, 5); - - var spans = actual.children?.map((it) => it as TextSpan).toList(); - expect(spans?[0].text, 'Click '); - expect(spans?[0].recognizer, isNull); - - expect(spans?[1].text, 'here '); - expect(spans?[1].recognizer, recognizer1); - - expect(spans?[2].text, 'or here'); - expect(spans?[2].recognizer, recognizer2); - - expect(spans?[3].text, ' to'); - expect(spans?[3].recognizer, recognizer1); - - expect(spans?[4].text, ' proceed'); - expect(spans?[4].recognizer, null); - }); - - test('PatternSlice finds all matches by default', () { - final String source = List.generate(100, (_) => 'Hello World').join(); - final List slicers = [PatternSlice('Hello World')]; - - TextSpan actual = StyleSlicer.apply(source, slicers); - - expect(actual.children?.length, 100); - }); - - test('PatternSlice limits matches if maxMatches is specified', () { - final String source = List.generate(100, (_) => 'Hello World').join(); - final List slicers = [PatternSlice('Hello World', maxMatches: 1)]; - - TextSpan actual = StyleSlicer.apply(source, slicers); - - expect(actual.children?.length, 2); - }); -} diff --git a/apps/flutter_parent/test/utils/test_app.dart b/apps/flutter_parent/test/utils/test_app.dart deleted file mode 100644 index 62d116d4b4..0000000000 --- a/apps/flutter_parent/test/utils/test_app.dart +++ /dev/null @@ -1,441 +0,0 @@ -// Copyright (C) 2019 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:encrypted_shared_preferences/encrypted_shared_preferences.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter/scheduler.dart'; -import 'package:flutter/services.dart'; -import 'package:flutter_localizations/flutter_localizations.dart'; -import 'package:flutter_parent/l10n/app_localizations.dart'; -import 'package:flutter_parent/network/utils/analytics.dart'; -import 'package:flutter_parent/network/utils/api_prefs.dart'; -import 'package:flutter_parent/router/panda_router.dart'; -import 'package:flutter_parent/utils/common_widgets/masquerade_ui.dart'; -import 'package:flutter_parent/utils/common_widgets/respawn.dart'; -import 'package:flutter_parent/utils/db/user_colors_db.dart'; -import 'package:flutter_parent/utils/design/parent_theme.dart'; -import 'package:flutter_parent/utils/design/theme_prefs.dart'; -import 'package:flutter_parent/utils/remote_config_utils.dart'; -import 'package:flutter_test/flutter_test.dart'; -import 'package:get_it/get_it.dart'; -import 'package:mockito/mockito.dart'; -import 'package:shared_preferences/shared_preferences.dart'; -import 'package:webview_flutter/webview_flutter.dart'; -import 'package:webview_flutter_platform_interface/webview_flutter_platform_interface.dart'; - -import 'platform_config.dart'; -import 'test_helpers/mock_helpers.mocks.dart'; - -class TestApp extends StatefulWidget { - TestApp( - this.home, { - this.platformConfig = const PlatformConfig(), - this.navigatorObservers = const [], - this.darkMode = false, - this.highContrast = false, - this.locale = null, - }); - - static final GlobalKey navigatorKey = new GlobalKey(); - - final Widget home; - final PlatformConfig platformConfig; - final List navigatorObservers; - final bool darkMode; - final bool highContrast; - final Locale? locale; - - @override - _TestAppState createState() => _TestAppState(); - - /// Allows a widget to be shown that requires a BuildContext by using the [tapCallback]. Awaiting the future returned - /// by this function will drop you off right after the tap callback has finished with a pumpAndSettle(). - /// - /// * [tester] The widget tester from the testWidgets function - /// * [tapCallback] a future that can use a BuildContext show a dialog, launch a route, etc... - /// * [locale] Passed into TestApp to set the locale of the app under test - /// * [config] A [PlatformConfig] object passed to TestApp that is used during [setupPlatformChannels] - /// * [configBlock] If you want to do custom configuration of the app or prefs, this is an easy place to setup custom data - /// - /// Example call: - /// testWidgetsWithAccessibility((tester) { - /// await showWidgetFromTap( - /// tester, - /// (context) => ErrorReportDialog.asDialog(context), - /// locale: Locale('ar'), - /// config: PlatformConfig(initWebView: true, initLoggedInUser: login, initRemoteConfig: mockRemoteConfig), - /// configBlock: () async { - /// await ApiPrefs.setCurrentStudent(student); - /// } - /// }); - /// - static showWidgetFromTap( - WidgetTester tester, - Future tapCallback(BuildContext context), { - Locale? locale, - PlatformConfig config = const PlatformConfig(), - Future configBlock()?, - }) async { - await tester.pumpWidget(TestApp( - Builder(builder: (context) { - return ElevatedButton( - style: ElevatedButton.styleFrom(backgroundColor: Colors.black), - child: Text('tap me', style: TextStyle(color: Colors.white)), - onPressed: () => tapCallback(context), - ); - }), - locale: locale, - platformConfig: config, - )); - await tester.pumpAndSettle(); - - // Await any other setup before tapping the button for the tap callback - if (configBlock != null) await configBlock(); - - // Tap the button to trigger the onPressed - await tester.tap(find.byType(ElevatedButton)); - await tester.pumpAndSettle(); - } -} - -class _TestAppState extends State { - Locale? _locale; - - rebuild(locale) { - setState(() => _locale = locale); - } - - @override - void initState() { - super.initState(); - _locale = widget.locale; - PandaRouter.init(); - setupPlatformChannels(config: widget.platformConfig); - } - - @override - Widget build(BuildContext context) { - return Respawn( - child: ParentTheme( - themePrefs: MockThemePrefs(widget.darkMode, widget.highContrast), - builder: (context, themeData) => MaterialApp( - title: 'Canvas Parent', - locale: _locale, - builder: (context, child) => - MasqueradeUI(navKey: TestApp.navigatorKey, - child: child ?? Container()), - navigatorKey: TestApp.navigatorKey, - navigatorObservers: widget.navigatorObservers, - localizationsDelegates: const [ - AppLocalizations.delegate, - // Material components use these delegate to provide default localization - GlobalMaterialLocalizations.delegate, - GlobalWidgetsLocalizations.delegate, - GlobalCupertinoLocalizations.delegate, - ], - supportedLocales: AppLocalizations.delegate.supportedLocales, - localeResolutionCallback: _localeCallback(), - theme: themeData, - home: Material(child: widget.home), - onGenerateRoute: PandaRouter.router.generator, - ), - ), - ); - } - - // Get notified when there's a new system locale so we can rebuild the app with the new language - LocaleResolutionCallback _localeCallback() => (locale, supportedLocales) { - const fallback = Locale('en', ''); - Locale? resolvedLocale = - AppLocalizations.delegate.resolution(fallback: fallback, matchCountry: false)(locale, supportedLocales); - - // Update the state if the locale changed - if (_locale != resolvedLocale) { - SchedulerBinding.instance.addPostFrameCallback((_) { - setState(() => _locale = resolvedLocale); - }); - } - - return resolvedLocale; - }; -} - -Future setupTestLocator(config(GetIt locator)) async { - final locator = GetIt.instance; - await locator.reset(); - locator.allowReassignment = true; // Allows reassignment by the config block - - // Register things that needed by default - locator.registerLazySingleton(() => Analytics()); - locator.registerLazySingleton(() => MockUserColorsDb()); - - config(locator); -} - -class MockThemePrefs extends ThemePrefs { - MockThemePrefs(this._darkMode, this._hcMode); - - bool _darkMode; - bool _webViewDarkMode = false; - bool _hcMode; - - @override - bool get darkMode => _darkMode; - - @override - set darkMode(bool value) => _darkMode = value; - - @override - bool get webViewDarkMode => _webViewDarkMode; - - @override - set webViewDarkMode(bool value) => _webViewDarkMode = value; - - @override - bool get hcMode => _hcMode; - - @override - set hcMode(bool value) => _hcMode = value; -} - -/// Set up the platform channels used by the app. -/// -/// Returned is a future that completes when all async tasks spawned by this method call have completed. Waiting isn't -/// required, though is probably good practice and results in more stable tests. -/// -/// TODO: Make this method not async, so that all initialization can be done in TestApp#initState (and synchronously elsewhere) -/// As is, this can cause an issue if anything relies on a platform channel while building TestApp. To get around that, -/// we'd need to wrap TestApp in a future builder, which leads to an unstable amount of pumps before testing can really -/// occur. By moving ApiPrefs and RemoteConfigUtils to locator, we should be able to provide mocks in a synchronous -/// fashion and avoid any asynchronous setup in this setupPlatformChannels method. -Future setupPlatformChannels({PlatformConfig config = const PlatformConfig()}) async { - TestWidgetsFlutterBinding.ensureInitialized(); - - if (config.initPackageInfo) _initPackageInfo(); - - if (config.initDeviceInfo) _initPlatformDeviceInfo(); - - if (config.initPathProvider) _initPathProvider(); - - Future? apiPrefsInitFuture; - if (config.mockApiPrefs != null) { - ApiPrefs.clean(); - EncryptedSharedPreferences.setMockInitialValues( - config.mockApiPrefs!..putIfAbsent(ApiPrefs.KEY_HAS_MIGRATED_TO_ENCRYPTED_PREFS, () => true)); - apiPrefsInitFuture = ApiPrefs.init(); - } - - Future? remoteConfigInitFuture; - if (config.initRemoteConfig != null || config.mockPrefs != null) { - SharedPreferences.setMockInitialValues(config.mockPrefs ?? {}); - if (config.initRemoteConfig != null) { - RemoteConfigUtils.clean(); - remoteConfigInitFuture = RemoteConfigUtils.initializeExplicit(config.initRemoteConfig!); - } - } - - if (config.initWebview) _initPlatformWebView(); - - await Future.wait([ - if (apiPrefsInitFuture != null) apiPrefsInitFuture, - if (remoteConfigInitFuture != null) remoteConfigInitFuture, - ]); - - if (config.initLoggedInUser != null) { - ApiPrefs.addLogin(config.initLoggedInUser!); - ApiPrefs.switchLogins(config.initLoggedInUser!); - } -} - -/// WebView helpers. These are needed as web views tie into platform views. -/// -/// Inspired solution is a slimmed down version of the WebView test: -/// https://github.com/flutter/plugins/blob/webview_flutter-v3.0.4/packages/webview_flutter/webview_flutter/test/webview_flutter_test.dart -void _initPlatformWebView() { - final mockWebViewPlatformController = MockWebViewPlatformController(); - final mockWebViewPlatform = MockWebViewPlatform(); - when(mockWebViewPlatform.build( - context: anyNamed('context'), - creationParams: anyNamed('creationParams'), - webViewPlatformCallbacksHandler: - anyNamed('webViewPlatformCallbacksHandler'), - javascriptChannelRegistry: anyNamed('javascriptChannelRegistry'), - onWebViewPlatformCreated: anyNamed('onWebViewPlatformCreated'), - gestureRecognizers: anyNamed('gestureRecognizers'), - )).thenAnswer((Invocation invocation) { - final WebViewPlatformCreatedCallback onWebViewPlatformCreated = - invocation.namedArguments[const Symbol('onWebViewPlatformCreated')] - as WebViewPlatformCreatedCallback; - return TestPlatformWebView( - mockWebViewPlatformController: mockWebViewPlatformController, - onWebViewPlatformCreated: onWebViewPlatformCreated, - ); - }); - - WebView.platform = mockWebViewPlatform; - WebViewCookieManagerPlatform.instance = FakeWebViewCookieManager(); -} - -/// Mocks the platform channel used by the package_info plugin -void _initPackageInfo() { - const MethodChannel('dev.fluttercommunity.plus/package_info').setMockMethodCallHandler((MethodCall methodCall) async { - if (methodCall.method == 'getAll') { - return { - 'appName': 'Canvas', - 'packageName': 'com.instructure', - 'version': '1.0.0', - 'buildNumber': '3', - }; - } - return null; - }); -} - -/// Mocks the platform channel used by the device_info plugin -void _initPlatformDeviceInfo() { - const MethodChannel('dev.fluttercommunity.plus/device_info').setMockMethodCallHandler((MethodCall methodCall) async { - if (methodCall.method == 'getAndroidDeviceInfo') { - return { - 'version': { - 'baseOS': 'fake-baseOD', - 'codename': 'fake-codename', - 'incremental': 'fake-incremental', - 'previewSdkInt': 9001, - 'release': 'FakeOS 9000', - 'sdkInt': 9000, - 'securityPatch': 'fake-securityPatch', - }, - 'board': 'fake-board', - 'bootloader': 'fake-bootloader', - 'brand': 'Canvas', - 'device': 'fake-device', - 'display': 'fake-display', - 'fingerprint': 'fake-fingerprint', - 'hardware': 'fake-hardware', - 'host': 'fake-host', - 'id': 'fake-id', - 'manufacturer': 'Instructure', - 'model': 'Canvas Phone', - 'product': 'fake-product', - 'supported32BitAbis': [], - 'supported64BitAbis': [], - 'supportedAbis': [], - 'tags': 'fake-tags', - 'type': 'take-types', - 'isPhysicalDevice': false, - 'androidId': 'fake-androidId', - 'displayMetrics': { - 'widthPx': 100.0, - 'heightPx': 100.0, - 'xDpi': 100.0, - 'yDpi': 100.0, - }, - 'serialNumber': 'fake-serialNumber', - }; - } - if (methodCall.method == 'getDeviceInfo') { - return { - 'version': { - 'baseOS': 'fake-baseOD', - 'codename': 'fake-codename', - 'incremental': 'fake-incremental', - 'previewSdkInt': 9001, - 'release': 'FakeOS 9000', - 'sdkInt': 9000, - 'securityPatch': 'fake-securityPatch', - }, - 'board': 'fake-board', - 'bootloader': 'fake-bootloader', - 'brand': 'Canvas', - 'device': 'fake-device', - 'display': 'fake-display', - 'fingerprint': 'fake-fingerprint', - 'hardware': 'fake-hardware', - 'host': 'fake-host', - 'id': 'fake-id', - 'manufacturer': 'Instructure', - 'model': 'Canvas Phone', - 'product': 'fake-product', - 'supported32BitAbis': [], - 'supported64BitAbis': [], - 'supportedAbis': [], - 'tags': 'fake-tags', - 'type': 'take-types', - 'isPhysicalDevice': false, - 'androidId': 'fake-androidId', - 'displayMetrics': { - 'widthPx': 100.0, - 'heightPx': 100.0, - 'xDpi': 100.0, - 'yDpi': 100.0, - }, - 'serialNumber': 'fake-serialNumber', - }; - } - return null; - }); -} - -/// Mocks the platform channel used by the path_provider plugin -void _initPathProvider() { - const MethodChannel('plugins.flutter.io/path_provider').setMockMethodCallHandler((MethodCall methodCall) async { - if (methodCall.method == 'getApplicationCacheDirectory') { - return "fake-path"; - } - return null; - }); -} - -class TestPlatformWebView extends StatefulWidget { - const TestPlatformWebView({ - Key? key, - required this.mockWebViewPlatformController, - this.onWebViewPlatformCreated, - }) : super(key: key); - - final MockWebViewPlatformController mockWebViewPlatformController; - final WebViewPlatformCreatedCallback? onWebViewPlatformCreated; - - @override - State createState() => TestPlatformWebViewState(); -} - -class TestPlatformWebViewState extends State { - @override - void initState() { - super.initState(); - final WebViewPlatformCreatedCallback? onWebViewPlatformCreated = - widget.onWebViewPlatformCreated; - if (onWebViewPlatformCreated != null) { - onWebViewPlatformCreated(widget.mockWebViewPlatformController); - } - } - - @override - Widget build(BuildContext context) { - return Container(); - } -} - -class FakeWebViewCookieManager extends WebViewCookieManagerPlatform { - @override - Future clearCookies() { - return Future.value(false); - } - - @override - Future setCookie(WebViewCookie cookie) { - return Future.value(null); - } -} \ No newline at end of file diff --git a/apps/flutter_parent/test/utils/test_helpers/mock_helpers.dart b/apps/flutter_parent/test/utils/test_helpers/mock_helpers.dart deleted file mode 100644 index a7b3985f1e..0000000000 --- a/apps/flutter_parent/test/utils/test_helpers/mock_helpers.dart +++ /dev/null @@ -1,210 +0,0 @@ -/* - * Copyright (C) 2020 - present Instructure, Inc. - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, version 3 of the License. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -// Create a mocked RemoteConfig object. -// If valueSettings != null, then (1) a mocked settings fetch will occur, and (2) the retrieved -// settings will correspond the specified values. -import 'dart:io'; - -import 'package:dio/dio.dart'; -import 'package:firebase_crashlytics/firebase_crashlytics.dart'; -import 'package:firebase_remote_config/firebase_remote_config.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_local_notifications/flutter_local_notifications.dart'; -import 'package:flutter_parent/network/api/accounts_api.dart'; -import 'package:flutter_parent/network/api/alert_api.dart'; -import 'package:flutter_parent/network/api/announcement_api.dart'; -import 'package:flutter_parent/network/api/assignment_api.dart'; -import 'package:flutter_parent/network/api/auth_api.dart'; -import 'package:flutter_parent/network/api/calendar_events_api.dart'; -import 'package:flutter_parent/network/api/course_api.dart'; -import 'package:flutter_parent/network/api/enrollments_api.dart'; -import 'package:flutter_parent/network/api/error_report_api.dart'; -import 'package:flutter_parent/network/api/features_api.dart'; -import 'package:flutter_parent/network/api/file_api.dart'; -import 'package:flutter_parent/network/api/help_links_api.dart'; -import 'package:flutter_parent/network/api/inbox_api.dart'; -import 'package:flutter_parent/network/api/oauth_api.dart'; -import 'package:flutter_parent/network/api/page_api.dart'; -import 'package:flutter_parent/network/api/planner_api.dart'; -import 'package:flutter_parent/network/api/user_api.dart'; -import 'package:flutter_parent/network/utils/analytics.dart'; -import 'package:flutter_parent/network/utils/authentication_interceptor.dart'; -import 'package:flutter_parent/screens/account_creation/account_creation_interactor.dart'; -import 'package:flutter_parent/screens/alert_thresholds/alert_thresholds_interactor.dart'; -import 'package:flutter_parent/screens/alerts/alerts_interactor.dart'; -import 'package:flutter_parent/screens/announcements/announcement_details_interactor.dart'; -import 'package:flutter_parent/screens/assignments/assignment_details_interactor.dart'; -import 'package:flutter_parent/screens/aup/acceptable_use_policy_interactor.dart'; -import 'package:flutter_parent/screens/calendar/calendar_widget/calendar_filter_screen/calendar_filter_list_interactor.dart'; -import 'package:flutter_parent/screens/courses/courses_interactor.dart'; -import 'package:flutter_parent/screens/courses/details/course_details_interactor.dart'; -import 'package:flutter_parent/screens/courses/details/course_details_model.dart'; -import 'package:flutter_parent/screens/courses/routing_shell/course_routing_shell_interactor.dart'; -import 'package:flutter_parent/screens/dashboard/alert_notifier.dart'; -import 'package:flutter_parent/screens/dashboard/dashboard_interactor.dart'; -import 'package:flutter_parent/screens/dashboard/inbox_notifier.dart'; -import 'package:flutter_parent/screens/domain_search/domain_search_interactor.dart'; -import 'package:flutter_parent/screens/events/event_details_interactor.dart'; -import 'package:flutter_parent/screens/help/help_screen_interactor.dart'; -import 'package:flutter_parent/screens/inbox/attachment_utils/attachment_handler.dart'; -import 'package:flutter_parent/screens/inbox/attachment_utils/attachment_picker_interactor.dart'; -import 'package:flutter_parent/screens/inbox/conversation_details/conversation_details_interactor.dart'; -import 'package:flutter_parent/screens/inbox/conversation_list/conversation_list_interactor.dart'; -import 'package:flutter_parent/screens/inbox/create_conversation/create_conversation_interactor.dart'; -import 'package:flutter_parent/screens/inbox/reply/conversation_reply_interactor.dart'; -import 'package:flutter_parent/screens/manage_students/manage_students_interactor.dart'; -import 'package:flutter_parent/screens/manage_students/student_color_picker_interactor.dart'; -import 'package:flutter_parent/screens/masquerade/masquerade_screen_interactor.dart'; -import 'package:flutter_parent/screens/pairing/pairing_interactor.dart'; -import 'package:flutter_parent/screens/pairing/pairing_util.dart'; -import 'package:flutter_parent/screens/qr_login/qr_login_tutorial_screen_interactor.dart'; -import 'package:flutter_parent/screens/remote_config/remote_config_interactor.dart'; -import 'package:flutter_parent/screens/settings/settings_interactor.dart'; -import 'package:flutter_parent/screens/splash/splash_screen_interactor.dart'; -import 'package:flutter_parent/screens/web_login/web_login_interactor.dart'; -import 'package:flutter_parent/utils/common_widgets/error_report/error_report_interactor.dart'; -import 'package:flutter_parent/utils/common_widgets/view_attachment/fetcher/attachment_fetcher_interactor.dart'; -import 'package:flutter_parent/utils/common_widgets/view_attachment/view_attachment_interactor.dart'; -import 'package:flutter_parent/utils/common_widgets/view_attachment/viewers/audio_video_attachment_viewer_interactor.dart'; -import 'package:flutter_parent/utils/common_widgets/web_view/web_content_interactor.dart'; -import 'package:flutter_parent/utils/db/calendar_filter_db.dart'; -import 'package:flutter_parent/utils/db/reminder_db.dart'; -import 'package:flutter_parent/utils/db/user_colors_db.dart'; -import 'package:flutter_parent/utils/notification_util.dart'; -import 'package:flutter_parent/utils/old_app_migration.dart'; -import 'package:flutter_parent/utils/permission_handler.dart'; -import 'package:flutter_parent/utils/quick_nav.dart'; -import 'package:flutter_parent/utils/url_launcher.dart'; -import 'package:flutter_parent/utils/veneers/android_intent_veneer.dart'; -import 'package:flutter_parent/utils/veneers/barcode_scan_veneer.dart'; -import 'package:flutter_parent/utils/veneers/flutter_downloader_veneer.dart'; -import 'package:flutter_parent/utils/veneers/flutter_snackbar_veneer.dart'; -import 'package:flutter_parent/utils/veneers/path_provider_veneer.dart'; -import 'package:mockito/annotations.dart'; -import 'package:mockito/mockito.dart'; -import 'package:sqflite/sqflite.dart'; -import 'package:video_player/video_player.dart'; -import 'package:webview_flutter/webview_flutter.dart'; - -@GenerateNiceMocks([ - MockSpec(), - MockSpec(), - MockSpec(), - MockSpec(), - MockSpec(), - MockSpec(), - MockSpec(), - MockSpec(), - MockSpec(), - MockSpec(), - MockSpec(), - MockSpec(), - MockSpec(), - MockSpec(), - MockSpec(), - MockSpec(), - MockSpec(), - MockSpec(), - MockSpec(), - MockSpec(), - MockSpec(), - MockSpec(), - MockSpec(), - MockSpec(), - MockSpec(), - MockSpec(), - MockSpec(), - MockSpec(), - MockSpec(), - MockSpec(), - MockSpec(), - MockSpec(), - MockSpec(), - MockSpec(), - MockSpec(), - MockSpec(), - MockSpec(), - MockSpec(), - MockSpec(), - MockSpec(), - MockSpec(), - MockSpec(), - MockSpec(), - MockSpec(), - MockSpec(), - MockSpec(), - MockSpec(), - MockSpec(), - MockSpec(), - MockSpec(), - MockSpec(), - MockSpec(), - MockSpec(), - MockSpec(), - MockSpec(), - MockSpec(), - MockSpec(), - MockSpec(), - MockSpec(), - MockSpec(), - MockSpec(), - MockSpec(), - MockSpec(), - MockSpec(), - MockSpec(), - MockSpec(), - MockSpec(), - MockSpec(), - MockSpec(), - MockSpec(), - MockSpec(), - MockSpec(), - MockSpec(), - MockSpec(), - MockSpec(), - MockSpec(), - MockSpec(), - MockSpec(), - MockSpec(), - MockSpec(), - MockSpec(), - MockSpec(), - MockSpec(), - MockSpec(), - MockSpec(), - MockSpec(), - MockSpec() -]) -import 'mock_helpers.mocks.dart'; - -MockFirebaseRemoteConfig setupMockRemoteConfig({Map? valueSettings = null}) { - final mockRemoteConfig = MockFirebaseRemoteConfig(); - when(mockRemoteConfig.fetch()).thenAnswer((_) => Future.value()); - when(mockRemoteConfig.activate()) - .thenAnswer((_) => Future.value(valueSettings != null)); - when(mockRemoteConfig.settings).thenAnswer((realInvocation) => - RemoteConfigSettings( - fetchTimeout: Duration(milliseconds: 100), - minimumFetchInterval: Duration(milliseconds: 100))); - if (valueSettings != null) { - valueSettings.forEach((key, value) { - when(mockRemoteConfig.getString(key)).thenAnswer((_) => value); - }); - } - - return mockRemoteConfig; -} \ No newline at end of file diff --git a/apps/flutter_parent/test/utils/test_helpers/mock_helpers.mocks.dart b/apps/flutter_parent/test/utils/test_helpers/mock_helpers.mocks.dart deleted file mode 100644 index 5503790523..0000000000 --- a/apps/flutter_parent/test/utils/test_helpers/mock_helpers.mocks.dart +++ /dev/null @@ -1,9529 +0,0 @@ -// Mocks generated by Mockito 5.4.2 from annotations -// in flutter_parent/test/utils/test_helpers/mock_helpers.dart. -// Do not manually edit this file. - -// ignore_for_file: no_leading_underscores_for_library_prefixes -import 'dart:async' as _i8; -import 'dart:convert' as _i12; -import 'dart:io' as _i10; -import 'dart:ui' as _i35; - -import 'package:android_intent_plus/android_intent.dart' as _i30; -import 'package:barcode_scan2/barcode_scan2.dart' as _i4; -import 'package:built_collection/built_collection.dart' as _i108; -import 'package:dio/dio.dart' as _i2; -import 'package:dio/src/dio_mixin.dart' as _i22; -import 'package:firebase_core/firebase_core.dart' as _i9; -import 'package:firebase_crashlytics/firebase_crashlytics.dart' as _i72; -import 'package:firebase_remote_config/firebase_remote_config.dart' as _i86; -import 'package:firebase_remote_config_platform_interface/firebase_remote_config_platform_interface.dart' - as _i14; -import 'package:fluro/fluro.dart' as _i84; -import 'package:flutter/foundation.dart' as _i11; -import 'package:flutter/gestures.dart' as _i142; -import 'package:flutter/material.dart' as _i17; -import 'package:flutter/services.dart' as _i15; -import 'package:flutter_downloader/flutter_downloader.dart' as _i133; -import 'package:flutter_local_notifications/flutter_local_notifications.dart' - as _i80; -import 'package:flutter_parent/l10n/app_localizations.dart' as _i41; -import 'package:flutter_parent/models/account_notification.dart' as _i102; -import 'package:flutter_parent/models/account_permissions.dart' as _i26; -import 'package:flutter_parent/models/alert.dart' as _i32; -import 'package:flutter_parent/models/alert_threshold.dart' as _i34; -import 'package:flutter_parent/models/announcement.dart' as _i101; -import 'package:flutter_parent/models/assignment.dart' as _i37; -import 'package:flutter_parent/models/assignment_group.dart' as _i38; -import 'package:flutter_parent/models/attachment.dart' as _i99; -import 'package:flutter_parent/models/authenticated_url.dart' as _i77; -import 'package:flutter_parent/models/calendar_filter.dart' as _i49; -import 'package:flutter_parent/models/canvas_page.dart' as _i59; -import 'package:flutter_parent/models/canvas_token.dart' as _i43; -import 'package:flutter_parent/models/color_change_response.dart' as _i123; -import 'package:flutter_parent/models/conversation.dart' as _i65; -import 'package:flutter_parent/models/course.dart' as _i51; -import 'package:flutter_parent/models/course_permissions.dart' as _i56; -import 'package:flutter_parent/models/course_settings.dart' as _i55; -import 'package:flutter_parent/models/course_tab.dart' as _i54; -import 'package:flutter_parent/models/enrollment.dart' as _i58; -import 'package:flutter_parent/models/feature_flags.dart' as _i127; -import 'package:flutter_parent/models/grading_period_response.dart' as _i53; -import 'package:flutter_parent/models/help_link.dart' as _i107; -import 'package:flutter_parent/models/help_links.dart' as _i139; -import 'package:flutter_parent/models/message.dart' as _i113; -import 'package:flutter_parent/models/mobile_verify_result.dart' as _i44; -import 'package:flutter_parent/models/planner_item.dart' as _i105; -import 'package:flutter_parent/models/recipient.dart' as _i74; -import 'package:flutter_parent/models/reminder.dart' as _i40; -import 'package:flutter_parent/models/schedule_item.dart' as _i47; -import 'package:flutter_parent/models/school_domain.dart' as _i24; -import 'package:flutter_parent/models/terms_of_service.dart' as _i25; -import 'package:flutter_parent/models/unread_count.dart' as _i33; -import 'package:flutter_parent/models/user.dart' as _i61; -import 'package:flutter_parent/models/user_color.dart' as _i90; -import 'package:flutter_parent/models/user_colors.dart' as _i91; -import 'package:flutter_parent/network/api/accounts_api.dart' as _i23; -import 'package:flutter_parent/network/api/alert_api.dart' as _i31; -import 'package:flutter_parent/network/api/announcement_api.dart' as _i100; -import 'package:flutter_parent/network/api/assignment_api.dart' as _i36; -import 'package:flutter_parent/network/api/auth_api.dart' as _i42; -import 'package:flutter_parent/network/api/calendar_events_api.dart' as _i46; -import 'package:flutter_parent/network/api/course_api.dart' as _i52; -import 'package:flutter_parent/network/api/enrollments_api.dart' as _i68; -import 'package:flutter_parent/network/api/error_report_api.dart' as _i69; -import 'package:flutter_parent/network/api/features_api.dart' as _i126; -import 'package:flutter_parent/network/api/file_api.dart' as _i109; -import 'package:flutter_parent/network/api/help_links_api.dart' as _i138; -import 'package:flutter_parent/network/api/inbox_api.dart' as _i73; -import 'package:flutter_parent/network/api/oauth_api.dart' as _i76; -import 'package:flutter_parent/network/api/page_api.dart' as _i79; -import 'package:flutter_parent/network/api/planner_api.dart' as _i104; -import 'package:flutter_parent/network/api/user_api.dart' as _i122; -import 'package:flutter_parent/network/utils/analytics.dart' as _i28; -import 'package:flutter_parent/network/utils/authentication_interceptor.dart' - as _i135; -import 'package:flutter_parent/network/utils/paged_list.dart' as _i39; -import 'package:flutter_parent/screens/account_creation/account_creation_interactor.dart' - as _i27; -import 'package:flutter_parent/screens/alert_thresholds/alert_thresholds_interactor.dart' - as _i94; -import 'package:flutter_parent/screens/alerts/alerts_interactor.dart' as _i95; -import 'package:flutter_parent/screens/announcements/announcement_details_interactor.dart' - as _i96; -import 'package:flutter_parent/screens/announcements/announcement_details_screen.dart' - as _i98; -import 'package:flutter_parent/screens/announcements/announcement_view_state.dart' - as _i97; -import 'package:flutter_parent/screens/assignments/assignment_details_interactor.dart' - as _i3; -import 'package:flutter_parent/screens/aup/acceptable_use_policy_interactor.dart' - as _i103; -import 'package:flutter_parent/screens/calendar/calendar_widget/calendar_filter_screen/calendar_filter_list_interactor.dart' - as _i50; -import 'package:flutter_parent/screens/courses/courses_interactor.dart' as _i60; -import 'package:flutter_parent/screens/courses/details/course_details_interactor.dart' - as _i57; -import 'package:flutter_parent/screens/courses/details/course_details_model.dart' - as _i6; -import 'package:flutter_parent/screens/courses/routing_shell/course_routing_shell_interactor.dart' - as _i63; -import 'package:flutter_parent/screens/courses/routing_shell/course_routing_shell_screen.dart' - as _i64; -import 'package:flutter_parent/screens/dashboard/alert_notifier.dart' as _i19; -import 'package:flutter_parent/screens/dashboard/dashboard_interactor.dart' - as _i118; -import 'package:flutter_parent/screens/dashboard/inbox_notifier.dart' as _i18; -import 'package:flutter_parent/screens/domain_search/domain_search_interactor.dart' - as _i117; -import 'package:flutter_parent/screens/events/event_details_interactor.dart' - as _i71; -import 'package:flutter_parent/screens/help/help_screen_interactor.dart' - as _i106; -import 'package:flutter_parent/screens/inbox/attachment_utils/attachment_handler.dart' - as _i66; -import 'package:flutter_parent/screens/inbox/attachment_utils/attachment_picker_interactor.dart' - as _i136; -import 'package:flutter_parent/screens/inbox/conversation_details/conversation_details_interactor.dart' - as _i112; -import 'package:flutter_parent/screens/inbox/conversation_list/conversation_list_interactor.dart' - as _i114; -import 'package:flutter_parent/screens/inbox/create_conversation/create_conversation_interactor.dart' - as _i7; -import 'package:flutter_parent/screens/inbox/reply/conversation_reply_interactor.dart' - as _i116; -import 'package:flutter_parent/screens/manage_students/manage_students_interactor.dart' - as _i120; -import 'package:flutter_parent/screens/manage_students/student_color_picker_interactor.dart' - as _i121; -import 'package:flutter_parent/screens/masquerade/masquerade_screen_interactor.dart' - as _i124; -import 'package:flutter_parent/screens/pairing/pairing_interactor.dart' as _i78; -import 'package:flutter_parent/screens/pairing/pairing_util.dart' as _i82; -import 'package:flutter_parent/screens/qr_login/qr_login_tutorial_screen_interactor.dart' - as _i20; -import 'package:flutter_parent/screens/remote_config/remote_config_interactor.dart' - as _i140; -import 'package:flutter_parent/screens/settings/settings_interactor.dart' - as _i125; -import 'package:flutter_parent/screens/splash/splash_screen_interactor.dart' - as _i128; -import 'package:flutter_parent/screens/web_login/web_login_interactor.dart' - as _i92; -import 'package:flutter_parent/utils/base_model.dart' as _i62; -import 'package:flutter_parent/utils/common_widgets/error_report/error_report_interactor.dart' - as _i70; -import 'package:flutter_parent/utils/common_widgets/view_attachment/fetcher/attachment_fetcher_interactor.dart' - as _i129; -import 'package:flutter_parent/utils/common_widgets/view_attachment/view_attachment_interactor.dart' - as _i134; -import 'package:flutter_parent/utils/common_widgets/view_attachment/viewers/audio_video_attachment_viewer_interactor.dart' - as _i130; -import 'package:flutter_parent/utils/common_widgets/web_view/web_content_interactor.dart' - as _i93; -import 'package:flutter_parent/utils/db/calendar_filter_db.dart' as _i48; -import 'package:flutter_parent/utils/db/reminder_db.dart' as _i85; -import 'package:flutter_parent/utils/db/user_colors_db.dart' as _i89; -import 'package:flutter_parent/utils/notification_util.dart' as _i75; -import 'package:flutter_parent/utils/old_app_migration.dart' as _i137; -import 'package:flutter_parent/utils/permission_handler.dart' as _i131; -import 'package:flutter_parent/utils/qr_utils.dart' as _i13; -import 'package:flutter_parent/utils/quick_nav.dart' as _i83; -import 'package:flutter_parent/utils/remote_config_utils.dart' as _i141; -import 'package:flutter_parent/utils/url_launcher.dart' as _i88; -import 'package:flutter_parent/utils/veneers/android_intent_veneer.dart' - as _i29; -import 'package:flutter_parent/utils/veneers/barcode_scan_veneer.dart' as _i45; -import 'package:flutter_parent/utils/veneers/flutter_downloader_veneer.dart' - as _i132; -import 'package:flutter_parent/utils/veneers/flutter_snackbar_veneer.dart' - as _i87; -import 'package:flutter_parent/utils/veneers/path_provider_veneer.dart' - as _i110; -import 'package:mockito/mockito.dart' as _i1; -import 'package:mockito/src/dummies.dart' as _i67; -import 'package:path_provider/path_provider.dart' as _i111; -import 'package:permission_handler/permission_handler.dart' as _i119; -import 'package:sqflite/sqflite.dart' as _i5; -import 'package:timezone/timezone.dart' as _i81; -import 'package:tuple/tuple.dart' as _i115; -import 'package:video_player/video_player.dart' as _i21; -import 'package:webview_flutter/webview_flutter.dart' as _i16; - -// ignore_for_file: type=lint -// ignore_for_file: avoid_redundant_argument_values -// ignore_for_file: avoid_setters_without_getters -// ignore_for_file: comment_references -// ignore_for_file: implementation_imports -// ignore_for_file: invalid_use_of_visible_for_testing_member -// ignore_for_file: prefer_const_constructors -// ignore_for_file: unnecessary_parenthesis -// ignore_for_file: camel_case_types -// ignore_for_file: subtype_of_sealed_class - -class _FakeResponse_0 extends _i1.SmartFake implements _i2.Response { - _FakeResponse_0( - Object parent, - Invocation parentInvocation, - ) : super( - parent, - parentInvocation, - ); -} - -class _FakeAssignmentDetails_1 extends _i1.SmartFake - implements _i3.AssignmentDetails { - _FakeAssignmentDetails_1( - Object parent, - Invocation parentInvocation, - ) : super( - parent, - parentInvocation, - ); -} - -class _FakeScanResult_2 extends _i1.SmartFake implements _i4.ScanResult { - _FakeScanResult_2( - Object parent, - Invocation parentInvocation, - ) : super( - parent, - parentInvocation, - ); -} - -class _FakeDatabase_3 extends _i1.SmartFake implements _i5.Database { - _FakeDatabase_3( - Object parent, - Invocation parentInvocation, - ) : super( - parent, - parentInvocation, - ); -} - -class _FakeGradeDetails_4 extends _i1.SmartFake implements _i6.GradeDetails { - _FakeGradeDetails_4( - Object parent, - Invocation parentInvocation, - ) : super( - parent, - parentInvocation, - ); -} - -class _FakeCreateConversationData_5 extends _i1.SmartFake - implements _i7.CreateConversationData { - _FakeCreateConversationData_5( - Object parent, - Invocation parentInvocation, - ) : super( - parent, - parentInvocation, - ); -} - -class _FakeFuture_6 extends _i1.SmartFake implements _i8.Future { - _FakeFuture_6( - Object parent, - Invocation parentInvocation, - ) : super( - parent, - parentInvocation, - ); -} - -class _FakeQueryCursor_7 extends _i1.SmartFake implements _i5.QueryCursor { - _FakeQueryCursor_7( - Object parent, - Invocation parentInvocation, - ) : super( - parent, - parentInvocation, - ); -} - -class _FakeBatch_8 extends _i1.SmartFake implements _i5.Batch { - _FakeBatch_8( - Object parent, - Invocation parentInvocation, - ) : super( - parent, - parentInvocation, - ); -} - -class _FakeBaseOptions_9 extends _i1.SmartFake implements _i2.BaseOptions { - _FakeBaseOptions_9( - Object parent, - Invocation parentInvocation, - ) : super( - parent, - parentInvocation, - ); -} - -class _FakeHttpClientAdapter_10 extends _i1.SmartFake - implements _i2.HttpClientAdapter { - _FakeHttpClientAdapter_10( - Object parent, - Invocation parentInvocation, - ) : super( - parent, - parentInvocation, - ); -} - -class _FakeTransformer_11 extends _i1.SmartFake implements _i2.Transformer { - _FakeTransformer_11( - Object parent, - Invocation parentInvocation, - ) : super( - parent, - parentInvocation, - ); -} - -class _FakeInterceptors_12 extends _i1.SmartFake implements _i2.Interceptors { - _FakeInterceptors_12( - Object parent, - Invocation parentInvocation, - ) : super( - parent, - parentInvocation, - ); -} - -class _FakeFirebaseApp_13 extends _i1.SmartFake implements _i9.FirebaseApp { - _FakeFirebaseApp_13( - Object parent, - Invocation parentInvocation, - ) : super( - parent, - parentInvocation, - ); -} - -class _FakeDuration_14 extends _i1.SmartFake implements Duration { - _FakeDuration_14( - Object parent, - Invocation parentInvocation, - ) : super( - parent, - parentInvocation, - ); -} - -class _FakeHttpClientRequest_15 extends _i1.SmartFake - implements _i10.HttpClientRequest { - _FakeHttpClientRequest_15( - Object parent, - Invocation parentInvocation, - ) : super( - parent, - parentInvocation, - ); -} - -class _FakeUri_16 extends _i1.SmartFake implements Uri { - _FakeUri_16( - Object parent, - Invocation parentInvocation, - ) : super( - parent, - parentInvocation, - ); -} - -class _FakeHttpHeaders_17 extends _i1.SmartFake implements _i10.HttpHeaders { - _FakeHttpHeaders_17( - Object parent, - Invocation parentInvocation, - ) : super( - parent, - parentInvocation, - ); -} - -class _FakeHttpClientResponse_18 extends _i1.SmartFake - implements _i11.HttpClientResponse { - _FakeHttpClientResponse_18( - Object parent, - Invocation parentInvocation, - ) : super( - parent, - parentInvocation, - ); -} - -class _FakeEncoding_19 extends _i1.SmartFake implements _i12.Encoding { - _FakeEncoding_19( - Object parent, - Invocation parentInvocation, - ) : super( - parent, - parentInvocation, - ); -} - -class _FakeSocket_20 extends _i1.SmartFake implements _i10.Socket { - _FakeSocket_20( - Object parent, - Invocation parentInvocation, - ) : super( - parent, - parentInvocation, - ); -} - -class _FakeStreamSubscription_21 extends _i1.SmartFake - implements _i8.StreamSubscription { - _FakeStreamSubscription_21( - Object parent, - Invocation parentInvocation, - ) : super( - parent, - parentInvocation, - ); -} - -class _FakeQRPairingScanResult_22 extends _i1.SmartFake - implements _i13.QRPairingScanResult { - _FakeQRPairingScanResult_22( - Object parent, - Invocation parentInvocation, - ) : super( - parent, - parentInvocation, - ); -} - -class _FakeDateTime_23 extends _i1.SmartFake implements DateTime { - _FakeDateTime_23( - Object parent, - Invocation parentInvocation, - ) : super( - parent, - parentInvocation, - ); -} - -class _FakeRemoteConfigSettings_24 extends _i1.SmartFake - implements _i14.RemoteConfigSettings { - _FakeRemoteConfigSettings_24( - Object parent, - Invocation parentInvocation, - ) : super( - parent, - parentInvocation, - ); -} - -class _FakeRemoteConfigValue_25 extends _i1.SmartFake - implements _i14.RemoteConfigValue { - _FakeRemoteConfigValue_25( - Object parent, - Invocation parentInvocation, - ) : super( - parent, - parentInvocation, - ); -} - -class _FakeMethodChannel_26 extends _i1.SmartFake - implements _i15.MethodChannel { - _FakeMethodChannel_26( - Object parent, - Invocation parentInvocation, - ) : super( - parent, - parentInvocation, - ); -} - -class _FakeJavascriptChannel_27 extends _i1.SmartFake - implements _i16.JavascriptChannel { - _FakeJavascriptChannel_27( - Object parent, - Invocation parentInvocation, - ) : super( - parent, - parentInvocation, - ); -} - -class _FakeFile_28 extends _i1.SmartFake implements _i10.File { - _FakeFile_28( - Object parent, - Invocation parentInvocation, - ) : super( - parent, - parentInvocation, - ); -} - -class _FakeDirectory_29 extends _i1.SmartFake implements _i10.Directory { - _FakeDirectory_29( - Object parent, - Invocation parentInvocation, - ) : super( - parent, - parentInvocation, - ); -} - -class _FakeWidget_30 extends _i1.SmartFake implements _i17.Widget { - _FakeWidget_30( - Object parent, - Invocation parentInvocation, - ) : super( - parent, - parentInvocation, - ); - - @override - String toString( - {_i11.DiagnosticLevel? minLevel = _i11.DiagnosticLevel.info}) => - super.toString(); -} - -class _FakeInheritedWidget_31 extends _i1.SmartFake - implements _i17.InheritedWidget { - _FakeInheritedWidget_31( - Object parent, - Invocation parentInvocation, - ) : super( - parent, - parentInvocation, - ); - - @override - String toString( - {_i11.DiagnosticLevel? minLevel = _i11.DiagnosticLevel.info}) => - super.toString(); -} - -class _FakeDiagnosticsNode_32 extends _i1.SmartFake - implements _i11.DiagnosticsNode { - _FakeDiagnosticsNode_32( - Object parent, - Invocation parentInvocation, - ) : super( - parent, - parentInvocation, - ); - - @override - String toString({ - _i11.TextTreeConfiguration? parentConfiguration, - _i11.DiagnosticLevel? minLevel = _i11.DiagnosticLevel.info, - }) => - super.toString(); -} - -class _FakeInboxCountNotifier_33 extends _i1.SmartFake - implements _i18.InboxCountNotifier { - _FakeInboxCountNotifier_33( - Object parent, - Invocation parentInvocation, - ) : super( - parent, - parentInvocation, - ); -} - -class _FakeAlertCountNotifier_34 extends _i1.SmartFake - implements _i19.AlertCountNotifier { - _FakeAlertCountNotifier_34( - Object parent, - Invocation parentInvocation, - ) : super( - parent, - parentInvocation, - ); -} - -class _FakeBarcodeScanResult_35 extends _i1.SmartFake - implements _i20.BarcodeScanResult { - _FakeBarcodeScanResult_35( - Object parent, - Invocation parentInvocation, - ) : super( - parent, - parentInvocation, - ); -} - -class _FakeCancelToken_36 extends _i1.SmartFake implements _i2.CancelToken { - _FakeCancelToken_36( - Object parent, - Invocation parentInvocation, - ) : super( - parent, - parentInvocation, - ); -} - -class _FakeDioError_37 extends _i1.SmartFake implements _i2.DioError { - _FakeDioError_37( - Object parent, - Invocation parentInvocation, - ) : super( - parent, - parentInvocation, - ); -} - -class _FakeVideoPlayerValue_38 extends _i1.SmartFake - implements _i21.VideoPlayerValue { - _FakeVideoPlayerValue_38( - Object parent, - Invocation parentInvocation, - ) : super( - parent, - parentInvocation, - ); -} - -class _FakeInterceptorState_39 extends _i1.SmartFake - implements _i22.InterceptorState { - _FakeInterceptorState_39( - Object parent, - Invocation parentInvocation, - ) : super( - parent, - parentInvocation, - ); -} - -/// A class which mocks [AccountsApi]. -/// -/// See the documentation for Mockito's code generation for more information. -class MockAccountsApi extends _i1.Mock implements _i23.AccountsApi { - @override - _i8.Future?> searchDomains(String? query) => - (super.noSuchMethod( - Invocation.method( - #searchDomains, - [query], - ), - returnValue: _i8.Future?>.value(), - returnValueForMissingStub: _i8.Future?>.value(), - ) as _i8.Future?>); - @override - _i8.Future<_i25.TermsOfService?> getTermsOfService() => (super.noSuchMethod( - Invocation.method( - #getTermsOfService, - [], - ), - returnValue: _i8.Future<_i25.TermsOfService?>.value(), - returnValueForMissingStub: _i8.Future<_i25.TermsOfService?>.value(), - ) as _i8.Future<_i25.TermsOfService?>); - @override - _i8.Future<_i25.TermsOfService?> getTermsOfServiceForAccount( - String? accountId, - String? domain, - ) => - (super.noSuchMethod( - Invocation.method( - #getTermsOfServiceForAccount, - [ - accountId, - domain, - ], - ), - returnValue: _i8.Future<_i25.TermsOfService?>.value(), - returnValueForMissingStub: _i8.Future<_i25.TermsOfService?>.value(), - ) as _i8.Future<_i25.TermsOfService?>); - @override - _i8.Future<_i26.AccountPermissions?> getAccountPermissions() => - (super.noSuchMethod( - Invocation.method( - #getAccountPermissions, - [], - ), - returnValue: _i8.Future<_i26.AccountPermissions?>.value(), - returnValueForMissingStub: _i8.Future<_i26.AccountPermissions?>.value(), - ) as _i8.Future<_i26.AccountPermissions?>); - @override - _i8.Future getPairingAllowed() => (super.noSuchMethod( - Invocation.method( - #getPairingAllowed, - [], - ), - returnValue: _i8.Future.value(false), - returnValueForMissingStub: _i8.Future.value(false), - ) as _i8.Future); - @override - _i8.Future<_i2.Response> createNewAccount( - String? accountId, - String? pairingCode, - String? fullname, - String? email, - String? password, - String? domain, - ) => - (super.noSuchMethod( - Invocation.method( - #createNewAccount, - [ - accountId, - pairingCode, - fullname, - email, - password, - domain, - ], - ), - returnValue: - _i8.Future<_i2.Response>.value(_FakeResponse_0( - this, - Invocation.method( - #createNewAccount, - [ - accountId, - pairingCode, - fullname, - email, - password, - domain, - ], - ), - )), - returnValueForMissingStub: - _i8.Future<_i2.Response>.value(_FakeResponse_0( - this, - Invocation.method( - #createNewAccount, - [ - accountId, - pairingCode, - fullname, - email, - password, - domain, - ], - ), - )), - ) as _i8.Future<_i2.Response>); -} - -/// A class which mocks [AccountCreationInteractor]. -/// -/// See the documentation for Mockito's code generation for more information. -class MockAccountCreationInteractor extends _i1.Mock - implements _i27.AccountCreationInteractor { - @override - _i8.Future<_i25.TermsOfService?> getToSForAccount( - String? accountId, - String? domain, - ) => - (super.noSuchMethod( - Invocation.method( - #getToSForAccount, - [ - accountId, - domain, - ], - ), - returnValue: _i8.Future<_i25.TermsOfService?>.value(), - returnValueForMissingStub: _i8.Future<_i25.TermsOfService?>.value(), - ) as _i8.Future<_i25.TermsOfService?>); - @override - _i8.Future<_i2.Response> createNewAccount( - String? accountId, - String? pairingCode, - String? fullname, - String? email, - String? password, - String? domain, - ) => - (super.noSuchMethod( - Invocation.method( - #createNewAccount, - [ - accountId, - pairingCode, - fullname, - email, - password, - domain, - ], - ), - returnValue: - _i8.Future<_i2.Response>.value(_FakeResponse_0( - this, - Invocation.method( - #createNewAccount, - [ - accountId, - pairingCode, - fullname, - email, - password, - domain, - ], - ), - )), - returnValueForMissingStub: - _i8.Future<_i2.Response>.value(_FakeResponse_0( - this, - Invocation.method( - #createNewAccount, - [ - accountId, - pairingCode, - fullname, - email, - password, - domain, - ], - ), - )), - ) as _i8.Future<_i2.Response>); -} - -/// A class which mocks [Analytics]. -/// -/// See the documentation for Mockito's code generation for more information. -class MockAnalytics extends _i1.Mock implements _i28.Analytics { - @override - void setCurrentScreen(String? screenName) => super.noSuchMethod( - Invocation.method( - #setCurrentScreen, - [screenName], - ), - returnValueForMissingStub: null, - ); - @override - void logEvent( - String? event, { - Map? extras = const {}, - }) => - super.noSuchMethod( - Invocation.method( - #logEvent, - [event], - {#extras: extras}, - ), - returnValueForMissingStub: null, - ); - @override - void logMessage(String? message) => super.noSuchMethod( - Invocation.method( - #logMessage, - [message], - ), - returnValueForMissingStub: null, - ); - @override - void setEnvironmentProperties() => super.noSuchMethod( - Invocation.method( - #setEnvironmentProperties, - [], - ), - returnValueForMissingStub: null, - ); -} - -/// A class which mocks [AndroidIntentVeneer]. -/// -/// See the documentation for Mockito's code generation for more information. -class MockAndroidIntentVeneer extends _i1.Mock - implements _i29.AndroidIntentVeneer { - @override - dynamic launch(_i30.AndroidIntent? intent) => super.noSuchMethod( - Invocation.method( - #launch, - [intent], - ), - returnValueForMissingStub: null, - ); - @override - dynamic launchPhone(String? phoneNumber) => super.noSuchMethod( - Invocation.method( - #launchPhone, - [phoneNumber], - ), - returnValueForMissingStub: null, - ); - @override - dynamic launchEmail(String? url) => super.noSuchMethod( - Invocation.method( - #launchEmail, - [url], - ), - returnValueForMissingStub: null, - ); - @override - dynamic launchEmailWithBody( - String? subject, - String? emailBody, { - String? recipientEmail = r'mobilesupport@instructure.com', - }) => - super.noSuchMethod( - Invocation.method( - #launchEmailWithBody, - [ - subject, - emailBody, - ], - {#recipientEmail: recipientEmail}, - ), - returnValueForMissingStub: null, - ); - @override - String encodeQueryParameters(Map? params) => - (super.noSuchMethod( - Invocation.method( - #encodeQueryParameters, - [params], - ), - returnValue: '', - returnValueForMissingStub: '', - ) as String); -} - -/// A class which mocks [AlertsApi]. -/// -/// See the documentation for Mockito's code generation for more information. -class MockAlertsApi extends _i1.Mock implements _i31.AlertsApi { - @override - _i8.Future?> getAlertsDepaginated( - String? studentId, - bool? forceRefresh, - ) => - (super.noSuchMethod( - Invocation.method( - #getAlertsDepaginated, - [ - studentId, - forceRefresh, - ], - ), - returnValue: _i8.Future?>.value(), - returnValueForMissingStub: _i8.Future?>.value(), - ) as _i8.Future?>); - @override - _i8.Future<_i32.Alert?> updateAlertWorkflow( - String? studentId, - String? alertId, - String? workflowState, - ) => - (super.noSuchMethod( - Invocation.method( - #updateAlertWorkflow, - [ - studentId, - alertId, - workflowState, - ], - ), - returnValue: _i8.Future<_i32.Alert?>.value(), - returnValueForMissingStub: _i8.Future<_i32.Alert?>.value(), - ) as _i8.Future<_i32.Alert?>); - @override - _i8.Future<_i33.UnreadCount?> getUnreadCount(String? studentId) => - (super.noSuchMethod( - Invocation.method( - #getUnreadCount, - [studentId], - ), - returnValue: _i8.Future<_i33.UnreadCount?>.value(), - returnValueForMissingStub: _i8.Future<_i33.UnreadCount?>.value(), - ) as _i8.Future<_i33.UnreadCount?>); - @override - _i8.Future?> getAlertThresholds( - String? studentId, - bool? forceRefresh, - ) => - (super.noSuchMethod( - Invocation.method( - #getAlertThresholds, - [ - studentId, - forceRefresh, - ], - ), - returnValue: _i8.Future?>.value(), - returnValueForMissingStub: - _i8.Future?>.value(), - ) as _i8.Future?>); - @override - _i8.Future<_i34.AlertThreshold?> deleteAlert( - _i34.AlertThreshold? threshold) => - (super.noSuchMethod( - Invocation.method( - #deleteAlert, - [threshold], - ), - returnValue: _i8.Future<_i34.AlertThreshold?>.value(), - returnValueForMissingStub: _i8.Future<_i34.AlertThreshold?>.value(), - ) as _i8.Future<_i34.AlertThreshold?>); - @override - _i8.Future<_i34.AlertThreshold?> createThreshold( - _i32.AlertType? type, - String? studentId, { - String? value, - }) => - (super.noSuchMethod( - Invocation.method( - #createThreshold, - [ - type, - studentId, - ], - {#value: value}, - ), - returnValue: _i8.Future<_i34.AlertThreshold?>.value(), - returnValueForMissingStub: _i8.Future<_i34.AlertThreshold?>.value(), - ) as _i8.Future<_i34.AlertThreshold?>); -} - -/// A class which mocks [AlertCountNotifier]. -/// -/// See the documentation for Mockito's code generation for more information. -class MockAlertCountNotifier extends _i1.Mock - implements _i19.AlertCountNotifier { - @override - int get value => (super.noSuchMethod( - Invocation.getter(#value), - returnValue: 0, - returnValueForMissingStub: 0, - ) as int); - @override - set value(int? newValue) => super.noSuchMethod( - Invocation.setter( - #value, - newValue, - ), - returnValueForMissingStub: null, - ); - @override - bool get hasListeners => (super.noSuchMethod( - Invocation.getter(#hasListeners), - returnValue: false, - returnValueForMissingStub: false, - ) as bool); - @override - dynamic update(String? studentId) => super.noSuchMethod( - Invocation.method( - #update, - [studentId], - ), - returnValueForMissingStub: null, - ); - @override - void addListener(_i35.VoidCallback? listener) => super.noSuchMethod( - Invocation.method( - #addListener, - [listener], - ), - returnValueForMissingStub: null, - ); - @override - void removeListener(_i35.VoidCallback? listener) => super.noSuchMethod( - Invocation.method( - #removeListener, - [listener], - ), - returnValueForMissingStub: null, - ); - @override - void dispose() => super.noSuchMethod( - Invocation.method( - #dispose, - [], - ), - returnValueForMissingStub: null, - ); - @override - void notifyListeners() => super.noSuchMethod( - Invocation.method( - #notifyListeners, - [], - ), - returnValueForMissingStub: null, - ); -} - -/// A class which mocks [AssignmentApi]. -/// -/// See the documentation for Mockito's code generation for more information. -class MockAssignmentApi extends _i1.Mock implements _i36.AssignmentApi { - @override - _i8.Future?> getAssignmentsWithSubmissionsDepaginated( - int? courseId, - int? studentId, - ) => - (super.noSuchMethod( - Invocation.method( - #getAssignmentsWithSubmissionsDepaginated, - [ - courseId, - studentId, - ], - ), - returnValue: _i8.Future?>.value(), - returnValueForMissingStub: _i8.Future?>.value(), - ) as _i8.Future?>); - @override - _i8.Future?> - getAssignmentGroupsWithSubmissionsDepaginated( - String? courseId, - String? studentId, - String? gradingPeriodId, { - bool? forceRefresh = false, - }) => - (super.noSuchMethod( - Invocation.method( - #getAssignmentGroupsWithSubmissionsDepaginated, - [ - courseId, - studentId, - gradingPeriodId, - ], - {#forceRefresh: forceRefresh}, - ), - returnValue: _i8.Future?>.value(), - returnValueForMissingStub: - _i8.Future?>.value(), - ) as _i8.Future?>); - @override - _i8.Future<_i39.PagedList<_i37.Assignment>?> - getAssignmentsWithSubmissionsPaged( - String? courseId, - String? studentId, - ) => - (super.noSuchMethod( - Invocation.method( - #getAssignmentsWithSubmissionsPaged, - [ - courseId, - studentId, - ], - ), - returnValue: _i8.Future<_i39.PagedList<_i37.Assignment>?>.value(), - returnValueForMissingStub: - _i8.Future<_i39.PagedList<_i37.Assignment>?>.value(), - ) as _i8.Future<_i39.PagedList<_i37.Assignment>?>); - @override - _i8.Future<_i37.Assignment?> getAssignment( - String? courseId, - String? assignmentId, { - bool? forceRefresh = false, - }) => - (super.noSuchMethod( - Invocation.method( - #getAssignment, - [ - courseId, - assignmentId, - ], - {#forceRefresh: forceRefresh}, - ), - returnValue: _i8.Future<_i37.Assignment?>.value(), - returnValueForMissingStub: _i8.Future<_i37.Assignment?>.value(), - ) as _i8.Future<_i37.Assignment?>); -} - -/// A class which mocks [AssignmentDetailsInteractor]. -/// -/// See the documentation for Mockito's code generation for more information. -class MockAssignmentDetailsInteractor extends _i1.Mock - implements _i3.AssignmentDetailsInteractor { - @override - _i8.Future<_i3.AssignmentDetails?> loadAssignmentDetails( - bool? forceRefresh, - String? courseId, - String? assignmentId, - String? studentId, - ) => - (super.noSuchMethod( - Invocation.method( - #loadAssignmentDetails, - [ - forceRefresh, - courseId, - assignmentId, - studentId, - ], - ), - returnValue: _i8.Future<_i3.AssignmentDetails?>.value(), - returnValueForMissingStub: _i8.Future<_i3.AssignmentDetails?>.value(), - ) as _i8.Future<_i3.AssignmentDetails?>); - @override - _i8.Future<_i3.AssignmentDetails> loadQuizDetails( - bool? forceRefresh, - String? courseId, - String? assignmentId, - String? studentId, - ) => - (super.noSuchMethod( - Invocation.method( - #loadQuizDetails, - [ - forceRefresh, - courseId, - assignmentId, - studentId, - ], - ), - returnValue: - _i8.Future<_i3.AssignmentDetails>.value(_FakeAssignmentDetails_1( - this, - Invocation.method( - #loadQuizDetails, - [ - forceRefresh, - courseId, - assignmentId, - studentId, - ], - ), - )), - returnValueForMissingStub: - _i8.Future<_i3.AssignmentDetails>.value(_FakeAssignmentDetails_1( - this, - Invocation.method( - #loadQuizDetails, - [ - forceRefresh, - courseId, - assignmentId, - studentId, - ], - ), - )), - ) as _i8.Future<_i3.AssignmentDetails>); - @override - _i8.Future<_i40.Reminder?> loadReminder(String? assignmentId) => - (super.noSuchMethod( - Invocation.method( - #loadReminder, - [assignmentId], - ), - returnValue: _i8.Future<_i40.Reminder?>.value(), - returnValueForMissingStub: _i8.Future<_i40.Reminder?>.value(), - ) as _i8.Future<_i40.Reminder?>); - @override - _i8.Future createReminder( - _i41.AppLocalizations? l10n, - DateTime? date, - String? assignmentId, - String? courseId, - String? title, - String? body, - ) => - (super.noSuchMethod( - Invocation.method( - #createReminder, - [ - l10n, - date, - assignmentId, - courseId, - title, - body, - ], - ), - returnValue: _i8.Future.value(), - returnValueForMissingStub: _i8.Future.value(), - ) as _i8.Future); - @override - _i8.Future deleteReminder(_i40.Reminder? reminder) => - (super.noSuchMethod( - Invocation.method( - #deleteReminder, - [reminder], - ), - returnValue: _i8.Future.value(), - returnValueForMissingStub: _i8.Future.value(), - ) as _i8.Future); -} - -/// A class which mocks [AuthApi]. -/// -/// See the documentation for Mockito's code generation for more information. -class MockAuthApi extends _i1.Mock implements _i42.AuthApi { - @override - _i8.Future<_i43.CanvasToken?> refreshToken() => (super.noSuchMethod( - Invocation.method( - #refreshToken, - [], - ), - returnValue: _i8.Future<_i43.CanvasToken?>.value(), - returnValueForMissingStub: _i8.Future<_i43.CanvasToken?>.value(), - ) as _i8.Future<_i43.CanvasToken?>); - @override - _i8.Future<_i43.CanvasToken?> getTokens( - _i44.MobileVerifyResult? verifyResult, - String? requestCode, - ) => - (super.noSuchMethod( - Invocation.method( - #getTokens, - [ - verifyResult, - requestCode, - ], - ), - returnValue: _i8.Future<_i43.CanvasToken?>.value(), - returnValueForMissingStub: _i8.Future<_i43.CanvasToken?>.value(), - ) as _i8.Future<_i43.CanvasToken?>); - @override - _i8.Future<_i44.MobileVerifyResult?> mobileVerify( - String? domain, { - bool? forceBetaDomain = false, - }) => - (super.noSuchMethod( - Invocation.method( - #mobileVerify, - [domain], - {#forceBetaDomain: forceBetaDomain}, - ), - returnValue: _i8.Future<_i44.MobileVerifyResult?>.value(), - returnValueForMissingStub: _i8.Future<_i44.MobileVerifyResult?>.value(), - ) as _i8.Future<_i44.MobileVerifyResult?>); - @override - _i8.Future deleteToken( - String? domain, - String? token, - ) => - (super.noSuchMethod( - Invocation.method( - #deleteToken, - [ - domain, - token, - ], - ), - returnValue: _i8.Future.value(), - returnValueForMissingStub: _i8.Future.value(), - ) as _i8.Future); -} - -/// A class which mocks [BarcodeScanVeneer]. -/// -/// See the documentation for Mockito's code generation for more information. -class MockBarcodeScanVeneer extends _i1.Mock implements _i45.BarcodeScanVeneer { - @override - _i8.Future<_i4.ScanResult> scanBarcode() => (super.noSuchMethod( - Invocation.method( - #scanBarcode, - [], - ), - returnValue: _i8.Future<_i4.ScanResult>.value(_FakeScanResult_2( - this, - Invocation.method( - #scanBarcode, - [], - ), - )), - returnValueForMissingStub: - _i8.Future<_i4.ScanResult>.value(_FakeScanResult_2( - this, - Invocation.method( - #scanBarcode, - [], - ), - )), - ) as _i8.Future<_i4.ScanResult>); - @override - _i8.Future getNumberOfCameras() => (super.noSuchMethod( - Invocation.method( - #getNumberOfCameras, - [], - ), - returnValue: _i8.Future.value(0), - returnValueForMissingStub: _i8.Future.value(0), - ) as _i8.Future); -} - -/// A class which mocks [CalendarEventsApi]. -/// -/// See the documentation for Mockito's code generation for more information. -class MockCalendarEventsApi extends _i1.Mock implements _i46.CalendarEventsApi { - @override - _i8.Future?> getAllCalendarEvents({ - bool? allEvents = false, - String? type = r'event', - String? startDate = null, - String? endDate = null, - List? contexts = const [], - bool? forceRefresh = false, - }) => - (super.noSuchMethod( - Invocation.method( - #getAllCalendarEvents, - [], - { - #allEvents: allEvents, - #type: type, - #startDate: startDate, - #endDate: endDate, - #contexts: contexts, - #forceRefresh: forceRefresh, - }, - ), - returnValue: _i8.Future?>.value(), - returnValueForMissingStub: _i8.Future?>.value(), - ) as _i8.Future?>); - @override - _i8.Future<_i47.ScheduleItem?> getEvent( - String? eventId, - bool? forceRefresh, - ) => - (super.noSuchMethod( - Invocation.method( - #getEvent, - [ - eventId, - forceRefresh, - ], - ), - returnValue: _i8.Future<_i47.ScheduleItem?>.value(), - returnValueForMissingStub: _i8.Future<_i47.ScheduleItem?>.value(), - ) as _i8.Future<_i47.ScheduleItem?>); - @override - _i8.Future?> getUserCalendarItems( - String? userId, - DateTime? startDay, - DateTime? endDay, - String? type, { - Set? contexts = const {}, - bool? forceRefresh = false, - }) => - (super.noSuchMethod( - Invocation.method( - #getUserCalendarItems, - [ - userId, - startDay, - endDay, - type, - ], - { - #contexts: contexts, - #forceRefresh: forceRefresh, - }, - ), - returnValue: _i8.Future?>.value(), - returnValueForMissingStub: _i8.Future?>.value(), - ) as _i8.Future?>); - @override - Map getQueryParams( - DateTime? startDay, - DateTime? endDay, - String? type, { - Set? contexts = const {}, - bool? includeSubmissions = false, - }) => - (super.noSuchMethod( - Invocation.method( - #getQueryParams, - [ - startDay, - endDay, - type, - ], - { - #contexts: contexts, - #includeSubmissions: includeSubmissions, - }, - ), - returnValue: {}, - returnValueForMissingStub: {}, - ) as Map); -} - -/// A class which mocks [CalendarFilterDb]. -/// -/// See the documentation for Mockito's code generation for more information. -class MockCalendarFilterDb extends _i1.Mock implements _i48.CalendarFilterDb { - @override - _i5.Database get db => (super.noSuchMethod( - Invocation.getter(#db), - returnValue: _FakeDatabase_3( - this, - Invocation.getter(#db), - ), - returnValueForMissingStub: _FakeDatabase_3( - this, - Invocation.getter(#db), - ), - ) as _i5.Database); - @override - set db(_i5.Database? _db) => super.noSuchMethod( - Invocation.setter( - #db, - _db, - ), - returnValueForMissingStub: null, - ); - @override - _i8.Future<_i49.CalendarFilter?> insertOrUpdate(_i49.CalendarFilter? data) => - (super.noSuchMethod( - Invocation.method( - #insertOrUpdate, - [data], - ), - returnValue: _i8.Future<_i49.CalendarFilter?>.value(), - returnValueForMissingStub: _i8.Future<_i49.CalendarFilter?>.value(), - ) as _i8.Future<_i49.CalendarFilter?>); - @override - _i8.Future<_i49.CalendarFilter?> getById(int? id) => (super.noSuchMethod( - Invocation.method( - #getById, - [id], - ), - returnValue: _i8.Future<_i49.CalendarFilter?>.value(), - returnValueForMissingStub: _i8.Future<_i49.CalendarFilter?>.value(), - ) as _i8.Future<_i49.CalendarFilter?>); - @override - _i8.Future<_i49.CalendarFilter?> getByObserveeId( - String? userDomain, - String? userId, - String? observeeId, - ) => - (super.noSuchMethod( - Invocation.method( - #getByObserveeId, - [ - userDomain, - userId, - observeeId, - ], - ), - returnValue: _i8.Future<_i49.CalendarFilter?>.value(), - returnValueForMissingStub: _i8.Future<_i49.CalendarFilter?>.value(), - ) as _i8.Future<_i49.CalendarFilter?>); - @override - _i8.Future deleteById(int? id) => (super.noSuchMethod( - Invocation.method( - #deleteById, - [id], - ), - returnValue: _i8.Future.value(0), - returnValueForMissingStub: _i8.Future.value(0), - ) as _i8.Future); - @override - _i8.Future deleteAllForUser( - String? userDomain, - String? userId, - ) => - (super.noSuchMethod( - Invocation.method( - #deleteAllForUser, - [ - userDomain, - userId, - ], - ), - returnValue: _i8.Future.value(0), - returnValueForMissingStub: _i8.Future.value(0), - ) as _i8.Future); -} - -/// A class which mocks [CalendarFilterListInteractor]. -/// -/// See the documentation for Mockito's code generation for more information. -class MockCalendarFilterListInteractor extends _i1.Mock - implements _i50.CalendarFilterListInteractor { - @override - _i8.Future?> getCoursesForSelectedStudent( - {bool? isRefresh = false}) => - (super.noSuchMethod( - Invocation.method( - #getCoursesForSelectedStudent, - [], - {#isRefresh: isRefresh}, - ), - returnValue: _i8.Future?>.value(), - returnValueForMissingStub: _i8.Future?>.value(), - ) as _i8.Future?>); -} - -/// A class which mocks [CourseApi]. -/// -/// See the documentation for Mockito's code generation for more information. -class MockCourseApi extends _i1.Mock implements _i52.CourseApi { - @override - _i8.Future?> getObserveeCourses( - {bool? forceRefresh = false}) => - (super.noSuchMethod( - Invocation.method( - #getObserveeCourses, - [], - {#forceRefresh: forceRefresh}, - ), - returnValue: _i8.Future?>.value(), - returnValueForMissingStub: _i8.Future?>.value(), - ) as _i8.Future?>); - @override - _i8.Future<_i51.Course?> getCourse( - String? courseId, { - bool? forceRefresh = false, - }) => - (super.noSuchMethod( - Invocation.method( - #getCourse, - [courseId], - {#forceRefresh: forceRefresh}, - ), - returnValue: _i8.Future<_i51.Course?>.value(), - returnValueForMissingStub: _i8.Future<_i51.Course?>.value(), - ) as _i8.Future<_i51.Course?>); - @override - _i8.Future<_i53.GradingPeriodResponse?> getGradingPeriods( - String? courseId, { - bool? forceRefresh = false, - }) => - (super.noSuchMethod( - Invocation.method( - #getGradingPeriods, - [courseId], - {#forceRefresh: forceRefresh}, - ), - returnValue: _i8.Future<_i53.GradingPeriodResponse?>.value(), - returnValueForMissingStub: - _i8.Future<_i53.GradingPeriodResponse?>.value(), - ) as _i8.Future<_i53.GradingPeriodResponse?>); - @override - _i8.Future?> getCourseTabs( - String? courseId, { - bool? forceRefresh = false, - }) => - (super.noSuchMethod( - Invocation.method( - #getCourseTabs, - [courseId], - {#forceRefresh: forceRefresh}, - ), - returnValue: _i8.Future?>.value(), - returnValueForMissingStub: _i8.Future?>.value(), - ) as _i8.Future?>); - @override - _i8.Future<_i55.CourseSettings?> getCourseSettings( - String? courseId, { - bool? forceRefresh = false, - }) => - (super.noSuchMethod( - Invocation.method( - #getCourseSettings, - [courseId], - {#forceRefresh: forceRefresh}, - ), - returnValue: _i8.Future<_i55.CourseSettings?>.value(), - returnValueForMissingStub: _i8.Future<_i55.CourseSettings?>.value(), - ) as _i8.Future<_i55.CourseSettings?>); - @override - _i8.Future<_i56.CoursePermissions?> getCoursePermissions( - String? courseId, { - bool? forceRefresh = false, - }) => - (super.noSuchMethod( - Invocation.method( - #getCoursePermissions, - [courseId], - {#forceRefresh: forceRefresh}, - ), - returnValue: _i8.Future<_i56.CoursePermissions?>.value(), - returnValueForMissingStub: _i8.Future<_i56.CoursePermissions?>.value(), - ) as _i8.Future<_i56.CoursePermissions?>); - @override - _i8.Future?> getEnabledCourseFeatures( - String? courseId, { - bool? forceRefresh = false, - }) => - (super.noSuchMethod( - Invocation.method( - #getEnabledCourseFeatures, - [courseId], - {#forceRefresh: forceRefresh}, - ), - returnValue: _i8.Future?>.value(), - returnValueForMissingStub: _i8.Future?>.value(), - ) as _i8.Future?>); -} - -/// A class which mocks [CourseDetailsInteractor]. -/// -/// See the documentation for Mockito's code generation for more information. -class MockCourseDetailsInteractor extends _i1.Mock - implements _i57.CourseDetailsInteractor { - @override - _i8.Future<_i51.Course?> loadCourse( - String? courseId, { - bool? forceRefresh = false, - }) => - (super.noSuchMethod( - Invocation.method( - #loadCourse, - [courseId], - {#forceRefresh: forceRefresh}, - ), - returnValue: _i8.Future<_i51.Course?>.value(), - returnValueForMissingStub: _i8.Future<_i51.Course?>.value(), - ) as _i8.Future<_i51.Course?>); - @override - _i8.Future?> loadCourseTabs( - String? courseId, { - bool? forceRefresh = false, - }) => - (super.noSuchMethod( - Invocation.method( - #loadCourseTabs, - [courseId], - {#forceRefresh: forceRefresh}, - ), - returnValue: _i8.Future?>.value(), - returnValueForMissingStub: _i8.Future?>.value(), - ) as _i8.Future?>); - @override - _i8.Future<_i55.CourseSettings?> loadCourseSettings( - String? courseId, { - bool? forceRefresh = false, - }) => - (super.noSuchMethod( - Invocation.method( - #loadCourseSettings, - [courseId], - {#forceRefresh: forceRefresh}, - ), - returnValue: _i8.Future<_i55.CourseSettings?>.value(), - returnValueForMissingStub: _i8.Future<_i55.CourseSettings?>.value(), - ) as _i8.Future<_i55.CourseSettings?>); - @override - _i8.Future?> loadAssignmentGroups( - String? courseId, - String? studentId, - String? gradingPeriodId, { - bool? forceRefresh = false, - }) => - (super.noSuchMethod( - Invocation.method( - #loadAssignmentGroups, - [ - courseId, - studentId, - gradingPeriodId, - ], - {#forceRefresh: forceRefresh}, - ), - returnValue: _i8.Future?>.value(), - returnValueForMissingStub: - _i8.Future?>.value(), - ) as _i8.Future?>); - @override - _i8.Future<_i53.GradingPeriodResponse?> loadGradingPeriods( - String? courseId, { - bool? forceRefresh = false, - }) => - (super.noSuchMethod( - Invocation.method( - #loadGradingPeriods, - [courseId], - {#forceRefresh: forceRefresh}, - ), - returnValue: _i8.Future<_i53.GradingPeriodResponse?>.value(), - returnValueForMissingStub: - _i8.Future<_i53.GradingPeriodResponse?>.value(), - ) as _i8.Future<_i53.GradingPeriodResponse?>); - @override - _i8.Future?> loadEnrollmentsForGradingPeriod( - String? courseId, - String? studentId, - String? gradingPeriodId, { - bool? forceRefresh = false, - }) => - (super.noSuchMethod( - Invocation.method( - #loadEnrollmentsForGradingPeriod, - [ - courseId, - studentId, - gradingPeriodId, - ], - {#forceRefresh: forceRefresh}, - ), - returnValue: _i8.Future?>.value(), - returnValueForMissingStub: _i8.Future?>.value(), - ) as _i8.Future?>); - @override - _i8.Future?> loadScheduleItems( - String? courseId, - String? type, - bool? refresh, - ) => - (super.noSuchMethod( - Invocation.method( - #loadScheduleItems, - [ - courseId, - type, - refresh, - ], - ), - returnValue: _i8.Future?>.value(), - returnValueForMissingStub: _i8.Future?>.value(), - ) as _i8.Future?>); - @override - _i8.Future<_i59.CanvasPage?> loadFrontPage( - String? courseId, { - bool? forceRefresh = false, - }) => - (super.noSuchMethod( - Invocation.method( - #loadFrontPage, - [courseId], - {#forceRefresh: forceRefresh}, - ), - returnValue: _i8.Future<_i59.CanvasPage?>.value(), - returnValueForMissingStub: _i8.Future<_i59.CanvasPage?>.value(), - ) as _i8.Future<_i59.CanvasPage?>); -} - -/// A class which mocks [CoursesInteractor]. -/// -/// See the documentation for Mockito's code generation for more information. -class MockCoursesInteractor extends _i1.Mock implements _i60.CoursesInteractor { - @override - _i8.Future?> getCourses({ - bool? isRefresh = false, - String? studentId = null, - }) => - (super.noSuchMethod( - Invocation.method( - #getCourses, - [], - { - #isRefresh: isRefresh, - #studentId: studentId, - }, - ), - returnValue: _i8.Future?>.value(), - returnValueForMissingStub: _i8.Future?>.value(), - ) as _i8.Future?>); -} - -/// A class which mocks [CourseDetailsModel]. -/// -/// See the documentation for Mockito's code generation for more information. -class MockCourseDetailsModel extends _i1.Mock - implements _i6.CourseDetailsModel { - @override - set student(_i61.User? _student) => super.noSuchMethod( - Invocation.setter( - #student, - _student, - ), - returnValueForMissingStub: null, - ); - @override - String get courseId => (super.noSuchMethod( - Invocation.getter(#courseId), - returnValue: '', - returnValueForMissingStub: '', - ) as String); - @override - set courseId(String? _courseId) => super.noSuchMethod( - Invocation.setter( - #courseId, - _courseId, - ), - returnValueForMissingStub: null, - ); - @override - set course(_i51.Course? _course) => super.noSuchMethod( - Invocation.setter( - #course, - _course, - ), - returnValueForMissingStub: null, - ); - @override - set courseSettings(_i55.CourseSettings? _courseSettings) => - super.noSuchMethod( - Invocation.setter( - #courseSettings, - _courseSettings, - ), - returnValueForMissingStub: null, - ); - @override - set tabs(List<_i54.CourseTab>? _tabs) => super.noSuchMethod( - Invocation.setter( - #tabs, - _tabs, - ), - returnValueForMissingStub: null, - ); - @override - bool get forceRefresh => (super.noSuchMethod( - Invocation.getter(#forceRefresh), - returnValue: false, - returnValueForMissingStub: false, - ) as bool); - @override - set forceRefresh(bool? _forceRefresh) => super.noSuchMethod( - Invocation.setter( - #forceRefresh, - _forceRefresh, - ), - returnValueForMissingStub: null, - ); - @override - bool get hasHomePageAsFrontPage => (super.noSuchMethod( - Invocation.getter(#hasHomePageAsFrontPage), - returnValue: false, - returnValueForMissingStub: false, - ) as bool); - @override - bool get hasHomePageAsSyllabus => (super.noSuchMethod( - Invocation.getter(#hasHomePageAsSyllabus), - returnValue: false, - returnValueForMissingStub: false, - ) as bool); - @override - bool get showSummary => (super.noSuchMethod( - Invocation.getter(#showSummary), - returnValue: false, - returnValueForMissingStub: false, - ) as bool); - @override - bool get restrictQuantitativeData => (super.noSuchMethod( - Invocation.getter(#restrictQuantitativeData), - returnValue: false, - returnValueForMissingStub: false, - ) as bool); - @override - _i62.ViewState get state => (super.noSuchMethod( - Invocation.getter(#state), - returnValue: _i62.ViewState.Idle, - returnValueForMissingStub: _i62.ViewState.Idle, - ) as _i62.ViewState); - @override - bool get hasListeners => (super.noSuchMethod( - Invocation.getter(#hasListeners), - returnValue: false, - returnValueForMissingStub: false, - ) as bool); - @override - _i8.Future loadData({bool? refreshCourse = false}) => - (super.noSuchMethod( - Invocation.method( - #loadData, - [], - {#refreshCourse: refreshCourse}, - ), - returnValue: _i8.Future.value(), - returnValueForMissingStub: _i8.Future.value(), - ) as _i8.Future); - @override - _i8.Future<_i6.GradeDetails> loadAssignments({bool? forceRefresh = false}) => - (super.noSuchMethod( - Invocation.method( - #loadAssignments, - [], - {#forceRefresh: forceRefresh}, - ), - returnValue: _i8.Future<_i6.GradeDetails>.value(_FakeGradeDetails_4( - this, - Invocation.method( - #loadAssignments, - [], - {#forceRefresh: forceRefresh}, - ), - )), - returnValueForMissingStub: - _i8.Future<_i6.GradeDetails>.value(_FakeGradeDetails_4( - this, - Invocation.method( - #loadAssignments, - [], - {#forceRefresh: forceRefresh}, - ), - )), - ) as _i8.Future<_i6.GradeDetails>); - @override - _i8.Future?> loadSummary({bool? refresh = false}) => - (super.noSuchMethod( - Invocation.method( - #loadSummary, - [], - {#refresh: refresh}, - ), - returnValue: _i8.Future?>.value(), - returnValueForMissingStub: _i8.Future?>.value(), - ) as _i8.Future?>); - @override - int tabCount() => (super.noSuchMethod( - Invocation.method( - #tabCount, - [], - ), - returnValue: 0, - returnValueForMissingStub: 0, - ) as int); - @override - void setState({required _i62.ViewState? viewState}) => super.noSuchMethod( - Invocation.method( - #setState, - [], - {#viewState: viewState}, - ), - returnValueForMissingStub: null, - ); - @override - _i8.Future work(_i8.Future Function()? loadBlock) => - (super.noSuchMethod( - Invocation.method( - #work, - [loadBlock], - ), - returnValue: _i8.Future.value(), - returnValueForMissingStub: _i8.Future.value(), - ) as _i8.Future); - @override - void addListener(_i35.VoidCallback? listener) => super.noSuchMethod( - Invocation.method( - #addListener, - [listener], - ), - returnValueForMissingStub: null, - ); - @override - void removeListener(_i35.VoidCallback? listener) => super.noSuchMethod( - Invocation.method( - #removeListener, - [listener], - ), - returnValueForMissingStub: null, - ); - @override - void dispose() => super.noSuchMethod( - Invocation.method( - #dispose, - [], - ), - returnValueForMissingStub: null, - ); - @override - void notifyListeners() => super.noSuchMethod( - Invocation.method( - #notifyListeners, - [], - ), - returnValueForMissingStub: null, - ); -} - -/// A class which mocks [CourseRoutingShellInteractor]. -/// -/// See the documentation for Mockito's code generation for more information. -class MockCourseRoutingShellInteractor extends _i1.Mock - implements _i63.CourseRoutingShellInteractor { - @override - _i8.Future<_i63.CourseShellData?> loadCourseShell( - _i64.CourseShellType? type, - String? courseId, { - bool? forceRefresh = false, - }) => - (super.noSuchMethod( - Invocation.method( - #loadCourseShell, - [ - type, - courseId, - ], - {#forceRefresh: forceRefresh}, - ), - returnValue: _i8.Future<_i63.CourseShellData?>.value(), - returnValueForMissingStub: _i8.Future<_i63.CourseShellData?>.value(), - ) as _i8.Future<_i63.CourseShellData?>); -} - -/// A class which mocks [CreateConversationInteractor]. -/// -/// See the documentation for Mockito's code generation for more information. -class MockCreateConversationInteractor extends _i1.Mock - implements _i7.CreateConversationInteractor { - @override - _i8.Future<_i7.CreateConversationData> loadData( - String? courseId, - String? studentId, - ) => - (super.noSuchMethod( - Invocation.method( - #loadData, - [ - courseId, - studentId, - ], - ), - returnValue: _i8.Future<_i7.CreateConversationData>.value( - _FakeCreateConversationData_5( - this, - Invocation.method( - #loadData, - [ - courseId, - studentId, - ], - ), - )), - returnValueForMissingStub: _i8.Future<_i7.CreateConversationData>.value( - _FakeCreateConversationData_5( - this, - Invocation.method( - #loadData, - [ - courseId, - studentId, - ], - ), - )), - ) as _i8.Future<_i7.CreateConversationData>); - @override - _i8.Future<_i65.Conversation?> createConversation( - String? courseId, - List? recipientIds, - String? subject, - String? body, - List? attachmentIds, - ) => - (super.noSuchMethod( - Invocation.method( - #createConversation, - [ - courseId, - recipientIds, - subject, - body, - attachmentIds, - ], - ), - returnValue: _i8.Future<_i65.Conversation?>.value(), - returnValueForMissingStub: _i8.Future<_i65.Conversation?>.value(), - ) as _i8.Future<_i65.Conversation?>); - @override - _i8.Future<_i66.AttachmentHandler?> addAttachment( - _i17.BuildContext? context) => - (super.noSuchMethod( - Invocation.method( - #addAttachment, - [context], - ), - returnValue: _i8.Future<_i66.AttachmentHandler?>.value(), - returnValueForMissingStub: _i8.Future<_i66.AttachmentHandler?>.value(), - ) as _i8.Future<_i66.AttachmentHandler?>); -} - -/// A class which mocks [Database]. -/// -/// See the documentation for Mockito's code generation for more information. -class MockDatabase extends _i1.Mock implements _i5.Database { - @override - String get path => (super.noSuchMethod( - Invocation.getter(#path), - returnValue: '', - returnValueForMissingStub: '', - ) as String); - @override - bool get isOpen => (super.noSuchMethod( - Invocation.getter(#isOpen), - returnValue: false, - returnValueForMissingStub: false, - ) as bool); - @override - _i5.Database get database => (super.noSuchMethod( - Invocation.getter(#database), - returnValue: _FakeDatabase_3( - this, - Invocation.getter(#database), - ), - returnValueForMissingStub: _FakeDatabase_3( - this, - Invocation.getter(#database), - ), - ) as _i5.Database); - @override - _i8.Future close() => (super.noSuchMethod( - Invocation.method( - #close, - [], - ), - returnValue: _i8.Future.value(), - returnValueForMissingStub: _i8.Future.value(), - ) as _i8.Future); - @override - _i8.Future transaction( - _i8.Future Function(_i5.Transaction)? action, { - bool? exclusive, - }) => - (super.noSuchMethod( - Invocation.method( - #transaction, - [action], - {#exclusive: exclusive}, - ), - returnValue: _i67.ifNotNull( - _i67.dummyValueOrNull( - this, - Invocation.method( - #transaction, - [action], - {#exclusive: exclusive}, - ), - ), - (T v) => _i8.Future.value(v), - ) ?? - _FakeFuture_6( - this, - Invocation.method( - #transaction, - [action], - {#exclusive: exclusive}, - ), - ), - returnValueForMissingStub: _i67.ifNotNull( - _i67.dummyValueOrNull( - this, - Invocation.method( - #transaction, - [action], - {#exclusive: exclusive}, - ), - ), - (T v) => _i8.Future.value(v), - ) ?? - _FakeFuture_6( - this, - Invocation.method( - #transaction, - [action], - {#exclusive: exclusive}, - ), - ), - ) as _i8.Future); - @override - _i8.Future devInvokeMethod( - String? method, [ - Object? arguments, - ]) => - (super.noSuchMethod( - Invocation.method( - #devInvokeMethod, - [ - method, - arguments, - ], - ), - returnValue: _i67.ifNotNull( - _i67.dummyValueOrNull( - this, - Invocation.method( - #devInvokeMethod, - [ - method, - arguments, - ], - ), - ), - (T v) => _i8.Future.value(v), - ) ?? - _FakeFuture_6( - this, - Invocation.method( - #devInvokeMethod, - [ - method, - arguments, - ], - ), - ), - returnValueForMissingStub: _i67.ifNotNull( - _i67.dummyValueOrNull( - this, - Invocation.method( - #devInvokeMethod, - [ - method, - arguments, - ], - ), - ), - (T v) => _i8.Future.value(v), - ) ?? - _FakeFuture_6( - this, - Invocation.method( - #devInvokeMethod, - [ - method, - arguments, - ], - ), - ), - ) as _i8.Future); - @override - _i8.Future devInvokeSqlMethod( - String? method, - String? sql, [ - List? arguments, - ]) => - (super.noSuchMethod( - Invocation.method( - #devInvokeSqlMethod, - [ - method, - sql, - arguments, - ], - ), - returnValue: _i67.ifNotNull( - _i67.dummyValueOrNull( - this, - Invocation.method( - #devInvokeSqlMethod, - [ - method, - sql, - arguments, - ], - ), - ), - (T v) => _i8.Future.value(v), - ) ?? - _FakeFuture_6( - this, - Invocation.method( - #devInvokeSqlMethod, - [ - method, - sql, - arguments, - ], - ), - ), - returnValueForMissingStub: _i67.ifNotNull( - _i67.dummyValueOrNull( - this, - Invocation.method( - #devInvokeSqlMethod, - [ - method, - sql, - arguments, - ], - ), - ), - (T v) => _i8.Future.value(v), - ) ?? - _FakeFuture_6( - this, - Invocation.method( - #devInvokeSqlMethod, - [ - method, - sql, - arguments, - ], - ), - ), - ) as _i8.Future); - @override - _i8.Future execute( - String? sql, [ - List? arguments, - ]) => - (super.noSuchMethod( - Invocation.method( - #execute, - [ - sql, - arguments, - ], - ), - returnValue: _i8.Future.value(), - returnValueForMissingStub: _i8.Future.value(), - ) as _i8.Future); - @override - _i8.Future rawInsert( - String? sql, [ - List? arguments, - ]) => - (super.noSuchMethod( - Invocation.method( - #rawInsert, - [ - sql, - arguments, - ], - ), - returnValue: _i8.Future.value(0), - returnValueForMissingStub: _i8.Future.value(0), - ) as _i8.Future); - @override - _i8.Future insert( - String? table, - Map? values, { - String? nullColumnHack, - _i5.ConflictAlgorithm? conflictAlgorithm, - }) => - (super.noSuchMethod( - Invocation.method( - #insert, - [ - table, - values, - ], - { - #nullColumnHack: nullColumnHack, - #conflictAlgorithm: conflictAlgorithm, - }, - ), - returnValue: _i8.Future.value(0), - returnValueForMissingStub: _i8.Future.value(0), - ) as _i8.Future); - @override - _i8.Future>> query( - String? table, { - bool? distinct, - List? columns, - String? where, - List? whereArgs, - String? groupBy, - String? having, - String? orderBy, - int? limit, - int? offset, - }) => - (super.noSuchMethod( - Invocation.method( - #query, - [table], - { - #distinct: distinct, - #columns: columns, - #where: where, - #whereArgs: whereArgs, - #groupBy: groupBy, - #having: having, - #orderBy: orderBy, - #limit: limit, - #offset: offset, - }, - ), - returnValue: _i8.Future>>.value( - >[]), - returnValueForMissingStub: _i8.Future>>.value( - >[]), - ) as _i8.Future>>); - @override - _i8.Future>> rawQuery( - String? sql, [ - List? arguments, - ]) => - (super.noSuchMethod( - Invocation.method( - #rawQuery, - [ - sql, - arguments, - ], - ), - returnValue: _i8.Future>>.value( - >[]), - returnValueForMissingStub: _i8.Future>>.value( - >[]), - ) as _i8.Future>>); - @override - _i8.Future<_i5.QueryCursor> rawQueryCursor( - String? sql, - List? arguments, { - int? bufferSize, - }) => - (super.noSuchMethod( - Invocation.method( - #rawQueryCursor, - [ - sql, - arguments, - ], - {#bufferSize: bufferSize}, - ), - returnValue: _i8.Future<_i5.QueryCursor>.value(_FakeQueryCursor_7( - this, - Invocation.method( - #rawQueryCursor, - [ - sql, - arguments, - ], - {#bufferSize: bufferSize}, - ), - )), - returnValueForMissingStub: - _i8.Future<_i5.QueryCursor>.value(_FakeQueryCursor_7( - this, - Invocation.method( - #rawQueryCursor, - [ - sql, - arguments, - ], - {#bufferSize: bufferSize}, - ), - )), - ) as _i8.Future<_i5.QueryCursor>); - @override - _i8.Future<_i5.QueryCursor> queryCursor( - String? table, { - bool? distinct, - List? columns, - String? where, - List? whereArgs, - String? groupBy, - String? having, - String? orderBy, - int? limit, - int? offset, - int? bufferSize, - }) => - (super.noSuchMethod( - Invocation.method( - #queryCursor, - [table], - { - #distinct: distinct, - #columns: columns, - #where: where, - #whereArgs: whereArgs, - #groupBy: groupBy, - #having: having, - #orderBy: orderBy, - #limit: limit, - #offset: offset, - #bufferSize: bufferSize, - }, - ), - returnValue: _i8.Future<_i5.QueryCursor>.value(_FakeQueryCursor_7( - this, - Invocation.method( - #queryCursor, - [table], - { - #distinct: distinct, - #columns: columns, - #where: where, - #whereArgs: whereArgs, - #groupBy: groupBy, - #having: having, - #orderBy: orderBy, - #limit: limit, - #offset: offset, - #bufferSize: bufferSize, - }, - ), - )), - returnValueForMissingStub: - _i8.Future<_i5.QueryCursor>.value(_FakeQueryCursor_7( - this, - Invocation.method( - #queryCursor, - [table], - { - #distinct: distinct, - #columns: columns, - #where: where, - #whereArgs: whereArgs, - #groupBy: groupBy, - #having: having, - #orderBy: orderBy, - #limit: limit, - #offset: offset, - #bufferSize: bufferSize, - }, - ), - )), - ) as _i8.Future<_i5.QueryCursor>); - @override - _i8.Future rawUpdate( - String? sql, [ - List? arguments, - ]) => - (super.noSuchMethod( - Invocation.method( - #rawUpdate, - [ - sql, - arguments, - ], - ), - returnValue: _i8.Future.value(0), - returnValueForMissingStub: _i8.Future.value(0), - ) as _i8.Future); - @override - _i8.Future update( - String? table, - Map? values, { - String? where, - List? whereArgs, - _i5.ConflictAlgorithm? conflictAlgorithm, - }) => - (super.noSuchMethod( - Invocation.method( - #update, - [ - table, - values, - ], - { - #where: where, - #whereArgs: whereArgs, - #conflictAlgorithm: conflictAlgorithm, - }, - ), - returnValue: _i8.Future.value(0), - returnValueForMissingStub: _i8.Future.value(0), - ) as _i8.Future); - @override - _i8.Future rawDelete( - String? sql, [ - List? arguments, - ]) => - (super.noSuchMethod( - Invocation.method( - #rawDelete, - [ - sql, - arguments, - ], - ), - returnValue: _i8.Future.value(0), - returnValueForMissingStub: _i8.Future.value(0), - ) as _i8.Future); - @override - _i8.Future delete( - String? table, { - String? where, - List? whereArgs, - }) => - (super.noSuchMethod( - Invocation.method( - #delete, - [table], - { - #where: where, - #whereArgs: whereArgs, - }, - ), - returnValue: _i8.Future.value(0), - returnValueForMissingStub: _i8.Future.value(0), - ) as _i8.Future); - @override - _i5.Batch batch() => (super.noSuchMethod( - Invocation.method( - #batch, - [], - ), - returnValue: _FakeBatch_8( - this, - Invocation.method( - #batch, - [], - ), - ), - returnValueForMissingStub: _FakeBatch_8( - this, - Invocation.method( - #batch, - [], - ), - ), - ) as _i5.Batch); -} - -/// A class which mocks [Dio]. -/// -/// See the documentation for Mockito's code generation for more information. -class MockDio extends _i1.Mock implements _i2.Dio { - @override - _i2.BaseOptions get options => (super.noSuchMethod( - Invocation.getter(#options), - returnValue: _FakeBaseOptions_9( - this, - Invocation.getter(#options), - ), - returnValueForMissingStub: _FakeBaseOptions_9( - this, - Invocation.getter(#options), - ), - ) as _i2.BaseOptions); - @override - set options(_i2.BaseOptions? _options) => super.noSuchMethod( - Invocation.setter( - #options, - _options, - ), - returnValueForMissingStub: null, - ); - @override - _i2.HttpClientAdapter get httpClientAdapter => (super.noSuchMethod( - Invocation.getter(#httpClientAdapter), - returnValue: _FakeHttpClientAdapter_10( - this, - Invocation.getter(#httpClientAdapter), - ), - returnValueForMissingStub: _FakeHttpClientAdapter_10( - this, - Invocation.getter(#httpClientAdapter), - ), - ) as _i2.HttpClientAdapter); - @override - set httpClientAdapter(_i2.HttpClientAdapter? _httpClientAdapter) => - super.noSuchMethod( - Invocation.setter( - #httpClientAdapter, - _httpClientAdapter, - ), - returnValueForMissingStub: null, - ); - @override - _i2.Transformer get transformer => (super.noSuchMethod( - Invocation.getter(#transformer), - returnValue: _FakeTransformer_11( - this, - Invocation.getter(#transformer), - ), - returnValueForMissingStub: _FakeTransformer_11( - this, - Invocation.getter(#transformer), - ), - ) as _i2.Transformer); - @override - set transformer(_i2.Transformer? _transformer) => super.noSuchMethod( - Invocation.setter( - #transformer, - _transformer, - ), - returnValueForMissingStub: null, - ); - @override - _i2.Interceptors get interceptors => (super.noSuchMethod( - Invocation.getter(#interceptors), - returnValue: _FakeInterceptors_12( - this, - Invocation.getter(#interceptors), - ), - returnValueForMissingStub: _FakeInterceptors_12( - this, - Invocation.getter(#interceptors), - ), - ) as _i2.Interceptors); - @override - void close({bool? force = false}) => super.noSuchMethod( - Invocation.method( - #close, - [], - {#force: force}, - ), - returnValueForMissingStub: null, - ); - @override - _i8.Future<_i2.Response> get( - String? path, { - Map? queryParameters, - _i2.Options? options, - _i2.CancelToken? cancelToken, - _i2.ProgressCallback? onReceiveProgress, - }) => - (super.noSuchMethod( - Invocation.method( - #get, - [path], - { - #queryParameters: queryParameters, - #options: options, - #cancelToken: cancelToken, - #onReceiveProgress: onReceiveProgress, - }, - ), - returnValue: _i8.Future<_i2.Response>.value(_FakeResponse_0( - this, - Invocation.method( - #get, - [path], - { - #queryParameters: queryParameters, - #options: options, - #cancelToken: cancelToken, - #onReceiveProgress: onReceiveProgress, - }, - ), - )), - returnValueForMissingStub: - _i8.Future<_i2.Response>.value(_FakeResponse_0( - this, - Invocation.method( - #get, - [path], - { - #queryParameters: queryParameters, - #options: options, - #cancelToken: cancelToken, - #onReceiveProgress: onReceiveProgress, - }, - ), - )), - ) as _i8.Future<_i2.Response>); - @override - _i8.Future<_i2.Response> getUri( - Uri? uri, { - _i2.Options? options, - _i2.CancelToken? cancelToken, - _i2.ProgressCallback? onReceiveProgress, - }) => - (super.noSuchMethod( - Invocation.method( - #getUri, - [uri], - { - #options: options, - #cancelToken: cancelToken, - #onReceiveProgress: onReceiveProgress, - }, - ), - returnValue: _i8.Future<_i2.Response>.value(_FakeResponse_0( - this, - Invocation.method( - #getUri, - [uri], - { - #options: options, - #cancelToken: cancelToken, - #onReceiveProgress: onReceiveProgress, - }, - ), - )), - returnValueForMissingStub: - _i8.Future<_i2.Response>.value(_FakeResponse_0( - this, - Invocation.method( - #getUri, - [uri], - { - #options: options, - #cancelToken: cancelToken, - #onReceiveProgress: onReceiveProgress, - }, - ), - )), - ) as _i8.Future<_i2.Response>); - @override - _i8.Future<_i2.Response> post( - String? path, { - dynamic data, - Map? queryParameters, - _i2.Options? options, - _i2.CancelToken? cancelToken, - _i2.ProgressCallback? onSendProgress, - _i2.ProgressCallback? onReceiveProgress, - }) => - (super.noSuchMethod( - Invocation.method( - #post, - [path], - { - #data: data, - #queryParameters: queryParameters, - #options: options, - #cancelToken: cancelToken, - #onSendProgress: onSendProgress, - #onReceiveProgress: onReceiveProgress, - }, - ), - returnValue: _i8.Future<_i2.Response>.value(_FakeResponse_0( - this, - Invocation.method( - #post, - [path], - { - #data: data, - #queryParameters: queryParameters, - #options: options, - #cancelToken: cancelToken, - #onSendProgress: onSendProgress, - #onReceiveProgress: onReceiveProgress, - }, - ), - )), - returnValueForMissingStub: - _i8.Future<_i2.Response>.value(_FakeResponse_0( - this, - Invocation.method( - #post, - [path], - { - #data: data, - #queryParameters: queryParameters, - #options: options, - #cancelToken: cancelToken, - #onSendProgress: onSendProgress, - #onReceiveProgress: onReceiveProgress, - }, - ), - )), - ) as _i8.Future<_i2.Response>); - @override - _i8.Future<_i2.Response> postUri( - Uri? uri, { - dynamic data, - _i2.Options? options, - _i2.CancelToken? cancelToken, - _i2.ProgressCallback? onSendProgress, - _i2.ProgressCallback? onReceiveProgress, - }) => - (super.noSuchMethod( - Invocation.method( - #postUri, - [uri], - { - #data: data, - #options: options, - #cancelToken: cancelToken, - #onSendProgress: onSendProgress, - #onReceiveProgress: onReceiveProgress, - }, - ), - returnValue: _i8.Future<_i2.Response>.value(_FakeResponse_0( - this, - Invocation.method( - #postUri, - [uri], - { - #data: data, - #options: options, - #cancelToken: cancelToken, - #onSendProgress: onSendProgress, - #onReceiveProgress: onReceiveProgress, - }, - ), - )), - returnValueForMissingStub: - _i8.Future<_i2.Response>.value(_FakeResponse_0( - this, - Invocation.method( - #postUri, - [uri], - { - #data: data, - #options: options, - #cancelToken: cancelToken, - #onSendProgress: onSendProgress, - #onReceiveProgress: onReceiveProgress, - }, - ), - )), - ) as _i8.Future<_i2.Response>); - @override - _i8.Future<_i2.Response> put( - String? path, { - dynamic data, - Map? queryParameters, - _i2.Options? options, - _i2.CancelToken? cancelToken, - _i2.ProgressCallback? onSendProgress, - _i2.ProgressCallback? onReceiveProgress, - }) => - (super.noSuchMethod( - Invocation.method( - #put, - [path], - { - #data: data, - #queryParameters: queryParameters, - #options: options, - #cancelToken: cancelToken, - #onSendProgress: onSendProgress, - #onReceiveProgress: onReceiveProgress, - }, - ), - returnValue: _i8.Future<_i2.Response>.value(_FakeResponse_0( - this, - Invocation.method( - #put, - [path], - { - #data: data, - #queryParameters: queryParameters, - #options: options, - #cancelToken: cancelToken, - #onSendProgress: onSendProgress, - #onReceiveProgress: onReceiveProgress, - }, - ), - )), - returnValueForMissingStub: - _i8.Future<_i2.Response>.value(_FakeResponse_0( - this, - Invocation.method( - #put, - [path], - { - #data: data, - #queryParameters: queryParameters, - #options: options, - #cancelToken: cancelToken, - #onSendProgress: onSendProgress, - #onReceiveProgress: onReceiveProgress, - }, - ), - )), - ) as _i8.Future<_i2.Response>); - @override - _i8.Future<_i2.Response> putUri( - Uri? uri, { - dynamic data, - _i2.Options? options, - _i2.CancelToken? cancelToken, - _i2.ProgressCallback? onSendProgress, - _i2.ProgressCallback? onReceiveProgress, - }) => - (super.noSuchMethod( - Invocation.method( - #putUri, - [uri], - { - #data: data, - #options: options, - #cancelToken: cancelToken, - #onSendProgress: onSendProgress, - #onReceiveProgress: onReceiveProgress, - }, - ), - returnValue: _i8.Future<_i2.Response>.value(_FakeResponse_0( - this, - Invocation.method( - #putUri, - [uri], - { - #data: data, - #options: options, - #cancelToken: cancelToken, - #onSendProgress: onSendProgress, - #onReceiveProgress: onReceiveProgress, - }, - ), - )), - returnValueForMissingStub: - _i8.Future<_i2.Response>.value(_FakeResponse_0( - this, - Invocation.method( - #putUri, - [uri], - { - #data: data, - #options: options, - #cancelToken: cancelToken, - #onSendProgress: onSendProgress, - #onReceiveProgress: onReceiveProgress, - }, - ), - )), - ) as _i8.Future<_i2.Response>); - @override - _i8.Future<_i2.Response> head( - String? path, { - dynamic data, - Map? queryParameters, - _i2.Options? options, - _i2.CancelToken? cancelToken, - }) => - (super.noSuchMethod( - Invocation.method( - #head, - [path], - { - #data: data, - #queryParameters: queryParameters, - #options: options, - #cancelToken: cancelToken, - }, - ), - returnValue: _i8.Future<_i2.Response>.value(_FakeResponse_0( - this, - Invocation.method( - #head, - [path], - { - #data: data, - #queryParameters: queryParameters, - #options: options, - #cancelToken: cancelToken, - }, - ), - )), - returnValueForMissingStub: - _i8.Future<_i2.Response>.value(_FakeResponse_0( - this, - Invocation.method( - #head, - [path], - { - #data: data, - #queryParameters: queryParameters, - #options: options, - #cancelToken: cancelToken, - }, - ), - )), - ) as _i8.Future<_i2.Response>); - @override - _i8.Future<_i2.Response> headUri( - Uri? uri, { - dynamic data, - _i2.Options? options, - _i2.CancelToken? cancelToken, - }) => - (super.noSuchMethod( - Invocation.method( - #headUri, - [uri], - { - #data: data, - #options: options, - #cancelToken: cancelToken, - }, - ), - returnValue: _i8.Future<_i2.Response>.value(_FakeResponse_0( - this, - Invocation.method( - #headUri, - [uri], - { - #data: data, - #options: options, - #cancelToken: cancelToken, - }, - ), - )), - returnValueForMissingStub: - _i8.Future<_i2.Response>.value(_FakeResponse_0( - this, - Invocation.method( - #headUri, - [uri], - { - #data: data, - #options: options, - #cancelToken: cancelToken, - }, - ), - )), - ) as _i8.Future<_i2.Response>); - @override - _i8.Future<_i2.Response> delete( - String? path, { - dynamic data, - Map? queryParameters, - _i2.Options? options, - _i2.CancelToken? cancelToken, - }) => - (super.noSuchMethod( - Invocation.method( - #delete, - [path], - { - #data: data, - #queryParameters: queryParameters, - #options: options, - #cancelToken: cancelToken, - }, - ), - returnValue: _i8.Future<_i2.Response>.value(_FakeResponse_0( - this, - Invocation.method( - #delete, - [path], - { - #data: data, - #queryParameters: queryParameters, - #options: options, - #cancelToken: cancelToken, - }, - ), - )), - returnValueForMissingStub: - _i8.Future<_i2.Response>.value(_FakeResponse_0( - this, - Invocation.method( - #delete, - [path], - { - #data: data, - #queryParameters: queryParameters, - #options: options, - #cancelToken: cancelToken, - }, - ), - )), - ) as _i8.Future<_i2.Response>); - @override - _i8.Future<_i2.Response> deleteUri( - Uri? uri, { - dynamic data, - _i2.Options? options, - _i2.CancelToken? cancelToken, - }) => - (super.noSuchMethod( - Invocation.method( - #deleteUri, - [uri], - { - #data: data, - #options: options, - #cancelToken: cancelToken, - }, - ), - returnValue: _i8.Future<_i2.Response>.value(_FakeResponse_0( - this, - Invocation.method( - #deleteUri, - [uri], - { - #data: data, - #options: options, - #cancelToken: cancelToken, - }, - ), - )), - returnValueForMissingStub: - _i8.Future<_i2.Response>.value(_FakeResponse_0( - this, - Invocation.method( - #deleteUri, - [uri], - { - #data: data, - #options: options, - #cancelToken: cancelToken, - }, - ), - )), - ) as _i8.Future<_i2.Response>); - @override - _i8.Future<_i2.Response> patch( - String? path, { - dynamic data, - Map? queryParameters, - _i2.Options? options, - _i2.CancelToken? cancelToken, - _i2.ProgressCallback? onSendProgress, - _i2.ProgressCallback? onReceiveProgress, - }) => - (super.noSuchMethod( - Invocation.method( - #patch, - [path], - { - #data: data, - #queryParameters: queryParameters, - #options: options, - #cancelToken: cancelToken, - #onSendProgress: onSendProgress, - #onReceiveProgress: onReceiveProgress, - }, - ), - returnValue: _i8.Future<_i2.Response>.value(_FakeResponse_0( - this, - Invocation.method( - #patch, - [path], - { - #data: data, - #queryParameters: queryParameters, - #options: options, - #cancelToken: cancelToken, - #onSendProgress: onSendProgress, - #onReceiveProgress: onReceiveProgress, - }, - ), - )), - returnValueForMissingStub: - _i8.Future<_i2.Response>.value(_FakeResponse_0( - this, - Invocation.method( - #patch, - [path], - { - #data: data, - #queryParameters: queryParameters, - #options: options, - #cancelToken: cancelToken, - #onSendProgress: onSendProgress, - #onReceiveProgress: onReceiveProgress, - }, - ), - )), - ) as _i8.Future<_i2.Response>); - @override - _i8.Future<_i2.Response> patchUri( - Uri? uri, { - dynamic data, - _i2.Options? options, - _i2.CancelToken? cancelToken, - _i2.ProgressCallback? onSendProgress, - _i2.ProgressCallback? onReceiveProgress, - }) => - (super.noSuchMethod( - Invocation.method( - #patchUri, - [uri], - { - #data: data, - #options: options, - #cancelToken: cancelToken, - #onSendProgress: onSendProgress, - #onReceiveProgress: onReceiveProgress, - }, - ), - returnValue: _i8.Future<_i2.Response>.value(_FakeResponse_0( - this, - Invocation.method( - #patchUri, - [uri], - { - #data: data, - #options: options, - #cancelToken: cancelToken, - #onSendProgress: onSendProgress, - #onReceiveProgress: onReceiveProgress, - }, - ), - )), - returnValueForMissingStub: - _i8.Future<_i2.Response>.value(_FakeResponse_0( - this, - Invocation.method( - #patchUri, - [uri], - { - #data: data, - #options: options, - #cancelToken: cancelToken, - #onSendProgress: onSendProgress, - #onReceiveProgress: onReceiveProgress, - }, - ), - )), - ) as _i8.Future<_i2.Response>); - @override - void lock() => super.noSuchMethod( - Invocation.method( - #lock, - [], - ), - returnValueForMissingStub: null, - ); - @override - void unlock() => super.noSuchMethod( - Invocation.method( - #unlock, - [], - ), - returnValueForMissingStub: null, - ); - @override - void clear() => super.noSuchMethod( - Invocation.method( - #clear, - [], - ), - returnValueForMissingStub: null, - ); - @override - _i8.Future<_i2.Response> download( - String? urlPath, - dynamic savePath, { - _i2.ProgressCallback? onReceiveProgress, - Map? queryParameters, - _i2.CancelToken? cancelToken, - bool? deleteOnError = true, - String? lengthHeader = r'content-length', - dynamic data, - _i2.Options? options, - }) => - (super.noSuchMethod( - Invocation.method( - #download, - [ - urlPath, - savePath, - ], - { - #onReceiveProgress: onReceiveProgress, - #queryParameters: queryParameters, - #cancelToken: cancelToken, - #deleteOnError: deleteOnError, - #lengthHeader: lengthHeader, - #data: data, - #options: options, - }, - ), - returnValue: - _i8.Future<_i2.Response>.value(_FakeResponse_0( - this, - Invocation.method( - #download, - [ - urlPath, - savePath, - ], - { - #onReceiveProgress: onReceiveProgress, - #queryParameters: queryParameters, - #cancelToken: cancelToken, - #deleteOnError: deleteOnError, - #lengthHeader: lengthHeader, - #data: data, - #options: options, - }, - ), - )), - returnValueForMissingStub: - _i8.Future<_i2.Response>.value(_FakeResponse_0( - this, - Invocation.method( - #download, - [ - urlPath, - savePath, - ], - { - #onReceiveProgress: onReceiveProgress, - #queryParameters: queryParameters, - #cancelToken: cancelToken, - #deleteOnError: deleteOnError, - #lengthHeader: lengthHeader, - #data: data, - #options: options, - }, - ), - )), - ) as _i8.Future<_i2.Response>); - @override - _i8.Future<_i2.Response> downloadUri( - Uri? uri, - dynamic savePath, { - _i2.ProgressCallback? onReceiveProgress, - _i2.CancelToken? cancelToken, - bool? deleteOnError = true, - String? lengthHeader = r'content-length', - dynamic data, - _i2.Options? options, - }) => - (super.noSuchMethod( - Invocation.method( - #downloadUri, - [ - uri, - savePath, - ], - { - #onReceiveProgress: onReceiveProgress, - #cancelToken: cancelToken, - #deleteOnError: deleteOnError, - #lengthHeader: lengthHeader, - #data: data, - #options: options, - }, - ), - returnValue: - _i8.Future<_i2.Response>.value(_FakeResponse_0( - this, - Invocation.method( - #downloadUri, - [ - uri, - savePath, - ], - { - #onReceiveProgress: onReceiveProgress, - #cancelToken: cancelToken, - #deleteOnError: deleteOnError, - #lengthHeader: lengthHeader, - #data: data, - #options: options, - }, - ), - )), - returnValueForMissingStub: - _i8.Future<_i2.Response>.value(_FakeResponse_0( - this, - Invocation.method( - #downloadUri, - [ - uri, - savePath, - ], - { - #onReceiveProgress: onReceiveProgress, - #cancelToken: cancelToken, - #deleteOnError: deleteOnError, - #lengthHeader: lengthHeader, - #data: data, - #options: options, - }, - ), - )), - ) as _i8.Future<_i2.Response>); - @override - _i8.Future<_i2.Response> request( - String? path, { - dynamic data, - Map? queryParameters, - _i2.CancelToken? cancelToken, - _i2.Options? options, - _i2.ProgressCallback? onSendProgress, - _i2.ProgressCallback? onReceiveProgress, - }) => - (super.noSuchMethod( - Invocation.method( - #request, - [path], - { - #data: data, - #queryParameters: queryParameters, - #cancelToken: cancelToken, - #options: options, - #onSendProgress: onSendProgress, - #onReceiveProgress: onReceiveProgress, - }, - ), - returnValue: _i8.Future<_i2.Response>.value(_FakeResponse_0( - this, - Invocation.method( - #request, - [path], - { - #data: data, - #queryParameters: queryParameters, - #cancelToken: cancelToken, - #options: options, - #onSendProgress: onSendProgress, - #onReceiveProgress: onReceiveProgress, - }, - ), - )), - returnValueForMissingStub: - _i8.Future<_i2.Response>.value(_FakeResponse_0( - this, - Invocation.method( - #request, - [path], - { - #data: data, - #queryParameters: queryParameters, - #cancelToken: cancelToken, - #options: options, - #onSendProgress: onSendProgress, - #onReceiveProgress: onReceiveProgress, - }, - ), - )), - ) as _i8.Future<_i2.Response>); - @override - _i8.Future<_i2.Response> requestUri( - Uri? uri, { - dynamic data, - _i2.CancelToken? cancelToken, - _i2.Options? options, - _i2.ProgressCallback? onSendProgress, - _i2.ProgressCallback? onReceiveProgress, - }) => - (super.noSuchMethod( - Invocation.method( - #requestUri, - [uri], - { - #data: data, - #cancelToken: cancelToken, - #options: options, - #onSendProgress: onSendProgress, - #onReceiveProgress: onReceiveProgress, - }, - ), - returnValue: _i8.Future<_i2.Response>.value(_FakeResponse_0( - this, - Invocation.method( - #requestUri, - [uri], - { - #data: data, - #cancelToken: cancelToken, - #options: options, - #onSendProgress: onSendProgress, - #onReceiveProgress: onReceiveProgress, - }, - ), - )), - returnValueForMissingStub: - _i8.Future<_i2.Response>.value(_FakeResponse_0( - this, - Invocation.method( - #requestUri, - [uri], - { - #data: data, - #cancelToken: cancelToken, - #options: options, - #onSendProgress: onSendProgress, - #onReceiveProgress: onReceiveProgress, - }, - ), - )), - ) as _i8.Future<_i2.Response>); - @override - _i8.Future<_i2.Response> fetch(_i2.RequestOptions? requestOptions) => - (super.noSuchMethod( - Invocation.method( - #fetch, - [requestOptions], - ), - returnValue: _i8.Future<_i2.Response>.value(_FakeResponse_0( - this, - Invocation.method( - #fetch, - [requestOptions], - ), - )), - returnValueForMissingStub: - _i8.Future<_i2.Response>.value(_FakeResponse_0( - this, - Invocation.method( - #fetch, - [requestOptions], - ), - )), - ) as _i8.Future<_i2.Response>); -} - -/// A class which mocks [EnrollmentsApi]. -/// -/// See the documentation for Mockito's code generation for more information. -class MockEnrollmentsApi extends _i1.Mock implements _i68.EnrollmentsApi { - @override - _i8.Future?> getObserveeEnrollments( - {bool? forceRefresh = false}) => - (super.noSuchMethod( - Invocation.method( - #getObserveeEnrollments, - [], - {#forceRefresh: forceRefresh}, - ), - returnValue: _i8.Future?>.value(), - returnValueForMissingStub: _i8.Future?>.value(), - ) as _i8.Future?>); - @override - _i8.Future?> getSelfEnrollments( - {bool? forceRefresh = false}) => - (super.noSuchMethod( - Invocation.method( - #getSelfEnrollments, - [], - {#forceRefresh: forceRefresh}, - ), - returnValue: _i8.Future?>.value(), - returnValueForMissingStub: _i8.Future?>.value(), - ) as _i8.Future?>); - @override - _i8.Future?> getEnrollmentsByGradingPeriod( - String? courseId, - String? studentId, - String? gradingPeriodId, { - bool? forceRefresh = false, - }) => - (super.noSuchMethod( - Invocation.method( - #getEnrollmentsByGradingPeriod, - [ - courseId, - studentId, - gradingPeriodId, - ], - {#forceRefresh: forceRefresh}, - ), - returnValue: _i8.Future?>.value(), - returnValueForMissingStub: _i8.Future?>.value(), - ) as _i8.Future?>); - @override - _i8.Future pairWithStudent(String? pairingCode) => (super.noSuchMethod( - Invocation.method( - #pairWithStudent, - [pairingCode], - ), - returnValue: _i8.Future.value(), - returnValueForMissingStub: _i8.Future.value(), - ) as _i8.Future); - @override - _i8.Future unpairStudent(String? studentId) => (super.noSuchMethod( - Invocation.method( - #unpairStudent, - [studentId], - ), - returnValue: _i8.Future.value(false), - returnValueForMissingStub: _i8.Future.value(false), - ) as _i8.Future); - @override - _i8.Future canUnpairStudent(String? studentId) => (super.noSuchMethod( - Invocation.method( - #canUnpairStudent, - [studentId], - ), - returnValue: _i8.Future.value(false), - returnValueForMissingStub: _i8.Future.value(false), - ) as _i8.Future); -} - -/// A class which mocks [ErrorReportApi]. -/// -/// See the documentation for Mockito's code generation for more information. -class MockErrorReportApi extends _i1.Mock implements _i69.ErrorReportApi { - @override - _i8.Future submitErrorReport({ - String? subject, - String? description, - String? email, - String? severity, - String? stacktrace, - String? domain, - String? name, - String? becomeUser, - String? userRoles, - }) => - (super.noSuchMethod( - Invocation.method( - #submitErrorReport, - [], - { - #subject: subject, - #description: description, - #email: email, - #severity: severity, - #stacktrace: stacktrace, - #domain: domain, - #name: name, - #becomeUser: becomeUser, - #userRoles: userRoles, - }, - ), - returnValue: _i8.Future.value(), - returnValueForMissingStub: _i8.Future.value(), - ) as _i8.Future); -} - -/// A class which mocks [ErrorReportInteractor]. -/// -/// See the documentation for Mockito's code generation for more information. -class MockErrorReportInteractor extends _i1.Mock - implements _i70.ErrorReportInteractor { - @override - _i8.Future submitErrorReport( - String? subject, - String? description, - String? email, - _i70.ErrorReportSeverity? severity, - String? stacktrace, - ) => - (super.noSuchMethod( - Invocation.method( - #submitErrorReport, - [ - subject, - description, - email, - severity, - stacktrace, - ], - ), - returnValue: _i8.Future.value(), - returnValueForMissingStub: _i8.Future.value(), - ) as _i8.Future); -} - -/// A class which mocks [EventDetailsInteractor]. -/// -/// See the documentation for Mockito's code generation for more information. -class MockEventDetailsInteractor extends _i1.Mock - implements _i71.EventDetailsInteractor { - @override - _i8.Future<_i47.ScheduleItem?> loadEvent( - String? eventId, - bool? forceRefresh, - ) => - (super.noSuchMethod( - Invocation.method( - #loadEvent, - [ - eventId, - forceRefresh, - ], - ), - returnValue: _i8.Future<_i47.ScheduleItem?>.value(), - returnValueForMissingStub: _i8.Future<_i47.ScheduleItem?>.value(), - ) as _i8.Future<_i47.ScheduleItem?>); - @override - _i8.Future<_i40.Reminder?> loadReminder(String? eventId) => - (super.noSuchMethod( - Invocation.method( - #loadReminder, - [eventId], - ), - returnValue: _i8.Future<_i40.Reminder?>.value(), - returnValueForMissingStub: _i8.Future<_i40.Reminder?>.value(), - ) as _i8.Future<_i40.Reminder?>); - @override - _i8.Future createReminder( - _i41.AppLocalizations? l10n, - DateTime? date, - String? eventId, - String? courseId, - String? title, - String? body, - ) => - (super.noSuchMethod( - Invocation.method( - #createReminder, - [ - l10n, - date, - eventId, - courseId, - title, - body, - ], - ), - returnValue: _i8.Future.value(), - returnValueForMissingStub: _i8.Future.value(), - ) as _i8.Future); - @override - _i8.Future deleteReminder(_i40.Reminder? reminder) => - (super.noSuchMethod( - Invocation.method( - #deleteReminder, - [reminder], - ), - returnValue: _i8.Future.value(), - returnValueForMissingStub: _i8.Future.value(), - ) as _i8.Future); -} - -/// A class which mocks [FirebaseCrashlytics]. -/// -/// See the documentation for Mockito's code generation for more information. -class MockFirebaseCrashlytics extends _i1.Mock - implements _i72.FirebaseCrashlytics { - @override - _i9.FirebaseApp get app => (super.noSuchMethod( - Invocation.getter(#app), - returnValue: _FakeFirebaseApp_13( - this, - Invocation.getter(#app), - ), - returnValueForMissingStub: _FakeFirebaseApp_13( - this, - Invocation.getter(#app), - ), - ) as _i9.FirebaseApp); - @override - set app(_i9.FirebaseApp? _app) => super.noSuchMethod( - Invocation.setter( - #app, - _app, - ), - returnValueForMissingStub: null, - ); - @override - bool get isCrashlyticsCollectionEnabled => (super.noSuchMethod( - Invocation.getter(#isCrashlyticsCollectionEnabled), - returnValue: false, - returnValueForMissingStub: false, - ) as bool); - @override - Map get pluginConstants => (super.noSuchMethod( - Invocation.getter(#pluginConstants), - returnValue: {}, - returnValueForMissingStub: {}, - ) as Map); - @override - _i8.Future checkForUnsentReports() => (super.noSuchMethod( - Invocation.method( - #checkForUnsentReports, - [], - ), - returnValue: _i8.Future.value(false), - returnValueForMissingStub: _i8.Future.value(false), - ) as _i8.Future); - @override - void crash() => super.noSuchMethod( - Invocation.method( - #crash, - [], - ), - returnValueForMissingStub: null, - ); - @override - _i8.Future deleteUnsentReports() => (super.noSuchMethod( - Invocation.method( - #deleteUnsentReports, - [], - ), - returnValue: _i8.Future.value(), - returnValueForMissingStub: _i8.Future.value(), - ) as _i8.Future); - @override - _i8.Future didCrashOnPreviousExecution() => (super.noSuchMethod( - Invocation.method( - #didCrashOnPreviousExecution, - [], - ), - returnValue: _i8.Future.value(false), - returnValueForMissingStub: _i8.Future.value(false), - ) as _i8.Future); - @override - _i8.Future recordError( - dynamic exception, - StackTrace? stack, { - dynamic reason, - Iterable? information = const [], - bool? printDetails, - bool? fatal = false, - }) => - (super.noSuchMethod( - Invocation.method( - #recordError, - [ - exception, - stack, - ], - { - #reason: reason, - #information: information, - #printDetails: printDetails, - #fatal: fatal, - }, - ), - returnValue: _i8.Future.value(), - returnValueForMissingStub: _i8.Future.value(), - ) as _i8.Future); - @override - _i8.Future recordFlutterError( - _i11.FlutterErrorDetails? flutterErrorDetails, { - bool? fatal = false, - }) => - (super.noSuchMethod( - Invocation.method( - #recordFlutterError, - [flutterErrorDetails], - {#fatal: fatal}, - ), - returnValue: _i8.Future.value(), - returnValueForMissingStub: _i8.Future.value(), - ) as _i8.Future); - @override - _i8.Future recordFlutterFatalError( - _i11.FlutterErrorDetails? flutterErrorDetails) => - (super.noSuchMethod( - Invocation.method( - #recordFlutterFatalError, - [flutterErrorDetails], - ), - returnValue: _i8.Future.value(), - returnValueForMissingStub: _i8.Future.value(), - ) as _i8.Future); - @override - _i8.Future log(String? message) => (super.noSuchMethod( - Invocation.method( - #log, - [message], - ), - returnValue: _i8.Future.value(), - returnValueForMissingStub: _i8.Future.value(), - ) as _i8.Future); - @override - _i8.Future sendUnsentReports() => (super.noSuchMethod( - Invocation.method( - #sendUnsentReports, - [], - ), - returnValue: _i8.Future.value(), - returnValueForMissingStub: _i8.Future.value(), - ) as _i8.Future); - @override - _i8.Future setCrashlyticsCollectionEnabled(bool? enabled) => - (super.noSuchMethod( - Invocation.method( - #setCrashlyticsCollectionEnabled, - [enabled], - ), - returnValue: _i8.Future.value(), - returnValueForMissingStub: _i8.Future.value(), - ) as _i8.Future); - @override - _i8.Future setUserIdentifier(String? identifier) => (super.noSuchMethod( - Invocation.method( - #setUserIdentifier, - [identifier], - ), - returnValue: _i8.Future.value(), - returnValueForMissingStub: _i8.Future.value(), - ) as _i8.Future); - @override - _i8.Future setCustomKey( - String? key, - Object? value, - ) => - (super.noSuchMethod( - Invocation.method( - #setCustomKey, - [ - key, - value, - ], - ), - returnValue: _i8.Future.value(), - returnValueForMissingStub: _i8.Future.value(), - ) as _i8.Future); -} - -/// A class which mocks [HttpClient]. -/// -/// See the documentation for Mockito's code generation for more information. -class MockHttpClient extends _i1.Mock implements _i10.HttpClient { - @override - Duration get idleTimeout => (super.noSuchMethod( - Invocation.getter(#idleTimeout), - returnValue: _FakeDuration_14( - this, - Invocation.getter(#idleTimeout), - ), - returnValueForMissingStub: _FakeDuration_14( - this, - Invocation.getter(#idleTimeout), - ), - ) as Duration); - @override - set idleTimeout(Duration? _idleTimeout) => super.noSuchMethod( - Invocation.setter( - #idleTimeout, - _idleTimeout, - ), - returnValueForMissingStub: null, - ); - @override - set connectionTimeout(Duration? _connectionTimeout) => super.noSuchMethod( - Invocation.setter( - #connectionTimeout, - _connectionTimeout, - ), - returnValueForMissingStub: null, - ); - @override - set maxConnectionsPerHost(int? _maxConnectionsPerHost) => super.noSuchMethod( - Invocation.setter( - #maxConnectionsPerHost, - _maxConnectionsPerHost, - ), - returnValueForMissingStub: null, - ); - @override - bool get autoUncompress => (super.noSuchMethod( - Invocation.getter(#autoUncompress), - returnValue: false, - returnValueForMissingStub: false, - ) as bool); - @override - set autoUncompress(bool? _autoUncompress) => super.noSuchMethod( - Invocation.setter( - #autoUncompress, - _autoUncompress, - ), - returnValueForMissingStub: null, - ); - @override - set userAgent(String? _userAgent) => super.noSuchMethod( - Invocation.setter( - #userAgent, - _userAgent, - ), - returnValueForMissingStub: null, - ); - @override - set authenticate( - _i8.Future Function( - Uri, - String, - String?, - )? f) => - super.noSuchMethod( - Invocation.setter( - #authenticate, - f, - ), - returnValueForMissingStub: null, - ); - @override - set connectionFactory( - _i8.Future<_i10.ConnectionTask<_i10.Socket>> Function( - Uri, - String?, - int?, - )? f) => - super.noSuchMethod( - Invocation.setter( - #connectionFactory, - f, - ), - returnValueForMissingStub: null, - ); - @override - set findProxy(String Function(Uri)? f) => super.noSuchMethod( - Invocation.setter( - #findProxy, - f, - ), - returnValueForMissingStub: null, - ); - @override - set authenticateProxy( - _i8.Future Function( - String, - int, - String, - String?, - )? f) => - super.noSuchMethod( - Invocation.setter( - #authenticateProxy, - f, - ), - returnValueForMissingStub: null, - ); - @override - set badCertificateCallback( - bool Function( - _i10.X509Certificate, - String, - int, - )? callback) => - super.noSuchMethod( - Invocation.setter( - #badCertificateCallback, - callback, - ), - returnValueForMissingStub: null, - ); - @override - set keyLog(dynamic Function(String)? callback) => super.noSuchMethod( - Invocation.setter( - #keyLog, - callback, - ), - returnValueForMissingStub: null, - ); - @override - _i8.Future<_i10.HttpClientRequest> open( - String? method, - String? host, - int? port, - String? path, - ) => - (super.noSuchMethod( - Invocation.method( - #open, - [ - method, - host, - port, - path, - ], - ), - returnValue: - _i8.Future<_i10.HttpClientRequest>.value(_FakeHttpClientRequest_15( - this, - Invocation.method( - #open, - [ - method, - host, - port, - path, - ], - ), - )), - returnValueForMissingStub: - _i8.Future<_i10.HttpClientRequest>.value(_FakeHttpClientRequest_15( - this, - Invocation.method( - #open, - [ - method, - host, - port, - path, - ], - ), - )), - ) as _i8.Future<_i10.HttpClientRequest>); - @override - _i8.Future<_i10.HttpClientRequest> openUrl( - String? method, - Uri? url, - ) => - (super.noSuchMethod( - Invocation.method( - #openUrl, - [ - method, - url, - ], - ), - returnValue: - _i8.Future<_i10.HttpClientRequest>.value(_FakeHttpClientRequest_15( - this, - Invocation.method( - #openUrl, - [ - method, - url, - ], - ), - )), - returnValueForMissingStub: - _i8.Future<_i10.HttpClientRequest>.value(_FakeHttpClientRequest_15( - this, - Invocation.method( - #openUrl, - [ - method, - url, - ], - ), - )), - ) as _i8.Future<_i10.HttpClientRequest>); - @override - _i8.Future<_i10.HttpClientRequest> get( - String? host, - int? port, - String? path, - ) => - (super.noSuchMethod( - Invocation.method( - #get, - [ - host, - port, - path, - ], - ), - returnValue: - _i8.Future<_i10.HttpClientRequest>.value(_FakeHttpClientRequest_15( - this, - Invocation.method( - #get, - [ - host, - port, - path, - ], - ), - )), - returnValueForMissingStub: - _i8.Future<_i10.HttpClientRequest>.value(_FakeHttpClientRequest_15( - this, - Invocation.method( - #get, - [ - host, - port, - path, - ], - ), - )), - ) as _i8.Future<_i10.HttpClientRequest>); - @override - _i8.Future<_i10.HttpClientRequest> getUrl(Uri? url) => (super.noSuchMethod( - Invocation.method( - #getUrl, - [url], - ), - returnValue: - _i8.Future<_i10.HttpClientRequest>.value(_FakeHttpClientRequest_15( - this, - Invocation.method( - #getUrl, - [url], - ), - )), - returnValueForMissingStub: - _i8.Future<_i10.HttpClientRequest>.value(_FakeHttpClientRequest_15( - this, - Invocation.method( - #getUrl, - [url], - ), - )), - ) as _i8.Future<_i10.HttpClientRequest>); - @override - _i8.Future<_i10.HttpClientRequest> post( - String? host, - int? port, - String? path, - ) => - (super.noSuchMethod( - Invocation.method( - #post, - [ - host, - port, - path, - ], - ), - returnValue: - _i8.Future<_i10.HttpClientRequest>.value(_FakeHttpClientRequest_15( - this, - Invocation.method( - #post, - [ - host, - port, - path, - ], - ), - )), - returnValueForMissingStub: - _i8.Future<_i10.HttpClientRequest>.value(_FakeHttpClientRequest_15( - this, - Invocation.method( - #post, - [ - host, - port, - path, - ], - ), - )), - ) as _i8.Future<_i10.HttpClientRequest>); - @override - _i8.Future<_i10.HttpClientRequest> postUrl(Uri? url) => (super.noSuchMethod( - Invocation.method( - #postUrl, - [url], - ), - returnValue: - _i8.Future<_i10.HttpClientRequest>.value(_FakeHttpClientRequest_15( - this, - Invocation.method( - #postUrl, - [url], - ), - )), - returnValueForMissingStub: - _i8.Future<_i10.HttpClientRequest>.value(_FakeHttpClientRequest_15( - this, - Invocation.method( - #postUrl, - [url], - ), - )), - ) as _i8.Future<_i10.HttpClientRequest>); - @override - _i8.Future<_i10.HttpClientRequest> put( - String? host, - int? port, - String? path, - ) => - (super.noSuchMethod( - Invocation.method( - #put, - [ - host, - port, - path, - ], - ), - returnValue: - _i8.Future<_i10.HttpClientRequest>.value(_FakeHttpClientRequest_15( - this, - Invocation.method( - #put, - [ - host, - port, - path, - ], - ), - )), - returnValueForMissingStub: - _i8.Future<_i10.HttpClientRequest>.value(_FakeHttpClientRequest_15( - this, - Invocation.method( - #put, - [ - host, - port, - path, - ], - ), - )), - ) as _i8.Future<_i10.HttpClientRequest>); - @override - _i8.Future<_i10.HttpClientRequest> putUrl(Uri? url) => (super.noSuchMethod( - Invocation.method( - #putUrl, - [url], - ), - returnValue: - _i8.Future<_i10.HttpClientRequest>.value(_FakeHttpClientRequest_15( - this, - Invocation.method( - #putUrl, - [url], - ), - )), - returnValueForMissingStub: - _i8.Future<_i10.HttpClientRequest>.value(_FakeHttpClientRequest_15( - this, - Invocation.method( - #putUrl, - [url], - ), - )), - ) as _i8.Future<_i10.HttpClientRequest>); - @override - _i8.Future<_i10.HttpClientRequest> delete( - String? host, - int? port, - String? path, - ) => - (super.noSuchMethod( - Invocation.method( - #delete, - [ - host, - port, - path, - ], - ), - returnValue: - _i8.Future<_i10.HttpClientRequest>.value(_FakeHttpClientRequest_15( - this, - Invocation.method( - #delete, - [ - host, - port, - path, - ], - ), - )), - returnValueForMissingStub: - _i8.Future<_i10.HttpClientRequest>.value(_FakeHttpClientRequest_15( - this, - Invocation.method( - #delete, - [ - host, - port, - path, - ], - ), - )), - ) as _i8.Future<_i10.HttpClientRequest>); - @override - _i8.Future<_i10.HttpClientRequest> deleteUrl(Uri? url) => (super.noSuchMethod( - Invocation.method( - #deleteUrl, - [url], - ), - returnValue: - _i8.Future<_i10.HttpClientRequest>.value(_FakeHttpClientRequest_15( - this, - Invocation.method( - #deleteUrl, - [url], - ), - )), - returnValueForMissingStub: - _i8.Future<_i10.HttpClientRequest>.value(_FakeHttpClientRequest_15( - this, - Invocation.method( - #deleteUrl, - [url], - ), - )), - ) as _i8.Future<_i10.HttpClientRequest>); - @override - _i8.Future<_i10.HttpClientRequest> patch( - String? host, - int? port, - String? path, - ) => - (super.noSuchMethod( - Invocation.method( - #patch, - [ - host, - port, - path, - ], - ), - returnValue: - _i8.Future<_i10.HttpClientRequest>.value(_FakeHttpClientRequest_15( - this, - Invocation.method( - #patch, - [ - host, - port, - path, - ], - ), - )), - returnValueForMissingStub: - _i8.Future<_i10.HttpClientRequest>.value(_FakeHttpClientRequest_15( - this, - Invocation.method( - #patch, - [ - host, - port, - path, - ], - ), - )), - ) as _i8.Future<_i10.HttpClientRequest>); - @override - _i8.Future<_i10.HttpClientRequest> patchUrl(Uri? url) => (super.noSuchMethod( - Invocation.method( - #patchUrl, - [url], - ), - returnValue: - _i8.Future<_i10.HttpClientRequest>.value(_FakeHttpClientRequest_15( - this, - Invocation.method( - #patchUrl, - [url], - ), - )), - returnValueForMissingStub: - _i8.Future<_i10.HttpClientRequest>.value(_FakeHttpClientRequest_15( - this, - Invocation.method( - #patchUrl, - [url], - ), - )), - ) as _i8.Future<_i10.HttpClientRequest>); - @override - _i8.Future<_i10.HttpClientRequest> head( - String? host, - int? port, - String? path, - ) => - (super.noSuchMethod( - Invocation.method( - #head, - [ - host, - port, - path, - ], - ), - returnValue: - _i8.Future<_i10.HttpClientRequest>.value(_FakeHttpClientRequest_15( - this, - Invocation.method( - #head, - [ - host, - port, - path, - ], - ), - )), - returnValueForMissingStub: - _i8.Future<_i10.HttpClientRequest>.value(_FakeHttpClientRequest_15( - this, - Invocation.method( - #head, - [ - host, - port, - path, - ], - ), - )), - ) as _i8.Future<_i10.HttpClientRequest>); - @override - _i8.Future<_i10.HttpClientRequest> headUrl(Uri? url) => (super.noSuchMethod( - Invocation.method( - #headUrl, - [url], - ), - returnValue: - _i8.Future<_i10.HttpClientRequest>.value(_FakeHttpClientRequest_15( - this, - Invocation.method( - #headUrl, - [url], - ), - )), - returnValueForMissingStub: - _i8.Future<_i10.HttpClientRequest>.value(_FakeHttpClientRequest_15( - this, - Invocation.method( - #headUrl, - [url], - ), - )), - ) as _i8.Future<_i10.HttpClientRequest>); - @override - void addCredentials( - Uri? url, - String? realm, - _i10.HttpClientCredentials? credentials, - ) => - super.noSuchMethod( - Invocation.method( - #addCredentials, - [ - url, - realm, - credentials, - ], - ), - returnValueForMissingStub: null, - ); - @override - void addProxyCredentials( - String? host, - int? port, - String? realm, - _i10.HttpClientCredentials? credentials, - ) => - super.noSuchMethod( - Invocation.method( - #addProxyCredentials, - [ - host, - port, - realm, - credentials, - ], - ), - returnValueForMissingStub: null, - ); - @override - void close({bool? force = false}) => super.noSuchMethod( - Invocation.method( - #close, - [], - {#force: force}, - ), - returnValueForMissingStub: null, - ); -} - -/// A class which mocks [HttpClientRequest]. -/// -/// See the documentation for Mockito's code generation for more information. -class MockHttpClientRequest extends _i1.Mock implements _i10.HttpClientRequest { - @override - bool get persistentConnection => (super.noSuchMethod( - Invocation.getter(#persistentConnection), - returnValue: false, - returnValueForMissingStub: false, - ) as bool); - @override - set persistentConnection(bool? _persistentConnection) => super.noSuchMethod( - Invocation.setter( - #persistentConnection, - _persistentConnection, - ), - returnValueForMissingStub: null, - ); - @override - bool get followRedirects => (super.noSuchMethod( - Invocation.getter(#followRedirects), - returnValue: false, - returnValueForMissingStub: false, - ) as bool); - @override - set followRedirects(bool? _followRedirects) => super.noSuchMethod( - Invocation.setter( - #followRedirects, - _followRedirects, - ), - returnValueForMissingStub: null, - ); - @override - int get maxRedirects => (super.noSuchMethod( - Invocation.getter(#maxRedirects), - returnValue: 0, - returnValueForMissingStub: 0, - ) as int); - @override - set maxRedirects(int? _maxRedirects) => super.noSuchMethod( - Invocation.setter( - #maxRedirects, - _maxRedirects, - ), - returnValueForMissingStub: null, - ); - @override - int get contentLength => (super.noSuchMethod( - Invocation.getter(#contentLength), - returnValue: 0, - returnValueForMissingStub: 0, - ) as int); - @override - set contentLength(int? _contentLength) => super.noSuchMethod( - Invocation.setter( - #contentLength, - _contentLength, - ), - returnValueForMissingStub: null, - ); - @override - bool get bufferOutput => (super.noSuchMethod( - Invocation.getter(#bufferOutput), - returnValue: false, - returnValueForMissingStub: false, - ) as bool); - @override - set bufferOutput(bool? _bufferOutput) => super.noSuchMethod( - Invocation.setter( - #bufferOutput, - _bufferOutput, - ), - returnValueForMissingStub: null, - ); - @override - String get method => (super.noSuchMethod( - Invocation.getter(#method), - returnValue: '', - returnValueForMissingStub: '', - ) as String); - @override - Uri get uri => (super.noSuchMethod( - Invocation.getter(#uri), - returnValue: _FakeUri_16( - this, - Invocation.getter(#uri), - ), - returnValueForMissingStub: _FakeUri_16( - this, - Invocation.getter(#uri), - ), - ) as Uri); - @override - _i10.HttpHeaders get headers => (super.noSuchMethod( - Invocation.getter(#headers), - returnValue: _FakeHttpHeaders_17( - this, - Invocation.getter(#headers), - ), - returnValueForMissingStub: _FakeHttpHeaders_17( - this, - Invocation.getter(#headers), - ), - ) as _i10.HttpHeaders); - @override - List<_i10.Cookie> get cookies => (super.noSuchMethod( - Invocation.getter(#cookies), - returnValue: <_i10.Cookie>[], - returnValueForMissingStub: <_i10.Cookie>[], - ) as List<_i10.Cookie>); - @override - _i8.Future<_i11.HttpClientResponse> get done => (super.noSuchMethod( - Invocation.getter(#done), - returnValue: _i8.Future<_i11.HttpClientResponse>.value( - _FakeHttpClientResponse_18( - this, - Invocation.getter(#done), - )), - returnValueForMissingStub: _i8.Future<_i11.HttpClientResponse>.value( - _FakeHttpClientResponse_18( - this, - Invocation.getter(#done), - )), - ) as _i8.Future<_i11.HttpClientResponse>); - @override - _i12.Encoding get encoding => (super.noSuchMethod( - Invocation.getter(#encoding), - returnValue: _FakeEncoding_19( - this, - Invocation.getter(#encoding), - ), - returnValueForMissingStub: _FakeEncoding_19( - this, - Invocation.getter(#encoding), - ), - ) as _i12.Encoding); - @override - set encoding(_i12.Encoding? _encoding) => super.noSuchMethod( - Invocation.setter( - #encoding, - _encoding, - ), - returnValueForMissingStub: null, - ); - @override - _i8.Future<_i11.HttpClientResponse> close() => (super.noSuchMethod( - Invocation.method( - #close, - [], - ), - returnValue: _i8.Future<_i11.HttpClientResponse>.value( - _FakeHttpClientResponse_18( - this, - Invocation.method( - #close, - [], - ), - )), - returnValueForMissingStub: _i8.Future<_i11.HttpClientResponse>.value( - _FakeHttpClientResponse_18( - this, - Invocation.method( - #close, - [], - ), - )), - ) as _i8.Future<_i11.HttpClientResponse>); - @override - void abort([ - Object? exception, - StackTrace? stackTrace, - ]) => - super.noSuchMethod( - Invocation.method( - #abort, - [ - exception, - stackTrace, - ], - ), - returnValueForMissingStub: null, - ); - @override - void add(List? data) => super.noSuchMethod( - Invocation.method( - #add, - [data], - ), - returnValueForMissingStub: null, - ); - @override - void write(Object? object) => super.noSuchMethod( - Invocation.method( - #write, - [object], - ), - returnValueForMissingStub: null, - ); - @override - void writeAll( - Iterable? objects, [ - String? separator = r'', - ]) => - super.noSuchMethod( - Invocation.method( - #writeAll, - [ - objects, - separator, - ], - ), - returnValueForMissingStub: null, - ); - @override - void writeln([Object? object = r'']) => super.noSuchMethod( - Invocation.method( - #writeln, - [object], - ), - returnValueForMissingStub: null, - ); - @override - void writeCharCode(int? charCode) => super.noSuchMethod( - Invocation.method( - #writeCharCode, - [charCode], - ), - returnValueForMissingStub: null, - ); - @override - void addError( - Object? error, [ - StackTrace? stackTrace, - ]) => - super.noSuchMethod( - Invocation.method( - #addError, - [ - error, - stackTrace, - ], - ), - returnValueForMissingStub: null, - ); - @override - _i8.Future addStream(_i8.Stream>? stream) => - (super.noSuchMethod( - Invocation.method( - #addStream, - [stream], - ), - returnValue: _i8.Future.value(), - returnValueForMissingStub: _i8.Future.value(), - ) as _i8.Future); - @override - _i8.Future flush() => (super.noSuchMethod( - Invocation.method( - #flush, - [], - ), - returnValue: _i8.Future.value(), - returnValueForMissingStub: _i8.Future.value(), - ) as _i8.Future); -} - -/// A class which mocks [HttpClientResponse]. -/// -/// See the documentation for Mockito's code generation for more information. -class MockHttpClientResponse extends _i1.Mock - implements _i11.HttpClientResponse { - @override - int get statusCode => (super.noSuchMethod( - Invocation.getter(#statusCode), - returnValue: 0, - returnValueForMissingStub: 0, - ) as int); - @override - String get reasonPhrase => (super.noSuchMethod( - Invocation.getter(#reasonPhrase), - returnValue: '', - returnValueForMissingStub: '', - ) as String); - @override - int get contentLength => (super.noSuchMethod( - Invocation.getter(#contentLength), - returnValue: 0, - returnValueForMissingStub: 0, - ) as int); - @override - _i10.HttpClientResponseCompressionState get compressionState => - (super.noSuchMethod( - Invocation.getter(#compressionState), - returnValue: _i10.HttpClientResponseCompressionState.notCompressed, - returnValueForMissingStub: - _i10.HttpClientResponseCompressionState.notCompressed, - ) as _i10.HttpClientResponseCompressionState); - @override - bool get persistentConnection => (super.noSuchMethod( - Invocation.getter(#persistentConnection), - returnValue: false, - returnValueForMissingStub: false, - ) as bool); - @override - bool get isRedirect => (super.noSuchMethod( - Invocation.getter(#isRedirect), - returnValue: false, - returnValueForMissingStub: false, - ) as bool); - @override - List<_i10.RedirectInfo> get redirects => (super.noSuchMethod( - Invocation.getter(#redirects), - returnValue: <_i10.RedirectInfo>[], - returnValueForMissingStub: <_i10.RedirectInfo>[], - ) as List<_i10.RedirectInfo>); - @override - _i10.HttpHeaders get headers => (super.noSuchMethod( - Invocation.getter(#headers), - returnValue: _FakeHttpHeaders_17( - this, - Invocation.getter(#headers), - ), - returnValueForMissingStub: _FakeHttpHeaders_17( - this, - Invocation.getter(#headers), - ), - ) as _i10.HttpHeaders); - @override - List<_i10.Cookie> get cookies => (super.noSuchMethod( - Invocation.getter(#cookies), - returnValue: <_i10.Cookie>[], - returnValueForMissingStub: <_i10.Cookie>[], - ) as List<_i10.Cookie>); - @override - bool get isBroadcast => (super.noSuchMethod( - Invocation.getter(#isBroadcast), - returnValue: false, - returnValueForMissingStub: false, - ) as bool); - @override - _i8.Future get length => (super.noSuchMethod( - Invocation.getter(#length), - returnValue: _i8.Future.value(0), - returnValueForMissingStub: _i8.Future.value(0), - ) as _i8.Future); - @override - _i8.Future get isEmpty => (super.noSuchMethod( - Invocation.getter(#isEmpty), - returnValue: _i8.Future.value(false), - returnValueForMissingStub: _i8.Future.value(false), - ) as _i8.Future); - @override - _i8.Future> get first => (super.noSuchMethod( - Invocation.getter(#first), - returnValue: _i8.Future>.value([]), - returnValueForMissingStub: _i8.Future>.value([]), - ) as _i8.Future>); - @override - _i8.Future> get last => (super.noSuchMethod( - Invocation.getter(#last), - returnValue: _i8.Future>.value([]), - returnValueForMissingStub: _i8.Future>.value([]), - ) as _i8.Future>); - @override - _i8.Future> get single => (super.noSuchMethod( - Invocation.getter(#single), - returnValue: _i8.Future>.value([]), - returnValueForMissingStub: _i8.Future>.value([]), - ) as _i8.Future>); - @override - _i8.Future<_i11.HttpClientResponse> redirect([ - String? method, - Uri? url, - bool? followLoops, - ]) => - (super.noSuchMethod( - Invocation.method( - #redirect, - [ - method, - url, - followLoops, - ], - ), - returnValue: _i8.Future<_i11.HttpClientResponse>.value( - _FakeHttpClientResponse_18( - this, - Invocation.method( - #redirect, - [ - method, - url, - followLoops, - ], - ), - )), - returnValueForMissingStub: _i8.Future<_i11.HttpClientResponse>.value( - _FakeHttpClientResponse_18( - this, - Invocation.method( - #redirect, - [ - method, - url, - followLoops, - ], - ), - )), - ) as _i8.Future<_i11.HttpClientResponse>); - @override - _i8.Future<_i10.Socket> detachSocket() => (super.noSuchMethod( - Invocation.method( - #detachSocket, - [], - ), - returnValue: _i8.Future<_i10.Socket>.value(_FakeSocket_20( - this, - Invocation.method( - #detachSocket, - [], - ), - )), - returnValueForMissingStub: _i8.Future<_i10.Socket>.value(_FakeSocket_20( - this, - Invocation.method( - #detachSocket, - [], - ), - )), - ) as _i8.Future<_i10.Socket>); - @override - _i8.Stream> asBroadcastStream({ - void Function(_i8.StreamSubscription>)? onListen, - void Function(_i8.StreamSubscription>)? onCancel, - }) => - (super.noSuchMethod( - Invocation.method( - #asBroadcastStream, - [], - { - #onListen: onListen, - #onCancel: onCancel, - }, - ), - returnValue: _i8.Stream>.empty(), - returnValueForMissingStub: _i8.Stream>.empty(), - ) as _i8.Stream>); - @override - _i8.StreamSubscription> listen( - void Function(List)? onData, { - Function? onError, - void Function()? onDone, - bool? cancelOnError, - }) => - (super.noSuchMethod( - Invocation.method( - #listen, - [onData], - { - #onError: onError, - #onDone: onDone, - #cancelOnError: cancelOnError, - }, - ), - returnValue: _FakeStreamSubscription_21>( - this, - Invocation.method( - #listen, - [onData], - { - #onError: onError, - #onDone: onDone, - #cancelOnError: cancelOnError, - }, - ), - ), - returnValueForMissingStub: _FakeStreamSubscription_21>( - this, - Invocation.method( - #listen, - [onData], - { - #onError: onError, - #onDone: onDone, - #cancelOnError: cancelOnError, - }, - ), - ), - ) as _i8.StreamSubscription>); - @override - _i8.Stream> where(bool Function(List)? test) => - (super.noSuchMethod( - Invocation.method( - #where, - [test], - ), - returnValue: _i8.Stream>.empty(), - returnValueForMissingStub: _i8.Stream>.empty(), - ) as _i8.Stream>); - @override - _i8.Stream map(S Function(List)? convert) => (super.noSuchMethod( - Invocation.method( - #map, - [convert], - ), - returnValue: _i8.Stream.empty(), - returnValueForMissingStub: _i8.Stream.empty(), - ) as _i8.Stream); - @override - _i8.Stream asyncMap(_i8.FutureOr Function(List)? convert) => - (super.noSuchMethod( - Invocation.method( - #asyncMap, - [convert], - ), - returnValue: _i8.Stream.empty(), - returnValueForMissingStub: _i8.Stream.empty(), - ) as _i8.Stream); - @override - _i8.Stream asyncExpand(_i8.Stream? Function(List)? convert) => - (super.noSuchMethod( - Invocation.method( - #asyncExpand, - [convert], - ), - returnValue: _i8.Stream.empty(), - returnValueForMissingStub: _i8.Stream.empty(), - ) as _i8.Stream); - @override - _i8.Stream> handleError( - Function? onError, { - bool Function(dynamic)? test, - }) => - (super.noSuchMethod( - Invocation.method( - #handleError, - [onError], - {#test: test}, - ), - returnValue: _i8.Stream>.empty(), - returnValueForMissingStub: _i8.Stream>.empty(), - ) as _i8.Stream>); - @override - _i8.Stream expand(Iterable Function(List)? convert) => - (super.noSuchMethod( - Invocation.method( - #expand, - [convert], - ), - returnValue: _i8.Stream.empty(), - returnValueForMissingStub: _i8.Stream.empty(), - ) as _i8.Stream); - @override - _i8.Future pipe(_i8.StreamConsumer>? streamConsumer) => - (super.noSuchMethod( - Invocation.method( - #pipe, - [streamConsumer], - ), - returnValue: _i8.Future.value(), - returnValueForMissingStub: _i8.Future.value(), - ) as _i8.Future); - @override - _i8.Stream transform( - _i8.StreamTransformer, S>? streamTransformer) => - (super.noSuchMethod( - Invocation.method( - #transform, - [streamTransformer], - ), - returnValue: _i8.Stream.empty(), - returnValueForMissingStub: _i8.Stream.empty(), - ) as _i8.Stream); - @override - _i8.Future> reduce( - List Function( - List, - List, - )? combine) => - (super.noSuchMethod( - Invocation.method( - #reduce, - [combine], - ), - returnValue: _i8.Future>.value([]), - returnValueForMissingStub: _i8.Future>.value([]), - ) as _i8.Future>); - @override - _i8.Future fold( - S? initialValue, - S Function( - S, - List, - )? combine, - ) => - (super.noSuchMethod( - Invocation.method( - #fold, - [ - initialValue, - combine, - ], - ), - returnValue: _i67.ifNotNull( - _i67.dummyValueOrNull( - this, - Invocation.method( - #fold, - [ - initialValue, - combine, - ], - ), - ), - (S v) => _i8.Future.value(v), - ) ?? - _FakeFuture_6( - this, - Invocation.method( - #fold, - [ - initialValue, - combine, - ], - ), - ), - returnValueForMissingStub: _i67.ifNotNull( - _i67.dummyValueOrNull( - this, - Invocation.method( - #fold, - [ - initialValue, - combine, - ], - ), - ), - (S v) => _i8.Future.value(v), - ) ?? - _FakeFuture_6( - this, - Invocation.method( - #fold, - [ - initialValue, - combine, - ], - ), - ), - ) as _i8.Future); - @override - _i8.Future join([String? separator = r'']) => (super.noSuchMethod( - Invocation.method( - #join, - [separator], - ), - returnValue: _i8.Future.value(''), - returnValueForMissingStub: _i8.Future.value(''), - ) as _i8.Future); - @override - _i8.Future contains(Object? needle) => (super.noSuchMethod( - Invocation.method( - #contains, - [needle], - ), - returnValue: _i8.Future.value(false), - returnValueForMissingStub: _i8.Future.value(false), - ) as _i8.Future); - @override - _i8.Future forEach(void Function(List)? action) => - (super.noSuchMethod( - Invocation.method( - #forEach, - [action], - ), - returnValue: _i8.Future.value(), - returnValueForMissingStub: _i8.Future.value(), - ) as _i8.Future); - @override - _i8.Future every(bool Function(List)? test) => (super.noSuchMethod( - Invocation.method( - #every, - [test], - ), - returnValue: _i8.Future.value(false), - returnValueForMissingStub: _i8.Future.value(false), - ) as _i8.Future); - @override - _i8.Future any(bool Function(List)? test) => (super.noSuchMethod( - Invocation.method( - #any, - [test], - ), - returnValue: _i8.Future.value(false), - returnValueForMissingStub: _i8.Future.value(false), - ) as _i8.Future); - @override - _i8.Stream cast() => (super.noSuchMethod( - Invocation.method( - #cast, - [], - ), - returnValue: _i8.Stream.empty(), - returnValueForMissingStub: _i8.Stream.empty(), - ) as _i8.Stream); - @override - _i8.Future>> toList() => (super.noSuchMethod( - Invocation.method( - #toList, - [], - ), - returnValue: _i8.Future>>.value(>[]), - returnValueForMissingStub: - _i8.Future>>.value(>[]), - ) as _i8.Future>>); - @override - _i8.Future>> toSet() => (super.noSuchMethod( - Invocation.method( - #toSet, - [], - ), - returnValue: _i8.Future>>.value(>{}), - returnValueForMissingStub: - _i8.Future>>.value(>{}), - ) as _i8.Future>>); - @override - _i8.Future drain([E? futureValue]) => (super.noSuchMethod( - Invocation.method( - #drain, - [futureValue], - ), - returnValue: _i67.ifNotNull( - _i67.dummyValueOrNull( - this, - Invocation.method( - #drain, - [futureValue], - ), - ), - (E v) => _i8.Future.value(v), - ) ?? - _FakeFuture_6( - this, - Invocation.method( - #drain, - [futureValue], - ), - ), - returnValueForMissingStub: _i67.ifNotNull( - _i67.dummyValueOrNull( - this, - Invocation.method( - #drain, - [futureValue], - ), - ), - (E v) => _i8.Future.value(v), - ) ?? - _FakeFuture_6( - this, - Invocation.method( - #drain, - [futureValue], - ), - ), - ) as _i8.Future); - @override - _i8.Stream> take(int? count) => (super.noSuchMethod( - Invocation.method( - #take, - [count], - ), - returnValue: _i8.Stream>.empty(), - returnValueForMissingStub: _i8.Stream>.empty(), - ) as _i8.Stream>); - @override - _i8.Stream> takeWhile(bool Function(List)? test) => - (super.noSuchMethod( - Invocation.method( - #takeWhile, - [test], - ), - returnValue: _i8.Stream>.empty(), - returnValueForMissingStub: _i8.Stream>.empty(), - ) as _i8.Stream>); - @override - _i8.Stream> skip(int? count) => (super.noSuchMethod( - Invocation.method( - #skip, - [count], - ), - returnValue: _i8.Stream>.empty(), - returnValueForMissingStub: _i8.Stream>.empty(), - ) as _i8.Stream>); - @override - _i8.Stream> skipWhile(bool Function(List)? test) => - (super.noSuchMethod( - Invocation.method( - #skipWhile, - [test], - ), - returnValue: _i8.Stream>.empty(), - returnValueForMissingStub: _i8.Stream>.empty(), - ) as _i8.Stream>); - @override - _i8.Stream> distinct( - [bool Function( - List, - List, - )? equals]) => - (super.noSuchMethod( - Invocation.method( - #distinct, - [equals], - ), - returnValue: _i8.Stream>.empty(), - returnValueForMissingStub: _i8.Stream>.empty(), - ) as _i8.Stream>); - @override - _i8.Future> firstWhere( - bool Function(List)? test, { - List Function()? orElse, - }) => - (super.noSuchMethod( - Invocation.method( - #firstWhere, - [test], - {#orElse: orElse}, - ), - returnValue: _i8.Future>.value([]), - returnValueForMissingStub: _i8.Future>.value([]), - ) as _i8.Future>); - @override - _i8.Future> lastWhere( - bool Function(List)? test, { - List Function()? orElse, - }) => - (super.noSuchMethod( - Invocation.method( - #lastWhere, - [test], - {#orElse: orElse}, - ), - returnValue: _i8.Future>.value([]), - returnValueForMissingStub: _i8.Future>.value([]), - ) as _i8.Future>); - @override - _i8.Future> singleWhere( - bool Function(List)? test, { - List Function()? orElse, - }) => - (super.noSuchMethod( - Invocation.method( - #singleWhere, - [test], - {#orElse: orElse}, - ), - returnValue: _i8.Future>.value([]), - returnValueForMissingStub: _i8.Future>.value([]), - ) as _i8.Future>); - @override - _i8.Future> elementAt(int? index) => (super.noSuchMethod( - Invocation.method( - #elementAt, - [index], - ), - returnValue: _i8.Future>.value([]), - returnValueForMissingStub: _i8.Future>.value([]), - ) as _i8.Future>); - @override - _i8.Stream> timeout( - Duration? timeLimit, { - void Function(_i8.EventSink>)? onTimeout, - }) => - (super.noSuchMethod( - Invocation.method( - #timeout, - [timeLimit], - {#onTimeout: onTimeout}, - ), - returnValue: _i8.Stream>.empty(), - returnValueForMissingStub: _i8.Stream>.empty(), - ) as _i8.Stream>); -} - -/// A class which mocks [HttpHeaders]. -/// -/// See the documentation for Mockito's code generation for more information. -class MockHttpHeaders extends _i1.Mock implements _i10.HttpHeaders { - @override - set date(DateTime? _date) => super.noSuchMethod( - Invocation.setter( - #date, - _date, - ), - returnValueForMissingStub: null, - ); - @override - set expires(DateTime? _expires) => super.noSuchMethod( - Invocation.setter( - #expires, - _expires, - ), - returnValueForMissingStub: null, - ); - @override - set ifModifiedSince(DateTime? _ifModifiedSince) => super.noSuchMethod( - Invocation.setter( - #ifModifiedSince, - _ifModifiedSince, - ), - returnValueForMissingStub: null, - ); - @override - set host(String? _host) => super.noSuchMethod( - Invocation.setter( - #host, - _host, - ), - returnValueForMissingStub: null, - ); - @override - set port(int? _port) => super.noSuchMethod( - Invocation.setter( - #port, - _port, - ), - returnValueForMissingStub: null, - ); - @override - set contentType(_i10.ContentType? _contentType) => super.noSuchMethod( - Invocation.setter( - #contentType, - _contentType, - ), - returnValueForMissingStub: null, - ); - @override - int get contentLength => (super.noSuchMethod( - Invocation.getter(#contentLength), - returnValue: 0, - returnValueForMissingStub: 0, - ) as int); - @override - set contentLength(int? _contentLength) => super.noSuchMethod( - Invocation.setter( - #contentLength, - _contentLength, - ), - returnValueForMissingStub: null, - ); - @override - bool get persistentConnection => (super.noSuchMethod( - Invocation.getter(#persistentConnection), - returnValue: false, - returnValueForMissingStub: false, - ) as bool); - @override - set persistentConnection(bool? _persistentConnection) => super.noSuchMethod( - Invocation.setter( - #persistentConnection, - _persistentConnection, - ), - returnValueForMissingStub: null, - ); - @override - bool get chunkedTransferEncoding => (super.noSuchMethod( - Invocation.getter(#chunkedTransferEncoding), - returnValue: false, - returnValueForMissingStub: false, - ) as bool); - @override - set chunkedTransferEncoding(bool? _chunkedTransferEncoding) => - super.noSuchMethod( - Invocation.setter( - #chunkedTransferEncoding, - _chunkedTransferEncoding, - ), - returnValueForMissingStub: null, - ); - @override - List? operator [](String? name) => (super.noSuchMethod( - Invocation.method( - #[], - [name], - ), - returnValueForMissingStub: null, - ) as List?); - @override - String? value(String? name) => (super.noSuchMethod( - Invocation.method( - #value, - [name], - ), - returnValueForMissingStub: null, - ) as String?); - @override - void add( - String? name, - Object? value, { - bool? preserveHeaderCase = false, - }) => - super.noSuchMethod( - Invocation.method( - #add, - [ - name, - value, - ], - {#preserveHeaderCase: preserveHeaderCase}, - ), - returnValueForMissingStub: null, - ); - @override - void set( - String? name, - Object? value, { - bool? preserveHeaderCase = false, - }) => - super.noSuchMethod( - Invocation.method( - #set, - [ - name, - value, - ], - {#preserveHeaderCase: preserveHeaderCase}, - ), - returnValueForMissingStub: null, - ); - @override - void remove( - String? name, - Object? value, - ) => - super.noSuchMethod( - Invocation.method( - #remove, - [ - name, - value, - ], - ), - returnValueForMissingStub: null, - ); - @override - void removeAll(String? name) => super.noSuchMethod( - Invocation.method( - #removeAll, - [name], - ), - returnValueForMissingStub: null, - ); - @override - void forEach( - void Function( - String, - List, - )? action) => - super.noSuchMethod( - Invocation.method( - #forEach, - [action], - ), - returnValueForMissingStub: null, - ); - @override - void noFolding(String? name) => super.noSuchMethod( - Invocation.method( - #noFolding, - [name], - ), - returnValueForMissingStub: null, - ); - @override - void clear() => super.noSuchMethod( - Invocation.method( - #clear, - [], - ), - returnValueForMissingStub: null, - ); -} - -/// A class which mocks [InboxApi]. -/// -/// See the documentation for Mockito's code generation for more information. -class MockInboxApi extends _i1.Mock implements _i73.InboxApi { - @override - _i8.Future?> getConversations({ - String? scope = null, - bool? forceRefresh = false, - }) => - (super.noSuchMethod( - Invocation.method( - #getConversations, - [], - { - #scope: scope, - #forceRefresh: forceRefresh, - }, - ), - returnValue: _i8.Future?>.value(), - returnValueForMissingStub: _i8.Future?>.value(), - ) as _i8.Future?>); - @override - _i8.Future<_i65.Conversation?> getConversation( - String? id, { - bool? refresh = false, - }) => - (super.noSuchMethod( - Invocation.method( - #getConversation, - [id], - {#refresh: refresh}, - ), - returnValue: _i8.Future<_i65.Conversation?>.value(), - returnValueForMissingStub: _i8.Future<_i65.Conversation?>.value(), - ) as _i8.Future<_i65.Conversation?>); - @override - _i8.Future<_i33.UnreadCount?> getUnreadCount() => (super.noSuchMethod( - Invocation.method( - #getUnreadCount, - [], - ), - returnValue: _i8.Future<_i33.UnreadCount?>.value(), - returnValueForMissingStub: _i8.Future<_i33.UnreadCount?>.value(), - ) as _i8.Future<_i33.UnreadCount?>); - @override - _i8.Future<_i65.Conversation?> addMessage( - String? conversationId, - String? body, - List? recipientIds, - List? attachmentIds, - List? includeMessageIds, - ) => - (super.noSuchMethod( - Invocation.method( - #addMessage, - [ - conversationId, - body, - recipientIds, - attachmentIds, - includeMessageIds, - ], - ), - returnValue: _i8.Future<_i65.Conversation?>.value(), - returnValueForMissingStub: _i8.Future<_i65.Conversation?>.value(), - ) as _i8.Future<_i65.Conversation?>); - @override - _i8.Future?> getRecipients( - String? courseId, { - bool? forceRefresh = false, - }) => - (super.noSuchMethod( - Invocation.method( - #getRecipients, - [courseId], - {#forceRefresh: forceRefresh}, - ), - returnValue: _i8.Future?>.value(), - returnValueForMissingStub: _i8.Future?>.value(), - ) as _i8.Future?>); - @override - _i8.Future<_i65.Conversation?> createConversation( - String? courseId, - List? recipientIds, - String? subject, - String? body, - List? attachmentIds, - ) => - (super.noSuchMethod( - Invocation.method( - #createConversation, - [ - courseId, - recipientIds, - subject, - body, - attachmentIds, - ], - ), - returnValue: _i8.Future<_i65.Conversation?>.value(), - returnValueForMissingStub: _i8.Future<_i65.Conversation?>.value(), - ) as _i8.Future<_i65.Conversation?>); -} - -/// A class which mocks [NavigatorObserver]. -/// -/// See the documentation for Mockito's code generation for more information. -class MockNavigatorObserver extends _i1.Mock implements _i17.NavigatorObserver { - @override - void didPush( - _i17.Route? route, - _i17.Route? previousRoute, - ) => - super.noSuchMethod( - Invocation.method( - #didPush, - [ - route, - previousRoute, - ], - ), - returnValueForMissingStub: null, - ); - @override - void didPop( - _i17.Route? route, - _i17.Route? previousRoute, - ) => - super.noSuchMethod( - Invocation.method( - #didPop, - [ - route, - previousRoute, - ], - ), - returnValueForMissingStub: null, - ); - @override - void didRemove( - _i17.Route? route, - _i17.Route? previousRoute, - ) => - super.noSuchMethod( - Invocation.method( - #didRemove, - [ - route, - previousRoute, - ], - ), - returnValueForMissingStub: null, - ); - @override - void didReplace({ - _i17.Route? newRoute, - _i17.Route? oldRoute, - }) => - super.noSuchMethod( - Invocation.method( - #didReplace, - [], - { - #newRoute: newRoute, - #oldRoute: oldRoute, - }, - ), - returnValueForMissingStub: null, - ); - @override - void didStartUserGesture( - _i17.Route? route, - _i17.Route? previousRoute, - ) => - super.noSuchMethod( - Invocation.method( - #didStartUserGesture, - [ - route, - previousRoute, - ], - ), - returnValueForMissingStub: null, - ); - @override - void didStopUserGesture() => super.noSuchMethod( - Invocation.method( - #didStopUserGesture, - [], - ), - returnValueForMissingStub: null, - ); -} - -/// A class which mocks [NotificationUtil]. -/// -/// See the documentation for Mockito's code generation for more information. -class MockNotificationUtil extends _i1.Mock implements _i75.NotificationUtil { - @override - _i8.Future scheduleReminder( - _i41.AppLocalizations? l10n, - String? title, - String? body, - _i40.Reminder? reminder, - ) => - (super.noSuchMethod( - Invocation.method( - #scheduleReminder, - [ - l10n, - title, - body, - reminder, - ], - ), - returnValue: _i8.Future.value(), - returnValueForMissingStub: _i8.Future.value(), - ) as _i8.Future); - @override - _i8.Future deleteNotification(int? id) => (super.noSuchMethod( - Invocation.method( - #deleteNotification, - [id], - ), - returnValue: _i8.Future.value(), - returnValueForMissingStub: _i8.Future.value(), - ) as _i8.Future); - @override - _i8.Future deleteNotifications(List? ids) => (super.noSuchMethod( - Invocation.method( - #deleteNotifications, - [ids], - ), - returnValue: _i8.Future.value(), - returnValueForMissingStub: _i8.Future.value(), - ) as _i8.Future); - @override - _i8.Future requestScheduleExactAlarmPermission() => - (super.noSuchMethod( - Invocation.method( - #requestScheduleExactAlarmPermission, - [], - ), - returnValue: _i8.Future.value(), - returnValueForMissingStub: _i8.Future.value(), - ) as _i8.Future); -} - -/// A class which mocks [OAuthApi]. -/// -/// See the documentation for Mockito's code generation for more information. -class MockOAuthApi extends _i1.Mock implements _i76.OAuthApi { - @override - _i8.Future<_i77.AuthenticatedUrl?> getAuthenticatedUrl(String? targetUrl) => - (super.noSuchMethod( - Invocation.method( - #getAuthenticatedUrl, - [targetUrl], - ), - returnValue: _i8.Future<_i77.AuthenticatedUrl?>.value(), - returnValueForMissingStub: _i8.Future<_i77.AuthenticatedUrl?>.value(), - ) as _i8.Future<_i77.AuthenticatedUrl?>); -} - -/// A class which mocks [PairingInteractor]. -/// -/// See the documentation for Mockito's code generation for more information. -class MockPairingInteractor extends _i1.Mock implements _i78.PairingInteractor { - @override - _i8.Future<_i13.QRPairingScanResult> scanQRCode() => (super.noSuchMethod( - Invocation.method( - #scanQRCode, - [], - ), - returnValue: _i8.Future<_i13.QRPairingScanResult>.value( - _FakeQRPairingScanResult_22( - this, - Invocation.method( - #scanQRCode, - [], - ), - )), - returnValueForMissingStub: _i8.Future<_i13.QRPairingScanResult>.value( - _FakeQRPairingScanResult_22( - this, - Invocation.method( - #scanQRCode, - [], - ), - )), - ) as _i8.Future<_i13.QRPairingScanResult>); - @override - _i8.Future pairWithStudent(String? pairingCode) => (super.noSuchMethod( - Invocation.method( - #pairWithStudent, - [pairingCode], - ), - returnValue: _i8.Future.value(), - returnValueForMissingStub: _i8.Future.value(), - ) as _i8.Future); -} - -/// A class which mocks [PageApi]. -/// -/// See the documentation for Mockito's code generation for more information. -class MockPageApi extends _i1.Mock implements _i79.PageApi { - @override - _i8.Future<_i59.CanvasPage?> getCourseFrontPage( - String? courseId, { - bool? forceRefresh = false, - }) => - (super.noSuchMethod( - Invocation.method( - #getCourseFrontPage, - [courseId], - {#forceRefresh: forceRefresh}, - ), - returnValue: _i8.Future<_i59.CanvasPage?>.value(), - returnValueForMissingStub: _i8.Future<_i59.CanvasPage?>.value(), - ) as _i8.Future<_i59.CanvasPage?>); -} - -/// A class which mocks [AndroidFlutterLocalNotificationsPlugin]. -/// -/// See the documentation for Mockito's code generation for more information. -class MockAndroidFlutterLocalNotificationsPlugin extends _i1.Mock - implements _i80.AndroidFlutterLocalNotificationsPlugin { - @override - _i8.Future initialize( - _i80.AndroidInitializationSettings? initializationSettings, { - _i80.DidReceiveNotificationResponseCallback? - onDidReceiveNotificationResponse, - _i80.DidReceiveBackgroundNotificationResponseCallback? - onDidReceiveBackgroundNotificationResponse, - }) => - (super.noSuchMethod( - Invocation.method( - #initialize, - [initializationSettings], - { - #onDidReceiveNotificationResponse: onDidReceiveNotificationResponse, - #onDidReceiveBackgroundNotificationResponse: - onDidReceiveBackgroundNotificationResponse, - }, - ), - returnValue: _i8.Future.value(false), - returnValueForMissingStub: _i8.Future.value(false), - ) as _i8.Future); - @override - _i8.Future requestExactAlarmsPermission() => (super.noSuchMethod( - Invocation.method( - #requestExactAlarmsPermission, - [], - ), - returnValue: _i8.Future.value(), - returnValueForMissingStub: _i8.Future.value(), - ) as _i8.Future); - @override - _i8.Future requestNotificationsPermission() => (super.noSuchMethod( - Invocation.method( - #requestNotificationsPermission, - [], - ), - returnValue: _i8.Future.value(), - returnValueForMissingStub: _i8.Future.value(), - ) as _i8.Future); - @override - _i8.Future zonedSchedule( - int? id, - String? title, - String? body, - _i81.TZDateTime? scheduledDate, - _i80.AndroidNotificationDetails? notificationDetails, { - required _i80.AndroidScheduleMode? scheduleMode, - String? payload, - _i80.DateTimeComponents? matchDateTimeComponents, - }) => - (super.noSuchMethod( - Invocation.method( - #zonedSchedule, - [ - id, - title, - body, - scheduledDate, - notificationDetails, - ], - { - #scheduleMode: scheduleMode, - #payload: payload, - #matchDateTimeComponents: matchDateTimeComponents, - }, - ), - returnValue: _i8.Future.value(), - returnValueForMissingStub: _i8.Future.value(), - ) as _i8.Future); - @override - _i8.Future startForegroundService( - int? id, - String? title, - String? body, { - _i80.AndroidNotificationDetails? notificationDetails, - String? payload, - _i80.AndroidServiceStartType? startType = - _i80.AndroidServiceStartType.startSticky, - Set<_i80.AndroidServiceForegroundType>? foregroundServiceTypes, - }) => - (super.noSuchMethod( - Invocation.method( - #startForegroundService, - [ - id, - title, - body, - ], - { - #notificationDetails: notificationDetails, - #payload: payload, - #startType: startType, - #foregroundServiceTypes: foregroundServiceTypes, - }, - ), - returnValue: _i8.Future.value(), - returnValueForMissingStub: _i8.Future.value(), - ) as _i8.Future); - @override - _i8.Future stopForegroundService() => (super.noSuchMethod( - Invocation.method( - #stopForegroundService, - [], - ), - returnValue: _i8.Future.value(), - returnValueForMissingStub: _i8.Future.value(), - ) as _i8.Future); - @override - _i8.Future show( - int? id, - String? title, - String? body, { - _i80.AndroidNotificationDetails? notificationDetails, - String? payload, - }) => - (super.noSuchMethod( - Invocation.method( - #show, - [ - id, - title, - body, - ], - { - #notificationDetails: notificationDetails, - #payload: payload, - }, - ), - returnValue: _i8.Future.value(), - returnValueForMissingStub: _i8.Future.value(), - ) as _i8.Future); - @override - _i8.Future periodicallyShow( - int? id, - String? title, - String? body, - _i80.RepeatInterval? repeatInterval, { - _i80.AndroidNotificationDetails? notificationDetails, - String? payload, - _i80.AndroidScheduleMode? scheduleMode = _i80.AndroidScheduleMode.exact, - }) => - (super.noSuchMethod( - Invocation.method( - #periodicallyShow, - [ - id, - title, - body, - repeatInterval, - ], - { - #notificationDetails: notificationDetails, - #payload: payload, - #scheduleMode: scheduleMode, - }, - ), - returnValue: _i8.Future.value(), - returnValueForMissingStub: _i8.Future.value(), - ) as _i8.Future); - @override - _i8.Future cancel( - int? id, { - String? tag, - }) => - (super.noSuchMethod( - Invocation.method( - #cancel, - [id], - {#tag: tag}, - ), - returnValue: _i8.Future.value(), - returnValueForMissingStub: _i8.Future.value(), - ) as _i8.Future); - @override - _i8.Future createNotificationChannelGroup( - _i80.AndroidNotificationChannelGroup? notificationChannelGroup) => - (super.noSuchMethod( - Invocation.method( - #createNotificationChannelGroup, - [notificationChannelGroup], - ), - returnValue: _i8.Future.value(), - returnValueForMissingStub: _i8.Future.value(), - ) as _i8.Future); - @override - _i8.Future deleteNotificationChannelGroup(String? groupId) => - (super.noSuchMethod( - Invocation.method( - #deleteNotificationChannelGroup, - [groupId], - ), - returnValue: _i8.Future.value(), - returnValueForMissingStub: _i8.Future.value(), - ) as _i8.Future); - @override - _i8.Future createNotificationChannel( - _i80.AndroidNotificationChannel? notificationChannel) => - (super.noSuchMethod( - Invocation.method( - #createNotificationChannel, - [notificationChannel], - ), - returnValue: _i8.Future.value(), - returnValueForMissingStub: _i8.Future.value(), - ) as _i8.Future); - @override - _i8.Future deleteNotificationChannel(String? channelId) => - (super.noSuchMethod( - Invocation.method( - #deleteNotificationChannel, - [channelId], - ), - returnValue: _i8.Future.value(), - returnValueForMissingStub: _i8.Future.value(), - ) as _i8.Future); - @override - _i8.Future<_i80.MessagingStyleInformation?> - getActiveNotificationMessagingStyle( - int? id, { - String? tag, - }) => - (super.noSuchMethod( - Invocation.method( - #getActiveNotificationMessagingStyle, - [id], - {#tag: tag}, - ), - returnValue: _i8.Future<_i80.MessagingStyleInformation?>.value(), - returnValueForMissingStub: - _i8.Future<_i80.MessagingStyleInformation?>.value(), - ) as _i8.Future<_i80.MessagingStyleInformation?>); - @override - _i8.Future?> - getNotificationChannels() => (super.noSuchMethod( - Invocation.method( - #getNotificationChannels, - [], - ), - returnValue: - _i8.Future?>.value(), - returnValueForMissingStub: - _i8.Future?>.value(), - ) as _i8.Future?>); - @override - _i8.Future areNotificationsEnabled() => (super.noSuchMethod( - Invocation.method( - #areNotificationsEnabled, - [], - ), - returnValue: _i8.Future.value(), - returnValueForMissingStub: _i8.Future.value(), - ) as _i8.Future); - @override - _i8.Future canScheduleExactNotifications() => (super.noSuchMethod( - Invocation.method( - #canScheduleExactNotifications, - [], - ), - returnValue: _i8.Future.value(), - returnValueForMissingStub: _i8.Future.value(), - ) as _i8.Future); - @override - _i8.Future cancelAll() => (super.noSuchMethod( - Invocation.method( - #cancelAll, - [], - ), - returnValue: _i8.Future.value(), - returnValueForMissingStub: _i8.Future.value(), - ) as _i8.Future); - @override - _i8.Future<_i80.NotificationAppLaunchDetails?> - getNotificationAppLaunchDetails() => (super.noSuchMethod( - Invocation.method( - #getNotificationAppLaunchDetails, - [], - ), - returnValue: _i8.Future<_i80.NotificationAppLaunchDetails?>.value(), - returnValueForMissingStub: - _i8.Future<_i80.NotificationAppLaunchDetails?>.value(), - ) as _i8.Future<_i80.NotificationAppLaunchDetails?>); - @override - _i8.Future> - pendingNotificationRequests() => (super.noSuchMethod( - Invocation.method( - #pendingNotificationRequests, - [], - ), - returnValue: - _i8.Future>.value( - <_i80.PendingNotificationRequest>[]), - returnValueForMissingStub: - _i8.Future>.value( - <_i80.PendingNotificationRequest>[]), - ) as _i8.Future>); - @override - _i8.Future> getActiveNotifications() => - (super.noSuchMethod( - Invocation.method( - #getActiveNotifications, - [], - ), - returnValue: _i8.Future>.value( - <_i80.ActiveNotification>[]), - returnValueForMissingStub: - _i8.Future>.value( - <_i80.ActiveNotification>[]), - ) as _i8.Future>); -} - -/// A class which mocks [PairingUtil]. -/// -/// See the documentation for Mockito's code generation for more information. -class MockPairingUtil extends _i1.Mock implements _i82.PairingUtil { - @override - dynamic pairNewStudent( - _i17.BuildContext? context, - dynamic Function()? onSuccess, - ) => - super.noSuchMethod( - Invocation.method( - #pairNewStudent, - [ - context, - onSuccess, - ], - ), - returnValueForMissingStub: null, - ); -} - -/// A class which mocks [QuickNav]. -/// -/// See the documentation for Mockito's code generation for more information. -class MockQuickNav extends _i1.Mock implements _i83.QuickNav { - @override - _i8.Future push( - _i17.BuildContext? context, - _i17.Widget? widget, - ) => - (super.noSuchMethod( - Invocation.method( - #push, - [ - context, - widget, - ], - ), - returnValue: _i8.Future.value(), - returnValueForMissingStub: _i8.Future.value(), - ) as _i8.Future); - @override - _i8.Future pushRoute( - _i17.BuildContext? context, - String? route, { - _i84.TransitionType? transitionType = _i84.TransitionType.material, - }) => - (super.noSuchMethod( - Invocation.method( - #pushRoute, - [ - context, - route, - ], - {#transitionType: transitionType}, - ), - returnValue: _i8.Future.value(), - returnValueForMissingStub: _i8.Future.value(), - ) as _i8.Future); - @override - _i8.Future replaceRoute( - _i17.BuildContext? context, - String? route, { - _i84.TransitionType? transitionType = _i84.TransitionType.material, - }) => - (super.noSuchMethod( - Invocation.method( - #replaceRoute, - [ - context, - route, - ], - {#transitionType: transitionType}, - ), - returnValue: _i8.Future.value(), - returnValueForMissingStub: _i8.Future.value(), - ) as _i8.Future); - @override - _i8.Future pushRouteAndClearStack( - _i17.BuildContext? context, - String? route, { - _i84.TransitionType? transitionType = _i84.TransitionType.material, - }) => - (super.noSuchMethod( - Invocation.method( - #pushRouteAndClearStack, - [ - context, - route, - ], - {#transitionType: transitionType}, - ), - returnValue: _i8.Future.value(), - returnValueForMissingStub: _i8.Future.value(), - ) as _i8.Future); - @override - _i8.Future pushRouteWithCustomTransition( - _i17.BuildContext? context, - String? route, - bool? clearStack, - Duration? transitionDuration, - _i17.RouteTransitionsBuilder? transitionsBuilder, { - _i84.TransitionType? transitionType = _i84.TransitionType.custom, - }) => - (super.noSuchMethod( - Invocation.method( - #pushRouteWithCustomTransition, - [ - context, - route, - clearStack, - transitionDuration, - transitionsBuilder, - ], - {#transitionType: transitionType}, - ), - returnValue: _i8.Future.value(), - returnValueForMissingStub: _i8.Future.value(), - ) as _i8.Future); - @override - _i8.Future routeInternally( - _i17.BuildContext? context, - String? url, - ) => - (super.noSuchMethod( - Invocation.method( - #routeInternally, - [ - context, - url, - ], - ), - returnValue: _i8.Future.value(), - returnValueForMissingStub: _i8.Future.value(), - ) as _i8.Future); - @override - _i8.Future showDialog({ - required _i17.BuildContext? context, - bool? barrierDismissible = true, - required _i17.WidgetBuilder? builder, - bool? useRootNavigator = true, - _i17.RouteSettings? routeSettings, - }) => - (super.noSuchMethod( - Invocation.method( - #showDialog, - [], - { - #context: context, - #barrierDismissible: barrierDismissible, - #builder: builder, - #useRootNavigator: useRootNavigator, - #routeSettings: routeSettings, - }, - ), - returnValue: _i8.Future.value(), - returnValueForMissingStub: _i8.Future.value(), - ) as _i8.Future); -} - -/// A class which mocks [ReminderDb]. -/// -/// See the documentation for Mockito's code generation for more information. -class MockReminderDb extends _i1.Mock implements _i85.ReminderDb { - @override - _i5.Database get db => (super.noSuchMethod( - Invocation.getter(#db), - returnValue: _FakeDatabase_3( - this, - Invocation.getter(#db), - ), - returnValueForMissingStub: _FakeDatabase_3( - this, - Invocation.getter(#db), - ), - ) as _i5.Database); - @override - set db(_i5.Database? _db) => super.noSuchMethod( - Invocation.setter( - #db, - _db, - ), - returnValueForMissingStub: null, - ); - @override - _i8.Future<_i40.Reminder?> insert(_i40.Reminder? data) => (super.noSuchMethod( - Invocation.method( - #insert, - [data], - ), - returnValue: _i8.Future<_i40.Reminder?>.value(), - returnValueForMissingStub: _i8.Future<_i40.Reminder?>.value(), - ) as _i8.Future<_i40.Reminder?>); - @override - _i8.Future<_i40.Reminder?> getById(int? id) => (super.noSuchMethod( - Invocation.method( - #getById, - [id], - ), - returnValue: _i8.Future<_i40.Reminder?>.value(), - returnValueForMissingStub: _i8.Future<_i40.Reminder?>.value(), - ) as _i8.Future<_i40.Reminder?>); - @override - _i8.Future<_i40.Reminder?> getByItem( - String? userDomain, - String? userId, - String? type, - String? itemId, - ) => - (super.noSuchMethod( - Invocation.method( - #getByItem, - [ - userDomain, - userId, - type, - itemId, - ], - ), - returnValue: _i8.Future<_i40.Reminder?>.value(), - returnValueForMissingStub: _i8.Future<_i40.Reminder?>.value(), - ) as _i8.Future<_i40.Reminder?>); - @override - _i8.Future deleteById(int? id) => (super.noSuchMethod( - Invocation.method( - #deleteById, - [id], - ), - returnValue: _i8.Future.value(0), - returnValueForMissingStub: _i8.Future.value(0), - ) as _i8.Future); - @override - _i8.Future deleteAllForUser( - String? userDomain, - String? userId, - ) => - (super.noSuchMethod( - Invocation.method( - #deleteAllForUser, - [ - userDomain, - userId, - ], - ), - returnValue: _i8.Future.value(0), - returnValueForMissingStub: _i8.Future.value(0), - ) as _i8.Future); -} - -/// A class which mocks [FirebaseRemoteConfig]. -/// -/// See the documentation for Mockito's code generation for more information. -class MockFirebaseRemoteConfig extends _i1.Mock - implements _i86.FirebaseRemoteConfig { - @override - _i9.FirebaseApp get app => (super.noSuchMethod( - Invocation.getter(#app), - returnValue: _FakeFirebaseApp_13( - this, - Invocation.getter(#app), - ), - returnValueForMissingStub: _FakeFirebaseApp_13( - this, - Invocation.getter(#app), - ), - ) as _i9.FirebaseApp); - @override - DateTime get lastFetchTime => (super.noSuchMethod( - Invocation.getter(#lastFetchTime), - returnValue: _FakeDateTime_23( - this, - Invocation.getter(#lastFetchTime), - ), - returnValueForMissingStub: _FakeDateTime_23( - this, - Invocation.getter(#lastFetchTime), - ), - ) as DateTime); - @override - _i14.RemoteConfigFetchStatus get lastFetchStatus => (super.noSuchMethod( - Invocation.getter(#lastFetchStatus), - returnValue: _i14.RemoteConfigFetchStatus.noFetchYet, - returnValueForMissingStub: _i14.RemoteConfigFetchStatus.noFetchYet, - ) as _i14.RemoteConfigFetchStatus); - @override - _i14.RemoteConfigSettings get settings => (super.noSuchMethod( - Invocation.getter(#settings), - returnValue: _FakeRemoteConfigSettings_24( - this, - Invocation.getter(#settings), - ), - returnValueForMissingStub: _FakeRemoteConfigSettings_24( - this, - Invocation.getter(#settings), - ), - ) as _i14.RemoteConfigSettings); - @override - _i8.Stream<_i14.RemoteConfigUpdate> get onConfigUpdated => - (super.noSuchMethod( - Invocation.getter(#onConfigUpdated), - returnValue: _i8.Stream<_i14.RemoteConfigUpdate>.empty(), - returnValueForMissingStub: _i8.Stream<_i14.RemoteConfigUpdate>.empty(), - ) as _i8.Stream<_i14.RemoteConfigUpdate>); - @override - Map get pluginConstants => (super.noSuchMethod( - Invocation.getter(#pluginConstants), - returnValue: {}, - returnValueForMissingStub: {}, - ) as Map); - @override - _i8.Future activate() => (super.noSuchMethod( - Invocation.method( - #activate, - [], - ), - returnValue: _i8.Future.value(false), - returnValueForMissingStub: _i8.Future.value(false), - ) as _i8.Future); - @override - _i8.Future ensureInitialized() => (super.noSuchMethod( - Invocation.method( - #ensureInitialized, - [], - ), - returnValue: _i8.Future.value(), - returnValueForMissingStub: _i8.Future.value(), - ) as _i8.Future); - @override - _i8.Future fetch() => (super.noSuchMethod( - Invocation.method( - #fetch, - [], - ), - returnValue: _i8.Future.value(), - returnValueForMissingStub: _i8.Future.value(), - ) as _i8.Future); - @override - _i8.Future fetchAndActivate() => (super.noSuchMethod( - Invocation.method( - #fetchAndActivate, - [], - ), - returnValue: _i8.Future.value(false), - returnValueForMissingStub: _i8.Future.value(false), - ) as _i8.Future); - @override - Map getAll() => (super.noSuchMethod( - Invocation.method( - #getAll, - [], - ), - returnValue: {}, - returnValueForMissingStub: {}, - ) as Map); - @override - bool getBool(String? key) => (super.noSuchMethod( - Invocation.method( - #getBool, - [key], - ), - returnValue: false, - returnValueForMissingStub: false, - ) as bool); - @override - int getInt(String? key) => (super.noSuchMethod( - Invocation.method( - #getInt, - [key], - ), - returnValue: 0, - returnValueForMissingStub: 0, - ) as int); - @override - double getDouble(String? key) => (super.noSuchMethod( - Invocation.method( - #getDouble, - [key], - ), - returnValue: 0.0, - returnValueForMissingStub: 0.0, - ) as double); - @override - String getString(String? key) => (super.noSuchMethod( - Invocation.method( - #getString, - [key], - ), - returnValue: '', - returnValueForMissingStub: '', - ) as String); - @override - _i14.RemoteConfigValue getValue(String? key) => (super.noSuchMethod( - Invocation.method( - #getValue, - [key], - ), - returnValue: _FakeRemoteConfigValue_25( - this, - Invocation.method( - #getValue, - [key], - ), - ), - returnValueForMissingStub: _FakeRemoteConfigValue_25( - this, - Invocation.method( - #getValue, - [key], - ), - ), - ) as _i14.RemoteConfigValue); - @override - _i8.Future setConfigSettings( - _i14.RemoteConfigSettings? remoteConfigSettings) => - (super.noSuchMethod( - Invocation.method( - #setConfigSettings, - [remoteConfigSettings], - ), - returnValue: _i8.Future.value(), - returnValueForMissingStub: _i8.Future.value(), - ) as _i8.Future); - @override - _i8.Future setDefaults(Map? defaultParameters) => - (super.noSuchMethod( - Invocation.method( - #setDefaults, - [defaultParameters], - ), - returnValue: _i8.Future.value(), - returnValueForMissingStub: _i8.Future.value(), - ) as _i8.Future); -} - -/// A class which mocks [FlutterSnackbarVeneer]. -/// -/// See the documentation for Mockito's code generation for more information. -class MockFlutterSnackbarVeneer extends _i1.Mock - implements _i87.FlutterSnackbarVeneer { - @override - dynamic showSnackBar( - dynamic context, - String? message, - ) => - super.noSuchMethod( - Invocation.method( - #showSnackBar, - [ - context, - message, - ], - ), - returnValueForMissingStub: null, - ); -} - -/// A class which mocks [StudentAddedNotifier]. -/// -/// See the documentation for Mockito's code generation for more information. -class MockStudentAddedNotifier extends _i1.Mock - implements _i82.StudentAddedNotifier { - @override - bool get hasListeners => (super.noSuchMethod( - Invocation.getter(#hasListeners), - returnValue: false, - returnValueForMissingStub: false, - ) as bool); - @override - void notify() => super.noSuchMethod( - Invocation.method( - #notify, - [], - ), - returnValueForMissingStub: null, - ); - @override - void addListener(_i35.VoidCallback? listener) => super.noSuchMethod( - Invocation.method( - #addListener, - [listener], - ), - returnValueForMissingStub: null, - ); - @override - void removeListener(_i35.VoidCallback? listener) => super.noSuchMethod( - Invocation.method( - #removeListener, - [listener], - ), - returnValueForMissingStub: null, - ); - @override - void dispose() => super.noSuchMethod( - Invocation.method( - #dispose, - [], - ), - returnValueForMissingStub: null, - ); - @override - void notifyListeners() => super.noSuchMethod( - Invocation.method( - #notifyListeners, - [], - ), - returnValueForMissingStub: null, - ); -} - -/// A class which mocks [UrlLauncher]. -/// -/// See the documentation for Mockito's code generation for more information. -class MockUrlLauncher extends _i1.Mock implements _i88.UrlLauncher { - @override - _i15.MethodChannel get channel => (super.noSuchMethod( - Invocation.getter(#channel), - returnValue: _FakeMethodChannel_26( - this, - Invocation.getter(#channel), - ), - returnValueForMissingStub: _FakeMethodChannel_26( - this, - Invocation.getter(#channel), - ), - ) as _i15.MethodChannel); - @override - set channel(_i15.MethodChannel? _channel) => super.noSuchMethod( - Invocation.setter( - #channel, - _channel, - ), - returnValueForMissingStub: null, - ); - @override - _i8.Future canLaunch( - String? url, { - bool? excludeInstructure = true, - }) => - (super.noSuchMethod( - Invocation.method( - #canLaunch, - [url], - {#excludeInstructure: excludeInstructure}, - ), - returnValue: _i8.Future.value(), - returnValueForMissingStub: _i8.Future.value(), - ) as _i8.Future); - @override - _i8.Future launch( - String? url, { - bool? excludeInstructure = true, - }) => - (super.noSuchMethod( - Invocation.method( - #launch, - [url], - {#excludeInstructure: excludeInstructure}, - ), - returnValue: _i8.Future.value(), - returnValueForMissingStub: _i8.Future.value(), - ) as _i8.Future); - @override - _i8.Future launchAppStore() => (super.noSuchMethod( - Invocation.method( - #launchAppStore, - [], - ), - returnValue: _i8.Future.value(), - returnValueForMissingStub: _i8.Future.value(), - ) as _i8.Future); -} - -/// A class which mocks [UserColorsDb]. -/// -/// See the documentation for Mockito's code generation for more information. -class MockUserColorsDb extends _i1.Mock implements _i89.UserColorsDb { - @override - _i5.Database get db => (super.noSuchMethod( - Invocation.getter(#db), - returnValue: _FakeDatabase_3( - this, - Invocation.getter(#db), - ), - returnValueForMissingStub: _FakeDatabase_3( - this, - Invocation.getter(#db), - ), - ) as _i5.Database); - @override - set db(_i5.Database? _db) => super.noSuchMethod( - Invocation.setter( - #db, - _db, - ), - returnValueForMissingStub: null, - ); - @override - _i8.Future<_i90.UserColor?> getById(int? id) => (super.noSuchMethod( - Invocation.method( - #getById, - [id], - ), - returnValue: _i8.Future<_i90.UserColor?>.value(), - returnValueForMissingStub: _i8.Future<_i90.UserColor?>.value(), - ) as _i8.Future<_i90.UserColor?>); - @override - _i8.Future insertOrUpdateAll( - String? domain, - String? userId, - _i91.UserColors? colors, - ) => - (super.noSuchMethod( - Invocation.method( - #insertOrUpdateAll, - [ - domain, - userId, - colors, - ], - ), - returnValue: _i8.Future.value(), - returnValueForMissingStub: _i8.Future.value(), - ) as _i8.Future); - @override - _i8.Future<_i90.UserColor?> insertOrUpdate(_i90.UserColor? data) => - (super.noSuchMethod( - Invocation.method( - #insertOrUpdate, - [data], - ), - returnValue: _i8.Future<_i90.UserColor?>.value(), - returnValueForMissingStub: _i8.Future<_i90.UserColor?>.value(), - ) as _i8.Future<_i90.UserColor?>); - @override - _i8.Future<_i90.UserColor?> getByContext( - String? userDomain, - String? userId, - String? canvasContext, - ) => - (super.noSuchMethod( - Invocation.method( - #getByContext, - [ - userDomain, - userId, - canvasContext, - ], - ), - returnValue: _i8.Future<_i90.UserColor?>.value(), - returnValueForMissingStub: _i8.Future<_i90.UserColor?>.value(), - ) as _i8.Future<_i90.UserColor?>); - @override - _i8.Future deleteById(int? id) => (super.noSuchMethod( - Invocation.method( - #deleteById, - [id], - ), - returnValue: _i8.Future.value(0), - returnValueForMissingStub: _i8.Future.value(0), - ) as _i8.Future); - @override - _i8.Future deleteAllForUser( - String? userDomain, - String? userId, - ) => - (super.noSuchMethod( - Invocation.method( - #deleteAllForUser, - [ - userDomain, - userId, - ], - ), - returnValue: _i8.Future.value(0), - returnValueForMissingStub: _i8.Future.value(0), - ) as _i8.Future); -} - -/// A class which mocks [WebLoginInteractor]. -/// -/// See the documentation for Mockito's code generation for more information. -class MockWebLoginInteractor extends _i1.Mock - implements _i92.WebLoginInteractor { - @override - _i8.Future<_i44.MobileVerifyResult?> mobileVerify(String? domain) => - (super.noSuchMethod( - Invocation.method( - #mobileVerify, - [domain], - ), - returnValue: _i8.Future<_i44.MobileVerifyResult?>.value(), - returnValueForMissingStub: _i8.Future<_i44.MobileVerifyResult?>.value(), - ) as _i8.Future<_i44.MobileVerifyResult?>); - @override - _i8.Future performLogin( - _i44.MobileVerifyResult? result, - String? oAuthRequest, - ) => - (super.noSuchMethod( - Invocation.method( - #performLogin, - [ - result, - oAuthRequest, - ], - ), - returnValue: _i8.Future.value(), - returnValueForMissingStub: _i8.Future.value(), - ) as _i8.Future); -} - -/// A class which mocks [WebContentInteractor]. -/// -/// See the documentation for Mockito's code generation for more information. -class MockWebContentInteractor extends _i1.Mock - implements _i93.WebContentInteractor { - @override - _i8.Future getAuthUrl(String? targetUrl) => (super.noSuchMethod( - Invocation.method( - #getAuthUrl, - [targetUrl], - ), - returnValue: _i8.Future.value(''), - returnValueForMissingStub: _i8.Future.value(''), - ) as _i8.Future); - @override - _i16.JavascriptChannel ltiToolPressedChannel( - _i16.JavascriptMessageHandler? handler) => - (super.noSuchMethod( - Invocation.method( - #ltiToolPressedChannel, - [handler], - ), - returnValue: _FakeJavascriptChannel_27( - this, - Invocation.method( - #ltiToolPressedChannel, - [handler], - ), - ), - returnValueForMissingStub: _FakeJavascriptChannel_27( - this, - Invocation.method( - #ltiToolPressedChannel, - [handler], - ), - ), - ) as _i16.JavascriptChannel); -} - -/// A class which mocks [AlertThresholdsInteractor]. -/// -/// See the documentation for Mockito's code generation for more information. -class MockAlertThresholdsInteractor extends _i1.Mock - implements _i94.AlertThresholdsInteractor { - @override - _i8.Future?> getAlertThresholdsForStudent( - String? studentId, { - bool? forceRefresh = true, - }) => - (super.noSuchMethod( - Invocation.method( - #getAlertThresholdsForStudent, - [studentId], - {#forceRefresh: forceRefresh}, - ), - returnValue: _i8.Future?>.value(), - returnValueForMissingStub: - _i8.Future?>.value(), - ) as _i8.Future?>); - @override - _i8.Future<_i34.AlertThreshold?> updateAlertThreshold( - _i32.AlertType? type, - String? studentId, - _i34.AlertThreshold? threshold, { - String? value, - }) => - (super.noSuchMethod( - Invocation.method( - #updateAlertThreshold, - [ - type, - studentId, - threshold, - ], - {#value: value}, - ), - returnValue: _i8.Future<_i34.AlertThreshold?>.value(), - returnValueForMissingStub: _i8.Future<_i34.AlertThreshold?>.value(), - ) as _i8.Future<_i34.AlertThreshold?>); - @override - _i8.Future deleteStudent(String? studentId) => (super.noSuchMethod( - Invocation.method( - #deleteStudent, - [studentId], - ), - returnValue: _i8.Future.value(false), - returnValueForMissingStub: _i8.Future.value(false), - ) as _i8.Future); - @override - _i8.Future canDeleteStudent(String? studentId) => (super.noSuchMethod( - Invocation.method( - #canDeleteStudent, - [studentId], - ), - returnValue: _i8.Future.value(false), - returnValueForMissingStub: _i8.Future.value(false), - ) as _i8.Future); -} - -/// A class which mocks [AlertsInteractor]. -/// -/// See the documentation for Mockito's code generation for more information. -class MockAlertsInteractor extends _i1.Mock implements _i95.AlertsInteractor { - @override - _i8.Future<_i95.AlertsList?> getAlertsForStudent( - String? studentId, - bool? forceRefresh, - ) => - (super.noSuchMethod( - Invocation.method( - #getAlertsForStudent, - [ - studentId, - forceRefresh, - ], - ), - returnValue: _i8.Future<_i95.AlertsList?>.value(), - returnValueForMissingStub: _i8.Future<_i95.AlertsList?>.value(), - ) as _i8.Future<_i95.AlertsList?>); - @override - _i8.Future<_i32.Alert?> markAlertRead( - String? studentId, - String? alertId, - ) => - (super.noSuchMethod( - Invocation.method( - #markAlertRead, - [ - studentId, - alertId, - ], - ), - returnValue: _i8.Future<_i32.Alert?>.value(), - returnValueForMissingStub: _i8.Future<_i32.Alert?>.value(), - ) as _i8.Future<_i32.Alert?>); - @override - _i8.Future markAlertDismissed( - String? studentId, - String? alertId, - ) => - (super.noSuchMethod( - Invocation.method( - #markAlertDismissed, - [ - studentId, - alertId, - ], - ), - returnValue: _i8.Future.value(), - returnValueForMissingStub: _i8.Future.value(), - ) as _i8.Future); -} - -/// A class which mocks [AnnouncementDetailsInteractor]. -/// -/// See the documentation for Mockito's code generation for more information. -class MockAnnouncementDetailsInteractor extends _i1.Mock - implements _i96.AnnouncementDetailsInteractor { - @override - _i8.Future<_i97.AnnouncementViewState?> getAnnouncement( - String? announcementId, - _i98.AnnouncementType? type, - String? courseId, - String? institutionToolbarTitle, - bool? forceRefresh, - ) => - (super.noSuchMethod( - Invocation.method( - #getAnnouncement, - [ - announcementId, - type, - courseId, - institutionToolbarTitle, - forceRefresh, - ], - ), - returnValue: _i8.Future<_i97.AnnouncementViewState?>.value(), - returnValueForMissingStub: - _i8.Future<_i97.AnnouncementViewState?>.value(), - ) as _i8.Future<_i97.AnnouncementViewState?>); - @override - void viewAttachment( - _i17.BuildContext? context, - _i99.Attachment? attachment, - ) => - super.noSuchMethod( - Invocation.method( - #viewAttachment, - [ - context, - attachment, - ], - ), - returnValueForMissingStub: null, - ); -} - -/// A class which mocks [AnnouncementApi]. -/// -/// See the documentation for Mockito's code generation for more information. -class MockAnnouncementApi extends _i1.Mock implements _i100.AnnouncementApi { - @override - _i8.Future<_i101.Announcement?> getCourseAnnouncement( - String? courseId, - String? announcementId, - bool? forceRefresh, - ) => - (super.noSuchMethod( - Invocation.method( - #getCourseAnnouncement, - [ - courseId, - announcementId, - forceRefresh, - ], - ), - returnValue: _i8.Future<_i101.Announcement?>.value(), - returnValueForMissingStub: _i8.Future<_i101.Announcement?>.value(), - ) as _i8.Future<_i101.Announcement?>); - @override - _i8.Future<_i102.AccountNotification?> getAccountNotification( - String? accountNotificationId, - bool? forceRefresh, - ) => - (super.noSuchMethod( - Invocation.method( - #getAccountNotification, - [ - accountNotificationId, - forceRefresh, - ], - ), - returnValue: _i8.Future<_i102.AccountNotification?>.value(), - returnValueForMissingStub: - _i8.Future<_i102.AccountNotification?>.value(), - ) as _i8.Future<_i102.AccountNotification?>); -} - -/// A class which mocks [AcceptableUsePolicyInteractor]. -/// -/// See the documentation for Mockito's code generation for more information. -class MockAcceptableUsePolicyInteractor extends _i1.Mock - implements _i103.AcceptableUsePolicyInteractor { - @override - _i8.Future<_i25.TermsOfService?> getTermsOfService() => (super.noSuchMethod( - Invocation.method( - #getTermsOfService, - [], - ), - returnValue: _i8.Future<_i25.TermsOfService?>.value(), - returnValueForMissingStub: _i8.Future<_i25.TermsOfService?>.value(), - ) as _i8.Future<_i25.TermsOfService?>); - @override - _i8.Future<_i61.User?> acceptTermsOfUse() => (super.noSuchMethod( - Invocation.method( - #acceptTermsOfUse, - [], - ), - returnValue: _i8.Future<_i61.User?>.value(), - returnValueForMissingStub: _i8.Future<_i61.User?>.value(), - ) as _i8.Future<_i61.User?>); -} - -/// A class which mocks [PlannerApi]. -/// -/// See the documentation for Mockito's code generation for more information. -class MockPlannerApi extends _i1.Mock implements _i104.PlannerApi { - @override - _i8.Future?> getUserPlannerItems( - String? userId, - DateTime? startDay, - DateTime? endDay, { - Set? contexts = const {}, - bool? forceRefresh = false, - }) => - (super.noSuchMethod( - Invocation.method( - #getUserPlannerItems, - [ - userId, - startDay, - endDay, - ], - { - #contexts: contexts, - #forceRefresh: forceRefresh, - }, - ), - returnValue: _i8.Future?>.value(), - returnValueForMissingStub: _i8.Future?>.value(), - ) as _i8.Future?>); -} - -/// A class which mocks [HelpScreenInteractor]. -/// -/// See the documentation for Mockito's code generation for more information. -class MockHelpScreenInteractor extends _i1.Mock - implements _i106.HelpScreenInteractor { - @override - _i8.Future> getObserverCustomHelpLinks( - {bool? forceRefresh = false}) => - (super.noSuchMethod( - Invocation.method( - #getObserverCustomHelpLinks, - [], - {#forceRefresh: forceRefresh}, - ), - returnValue: _i8.Future>.value(<_i107.HelpLink>[]), - returnValueForMissingStub: - _i8.Future>.value(<_i107.HelpLink>[]), - ) as _i8.Future>); - @override - bool containsObserverLinks(_i108.BuiltList<_i107.HelpLink>? links) => - (super.noSuchMethod( - Invocation.method( - #containsObserverLinks, - [links], - ), - returnValue: false, - returnValueForMissingStub: false, - ) as bool); - @override - List<_i107.HelpLink> filterObserverLinks( - _i108.BuiltList<_i107.HelpLink>? list) => - (super.noSuchMethod( - Invocation.method( - #filterObserverLinks, - [list], - ), - returnValue: <_i107.HelpLink>[], - returnValueForMissingStub: <_i107.HelpLink>[], - ) as List<_i107.HelpLink>); -} - -/// A class which mocks [FileApi]. -/// -/// See the documentation for Mockito's code generation for more information. -class MockFileApi extends _i1.Mock implements _i109.FileApi { - @override - _i8.Future<_i99.Attachment?> uploadConversationFile( - _i10.File? file, - _i2.ProgressCallback? progressCallback, - ) => - (super.noSuchMethod( - Invocation.method( - #uploadConversationFile, - [ - file, - progressCallback, - ], - ), - returnValue: _i8.Future<_i99.Attachment?>.value(), - returnValueForMissingStub: _i8.Future<_i99.Attachment?>.value(), - ) as _i8.Future<_i99.Attachment?>); - @override - _i8.Future<_i10.File> downloadFile( - String? url, - String? savePath, { - _i2.CancelToken? cancelToken, - _i2.ProgressCallback? onProgress, - }) => - (super.noSuchMethod( - Invocation.method( - #downloadFile, - [ - url, - savePath, - ], - { - #cancelToken: cancelToken, - #onProgress: onProgress, - }, - ), - returnValue: _i8.Future<_i10.File>.value(_FakeFile_28( - this, - Invocation.method( - #downloadFile, - [ - url, - savePath, - ], - { - #cancelToken: cancelToken, - #onProgress: onProgress, - }, - ), - )), - returnValueForMissingStub: _i8.Future<_i10.File>.value(_FakeFile_28( - this, - Invocation.method( - #downloadFile, - [ - url, - savePath, - ], - { - #cancelToken: cancelToken, - #onProgress: onProgress, - }, - ), - )), - ) as _i8.Future<_i10.File>); - @override - _i8.Future deleteFile(String? fileId) => (super.noSuchMethod( - Invocation.method( - #deleteFile, - [fileId], - ), - returnValue: _i8.Future.value(), - returnValueForMissingStub: _i8.Future.value(), - ) as _i8.Future); -} - -/// A class which mocks [PathProviderVeneer]. -/// -/// See the documentation for Mockito's code generation for more information. -class MockPathProviderVeneer extends _i1.Mock - implements _i110.PathProviderVeneer { - @override - _i8.Future<_i10.Directory> getTemporaryDirectory() => (super.noSuchMethod( - Invocation.method( - #getTemporaryDirectory, - [], - ), - returnValue: _i8.Future<_i10.Directory>.value(_FakeDirectory_29( - this, - Invocation.method( - #getTemporaryDirectory, - [], - ), - )), - returnValueForMissingStub: - _i8.Future<_i10.Directory>.value(_FakeDirectory_29( - this, - Invocation.method( - #getTemporaryDirectory, - [], - ), - )), - ) as _i8.Future<_i10.Directory>); - @override - _i8.Future<_i10.Directory> getApplicationSupportDirectory() => - (super.noSuchMethod( - Invocation.method( - #getApplicationSupportDirectory, - [], - ), - returnValue: _i8.Future<_i10.Directory>.value(_FakeDirectory_29( - this, - Invocation.method( - #getApplicationSupportDirectory, - [], - ), - )), - returnValueForMissingStub: - _i8.Future<_i10.Directory>.value(_FakeDirectory_29( - this, - Invocation.method( - #getApplicationSupportDirectory, - [], - ), - )), - ) as _i8.Future<_i10.Directory>); - @override - _i8.Future<_i10.Directory> getLibraryDirectory() => (super.noSuchMethod( - Invocation.method( - #getLibraryDirectory, - [], - ), - returnValue: _i8.Future<_i10.Directory>.value(_FakeDirectory_29( - this, - Invocation.method( - #getLibraryDirectory, - [], - ), - )), - returnValueForMissingStub: - _i8.Future<_i10.Directory>.value(_FakeDirectory_29( - this, - Invocation.method( - #getLibraryDirectory, - [], - ), - )), - ) as _i8.Future<_i10.Directory>); - @override - _i8.Future<_i10.Directory> getApplicationDocumentsDirectory() => - (super.noSuchMethod( - Invocation.method( - #getApplicationDocumentsDirectory, - [], - ), - returnValue: _i8.Future<_i10.Directory>.value(_FakeDirectory_29( - this, - Invocation.method( - #getApplicationDocumentsDirectory, - [], - ), - )), - returnValueForMissingStub: - _i8.Future<_i10.Directory>.value(_FakeDirectory_29( - this, - Invocation.method( - #getApplicationDocumentsDirectory, - [], - ), - )), - ) as _i8.Future<_i10.Directory>); - @override - _i8.Future<_i10.Directory?> getExternalStorageDirectory() => - (super.noSuchMethod( - Invocation.method( - #getExternalStorageDirectory, - [], - ), - returnValue: _i8.Future<_i10.Directory?>.value(), - returnValueForMissingStub: _i8.Future<_i10.Directory?>.value(), - ) as _i8.Future<_i10.Directory?>); - @override - _i8.Future?> getExternalCacheDirectories() => - (super.noSuchMethod( - Invocation.method( - #getExternalCacheDirectories, - [], - ), - returnValue: _i8.Future?>.value(), - returnValueForMissingStub: _i8.Future?>.value(), - ) as _i8.Future?>); - @override - _i8.Future?> getExternalStorageDirectories( - {_i111.StorageDirectory? type}) => - (super.noSuchMethod( - Invocation.method( - #getExternalStorageDirectories, - [], - {#type: type}, - ), - returnValue: _i8.Future?>.value(), - returnValueForMissingStub: _i8.Future?>.value(), - ) as _i8.Future?>); -} - -/// A class which mocks [InboxCountNotifier]. -/// -/// See the documentation for Mockito's code generation for more information. -class MockInboxCountNotifier extends _i1.Mock - implements _i18.InboxCountNotifier { - @override - set value(int? newValue) => super.noSuchMethod( - Invocation.setter( - #value, - newValue, - ), - returnValueForMissingStub: null, - ); - @override - bool get hasListeners => (super.noSuchMethod( - Invocation.getter(#hasListeners), - returnValue: false, - returnValueForMissingStub: false, - ) as bool); - @override - void addListener(_i35.VoidCallback? listener) => super.noSuchMethod( - Invocation.method( - #addListener, - [listener], - ), - returnValueForMissingStub: null, - ); - @override - void removeListener(_i35.VoidCallback? listener) => super.noSuchMethod( - Invocation.method( - #removeListener, - [listener], - ), - returnValueForMissingStub: null, - ); - @override - void dispose() => super.noSuchMethod( - Invocation.method( - #dispose, - [], - ), - returnValueForMissingStub: null, - ); - @override - void notifyListeners() => super.noSuchMethod( - Invocation.method( - #notifyListeners, - [], - ), - returnValueForMissingStub: null, - ); -} - -/// A class which mocks [BuildContext]. -/// -/// See the documentation for Mockito's code generation for more information. -class MockBuildContext extends _i1.Mock implements _i17.BuildContext { - @override - _i17.Widget get widget => (super.noSuchMethod( - Invocation.getter(#widget), - returnValue: _FakeWidget_30( - this, - Invocation.getter(#widget), - ), - returnValueForMissingStub: _FakeWidget_30( - this, - Invocation.getter(#widget), - ), - ) as _i17.Widget); - @override - bool get mounted => (super.noSuchMethod( - Invocation.getter(#mounted), - returnValue: false, - returnValueForMissingStub: false, - ) as bool); - @override - bool get debugDoingBuild => (super.noSuchMethod( - Invocation.getter(#debugDoingBuild), - returnValue: false, - returnValueForMissingStub: false, - ) as bool); - @override - _i17.InheritedWidget dependOnInheritedElement( - _i17.InheritedElement? ancestor, { - Object? aspect, - }) => - (super.noSuchMethod( - Invocation.method( - #dependOnInheritedElement, - [ancestor], - {#aspect: aspect}, - ), - returnValue: _FakeInheritedWidget_31( - this, - Invocation.method( - #dependOnInheritedElement, - [ancestor], - {#aspect: aspect}, - ), - ), - returnValueForMissingStub: _FakeInheritedWidget_31( - this, - Invocation.method( - #dependOnInheritedElement, - [ancestor], - {#aspect: aspect}, - ), - ), - ) as _i17.InheritedWidget); - @override - void visitAncestorElements(_i17.ConditionalElementVisitor? visitor) => - super.noSuchMethod( - Invocation.method( - #visitAncestorElements, - [visitor], - ), - returnValueForMissingStub: null, - ); - @override - void visitChildElements(_i17.ElementVisitor? visitor) => super.noSuchMethod( - Invocation.method( - #visitChildElements, - [visitor], - ), - returnValueForMissingStub: null, - ); - @override - void dispatchNotification(_i17.Notification? notification) => - super.noSuchMethod( - Invocation.method( - #dispatchNotification, - [notification], - ), - returnValueForMissingStub: null, - ); - @override - _i11.DiagnosticsNode describeElement( - String? name, { - _i11.DiagnosticsTreeStyle? style = _i11.DiagnosticsTreeStyle.errorProperty, - }) => - (super.noSuchMethod( - Invocation.method( - #describeElement, - [name], - {#style: style}, - ), - returnValue: _FakeDiagnosticsNode_32( - this, - Invocation.method( - #describeElement, - [name], - {#style: style}, - ), - ), - returnValueForMissingStub: _FakeDiagnosticsNode_32( - this, - Invocation.method( - #describeElement, - [name], - {#style: style}, - ), - ), - ) as _i11.DiagnosticsNode); - @override - _i11.DiagnosticsNode describeWidget( - String? name, { - _i11.DiagnosticsTreeStyle? style = _i11.DiagnosticsTreeStyle.errorProperty, - }) => - (super.noSuchMethod( - Invocation.method( - #describeWidget, - [name], - {#style: style}, - ), - returnValue: _FakeDiagnosticsNode_32( - this, - Invocation.method( - #describeWidget, - [name], - {#style: style}, - ), - ), - returnValueForMissingStub: _FakeDiagnosticsNode_32( - this, - Invocation.method( - #describeWidget, - [name], - {#style: style}, - ), - ), - ) as _i11.DiagnosticsNode); - @override - List<_i11.DiagnosticsNode> describeMissingAncestor( - {required Type? expectedAncestorType}) => - (super.noSuchMethod( - Invocation.method( - #describeMissingAncestor, - [], - {#expectedAncestorType: expectedAncestorType}, - ), - returnValue: <_i11.DiagnosticsNode>[], - returnValueForMissingStub: <_i11.DiagnosticsNode>[], - ) as List<_i11.DiagnosticsNode>); - @override - _i11.DiagnosticsNode describeOwnershipChain(String? name) => - (super.noSuchMethod( - Invocation.method( - #describeOwnershipChain, - [name], - ), - returnValue: _FakeDiagnosticsNode_32( - this, - Invocation.method( - #describeOwnershipChain, - [name], - ), - ), - returnValueForMissingStub: _FakeDiagnosticsNode_32( - this, - Invocation.method( - #describeOwnershipChain, - [name], - ), - ), - ) as _i11.DiagnosticsNode); -} - -/// A class which mocks [ConversationDetailsInteractor]. -/// -/// See the documentation for Mockito's code generation for more information. -class MockConversationDetailsInteractor extends _i1.Mock - implements _i112.ConversationDetailsInteractor { - @override - _i8.Future<_i65.Conversation?> getConversation(String? id) => - (super.noSuchMethod( - Invocation.method( - #getConversation, - [id], - ), - returnValue: _i8.Future<_i65.Conversation?>.value(), - returnValueForMissingStub: _i8.Future<_i65.Conversation?>.value(), - ) as _i8.Future<_i65.Conversation?>); - @override - _i8.Future<_i65.Conversation?> addReply( - _i17.BuildContext? context, - _i65.Conversation? conversation, - _i113.Message? message, - bool? replyAll, - ) => - (super.noSuchMethod( - Invocation.method( - #addReply, - [ - context, - conversation, - message, - replyAll, - ], - ), - returnValue: _i8.Future<_i65.Conversation?>.value(), - returnValueForMissingStub: _i8.Future<_i65.Conversation?>.value(), - ) as _i8.Future<_i65.Conversation?>); - @override - _i8.Future viewAttachment( - _i17.BuildContext? context, - _i99.Attachment? attachment, - ) => - (super.noSuchMethod( - Invocation.method( - #viewAttachment, - [ - context, - attachment, - ], - ), - returnValue: _i8.Future.value(), - returnValueForMissingStub: _i8.Future.value(), - ) as _i8.Future); -} - -/// A class which mocks [ConversationListInteractor]. -/// -/// See the documentation for Mockito's code generation for more information. -class MockConversationListInteractor extends _i1.Mock - implements _i114.ConversationListInteractor { - @override - _i8.Future> getConversations( - {bool? forceRefresh = false}) => - (super.noSuchMethod( - Invocation.method( - #getConversations, - [], - {#forceRefresh: forceRefresh}, - ), - returnValue: - _i8.Future>.value(<_i65.Conversation>[]), - returnValueForMissingStub: - _i8.Future>.value(<_i65.Conversation>[]), - ) as _i8.Future>); - @override - _i8.Future?> getCoursesForCompose() => (super.noSuchMethod( - Invocation.method( - #getCoursesForCompose, - [], - ), - returnValue: _i8.Future?>.value(), - returnValueForMissingStub: _i8.Future?>.value(), - ) as _i8.Future?>); - @override - _i8.Future?> getStudentEnrollments() => - (super.noSuchMethod( - Invocation.method( - #getStudentEnrollments, - [], - ), - returnValue: _i8.Future?>.value(), - returnValueForMissingStub: _i8.Future?>.value(), - ) as _i8.Future?>); - @override - List<_i115.Tuple2<_i61.User, _i51.Course>> combineEnrollmentsAndCourses( - List<_i51.Course>? courses, - List<_i58.Enrollment>? enrollments, - ) => - (super.noSuchMethod( - Invocation.method( - #combineEnrollmentsAndCourses, - [ - courses, - enrollments, - ], - ), - returnValue: <_i115.Tuple2<_i61.User, _i51.Course>>[], - returnValueForMissingStub: <_i115.Tuple2<_i61.User, _i51.Course>>[], - ) as List<_i115.Tuple2<_i61.User, _i51.Course>>); -} - -/// A class which mocks [ConversationReplyInteractor]. -/// -/// See the documentation for Mockito's code generation for more information. -class MockConversationReplyInteractor extends _i1.Mock - implements _i116.ConversationReplyInteractor { - @override - _i8.Future<_i65.Conversation?> createReply( - _i65.Conversation? conversation, - _i113.Message? message, - String? body, - List? attachmentIds, - bool? replyAll, - ) => - (super.noSuchMethod( - Invocation.method( - #createReply, - [ - conversation, - message, - body, - attachmentIds, - replyAll, - ], - ), - returnValue: _i8.Future<_i65.Conversation?>.value(), - returnValueForMissingStub: _i8.Future<_i65.Conversation?>.value(), - ) as _i8.Future<_i65.Conversation?>); - @override - _i8.Future<_i66.AttachmentHandler?> addAttachment( - _i17.BuildContext? context) => - (super.noSuchMethod( - Invocation.method( - #addAttachment, - [context], - ), - returnValue: _i8.Future<_i66.AttachmentHandler?>.value(), - returnValueForMissingStub: _i8.Future<_i66.AttachmentHandler?>.value(), - ) as _i8.Future<_i66.AttachmentHandler?>); - @override - String getCurrentUserId() => (super.noSuchMethod( - Invocation.method( - #getCurrentUserId, - [], - ), - returnValue: '', - returnValueForMissingStub: '', - ) as String); -} - -/// A class which mocks [DomainSearchInteractor]. -/// -/// See the documentation for Mockito's code generation for more information. -class MockDomainSearchInteractor extends _i1.Mock - implements _i117.DomainSearchInteractor { - @override - _i8.Future?> performSearch(String? query) => - (super.noSuchMethod( - Invocation.method( - #performSearch, - [query], - ), - returnValue: _i8.Future?>.value(), - returnValueForMissingStub: _i8.Future?>.value(), - ) as _i8.Future?>); -} - -/// A class which mocks [DashboardInteractor]. -/// -/// See the documentation for Mockito's code generation for more information. -class MockDashboardInteractor extends _i1.Mock - implements _i118.DashboardInteractor { - @override - _i8.Future?> getStudents({bool? forceRefresh = false}) => - (super.noSuchMethod( - Invocation.method( - #getStudents, - [], - {#forceRefresh: forceRefresh}, - ), - returnValue: _i8.Future?>.value(), - returnValueForMissingStub: _i8.Future?>.value(), - ) as _i8.Future?>); - @override - _i8.Future<_i61.User?> getSelf({dynamic app}) => (super.noSuchMethod( - Invocation.method( - #getSelf, - [], - {#app: app}, - ), - returnValue: _i8.Future<_i61.User?>.value(), - returnValueForMissingStub: _i8.Future<_i61.User?>.value(), - ) as _i8.Future<_i61.User?>); - @override - void sortUsers(List<_i61.User>? users) => super.noSuchMethod( - Invocation.method( - #sortUsers, - [users], - ), - returnValueForMissingStub: null, - ); - @override - _i18.InboxCountNotifier getInboxCountNotifier() => (super.noSuchMethod( - Invocation.method( - #getInboxCountNotifier, - [], - ), - returnValue: _FakeInboxCountNotifier_33( - this, - Invocation.method( - #getInboxCountNotifier, - [], - ), - ), - returnValueForMissingStub: _FakeInboxCountNotifier_33( - this, - Invocation.method( - #getInboxCountNotifier, - [], - ), - ), - ) as _i18.InboxCountNotifier); - @override - _i19.AlertCountNotifier getAlertCountNotifier() => (super.noSuchMethod( - Invocation.method( - #getAlertCountNotifier, - [], - ), - returnValue: _FakeAlertCountNotifier_34( - this, - Invocation.method( - #getAlertCountNotifier, - [], - ), - ), - returnValueForMissingStub: _FakeAlertCountNotifier_34( - this, - Invocation.method( - #getAlertCountNotifier, - [], - ), - ), - ) as _i19.AlertCountNotifier); - @override - _i8.Future shouldShowOldReminderMessage() => (super.noSuchMethod( - Invocation.method( - #shouldShowOldReminderMessage, - [], - ), - returnValue: _i8.Future.value(), - returnValueForMissingStub: _i8.Future.value(), - ) as _i8.Future); - @override - _i8.Future<_i119.PermissionStatus> requestNotificationPermission() => - (super.noSuchMethod( - Invocation.method( - #requestNotificationPermission, - [], - ), - returnValue: _i8.Future<_i119.PermissionStatus>.value( - _i119.PermissionStatus.denied), - returnValueForMissingStub: _i8.Future<_i119.PermissionStatus>.value( - _i119.PermissionStatus.denied), - ) as _i8.Future<_i119.PermissionStatus>); -} - -/// A class which mocks [QRLoginTutorialScreenInteractor]. -/// -/// See the documentation for Mockito's code generation for more information. -class MockQRLoginTutorialScreenInteractor extends _i1.Mock - implements _i20.QRLoginTutorialScreenInteractor { - @override - _i8.Future<_i20.BarcodeScanResult> scan() => (super.noSuchMethod( - Invocation.method( - #scan, - [], - ), - returnValue: - _i8.Future<_i20.BarcodeScanResult>.value(_FakeBarcodeScanResult_35( - this, - Invocation.method( - #scan, - [], - ), - )), - returnValueForMissingStub: - _i8.Future<_i20.BarcodeScanResult>.value(_FakeBarcodeScanResult_35( - this, - Invocation.method( - #scan, - [], - ), - )), - ) as _i8.Future<_i20.BarcodeScanResult>); -} - -/// A class which mocks [ManageStudentsInteractor]. -/// -/// See the documentation for Mockito's code generation for more information. -class MockManageStudentsInteractor extends _i1.Mock - implements _i120.ManageStudentsInteractor { - @override - _i8.Future?> getStudents({bool? forceRefresh = false}) => - (super.noSuchMethod( - Invocation.method( - #getStudents, - [], - {#forceRefresh: forceRefresh}, - ), - returnValue: _i8.Future?>.value(), - returnValueForMissingStub: _i8.Future?>.value(), - ) as _i8.Future?>); - @override - void sortUsers(List<_i61.User>? users) => super.noSuchMethod( - Invocation.method( - #sortUsers, - [users], - ), - returnValueForMissingStub: null, - ); -} - -/// A class which mocks [StudentColorPickerInteractor]. -/// -/// See the documentation for Mockito's code generation for more information. -class MockStudentColorPickerInteractor extends _i1.Mock - implements _i121.StudentColorPickerInteractor { - @override - _i8.Future save( - String? studentId, - _i35.Color? newColor, - ) => - (super.noSuchMethod( - Invocation.method( - #save, - [ - studentId, - newColor, - ], - ), - returnValue: _i8.Future.value(), - returnValueForMissingStub: _i8.Future.value(), - ) as _i8.Future); -} - -/// A class which mocks [UserApi]. -/// -/// See the documentation for Mockito's code generation for more information. -class MockUserApi extends _i1.Mock implements _i122.UserApi { - @override - _i8.Future<_i61.User?> getSelf() => (super.noSuchMethod( - Invocation.method( - #getSelf, - [], - ), - returnValue: _i8.Future<_i61.User?>.value(), - returnValueForMissingStub: _i8.Future<_i61.User?>.value(), - ) as _i8.Future<_i61.User?>); - @override - _i8.Future<_i61.User?> getUserForDomain( - String? domain, - String? userId, - ) => - (super.noSuchMethod( - Invocation.method( - #getUserForDomain, - [ - domain, - userId, - ], - ), - returnValue: _i8.Future<_i61.User?>.value(), - returnValueForMissingStub: _i8.Future<_i61.User?>.value(), - ) as _i8.Future<_i61.User?>); - @override - _i8.Future<_i61.UserPermission?> getSelfPermissions() => (super.noSuchMethod( - Invocation.method( - #getSelfPermissions, - [], - ), - returnValue: _i8.Future<_i61.UserPermission?>.value(), - returnValueForMissingStub: _i8.Future<_i61.UserPermission?>.value(), - ) as _i8.Future<_i61.UserPermission?>); - @override - _i8.Future<_i91.UserColors?> getUserColors({bool? refresh = false}) => - (super.noSuchMethod( - Invocation.method( - #getUserColors, - [], - {#refresh: refresh}, - ), - returnValue: _i8.Future<_i91.UserColors?>.value(), - returnValueForMissingStub: _i8.Future<_i91.UserColors?>.value(), - ) as _i8.Future<_i91.UserColors?>); - @override - _i8.Future<_i61.User?> acceptUserTermsOfUse() => (super.noSuchMethod( - Invocation.method( - #acceptUserTermsOfUse, - [], - ), - returnValue: _i8.Future<_i61.User?>.value(), - returnValueForMissingStub: _i8.Future<_i61.User?>.value(), - ) as _i8.Future<_i61.User?>); - @override - _i8.Future<_i123.ColorChangeResponse?> setUserColor( - String? contextId, - _i35.Color? color, - ) => - (super.noSuchMethod( - Invocation.method( - #setUserColor, - [ - contextId, - color, - ], - ), - returnValue: _i8.Future<_i123.ColorChangeResponse?>.value(), - returnValueForMissingStub: - _i8.Future<_i123.ColorChangeResponse?>.value(), - ) as _i8.Future<_i123.ColorChangeResponse?>); -} - -/// A class which mocks [MasqueradeScreenInteractor]. -/// -/// See the documentation for Mockito's code generation for more information. -class MockMasqueradeScreenInteractor extends _i1.Mock - implements _i124.MasqueradeScreenInteractor { - @override - _i8.Future startMasquerading( - String? masqueradingUserId, - String? masqueradingDomain, - ) => - (super.noSuchMethod( - Invocation.method( - #startMasquerading, - [ - masqueradingUserId, - masqueradingDomain, - ], - ), - returnValue: _i8.Future.value(false), - returnValueForMissingStub: _i8.Future.value(false), - ) as _i8.Future); - @override - String sanitizeDomain(String? domain) => (super.noSuchMethod( - Invocation.method( - #sanitizeDomain, - [domain], - ), - returnValue: '', - returnValueForMissingStub: '', - ) as String); -} - -/// A class which mocks [SettingsInteractor]. -/// -/// See the documentation for Mockito's code generation for more information. -class MockSettingsInteractor extends _i1.Mock - implements _i125.SettingsInteractor { - @override - bool isDebugMode() => (super.noSuchMethod( - Invocation.method( - #isDebugMode, - [], - ), - returnValue: false, - returnValueForMissingStub: false, - ) as bool); - @override - void routeToThemeViewer(_i17.BuildContext? context) => super.noSuchMethod( - Invocation.method( - #routeToThemeViewer, - [context], - ), - returnValueForMissingStub: null, - ); - @override - void routeToRemoteConfig(_i17.BuildContext? context) => super.noSuchMethod( - Invocation.method( - #routeToRemoteConfig, - [context], - ), - returnValueForMissingStub: null, - ); - @override - void routeToLegal(_i17.BuildContext? context) => super.noSuchMethod( - Invocation.method( - #routeToLegal, - [context], - ), - returnValueForMissingStub: null, - ); - @override - void toggleDarkMode( - _i17.BuildContext? context, - _i17.GlobalKey<_i17.State<_i17.StatefulWidget>>? anchorKey, - ) => - super.noSuchMethod( - Invocation.method( - #toggleDarkMode, - [ - context, - anchorKey, - ], - ), - returnValueForMissingStub: null, - ); - @override - void toggleHCMode(dynamic context) => super.noSuchMethod( - Invocation.method( - #toggleHCMode, - [context], - ), - returnValueForMissingStub: null, - ); - @override - void showAboutDialog(dynamic context) => super.noSuchMethod( - Invocation.method( - #showAboutDialog, - [context], - ), - returnValueForMissingStub: null, - ); -} - -/// A class which mocks [FeaturesApi]. -/// -/// See the documentation for Mockito's code generation for more information. -class MockFeaturesApi extends _i1.Mock implements _i126.FeaturesApi { - @override - _i8.Future<_i127.FeatureFlags?> getFeatureFlags() => (super.noSuchMethod( - Invocation.method( - #getFeatureFlags, - [], - ), - returnValue: _i8.Future<_i127.FeatureFlags?>.value(), - returnValueForMissingStub: _i8.Future<_i127.FeatureFlags?>.value(), - ) as _i8.Future<_i127.FeatureFlags?>); -} - -/// A class which mocks [SplashScreenInteractor]. -/// -/// See the documentation for Mockito's code generation for more information. -class MockSplashScreenInteractor extends _i1.Mock - implements _i128.SplashScreenInteractor { - @override - _i8.Future<_i128.SplashScreenData?> getData({String? qrLoginUrl}) => - (super.noSuchMethod( - Invocation.method( - #getData, - [], - {#qrLoginUrl: qrLoginUrl}, - ), - returnValue: _i8.Future<_i128.SplashScreenData?>.value(), - returnValueForMissingStub: _i8.Future<_i128.SplashScreenData?>.value(), - ) as _i8.Future<_i128.SplashScreenData?>); - @override - _i8.Future updateUserColors() => (super.noSuchMethod( - Invocation.method( - #updateUserColors, - [], - ), - returnValue: _i8.Future.value(), - returnValueForMissingStub: _i8.Future.value(), - ) as _i8.Future); - @override - _i8.Future getCameraCount() => (super.noSuchMethod( - Invocation.method( - #getCameraCount, - [], - ), - returnValue: _i8.Future.value(0), - returnValueForMissingStub: _i8.Future.value(0), - ) as _i8.Future); - @override - _i8.Future isTermsAcceptanceRequired() => (super.noSuchMethod( - Invocation.method( - #isTermsAcceptanceRequired, - [], - ), - returnValue: _i8.Future.value(), - returnValueForMissingStub: _i8.Future.value(), - ) as _i8.Future); -} - -/// A class which mocks [AttachmentFetcherInteractor]. -/// -/// See the documentation for Mockito's code generation for more information. -class MockAttachmentFetcherInteractor extends _i1.Mock - implements _i129.AttachmentFetcherInteractor { - @override - _i8.Future<_i10.File> fetchAttachmentFile( - _i99.Attachment? attachment, - _i2.CancelToken? cancelToken, - ) => - (super.noSuchMethod( - Invocation.method( - #fetchAttachmentFile, - [ - attachment, - cancelToken, - ], - ), - returnValue: _i8.Future<_i10.File>.value(_FakeFile_28( - this, - Invocation.method( - #fetchAttachmentFile, - [ - attachment, - cancelToken, - ], - ), - )), - returnValueForMissingStub: _i8.Future<_i10.File>.value(_FakeFile_28( - this, - Invocation.method( - #fetchAttachmentFile, - [ - attachment, - cancelToken, - ], - ), - )), - ) as _i8.Future<_i10.File>); - @override - _i8.Future getAttachmentSavePath(_i99.Attachment? attachment) => - (super.noSuchMethod( - Invocation.method( - #getAttachmentSavePath, - [attachment], - ), - returnValue: _i8.Future.value(''), - returnValueForMissingStub: _i8.Future.value(''), - ) as _i8.Future); - @override - _i2.CancelToken generateCancelToken() => (super.noSuchMethod( - Invocation.method( - #generateCancelToken, - [], - ), - returnValue: _FakeCancelToken_36( - this, - Invocation.method( - #generateCancelToken, - [], - ), - ), - returnValueForMissingStub: _FakeCancelToken_36( - this, - Invocation.method( - #generateCancelToken, - [], - ), - ), - ) as _i2.CancelToken); -} - -/// A class which mocks [CancelToken]. -/// -/// See the documentation for Mockito's code generation for more information. -class MockCancelToken extends _i1.Mock implements _i2.CancelToken { - @override - set requestOptions(_i2.RequestOptions? _requestOptions) => super.noSuchMethod( - Invocation.setter( - #requestOptions, - _requestOptions, - ), - returnValueForMissingStub: null, - ); - @override - bool get isCancelled => (super.noSuchMethod( - Invocation.getter(#isCancelled), - returnValue: false, - returnValueForMissingStub: false, - ) as bool); - @override - _i8.Future<_i2.DioError> get whenCancel => (super.noSuchMethod( - Invocation.getter(#whenCancel), - returnValue: _i8.Future<_i2.DioError>.value(_FakeDioError_37( - this, - Invocation.getter(#whenCancel), - )), - returnValueForMissingStub: - _i8.Future<_i2.DioError>.value(_FakeDioError_37( - this, - Invocation.getter(#whenCancel), - )), - ) as _i8.Future<_i2.DioError>); - @override - void cancel([dynamic reason]) => super.noSuchMethod( - Invocation.method( - #cancel, - [reason], - ), - returnValueForMissingStub: null, - ); -} - -/// A class which mocks [AudioVideoAttachmentViewerInteractor]. -/// -/// See the documentation for Mockito's code generation for more information. -class MockAudioVideoAttachmentViewerInteractor extends _i1.Mock - implements _i130.AudioVideoAttachmentViewerInteractor { - @override - _i21.VideoPlayerController? makeController(String? url) => - (super.noSuchMethod( - Invocation.method( - #makeController, - [url], - ), - returnValueForMissingStub: null, - ) as _i21.VideoPlayerController?); -} - -/// A class which mocks [VideoPlayerController]. -/// -/// See the documentation for Mockito's code generation for more information. -class MockVideoPlayerController extends _i1.Mock - implements _i21.VideoPlayerController { - @override - String get dataSource => (super.noSuchMethod( - Invocation.getter(#dataSource), - returnValue: '', - returnValueForMissingStub: '', - ) as String); - @override - Map get httpHeaders => (super.noSuchMethod( - Invocation.getter(#httpHeaders), - returnValue: {}, - returnValueForMissingStub: {}, - ) as Map); - @override - _i21.DataSourceType get dataSourceType => (super.noSuchMethod( - Invocation.getter(#dataSourceType), - returnValue: _i21.DataSourceType.asset, - returnValueForMissingStub: _i21.DataSourceType.asset, - ) as _i21.DataSourceType); - @override - int get textureId => (super.noSuchMethod( - Invocation.getter(#textureId), - returnValue: 0, - returnValueForMissingStub: 0, - ) as int); - @override - _i8.Future get position => (super.noSuchMethod( - Invocation.getter(#position), - returnValue: _i8.Future.value(), - returnValueForMissingStub: _i8.Future.value(), - ) as _i8.Future); - @override - _i21.VideoPlayerValue get value => (super.noSuchMethod( - Invocation.getter(#value), - returnValue: _FakeVideoPlayerValue_38( - this, - Invocation.getter(#value), - ), - returnValueForMissingStub: _FakeVideoPlayerValue_38( - this, - Invocation.getter(#value), - ), - ) as _i21.VideoPlayerValue); - @override - set value(_i21.VideoPlayerValue? newValue) => super.noSuchMethod( - Invocation.setter( - #value, - newValue, - ), - returnValueForMissingStub: null, - ); - @override - bool get hasListeners => (super.noSuchMethod( - Invocation.getter(#hasListeners), - returnValue: false, - returnValueForMissingStub: false, - ) as bool); - @override - _i8.Future initialize() => (super.noSuchMethod( - Invocation.method( - #initialize, - [], - ), - returnValue: _i8.Future.value(), - returnValueForMissingStub: _i8.Future.value(), - ) as _i8.Future); - @override - _i8.Future dispose() => (super.noSuchMethod( - Invocation.method( - #dispose, - [], - ), - returnValue: _i8.Future.value(), - returnValueForMissingStub: _i8.Future.value(), - ) as _i8.Future); - @override - _i8.Future play() => (super.noSuchMethod( - Invocation.method( - #play, - [], - ), - returnValue: _i8.Future.value(), - returnValueForMissingStub: _i8.Future.value(), - ) as _i8.Future); - @override - _i8.Future setLooping(bool? looping) => (super.noSuchMethod( - Invocation.method( - #setLooping, - [looping], - ), - returnValue: _i8.Future.value(), - returnValueForMissingStub: _i8.Future.value(), - ) as _i8.Future); - @override - _i8.Future pause() => (super.noSuchMethod( - Invocation.method( - #pause, - [], - ), - returnValue: _i8.Future.value(), - returnValueForMissingStub: _i8.Future.value(), - ) as _i8.Future); - @override - _i8.Future seekTo(Duration? position) => (super.noSuchMethod( - Invocation.method( - #seekTo, - [position], - ), - returnValue: _i8.Future.value(), - returnValueForMissingStub: _i8.Future.value(), - ) as _i8.Future); - @override - _i8.Future setVolume(double? volume) => (super.noSuchMethod( - Invocation.method( - #setVolume, - [volume], - ), - returnValue: _i8.Future.value(), - returnValueForMissingStub: _i8.Future.value(), - ) as _i8.Future); - @override - _i8.Future setPlaybackSpeed(double? speed) => (super.noSuchMethod( - Invocation.method( - #setPlaybackSpeed, - [speed], - ), - returnValue: _i8.Future.value(), - returnValueForMissingStub: _i8.Future.value(), - ) as _i8.Future); - @override - void setCaptionOffset(Duration? offset) => super.noSuchMethod( - Invocation.method( - #setCaptionOffset, - [offset], - ), - returnValueForMissingStub: null, - ); - @override - _i8.Future setClosedCaptionFile( - _i8.Future<_i21.ClosedCaptionFile>? closedCaptionFile) => - (super.noSuchMethod( - Invocation.method( - #setClosedCaptionFile, - [closedCaptionFile], - ), - returnValue: _i8.Future.value(), - returnValueForMissingStub: _i8.Future.value(), - ) as _i8.Future); - @override - void removeListener(_i35.VoidCallback? listener) => super.noSuchMethod( - Invocation.method( - #removeListener, - [listener], - ), - returnValueForMissingStub: null, - ); - @override - void addListener(_i35.VoidCallback? listener) => super.noSuchMethod( - Invocation.method( - #addListener, - [listener], - ), - returnValueForMissingStub: null, - ); - @override - void notifyListeners() => super.noSuchMethod( - Invocation.method( - #notifyListeners, - [], - ), - returnValueForMissingStub: null, - ); -} - -/// A class which mocks [PermissionHandler]. -/// -/// See the documentation for Mockito's code generation for more information. -class MockPermissionHandler extends _i1.Mock - implements _i131.PermissionHandler { - @override - _i8.Future<_i119.PermissionStatus> checkPermissionStatus( - _i119.Permission? permission) => - (super.noSuchMethod( - Invocation.method( - #checkPermissionStatus, - [permission], - ), - returnValue: _i8.Future<_i119.PermissionStatus>.value( - _i119.PermissionStatus.denied), - returnValueForMissingStub: _i8.Future<_i119.PermissionStatus>.value( - _i119.PermissionStatus.denied), - ) as _i8.Future<_i119.PermissionStatus>); - @override - _i8.Future<_i119.PermissionStatus> requestPermission( - _i119.Permission? permission) => - (super.noSuchMethod( - Invocation.method( - #requestPermission, - [permission], - ), - returnValue: _i8.Future<_i119.PermissionStatus>.value( - _i119.PermissionStatus.denied), - returnValueForMissingStub: _i8.Future<_i119.PermissionStatus>.value( - _i119.PermissionStatus.denied), - ) as _i8.Future<_i119.PermissionStatus>); -} - -/// A class which mocks [FlutterDownloaderVeneer]. -/// -/// See the documentation for Mockito's code generation for more information. -class MockFlutterDownloaderVeneer extends _i1.Mock - implements _i132.FlutterDownloaderVeneer { - @override - _i8.Future enqueue({ - required String? url, - required String? savedDir, - String? fileName, - bool? showNotification = true, - bool? openFileFromNotification = true, - bool? requiresStorageNotLow = true, - bool? saveInPublicStorage = true, - }) => - (super.noSuchMethod( - Invocation.method( - #enqueue, - [], - { - #url: url, - #savedDir: savedDir, - #fileName: fileName, - #showNotification: showNotification, - #openFileFromNotification: openFileFromNotification, - #requiresStorageNotLow: requiresStorageNotLow, - #saveInPublicStorage: saveInPublicStorage, - }, - ), - returnValue: _i8.Future.value(), - returnValueForMissingStub: _i8.Future.value(), - ) as _i8.Future); - @override - _i8.Future?> loadTasks() => (super.noSuchMethod( - Invocation.method( - #loadTasks, - [], - ), - returnValue: _i8.Future?>.value(), - returnValueForMissingStub: - _i8.Future?>.value(), - ) as _i8.Future?>); -} - -/// A class which mocks [ViewAttachmentInteractor]. -/// -/// See the documentation for Mockito's code generation for more information. -class MockViewAttachmentInteractor extends _i1.Mock - implements _i134.ViewAttachmentInteractor { - @override - _i8.Future openExternally(_i99.Attachment? attachment) => - (super.noSuchMethod( - Invocation.method( - #openExternally, - [attachment], - ), - returnValue: _i8.Future.value(), - returnValueForMissingStub: _i8.Future.value(), - ) as _i8.Future); - @override - _i8.Future downloadFile(_i99.Attachment? attachment) => - (super.noSuchMethod( - Invocation.method( - #downloadFile, - [attachment], - ), - returnValue: _i8.Future.value(), - returnValueForMissingStub: _i8.Future.value(), - ) as _i8.Future); -} - -/// A class which mocks [AuthenticationInterceptor]. -/// -/// See the documentation for Mockito's code generation for more information. -class MockAuthenticationInterceptor extends _i1.Mock - implements _i135.AuthenticationInterceptor { - @override - _i8.Future onError( - _i2.DioError? error, - _i2.ErrorInterceptorHandler? handler, - ) => - (super.noSuchMethod( - Invocation.method( - #onError, - [ - error, - handler, - ], - ), - returnValue: _i8.Future.value(), - returnValueForMissingStub: _i8.Future.value(), - ) as _i8.Future); - @override - void onRequest( - _i2.RequestOptions? options, - _i2.RequestInterceptorHandler? handler, - ) => - super.noSuchMethod( - Invocation.method( - #onRequest, - [ - options, - handler, - ], - ), - returnValueForMissingStub: null, - ); - @override - void onResponse( - _i2.Response? response, - _i2.ResponseInterceptorHandler? handler, - ) => - super.noSuchMethod( - Invocation.method( - #onResponse, - [ - response, - handler, - ], - ), - returnValueForMissingStub: null, - ); -} - -/// A class which mocks [ErrorInterceptorHandler]. -/// -/// See the documentation for Mockito's code generation for more information. -class MockErrorInterceptorHandler extends _i1.Mock - implements _i2.ErrorInterceptorHandler { - @override - _i8.Future<_i22.InterceptorState> get future => (super.noSuchMethod( - Invocation.getter(#future), - returnValue: _i8.Future<_i22.InterceptorState>.value( - _FakeInterceptorState_39( - this, - Invocation.getter(#future), - )), - returnValueForMissingStub: - _i8.Future<_i22.InterceptorState>.value( - _FakeInterceptorState_39( - this, - Invocation.getter(#future), - )), - ) as _i8.Future<_i22.InterceptorState>); - @override - bool get isCompleted => (super.noSuchMethod( - Invocation.getter(#isCompleted), - returnValue: false, - returnValueForMissingStub: false, - ) as bool); - @override - void next(_i2.DioError? err) => super.noSuchMethod( - Invocation.method( - #next, - [err], - ), - returnValueForMissingStub: null, - ); - @override - void resolve(_i2.Response? response) => super.noSuchMethod( - Invocation.method( - #resolve, - [response], - ), - returnValueForMissingStub: null, - ); - @override - void reject(_i2.DioError? error) => super.noSuchMethod( - Invocation.method( - #reject, - [error], - ), - returnValueForMissingStub: null, - ); -} - -/// A class which mocks [AttachmentPickerInteractor]. -/// -/// See the documentation for Mockito's code generation for more information. -class MockAttachmentPickerInteractor extends _i1.Mock - implements _i136.AttachmentPickerInteractor { - @override - _i8.Future<_i10.File?> getImageFromCamera() => (super.noSuchMethod( - Invocation.method( - #getImageFromCamera, - [], - ), - returnValue: _i8.Future<_i10.File?>.value(), - returnValueForMissingStub: _i8.Future<_i10.File?>.value(), - ) as _i8.Future<_i10.File?>); - @override - _i8.Future<_i10.File?> getFileFromDevice() => (super.noSuchMethod( - Invocation.method( - #getFileFromDevice, - [], - ), - returnValue: _i8.Future<_i10.File?>.value(), - returnValueForMissingStub: _i8.Future<_i10.File?>.value(), - ) as _i8.Future<_i10.File?>); - @override - _i8.Future<_i10.File?> getImageFromGallery() => (super.noSuchMethod( - Invocation.method( - #getImageFromGallery, - [], - ), - returnValue: _i8.Future<_i10.File?>.value(), - returnValueForMissingStub: _i8.Future<_i10.File?>.value(), - ) as _i8.Future<_i10.File?>); -} - -/// A class which mocks [AttachmentHandler]. -/// -/// See the documentation for Mockito's code generation for more information. -class MockAttachmentHandler extends _i1.Mock implements _i66.AttachmentHandler { - @override - set onStageChange( - dynamic Function(_i66.AttachmentUploadStage)? _onStageChange) => - super.noSuchMethod( - Invocation.setter( - #onStageChange, - _onStageChange, - ), - returnValueForMissingStub: null, - ); - @override - set progress(double? _progress) => super.noSuchMethod( - Invocation.setter( - #progress, - _progress, - ), - returnValueForMissingStub: null, - ); - @override - set attachment(_i99.Attachment? _attachment) => super.noSuchMethod( - Invocation.setter( - #attachment, - _attachment, - ), - returnValueForMissingStub: null, - ); - @override - _i66.AttachmentUploadStage get stage => (super.noSuchMethod( - Invocation.getter(#stage), - returnValue: _i66.AttachmentUploadStage.CREATED, - returnValueForMissingStub: _i66.AttachmentUploadStage.CREATED, - ) as _i66.AttachmentUploadStage); - @override - set stage(_i66.AttachmentUploadStage? stage) => super.noSuchMethod( - Invocation.setter( - #stage, - stage, - ), - returnValueForMissingStub: null, - ); - @override - String get displayName => (super.noSuchMethod( - Invocation.getter(#displayName), - returnValue: '', - returnValueForMissingStub: '', - ) as String); - @override - bool get hasListeners => (super.noSuchMethod( - Invocation.getter(#hasListeners), - returnValue: false, - returnValueForMissingStub: false, - ) as bool); - @override - _i8.Future performUpload() => (super.noSuchMethod( - Invocation.method( - #performUpload, - [], - ), - returnValue: _i8.Future.value(), - returnValueForMissingStub: _i8.Future.value(), - ) as _i8.Future); - @override - _i8.Future cleanUpFile() => (super.noSuchMethod( - Invocation.method( - #cleanUpFile, - [], - ), - returnValue: _i8.Future.value(), - returnValueForMissingStub: _i8.Future.value(), - ) as _i8.Future); - @override - _i8.Future deleteAttachment() => (super.noSuchMethod( - Invocation.method( - #deleteAttachment, - [], - ), - returnValue: _i8.Future.value(), - returnValueForMissingStub: _i8.Future.value(), - ) as _i8.Future); - @override - void addListener(_i35.VoidCallback? listener) => super.noSuchMethod( - Invocation.method( - #addListener, - [listener], - ), - returnValueForMissingStub: null, - ); - @override - void removeListener(_i35.VoidCallback? listener) => super.noSuchMethod( - Invocation.method( - #removeListener, - [listener], - ), - returnValueForMissingStub: null, - ); - @override - void dispose() => super.noSuchMethod( - Invocation.method( - #dispose, - [], - ), - returnValueForMissingStub: null, - ); - @override - void notifyListeners() => super.noSuchMethod( - Invocation.method( - #notifyListeners, - [], - ), - returnValueForMissingStub: null, - ); -} - -/// A class which mocks [OldAppMigration]. -/// -/// See the documentation for Mockito's code generation for more information. -class MockOldAppMigration extends _i1.Mock implements _i137.OldAppMigration { - @override - _i8.Future performMigrationIfNecessary() => (super.noSuchMethod( - Invocation.method( - #performMigrationIfNecessary, - [], - ), - returnValue: _i8.Future.value(), - returnValueForMissingStub: _i8.Future.value(), - ) as _i8.Future); - @override - _i8.Future hasOldReminders() => (super.noSuchMethod( - Invocation.method( - #hasOldReminders, - [], - ), - returnValue: _i8.Future.value(false), - returnValueForMissingStub: _i8.Future.value(false), - ) as _i8.Future); -} - -/// A class which mocks [HelpLinksApi]. -/// -/// See the documentation for Mockito's code generation for more information. -class MockHelpLinksApi extends _i1.Mock implements _i138.HelpLinksApi { - @override - _i8.Future<_i139.HelpLinks?> getHelpLinks({dynamic forceRefresh = false}) => - (super.noSuchMethod( - Invocation.method( - #getHelpLinks, - [], - {#forceRefresh: forceRefresh}, - ), - returnValue: _i8.Future<_i139.HelpLinks?>.value(), - returnValueForMissingStub: _i8.Future<_i139.HelpLinks?>.value(), - ) as _i8.Future<_i139.HelpLinks?>); -} - -/// A class which mocks [RemoteConfigInteractor]. -/// -/// See the documentation for Mockito's code generation for more information. -class MockRemoteConfigInteractor extends _i1.Mock - implements _i140.RemoteConfigInteractor { - @override - Map<_i141.RemoteConfigParams, String> getRemoteConfigParams() => - (super.noSuchMethod( - Invocation.method( - #getRemoteConfigParams, - [], - ), - returnValue: <_i141.RemoteConfigParams, String>{}, - returnValueForMissingStub: <_i141.RemoteConfigParams, String>{}, - ) as Map<_i141.RemoteConfigParams, String>); - @override - void updateRemoteConfig( - _i141.RemoteConfigParams? rcKey, - String? value, - ) => - super.noSuchMethod( - Invocation.method( - #updateRemoteConfig, - [ - rcKey, - value, - ], - ), - returnValueForMissingStub: null, - ); -} - -/// A class which mocks [WebViewPlatformController]. -/// -/// See the documentation for Mockito's code generation for more information. -class MockWebViewPlatformController extends _i1.Mock - implements _i16.WebViewPlatformController { - @override - _i8.Future loadFile(String? absoluteFilePath) => (super.noSuchMethod( - Invocation.method( - #loadFile, - [absoluteFilePath], - ), - returnValue: _i8.Future.value(), - returnValueForMissingStub: _i8.Future.value(), - ) as _i8.Future); - @override - _i8.Future loadFlutterAsset(String? key) => (super.noSuchMethod( - Invocation.method( - #loadFlutterAsset, - [key], - ), - returnValue: _i8.Future.value(), - returnValueForMissingStub: _i8.Future.value(), - ) as _i8.Future); - @override - _i8.Future loadHtmlString( - String? html, { - String? baseUrl, - }) => - (super.noSuchMethod( - Invocation.method( - #loadHtmlString, - [html], - {#baseUrl: baseUrl}, - ), - returnValue: _i8.Future.value(), - returnValueForMissingStub: _i8.Future.value(), - ) as _i8.Future); - @override - _i8.Future loadUrl( - String? url, - Map? headers, - ) => - (super.noSuchMethod( - Invocation.method( - #loadUrl, - [ - url, - headers, - ], - ), - returnValue: _i8.Future.value(), - returnValueForMissingStub: _i8.Future.value(), - ) as _i8.Future); - @override - _i8.Future loadRequest(_i16.WebViewRequest? request) => - (super.noSuchMethod( - Invocation.method( - #loadRequest, - [request], - ), - returnValue: _i8.Future.value(), - returnValueForMissingStub: _i8.Future.value(), - ) as _i8.Future); - @override - _i8.Future updateSettings(_i16.WebSettings? setting) => - (super.noSuchMethod( - Invocation.method( - #updateSettings, - [setting], - ), - returnValue: _i8.Future.value(), - returnValueForMissingStub: _i8.Future.value(), - ) as _i8.Future); - @override - _i8.Future currentUrl() => (super.noSuchMethod( - Invocation.method( - #currentUrl, - [], - ), - returnValue: _i8.Future.value(), - returnValueForMissingStub: _i8.Future.value(), - ) as _i8.Future); - @override - _i8.Future canGoBack() => (super.noSuchMethod( - Invocation.method( - #canGoBack, - [], - ), - returnValue: _i8.Future.value(false), - returnValueForMissingStub: _i8.Future.value(false), - ) as _i8.Future); - @override - _i8.Future canGoForward() => (super.noSuchMethod( - Invocation.method( - #canGoForward, - [], - ), - returnValue: _i8.Future.value(false), - returnValueForMissingStub: _i8.Future.value(false), - ) as _i8.Future); - @override - _i8.Future goBack() => (super.noSuchMethod( - Invocation.method( - #goBack, - [], - ), - returnValue: _i8.Future.value(), - returnValueForMissingStub: _i8.Future.value(), - ) as _i8.Future); - @override - _i8.Future goForward() => (super.noSuchMethod( - Invocation.method( - #goForward, - [], - ), - returnValue: _i8.Future.value(), - returnValueForMissingStub: _i8.Future.value(), - ) as _i8.Future); - @override - _i8.Future reload() => (super.noSuchMethod( - Invocation.method( - #reload, - [], - ), - returnValue: _i8.Future.value(), - returnValueForMissingStub: _i8.Future.value(), - ) as _i8.Future); - @override - _i8.Future clearCache() => (super.noSuchMethod( - Invocation.method( - #clearCache, - [], - ), - returnValue: _i8.Future.value(), - returnValueForMissingStub: _i8.Future.value(), - ) as _i8.Future); - @override - _i8.Future evaluateJavascript(String? javascript) => - (super.noSuchMethod( - Invocation.method( - #evaluateJavascript, - [javascript], - ), - returnValue: _i8.Future.value(''), - returnValueForMissingStub: _i8.Future.value(''), - ) as _i8.Future); - @override - _i8.Future runJavascript(String? javascript) => (super.noSuchMethod( - Invocation.method( - #runJavascript, - [javascript], - ), - returnValue: _i8.Future.value(), - returnValueForMissingStub: _i8.Future.value(), - ) as _i8.Future); - @override - _i8.Future runJavascriptReturningResult(String? javascript) => - (super.noSuchMethod( - Invocation.method( - #runJavascriptReturningResult, - [javascript], - ), - returnValue: _i8.Future.value(''), - returnValueForMissingStub: _i8.Future.value(''), - ) as _i8.Future); - @override - _i8.Future addJavascriptChannels(Set? javascriptChannelNames) => - (super.noSuchMethod( - Invocation.method( - #addJavascriptChannels, - [javascriptChannelNames], - ), - returnValue: _i8.Future.value(), - returnValueForMissingStub: _i8.Future.value(), - ) as _i8.Future); - @override - _i8.Future removeJavascriptChannels( - Set? javascriptChannelNames) => - (super.noSuchMethod( - Invocation.method( - #removeJavascriptChannels, - [javascriptChannelNames], - ), - returnValue: _i8.Future.value(), - returnValueForMissingStub: _i8.Future.value(), - ) as _i8.Future); - @override - _i8.Future getTitle() => (super.noSuchMethod( - Invocation.method( - #getTitle, - [], - ), - returnValue: _i8.Future.value(), - returnValueForMissingStub: _i8.Future.value(), - ) as _i8.Future); - @override - _i8.Future scrollTo( - int? x, - int? y, - ) => - (super.noSuchMethod( - Invocation.method( - #scrollTo, - [ - x, - y, - ], - ), - returnValue: _i8.Future.value(), - returnValueForMissingStub: _i8.Future.value(), - ) as _i8.Future); - @override - _i8.Future scrollBy( - int? x, - int? y, - ) => - (super.noSuchMethod( - Invocation.method( - #scrollBy, - [ - x, - y, - ], - ), - returnValue: _i8.Future.value(), - returnValueForMissingStub: _i8.Future.value(), - ) as _i8.Future); - @override - _i8.Future getScrollX() => (super.noSuchMethod( - Invocation.method( - #getScrollX, - [], - ), - returnValue: _i8.Future.value(0), - returnValueForMissingStub: _i8.Future.value(0), - ) as _i8.Future); - @override - _i8.Future getScrollY() => (super.noSuchMethod( - Invocation.method( - #getScrollY, - [], - ), - returnValue: _i8.Future.value(0), - returnValueForMissingStub: _i8.Future.value(0), - ) as _i8.Future); -} - -/// A class which mocks [WebViewPlatform]. -/// -/// See the documentation for Mockito's code generation for more information. -class MockWebViewPlatform extends _i1.Mock implements _i16.WebViewPlatform { - @override - _i17.Widget build({ - required _i17.BuildContext? context, - required _i16.CreationParams? creationParams, - required _i16.WebViewPlatformCallbacksHandler? - webViewPlatformCallbacksHandler, - required _i16.JavascriptChannelRegistry? javascriptChannelRegistry, - _i16.WebViewPlatformCreatedCallback? onWebViewPlatformCreated, - Set<_i11.Factory<_i142.OneSequenceGestureRecognizer>>? gestureRecognizers, - }) => - (super.noSuchMethod( - Invocation.method( - #build, - [], - { - #context: context, - #creationParams: creationParams, - #webViewPlatformCallbacksHandler: webViewPlatformCallbacksHandler, - #javascriptChannelRegistry: javascriptChannelRegistry, - #onWebViewPlatformCreated: onWebViewPlatformCreated, - #gestureRecognizers: gestureRecognizers, - }, - ), - returnValue: _FakeWidget_30( - this, - Invocation.method( - #build, - [], - { - #context: context, - #creationParams: creationParams, - #webViewPlatformCallbacksHandler: webViewPlatformCallbacksHandler, - #javascriptChannelRegistry: javascriptChannelRegistry, - #onWebViewPlatformCreated: onWebViewPlatformCreated, - #gestureRecognizers: gestureRecognizers, - }, - ), - ), - returnValueForMissingStub: _FakeWidget_30( - this, - Invocation.method( - #build, - [], - { - #context: context, - #creationParams: creationParams, - #webViewPlatformCallbacksHandler: webViewPlatformCallbacksHandler, - #javascriptChannelRegistry: javascriptChannelRegistry, - #onWebViewPlatformCreated: onWebViewPlatformCreated, - #gestureRecognizers: gestureRecognizers, - }, - ), - ), - ) as _i17.Widget); - @override - _i8.Future clearCookies() => (super.noSuchMethod( - Invocation.method( - #clearCookies, - [], - ), - returnValue: _i8.Future.value(false), - returnValueForMissingStub: _i8.Future.value(false), - ) as _i8.Future); -} diff --git a/apps/flutter_parent/test/utils/test_utils.dart b/apps/flutter_parent/test/utils/test_utils.dart deleted file mode 100644 index 77de22075d..0000000000 --- a/apps/flutter_parent/test/utils/test_utils.dart +++ /dev/null @@ -1,88 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:flutter/widgets.dart'; -import 'package:flutter_test/flutter_test.dart'; - -enum ScreenVerticalLocation { TOP, MID_TOP, CENTER, MID_BOTTOM, BOTTOM } - -double _getScreenHeightOffset(WidgetTester tester, ScreenVerticalLocation location) { - final screenHeight = tester.binding.window.physicalSize.height / tester.binding.window.devicePixelRatio; - - double result = 0.0; - switch (location) { - case ScreenVerticalLocation.TOP: - result = 0.0; - break; - case ScreenVerticalLocation.MID_TOP: - result = screenHeight / 4; - break; - case ScreenVerticalLocation.CENTER: - result = screenHeight / 2; - break; - case ScreenVerticalLocation.MID_BOTTOM: - result = screenHeight * 3 / 4; - break; - case ScreenVerticalLocation.BOTTOM: - result = screenHeight - 1; - } - - return result; -} - -/// Adapted from https://github.com/flutter/flutter/issues/17668 -/// -/// Scrolls until [finder] finds a single [Widget]. -/// -/// This helper is only required because [WidgetTester.ensureVisible] does not yet work for items that are scrolled -/// out of view in a [ListView]. See https://github.com/flutter/flutter/issues/17668. Once that issue is resolved, -/// we should be able to remove this altogether. -/// -/// On top of that, this would ideally be an extension method against [WidgetTester], but at the time of writing, -/// extension methods are not yet available in the stable channel. -Future ensureVisibleByScrolling( - Finder finder, - WidgetTester widgetTester, { - required ScreenVerticalLocation scrollFrom, - Offset scrollBy = const Offset(0, -50), - int maxScrolls = 100, -}) async { - - final scrollFromY = _getScreenHeightOffset(widgetTester, scrollFrom); - final gesture = await widgetTester.startGesture(Offset(0, scrollFromY)); - - Widget? foundWidget; - - for (var i = 0; i < maxScrolls; ++i) { - await gesture.moveBy(scrollBy); - await widgetTester.pump(); - final widgets = widgetTester.widgetList(finder); - - if (widgets.length == 1) { - foundWidget = widgets.first; - break; - } - } - - await gesture.cancel(); - - expect(foundWidget, isNotNull); - - // Just because we found the widget, doesn't mean it's visible. It could be off-stage. But now we can at least use the standard - // ensureVisible method to bring it on-screen. - await widgetTester.ensureVisible(finder); - // Attempting to bring the widget on-screen may result in it being scrolled too far up in a list, in which case it will bounce back - // once the gesture above completes. We need to pump for long enough for the bounce-back animation to complete. - await widgetTester.pump(const Duration(seconds: 1)); -} diff --git a/apps/flutter_parent/test/utils/url_launcher_test.dart b/apps/flutter_parent/test/utils/url_launcher_test.dart deleted file mode 100644 index 1772335891..0000000000 --- a/apps/flutter_parent/test/utils/url_launcher_test.dart +++ /dev/null @@ -1,47 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:flutter_parent/utils/url_launcher.dart'; -import 'package:flutter_test/flutter_test.dart'; -import 'package:flutter_test/src/deprecated.dart'; - -void main() { - TestWidgetsFlutterBinding.ensureInitialized(); - - test('launch passes correct parameters to channel', () async { - UrlLauncher launcher = UrlLauncher(); - String expectedUrl = 'www.instructure.com'; - bool expectedExclude = true; - - launcher.channel.setMockMethodCallHandler((call) async { - expect(call.method, UrlLauncher.launchMethod); - expect(call.arguments['url'], expectedUrl); - expect(call.arguments['excludeInstructure'], expectedExclude); - }); - await launcher.launch(expectedUrl, excludeInstructure: expectedExclude); - }); - - test('canLaunch passes correct parameters to channel', () async { - UrlLauncher launcher = UrlLauncher(); - String expectedUrl = 'www.instructure.com'; - bool expectedExclude = true; - - launcher.channel.setMockMethodCallHandler((call) async { - expect(call.method, UrlLauncher.canLaunchMethod); - expect(call.arguments['url'], expectedUrl); - expect(call.arguments['excludeInstructure'], expectedExclude); - }); - await launcher.canLaunch(expectedUrl, excludeInstructure: expectedExclude); - }); -} diff --git a/apps/flutter_parent/test/utils/veneer/android_intent_veneer_test.dart b/apps/flutter_parent/test/utils/veneer/android_intent_veneer_test.dart deleted file mode 100644 index a1dd626d1b..0000000000 --- a/apps/flutter_parent/test/utils/veneer/android_intent_veneer_test.dart +++ /dev/null @@ -1,89 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -import 'dart:async'; - -import 'package:flutter/services.dart'; -import 'package:flutter_parent/utils/veneers/android_intent_veneer.dart'; -import 'package:flutter_test/src/deprecated.dart'; -import 'package:test/test.dart'; - -import '../test_app.dart'; - -// TODO Fix test -// We shouldn't test the platform channel interactions, instead we should test how we interact with the library. -void main() { - setUp(() { - setupPlatformChannels(); - }); - - test('launch email with body calls a platform channel', () async { - final subject = 'subject here'; - final emailBody = 'multi\r\nline\r\nbody\r\n'; - final completer = Completer(); - - MethodChannel('intent').setMockMethodCallHandler((MethodCall call) async { - expect(call.method, 'startActivity'); - expect(call.arguments['action'], 'android.intent.action.SENDTO'); - expect(call.arguments['data'], 'mailto:'); - expect(call.arguments['extra'], { - 'android.intent.extra.EMAIL': ['mobilesupport@instructure.com'], // By default this is used - 'android.intent.extra.SUBJECT': subject, - 'android.intent.extra.TEXT': emailBody, - }); - - completer.complete(); // Finish the completer so the test can finish - return null; - }); - - AndroidIntentVeneer().launchEmailWithBody(subject, emailBody); - - await completer.future; // Wait for the completer to finish the test - }, skip: true); - - test('launch telephone uri', () async { - var telUri = 'tel:+123'; - final completer = Completer(); - - MethodChannel('intent').setMockMethodCallHandler((MethodCall call) async { - expect(call.method, 'startActivity'); - expect(call.arguments['action'], 'android.intent.action.DIAL'); - expect(call.arguments['data'], Uri.parse(telUri).toString()); - - completer.complete(); // Finish the completer so the test can finish - return null; - }); - - AndroidIntentVeneer().launchPhone(telUri); - - await completer.future; // Wait for the completer to finish the test - }, skip: true); - - test('launches email uri', () async { - var mailto = 'mailto:pandas@instructure.com'; - final completer = Completer(); - - MethodChannel('intent').setMockMethodCallHandler((MethodCall call) async { - expect(call.method, 'startActivity'); - expect(call.arguments['action'], 'android.intent.action.SENDTO'); - expect(call.arguments['data'], Uri.parse(mailto).toString()); - - completer.complete(); // Finish the completer so the test can finish - return null; - }); - - AndroidIntentVeneer().launchEmail(mailto); - - await completer.future; - }, skip: true); -} diff --git a/apps/flutter_parent/test/utils/widgets/avatar_test.dart b/apps/flutter_parent/test/utils/widgets/avatar_test.dart deleted file mode 100644 index 568c4fcc85..0000000000 --- a/apps/flutter_parent/test/utils/widgets/avatar_test.dart +++ /dev/null @@ -1,88 +0,0 @@ -// Copyright (C) 2019 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:flutter_parent/utils/common_widgets/avatar.dart'; -import 'package:flutter_test/flutter_test.dart'; - -import '../accessibility_utils.dart'; -import '../network_image_response.dart'; -import '../test_app.dart'; - -void main() { - mockNetworkImageResponse(); - - test('Question mark when short name is empty or null', () { - var blank = ''; - String? nullName = null; - - expect(Avatar.getUserInitials(blank), equals('?')); - expect(Avatar.getUserInitials(nullName), equals('?')); - }); - - test('Two initials when exactly two initials in short name', () { - var name = 'Canvas Instructure'; - - expect(Avatar.getUserInitials(name), equals('CI')); - }); - - test('One initial when more or less than two initials in short name', () { - var more = 'Canvas by Instructure'; - var less = 'Canvas'; - - expect(Avatar.getUserInitials(more), equals('C')); - expect(Avatar.getUserInitials(less), equals('C')); - }); - - /// This test is currently disabled due to the complexity of mocking CachedNetworkImage's dependencies. - /*testWidgetsWithAccessibilityChecks('Displays avatar when there is a url', (tester) async { - var avatarUrl = 'http://www.instructure.com'; - - await tester.pumpWidget(TestApp(Avatar( - avatarUrl, - ))); - - await tester.pumpAndSettle(); - - expect(find.byType(CachedNetworkImage), findsOneWidget); - });*/ - - testWidgetsWithAccessibilityChecks('Displays initials when there is no avatar url', (tester) async { - var avatarUrl = null; - var name = 'Canvas Instructure'; - - await tester.pumpWidget(TestApp(Avatar( - avatarUrl, - name: name, - ))); - - await tester.pumpAndSettle(); - - expect(find.text('CI'), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('Does not display initials when showInitials is false', (tester) async { - var avatarUrl = null; - var name = 'Canvas Instructure'; - - await tester.pumpWidget(TestApp(Avatar( - avatarUrl, - name: name, - showInitials: false, - ))); - - await tester.pumpAndSettle(); - - expect(find.text('CI'), findsNothing); - }); -} diff --git a/apps/flutter_parent/test/utils/widgets/badges_test.dart b/apps/flutter_parent/test/utils/widgets/badges_test.dart deleted file mode 100644 index 42378a6a35..0000000000 --- a/apps/flutter_parent/test/utils/widgets/badges_test.dart +++ /dev/null @@ -1,279 +0,0 @@ -// Copyright (C) 2019 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:flutter/material.dart'; -import 'package:flutter_parent/utils/common_widgets/badges.dart'; -import 'package:flutter_parent/utils/design/parent_colors.dart'; -import 'package:flutter_parent/utils/design/parent_theme.dart'; -import 'package:flutter_parent/utils/design/student_color_set.dart'; -import 'package:flutter_test/flutter_test.dart'; - -import '../accessibility_utils.dart'; -import '../test_app.dart'; - -void main() { - testWidgetsWithAccessibilityChecks('shows an indicator badge that is the student color', (tester) async { - setupTestLocator((_) {}); - - await tester.pumpWidget(TestApp(IndicatorBadge())); - await tester.pumpAndSettle(); - - var decoration = (tester.widgetList(find.byType(Container)).last as Container).decoration as BoxDecoration; - expect(decoration.color, StudentColorSet.all[0].light); - - var state = tester.state(find.byType(MaterialApp)); - ParentTheme.of(state.context)?.setSelectedStudent('1'); - await tester.pumpAndSettle(); - - decoration = (tester.widgetList(find.byType(Container)).last as Container).decoration as BoxDecoration; - expect(decoration.color, StudentColorSet.all[1].light); - }); - - group('NumberBadge', () { - testWidgetsWithAccessibilityChecks('shows a number', (tester) async { - await tester.pumpWidget(TestApp(NumberBadge(options: BadgeOptions(count: 1)))); - await tester.pumpAndSettle(); - - expect(find.text('1'), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('shows a number and a plus if less than the max count', (tester) async { - await tester.pumpWidget(TestApp( - NumberBadge(options: BadgeOptions(count: 123, maxCount: 99)), - )); - await tester.pumpAndSettle(); - - expect(find.text('99+'), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('shows a large number when the max count is null', (tester) async { - await tester.pumpWidget(TestApp( - NumberBadge(options: BadgeOptions(count: 987654321, maxCount: null)), - )); - await tester.pumpAndSettle(); - - expect(find.text('987654321'), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('shows no text when count is zero', (tester) async { - await tester.pumpWidget(TestApp(NumberBadge(options: BadgeOptions(count: 0)))); - await tester.pumpAndSettle(); - - expect(find.text('0'), findsNothing); - }); - - testWidgetsWithAccessibilityChecks('shows no text when count is null', (tester) async { - await tester.pumpWidget(TestApp(NumberBadge(options: BadgeOptions(count: null)))); - await tester.pumpAndSettle(); - - expect(find.text('null'), findsNothing); - }); - - testWidgetsWithAccessibilityChecks('updates text when listenable updates', (tester) async { - final listenable = ValueNotifier(1); - - await tester.pumpWidget(TestApp(NumberBadge(listenable: listenable))); - await tester.pumpAndSettle(); - - expect(find.text('1'), findsOneWidget); - - listenable.value = 2; - await tester.pump(); - expect(find.text('2'), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('does not display border when disabled', (tester) async { - await tester.pumpWidget(TestApp(NumberBadge(options: BadgeOptions(count: 1, includeBorder: false)))); - await tester.pump(); - - final border = tester.widget(find.byKey(NumberBadge.borderKey)) as Container; - - // For ease, border is always getting shown, but with zero padding when 'hidden' - expect(border.padding, EdgeInsets.zero); - expect(find.byKey(NumberBadge.backgroundKey), findsOneWidget); - expect(find.text('1'), findsOneWidget); - }); - }); - - group('Colors', () { - testWidgetsWithAccessibilityChecks('has a white border with a blue background', (tester) async { - await tester.pumpWidget(TestApp(NumberBadge(options: BadgeOptions(count: 1, includeBorder: true)))); - await tester.pump(); - - final border = tester.widget(find.byKey(NumberBadge.borderKey)) as Container; - final background = tester.widget(find.byKey(NumberBadge.backgroundKey)) as Container; - final text = tester.widget(find.text('1')) as Text; - - expect((border.decoration as BoxDecoration).color, Colors.white); - expect((background.decoration as BoxDecoration).color, StudentColorSet.electric.light); - expect(text.style?.color, Colors.white); - }); - - testWidgetsWithAccessibilityChecks('has a white border with a high contrast blue background', (tester) async { - await tester.pumpWidget(TestApp( - NumberBadge(options: BadgeOptions(count: 1, includeBorder: true)), - highContrast: true, - )); - await tester.pump(); - - final border = tester.widget(find.byKey(NumberBadge.borderKey)) as Container; - final background = tester.widget(find.byKey(NumberBadge.backgroundKey)) as Container; - final text = tester.widget(find.text('1')) as Text; - - expect((border.decoration as BoxDecoration).color, Colors.white); - expect((background.decoration as BoxDecoration).color, StudentColorSet.electric.lightHC); - expect(text.style?.color, Colors.white); - }); - - testWidgetsWithAccessibilityChecks('has a black border with a blue background in dark mode', (tester) async { - await tester.pumpWidget(TestApp( - NumberBadge(options: BadgeOptions(count: 1, includeBorder: true)), - darkMode: true, - )); - await tester.pump(); - - final border = tester.widget(find.byKey(NumberBadge.borderKey)) as Container; - final background = tester.widget(find.byKey(NumberBadge.backgroundKey)) as Container; - final text = tester.widget(find.text('1')) as Text; - - expect((border.decoration as BoxDecoration).color, Colors.black); - expect((background.decoration as BoxDecoration).color, StudentColorSet.electric.dark); - expect(text.style?.color, Colors.black); - }); - - testWidgetsWithAccessibilityChecks('has a black border with a high contrast blue background in dark mode', - (tester) async { - await tester.pumpWidget(TestApp( - NumberBadge(options: BadgeOptions(count: 1, includeBorder: true)), - darkMode: true, - highContrast: true, - )); - await tester.pump(); - - final border = tester.widget(find.byKey(NumberBadge.borderKey)) as Container; - final background = tester.widget(find.byKey(NumberBadge.backgroundKey)) as Container; - final text = tester.widget(find.text('1')) as Text; - - expect((border.decoration as BoxDecoration).color, Colors.black); - expect((background.decoration as BoxDecoration).color, StudentColorSet.electric.darkHC); - expect(text.style?.color, Colors.black); - }); - - // HAMBURGER TESTS - testWidgetsWithAccessibilityChecks('hamburger has a blue border with a white background', (tester) async { - await tester.pumpWidget(TestApp( - NumberBadge(options: BadgeOptions(count: 1, includeBorder: true, onPrimarySurface: true)), - )); - await tester.pump(); - - final border = tester.widget(find.byKey(NumberBadge.borderKey)) as Container; - final background = tester.widget(find.byKey(NumberBadge.backgroundKey)) as Container; - final text = tester.widget(find.text('1')) as Text; - - expect((border.decoration as BoxDecoration).color, StudentColorSet.electric.light); - expect((background.decoration as BoxDecoration).color, Colors.white); - expect(text.style?.color, StudentColorSet.electric.light); - }); - - testWidgetsWithAccessibilityChecks('hamburger has a high contrast blue border with a white background', - (tester) async { - await tester.pumpWidget(TestApp( - NumberBadge(options: BadgeOptions(count: 1, includeBorder: true, onPrimarySurface: true)), - highContrast: true, - )); - await tester.pump(); - - final border = tester.widget(find.byKey(NumberBadge.borderKey)) as Container; - final background = tester.widget(find.byKey(NumberBadge.backgroundKey)) as Container; - final text = tester.widget(find.text('1')) as Text; - - expect((border.decoration as BoxDecoration).color, StudentColorSet.electric.lightHC); - expect((background.decoration as BoxDecoration).color, Colors.white); - expect(text.style?.color, StudentColorSet.electric.lightHC); - }); - - testWidgetsWithAccessibilityChecks('hamburger has a black border with a tiara background in dark mode', - (tester) async { - await tester.pumpWidget(TestApp( - NumberBadge(options: BadgeOptions(count: 1, includeBorder: true, onPrimarySurface: true)), - darkMode: true, - )); - await tester.pump(); - - final border = tester.widget(find.byKey(NumberBadge.borderKey)) as Container; - final background = tester.widget(find.byKey(NumberBadge.backgroundKey)) as Container; - final text = tester.widget(find.text('1')) as Text; - - expect((border.decoration as BoxDecoration).color, Colors.black); - expect((background.decoration as BoxDecoration).color, ParentColors.tiara); - expect(text.style?.color, Colors.black); - }); - - testWidgetsWithAccessibilityChecks('hamburger has a black border with a tiara background in dark mode and HC', - (tester) async { - await tester.pumpWidget(TestApp( - NumberBadge(options: BadgeOptions(count: 1, includeBorder: true, onPrimarySurface: true)), - darkMode: true, - )); - await tester.pump(); - - final border = tester.widget(find.byKey(NumberBadge.borderKey)) as Container; - final background = tester.widget(find.byKey(NumberBadge.backgroundKey)) as Container; - final text = tester.widget(find.text('1')) as Text; - - expect((border.decoration as BoxDecoration).color, Colors.black); - expect((background.decoration as BoxDecoration).color, ParentColors.tiara); - expect(text.style?.color, Colors.black); - }); - }); - - group('WidgetBadge', () { - testWidgetsWithAccessibilityChecks('shows the widget passed in', (tester) async { - final child = Icon(Icons.error); - await tester.pumpWidget(TestApp(WidgetBadge(child))); - await tester.pumpAndSettle(); - - expect(find.byType(Icon), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('shows an indicator badge with no count or listenable', (tester) async { - final child = Icon(Icons.error); - await tester.pumpWidget(TestApp(WidgetBadge(child))); - await tester.pumpAndSettle(); - - expect(find.byType(IndicatorBadge), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('shows a number badge with no count but has a listenable', (tester) async { - final child = Icon(Icons.error); - final listenable = ValueNotifier(1); - - await tester.pumpWidget(TestApp(WidgetBadge(child, countListenable: listenable))); - await tester.pumpAndSettle(); - - expect(find.byType(NumberBadge), findsOneWidget); - expect(find.text('1'), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('shows a number badge with no listenable but has a count', (tester) async { - final child = Icon(Icons.error); - - await tester.pumpWidget(TestApp(WidgetBadge(child, options: BadgeOptions(count: 1)))); - await tester.pumpAndSettle(); - - expect(find.byType(NumberBadge), findsOneWidget); - expect(find.text('1'), findsOneWidget); - }); - }); -} diff --git a/apps/flutter_parent/test/utils/widgets/empty_panda_widget_test.dart b/apps/flutter_parent/test/utils/widgets/empty_panda_widget_test.dart deleted file mode 100644 index d54b7d171b..0000000000 --- a/apps/flutter_parent/test/utils/widgets/empty_panda_widget_test.dart +++ /dev/null @@ -1,147 +0,0 @@ -// Copyright (C) 2019 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:flutter/material.dart'; -import 'package:flutter_parent/utils/common_widgets/empty_panda_widget.dart'; -import 'package:flutter_svg/flutter_svg.dart'; -import 'package:flutter_test/flutter_test.dart'; - -import '../accessibility_utils.dart'; -import '../test_app.dart'; - -void main() { - final svgPath = 'assets/svg/panda-space-no-assignments.svg'; - final title = 'title'; - final subtitle = 'subtitle'; - final buttonText = 'Click me'; - - testWidgetsWithAccessibilityChecks('shows an svg', (tester) async { - await tester.pumpWidget(_testableWidget(EmptyPandaWidget(svgPath: svgPath))); - await tester.pumpAndSettle(); - - expect(find.byType(SvgPicture), findsOneWidget); - expect(find.byType(Text), findsNothing); - }); - - testWidgetsWithAccessibilityChecks('shows a title', (tester) async { - await tester.pumpWidget(_testableWidget(EmptyPandaWidget(title: title))); - await tester.pumpAndSettle(); - - expect(find.byType(SvgPicture), findsNothing); - expect(find.byType(Text), findsOneWidget); - expect(find.text(title), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('shows a subtitle', (tester) async { - await tester.pumpWidget(_testableWidget(EmptyPandaWidget(subtitle: subtitle))); - await tester.pumpAndSettle(); - - expect(find.byType(SvgPicture), findsNothing); - expect(find.byType(Text), findsOneWidget); - expect(find.text(subtitle), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('shows a button', (tester) async { - await tester.pumpWidget(_testableWidget(EmptyPandaWidget(buttonText: buttonText))); - await tester.pumpAndSettle(); - - expect(find.widgetWithText(TextButton, buttonText), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('tapping button invokes callback', (tester) async { - var called = false; - await tester.pumpWidget( - _testableWidget(EmptyPandaWidget(buttonText: buttonText, onButtonTap: () => called = true)), - ); - await tester.pumpAndSettle(); - - expect(find.widgetWithText(TextButton, buttonText), findsOneWidget); - await tester.tap(find.text(buttonText)); - expect(called, isTrue); - }); - - // TODO Fix test - testWidgetsWithAccessibilityChecks('shows an svg and a title', (tester) async { - await tester.pumpWidget(_testableWidget(EmptyPandaWidget(svgPath: svgPath, title: title))); - await tester.pumpAndSettle(); - - expect(find.byType(SvgPicture), findsOneWidget); - expect(find.byType(SizedBox), findsOneWidget); // The spacing between the svg and the title - expect(find.byType(Text), findsOneWidget); - expect(find.text(title), findsOneWidget); - }, skip: true); - - // TODO Fix test - testWidgetsWithAccessibilityChecks('shows an svg and a subtitle', (tester) async { - await tester.pumpWidget(_testableWidget(EmptyPandaWidget(svgPath: svgPath, subtitle: subtitle))); - await tester.pumpAndSettle(); - - expect(find.byType(SvgPicture), findsOneWidget); - expect(find.byType(SizedBox), findsOneWidget); // The spacing between the svg and the subtitle - expect(find.byType(Text), findsOneWidget); - expect(find.text(subtitle), findsOneWidget); - }, skip: true); - - testWidgetsWithAccessibilityChecks('shows a title and a subtitle', (tester) async { - await tester.pumpWidget(_testableWidget(EmptyPandaWidget(title: title, subtitle: subtitle))); - await tester.pumpAndSettle(); - - expect(find.byType(SizedBox), findsOneWidget); // The spacing between the title and the subtitle - expect(find.byType(Text), findsNWidgets(2)); - expect(find.text(title), findsOneWidget); - expect(find.text(subtitle), findsOneWidget); - }); - - // TODO Fix test - testWidgetsWithAccessibilityChecks('shows an svg, a title, and a subtitle', (tester) async { - await tester.pumpWidget(_testableWidget(EmptyPandaWidget(svgPath: svgPath, title: title, subtitle: subtitle))); - await tester.pumpAndSettle(); - - expect(find.byType(SvgPicture), findsOneWidget); - expect(find.byType(SizedBox), findsNWidgets(2)); // Between the svg and title, as well as title and subtitle - expect(find.byType(Text), findsNWidgets(2)); - expect(find.text(title), findsOneWidget); - expect(find.text(subtitle), findsOneWidget); - }, skip: true); - - // TODO Fix test - testWidgetsWithAccessibilityChecks('shows an svg, title, subtitle, and button', (tester) async { - await tester.pumpWidget(_testableWidget(EmptyPandaWidget( - svgPath: svgPath, - title: title, - subtitle: subtitle, - buttonText: buttonText, - ))); - await tester.pumpAndSettle(); - - expect(find.byType(SvgPicture), findsOneWidget); - expect(find.byType(SizedBox), findsNWidgets(2)); // Between the svg and title, as well as title and subtitle - expect(find.byType(Text), findsNWidgets(3)); - expect(find.text(title), findsOneWidget); - expect(find.text(subtitle), findsOneWidget); - expect(find.widgetWithText(TextButton, buttonText), findsOneWidget); - }, skip: true); - - testWidgetsWithAccessibilityChecks('shows a header', (tester) async { - await tester.pumpWidget(_testableWidget(EmptyPandaWidget(header: Text('h')))); - await tester.pumpAndSettle(); - - expect(find.byType(Text), findsOneWidget); - expect(find.text('h'), findsOneWidget); - }); -} - -Widget _testableWidget(EmptyPandaWidget child) { - return TestApp(Scaffold(body: child)); -} diff --git a/apps/flutter_parent/test/utils/widgets/error_panda_widget_test.dart b/apps/flutter_parent/test/utils/widgets/error_panda_widget_test.dart deleted file mode 100644 index d6baa6d739..0000000000 --- a/apps/flutter_parent/test/utils/widgets/error_panda_widget_test.dart +++ /dev/null @@ -1,83 +0,0 @@ -// Copyright (C) 2019 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:flutter/material.dart'; -import 'package:flutter_parent/l10n/app_localizations.dart'; -import 'package:flutter_parent/utils/common_widgets/error_panda_widget.dart'; -import 'package:flutter_test/flutter_test.dart'; - -import '../accessibility_utils.dart'; -import '../test_app.dart'; - -void main() { - var errorString = AppLocalizations().errorLoadingMessages; - Function? callback = null; - - testWidgetsWithAccessibilityChecks('Shows warning icon', (WidgetTester tester) async { - await tester.pumpWidget(TestApp( - ErrorPandaWidget(errorString, callback), - )); - await tester.pumpAndSettle(); - - expect(find.byType(Icon), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('Shows error message with load target', (tester) async { - await tester.pumpWidget(TestApp( - ErrorPandaWidget(errorString, callback), - )); - await tester.pumpAndSettle(); - - expect(find.text(AppLocalizations().errorLoadingMessages), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('Shows a retry button', (tester) async { - await tester.pumpWidget(TestApp( - ErrorPandaWidget(errorString, callback), - )); - await tester.pumpAndSettle(); - - expect(find.byType(TextButton), findsOneWidget); - expect(find.text(AppLocalizations().retry), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('Retry click calls callback', (tester) async { - var called = false; - - await tester.pumpWidget(TestApp( - ErrorPandaWidget(errorString, () { - called = true; - }), - )); - await tester.pumpAndSettle(); - - // Click retry button - await tester.tap(find.byType(TextButton)); - await tester.pumpAndSettle(); - - // Verify the callback was called - expect(called, true); - }); - - testWidgetsWithAccessibilityChecks('Shows a header', (tester) async { - await tester.pumpWidget(TestApp( - ErrorPandaWidget(errorString, callback, header: Text('header here')), - )); - await tester.pumpAndSettle(); - - expect(find.byType(TextButton), findsOneWidget); - expect(find.text(AppLocalizations().retry), findsOneWidget); - expect(find.text('header here'), findsOneWidget); - }); -} diff --git a/apps/flutter_parent/test/utils/widgets/error_report/error_report_dialog_test.dart b/apps/flutter_parent/test/utils/widgets/error_report/error_report_dialog_test.dart deleted file mode 100644 index 30b108947b..0000000000 --- a/apps/flutter_parent/test/utils/widgets/error_report/error_report_dialog_test.dart +++ /dev/null @@ -1,139 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -import 'package:flutter/material.dart'; -import 'package:flutter/services.dart'; -import 'package:flutter_parent/l10n/app_localizations.dart'; -import 'package:flutter_parent/utils/common_widgets/error_report/error_report_dialog.dart'; -import 'package:flutter_parent/utils/common_widgets/error_report/error_report_interactor.dart'; -import 'package:flutter_test/flutter_test.dart'; -import 'package:mockito/mockito.dart'; - -import '../../accessibility_utils.dart'; -import '../../test_app.dart'; -import '../../test_helpers/mock_helpers.dart'; -import '../../test_helpers/mock_helpers.mocks.dart'; - -void main() { - testWidgetsWithAccessibilityChecks('Shows a dialog', (tester) async { - await TestApp.showWidgetFromTap(tester, (context) => ErrorReportDialog.asDialog(context)); - - expect(find.byType(ErrorReportDialog), findsOneWidget); - expect(find.text(AppLocalizations().reportProblemTitle), findsOneWidget); - expect(find.text(AppLocalizations().errorSeverityComment), findsOneWidget); - - expect(find.text(AppLocalizations().reportProblemEmail), findsNothing); - expect(find.text(AppLocalizations().reportProblemEmailEmpty), findsNothing); - expect(find.text(AppLocalizations().reportProblemSubjectEmpty), findsNothing); - expect(find.text(AppLocalizations().reportProblemDescriptionEmpty), findsNothing); - }); - - testWidgetsWithAccessibilityChecks('Shows a dialog with customizations', (tester) async { - final title = 'title'; - final subject = 'subject'; - final severity = ErrorReportSeverity.CRITICAL; - - await TestApp.showWidgetFromTap( - tester, - (context) => ErrorReportDialog.asDialog( - context, - title: title, - subject: subject, - severity: severity, - includeEmail: true, - ), - ); - - expect(find.byType(ErrorReportDialog), findsOneWidget); - expect(find.text(title), findsOneWidget); - expect(find.text(subject), findsOneWidget); - expect(find.text(AppLocalizations().errorSeverityCritical), findsOneWidget); - expect(find.text(AppLocalizations().reportProblemEmail), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('Selecting a severity updates dialog', (tester) async { - await TestApp.showWidgetFromTap(tester, (context) => ErrorReportDialog.asDialog(context)); - - // Tap on dropdown to show list - await tester.tap(find.text(AppLocalizations().errorSeverityComment)); - await tester.pumpAndSettle(); - - // Tap new item in a list - final x = find.text(AppLocalizations().errorSeverityBlocking); - await tester.tap(x.last); - await tester.pumpAndSettle(); - - expect(find.text(AppLocalizations().errorSeverityBlocking), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('Cancel closes the dialog', (tester) async { - await TestApp.showWidgetFromTap(tester, (context) => ErrorReportDialog.asDialog(context)); - - await tester.tap(find.text(AppLocalizations().cancel.toUpperCase())); - await tester.pumpAndSettle(); - - expect(find.byType(ErrorReportDialog), findsNothing); - }); - - testWidgetsWithAccessibilityChecks('Submit validates the dialog and shows errors', (tester) async { - await TestApp.showWidgetFromTap(tester, (context) => ErrorReportDialog.asDialog(context, includeEmail: true)); - - expect(find.text(AppLocalizations().reportProblemSubjectEmpty), findsNothing); - expect(find.text(AppLocalizations().reportProblemDescriptionEmpty), findsNothing); - expect(find.text(AppLocalizations().reportProblemEmailEmpty), findsNothing); - - // Try to send the report - await tester.tap(find.text(AppLocalizations().sendReport.toUpperCase())); - await tester.pumpAndSettle(); - - expect(find.text(AppLocalizations().reportProblemSubjectEmpty), findsOneWidget); - expect(find.text(AppLocalizations().reportProblemDescriptionEmpty), findsOneWidget); - expect(find.text(AppLocalizations().reportProblemEmailEmpty), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('Submit calls through to the interactor', (tester) async { - final subject = 'Test subject'; - final description = 'Test description'; - final email = 'test@email.com'; - final error = FlutterErrorDetails(exception: FlutterError(""), stack: StackTrace.fromString('fake stack')); - - final interactor = MockErrorReportInteractor(); - setupTestLocator((locator) => locator.registerFactory(() => interactor)); - - await TestApp.showWidgetFromTap( - tester, - (context) => ErrorReportDialog.asDialog(context, includeEmail: true, error: error), - ); - - // Enter in the details - await tester.enterText(find.byKey(ErrorReportDialog.subjectKey), subject); - await tester.testTextInput.receiveAction(TextInputAction.next); - await tester.enterText(find.byKey(ErrorReportDialog.emailKey), email); - await tester.testTextInput.receiveAction(TextInputAction.next); - await tester.enterText(find.byKey(ErrorReportDialog.descriptionKey), description); - - // Try to send the report - await tester.tap(find.text(AppLocalizations().sendReport.toUpperCase())); - await tester.pumpAndSettle(); - - final comment = '' + - '${AppLocalizations().device}: Instructure Canvas Phone\n' + - '${AppLocalizations().osVersion}: Android FakeOS 9000\n' + - '${AppLocalizations().versionNumber}: Canvas v1.0.0 (3)\n\n' + - '-------------------------\n\n' + - '$description'; - - verify(interactor.submitErrorReport(subject, comment, email, ErrorReportSeverity.COMMENT, error.stack.toString())) - .called(1); - }); -} diff --git a/apps/flutter_parent/test/utils/widgets/error_report/error_report_interactor_test.dart b/apps/flutter_parent/test/utils/widgets/error_report/error_report_interactor_test.dart deleted file mode 100644 index 38737a52a8..0000000000 --- a/apps/flutter_parent/test/utils/widgets/error_report/error_report_interactor_test.dart +++ /dev/null @@ -1,234 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -import 'package:flutter_parent/models/enrollment.dart'; -import 'package:flutter_parent/models/login.dart'; -import 'package:flutter_parent/models/user.dart'; -import 'package:flutter_parent/network/api/enrollments_api.dart'; -import 'package:flutter_parent/network/api/error_report_api.dart'; -import 'package:flutter_parent/network/utils/api_prefs.dart'; -import 'package:flutter_parent/utils/common_widgets/error_report/error_report_interactor.dart'; -import 'package:mockito/mockito.dart'; -import 'package:test/test.dart'; - -import '../../canvas_model_utils.dart'; -import '../../platform_config.dart'; -import '../../test_app.dart'; -import '../../test_helpers/mock_helpers.dart'; -import '../../test_helpers/mock_helpers.mocks.dart'; - -void main() { - final user = User((b) => b - ..id = '123' - ..name = 'UserName' - ..primaryEmail = 'PrimaryEmail'); - - final api = MockErrorReportApi(); - final enrollmentsApi = MockEnrollmentsApi(); - - setUp(() async { - reset(api); - reset(enrollmentsApi); - - await setupPlatformChannels(); - }); - - // Setup test dependencies - setupTestLocator((locator) { - locator.registerLazySingleton(() => api); - locator.registerLazySingleton(() => enrollmentsApi); - }); - - test('Submit error report calls to the api', () async { - final subject = 'subject'; - final description = 'description'; - final email = 'email'; - final severity = ErrorReportSeverity.COMMENT; - final stacktrace = 'error stack'; - - await ErrorReportInteractor().submitErrorReport(subject, description, email, severity, stacktrace); - - verify(api.submitErrorReport( - subject: subject, - description: description, - email: email, - stacktrace: stacktrace, - userRoles: '', - severity: anyNamed('severity'), - domain: anyNamed('domain'), - name: anyNamed('name'), - becomeUser: anyNamed('becomeUser'), - )).called(1); - }); - - test('Uses user data from api prefs', () async { - final login = Login((b) => b..user = user.toBuilder()); - await setupPlatformChannels(config: PlatformConfig(initLoggedInUser: login)); - - await ErrorReportInteractor().submitErrorReport('', '', '', ErrorReportSeverity.COMMENT, ''); - - verify(api.submitErrorReport( - email: user.primaryEmail, - name: user.name, - becomeUser: '${ErrorReportApi.DEFAULT_DOMAIN}?become_user_id=${user.id}', - subject: anyNamed('subject'), - description: anyNamed('description'), - stacktrace: anyNamed('stacktrace'), - severity: anyNamed('severity'), - domain: anyNamed('domain'), - userRoles: anyNamed('userRoles'), - )).called(1); - }); - - test('Uses empty string for no user data in api prefs', () async { - final login = Login((b) => b..user = User().toBuilder()); - await setupPlatformChannels(config: PlatformConfig(initLoggedInUser: login)); - - await ErrorReportInteractor().submitErrorReport('', '', null, ErrorReportSeverity.COMMENT, ''); - - verify(api.submitErrorReport( - email: '', - name: '', - becomeUser: '', - subject: anyNamed('subject'), - description: anyNamed('description'), - stacktrace: anyNamed('stacktrace'), - severity: anyNamed('severity'), - domain: anyNamed('domain'), - userRoles: anyNamed('userRoles'), - )).called(1); - }); - - test('Uses domain from api prefs', () async { - String domain = 'domain'; - Login user = Login((b) => b - ..accessToken = '' - ..refreshToken = '' - ..domain = domain - ..user = CanvasModelTestUtils.mockUser().toBuilder()); - ApiPrefs.switchLogins(user); - - await ErrorReportInteractor().submitErrorReport('', '', '', ErrorReportSeverity.COMMENT, ''); - - verify(api.submitErrorReport( - domain: domain, - subject: anyNamed('subject'), - description: anyNamed('description'), - email: anyNamed('email'), - stacktrace: anyNamed('stacktrace'), - severity: anyNamed('severity'), - name: anyNamed('name'), - becomeUser: anyNamed('becomeUser'), - userRoles: anyNamed('userRoles'), - )).called(1); - }); - - test('Uses domain from ErrorReportApi if api prefs has none', () async { - await ErrorReportInteractor().submitErrorReport('', '', '', ErrorReportSeverity.COMMENT, ''); - - verify(api.submitErrorReport( - domain: anyNamed('domain'), - subject: anyNamed('subject'), - description: anyNamed('description'), - email: anyNamed('email'), - stacktrace: anyNamed('stacktrace'), - severity: anyNamed('severity'), - name: anyNamed('name'), - becomeUser: anyNamed('becomeUser'), - userRoles: anyNamed('userRoles'), - )).called(1); - }); - - test('Retrieves user roles and removes duplicates', () async { - String domain = 'domain'; - Login user = Login((b) => b - ..accessToken = '' - ..refreshToken = '' - ..domain = domain - ..user = CanvasModelTestUtils.mockUser().toBuilder()); - ApiPrefs.switchLogins(user); - - final enrollmentBuilder = (String type) => Enrollment((b) => b - ..enrollmentState = 'active' - ..type = type); - when(enrollmentsApi.getSelfEnrollments(forceRefresh: true)).thenAnswer((_) async => List.from([ - enrollmentBuilder('ObserverEnrollment'), - enrollmentBuilder('ObserverEnrollment'), - enrollmentBuilder('StudentEnrollment'), - ])); - await ErrorReportInteractor().submitErrorReport('', '', '', ErrorReportSeverity.COMMENT, ''); - - verify(api.submitErrorReport( - userRoles: 'ObserverEnrollment,StudentEnrollment', - subject: anyNamed('subject'), - description: anyNamed('description'), - email: anyNamed('email'), - stacktrace: anyNamed('stacktrace'), - severity: anyNamed('severity'), - domain: anyNamed('domain'), - name: anyNamed('name'), - becomeUser: anyNamed('becomeUser'), - )).called(1); - }); - - test('Sends empty user roles with null api prefs user', () async { - await ErrorReportInteractor().submitErrorReport('', '', '', ErrorReportSeverity.COMMENT, ''); - - verifyNever(enrollmentsApi.getSelfEnrollments(forceRefresh: anyNamed('forceRefresh'))); - - verify(api.submitErrorReport( - userRoles: '', - subject: anyNamed('subject'), - description: anyNamed('description'), - email: anyNamed('email'), - stacktrace: anyNamed('stacktrace'), - severity: anyNamed('severity'), - domain: anyNamed('domain'), - name: anyNamed('name'), - becomeUser: anyNamed('becomeUser'), - )).called(1); - }); - - test('ErrorReportSeverity serializes', () async { - final _verifySeverityString = (String severity) { - verify(api.submitErrorReport( - severity: severity, - subject: anyNamed('subject'), - description: anyNamed('description'), - email: anyNamed('email'), - stacktrace: anyNamed('stacktrace'), - domain: anyNamed('domain'), - name: anyNamed('name'), - becomeUser: anyNamed('becomeUser'), - userRoles: anyNamed('userRoles'), - )).called(1); - }; - - await ErrorReportInteractor().submitErrorReport('', '', '', ErrorReportSeverity.COMMENT, ''); - _verifySeverityString('just_a_comment'); - - await ErrorReportInteractor().submitErrorReport('', '', '', ErrorReportSeverity.NOT_URGENT, ''); - _verifySeverityString('not_urgent'); - - await ErrorReportInteractor().submitErrorReport('', '', '', ErrorReportSeverity.WORKAROUND_POSSIBLE, ''); - _verifySeverityString('workaround_possible'); - - await ErrorReportInteractor().submitErrorReport('', '', '', ErrorReportSeverity.BLOCKING, ''); - _verifySeverityString('blocks_what_i_need_to_do'); - - await ErrorReportInteractor().submitErrorReport('', '', '', ErrorReportSeverity.CRITICAL, ''); - _verifySeverityString('extreme_critical_emergency'); - - expect(() async => await ErrorReportInteractor().submitErrorReport('', '', '', null, ''), throwsArgumentError); - }); -} diff --git a/apps/flutter_parent/test/utils/widgets/full_screen_scroll_container_test.dart b/apps/flutter_parent/test/utils/widgets/full_screen_scroll_container_test.dart deleted file mode 100644 index 731d229536..0000000000 --- a/apps/flutter_parent/test/utils/widgets/full_screen_scroll_container_test.dart +++ /dev/null @@ -1,181 +0,0 @@ -// Copyright (C) 2019 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:flutter/material.dart'; -import 'package:flutter_parent/utils/common_widgets/full_screen_scroll_container.dart'; -import 'package:flutter_test/flutter_test.dart'; -import 'package:mockito/mockito.dart'; - -import '../accessibility_utils.dart'; - -void main() { - group('Single child', () { - testWidgetsWithAccessibilityChecks('is visible', (tester) async { - final children = [Text('a')]; - - // Pump the widget - await tester.pumpWidget(_refreshingWidget(children)); - await tester.pumpAndSettle(); - - // Should show the text - expect(find.text('a'), findsOneWidget); - - // Should be at the center of the screen - final positionA = tester.getCenter(find.text('a')); - final positionApp = tester.getCenter(find.byType(MaterialApp)); - expect(positionA.dx, positionApp.dx); - expect(positionA.dy, positionApp.dy); - }); - - // TODO Fix test - testWidgetsWithAccessibilityChecks('can swipe to refresh', (tester) async { - final children = [Text('a')]; - final refresher = _Refresher(); - - // Pump the widget - await tester.pumpWidget(_refreshingWidget(children, refresher: refresher)); - await tester.pumpAndSettle(); - - // Should have the refresh indicator - final matchedWidget = find.byType(RefreshIndicator); - expect(matchedWidget, findsOneWidget); - - // Try to refresh - await tester.drag(matchedWidget, const Offset(0, 200)); - await tester.pump(); - - // Verify we had our refresh called - verify(refresher.refresh()).called(1); - }, skip: true); - - testWidgetsWithAccessibilityChecks('can add header', (tester) async { - final children = [Text('a')]; - final header = Text('h'); - - // Pump the widget - await tester.pumpWidget(_refreshingWidget(children, header: header)); - await tester.pumpAndSettle(); - - // Should show the text - expect(find.text('a'), findsOneWidget); - - // Should be at the center of the screen (in relation to the header) - final positionA = tester.getCenter(find.text('a')); - final positionHeaderCenter = tester.getCenter(find.text('h')); - final positionCenter = tester.getCenter(find.byType(MaterialApp)); - expect(positionA.dx, positionCenter.dx); - expect(positionA.dy - positionHeaderCenter.dy, positionCenter.dy); - - // Should show the text - expect(find.text('h'), findsOneWidget); - - // Should be at the center of the screen - final positionHeader = tester.getTopLeft(find.text('h')); - final positionTop = tester.getTopLeft(find.byType(MaterialApp)); - expect(positionHeaderCenter.dx, positionCenter.dx); - expect(positionHeader.dy, positionTop.dy); - }); - }); - - group('Multiple children', () { - testWidgetsWithAccessibilityChecks('all are visible', (tester) async { - final children = [Text('a'), Text('b'), Text('c')]; - - // Pump the widget - await tester.pumpWidget(_refreshingWidget(children)); - await tester.pumpAndSettle(); - - // The widgets should all be visible - expect(find.text('a'), findsOneWidget); - expect(find.text('b'), findsOneWidget); - expect(find.text('c'), findsOneWidget); - - // The middle widget should be at the center of the screen - final positionA = tester.getCenter(find.text('b')); - final positionApp = tester.getCenter(find.byType(MaterialApp)); - expect(positionA.dx, positionApp.dx); - expect(positionA.dy, positionApp.dy); - }); - - // TODO Fix test - testWidgetsWithAccessibilityChecks('can swipe to refresh', (tester) async { - final children = [Text('a'), Text('b'), Text('c')]; - final refresher = _Refresher(); - - // Pump the widget - await tester.pumpWidget(_refreshingWidget(children, refresher: refresher)); - await tester.pumpAndSettle(); - - // Should have the refresh indicator - final matchedWidget = find.byType(RefreshIndicator); - expect(matchedWidget, findsOneWidget); - - // Try to refresh - await tester.drag(matchedWidget, const Offset(0, 200)); - await tester.pump(); - - // Verify we had our refresh called - verify(refresher.refresh()).called(1); - }, skip: true); - - testWidgetsWithAccessibilityChecks('can add header', (tester) async { - final children = [Text('a'), Text('b'), Text('c')]; - final header = Text('h'); - - // Pump the widget - await tester.pumpWidget(_refreshingWidget(children, header: header)); - await tester.pumpAndSettle(); - - // Should show the text - // The widgets should all be visible - expect(find.text('a'), findsOneWidget); - expect(find.text('b'), findsOneWidget); - expect(find.text('c'), findsOneWidget); - - // The middle widget should be at the center of the screen (in relation to the header) - final positionA = tester.getCenter(find.text('b')); - final positionHeaderCenter = tester.getCenter(find.text('h')); - final positionCenter = tester.getCenter(find.byType(MaterialApp)); - expect(positionA.dx, positionCenter.dx); - expect(positionA.dy - positionHeaderCenter.dy, positionCenter.dy); - - // Should show the text - expect(find.text('h'), findsOneWidget); - - // Should be at the center of the screen - final positionHeader = tester.getTopLeft(find.text('h')); - final positionTop = tester.getTopLeft(find.byType(MaterialApp)); - expect(positionHeaderCenter.dx, positionCenter.dx); - expect(positionHeader.dy, positionTop.dy); - }); - }); -} - -class _Refresher extends Mock { - void refresh(); -} - -Widget _refreshingWidget(List children, {_Refresher? refresher, Widget? header}) { - return MaterialApp( - home: Scaffold( - body: RefreshIndicator( - child: FullScreenScrollContainer(children: children, header: header), - onRefresh: () { - refresher?.refresh(); - return Future.value(); - }, - ), - ), - ); -} diff --git a/apps/flutter_parent/test/utils/widgets/masquerade_ui_test.dart b/apps/flutter_parent/test/utils/widgets/masquerade_ui_test.dart deleted file mode 100644 index 2c06d6883c..0000000000 --- a/apps/flutter_parent/test/utils/widgets/masquerade_ui_test.dart +++ /dev/null @@ -1,228 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:flutter/material.dart'; -import 'package:flutter_parent/l10n/app_localizations.dart'; -import 'package:flutter_parent/models/login.dart'; -import 'package:flutter_parent/network/utils/api_prefs.dart'; -import 'package:flutter_parent/screens/login_landing_screen.dart'; -import 'package:flutter_parent/utils/common_widgets/masquerade_ui.dart'; -import 'package:flutter_parent/utils/db/calendar_filter_db.dart'; -import 'package:flutter_parent/utils/db/reminder_db.dart'; -import 'package:flutter_parent/utils/design/parent_colors.dart'; -import 'package:flutter_parent/utils/notification_util.dart'; -import 'package:flutter_parent/utils/quick_nav.dart'; -import 'package:flutter_parent/utils/remote_config_utils.dart'; -import 'package:flutter_test/flutter_test.dart'; -import 'package:mockito/mockito.dart'; - -import '../accessibility_utils.dart'; -import '../canvas_model_utils.dart'; -import '../platform_config.dart'; -import '../test_app.dart'; -import '../test_helpers/mock_helpers.dart'; -import '../test_helpers/mock_helpers.mocks.dart'; - -void main() { - AppLocalizations l10n = AppLocalizations(); - - Login normalLogin = Login((b) => b - ..domain = 'domain' - ..accessToken = 'token' - ..user = CanvasModelTestUtils.mockUser().toBuilder()); - - Login masqueradeLogin = normalLogin.rebuild((b) => b - ..masqueradeDomain = 'masqueradeDomain' - ..masqueradeUser = CanvasModelTestUtils.mockUser(name: 'Masked User').toBuilder()); - - String masqueradeText = l10n.actingAsUser(masqueradeLogin.masqueradeUser!.name); - - Key masqueradeContainerKey = Key('masquerade-ui-container'); - - setUp(() async { - final mockRemoteConfig = setupMockRemoteConfig(valueSettings: {'qr_login_enabled_parent': 'true'}); - await setupPlatformChannels(config: PlatformConfig(initRemoteConfig: mockRemoteConfig)); - }); - - tearDown(() { - RemoteConfigUtils.clean(); - }); - - testWidgetsWithAccessibilityChecks('Builds initially as disabled', (tester) async { - await tester.pumpWidget(TestApp(_childWithButton())); - await tester.pumpAndSettle(); - - expect(find.byType(MasqueradeUI), findsOneWidget); - expect(find.text(masqueradeText), findsNothing); - - MasqueradeUIState state = tester.state(find.byType(MasqueradeUI)); - expect(state.enabled, isFalse); - }); - - testWidgetsWithAccessibilityChecks('Builds initially as enabled', (tester) async { - await tester.pumpWidget(TestApp(_childWithButton())); - ApiPrefs.switchLogins(masqueradeLogin); - await tester.pumpAndSettle(); - - expect(find.byType(MasqueradeUI), findsOneWidget); - expect(find.text(masqueradeText), findsOneWidget); - - MasqueradeUIState state = tester.state(find.byType(MasqueradeUI)); - expect(state.enabled, isTrue); - }); - - testWidgetsWithAccessibilityChecks('Shows expected UI elements', (tester) async { - await tester.pumpWidget(TestApp(_childWithButton())); - ApiPrefs.switchLogins(masqueradeLogin); - await tester.pumpAndSettle(); - - // MasqueradeUI widget - expect(find.byType(MasqueradeUI), findsOneWidget); - - // Container for UI elements - expect(find.byKey(masqueradeContainerKey), findsOneWidget); - - // Foreground border - Container container = tester.widget(find.byKey(masqueradeContainerKey)); - Border border = (container.foregroundDecoration as BoxDecoration).border as Border; - expect(border.left, BorderSide(color: ParentColors.masquerade, width: 3)); - expect(border.top, BorderSide(color: ParentColors.masquerade, width: 3)); - expect(border.right, BorderSide(color: ParentColors.masquerade, width: 3)); - expect(border.bottom, BorderSide(color: ParentColors.masquerade, width: 3)); - - // 'You are acting as ' message - expect(find.text(masqueradeText), findsOneWidget); - - // 'Stop acting as user' close button - expect(find.byIcon(Icons.close), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('Updates to reflect new masquerade status', (tester) async { - await tester.pumpWidget(TestApp(_childWithButton())); - ApiPrefs.switchLogins(masqueradeLogin); - await tester.pumpAndSettle(); - - // Should be enabled - expect(find.text(masqueradeText), findsOneWidget); - - ApiPrefs.switchLogins(normalLogin); - await tester.tap(find.byType(TextButton)); - await tester.pumpAndSettle(); - - // Should now be disabled - expect(find.text(masqueradeText), findsNothing); - - ApiPrefs.switchLogins(masqueradeLogin); - await tester.tap(find.byType(TextButton)); - await tester.pumpAndSettle(); - - // Should be enabled again - expect(find.text(masqueradeText), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('Stop button displays confirmation dialog', (tester) async { - await tester.pumpWidget(TestApp(_childWithButton())); - ApiPrefs.switchLogins(masqueradeLogin); - await tester.pumpAndSettle(); - - await tester.tap(find.byIcon(Icons.close)); - await tester.pumpAndSettle(); - - expect(find.byType(AlertDialog), findsOneWidget); - expect(find.text(l10n.endMasqueradeMessage(masqueradeLogin.masqueradeUser!.name)), findsOneWidget); - - // Close the dialog - await tester.tap(find.text(l10n.cancel)); - await tester.pumpAndSettle(); - - expect(find.byType(AlertDialog), findsNothing); - }); - - testWidgetsWithAccessibilityChecks('Stop button logout message if masquerading from QR code', (tester) async { - Login login = masqueradeLogin.rebuild((b) => b..isMasqueradingFromQRCode = true); - - await tester.pumpWidget(TestApp(_childWithButton())); - ApiPrefs.switchLogins(login); - await tester.pumpAndSettle(); - - await tester.tap(find.byIcon(Icons.close)); - await tester.pumpAndSettle(); - - expect(find.byType(AlertDialog), findsOneWidget); - expect(find.text(l10n.endMasqueradeLogoutMessage(masqueradeLogin.masqueradeUser!.name)), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('Accepting confirmation dialog stops masquerading', (tester) async { - await tester.pumpWidget(TestApp(_childWithButton())); - ApiPrefs.switchLogins(masqueradeLogin); - await tester.pumpAndSettle(); - - expect(find.text(masqueradeText), findsOneWidget); - expect(ApiPrefs.isMasquerading(), true); - - await tester.tap(find.byIcon(Icons.close)); - await tester.pumpAndSettle(); - - // Tap OK - await tester.tap(find.text(l10n.ok)); - await tester.pumpAndSettle(); - - expect(find.byType(AlertDialog), findsNothing); - expect(find.text(masqueradeText), findsNothing); - expect(ApiPrefs.isMasquerading(), false); - }); - - testWidgetsWithAccessibilityChecks('Accepting logout confirmation performs logout', (tester) async { - final reminderDb = MockReminderDb(); - final calendarFilterDb = MockCalendarFilterDb(); - final notificationUtil = MockNotificationUtil(); - when(reminderDb.getAllForUser(any, any)).thenAnswer((_) async => []); - setupTestLocator((locator) { - locator.registerLazySingleton(() => reminderDb); - locator.registerLazySingleton(() => calendarFilterDb); - locator.registerLazySingleton(() => notificationUtil); - locator.registerLazySingleton(() => QuickNav()); - }); - - Login login = masqueradeLogin.rebuild((b) => b..isMasqueradingFromQRCode = true); - await tester.pumpWidget(TestApp(_childWithButton())); - ApiPrefs.switchLogins(login); - await tester.pumpAndSettle(); - - await tester.tap(find.byIcon(Icons.close)); - await tester.pumpAndSettle(); - - // Tap OK - await tester.tap(find.text(l10n.ok)); - await tester.pumpAndSettle(); - - expect(find.byType(AlertDialog), findsNothing); - expect(find.text(masqueradeText), findsNothing); - expect(find.byType(LoginLandingScreen), findsOneWidget); - expect(ApiPrefs.isLoggedIn(), false); - }); -} - -Widget _childWithButton() { - return Material( - child: Builder( - builder: (context) => TextButton( - child: Text('Tap to refresh'), - onPressed: () { - MasqueradeUI.of(context)?.refresh(); - }, - ), - ), - ); -} diff --git a/apps/flutter_parent/test/utils/widgets/rating_dialog_test.dart b/apps/flutter_parent/test/utils/widgets/rating_dialog_test.dart deleted file mode 100644 index 8e2b3c3e52..0000000000 --- a/apps/flutter_parent/test/utils/widgets/rating_dialog_test.dart +++ /dev/null @@ -1,320 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -import 'package:flutter/material.dart'; -import 'package:flutter_parent/l10n/app_localizations.dart'; -import 'package:flutter_parent/network/utils/analytics.dart'; -import 'package:flutter_parent/network/utils/api_prefs.dart'; -import 'package:flutter_parent/utils/common_widgets/rating_dialog.dart'; -import 'package:flutter_parent/utils/url_launcher.dart'; -import 'package:flutter_parent/utils/veneers/android_intent_veneer.dart'; -import 'package:flutter_test/flutter_test.dart'; -import 'package:mockito/mockito.dart'; - -import '../accessibility_utils.dart'; -import '../test_app.dart'; -import '../test_helpers/mock_helpers.dart'; -import '../test_helpers/mock_helpers.mocks.dart'; - -void main() { - final analytics = MockAnalytics(); - final intentVeneer = MockAndroidIntentVeneer(); - final launcher = MockUrlLauncher(); - - setupTestLocator((locator) { - locator.registerLazySingleton(() => analytics); - locator.registerLazySingleton(() => intentVeneer); - locator.registerLazySingleton(() => launcher); - }); - - setUp(() { - reset(analytics); - reset(intentVeneer); - reset(launcher); - }); - - Future _showDialog(tester, {DateTime? nextShowDate, bool? dontShowAgain}) async { - return TestApp.showWidgetFromTap(tester, (context) => RatingDialog.showDialogIfPossible(context, false), - configBlock: () async { - await ApiPrefs.setRatingNextShowDate(nextShowDate); - await ApiPrefs.setRatingDontShowAgain(dontShowAgain); - }); - } - - /// Tests - - testWidgetsWithAccessibilityChecks('asDialog does not show because this is a test', (tester) async { - await TestApp.showWidgetFromTap( - tester, - (context) => RatingDialog.asDialog(context), - ); - - expect(find.byType(RatingDialog), findsNothing); - expect(ApiPrefs.getRatingNextShowDate(), isNull); // Should not be changed - }); - - group('showDialog', () { - testWidgetsWithAccessibilityChecks('does not show when hiding for tests', (tester) async { - await TestApp.showWidgetFromTap(tester, (context) => RatingDialog.showDialogIfPossible(context, true)); - - verifyNever(analytics.logEvent(AnalyticsEventConstants.RATING_DIALOG_SHOW)); - - expect(find.byType(RatingDialog), findsNothing); - expect(ApiPrefs.getRatingNextShowDate(), isNull); // Should not be set yet - }); - - testWidgetsWithAccessibilityChecks('does not show when dont show again is true', (tester) async { - await _showDialog(tester, dontShowAgain: true); - - verifyNever(analytics.logEvent(AnalyticsEventConstants.RATING_DIALOG_SHOW)); - - expect(find.byType(RatingDialog), findsNothing); - expect(ApiPrefs.getRatingNextShowDate(), isNull); // Should not be set yet - }); - - testWidgetsWithAccessibilityChecks('does not show when next show is not set', (tester) async { - await _showDialog(tester); - - verifyNever(analytics.logEvent(AnalyticsEventConstants.RATING_DIALOG_SHOW)); - - expect(find.byType(RatingDialog), findsNothing); - expect(ApiPrefs.getRatingNextShowDate(), isNotNull); // Should now be set - }); - - testWidgetsWithAccessibilityChecks('does not show when next show is after now', (tester) async { - final date = DateTime.now().add(Duration(days: 2)); - - await _showDialog(tester, nextShowDate: date); - - verifyNever(analytics.logEvent(AnalyticsEventConstants.RATING_DIALOG_SHOW)); - - expect(find.byType(RatingDialog), findsNothing); - expect(ApiPrefs.getRatingNextShowDate(), date); // Should not be changed - }); - - testWidgetsWithAccessibilityChecks('does show when first launch is past the show again date', (tester) async { - final date = DateTime.now(); - await _showDialog(tester, nextShowDate: date); - - verify(analytics.logEvent(AnalyticsEventConstants.RATING_DIALOG_SHOW)).called(1); - - // Set four weeks from "now" ("now" is a little later when set in api prefs by rating dialog) - expect(ApiPrefs.getRatingNextShowDate()?.isAfter(date.add(Duration(days: RatingDialog.FOUR_WEEKS))), isTrue); - expect(ApiPrefs.getRatingNextShowDate()?.isBefore(date.add(Duration(days: RatingDialog.SIX_WEEKS))), isTrue); - expect(find.byType(RatingDialog), findsOneWidget); - expect(find.text(AppLocalizations().ratingDialogTitle), findsOneWidget); - expect(find.text(AppLocalizations().ratingDialogDontShowAgain.toUpperCase()), findsOneWidget); - expect(find.byIcon(Icons.star), findsNWidgets(5)); - }); - }); - - testWidgetsWithAccessibilityChecks('dont show again button closes and sets pref', (tester) async { - await _showDialog(tester, nextShowDate: DateTime.now()); - - expect(find.byType(RatingDialog), findsOneWidget); - await tester.tap(find.text(AppLocalizations().ratingDialogDontShowAgain.toUpperCase())); - await tester.pumpAndSettle(); - - expect(ApiPrefs.getRatingDontShowAgain(), true); - verify(analytics.logEvent(AnalyticsEventConstants.RATING_DIALOG_DONT_SHOW_AGAIN)).called(1); - }); - - group('Send comments', () { - testWidgetsWithAccessibilityChecks('are visible when less the 4 stars selected', (tester) async { - await _showDialog(tester, nextShowDate: DateTime.now()); - - expect(find.byType(RatingDialog), findsOneWidget); - expect(find.byIcon(Icons.star), findsNWidgets(5)); - - // Tap each icon, expect that comments are still visible - final icons = find.byIcon(Icons.star); - for (int i = 0; i < 3; i++) { - await tester.tap(icons.at(i)); - await tester.pumpAndSettle(); - - expect(find.byType(RatingDialog), findsOneWidget); - expect(find.text(AppLocalizations().ratingDialogCommentDescription), findsOneWidget); - expect(find.text(AppLocalizations().ratingDialogSendFeedback.toUpperCase()), findsOneWidget); - } - }); - - testWidgetsWithAccessibilityChecks('dismiss the dialog when comments are empty', (tester) async { - final date = DateTime.now(); - await _showDialog(tester, nextShowDate: date); - - expect(find.byType(RatingDialog), findsOneWidget); - - // Tap the rating - final icons = find.byIcon(Icons.star); - await tester.tap(icons.first); - await tester.pumpAndSettle(); - - // Send feedback - await tester.tap(find.text(AppLocalizations().ratingDialogSendFeedback.toUpperCase())); - await tester.pumpAndSettle(); - - // Asserts - expect(find.byType(RatingDialog), findsNothing); - expect(ApiPrefs.getRatingDontShowAgain(), isNot(true)); // Shouldn't set this if we are sending feedback - // Four weeks when without a comment ("now" is a little later when set in api prefs by rating dialog) - expect(ApiPrefs.getRatingNextShowDate()?.isAfter(date.add(Duration(days: RatingDialog.FOUR_WEEKS))), isTrue); - expect(ApiPrefs.getRatingNextShowDate()?.isBefore(date.add(Duration(days: RatingDialog.SIX_WEEKS))), isTrue); - verify(analytics.logEvent( - AnalyticsEventConstants.RATING_DIALOG, - extras: {AnalyticsParamConstants.STAR_RATING: 1}, // First was clicked, should send a 1 - )).called(1); - }); - - testWidgetsWithAccessibilityChecks('shows correctly in ltr', (tester) async { - await TestApp.showWidgetFromTap( - tester, - (context) => RatingDialog.showDialogIfPossible(context, false), - locale: Locale('en'), - configBlock: () async { - await ApiPrefs.setRatingNextShowDate(DateTime.now()); - }, - ); - - // Should verify that the 1 star rating is displayed to the left of the 5 star rating in LTR - final icons = find.byIcon(Icons.star); - expect(find.byType(RatingDialog), findsOneWidget); - expect(await tester.getBottomLeft(icons.first).dx, lessThan(await tester.getBottomLeft(icons.last).dx)); - - // Tap the rating - await tester.tap(icons.first); - await tester.pumpAndSettle(); - - // Send feedback - await tester.tap(find.text(AppLocalizations().ratingDialogSendFeedback.toUpperCase())); - await tester.pumpAndSettle(); - - // Verify 1 was clicked - verify(analytics.logEvent( - AnalyticsEventConstants.RATING_DIALOG, - extras: {AnalyticsParamConstants.STAR_RATING: 1}, // First was clicked, should send a 1 - )).called(1); - }); - - testWidgetsWithAccessibilityChecks('shows correctly in rtl', (tester) async { - await TestApp.showWidgetFromTap( - tester, - (context) => RatingDialog.showDialogIfPossible(context, false), - locale: Locale('ar', 'AR'), - configBlock: () async { - await ApiPrefs.setRatingNextShowDate(DateTime.now()); - }, - ); - - // Should verify that the 1 star rating is displayed to the right of the 5 star rating in RTL - final icons = find.byIcon(Icons.star); - expect(find.byType(RatingDialog), findsOneWidget); - expect(await tester.getBottomLeft(icons.first).dx, greaterThan(await tester.getBottomLeft(icons.last).dx)); - - // Tap the rating - await tester.tap(icons.first); - await tester.pumpAndSettle(); - - // Send feedback - await tester.tap(find.text(AppLocalizations().ratingDialogSendFeedback.toUpperCase())); - await tester.pumpAndSettle(); - - // Verify 1 was clicked - verify(analytics.logEvent( - AnalyticsEventConstants.RATING_DIALOG, - extras: {AnalyticsParamConstants.STAR_RATING: 1}, // First was clicked, should send a 1 - )).called(1); - }); - - testWidgetsWithAccessibilityChecks('dismiss the dialog and open email when comments are not empty', (tester) async { - final comment = 'comment here'; - final date = DateTime.now(); - await _showDialog(tester, nextShowDate: date); - - expect(find.byType(RatingDialog), findsOneWidget); - - // Tap the rating - final icons = find.byIcon(Icons.star); - await tester.tap(icons.at(1)); - await tester.pumpAndSettle(); - - // Type a comment - await tester.enterText(find.byType(TextField), comment); - - // Send feedback - await tester.tap(find.text(AppLocalizations().ratingDialogSendFeedback.toUpperCase())); - await tester.pumpAndSettle(); - - final emailBody = '' + - '$comment\r\n' + - '\r\n' + - '${AppLocalizations().helpUserId} 0\r\n' + - '${AppLocalizations().helpEmail} \r\n' + - '${AppLocalizations().helpDomain} \r\n' + - '${AppLocalizations().versionNumber}: Canvas v1.0.0 (3)\r\n' + - '${AppLocalizations().device}: Instructure Canvas Phone\r\n' + - '${AppLocalizations().osVersion}: Android FakeOS 9000\r\n' + - '----------------------------------------------\r\n'; - - // Asserts - expect(find.byType(RatingDialog), findsNothing); - expect(ApiPrefs.getRatingDontShowAgain(), isNull); // Shouldn't set this if we are sending feedback - // Six weeks when given a comment - expect(ApiPrefs.getRatingNextShowDate()?.isAfter(date.add(Duration(days: RatingDialog.SIX_WEEKS))), isTrue); - verify(intentVeneer.launchEmailWithBody(AppLocalizations().ratingDialogEmailSubject('1.0.0'), emailBody)); - verify(analytics.logEvent( - AnalyticsEventConstants.RATING_DIALOG, - extras: {AnalyticsParamConstants.STAR_RATING: 2}, // Second was clicked, should send a 2 - )).called(1); - }); - }); - - group('App store', () { - testWidgetsWithAccessibilityChecks('4 stars goes to the app store', (tester) async { - await _showDialog(tester, nextShowDate: DateTime.now()); - - expect(find.byType(RatingDialog), findsOneWidget); - expect(find.byIcon(Icons.star), findsNWidgets(5)); - - // Tap 4 star icon - await tester.tap(find.byIcon(Icons.star).at(3)); - await tester.pumpAndSettle(); - - expect(find.byType(RatingDialog), findsNothing); - expect(ApiPrefs.getRatingDontShowAgain(), isTrue); - verify(launcher.launchAppStore()); - verify(analytics.logEvent( - AnalyticsEventConstants.RATING_DIALOG, - extras: {AnalyticsParamConstants.STAR_RATING: 4}, - )).called(1); - }); - - testWidgetsWithAccessibilityChecks('5 stars goes to the app store', (tester) async { - await _showDialog(tester, nextShowDate: DateTime.now()); - - expect(find.byType(RatingDialog), findsOneWidget); - expect(find.byIcon(Icons.star), findsNWidgets(5)); - - // Tap 5 star icon - await tester.tap(find.byIcon(Icons.star).last); - await tester.pumpAndSettle(); - - expect(find.byType(RatingDialog), findsNothing); - expect(ApiPrefs.getRatingDontShowAgain(), isTrue); - verify(launcher.launchAppStore()); - verify(analytics.logEvent( - AnalyticsEventConstants.RATING_DIALOG, - extras: {AnalyticsParamConstants.STAR_RATING: 5}, - )).called(1); - }); - }); -} diff --git a/apps/flutter_parent/test/utils/widgets/respawn_test.dart b/apps/flutter_parent/test/utils/widgets/respawn_test.dart deleted file mode 100644 index 9b22d55373..0000000000 --- a/apps/flutter_parent/test/utils/widgets/respawn_test.dart +++ /dev/null @@ -1,89 +0,0 @@ -// Copyright (C) 2019 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:flutter/material.dart'; -import 'package:flutter_parent/utils/common_widgets/respawn.dart'; -import 'package:flutter_test/flutter_test.dart'; - -import '../accessibility_utils.dart'; -import '../test_app.dart'; - -void main() { - testWidgetsWithAccessibilityChecks('Resets state', (tester) async { - await tester.pumpWidget( - TestApp( - Respawn(child: _RespawnTestWidget()), - ), - ); - await tester.pump(); - - // Counter should read 'Count: 0' - expect(find.text('Count: 0'), findsOneWidget); - - // Tap 'increment' button twice - await tester.tap(find.byKey(_RespawnTestWidget.incrementKey)); - await tester.pump(); - await tester.tap(find.byKey(_RespawnTestWidget.incrementKey)); - await tester.pump(); - - // Counter should now read 'Count: 2' - expect(find.text('Count: 2'), findsOneWidget); - - // Tap respawn button - await tester.tap(find.byKey(_RespawnTestWidget.respawnKey)); - await tester.pumpAndSettle(); - - // Counter should have reset - expect(find.text('Count: 0'), findsOneWidget); - }); -} - -class _RespawnTestWidget extends StatefulWidget { - static Key respawnKey = Key('respawn-button'); - static Key incrementKey = Key('increment-button'); - static Key counterKey = Key('counter'); - - @override - _RespawnTestWidgetState createState() => _RespawnTestWidgetState(); -} - -class _RespawnTestWidgetState extends State<_RespawnTestWidget> { - int _counter = 0; - - @override - Widget build(BuildContext context) { - return Center( - child: Column( - children: [ - Text( - 'Count: $_counter', - key: _RespawnTestWidget.counterKey, - ), - TextButton( - key: _RespawnTestWidget.incrementKey, - child: Text('Tap to increment'), - onPressed: () => setState(() => _counter++), - ), - TextButton( - key: _RespawnTestWidget.respawnKey, - child: Text('Tap to Respawn'), - onPressed: () { - Respawn.of(context)?.restart(); - }, - ), - ], - ), - ); - } -} diff --git a/apps/flutter_parent/test/utils/widgets/two_finger_double_tap_gesture_detector_test.dart b/apps/flutter_parent/test/utils/widgets/two_finger_double_tap_gesture_detector_test.dart deleted file mode 100644 index 9269855166..0000000000 --- a/apps/flutter_parent/test/utils/widgets/two_finger_double_tap_gesture_detector_test.dart +++ /dev/null @@ -1,198 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:flutter/cupertino.dart'; -import 'package:flutter/gestures.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_parent/utils/common_widgets/two_finger_double_tap_gesture_detector.dart'; -import 'package:flutter_test/flutter_test.dart'; - -import '../accessibility_utils.dart'; -import '../test_app.dart'; - -void main() { - testWidgetsWithAccessibilityChecks('Invokes callback on two-finger double-tap', (tester) async { - bool called = false; - await tester.pumpWidget( - TestApp( - TwoFingerDoubleTapGestureDetector( - child: Container(color: Colors.grey), - onDoubleTap: () => called = true, - ), - ), - ); - await tester.pump(); - - Offset center = tester.getCenter(find.byType(TwoFingerDoubleTapGestureDetector)); - - // Perform first two-finger tap - TestGesture pointer1 = await tester.startGesture(center.translate(-64, 0)); - TestGesture pointer2 = await tester.startGesture(center.translate(64, 0)); - await pointer1.up(); - await pointer2.up(); - - // Perform second two-finger tap - await tester.pump(Duration(milliseconds: 100)); - pointer1 = await tester.startGesture(center.translate(-64, 0)); - pointer2 = await tester.startGesture(center.translate(64, 0)); - await pointer1.up(); - await pointer2.up(); - await tester.pumpAndSettle(); - - expect(called, isTrue); - }); - - testWidgetsWithAccessibilityChecks('Invokes callback on two-finger double-tap after two-finger-tap timeout', - (tester) async { - bool called = false; - await tester.pumpWidget( - TestApp( - TwoFingerDoubleTapGestureDetector( - child: Container(color: Colors.grey), - onDoubleTap: () => called = true, - ), - ), - ); - await tester.pump(); - - Offset center = tester.getCenter(find.byType(TwoFingerDoubleTapGestureDetector)); - - // Perform first two-finger tap - TestGesture pointer1 = await tester.startGesture(center.translate(-64, 0)); - TestGesture pointer2 = await tester.startGesture(center.translate(64, 0)); - await tester.pump(Duration(milliseconds: 50)); - await pointer1.up(); - await pointer2.up(); - - // Wait past double tap timeout (using runAsync here since pump won't advance the real clock) - await tester.runAsync(() => Future.delayed(kDoubleTapTimeout + Duration(milliseconds: 100))); - - // Perform second two-finger tap - pointer1 = await tester.startGesture(center.translate(-64, 0)); - pointer2 = await tester.startGesture(center.translate(64, 0)); - await tester.pump(Duration(milliseconds: 50)); - await pointer1.up(); - await pointer2.up(); - - // Perform third two-finger tap - await tester.pump(Duration(milliseconds: 200)); - pointer1 = await tester.startGesture(center.translate(-64, 0)); - pointer2 = await tester.startGesture(center.translate(64, 0)); - await tester.pump(Duration(milliseconds: 50)); - await pointer1.up(); - await pointer2.up(); - await tester.pumpAndSettle(); - - expect(called, isTrue); - }); - - testWidgetsWithAccessibilityChecks('Does not invoke callback on single-finger tap', (tester) async { - bool called = false; - await tester.pumpWidget( - TestApp( - TwoFingerDoubleTapGestureDetector( - child: Container(color: Colors.grey), - onDoubleTap: () => called = true, - ), - ), - ); - await tester.pump(); - - // Perform single tap - await tester.tap(find.byType(TwoFingerDoubleTapGestureDetector)); - await tester.pumpAndSettle(); - - expect(called, isFalse); - }); - - testWidgetsWithAccessibilityChecks('Does not invoke callback on single-finger double tap', (tester) async { - bool called = false; - await tester.pumpWidget( - TestApp( - TwoFingerDoubleTapGestureDetector( - child: Container(color: Colors.grey), - onDoubleTap: () => called = true, - ), - ), - ); - await tester.pump(); - - // Perform single-finger double tap - await tester.tap(find.byType(TwoFingerDoubleTapGestureDetector)); - await tester.pump(Duration(milliseconds: 100)); - await tester.tap(find.byType(TwoFingerDoubleTapGestureDetector)); - await tester.pumpAndSettle(); - - expect(called, isFalse); - }); - - testWidgetsWithAccessibilityChecks('Does not invoke callback on two-finger tap', (tester) async { - bool called = false; - await tester.pumpWidget( - TestApp( - TwoFingerDoubleTapGestureDetector( - child: Container(color: Colors.grey), - onDoubleTap: () => called = true, - ), - ), - ); - await tester.pump(); - - Offset center = tester.getCenter(find.byType(TwoFingerDoubleTapGestureDetector)); - - // Perform first two-finger tap - TestGesture pointer1 = await tester.startGesture(center.translate(-64, 0)); - TestGesture pointer2 = await tester.startGesture(center.translate(64, 0)); - await pointer1.up(); - await pointer2.up(); - await tester.pumpAndSettle(); - - expect(called, isFalse); - }); - - testWidgetsWithAccessibilityChecks('Does not invoke callback on triple-finger double-tap', (tester) async { - bool called = false; - await tester.pumpWidget( - TestApp( - TwoFingerDoubleTapGestureDetector( - child: Container(color: Colors.grey), - onDoubleTap: () => called = true, - ), - ), - ); - await tester.pump(); - - Offset center = tester.getCenter(find.byType(TwoFingerDoubleTapGestureDetector)); - - // Perform first two-finger tap - TestGesture pointer1 = await tester.startGesture(center.translate(-64, 0)); - TestGesture pointer2 = await tester.startGesture(center.translate(64, 0)); - TestGesture pointer3 = await tester.startGesture(center); - await pointer1.up(); - await pointer2.up(); - await pointer3.up(); - - // Perform second two-finger tap - await tester.pump(Duration(milliseconds: 100)); - pointer1 = await tester.startGesture(center.translate(-64, 0)); - pointer2 = await tester.startGesture(center.translate(64, 0)); - pointer3 = await tester.startGesture(center); - await pointer1.up(); - await pointer2.up(); - await pointer3.up(); - await tester.pumpAndSettle(); - - expect(called, isFalse); - }); -} diff --git a/apps/flutter_parent/test/utils/widgets/user_name_test.dart b/apps/flutter_parent/test/utils/widgets/user_name_test.dart deleted file mode 100644 index d35747e983..0000000000 --- a/apps/flutter_parent/test/utils/widgets/user_name_test.dart +++ /dev/null @@ -1,42 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:flutter_parent/utils/common_widgets/user_name.dart'; -import 'package:test/test.dart'; - -void main() { - test('text returns only username if pronouns is null', () { - String name = 'User Name'; - String? pronouns = null; - - UserName userName = UserName(name, pronouns); - expect(userName.text, name); - }); - - test('text returns only username if pronouns is empty', () { - String name = 'User Name'; - String pronouns = ''; - - UserName userName = UserName(name, pronouns); - expect(userName.text, name); - }); - - test('text returns formatted value if pronouns is valid', () { - String name = 'User Name'; - String pronouns = 'pro/noun'; - - UserName userName = UserName(name, pronouns); - expect(userName.text, 'User Name (pro/noun)'); - }); -} diff --git a/apps/flutter_parent/test/utils/widgets/view_attachments/fetcher/attachment_fetcher_interactor_test.dart b/apps/flutter_parent/test/utils/widgets/view_attachments/fetcher/attachment_fetcher_interactor_test.dart deleted file mode 100644 index cc65ebfc71..0000000000 --- a/apps/flutter_parent/test/utils/widgets/view_attachments/fetcher/attachment_fetcher_interactor_test.dart +++ /dev/null @@ -1,162 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'dart:io'; - -import 'package:built_value/json_object.dart'; -import 'package:dio/dio.dart'; -import 'package:flutter_parent/models/attachment.dart'; -import 'package:flutter_parent/network/api/file_api.dart'; -import 'package:flutter_parent/utils/common_widgets/view_attachment/fetcher/attachment_fetcher_interactor.dart'; -import 'package:flutter_parent/utils/veneers/path_provider_veneer.dart'; -import 'package:get_it/get_it.dart'; -import 'package:mockito/mockito.dart'; -import 'package:test/test.dart'; - -import '../../../test_app.dart'; -import '../../../test_helpers/mock_helpers.mocks.dart'; - -void main() { - setUp(() { - // Move to a temp dir so we don't write test files to the project dir - Directory.current = Directory.systemTemp; - Directory('cache').createSync(); - }); - - tearDown(() { - // Delete cache dir and contents - Directory('cache').deleteSync(recursive: true); - }); - - test('getAttachmentSavePath returns correct value for valid file name', () async { - await _setupLocator(); - var attachment = _makeAttachment(); - - var expected = 'cache/attachment-123-fake-file.txt'; - var actual = await AttachmentFetcherInteractor().getAttachmentSavePath(attachment); - - expect(actual, expected); - }); - - test('getAttachmentSavePath returns correct value for invalid file name but valid url', () async { - _setupLocator(); - var attachment = _makeAttachment().rebuild((a) => a..filename = ''); - - var expected = 'cache/attachment-123-fake-file.txt'; - var actual = await AttachmentFetcherInteractor().getAttachmentSavePath(attachment); - - expect(actual, expected); - }); - - test('getAttachmentSavePath returns correct value for invalid file name and url', () async { - _setupLocator(); - var attachment = _makeAttachment().rebuild((a) => a - ..filename = '' - ..url = 'https://fake.url.com/'); - - var expected = 'cache/attachment-123-file'; - var actual = await AttachmentFetcherInteractor().getAttachmentSavePath(attachment); - - expect(actual, expected); - }); - - test('fetchAttachmentFile calls fileApi with correct parameters', () async { - var attachment = _makeAttachment(); - var fileApi = MockFileApi(); - - _setupLocator((locator) { - locator.registerLazySingleton(() => fileApi); - }); - - CancelToken cancelToken = CancelToken(); - - await AttachmentFetcherInteractor().fetchAttachmentFile(attachment, cancelToken); - - verify( - fileApi.downloadFile( - attachment.url!, - 'cache/attachment-123-fake-file.txt', - cancelToken: cancelToken, - ), - ).called(1); - }); - - test('fetchAttachmentFile does not call FileApi if cached file exists', () async { - var savePath = 'cache/attachment-123-fake-file.txt'; - - // Crate 'cached' file - var cachedFile = await File(savePath).create(recursive: true); - await cachedFile.writeAsString('This is a test'); - - var attachment = _makeAttachment().rebuild((b) => b..size = 14); - var fileApi = MockFileApi(); - - _setupLocator((locator) { - locator.registerLazySingleton(() => fileApi); - }); - - var file = await AttachmentFetcherInteractor().fetchAttachmentFile(attachment, CancelToken()); - - // File should have the expected path - expect(file.path, savePath); - - // Should have returned cached file without performing download - verifyNever(fileApi.downloadFile(any, any, cancelToken: anyNamed('cancelToken'))); - }); - - test('fetchAttachmentFile calls FileApi if cached file exists but size does not match', () async { - var savePath = 'cache/attachment-123-fake-file.txt'; - - // Crate 'cached' file - var cachedFile = await File(savePath).create(recursive: true); - await cachedFile.writeAsString('This is a test but the file size does not match'); - - var attachment = _makeAttachment().rebuild((b) => b..size = 14); - var fileApi = MockFileApi(); - - _setupLocator((locator) { - locator.registerLazySingleton(() => fileApi); - }); - - CancelToken cancelToken = CancelToken(); - - await AttachmentFetcherInteractor().fetchAttachmentFile(attachment, cancelToken); - - verify( - fileApi.downloadFile( - attachment.url, - 'cache/attachment-123-fake-file.txt', - cancelToken: cancelToken, - ), - ).called(1); - }); -} - -_setupLocator([config(GetIt locator)? = null]) async { - var pathProvider = MockPathProviderVeneer(); - await setupTestLocator((locator) { - locator.registerLazySingleton(() => pathProvider); - if (config != null) config(locator); - }); - when(pathProvider.getTemporaryDirectory()).thenAnswer((_) => Future.value(Directory('cache'))); -} - -Attachment _makeAttachment() { - return Attachment((a) => a - ..jsonId = JsonObject('123') - ..displayName = 'Display Name' - ..filename = 'fake-file.txt' - ..size = 14 // File size for text file with the contents 'This is a test' - ..url = 'https://fake.url.com/fake-file.txt'); -} \ No newline at end of file diff --git a/apps/flutter_parent/test/utils/widgets/view_attachments/fetcher/attachment_fetcher_test.dart b/apps/flutter_parent/test/utils/widgets/view_attachments/fetcher/attachment_fetcher_test.dart deleted file mode 100644 index e10bf00bd8..0000000000 --- a/apps/flutter_parent/test/utils/widgets/view_attachments/fetcher/attachment_fetcher_test.dart +++ /dev/null @@ -1,192 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'dart:async'; -import 'dart:io'; - -import 'package:dio/dio.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_parent/l10n/app_localizations.dart'; -import 'package:flutter_parent/models/attachment.dart'; -import 'package:flutter_parent/utils/common_widgets/error_panda_widget.dart'; -import 'package:flutter_parent/utils/common_widgets/loading_indicator.dart'; -import 'package:flutter_parent/utils/common_widgets/view_attachment/fetcher/attachment_fetcher.dart'; -import 'package:flutter_parent/utils/common_widgets/view_attachment/fetcher/attachment_fetcher_interactor.dart'; -import 'package:flutter_parent/utils/quick_nav.dart'; -import 'package:flutter_test/flutter_test.dart'; -import 'package:mockito/mockito.dart'; - -import '../../../accessibility_utils.dart'; -import '../../../test_app.dart'; -import '../../../test_helpers/mock_helpers.mocks.dart'; - -void main() { - testWidgetsWithAccessibilityChecks('displays loading state', (tester) async { - var interactor = MockAttachmentFetcherInteractor(); - setupTestLocator((locator) { - locator.registerFactory(() => interactor); - }); - - Completer completer = Completer(); - when(interactor.fetchAttachmentFile(any, any)).thenAnswer((_) => completer.future); - when(interactor.generateCancelToken()).thenAnswer((_) => CancelToken()); - - await tester.pumpWidget( - TestApp(Material(child: AttachmentFetcher(attachment: Attachment(), builder: (_, __) => Container()))), - ); - await tester.pump(); - - expect(find.byType(LoadingIndicator), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('provides correct file to builder', (tester) async { - var interactor = MockAttachmentFetcherInteractor(); - setupTestLocator((locator) { - locator.registerFactory(() => interactor); - }); - - var expectedFile = File('fakefile.exe'); - when(interactor.fetchAttachmentFile(any, any)).thenAnswer((_) => Future.value(expectedFile)); - when(interactor.generateCancelToken()).thenAnswer((_) => CancelToken()); - - late File actualFile; - await tester.pumpWidget( - TestApp(Material( - child: AttachmentFetcher( - attachment: Attachment(), - builder: (_, file) { - actualFile = file; - return Container(); - }, - ))), - ); - await tester.pumpAndSettle(); - - expect(actualFile, expectedFile); - }); - - testWidgetsWithAccessibilityChecks('builds child on success', (tester) async { - var interactor = MockAttachmentFetcherInteractor(); - setupTestLocator((locator) { - locator.registerFactory(() => interactor); - }); - - var expectedFile = File('fakefile.exe'); - when(interactor.fetchAttachmentFile(any, any)).thenAnswer((_) => Future.value(expectedFile)); - when(interactor.generateCancelToken()).thenAnswer((_) => CancelToken()); - - await tester.pumpWidget( - TestApp(Material( - child: AttachmentFetcher( - attachment: Attachment(), - builder: (_, file) => Text(file.path), - ))), - ); - await tester.pumpAndSettle(); - - expect(find.text(expectedFile.path), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('displays error state', (tester) async { - var interactor = MockAttachmentFetcherInteractor(); - setupTestLocator((locator) { - locator.registerFactory(() => interactor); - }); - - when(interactor.fetchAttachmentFile(any, any)).thenAnswer((_) => Future.error('')); - when(interactor.generateCancelToken()).thenAnswer((_) => CancelToken()); - - await tester.pumpWidget( - TestApp( - Material(child: AttachmentFetcher(attachment: Attachment(), builder: (_, file) => Container())), - ), - ); - await tester.pumpAndSettle(); - - expect(find.byType(ErrorPandaWidget), findsOneWidget); - expect(find.text(AppLocalizations().errorLoadingFile), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('performs retry', (tester) async { - var interactor = MockAttachmentFetcherInteractor(); - setupTestLocator((locator) { - locator.registerFactory(() => interactor); - }); - - when(interactor.fetchAttachmentFile(any, any)).thenAnswer((_) => Future.error('')); - when(interactor.generateCancelToken()).thenAnswer((_) => CancelToken()); - - await tester.pumpWidget( - TestApp( - Material(child: AttachmentFetcher(attachment: Attachment(), builder: (_, file) => Text('success'))), - ), - ); - await tester.pumpAndSettle(); - - var retryButton = find.text(AppLocalizations().retry); - expect(retryButton, findsOneWidget); - expect(find.text('success'), findsNothing); - - when(interactor.fetchAttachmentFile(any, any)).thenAnswer((_) => Future.value(File(''))); - await tester.tap(retryButton); - await tester.pumpAndSettle(); - - expect(find.text('success'), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('cancels request on dispose', (tester) async { - var interactor = MockAttachmentFetcherInteractor(); - setupTestLocator((locator) { - locator.registerFactory(() => interactor); - }); - - when(interactor.fetchAttachmentFile(any, any)).thenAnswer((_) => Future.error('')); - - var cancelToken = MockCancelToken(); - when(interactor.generateCancelToken()).thenReturn(cancelToken); - - await tester.pumpWidget( - TestApp( - Builder( - builder: (context) => Center( - child: ElevatedButton( - style: ElevatedButton.styleFrom( - backgroundColor: Colors.white, - ), - onPressed: () => QuickNav().push( - context, - Material(child: AttachmentFetcher(attachment: Attachment(), builder: (_, __) => Container())), - ), - child: Text( - 'click me', - style: Theme.of(context).textTheme.bodyMedium, - ), - ), - ), - ), - ), - ); - await tester.pumpAndSettle(); - - await tester.tap(find.byType(ElevatedButton)); - await tester.pumpAndSettle(); - - expect(find.byType(AttachmentFetcher), findsOneWidget); - - TestApp.navigatorKey.currentState?.pop(); - await tester.pumpAndSettle(); - - verify(cancelToken.cancel()).called(1); - }); -} diff --git a/apps/flutter_parent/test/utils/widgets/view_attachments/view_attachment_interactor_test.dart b/apps/flutter_parent/test/utils/widgets/view_attachments/view_attachment_interactor_test.dart deleted file mode 100644 index eefa47bc5a..0000000000 --- a/apps/flutter_parent/test/utils/widgets/view_attachments/view_attachment_interactor_test.dart +++ /dev/null @@ -1,64 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'dart:io'; - -import 'package:android_intent_plus/android_intent.dart'; -import 'package:flutter_parent/models/attachment.dart'; -import 'package:flutter_parent/utils/common_widgets/view_attachment/view_attachment_interactor.dart'; -import 'package:flutter_parent/utils/permission_handler.dart'; -import 'package:flutter_parent/utils/veneers/android_intent_veneer.dart'; -import 'package:flutter_parent/utils/veneers/flutter_downloader_veneer.dart'; -import 'package:flutter_parent/utils/veneers/path_provider_veneer.dart'; -import 'package:mockito/mockito.dart'; -import 'package:path_provider/path_provider.dart'; -import 'package:permission_handler/permission_handler.dart'; -import 'package:test/test.dart'; - -import '../../test_app.dart'; -import '../../test_helpers/mock_helpers.mocks.dart'; - -void main() { - test('downloadFile calls PathProvider and FlutterDownloader with correct parameters', () async { - var permissionHandler = MockPermissionHandler(); - var pathProvider = MockPathProviderVeneer(); - var downloader = MockFlutterDownloaderVeneer(); - await setupTestLocator((locator) { - locator.registerLazySingleton(() => permissionHandler); - locator.registerLazySingleton(() => pathProvider); - locator.registerLazySingleton(() => downloader); - }); - - Attachment attachment = Attachment((a) => a..url = 'fake_url'); - - when(permissionHandler.checkPermissionStatus(Permission.storage)) - .thenAnswer((_) => Future.value(PermissionStatus.granted)); - - when(pathProvider.getExternalStorageDirectories(type: StorageDirectory.downloads)) - .thenAnswer((_) => Future.value([Directory('downloads')])); - - await ViewAttachmentInteractor().downloadFile(attachment); - - verify(pathProvider.getExternalStorageDirectories(type: StorageDirectory.downloads)).called(1); - - verify( - downloader.enqueue( - url: attachment.url, - savedDir: 'downloads', - showNotification: true, - openFileFromNotification: true, - ), - ); - }); -} diff --git a/apps/flutter_parent/test/utils/widgets/view_attachments/view_attachment_screen_test.dart b/apps/flutter_parent/test/utils/widgets/view_attachments/view_attachment_screen_test.dart deleted file mode 100644 index f3a08baf4f..0000000000 --- a/apps/flutter_parent/test/utils/widgets/view_attachments/view_attachment_screen_test.dart +++ /dev/null @@ -1,204 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:flutter/material.dart'; -import 'package:flutter_parent/l10n/app_localizations.dart'; -import 'package:flutter_parent/models/attachment.dart'; -import 'package:flutter_parent/utils/common_widgets/view_attachment/fetcher/attachment_fetcher_interactor.dart'; -import 'package:flutter_parent/utils/common_widgets/view_attachment/view_attachment_interactor.dart'; -import 'package:flutter_parent/utils/common_widgets/view_attachment/view_attachment_screen.dart'; -import 'package:flutter_parent/utils/common_widgets/view_attachment/viewers/audio_video_attachment_viewer.dart'; -import 'package:flutter_parent/utils/common_widgets/view_attachment/viewers/audio_video_attachment_viewer_interactor.dart'; -import 'package:flutter_parent/utils/common_widgets/view_attachment/viewers/image_attachment_viewer.dart'; -import 'package:flutter_parent/utils/common_widgets/view_attachment/viewers/text_attachment_viewer.dart'; -import 'package:flutter_parent/utils/common_widgets/view_attachment/viewers/unknown_attachment_type_viewer.dart'; -import 'package:flutter_test/flutter_test.dart'; -import 'package:mockito/mockito.dart'; - -import '../../accessibility_utils.dart'; -import '../../network_image_response.dart'; -import '../../test_app.dart'; -import '../../test_helpers/mock_helpers.mocks.dart'; - -void main() { - mockNetworkImageResponse(); - - AppLocalizations l10n = AppLocalizations(); - - testWidgetsWithAccessibilityChecks('shows attachment display name', (tester) async { - setupTestLocator((locator) => locator.registerFactory(() => MockViewAttachmentInteractor())); - Attachment attachment = Attachment((a) => a..displayName = 'Display Name'); - - await tester.pumpWidget(TestApp(ViewAttachmentScreen(attachment))); - await tester.pumpAndSettle(); - - expect(find.descendant(of: find.byType(AppBar), matching: find.text(attachment.displayName!)), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('shows overflow menu', (tester) async { - setupTestLocator((locator) => locator.registerFactory(() => MockViewAttachmentInteractor())); - Attachment attachment = Attachment((a) => a..displayName = 'Display Name'); - - await tester.pumpWidget(TestApp(ViewAttachmentScreen(attachment))); - await tester.pumpAndSettle(); - - var overflow = find.descendant(of: find.byType(AppBar), matching: find.byIcon(Icons.more_vert)); - expect(overflow, findsOneWidget); - - await tester.tap(overflow); - await tester.pumpAndSettle(); - - expect(find.text(l10n.openFileExternally), findsOneWidget); - expect(find.text(l10n.download), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('download button calls interactor', (tester) async { - var interactor = MockViewAttachmentInteractor(); - setupTestLocator((locator) => locator.registerFactory(() => interactor)); - Attachment attachment = Attachment((a) => a..displayName = 'Display Name'); - - await tester.pumpWidget(TestApp(ViewAttachmentScreen(attachment))); - await tester.pumpAndSettle(); - - await tester.tap(find.descendant(of: find.byType(AppBar), matching: find.byIcon(Icons.more_vert))); - await tester.pumpAndSettle(); - - await tester.tap(find.text(l10n.download)); - - verify(interactor.downloadFile(attachment)).called(1); - }); - - testWidgetsWithAccessibilityChecks('open externally button calls interactor', (tester) async { - var interactor = MockViewAttachmentInteractor(); - setupTestLocator((locator) => locator.registerFactory(() => interactor)); - Attachment attachment = Attachment((a) => a..displayName = 'Display Name'); - - when(interactor.openExternally(any)).thenAnswer((_) => Future.value(null)); - - await tester.pumpWidget(TestApp(ViewAttachmentScreen(attachment))); - await tester.pumpAndSettle(); - - await tester.tap(find.descendant(of: find.byType(AppBar), matching: find.byIcon(Icons.more_vert))); - await tester.pumpAndSettle(); - - await tester.tap(find.text(l10n.openFileExternally)); - - verify(interactor.openExternally(attachment)).called(1); - }); - - testWidgetsWithAccessibilityChecks('displays snackbar when open externally fails', (tester) async { - var interactor = MockViewAttachmentInteractor(); - setupTestLocator((locator) => locator.registerFactory(() => interactor)); - Attachment attachment = Attachment((a) => a..displayName = 'Display Name'); - - when(interactor.openExternally(any)).thenAnswer((_) => Future.error('')); - - await tester.pumpWidget(TestApp(ViewAttachmentScreen(attachment))); - await tester.pumpAndSettle(); - - await tester.tap(find.descendant(of: find.byType(AppBar), matching: find.byIcon(Icons.more_vert))); - await tester.pumpAndSettle(); - - await tester.tap(find.text(l10n.openFileExternally)); - await tester.pump(Duration(milliseconds: 200)); - - expect( - find.descendant(of: find.byType(SnackBar), matching: find.text(l10n.noApplicationsToHandleFile)), - findsOneWidget, - ); - }); - - testWidgetsWithAccessibilityChecks('shows attachment file name if display name is null', (tester) async { - setupTestLocator((locator) => locator.registerFactory(() => MockViewAttachmentInteractor())); - Attachment attachment = Attachment((a) => a - ..displayName = null - ..filename = 'File Name'); - - await tester.pumpWidget(TestApp(ViewAttachmentScreen(attachment))); - await tester.pumpAndSettle(); - - expect(find.descendant(of: find.byType(AppBar), matching: find.text(attachment.filename!)), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('shows correct widget for images', (tester) async { - setupTestLocator((locator) => locator.registerFactory(() => MockViewAttachmentInteractor())); - Attachment attachment = Attachment((a) => a - ..displayName = 'Display Name' - ..url = 'fake_url' - ..contentType = 'image/fake'); - await tester.pumpWidget(TestApp(ViewAttachmentScreen(attachment))); - await tester.pump(); - - expect(find.byType(ImageAttachmentViewer), findsOneWidget); - }); - - // TODO Fix test - testWidgetsWithAccessibilityChecks('shows correct widget for videos', (tester) async { - setupTestLocator((locator) { - locator.registerFactory(() => MockViewAttachmentInteractor()); - locator.registerFactory(() => AudioVideoAttachmentViewerInteractor()); - }); - Attachment attachment = Attachment((a) => a - ..displayName = 'Display Name' - ..url = 'fake_url' - ..contentType = 'video/fake'); - await tester.pumpWidget(TestApp(ViewAttachmentScreen(attachment))); - await tester.pump(); - - expect(find.byType(AudioVideoAttachmentViewer), findsOneWidget); - }, skip: true); - - // TODO Fix test - testWidgetsWithAccessibilityChecks('shows correct widget for audio', (tester) async { - setupTestLocator((locator) { - locator.registerFactory(() => MockViewAttachmentInteractor()); - locator.registerFactory(() => AudioVideoAttachmentViewerInteractor()); - }); - Attachment attachment = Attachment((a) => a - ..displayName = 'Display Name' - ..url = 'fake_url' - ..contentType = 'audio/fake'); - await tester.pumpWidget(TestApp(ViewAttachmentScreen(attachment))); - await tester.pump(); - - expect(find.byType(AudioVideoAttachmentViewer), findsOneWidget); - }, skip: true); - - testWidgetsWithAccessibilityChecks('shows correct widget for text', (tester) async { - setupTestLocator((locator) { - locator.registerFactory(() => MockViewAttachmentInteractor()); - locator.registerFactory(() => AttachmentFetcherInteractor()); - }); - Attachment attachment = Attachment((a) => a - ..displayName = 'Display Name' - ..url = 'fake_url' - ..contentType = 'text/plain'); - await tester.pumpWidget(TestApp(ViewAttachmentScreen(attachment))); - await tester.pump(); - - expect(find.byType(TextAttachmentViewer), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('shows correct widget for unknown type', (tester) async { - setupTestLocator((locator) => locator.registerFactory(() => MockViewAttachmentInteractor())); - Attachment attachment = Attachment((a) => a - ..displayName = 'Display Name' - ..url = 'fake_url' - ..contentType = 'unknown/type'); - await tester.pumpWidget(TestApp(ViewAttachmentScreen(attachment))); - await tester.pump(); - - expect(find.byType(UnknownAttachmentTypeViewer), findsOneWidget); - }); -} \ No newline at end of file diff --git a/apps/flutter_parent/test/utils/widgets/view_attachments/viewers/audio_video_attachment_viewer_test.dart b/apps/flutter_parent/test/utils/widgets/view_attachments/viewers/audio_video_attachment_viewer_test.dart deleted file mode 100644 index d76928b525..0000000000 --- a/apps/flutter_parent/test/utils/widgets/view_attachments/viewers/audio_video_attachment_viewer_test.dart +++ /dev/null @@ -1,267 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'dart:async'; - -import 'package:chewie/chewie.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_parent/models/attachment.dart'; -import 'package:flutter_parent/utils/common_widgets/empty_panda_widget.dart'; -import 'package:flutter_parent/utils/common_widgets/loading_indicator.dart'; -import 'package:flutter_parent/utils/common_widgets/view_attachment/viewers/audio_video_attachment_viewer.dart'; -import 'package:flutter_parent/utils/common_widgets/view_attachment/viewers/audio_video_attachment_viewer_interactor.dart'; -import 'package:flutter_parent/utils/design/canvas_icons.dart'; -import 'package:flutter_test/flutter_test.dart'; -import 'package:mockito/mockito.dart'; -import 'package:video_player/video_player.dart'; -import 'package:video_player_platform_interface/video_player_platform_interface.dart'; - -import '../../../accessibility_utils.dart'; -import '../../../test_app.dart'; -import '../../../test_helpers/mock_helpers.mocks.dart'; - -void main() { - testWidgetsWithAccessibilityChecks('displays loading indicator', (tester) async { - var interactor = MockAudioVideoAttachmentViewerInteractor(); - setupTestLocator((locator) { - locator.registerFactory(() => interactor); - }); - - var controller = MockVideoPlayerController(); - when(interactor.makeController(any)).thenReturn(controller); - - Completer initCompleter = Completer(); - when(controller.initialize()).thenAnswer((_) => initCompleter.future); - - var attachment = Attachment((a) => a - ..contentType = 'video/mp4' - ..url = 'https://fake.url.com/fake-video.mp4'); - - await tester.pumpWidget(TestApp(Material(child: AudioVideoAttachmentViewer(attachment)))); - await tester.pump(); - - expect(find.byType(LoadingIndicator), findsOneWidget); - }); - - // TODO Fix test - testWidgetsWithAccessibilityChecks('displays error widget', (tester) async { - var interactor = MockAudioVideoAttachmentViewerInteractor(); - setupTestLocator((locator) { - locator.registerFactory(() => interactor); - }); - - var controller = _FakeVideoController(hasError: true); - when(interactor.makeController(any)).thenReturn(controller); - - var attachment = Attachment((a) => a - ..contentType = 'video/mp4' - ..url = ''); - - await tester.pumpWidget(TestApp(Material(child: AudioVideoAttachmentViewer(attachment)))); - await tester.pumpAndSettle(); - - expect(find.byType(EmptyPandaWidget), findsOneWidget); - }, skip: true); - - testWidgetsWithAccessibilityChecks('displays error widget when controller is null', (tester) async { - var interactor = MockAudioVideoAttachmentViewerInteractor(); - setupTestLocator((locator) { - locator.registerFactory(() => interactor); - }); - - when(interactor.makeController(any)).thenReturn(null); - - var attachment = Attachment((a) => a - ..contentType = 'video/mp4' - ..url = ''); - - await tester.pumpWidget(TestApp(Material(child: AudioVideoAttachmentViewer(attachment)))); - await tester.pumpAndSettle(); - - expect(find.byType(EmptyPandaWidget), findsOneWidget); - }, skip: true); - - // Testing w/o a11y checks due to minor issues in Chewie that we can't control - testWidgets('displays video player', (tester) async { - var interactor = MockAudioVideoAttachmentViewerInteractor(); - VideoPlayerPlatform.instance = _FakeVideoPlayerPlatform(); - setupTestLocator((locator) { - locator.registerFactory(() => interactor); - }); - - var controller = _FakeVideoController(); - when(interactor.makeController(any)).thenReturn(controller); - - var attachment = Attachment((a) => a - ..contentType = 'video/mp4' - ..url = ''); - - await tester.pumpWidget(TestApp(Material(child: AudioVideoAttachmentViewer(attachment)))); - await tester.pumpAndSettle(); - - expect(find.byType(Chewie), findsOneWidget); - }); - - // Testing w/o a11y checks due to minor issues in Chewie that we can't control - testWidgets('displays audio icon for audio attachment', (tester) async { - var interactor = MockAudioVideoAttachmentViewerInteractor(); - VideoPlayerPlatform.instance = _FakeVideoPlayerPlatform(); - setupTestLocator((locator) { - locator.registerFactory(() => interactor); - }); - - var controller = _FakeVideoController(); - when(interactor.makeController(any)).thenReturn(controller); - - var attachment = Attachment((a) => a - ..contentType = 'audio/mp3' - ..url = ''); - - await tester.pumpWidget(TestApp(Material(child: AudioVideoAttachmentViewer(attachment)))); - await tester.pumpAndSettle(); - - expect(find.byIcon(CanvasIcons.audio), findsOneWidget); - }); -} - -class _FakeVideoController extends Fake implements VideoPlayerController { - final bool hasError; - - _FakeVideoController({this.hasError = false}); - - - - @override - VideoPlayerValue get value => VideoPlayerValue( - duration: Duration(seconds: 3), - errorDescription: hasError ? 'Error' : null, - isInitialized: true, - ); - - @override - Future setLooping(bool looping) async => null; - - @override - Future initialize() async => null; - - @override - Future dispose() async => null; - - @override - Future play() async => null; - - @override - int get textureId => 0; - - @override - void addListener(listener) {} - - @override - void removeListener(listener) {} -} - -class _FakeVideoPlayerPlatform extends VideoPlayerPlatform { - final Completer initialized = Completer(); - final List calls = []; - final List dataSources = []; - final Map> streams = - >{}; - final bool forceInitError; - int nextTextureId = 0; - final Map _positions = {}; - - _FakeVideoPlayerPlatform({ - this.forceInitError = false, - }); - - @override - Future create(DataSource dataSource) async { - calls.add('create'); - final StreamController stream = StreamController(); - streams[nextTextureId] = stream; - stream.add( - VideoEvent( - eventType: VideoEventType.initialized, - size: const Size(100, 100), - duration: const Duration(seconds: 1), - ), - ); - dataSources.add(dataSource); - return nextTextureId++; - } - - @override - Future dispose(int textureId) async { - calls.add('dispose'); - } - - @override - Future init() async { - calls.add('init'); - initialized.complete(true); - } - - @override - Stream videoEventsFor(int textureId) { - return streams[textureId]!.stream; - } - - @override - Future pause(int textureId) async { - calls.add('pause'); - } - - @override - Future play(int textureId) async { - calls.add('play'); - } - - @override - Future getPosition(int textureId) async { - calls.add('position'); - return _positions[textureId] ?? Duration.zero; - } - - @override - Future seekTo(int textureId, Duration position) async { - calls.add('seekTo'); - _positions[textureId] = position; - } - - @override - Future setLooping(int textureId, bool looping) async { - calls.add('setLooping'); - } - - @override - Future setVolume(int textureId, double volume) async { - calls.add('setVolume'); - } - - @override - Future setPlaybackSpeed(int textureId, double speed) async { - calls.add('setPlaybackSpeed'); - } - - @override - Future setMixWithOthers(bool mixWithOthers) async { - calls.add('setMixWithOthers'); - } - - @override - Widget buildView(int textureId) { - return Texture(textureId: textureId); - } -} - diff --git a/apps/flutter_parent/test/utils/widgets/view_attachments/viewers/image_attachment_viewer_test.dart b/apps/flutter_parent/test/utils/widgets/view_attachments/viewers/image_attachment_viewer_test.dart deleted file mode 100644 index 8e10081ce7..0000000000 --- a/apps/flutter_parent/test/utils/widgets/view_attachments/viewers/image_attachment_viewer_test.dart +++ /dev/null @@ -1,78 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:flutter/material.dart'; -import 'package:flutter/widgets.dart'; -import 'package:flutter_parent/models/attachment.dart'; -import 'package:flutter_parent/utils/common_widgets/loading_indicator.dart'; -import 'package:flutter_parent/utils/common_widgets/view_attachment/viewers/image_attachment_viewer.dart'; -import 'package:flutter_svg/flutter_svg.dart'; -import 'package:flutter_test/flutter_test.dart'; -import 'package:photo_view/photo_view.dart'; - -import '../../../accessibility_utils.dart'; -import '../../../network_image_response.dart'; -import '../../../test_app.dart'; - -void main() { - mockNetworkImageResponse(); - - testWidgetsWithAccessibilityChecks('displays loading indicator', (tester) async { - var attachment = Attachment((a) => a - ..contentType = 'image/png' - ..url = 'https://fake.url.com/fake-image.png'); - - await tester.pumpWidget(TestApp(Material(child: ImageAttachmentViewer(attachment)))); - await tester.pump(); - - expect(find.byType(LoadingIndicator), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('displays loading indicator for svgs', (tester) async { - var attachment = Attachment((a) => a - ..contentType = 'image/svg' - ..url = 'https://fake.url.com/fake-image.svg'); - - await tester.pumpWidget(TestApp(Material(child: ImageAttachmentViewer(attachment)))); - await tester.pump(); - - expect(find.byType(LoadingIndicator), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('displays image', (tester) async { - var attachment = Attachment((a) => a - ..contentType = 'image/png' - ..url = 'https://fake.url.com/fake-image.png'); - - await tester.pumpWidget(TestApp(Material(child: ImageAttachmentViewer(attachment)))); - await tester.pump(Duration(milliseconds: 100)); - - expect(find.byType(PhotoView), findsOneWidget); - - // PhotoView doesn't seem to resolve images in unit tests, so we'll check that the image provider is set up correctly - PhotoView photoView = tester.widget(find.byType(PhotoView)); - expect((photoView.imageProvider as NetworkImage).url, attachment.url); - }); - - testWidgetsWithAccessibilityChecks('displays svg using SvgPicture', (tester) async { - var attachment = Attachment((a) => a - ..contentType = 'image/svg' - ..url = 'https://fake.url.com/fake-image.svg'); - - await tester.pumpWidget(TestApp(Material(child: ImageAttachmentViewer(attachment)))); - await tester.pump(Duration(milliseconds: 100)); - - expect(find.byType(SvgPicture), findsOneWidget); - }); -} diff --git a/apps/flutter_parent/test/utils/widgets/view_attachments/viewers/text_attachment_viewer_test.dart b/apps/flutter_parent/test/utils/widgets/view_attachments/viewers/text_attachment_viewer_test.dart deleted file mode 100644 index 0dffe7348a..0000000000 --- a/apps/flutter_parent/test/utils/widgets/view_attachments/viewers/text_attachment_viewer_test.dart +++ /dev/null @@ -1,145 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'dart:io'; - -import 'package:dio/dio.dart'; -import 'package:flutter/widgets.dart'; -import 'package:flutter_parent/models/attachment.dart'; -import 'package:flutter_parent/utils/common_widgets/view_attachment/fetcher/attachment_fetcher_interactor.dart'; -import 'package:flutter_parent/utils/common_widgets/view_attachment/viewers/text_attachment_viewer.dart'; -import 'package:flutter_test/flutter_test.dart'; -import 'package:mockito/mockito.dart'; - -import '../../../accessibility_utils.dart'; -import '../../../test_app.dart'; -import '../../../test_helpers/mock_helpers.mocks.dart'; - -void main() { - setUpAll(() async { - // Move to a temp dir so we don't write test files to the project dir - Directory.current = Directory.systemTemp; - await Directory('cache').create(); - }); - - tearDownAll(() async { - // Delete cache dir and contents - await Directory('cache').delete(recursive: true); - }); - - testWidgets('displays text', (tester) async { - var text = 'This is a test'; - _setupLocator(text); - - await tester.pumpWidget(TestApp(TextAttachmentViewer(Attachment()))); - await tester.pumpAndSettle(); - - expect(find.text(text), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('zooms text', (tester) async { - var text = 'This is a test'; - _setupLocator(text); - - await tester.pumpWidget(TestApp(TextAttachmentViewer(Attachment()))); - await tester.pumpAndSettle(); - - var widget = await tester.widget(find.text(text)); - expect(widget.style?.fontSize, 14); - - // Start two gestures separated by 100px - var finger1 = await tester.startGesture(Offset(100, 300)); - var finger2 = await tester.startGesture(Offset(200, 300)); - - // Move second gesture by 100px, representing a 200% zoom - await finger2.moveBy(Offset(100, 0)); - - // Complete the gestures - await finger1.up(); - await finger2.up(); - await tester.pump(); - - // Font size should have increased 200% (from 14 to 28) - widget = await tester.widget(find.text(text)); - expect(widget.style?.fontSize, 28); - }); - - testWidgetsWithAccessibilityChecks('zooms to min font size of 10', (tester) async { - var text = 'This is a test'; - _setupLocator(text); - - await tester.pumpWidget(TestApp(TextAttachmentViewer(Attachment()))); - await tester.pumpAndSettle(); - - var widget = await tester.widget(find.text(text)); - expect(widget.style?.fontSize, 14); - - // Start two gestures separated by 400px - var finger1 = await tester.startGesture(Offset(100, 300)); - var finger2 = await tester.startGesture(Offset(500, 300)); - - // Move second gesture by -400px, representing a 20% zoom - await finger2.moveBy(Offset(-400, 0)); - - // Complete the gestures - await finger1.up(); - await finger2.up(); - await tester.pump(); - - // Font size should have decreased to only 10 - widget = await tester.widget(find.text(text)); - expect(widget.style?.fontSize, 10); - }); - - testWidgetsWithAccessibilityChecks('zooms to max font size of 48', (tester) async { - var text = 'This is a test'; - _setupLocator(text); - - await tester.pumpWidget(TestApp(TextAttachmentViewer(Attachment()))); - await tester.pumpAndSettle(); - - var widget = await tester.widget(find.text(text)); - expect(widget.style?.fontSize, 14); - - // Start two gestures separated by 100px - var finger1 = await tester.startGesture(Offset(100, 300)); - var finger2 = await tester.startGesture(Offset(200, 300)); - - // Move second gesture by 400px, representing a 500% zoom - await finger2.moveBy(Offset(400, 0)); - - // Complete the gestures - await finger1.up(); - await finger2.up(); - await tester.pump(); - - // Font size should have increased only 48 - widget = await tester.widget(find.text(text)); - expect(widget.style?.fontSize, 48); - }); -} - -_setupLocator(String text) { - // Create file - var file = File('cache/test-file.txt'); - file.writeAsStringSync(text); - - // Set up interactor - var interactor = MockAttachmentFetcherInteractor(); - setupTestLocator((locator) { - locator.registerLazySingleton(() => interactor); - }); - when(interactor.generateCancelToken()).thenReturn(CancelToken()); - when(interactor.fetchAttachmentFile(any, any)).thenAnswer((_) => Future.value(file)); -} \ No newline at end of file diff --git a/apps/flutter_parent/test/utils/widgets/webview/canvas_web_view_test.dart b/apps/flutter_parent/test/utils/widgets/webview/canvas_web_view_test.dart deleted file mode 100644 index c53d0c6d58..0000000000 --- a/apps/flutter_parent/test/utils/widgets/webview/canvas_web_view_test.dart +++ /dev/null @@ -1,146 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -import 'package:flutter/material.dart'; -import 'package:flutter_parent/l10n/app_localizations.dart'; -import 'package:flutter_parent/utils/common_widgets/loading_indicator.dart'; -import 'package:flutter_parent/utils/common_widgets/web_view/canvas_web_view.dart'; -import 'package:flutter_parent/utils/common_widgets/web_view/web_content_interactor.dart'; -import 'package:flutter_test/flutter_test.dart'; -import 'package:mockito/mockito.dart'; -import 'package:webview_flutter/webview_flutter.dart'; - -import '../../accessibility_utils.dart'; -import '../../platform_config.dart'; -import '../../test_app.dart'; -import '../../test_helpers/mock_helpers.mocks.dart'; - -void main() { - final interactor = _MockWebViewInteractor(); - - setupTestLocator((locator) => locator.registerFactory(() => interactor)); - - setUp(() async { - reset(interactor); - }); - - group('completely empty', () { - testWidgetsWithAccessibilityChecks('Shows an empty container with null content and null label', (tester) async { - await tester.pumpWidget(TestApp(CanvasWebView(content: null))); - await tester.pump(); - - expect(find.descendant(of: find.byType(CanvasWebView), matching: find.byType(Container)), findsWidgets); - expect(find.byType(WebView), findsNothing); - }); - - testWidgetsWithAccessibilityChecks('Shows an empty container with empty content and empty label', (tester) async { - await tester.pumpWidget(TestApp(CanvasWebView(content: '', emptyDescription: ''))); - await tester.pump(); - - expect(find.descendant(of: find.byType(CanvasWebView), matching: find.byType(Container)), findsWidgets); - expect(find.byType(WebView), findsNothing); - }); - }); - - group('empty description', () { - testWidgetsWithAccessibilityChecks('Shows with null content', (tester) async { - final empty = 'empty'; - - await tester.pumpWidget(TestApp(CanvasWebView(content: null, emptyDescription: empty))); - await tester.pump(); // Let the widget build - await tester.pump(); // Let the webview future finish - - expect(find.descendant(of: find.byType(CanvasWebView), matching: find.text(empty)), findsOneWidget); - expect(find.byType(WebView), findsNothing); - }); - - testWidgetsWithAccessibilityChecks('Shows with empty content', (tester) async { - final empty = 'empty'; - - await tester.pumpWidget(TestApp(CanvasWebView(content: '', emptyDescription: empty))); - await tester.pump(); // Let the widget build - await tester.pump(); // Let the webview future finish - - expect(find.descendant(of: find.byType(CanvasWebView), matching: find.text(empty)), findsOneWidget); - expect(find.byType(WebView), findsNothing); - }); - - testWidgetsWithAccessibilityChecks('adds padding to empty text', (tester) async { - final empty = 'empty'; - final horizontal = 16.0; - - await tester.pumpWidget(TestApp(CanvasWebView( - content: null, - emptyDescription: empty, - horizontalPadding: horizontal, - ))); - await tester.pump(); // Let the widget build - await tester.pump(); // Let the webview future finish - - final padding = find.descendant(of: find.byType(CanvasWebView), matching: find.byType(Padding)); - expect(padding, findsOneWidget); - expect((tester.widget(padding) as Padding).padding, EdgeInsets.symmetric(horizontal: horizontal)); - }); - }); - - group('auth content', () { - final config = PlatformConfig(initWebview: true); - - testWidgetsWithAccessibilityChecks('shows loading while waiting to authenticate content', (tester) async { - final content = 'html_content'; - when(interactor.authContent(content, AppLocalizations().launchExternalTool)).thenAnswer((_) async => content); - - await tester.pumpWidget(TestApp( - CanvasWebView(content: content, authContentIfNecessary: true), - platformConfig: config, - )); - await tester.pump(); // Let the webview build - - expect(find.byType(WebView), findsNothing); - expect(find.byType(LoadingIndicator), findsOneWidget); - verify(interactor.authContent(any, any)).called(1); - }); - - testWidgetsWithAccessibilityChecks('does not call to authenticate content', (tester) async { - final content = 'html_content'; - await tester.pumpWidget(TestApp( - CanvasWebView(content: content, authContentIfNecessary: false), - platformConfig: config, - )); - await tester.pump(); // Let the webview build - await tester.pump(); // Let the future finish - - expect(find.byType(WebView), findsOneWidget); - verifyNever(interactor.authContent(any, any)); - }); - - testWidgetsWithAccessibilityChecks('calls to authenticate content', (tester) async { - final content = 'html_content'; - when(interactor.authContent(content, AppLocalizations().launchExternalTool)).thenAnswer((_) async => content); - - await tester.pumpWidget(TestApp(CanvasWebView(content: content), platformConfig: config)); - await tester.pump(); // Let the webview build - await tester.pump(); // Let the future finish - - expect(find.byType(WebView), findsOneWidget); - verify(interactor.authContent(content, AppLocalizations().launchExternalTool)).called(1); - }); - }); -} - -class _MockWebViewInteractor extends Mock implements MockWebContentInteractor { - @override - JavascriptChannel ltiToolPressedChannel(handler) { - return WebContentInteractor().ltiToolPressedChannel(handler!); - } -} diff --git a/apps/flutter_parent/test/utils/widgets/webview/html_description_screen_test.dart b/apps/flutter_parent/test/utils/widgets/webview/html_description_screen_test.dart deleted file mode 100644 index 024788048c..0000000000 --- a/apps/flutter_parent/test/utils/widgets/webview/html_description_screen_test.dart +++ /dev/null @@ -1,34 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -import 'package:flutter_parent/utils/common_widgets/web_view/canvas_web_view.dart'; -import 'package:flutter_parent/utils/common_widgets/web_view/html_description_screen.dart'; -import 'package:flutter_parent/utils/common_widgets/web_view/web_content_interactor.dart'; -import 'package:flutter_test/flutter_test.dart'; - -import '../../accessibility_utils.dart'; -import '../../test_app.dart'; -import '../../test_helpers/mock_helpers.dart'; -import '../../test_helpers/mock_helpers.mocks.dart'; - -void main() { - setupTestLocator((locator) => locator..registerLazySingleton(() => MockWebContentInteractor())); - - // Can't test html content in webview, so just make sure it renders one on the screen - testWidgetsWithAccessibilityChecks('renders', (tester) async { - await tester.pumpWidget(TestApp(HtmlDescriptionScreen('anything', 'Description'))); - await tester.pumpAndSettle(); - - expect(find.byType(CanvasWebView), findsOneWidget); - }); -} diff --git a/apps/flutter_parent/test/utils/widgets/webview/html_description_tile_test.dart b/apps/flutter_parent/test/utils/widgets/webview/html_description_tile_test.dart deleted file mode 100644 index 352f520342..0000000000 --- a/apps/flutter_parent/test/utils/widgets/webview/html_description_tile_test.dart +++ /dev/null @@ -1,103 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -import 'package:flutter/cupertino.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_parent/l10n/app_localizations.dart'; -import 'package:flutter_parent/utils/common_widgets/web_view/html_description_screen.dart'; -import 'package:flutter_parent/utils/common_widgets/web_view/html_description_tile.dart'; -import 'package:flutter_parent/utils/quick_nav.dart'; -import 'package:flutter_test/flutter_test.dart'; -import 'package:mockito/mockito.dart'; - -import '../../accessibility_utils.dart'; -import '../../test_app.dart'; -import '../../test_helpers/mock_helpers.dart'; -import '../../test_helpers/mock_helpers.mocks.dart'; - -void main() { - final l10n = AppLocalizations(); - - group('empty', () { - testWidgetsWithAccessibilityChecks('shows an empty container with no html and no empty message', (tester) async { - await tester.pumpWidget(TestApp(HtmlDescriptionTile(html: null))); - await tester.pump(); - - expect(find.byType(Container), findsWidgets); - expect(find.text(l10n.descriptionTitle), findsNothing); - }); - - testWidgetsWithAccessibilityChecks('shows an empty container with empty html and no empty message', (tester) async { - await tester.pumpWidget(TestApp(HtmlDescriptionTile(html: ''))); - await tester.pump(); - - expect(find.byType(Container), findsWidgets); - expect(find.text(l10n.descriptionTitle), findsNothing); - }); - - testWidgetsWithAccessibilityChecks('shows an empty message with no html', (tester) async { - final empty = 'Empty here'; - - await tester.pumpWidget(TestApp(HtmlDescriptionTile(html: null, emptyDescription: empty))); - await tester.pump(); - - expect(find.text(l10n.descriptionTitle), findsOneWidget); - expect(find.text(empty), findsOneWidget); - }); - }); - - group('given html', () { - testWidgetsWithAccessibilityChecks('shows components with defaults', (tester) async { - await tester.pumpWidget(TestApp(HtmlDescriptionTile(html: 'whatever'))); - await tester.pump(); - - expect(find.text(l10n.descriptionTitle), findsOneWidget); - expect(find.text(l10n.viewDescription), findsOneWidget); - expect(find.byIcon(Icons.arrow_forward), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('shows components with custom values', (tester) async { - final title = 'This is a title'; - final label = 'Click this to view'; - - await tester.pumpWidget(TestApp(HtmlDescriptionTile( - html: 'whatever', - descriptionTitle: title, - buttonLabel: label, - ))); - await tester.pump(); - - expect(find.text(l10n.descriptionTitle), findsNothing); - expect(find.text(l10n.viewDescription), findsNothing); - expect(find.text(title), findsOneWidget); - expect(find.text(label), findsOneWidget); - expect(find.byIcon(Icons.arrow_forward), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('can click to launch HtmlDescriptionScreen', (tester) async { - final html = 'whatever'; - final nav = MockQuickNav(); - setupTestLocator((locator) => locator..registerLazySingleton(() => nav)); - - await tester.pumpWidget(TestApp(HtmlDescriptionTile(html: html))); - await tester.pump(); - - await tester.tap(find.text(l10n.viewDescription)); - await tester.pumpAndSettle(); - - final widget = verify(nav.push(any, captureAny)).captured[0]; - expect(widget, isInstanceOf()); - expect((widget as HtmlDescriptionScreen).html, html); - }); - }); -} diff --git a/apps/flutter_parent/test/utils/widgets/webview/simple_web_view_screen_test.dart b/apps/flutter_parent/test/utils/widgets/webview/simple_web_view_screen_test.dart deleted file mode 100644 index 211e087f4b..0000000000 --- a/apps/flutter_parent/test/utils/widgets/webview/simple_web_view_screen_test.dart +++ /dev/null @@ -1,64 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -import 'package:flutter/material.dart'; -import 'package:flutter_parent/utils/common_widgets/web_view/simple_web_view_screen.dart'; -import 'package:flutter_parent/utils/common_widgets/web_view/web_content_interactor.dart'; -import 'package:flutter_test/flutter_test.dart'; -import 'package:webview_flutter/webview_flutter.dart'; - -import '../../accessibility_utils.dart'; -import '../../platform_config.dart'; -import '../../test_app.dart'; - -void main() { - setupTestLocator((locator) => locator.registerFactory(() => WebContentInteractor())); - final config = PlatformConfig(initWebview: true); - - testWidgetsWithAccessibilityChecks('shows title in app bar', (tester) async { - final url = 'https://www.google.com'; - final title = 'title'; - - await tester.pumpWidget(TestApp(SimpleWebViewScreen(url, title, true), platformConfig: config)); - await tester.pump(); - - expect(find.text(title), findsOneWidget); - }); - - testWidgetsWithAccessibilityChecks('shows webview', (tester) async { - final url = 'https://www.google.com'; - final title = 'title'; - - await tester.pumpWidget(TestApp(SimpleWebViewScreen(url, title, true), platformConfig: config)); - await tester.pump(); - - expect(find.byType(WebView), findsOneWidget); - }); - - // Can only test the case where the controller isn't set - testWidgetsWithAccessibilityChecks('handles back press', (tester) async { - final url = 'https://www.google.com'; - final title = 'title'; - - await TestApp.showWidgetFromTap(tester, (context) { - return Navigator.of(context).push(MaterialPageRoute(builder: (context) => SimpleWebViewScreen(url, title, true))); - }, config: config); - - expect(find.byType(WebView), findsOneWidget); - - await tester.pageBack(); - await tester.pumpAndSettle(); - - expect(find.byType(WebView), findsNothing); - }); -} diff --git a/apps/flutter_parent/test/utils/widgets/webview/web_content_interactor_test.dart b/apps/flutter_parent/test/utils/widgets/webview/web_content_interactor_test.dart deleted file mode 100644 index 577b988278..0000000000 --- a/apps/flutter_parent/test/utils/widgets/webview/web_content_interactor_test.dart +++ /dev/null @@ -1,164 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -import 'package:flutter/services.dart'; -import 'package:flutter_parent/l10n/app_localizations.dart'; -import 'package:flutter_parent/models/authenticated_url.dart'; -import 'package:flutter_parent/models/login.dart'; -import 'package:flutter_parent/network/api/oauth_api.dart'; -import 'package:flutter_parent/utils/common_widgets/web_view/web_content_interactor.dart'; -import 'package:mockito/mockito.dart'; -import 'package:test/test.dart'; -import 'package:webview_flutter/webview_flutter.dart'; - -import '../../platform_config.dart'; -import '../../test_app.dart'; -import '../../test_helpers/mock_helpers.dart'; -import '../../test_helpers/mock_helpers.mocks.dart'; - -void main() { - final oauthApi = MockOAuthApi(); - final domain = 'https://www.instructure.com'; - final login = Login((b) => b.domain = domain); - - setupTestLocator((locator) { - locator.registerLazySingleton(() => oauthApi); - }); - - // Reset the interactions for the shared mocks - setUp(() async { - reset(oauthApi); - await setupPlatformChannels(config: PlatformConfig(initLoggedInUser: login)); - }); - - group('getAuthUrl', () { - test('failure returns target_url', () async { - final target = '$domain/target_url'; - when(oauthApi.getAuthenticatedUrl(target)) - .thenAnswer((_) async => Future.error('Failed to authenticate url').catchError((_) { return Future.value(null);})); - final actual = await WebContentInteractor().getAuthUrl(target); - - expect(actual, target); - verify(oauthApi.getAuthenticatedUrl(target)).called(1); - }); - - test('returns session_url if target is in domain', () async { - final target = '$domain/target_url'; - final expected = 'session_url'; - when(oauthApi.getAuthenticatedUrl(target)) - .thenAnswer((_) async => AuthenticatedUrl((b) => { - b..sessionUrl = expected, - b..requiresTermsAcceptance = false - })); - final actual = await WebContentInteractor().getAuthUrl(target); - - expect(actual, expected); - verify(oauthApi.getAuthenticatedUrl(target)).called(1); - }); - - test('returns target if it is not in the domain', () async { - final target = 'https://www.pandas.com'; - - final actual = await WebContentInteractor().getAuthUrl(target); - - expect(actual, target); - }); - }); - - test('ltiToolPressedChannel has a name that matches in html_wrapper', () async { - String fileText = await rootBundle.loadString('assets/html/html_wrapper.html'); - JavascriptChannel channel = WebContentInteractor().ltiToolPressedChannel((_) {}); - - expect(fileText, contains('${channel.name}.postMessage')); - }); - - group('authContent', () { - test('returns empty string if content is empty or null', () async { - expect(await WebContentInteractor().authContent('', ''), ''); - expect(await WebContentInteractor().authContent(null, null), null); - }); - - test('returns content when no iframes are present', () async { - final content = '

This is some content to display
It does not need to be authenticated

'; - final actual = await WebContentInteractor().authContent(content, null); - - expect(actual, content); - }); - - test('returns authenticated content when iframe has external_tools', () async { - final target = 'external_tools'; - final authenticated = 'auth_tool'; - final buttonText = AppLocalizations().launchExternalTool; - final content = _makeIframe(src: target); - final expected = _makeIframe(src: authenticated, target: target, ltiButtonText: buttonText); - - when(oauthApi.getAuthenticatedUrl(target)).thenAnswer((_) async => - AuthenticatedUrl((b) => { - b..sessionUrl = authenticated, - b..requiresTermsAcceptance = false - })); - - final actual = await WebContentInteractor().authContent(content, buttonText); - - expect(actual, expected); - verify(oauthApi.getAuthenticatedUrl(target)).called(1); - }); - - test('returns authenticated content when iframe has cnvs_content id', () async { - final id = 'cnvs_content'; - final target = 'target'; - final authenticated = 'auth_tool'; - final content = _makeIframe(id: id, src: target); - final expected = _makeIframe(id: id, src: authenticated); - - when(oauthApi.getAuthenticatedUrl(target)).thenAnswer((_) async => - AuthenticatedUrl((b) => { - b..sessionUrl = authenticated, - b..requiresTermsAcceptance = false - })); - - final actual = await WebContentInteractor().authContent(content, null); - - expect(actual, expected); - verify(oauthApi.getAuthenticatedUrl(target)).called(1); - }); - - test('returns authenticated content with multiple iframes', () async { - final id = 'cnvs_content'; - final target = 'external_tools'; - final authenticated = 'auth_tool'; - final buttonText = AppLocalizations().launchExternalTool; - final content = _makeIframe(src: target) + _makeIframe(id: id, src: target); - final expected = _makeIframe(src: authenticated, target: target, ltiButtonText: buttonText) + - _makeIframe(id: id, src: authenticated, target: target); - - when(oauthApi.getAuthenticatedUrl(target)).thenAnswer((_) async => - AuthenticatedUrl((b) => { - b..sessionUrl = authenticated, - b..requiresTermsAcceptance = false - })); - - final actual = await WebContentInteractor().authContent(content, buttonText); - - expect(actual, expected); - verify(oauthApi.getAuthenticatedUrl(target)).called(2); - }); - }); -} - -String _makeIframe({String? id, String? src, String? target, String? ltiButtonText}) { - String ltiButton = ltiButtonText != null - ? '

$ltiButtonText

' - : ''; - return '$ltiButton'; -} diff --git a/apps/flutter_parent/test_driver/apis/announcement_seed_api.dart b/apps/flutter_parent/test_driver/apis/announcement_seed_api.dart deleted file mode 100644 index bef66eddfe..0000000000 --- a/apps/flutter_parent/test_driver/apis/announcement_seed_api.dart +++ /dev/null @@ -1,31 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:flutter_parent/models/announcement.dart'; -import 'package:flutter_parent/network/utils/dio_config.dart'; -import 'package:flutter_parent/network/utils/fetch.dart'; - -class AnnouncementSeedApi { - static Future createAnnouncement(String courseId, String title, String message) async { - var queryParams = { - 'title': title, - 'message': message, - 'is_announcement': true, - }; - - var dio = seedingDio(); - - return fetch(dio.post('courses/$courseId/discussion_topics', queryParameters: queryParams)); - } -} diff --git a/apps/flutter_parent/test_driver/apis/assignment_seed_api.dart b/apps/flutter_parent/test_driver/apis/assignment_seed_api.dart deleted file mode 100644 index 30e53d27dc..0000000000 --- a/apps/flutter_parent/test_driver/apis/assignment_seed_api.dart +++ /dev/null @@ -1,47 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'dart:convert'; - -import 'package:built_collection/built_collection.dart'; -import 'package:faker/faker.dart'; -import 'package:flutter_parent/models/assignment.dart'; -import 'package:flutter_parent/models/dataseeding/create_assignment_wrapper.dart'; -import 'package:flutter_parent/models/serializers.dart'; -import 'package:flutter_parent/network/utils/dio_config.dart'; -import 'package:flutter_parent/network/utils/fetch.dart'; - -class AssignmentSeedApi { - static Future createAssignment(String courseId, - {double pointsPossible = 20, DateTime? dueAt = null, bool published = true}) async { - if (dueAt == null) dueAt = DateTime.now().add(Duration(days: 1)).toUtc(); - final dish = faker.food.dish(); - final assignmentName = dish + ' ' + faker.randomGenerator.integer(100, min: 1).toString(); - final assignmentDescription = "Let's have some $dish!"; - final assignmentCreateWrapper = CreateAssignmentWrapper((b) => b - ..assignment.name = assignmentName - ..assignment.description = assignmentDescription - ..assignment.courseId = courseId - ..assignment.dueAt = dueAt - ..assignment.published = published - ..assignment.pointsPossible = pointsPossible - ..assignment.submissionTypes = ListBuilder([SubmissionTypes.onlineTextEntry]) - ..assignment.gradingType = GradingType.points); - - var postBody = json.encode(serialize(assignmentCreateWrapper)); - final dio = seedingDio(); - - return fetch(dio.post("courses/$courseId/assignments", data: postBody)); - } -} diff --git a/apps/flutter_parent/test_driver/apis/calendar_seed_api.dart b/apps/flutter_parent/test_driver/apis/calendar_seed_api.dart deleted file mode 100644 index f9ca276119..0000000000 --- a/apps/flutter_parent/test_driver/apis/calendar_seed_api.dart +++ /dev/null @@ -1,42 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:flutter_parent/models/schedule_item.dart'; -import 'package:flutter_parent/network/utils/dio_config.dart'; -import 'package:flutter_parent/network/utils/fetch.dart'; - -class CalendarSeedApi { - static Future createCalendarEvent(String courseId, String title, DateTime startAt, - {String description = "", - DateTime? endAt = null, - bool allDay = false, - String locationName = "", - String locationAddress = ""}) async { - var queryParams = { - 'calendar_event[context_code]': 'course_$courseId', - 'calendar_event[title]': title, - 'calendar_event[start_at]': - allDay ? DateTime(startAt.year, startAt.month, startAt.day).toIso8601String() : startAt.toIso8601String(), - 'calendar_event[end_at]': endAt == null ? null : endAt.toIso8601String(), - 'calendar_event[description]': description, - 'calendar_event[all_day]': allDay, - 'calendar_event[location_name]': locationName, - 'calendar_event[location_address]': locationAddress, - }; - - var dio = seedingDio(); - - return fetch(dio.post('calendar_events', queryParameters: queryParams)); - } -} diff --git a/apps/flutter_parent/test_driver/apis/course_seed_api.dart b/apps/flutter_parent/test_driver/apis/course_seed_api.dart deleted file mode 100644 index 57e9d38e3e..0000000000 --- a/apps/flutter_parent/test_driver/apis/course_seed_api.dart +++ /dev/null @@ -1,42 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'dart:convert'; - -import 'package:faker/faker.dart'; -import 'package:flutter_parent/models/course.dart'; -import 'package:flutter_parent/models/dataseeding/create_course_wrapper.dart'; -import 'package:flutter_parent/models/serializers.dart'; -import 'package:flutter_parent/network/utils/dio_config.dart'; -import 'package:flutter_parent/network/utils/fetch.dart'; - -class CourseSeedApi { - static Future createCourse({bool forceRefresh = false}) async { - final dio = seedingDio(); - final courseNumber = faker.randomGenerator.integer(500, min: 100).toString(); - final courseName = faker.sport.name() + " " + courseNumber; - final courseCode = courseName.substring(0, 1) + courseNumber; - final courseCreateWrapper = CreateCourseWrapper((b) => b - ..offer = true - ..course.name = courseName - ..course.courseCode = courseCode - ..course.role = "student" - ..course.syllabusBody = "A Syllabus" - ..build()); - - var postBody = json.encode(serialize(courseCreateWrapper)); - - return fetch(dio.post("accounts/self/courses", data: postBody)); - } -} diff --git a/apps/flutter_parent/test_driver/apis/enrollment_seed_api.dart b/apps/flutter_parent/test_driver/apis/enrollment_seed_api.dart deleted file mode 100644 index 2ad28ac6a7..0000000000 --- a/apps/flutter_parent/test_driver/apis/enrollment_seed_api.dart +++ /dev/null @@ -1,39 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'dart:convert'; - -import 'package:flutter_parent/models/dataseeding/create_enrollment_wrapper.dart'; -import 'package:flutter_parent/models/enrollment.dart'; -import 'package:flutter_parent/models/serializers.dart'; -import 'package:flutter_parent/network/utils/dio_config.dart'; -import 'package:flutter_parent/network/utils/fetch.dart'; - -class EnrollmentSeedApi { - static Future createEnrollment( - String userId, String courseId, String role, String associatedUserId) async { - final dio = seedingDio(); - final enrollmentWrapper = CreateEnrollmentWrapper((b) => b - ..enrollment.userId = userId - ..enrollment.associatedUserId = (associatedUserId.isEmpty ? null : associatedUserId) - ..enrollment.role = role - ..enrollment.type = role - ..enrollment.enrollmentState = "active" - ..build()); - - var postBody = json.encode(serialize(enrollmentWrapper)); - - return fetch(dio.post("courses/${courseId}/enrollments", data: postBody)); - } -} diff --git a/apps/flutter_parent/test_driver/apis/quiz_seed_api.dart b/apps/flutter_parent/test_driver/apis/quiz_seed_api.dart deleted file mode 100644 index 321c2d5caa..0000000000 --- a/apps/flutter_parent/test_driver/apis/quiz_seed_api.dart +++ /dev/null @@ -1,31 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:flutter_parent/models/dataseeding/quiz.dart'; -import 'package:flutter_parent/network/utils/dio_config.dart'; -import 'package:flutter_parent/network/utils/fetch.dart'; - -class QuizSeedApi { - static Future createQuiz(String courseId, String title, DateTime dueAt, {String description = ""}) async { - var queryParams = { - 'quiz[title]': title, - 'quiz[description]': description, - 'quiz[published]': true, - 'quiz[due_at]': dueAt.toIso8601String(), - }; - - var dio = seedingDio(); - return fetch(dio.post('courses/$courseId/quizzes', queryParameters: queryParams)); - } -} diff --git a/apps/flutter_parent/test_driver/apis/submission_seed_api.dart b/apps/flutter_parent/test_driver/apis/submission_seed_api.dart deleted file mode 100644 index b3a438d87f..0000000000 --- a/apps/flutter_parent/test_driver/apis/submission_seed_api.dart +++ /dev/null @@ -1,64 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -import 'dart:convert'; - -import 'package:faker/faker.dart'; -import 'package:flutter_parent/models/assignment.dart'; -import 'package:flutter_parent/models/dataseeding/create_submission_wrapper.dart'; -import 'package:flutter_parent/models/dataseeding/grade_submission_wrapper.dart'; -import 'package:flutter_parent/models/serializers.dart'; -import 'package:flutter_parent/models/submission.dart'; -import 'package:flutter_parent/network/utils/dio_config.dart'; -import 'package:flutter_parent/network/utils/fetch.dart'; - -class SubmissionSeedApi { - static Future createSubmission(String courseId, Assignment? assignment, String asUserId) async { - SubmissionTypes? submissionType = assignment?.submissionTypes?.first; - String submissionTypeString = ""; - switch (submissionType) { - case SubmissionTypes.onlineTextEntry: - submissionTypeString = "online_text_entry"; - break; - case SubmissionTypes.onlineUrl: - submissionTypeString = "online_url"; - break; - default: - "unknown"; - break; - } - String? url = (submissionType == SubmissionTypes.onlineUrl) ? faker.internet.httpsUrl() : null; - String? textBody = (submissionType == SubmissionTypes.onlineTextEntry) ? faker.lorem.sentence() : null; - final submissionWrapper = CreateSubmissionWrapper((b) => b - ..submission.body = textBody - ..submission.url = url - ..submission.submissionType = submissionTypeString - ..submission.userId = int.parse(asUserId)); - - var postBody = json.encode(serialize(submissionWrapper)); - final dio = seedingDio(); - - print("submission postBody = $postBody"); - return fetch(dio.post("courses/$courseId/assignments/${assignment?.id}/submissions", data: postBody)); - } - - static Future gradeSubmission(String courseId, Assignment? assignment, String studentId, String grade) async { - final gradeWrapper = GradeSubmissionWrapper((b) => b..submission.postedGrade = grade); - - final postBody = json.encode(serialize(gradeWrapper)); - final dio = seedingDio(); - - print("Grade submission postBody: $postBody"); - return fetch(dio.put("courses/$courseId/assignments/${assignment?.id}/submissions/$studentId", data: postBody)); - } -} diff --git a/apps/flutter_parent/test_driver/apis/user_seed_api.dart b/apps/flutter_parent/test_driver/apis/user_seed_api.dart deleted file mode 100644 index 3dbdb3a126..0000000000 --- a/apps/flutter_parent/test_driver/apis/user_seed_api.dart +++ /dev/null @@ -1,148 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'dart:async'; -import 'dart:convert'; - -import 'package:dio/dio.dart'; -import 'package:faker/faker.dart'; -import 'package:flutter/services.dart'; -import 'package:flutter_parent/models/dataseeding/create_user_info.dart'; -import 'package:flutter_parent/models/dataseeding/oauth_token.dart'; -import 'package:flutter_parent/models/dataseeding/pairing_code.dart'; -import 'package:flutter_parent/models/dataseeding/seeded_user.dart'; -import 'package:flutter_parent/models/mobile_verify_result.dart'; -import 'package:flutter_parent/models/serializers.dart'; -import 'package:flutter_parent/network/utils/api_prefs.dart'; -import 'package:flutter_parent/network/utils/dio_config.dart'; -import 'package:flutter_parent/network/utils/fetch.dart'; - -import '../../lib/network/api/auth_api.dart'; - -const _REDIRECT_URI = "urn:ietf:wg:oauth:2.0:oob"; - -const _createUserEndpoint = "accounts/self/users"; - -class UserSeedApi { - static const authCodeChannel = const MethodChannel("GET_AUTH_CODE"); - - static Future createUser() async { - var url = baseSeedingUrl + _createUserEndpoint; - - var lastName = faker.person.lastName(); - var firstName = faker.person.firstName(); - var userData = CreateUserInfo((b) => b - ..user.name = "$firstName $lastName" - ..user.shortName = firstName - ..user.sortableName = "$lastName, $firstName" - ..pseudonym.uniqueId = Guid(RandomGenerator()).guid() - ..pseudonym.password = Guid(RandomGenerator()).guid() - // Don't care about CommunicationChannel initialization for now - ..build()); - - var postBody = json.encode(serialize(userData)); - print("New user postBody: $postBody"); - - await ApiPrefs.init(); - - var dio = seedingDio(); - - var response = await dio.post(_createUserEndpoint, data: postBody); - - if (response.statusCode == 200) { - //print("Create User response: ${response.data}"); - var result = deserialize(response.data); - result = result!.rebuild((b) => b - ..loginId = userData.pseudonym.uniqueId - ..password = userData.pseudonym.password - ..domain = response.requestOptions.uri.host); - - var verifyResult = await AuthApi().mobileVerify(result.domain!, forceBetaDomain: true); - var authCode = await _getAuthCode(result, verifyResult); - var token = await _getToken(result, verifyResult, authCode!); - - result = result.rebuild((b) => b..token = token); - return result; - } else { - print("error request:" + response.requestOptions.toString() + ", headers: ${response.requestOptions.headers.toString()}"); - print( - "error response body: ${response.data}, status: ${response.statusCode}, message: ${response.statusMessage} "); - return null; - } - } - - // Get the token for the SeededUser, given MobileVerifyResult and authCode - static Future _getToken(SeededUser user, MobileVerifyResult? verifyResult, String authCode) async { - var dio = await seedingDio(baseUrl: "https://${user.domain}/"); - - var response = await dio.post('login/oauth2/token', queryParameters: { - "client_id": verifyResult?.clientId, - "client_secret": verifyResult?.clientSecret, - "code": authCode, - "redirect_uri": _REDIRECT_URI - }); - - if (response.statusCode == 200) { - var parsedResponse = deserialize(response.data); - var token = parsedResponse?.accessToken; - - return token; - } else { - print("Token fetch FAILED, status=${response.statusCode}"); - return null; - } - } - - // Get the authCode for the SeededUser, using the clientId from verifyResult. - // This one is a little tricky as we have to call into native Android jsoup logic. - static Future _getAuthCode(SeededUser user, MobileVerifyResult? verifyResult) async { - try { - var result = await authCodeChannel.invokeMethod('getAuthCode', { - 'domain': user.domain, - 'clientId': verifyResult?.clientId, - 'redirectUrl': _REDIRECT_URI, - 'login': user.loginId, - 'password': user.password - }); - - return result; - } on PlatformException catch (e) { - print("authCode platform exception: $e"); - return null; - } on MissingPluginException catch (e) { - print("authCode missing plugin exception: $e"); - return null; - } - } - - /// Obtain a pairing code for the indicated observee. - /// Will only work if the observee has been enrolled in a course as a student. - /// Returns a PairingCode structure, which contains a "code" field. - static Future createObserverPairingCode(String observeeId) async { - var dio = await seedingDio(); - return fetch(dio.post('users/$observeeId/observer_pairing_codes')); - } - - /// Add [observer] as an observer for [observee], using the indicated pairingCode. - static Future addObservee(SeededUser observer, SeededUser observee, String? pairingCode) async { - try { - var dio = await seedingDio(); - var pairingResponse = await dio.post('users/${observer.id}/observees', - queryParameters: {'pairing_code': pairingCode, 'access_token': observee.token}); - return (pairingResponse.statusCode == 200 || pairingResponse.statusCode == 201); - } on DioError { - return false; - } - } -} diff --git a/apps/flutter_parent/test_driver/app_seed_utils.dart b/apps/flutter_parent/test_driver/app_seed_utils.dart deleted file mode 100644 index f32244eed6..0000000000 --- a/apps/flutter_parent/test_driver/app_seed_utils.dart +++ /dev/null @@ -1,143 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'dart:convert'; - -import 'package:built_collection/built_collection.dart'; -import 'package:flutter_driver/driver_extension.dart'; -import 'package:flutter_parent/models/course.dart'; -import 'package:flutter_parent/models/dataseeding/seed_context.dart'; -import 'package:flutter_parent/models/dataseeding/seeded_user.dart'; -import 'package:flutter_parent/models/serializers.dart'; -import 'package:flutter_parent/network/utils/api_prefs.dart'; - -import 'apis/course_seed_api.dart'; -import 'apis/enrollment_seed_api.dart'; -import 'apis/user_seed_api.dart'; - -// A data class to encapsulate all information created by the seed() call. -class SeedResults { - List students = []; - List teachers = []; - List parents = []; - List courses = []; -} - -// Some app-side helper logic to abstract the "GetSeedContext" app call logic and -// mark data seeding as complete. -class AppSeedUtils { - // Initial seeding context: Not yet completed - static SeedContext _seedContext = SeedContext((b) => b - ..seedingComplete = false - ..build()); - - // The listener/handler to pass to enableFlutterDriverExtension() - static DataHandler seedContextListener = (String? message) async { - if (message == "GetSeedContext") { - return json.encode(serialize(_seedContext)); - } - return ''; - }; - - // Lets the test driver know that data seeding has completed. - static void markSeedingComplete(MapBuilder seedObjects) { - _seedContext = SeedContext((b) => b - ..seedingComplete = true - ..seedObjects = seedObjects - ..build()); - } - - /// Generic data seeding utility. - /// Sets up a teacher, a specified number of parents, courses and students, - /// and enrolls teacher+students in all courses. It is assumed that - /// all students are children / observees of the parent(s), and they will - /// be paired accordingly. - static Future seed({int nParents = 1, int nStudents = 1, int nCourses = 1}) async { - SeedResults result = SeedResults(); - - // Create nParents parents - for (int i = 0; i < nParents; i++) { - result.parents.add((await UserSeedApi.createUser())!); - } - - // Create a single teacher - result.teachers.add((await UserSeedApi.createUser())!); - - // Create nStudents students - for (int i = 0; i < nStudents; i++) { - var newStudent = await UserSeedApi.createUser(); - result.students.add(newStudent!); - } - - // Enroll all students and teachers in all courses. - for (int i = 0; i < nCourses; i++) { - var newCourse = (await CourseSeedApi.createCourse())!; - result.courses.add(newCourse); - - await EnrollmentSeedApi.createEnrollment(result.teachers.first!.id, newCourse.id, "TeacherEnrollment", ""); - for (int i = 0; i < result.students.length; i++) { - await EnrollmentSeedApi.createEnrollment( - result.students.elementAt(i).id, newCourse.id, "StudentEnrollment", ""); - } - } - - // Now that student users are enrolled as students, we can pair them up with parents via pairing codes. - for (SeededUser parent in result.parents) { - for (SeededUser student in result.students) { - var pairingResult = await seedPairing(parent, student); - print('internal pairingResult: $pairingResult'); - } - } - - return result; - } - - /// Create a course and enroll any indicated teachers, parents or students. - /// Allows you a little more flexibility in setting up a course / enrollment than is allowed by - /// seed() above. - static Future seedCourseAndEnrollments( - {SeededUser? parent = null, SeededUser? student = null, SeededUser? teacher = null}) async { - var newCourse = (await CourseSeedApi.createCourse())!; - - if (parent != null && student != null) { - await EnrollmentSeedApi.createEnrollment(parent.id, newCourse.id, "ObserverEnrollment", student.id); - } - - if (teacher != null) { - await EnrollmentSeedApi.createEnrollment(teacher.id, newCourse.id, "TeacherEnrollment", ""); - } - - if (student != null) { - await EnrollmentSeedApi.createEnrollment(student.id, newCourse.id, "StudentEnrollment", ""); - } - - return newCourse; - } - - /// Pair a parent and a student. Will only work if student is enrolled as a student. - static Future seedPairing(SeededUser parent, SeededUser student) async { - var pairingCodeStructure = await UserSeedApi.createObserverPairingCode(student.id); - var pairingCode = pairingCodeStructure?.code; - var pairingResult = await UserSeedApi.addObservee(parent, student, pairingCode); - return pairingResult; - } - - // Signs in a user via ApiPrefs. That user should then be the reference - // user when the initial screen starts. - static Future signIn(SeededUser user) async { - var parentLogin = user.toLogin(); - await ApiPrefs.addLogin(parentLogin); - await ApiPrefs.switchLogins(parentLogin); - } -} diff --git a/apps/flutter_parent/test_driver/calendar.dart b/apps/flutter_parent/test_driver/calendar.dart deleted file mode 100644 index 050732c640..0000000000 --- a/apps/flutter_parent/test_driver/calendar.dart +++ /dev/null @@ -1,62 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'dart:convert'; - -import 'package:built_collection/built_collection.dart'; -import 'package:flutter_driver/driver_extension.dart'; -import 'package:flutter_parent/main.dart' as app; -import 'package:flutter_parent/models/assignment.dart'; -import 'package:flutter_parent/models/schedule_item.dart'; -import 'package:flutter_parent/models/serializers.dart'; -import 'package:flutter_parent/network/utils/api_prefs.dart'; - -import 'apis/assignment_seed_api.dart'; -import 'apis/calendar_seed_api.dart'; -import 'app_seed_utils.dart'; - -void main() async { - enableFlutterDriverExtension(handler: AppSeedUtils.seedContextListener); - - // Initialize our ApiPrefs - await ApiPrefs.init(); - - // Create a parent, a student and 2 courses. - var data = await AppSeedUtils.seed(nParents: 1, nStudents: 1, nCourses: 2); - var parent = data.parents[0]; - var student = data.students[0]; - var course1 = data.courses[0]; - var course2 = data.courses[1]; - Assignment assignment1 = (await AssignmentSeedApi.createAssignment(course1.id, dueAt: DateTime.now().add(Duration(days: 1)).toUtc()))!; - Assignment assignment2 = (await AssignmentSeedApi.createAssignment(course2.id, dueAt: DateTime.now().subtract(Duration(days: 1)).toUtc()))!; - ScheduleItem event2 = (await CalendarSeedApi.createCalendarEvent(course2.id, "Calendar Event", DateTime.now().toUtc(), allDay: true, locationName: "Location Name", locationAddress: "Location Address"))!; - // TODO: Add graded quiz - - // Sign in the parent - await AppSeedUtils.signIn(parent); - - // Let the test driver know that seeding has completed - AppSeedUtils.markSeedingComplete(MapBuilder({ - "parent": json.encode(serialize(parent)), - "student": json.encode(serialize(student)), - "course1": json.encode(serialize(course1)), - "course2": json.encode(serialize(course2)), - "assignment1": json.encode(serialize(assignment1)), - "assignment2": json.encode(serialize(assignment2)), - "event2": json.encode(serialize(event2)), - })); - - // Call app.main(), which should bring up the dashboard. - app.main(); -} diff --git a/apps/flutter_parent/test_driver/calendar_test.dart b/apps/flutter_parent/test_driver/calendar_test.dart deleted file mode 100644 index 24b2c5e3ce..0000000000 --- a/apps/flutter_parent/test_driver/calendar_test.dart +++ /dev/null @@ -1,92 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -// Imports the Flutter Driver API. - -import 'package:flutter_driver/flutter_driver.dart'; -import 'package:flutter_parent/models/assignment.dart'; -import 'package:flutter_parent/models/course.dart'; -import 'package:flutter_parent/models/dataseeding/seeded_user.dart'; -import 'package:flutter_parent/models/schedule_item.dart'; -import 'package:test/test.dart'; - -import 'driver_seed_utils.dart'; -import 'pages/assignment_details_page.dart'; -import 'pages/calendar_page.dart'; -import 'pages/dashboard_page.dart'; - -// Run test with command: flutter drive --target=test_driver/calendar.dart -void main() { - FlutterDriver? driver; - - // Connect to the Flutter driver before running any tests. - setUpAll(() async { - driver = await FlutterDriver.connect(); - }); - - // Close the connection to the driver after the tests have completed. - tearDownAll(() async { - if (driver != null) { - driver?.close(); - } - }); - - // An end-to-end test for the calendar/planner. - // Seeds a couple of assignments, a quiz and an announcement and - // verifies that they show up on the calendar. Also tests course - // filtering. - // - // I have added some logic to allow the test to succeed on weekends -- - // it can scroll to next week or last week to find tomorrow's/yesterday's - // assignments if need be. But normally this should not be necessary, - // as we usually run the test M-F. - test('Calendar E2E', () async { - // Wait for seeding to complete - var seedContext = (await DriverSeedUtils.waitForSeedingToComplete(driver))!; - - print("driver: Seeding complete!"); - var parent = seedContext.getNamedObject("parent"); - var student = seedContext.getNamedObject("student"); - var courses = [seedContext.getNamedObject("course1")!, seedContext.getNamedObject("course2")!]; - var assignment1 = seedContext.getNamedObject("assignment1")!; // From first course - var assignment2 = seedContext.getNamedObject("assignment2")!; // From second course - var event2 = seedContext.getNamedObject("event2")!; // From second course - - // Let's check that all of our assignments, quizzes and announcements are displayed - await DashboardPage.waitForRender(driver); - await DashboardPage.goToCalendar(driver); - await CalendarPage.waitForRender(driver); - await CalendarPage.verifyAssignmentDisplayed(driver, assignment1); - await CalendarPage.verifyAssignmentDisplayed(driver, assignment2); - await CalendarPage.verifyEventDisplayed(driver, event2); - - // Let's try opening an assignment - await CalendarPage.openAssignment(driver, assignment1); - await AssignmentDetailsPage.validateUnsubmittedAssignment(driver, assignment1); - await driver?.tap(find.pageBack()); - - // Let's filter out the first course and try again - await CalendarPage.toggleFilter(driver, courses[0]); - await CalendarPage.verifyAssignmentNotDisplayed(driver, assignment1); - await CalendarPage.verifyAssignmentDisplayed(driver, assignment2); - await CalendarPage.verifyEventDisplayed(driver, event2); - - // Let's re-enable the first course and filter out the second, and try again - await CalendarPage.toggleFilter(driver, courses[0]); - await CalendarPage.toggleFilter(driver, courses[1]); - await CalendarPage.verifyAssignmentDisplayed(driver, assignment1); - await CalendarPage.verifyAssignmentNotDisplayed(driver, assignment2); - await CalendarPage.verifyEventNotDisplayed(driver, event2); - }, timeout: Timeout(Duration(seconds: 90))); // Change timeout from 30 sec default to 90 secs -} diff --git a/apps/flutter_parent/test_driver/dashboard.dart b/apps/flutter_parent/test_driver/dashboard.dart deleted file mode 100644 index 5398f61971..0000000000 --- a/apps/flutter_parent/test_driver/dashboard.dart +++ /dev/null @@ -1,48 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'dart:convert'; - -import 'package:built_collection/built_collection.dart'; -import 'package:flutter_driver/driver_extension.dart'; -import 'package:flutter_parent/main.dart' as app; -import 'package:flutter_parent/models/serializers.dart'; -import 'package:flutter_parent/network/utils/api_prefs.dart'; - -import 'app_seed_utils.dart'; - -void main() async { - enableFlutterDriverExtension(handler: AppSeedUtils.seedContextListener); - - // Initialize our ApiPrefs - await ApiPrefs.init(); - - // Seed our data - var data = await AppSeedUtils.seed(nStudents: 2, nCourses: 2); - - // Sign in the parent - await AppSeedUtils.signIn(data.parents.first); - - // Let the test driver know that seeding has completed - AppSeedUtils.markSeedingComplete(MapBuilder({ - "parent": json.encode(serialize(data.parents.first)), - "student1": json.encode(serialize(data.students[0])), - "student2": json.encode(serialize(data.students[1])), - "course1": json.encode(serialize(data.courses[0])), - "course2": json.encode(serialize(data.courses[1])) - })); - - // Call app.main(), which should bring up the dashboard. - app.main(); -} diff --git a/apps/flutter_parent/test_driver/dashboard_test.dart b/apps/flutter_parent/test_driver/dashboard_test.dart deleted file mode 100644 index aa1166bd22..0000000000 --- a/apps/flutter_parent/test_driver/dashboard_test.dart +++ /dev/null @@ -1,72 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -// Imports the Flutter Driver API. - -import 'package:flutter_driver/flutter_driver.dart'; -import 'package:flutter_parent/models/course.dart'; -import 'package:flutter_parent/models/dataseeding/seeded_user.dart'; -import 'package:test/test.dart'; - -import 'driver_seed_utils.dart'; -import 'pages/dashboard_page.dart'; - -void main() { - FlutterDriver? driver; - - // Connect to the Flutter driver before running any tests. - setUpAll(() async { - driver = await FlutterDriver.connect(); - }); - - // Close the connection to the driver after the tests have completed. - tearDownAll(() async { - if (driver != null) { - driver?.close(); - } - }); - - test('Dashboard E2E', () async { - // Wait for seeding to complete - var seedContext = (await DriverSeedUtils.waitForSeedingToComplete(driver))!; - - print("driver: Seeding complete!"); - var students = [ - seedContext.getNamedObject("student1")!, - seedContext.getNamedObject("student2")! - ]; - var courses = [seedContext.getNamedObject("course1")!, seedContext.getNamedObject("course2")!]; - var parent = seedContext.getNamedObject("parent")!; - - await DashboardPage.waitForRender(driver); - - await DashboardPage.verifyCourses(driver, courses); - - // Verify that first student is showing - await DashboardPage.verifyStudentDisplayed(driver, students[0]); - //await driver.waitFor(find.text(students[0].shortName)); - - // Switch students - await DashboardPage.changeStudent(driver, students[1]); - - // Verify that the second student is showing - await DashboardPage.verifyStudentDisplayed(driver, students[1]); - - // Now let's make sure that the drawer opens - await DashboardPage.openNavDrawer(driver); - - // And the name of our parent is displayed - await driver?.waitFor(find.text(parent.name)); - }, timeout: Timeout(Duration(minutes: 1))); // Change timeout from 30 sec default to 1 min -} diff --git a/apps/flutter_parent/test_driver/driver_seed_utils.dart b/apps/flutter_parent/test_driver/driver_seed_utils.dart deleted file mode 100644 index fbdc1d1f27..0000000000 --- a/apps/flutter_parent/test_driver/driver_seed_utils.dart +++ /dev/null @@ -1,41 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'dart:convert'; - -import 'package:flutter_driver/flutter_driver.dart'; -import 'package:flutter_parent/models/dataseeding/seed_context.dart'; -import 'package:flutter_parent/models/serializers.dart'; - -// Some driver-side abstractions for grabbing SeedContext from the app. -class DriverSeedUtils { - // Driver side: Grab the current seed context (might be incomplete). - static Future _getSeedContext(FlutterDriver? driver) async { - var jsonContext = await driver?.requestData("GetSeedContext"); - return deserialize(json.decode(jsonContext ?? ''))!; - } - - // Driver side: Retrieve the SeedContext once seeding is complete - static Future waitForSeedingToComplete(FlutterDriver? driver) async { - var seedContext = await _getSeedContext(driver); - while (seedContext.seedingComplete == false) { - await Future.delayed(const Duration(seconds: 1)); - seedContext = await (_getSeedContext(driver)); - } - - // Throw in a delay to allow rendering to complete - await Future.delayed(Duration(seconds: 2)); - return seedContext; - } -} diff --git a/apps/flutter_parent/test_driver/flutter_driver_extensions.dart b/apps/flutter_parent/test_driver/flutter_driver_extensions.dart deleted file mode 100644 index 12bb8f11c5..0000000000 --- a/apps/flutter_parent/test_driver/flutter_driver_extensions.dart +++ /dev/null @@ -1,87 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:flutter_driver/flutter_driver.dart'; - -// Extensions on FlutterDriver that allow us to try pull-to-refresh if the initial attempt fails -// for some operations. -extension AutoRefresh on FlutterDriver { - Future getTextWithRefreshes(SerializableFinder finder, - {int refreshes = 3, String? expectedText = null}) async { - for (int i = 0; i < refreshes; i++) { - try { - var result = await this.getText(finder, timeout: Duration(seconds: 1)); - if (expectedText != null && result != expectedText) { - throw Error(); // Cause a refresh - } - return result; - } catch (err) { - await this.refresh(); - await Future.delayed(Duration(milliseconds: 500)); // Give ourselves time to load - } - } - - // We're out of retries; one more unprotected attempt - return await this.getText(finder); - } - - Future tapWithRefreshes(SerializableFinder finder, {int refreshes = 3}) async { - for (int i = 0; i < refreshes; i++) { - try { - await this.tap(finder, timeout: Duration(seconds: 1)); - return; - } catch (err) { - await this.refresh(); - await Future.delayed(Duration(milliseconds: 500)); // Give ourselves time to load - } - } - - // We're out of retries; one more unprotected attempt - await this.tap(finder); - } - - Future waitWithRefreshes(SerializableFinder finder, {int refreshes = 3}) async { - for (int i = 0; i < refreshes; i++) { - try { - await this.waitFor(finder, timeout: Duration(seconds: 1)); - return; - } catch (err) { - await this.refresh(); - await Future.delayed(Duration(milliseconds: 500)); // Give ourselves time to load - } - } - - // We're out of retries; one more unprotected attempt - await this.waitFor(finder); - } - - Future waitForAbsentWithRefreshes(SerializableFinder finder, {int refreshes = 3}) async { - for (int i = 0; i < refreshes; i++) { - try { - await this.waitForAbsent(finder, timeout: Duration(seconds: 1)); - return; - } catch (err) { - await this.refresh(); - await Future.delayed(Duration(milliseconds: 500)); // Give ourselves time to load - } - } - - // We're out of retries; one more unprotected attempt - await this.waitForAbsent(finder); - } - - Future refresh() async { - await this.scroll(find.byType('RefreshIndicator'), 0, 400, Duration(milliseconds: 200)); - } -} diff --git a/apps/flutter_parent/test_driver/grades_assignments.dart b/apps/flutter_parent/test_driver/grades_assignments.dart deleted file mode 100644 index f241fa2004..0000000000 --- a/apps/flutter_parent/test_driver/grades_assignments.dart +++ /dev/null @@ -1,54 +0,0 @@ -import 'dart:convert'; - -import 'package:built_collection/built_collection.dart'; -import 'package:flutter_driver/driver_extension.dart'; -import 'package:flutter_parent/main.dart' as app; -import 'package:flutter_parent/models/serializers.dart'; -import 'package:flutter_parent/network/utils/api_prefs.dart'; - -import 'apis/assignment_seed_api.dart'; -import 'apis/submission_seed_api.dart'; -import 'app_seed_utils.dart'; - -void main() async { - enableFlutterDriverExtension(handler: AppSeedUtils.seedContextListener); - - // Initialize our ApiPrefs - await ApiPrefs.init(); - - // Seed our data - var data = await AppSeedUtils.seed(nStudents: 1, nCourses: 1); - var course = data.courses[0]; - var student = data.students[0]; - // past-due - var assignment1 = (await AssignmentSeedApi.createAssignment(course.id, dueAt: DateTime.now().subtract(Duration(days: 1)).toUtc()))!; - // Unsubmitted - var assignment2 = (await AssignmentSeedApi.createAssignment(course.id, dueAt: DateTime.now().add(Duration(days: 1)).toUtc()))!; - // Submitted - var assignment3 = (await AssignmentSeedApi.createAssignment(course.id, dueAt: DateTime.now().add(Duration(days: 1)).toUtc()))!; - await Future.delayed(const Duration(seconds: 2)); // Allow some time for assignment-creation delayed jobs to complete - var submission3 = (await SubmissionSeedApi.createSubmission(course.id, assignment3, student.id))!; - - // Graded - var assignment4 = (await AssignmentSeedApi.createAssignment(course.id, dueAt: DateTime.now().add(Duration(days: 3)).toUtc()))!; - await Future.delayed(const Duration(seconds: 2)); // Allow some time for assignment-creation delayed jobs to complete - var submission4 = (await SubmissionSeedApi.createSubmission(course.id, assignment4, student.id))!; - var grade4 = (await SubmissionSeedApi.gradeSubmission(course.id, assignment4, student.id, "19"))!; - - // Sign in the parent - await AppSeedUtils.signIn(data.parents.first); - - // Let the test driver know that seeding has completed - AppSeedUtils.markSeedingComplete(MapBuilder({ - "parent": json.encode(serialize(data.parents.first)), - "student": json.encode(serialize(data.students[0])), - "course": json.encode(serialize(data.courses[0])), - "assignment1": json.encode(serialize(assignment1)), - "assignment2": json.encode(serialize(assignment2)), - "assignment3": json.encode(serialize(assignment3)), - "assignment4": json.encode(serialize(assignment4)), - })); - - // Call app.main(), which should bring up the dashboard. - app.main(); -} diff --git a/apps/flutter_parent/test_driver/grades_assignments_test.dart b/apps/flutter_parent/test_driver/grades_assignments_test.dart deleted file mode 100644 index 1109ab50b8..0000000000 --- a/apps/flutter_parent/test_driver/grades_assignments_test.dart +++ /dev/null @@ -1,96 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -// Imports the Flutter Driver API. - -import 'package:flutter_driver/flutter_driver.dart'; -import 'package:flutter_parent/models/assignment.dart'; -import 'package:flutter_parent/models/course.dart'; -import 'package:test/test.dart'; - -import 'driver_seed_utils.dart'; -import 'pages/assignment_details_page.dart'; -import 'pages/course_grades_page.dart'; -import 'pages/dashboard_page.dart'; - -void main() { - FlutterDriver? driver; - - // Connect to the Flutter driver before running any tests. - setUpAll(() async { - driver = await FlutterDriver.connect(); - }); - - // Close the connection to the driver after the tests have completed. - tearDownAll(() async { - if (driver != null) { - driver?.close(); - } - }); - - test('Grades+Assignments E2E', () async { - // Wait for seeding to complete - var seedContext = (await DriverSeedUtils.waitForSeedingToComplete(driver))!; - - print("driver: Seeding complete!"); - var course = seedContext.getNamedObject("course")!; - var assignments = [ - seedContext.getNamedObject("assignment1")!, - seedContext.getNamedObject("assignment2")!, - seedContext.getNamedObject("assignment3")!, - seedContext.getNamedObject("assignment4")! - ]; - - // Assignment-specific data - var expectedStatuses = ["missing", "not submitted", "submitted", "submitted"]; - var expectedGrades = ["-", "-", "-", "19"]; - - // apparently this is important - await DashboardPage.waitForRender(driver); - - // Verify that we are showing the correct grade for the course - await DashboardPage.verifyCourse(driver, course, grade: "95%"); - - // Select our course - await DashboardPage.selectCourse(driver, course); // Why wouldn't swipe-to-refresh work instead of the above? - - // We're now on the assignments/grades list. - - // Make sure that our total grade is correct - await CourseGradesPage.verifyTotalGradeContains(driver, "95"); - - // Verify that each assignment is present. - for (int i = 0; i < assignments.length; i++) { - var a = assignments[i]; - await CourseGradesPage.verifyAssignment(driver, a, grade: expectedGrades[i], status: expectedStatuses[i]); - } - - // For each assignment, open the assignment details page and verify its correctness - await CourseGradesPage.selectAssignment(driver, assignments[0]); - await AssignmentDetailsPage.validateUnsubmittedAssignment(driver, assignments[0]); - await driver?.tap(find.pageBack()); - - await CourseGradesPage.selectAssignment(driver, assignments[1]); - await AssignmentDetailsPage.validateUnsubmittedAssignment(driver, assignments[1]); - await driver?.tap(find.pageBack()); - - await CourseGradesPage.selectAssignment(driver, assignments[2]); - await AssignmentDetailsPage.validateSubmittedAssignment(driver, assignments[2]); - await driver?.tap(find.pageBack()); - - await CourseGradesPage.selectAssignment(driver, assignments[3]); - await AssignmentDetailsPage.validateGradedAssignment(driver, assignments[3], "19"); - await driver?.tap(find.pageBack()); - }, timeout: Timeout(Duration(minutes: 2))); -} diff --git a/apps/flutter_parent/test_driver/inbox.dart b/apps/flutter_parent/test_driver/inbox.dart deleted file mode 100644 index 8d0746558b..0000000000 --- a/apps/flutter_parent/test_driver/inbox.dart +++ /dev/null @@ -1,64 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'dart:convert'; - -import 'package:built_collection/built_collection.dart'; -import 'package:flutter_driver/driver_extension.dart'; -import 'package:flutter_parent/main.dart' as app; -import 'package:flutter_parent/models/serializers.dart'; -import 'package:flutter_parent/network/api/inbox_api.dart'; -import 'package:flutter_parent/network/utils/api_prefs.dart'; - -import 'apis/assignment_seed_api.dart'; -import 'app_seed_utils.dart'; - -void main() async { - enableFlutterDriverExtension(handler: AppSeedUtils.seedContextListener); - - // Initialize our ApiPrefs - await ApiPrefs.init(); - - // Seed our data - var data = await AppSeedUtils.seed(nStudents: 1, nCourses: 1); - var parent = data.parents.first; - var teacher = data.teachers.first; - var course = data.courses.first; - var student = data.students.first; - - // Seed an assignment - // Graded - var assignment = (await AssignmentSeedApi.createAssignment(course.id, dueAt: DateTime.now().add(Duration(days: 3)).toUtc()))!; - - // Sign in the parent - await AppSeedUtils.signIn(parent); - - // Seed a conversation - await Future.delayed(const Duration(seconds: 5)); - var newConversation = (await InboxApi().createConversation(course.id, [teacher.id], "sUp?", "Let's talk", null))!; - newConversation = newConversation.rebuild((b) => b..contextName = course.name); // Do this manually - - // Let the test driver know that seeding has completed - AppSeedUtils.markSeedingComplete(MapBuilder({ - "parent": json.encode(serialize(parent)), - "student": json.encode(serialize(student)), - "teacher": json.encode(serialize(teacher)), - "course": json.encode(serialize(course)), - "conversation": json.encode(serialize(newConversation)), - "assignment": json.encode(serialize(assignment)), - })); - - // Call app.main(), which should bring up the dashboard. - app.main(); -} diff --git a/apps/flutter_parent/test_driver/inbox_test.dart b/apps/flutter_parent/test_driver/inbox_test.dart deleted file mode 100644 index db9adabb88..0000000000 --- a/apps/flutter_parent/test_driver/inbox_test.dart +++ /dev/null @@ -1,156 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -// Imports the Flutter Driver API. - -import 'package:flutter_driver/flutter_driver.dart'; -import 'package:flutter_parent/models/assignment.dart'; -import 'package:flutter_parent/models/conversation.dart'; -import 'package:flutter_parent/models/course.dart'; -import 'package:flutter_parent/models/dataseeding/seeded_user.dart'; -import 'package:test/test.dart'; - -import 'driver_seed_utils.dart'; -import 'flutter_driver_extensions.dart'; -import 'pages/assignment_details_page.dart'; -import 'pages/conversation_create_page.dart'; -import 'pages/conversation_details_page.dart'; -import 'pages/conversation_list_page.dart'; -import 'pages/course_details_page.dart'; -import 'pages/course_grades_page.dart'; -import 'pages/dashboard_page.dart'; - -void main() { - FlutterDriver? driver; - - // Connect to the Flutter driver before running any tests. - setUpAll(() async { - driver = await FlutterDriver.connect(); - }); - - // Close the connection to the driver after the tests have completed. - tearDownAll(() async { - if (driver != null) { - driver?.close(); - } - }); - - test('Inbox E2E', () async { - // Wait for seeding to complete - var seedContext = (await DriverSeedUtils.waitForSeedingToComplete(driver))!; - - print("driver: Seeding complete!"); - var parent = seedContext.getNamedObject("parent")!; - var student = seedContext.getNamedObject("student")!; - var course = seedContext.getNamedObject("course")!; - var teacher = seedContext.getNamedObject("teacher")!; - var conversation = seedContext.getNamedObject("conversation")!; - var assignment = seedContext.getNamedObject("assignment")!; - - // Verify that the pre-seeded conversation shows up - await DashboardPage.waitForRender(driver); - await DashboardPage.openInbox(driver); - await ConversationListPage.verifyConversationDataDisplayed(driver, /*index*/ 0, - partialSubjects: [conversation.subject], - partialContexts: [conversation.contextName!], - partialBodies: [conversation.lastMessage ?? conversation.lastAuthoredMessage!]); - - // Create a conversation from the Inbox - await ConversationListPage.initiateCreateEmail(driver, course); // Will this work with only one course? - await ConversationCreatePage.verifyRecipientListed(driver, teacher); - await ConversationCreatePage.verifySubject(driver, course.name); - await ConversationCreatePage.populateBody(driver, "Message 1 Body"); - await ConversationCreatePage.sendMail(driver); // Should send us back to conversation list - - // Verify that our new conversation shows up the conversation list - await ConversationListPage.verifyConversationDataDisplayed(driver, /*index*/ 0, - partialBodies: ['Message 1 Body'], partialSubjects: [course.name]); - - // Back to the dashboard - await driver?.tap(find.pageBack()); - - // Select a course and send a grades-related email - await DashboardPage.selectCourse(driver, course); - await CourseGradesPage.initiateCreateEmail(driver); - await ConversationCreatePage.verifyRecipientListed(driver, teacher); - await ConversationCreatePage.verifySubject(driver, 'Regarding: ${student.name}, Grades'); - await ConversationCreatePage.populateBody(driver, 'Grades Body'); - await ConversationCreatePage.sendMail(driver); - - // Go to the syllabus page and send an email - await CourseDetailsPage.selectSyllabus(driver); - await CourseDetailsPage.initiateCreateEmail(driver); - await ConversationCreatePage.verifySubject(driver, 'Regarding: ${student.name}, Syllabus'); - await ConversationCreatePage.populateBody(driver, 'Syllabus Body'); - await ConversationCreatePage.sendMail(driver); - - // Back to grades/assignments tab - CourseDetailsPage.selectGrades(driver); - - // Select an assignment and send an assignment-related email - await CourseGradesPage.selectAssignment(driver, assignment); - await AssignmentDetailsPage.initiateCreateEmail(driver); - await ConversationCreatePage.verifyRecipientListed(driver, teacher); - await ConversationCreatePage.verifySubject(driver, 'Regarding: ${student.name}, Assignment - ${assignment.name}'); - await ConversationCreatePage.populateBody(driver, 'Assignment Body'); - await ConversationCreatePage.sendMail(driver); - - await driver?.tap(find.pageBack()); // assignment details -> grades list - await driver?.tap(find.pageBack()); // grades list -> dashboard - - await DashboardPage.openInbox(driver); - await driver?.refresh(); // To make sure and load the latest emails - await Future.delayed(const Duration(seconds: 2)); // Give ourselves a moment to load - - // Let's make sure that the three most recent emails that we created show up in our - // conversation list. - - // The most recent email -- the assignment email -- should be on top (index 0) - await ConversationListPage.verifyConversationDataDisplayed(driver, 0, - partialSubjects: [student.name, assignment.name!], - partialContexts: [course.name], - partialBodies: ['Assignment Body', student.name]); - - // The syllabus email should be next (index 1) - await ConversationListPage.verifyConversationDataDisplayed(driver, 1, - partialSubjects: [student.name, "Syllabus"], - partialContexts: [course.name], - partialBodies: ['Syllabus Body', student.name]); - - // The grades email should be next (index 2) - await ConversationListPage.verifyConversationDataDisplayed(driver, 2, - partialSubjects: [student.name, "Grades"], - partialContexts: [course.name], - partialBodies: ['Grades Body', student.name]); - - // Let's open the most recent conversation -- should be the assignment conversation - await ConversationListPage.selectMessage(driver, 0); - - // Then run some tests on it - await ConversationDetailsPage.tapParticipants(driver); // To show individual participants - await ConversationDetailsPage.verifyRecipientListed(driver, 0, teacher); - await ConversationDetailsPage.verifySubject(driver, [student.name]); - await ConversationDetailsPage.verifyCourse(driver, course.name); - - // Now let's reply to the email - await ConversationDetailsPage.initiateEmailReplyAll(driver); - await ConversationCreatePage.populateBody(driver, "reply body"); - await ConversationCreatePage.sendMail(driver); - - // And make sure that our new message shows up on the conversation list page... - await driver?.tap(find.pageBack()); // From conversation detail page to conversation list page - await driver?.refresh(); - await ConversationListPage.verifyConversationDataDisplayed(driver, 0, partialBodies: ['reply body']); - }, timeout: Timeout(Duration(minutes: 2))); -} diff --git a/apps/flutter_parent/test_driver/manage_students.dart b/apps/flutter_parent/test_driver/manage_students.dart deleted file mode 100644 index 1a57daefc5..0000000000 --- a/apps/flutter_parent/test_driver/manage_students.dart +++ /dev/null @@ -1,61 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'dart:convert'; - -import 'package:built_collection/built_collection.dart'; -import 'package:flutter_driver/driver_extension.dart'; -import 'package:flutter_parent/main.dart' as app; -import 'package:flutter_parent/models/serializers.dart'; -import 'package:flutter_parent/network/utils/api_prefs.dart'; - -import 'apis/user_seed_api.dart'; -import 'app_seed_utils.dart'; - -void main() async { - enableFlutterDriverExtension(handler: AppSeedUtils.seedContextListener); - - // Initialize our ApiPrefs - await ApiPrefs.init(); - - // Create parent and two students, one of which is paired to the parent. - var parent = (await UserSeedApi.createUser())!; - var student1 = (await UserSeedApi.createUser())!; - var student2 = (await UserSeedApi.createUser())!; - var teacher = (await UserSeedApi.createUser())!; - var course1 = await AppSeedUtils.seedCourseAndEnrollments(student: student1, teacher: teacher); - var course2 = await AppSeedUtils.seedCourseAndEnrollments(student: student2, teacher: teacher); - await AppSeedUtils.seedPairing(parent, student1); - - // Get a pairing code for student2 - var pairingCodeStructure = await UserSeedApi.createObserverPairingCode(student2.id); - var pairingCode = pairingCodeStructure?.code; - print("PAIRING CODE: $pairingCode"); - - // Sign in the parent - await AppSeedUtils.signIn(parent); - - // Let the test driver know that seeding has completed - AppSeedUtils.markSeedingComplete(MapBuilder({ - "parent": json.encode(serialize(parent)), - "student1": json.encode(serialize(student1)), - "student2": json.encode(serialize(student2)), - "course1": json.encode(serialize(course1)), - "course2": json.encode(serialize(course2)), - "pairingCode2": pairingCode, - })); - - // Call app.main(), which should bring up the dashboard. - app.main(); -} diff --git a/apps/flutter_parent/test_driver/manage_students_test.dart b/apps/flutter_parent/test_driver/manage_students_test.dart deleted file mode 100644 index 038bd29338..0000000000 --- a/apps/flutter_parent/test_driver/manage_students_test.dart +++ /dev/null @@ -1,86 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -// Imports the Flutter Driver API. - -import 'package:flutter_driver/flutter_driver.dart'; -import 'package:flutter_parent/models/course.dart'; -import 'package:flutter_parent/models/dataseeding/seeded_user.dart'; -import 'package:test/test.dart'; - -import 'driver_seed_utils.dart'; -import 'pages/dashboard_page.dart'; -import 'pages/manage_students_page.dart'; - -void main() { - FlutterDriver? driver; - - // Connect to the Flutter driver before running any tests. - setUpAll(() async { - driver = await FlutterDriver.connect(); - }); - - // Close the connection to the driver after the tests have completed. - tearDownAll(() async { - if (driver != null) { - driver?.close(); - } - }); - - // Tests that the "Manage Students" page shows students and allows for the addition of a new student. - // Does NOT test anything related to alerts or alert settings; that will be the subject of another test. - test('Manage Students E2E', () async { - // Wait for seeding to complete - var seedContext = (await DriverSeedUtils.waitForSeedingToComplete(driver))!; - - print("driver: Seeding complete!"); - - // Read in our seeded data - var students = [ - seedContext.getNamedObject("student1")!, - seedContext.getNamedObject("student2")! - ]; - var courses = [ - seedContext.getNamedObject("course1")!, - seedContext.getNamedObject("course2")!, - ]; - var parent = seedContext.getNamedObject("parent")!; - var pairingCode = seedContext.seedObjects["pairingCode2"]!; // Direct string fetch - - // Verify that student[0] and course[0] show up on the main dashboard page - await DashboardPage.waitForRender(driver); - await DashboardPage.verifyStudentDisplayed(driver, students[0]); - await DashboardPage.verifyCourse(driver, courses[0]); - - // Open the "Manage Students" pagee - await DashboardPage.openManageStudents(driver); - - // Verify that the first student is showing already - await ManageStudentsPage.verifyStudentDisplayed(driver, students[0]); - - // Add the second - await ManageStudentsPage.addStudent(driver, pairingCode); - - // Verify that both are showing now - await ManageStudentsPage.verifyStudentDisplayed(driver, students[0]); - await ManageStudentsPage.verifyStudentDisplayed(driver, students[1]); - - // Back to main dashboard - await driver?.tap(find.pageBack()); - - // Switch students and verify that new student's course is showing - await DashboardPage.changeStudent(driver, students[1]); - await DashboardPage.verifyCourse(driver, courses[1]); - }, timeout: Timeout(Duration(seconds: 90))); // Change timeout from 30 sec default to 90 secs -} diff --git a/apps/flutter_parent/test_driver/pages/assignment_details_page.dart b/apps/flutter_parent/test_driver/pages/assignment_details_page.dart deleted file mode 100644 index 145d3b7837..0000000000 --- a/apps/flutter_parent/test_driver/pages/assignment_details_page.dart +++ /dev/null @@ -1,99 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:flutter_driver/flutter_driver.dart'; -import 'package:flutter_parent/models/assignment.dart'; -import 'package:flutter_parent/models/dataseeding/quiz.dart'; -import 'package:flutter_parent/utils/core_extensions/date_time_extensions.dart'; -import 'package:intl/intl.dart'; -import 'package:test/test.dart'; - -class AssignmentDetailsPage { - static Future validateGradedAssignment(FlutterDriver? driver, Assignment assignment, String grade) async { - await driver?.waitFor(find.text(assignment.name!)); // No key to use here - - var pointTotalText = await driver?.getText(find.byValueKey("assignment_details_total_points")); - var pointTotalExpected = assignment.pointsPossible.toInt().toString(); - expect(pointTotalText?.contains(pointTotalExpected), true, - reason: "Expected total points to include $pointTotalExpected"); - - var statusText = await driver?.getText(find.byValueKey("assignment_details_status")); - expect(statusText, "Graded", reason: "Expected status to be Graded"); - - _validateDueDate(driver, assignment.dueAt!); - - await driver?.scrollIntoView(find.byValueKey('grade-cell-graded-container')); - var gradeText = await driver?.getText(find.byValueKey('grade-cell-score')); - expect(gradeText, grade, reason: "Expected grade to be $grade"); - } - - static Future validateSubmittedAssignment(FlutterDriver? driver, Assignment assignment) async { - await driver?.waitFor(find.text(assignment.name!)); // No key to use here - - var pointTotalText = await driver?.getText(find.byValueKey("assignment_details_total_points")); - var pointTotalExpected = assignment.pointsPossible.toInt().toString(); - expect(pointTotalText?.contains(pointTotalExpected), true, - reason: "Expected total points to include $pointTotalExpected"); - - var statusText = await driver?.getText(find.byValueKey("assignment_details_status")); - expect(statusText, "Submitted", reason: "Expected status to be Submitted"); - - _validateDueDate(driver, assignment.dueAt!); - - await driver?.scrollIntoView(find.byValueKey('grade-cell-submitted-container')); - var submittedStatus = await driver?.getText(find.byValueKey('grade-cell-submit-status')); - expect(submittedStatus, "Successfully submitted!", reason: "Expected to see 'Successfully submitted!'"); - } - - static Future validateUnsubmittedAssignment(FlutterDriver? driver, Assignment assignment) async { - await driver?.waitFor(find.text(assignment.name!)); // No key to use here - - var pointTotalText = await driver?.getText(find.byValueKey("assignment_details_total_points")); - var pointTotalExpected = assignment.pointsPossible.toInt().toString(); - expect(pointTotalText?.contains(pointTotalExpected), true, - reason: "Expected total points to include $pointTotalExpected"); - - var statusText = await driver?.getText(find.byValueKey("assignment_details_status")); - expect(statusText, "Not Submitted", reason: "Expected status to be Not Submitted"); - - _validateDueDate(driver, assignment.dueAt!); - } - - static Future validateUnsubmittedQuiz(FlutterDriver? driver, Quiz quiz) async { - await driver?.waitFor(find.text(quiz.title)); // No key to use here - - var pointTotalText = await driver?.getText(find.byValueKey("assignment_details_total_points")); - var pointTotalExpected = quiz.pointsPossible.toInt().toString(); - expect(pointTotalText?.contains(pointTotalExpected), true, - reason: "Expected total points to include $pointTotalExpected"); - - var statusText = await driver?.getText(find.byValueKey("assignment_details_status")); - expect(statusText, "Not Submitted", reason: "Expected status to be Not Submitted"); - - _validateDueDate(driver, quiz.dueAt); - } - - static Future _validateDueDate(FlutterDriver? driver, DateTime dueAt) async { - var localDate = dueAt.toLocal(); - String date = (DateFormat.MMMd(supportedDateLocale)).format(localDate).replaceAll(RegExp('[^A-Za-z0-9]'), ''); - String time = (DateFormat.jm(supportedDateLocale)).format(localDate).replaceAll(RegExp('[^A-Za-z0-9]'), ''); - var dueDateText = (await driver?.getText(find.byValueKey("assignment_details_due_date")))!.replaceAll(RegExp('[^A-Za-z0-9]'), ''); - expect(dueDateText.contains(date), true, reason: "Expected due date to contain $date [$dueDateText]"); - expect(dueDateText.contains(time), true, reason: "Expected due date to contain $time [$dueDateText]"); - } - - static Future initiateCreateEmail(FlutterDriver? driver) async { - await driver?.tap(find.byType("FloatingActionButton")); - } -} diff --git a/apps/flutter_parent/test_driver/pages/calendar_page.dart b/apps/flutter_parent/test_driver/pages/calendar_page.dart deleted file mode 100644 index 7fdb06ea62..0000000000 --- a/apps/flutter_parent/test_driver/pages/calendar_page.dart +++ /dev/null @@ -1,116 +0,0 @@ -import 'package:flutter_driver/flutter_driver.dart'; -import 'package:flutter_parent/models/announcement.dart'; -import 'package:flutter_parent/models/assignment.dart'; -import 'package:flutter_parent/models/course.dart'; -import 'package:flutter_parent/models/dataseeding/quiz.dart'; -import 'package:flutter_parent/models/schedule_item.dart'; -import 'package:test/test.dart'; - -import '../flutter_driver_extensions.dart'; - -class CalendarPage { - static Future waitForRender(FlutterDriver? driver) async { - var dayOfMonth = DateTime.now().toLocal().day; - await driver?.waitFor(find.byValueKey('day_of_month_$dayOfMonth'), timeout: Duration(milliseconds: 9998)); - } - - static Future verifyAnnouncementDisplayed(FlutterDriver? driver, Announcement announcement) async { - await _presentHelper(driver, announcement.postedAt, announcement.title); - } - - static Future verifyAnnouncementNotDisplayed(FlutterDriver? driver, Announcement announcement) async { - await _absentHelper(driver, announcement.postedAt, announcement.title); - } - - static Future verifyAssignmentDisplayed(FlutterDriver? driver, Assignment assignment) async { - await _presentHelper(driver, assignment.dueAt!, assignment.name!); - } - - static Future verifyAssignmentNotDisplayed(FlutterDriver? driver, Assignment assignment) async { - await _absentHelper(driver, assignment.dueAt!, assignment.name!); - } - - static Future verifyQuizDisplayed(FlutterDriver? driver, Quiz quiz) async { - await _presentHelper(driver, quiz.dueAt, quiz.title); - } - - static Future verifyQuizNotDisplayed(FlutterDriver? driver, Quiz quiz) async { - await _absentHelper(driver, quiz.dueAt, quiz.title); - } - - static Future verifyEventDisplayed(FlutterDriver? driver, ScheduleItem event) async { - await _presentHelper(driver, event.isAllDay ? event.allDayDate! : event.startAt!, event.title!); - } - - static Future verifyEventNotDisplayed(FlutterDriver? driver, ScheduleItem event) async { - await _absentHelper(driver, event.isAllDay ? event.allDayDate! : event.startAt!, event.title!); - } - - static Future toggleFilter(FlutterDriver? driver, Course course) async { - await driver?.tap(find.text("Calendars")); - await driver?.tap(find.text(course.name)); - await driver?.tap(find.pageBack()); - await driver?.waitForAbsent(find.byType('LoadingIndicator'), timeout: Duration(milliseconds: 4999)); - } - - static Future openAssignment(FlutterDriver? driver, Assignment assignment) async { - // This should get the assignment into view - await _presentHelper(driver, assignment.dueAt!, assignment.name!); - await driver?.tap(find.text(assignment.name!)); - } - - // Helper function to (1) scroll to the correct week if necessary, (2) select the date, and - // (3) make sure that the search text is present. - static Future _presentHelper(FlutterDriver? driver, DateTime displayDate, String searchString) async { - //print('_presentHelper($displayDate,$searchString)'); - var dayOfMonth = displayDate.toLocal().day; - var present = await _scrollToDayOfMonth(driver, dayOfMonth); - expect(present, true, reason: "FAILED to scroll to day-of-month $dayOfMonth"); - await driver?.tap(find.byValueKey('day_of_month_$dayOfMonth')); - await driver?.scrollIntoView(find.text(searchString)); - await driver?.waitWithRefreshes(find.text(searchString)); - } - - // Helper function to (1) scroll to the correct week if necessary, (2) select the date, and - // (3) make sure that the search text is NOT present. - static Future _absentHelper(FlutterDriver? driver, DateTime displayDate, String searchString) async { - //print('_absentHelper($displayDate,$searchString)'); - var dayOfMonth = displayDate.toLocal().day; - var present = await _scrollToDayOfMonth(driver, dayOfMonth); - expect(present, true, reason: "FAILED to scroll to day-of-month $dayOfMonth"); - await driver?.tap(find.byValueKey('day_of_month_$dayOfMonth')); - await driver?.waitForAbsentWithRefreshes(find.text(searchString)); - } - - // Helper function makes an attempt to scroll to the right week if the day of month that we are looking - // for is not visible. Only searches one week forward and one week backwards. - static Future _scrollToDayOfMonth(FlutterDriver? driver, int dayOfMonth) async { - var present = await _dayPresent(driver, dayOfMonth); - if (present) return true; - - // Not present. Scroll one way and try again. - //print("scrolling -400"); - await driver?.scroll(find.byType('CalendarWeek'), -400, 0, Duration(milliseconds: 200)); - present = await _dayPresent(driver, dayOfMonth); - if (present) return true; - - // Still not present. Try scrolling back the opposite direction (twice, to skip initial page). - //print("scrolling 800"); - await driver?.scroll(find.byType('CalendarWeek'), 400, 0, Duration(milliseconds: 200)); - await driver?.scroll(find.byType('CalendarWeek'), 400, 0, Duration(milliseconds: 200)); - present = await _dayPresent(driver, dayOfMonth); - - // If this doesn't fix us, we'll just be hosed. - return present; - } - - // Helper method returns true if the specified dayOfMonth is displayed - static Future _dayPresent(FlutterDriver? driver, int dayOfMonth) async { - try { - await driver?.waitFor(find.byValueKey('day_of_month_$dayOfMonth'), timeout: Duration(milliseconds: 1000)); - return true; - } catch (e) { - return false; - } - } -} diff --git a/apps/flutter_parent/test_driver/pages/conversation_create_page.dart b/apps/flutter_parent/test_driver/pages/conversation_create_page.dart deleted file mode 100644 index 81d2ac8066..0000000000 --- a/apps/flutter_parent/test_driver/pages/conversation_create_page.dart +++ /dev/null @@ -1,42 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:flutter_driver/flutter_driver.dart'; -import 'package:flutter_parent/models/dataseeding/seeded_user.dart'; - -class ConversationCreatePage { - static Future verifyRecipientListed(FlutterDriver? driver, SeededUser user) async { - var keyString = 'user_chip_${user.id}'; - await driver?.waitFor(find.descendant(of: find.byValueKey(keyString), matching: find.text(user.shortName))); - } - - static Future verifySubject(FlutterDriver? driver, String subject) async { - //var text = await driver.getText(find.byValueKey('subjectText')); - //expect(text, subject, reason: 'email subject text'); - - // Unfortunately, the stronger check above won't work because getText() does not - // work on a TextField. - await driver?.waitFor(find.text(subject), timeout: const Duration(seconds: 5)); - } - - static Future populateBody(FlutterDriver? driver, String body) async { - await driver?.tap(find.byValueKey('messageText')); - await driver?.enterText(body); - } - - static Future sendMail(FlutterDriver? driver) async { - await Future.delayed(const Duration(seconds: 1)); // May need to wait a beat for the button to become enabled - await driver?.tap(find.byValueKey('sendButton')); - } -} diff --git a/apps/flutter_parent/test_driver/pages/conversation_details_page.dart b/apps/flutter_parent/test_driver/pages/conversation_details_page.dart deleted file mode 100644 index de033ae2b7..0000000000 --- a/apps/flutter_parent/test_driver/pages/conversation_details_page.dart +++ /dev/null @@ -1,36 +0,0 @@ -import 'package:flutter_driver/flutter_driver.dart'; -import 'package:flutter_parent/models/dataseeding/seeded_user.dart'; -import 'package:test/test.dart'; - -class ConversationDetailsPage { - static Future verifyRecipientListed(FlutterDriver? driver, int index, SeededUser user) async { - var messageFinder = find.byValueKey('conversation_message_index_$index'); - var participantFinder = find.descendant(of: messageFinder, matching: find.byValueKey('participant_id_${user.id}')); - var fullText = await driver?.getText(participantFinder); - expect(fullText?.contains(user.shortName), true, - reason: 'email detail user: searching for \"${user.shortName}\" in \"$fullText\"'); - } - - static Future verifySubject(FlutterDriver? driver, List partialSubjects) async { - var fullText = await driver?.getText(find.byValueKey('subjectText')); - for (String partialSubject in partialSubjects) { - expect(fullText?.toLowerCase().contains(partialSubject.toLowerCase()), true, - reason: 'email detail header subject: searching for \"$partialSubject\" in \"$fullText\"'); - } - } - - static Future verifyCourse(FlutterDriver? driver, String courseName) async { - var fullText = await driver?.getText(find.byValueKey('courseText')); - expect(fullText?.contains(courseName), true, - reason: 'email detail header course: searching for \"$courseName\" in \"$fullText\"'); - } - - static Future tapParticipants(FlutterDriver? driver) async { - await driver?.tap(find.byValueKey('author-info')); - } - - static Future initiateEmailReplyAll(FlutterDriver? driver) async { - await driver?.tap(find.byType('FloatingActionButton')); - await driver?.tap(find.text('Reply All')); - } -} diff --git a/apps/flutter_parent/test_driver/pages/conversation_list_page.dart b/apps/flutter_parent/test_driver/pages/conversation_list_page.dart deleted file mode 100644 index 43d1aa38df..0000000000 --- a/apps/flutter_parent/test_driver/pages/conversation_list_page.dart +++ /dev/null @@ -1,72 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:flutter_driver/flutter_driver.dart'; -import 'package:flutter_parent/models/course.dart'; -import 'package:test/test.dart'; - -class ConversationListPage { - /// Since subjects/messages/contexts can be pretty complex, allow for portions of those - /// fields to be verified. - static Future verifyConversationDataDisplayed(FlutterDriver? driver, int index, - {List? partialSubjects = null, - List? partialBodies = null, - List? partialContexts = null}) async { - // Validate any specified partial subjects - if (partialSubjects != null) { - var finder = find.byValueKey('conversation_subject_$index'); - await driver?.scrollIntoView(finder); - var fullText = await driver?.getText(finder); - for (String partialSubject in partialSubjects) { - expect(fullText?.toLowerCase().contains(partialSubject.toLowerCase()), true, - reason: "Message subject \"$partialSubject\" in \"$fullText\""); - } - } - - // Validate any specified partial contexts - if (partialContexts != null) { - var finder = find.byValueKey('conversation_context_$index'); - await driver?.scrollIntoView(finder); - var fullText = await driver?.getText(finder); - for (String partialContext in partialContexts) { - expect(fullText?.toLowerCase().contains(partialContext.toLowerCase()), true, - reason: "Message context \"$partialContext\" in \"$fullText\""); - } - } - - // Validate any specified partial messages bodies - if (partialBodies != null) { - var finder = find.byValueKey('conversation_message_$index'); - await driver?.scrollIntoView(finder); - var fullText = await driver?.getText(finder); - for (String partialMessage in partialBodies) { - expect(fullText?.toLowerCase().contains(partialMessage.toLowerCase()), true, - reason: "Message body \"$partialMessage\" in \"$fullText\""); - } - } - } - - /// Gets you to the CreateConversationScreen - static Future initiateCreateEmail(FlutterDriver? driver, Course forCourse) async { - await driver?.tap(find.byType('FloatingActionButton')); - await driver?.tap(find.byValueKey('course_list_course_${forCourse.id}')); - await Future.delayed(const Duration(seconds: 1)); // Allow time for population - } - - static Future selectMessage(FlutterDriver? driver, int index) async { - var finder = find.byValueKey('conversation_subject_$index'); - await driver?.scrollIntoView(finder); - await driver?.tap(finder); - } -} diff --git a/apps/flutter_parent/test_driver/pages/course_details_page.dart b/apps/flutter_parent/test_driver/pages/course_details_page.dart deleted file mode 100644 index 577feb9028..0000000000 --- a/apps/flutter_parent/test_driver/pages/course_details_page.dart +++ /dev/null @@ -1,35 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -import 'package:flutter_driver/flutter_driver.dart'; - -/// This is kind of a "super page" that will be showing at the same time as -/// the course grades page or the syllabus page. (Grades/syllabus are -/// nested in the course details page.) -class CourseDetailsPage { - static Future selectSyllabus(FlutterDriver? driver) async { - await driver?.tap(find.text("SYLLABUS")); - } - - static Future selectGrades(FlutterDriver? driver) async { - await driver?.tap(find.text("GRADES")); - } - - static Future selectSummary(FlutterDriver? driver) async { - await driver?.tap(find.text("SUMMARY")); - } - - static Future initiateCreateEmail(FlutterDriver? driver) async { - await driver?.tap(find.byType('FloatingActionButton')); - } -} diff --git a/apps/flutter_parent/test_driver/pages/course_grades_page.dart b/apps/flutter_parent/test_driver/pages/course_grades_page.dart deleted file mode 100644 index a44e2ae6ac..0000000000 --- a/apps/flutter_parent/test_driver/pages/course_grades_page.dart +++ /dev/null @@ -1,80 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:flutter_driver/flutter_driver.dart'; -import 'package:flutter_parent/models/assignment.dart'; -import 'package:test/test.dart'; - -import '../flutter_driver_extensions.dart'; - -class CourseGradesPage { - static Future verifyTotalGradeContains(FlutterDriver? driver, String text) async { - var totalGradeText = await driver?.getTextWithRefreshes(_totalGradeFinder); - expect(totalGradeText?.toLowerCase().contains(text.toLowerCase()), true, - reason: "Expected total grade to contain $text"); - } - - static Future verifyAssignment(FlutterDriver? driver, Assignment assignment, - {String? grade = null, String? status = null}) async { - var rowFinder = _assignmentRowFinder(assignment); - await driver?.scrollIntoView(rowFinder); - - var nameFinder = _assignmentNameFinder(assignment); - var nameText = await driver?.getTextWithRefreshes(nameFinder); - expect(nameText, assignment.name, reason: "Expected assignment name of ${assignment.name}"); - - var gradeFinder = _assignmentGradeFinder(assignment); - var gradeText = await driver?.getTextWithRefreshes(gradeFinder); - expect(gradeText?.contains(assignment.pointsPossible.toInt().toString()), true, - reason: "Expected grade to contain ${assignment.pointsPossible.toInt()}"); - if (grade != null) { - expect(gradeText?.contains(grade), true, reason: "Expected grade to contain $grade"); - } - - if (status != null) { - var statusFinder = _assignmentStatusFinder(assignment); - var statusText = await driver?.getTextWithRefreshes(statusFinder); - expect(statusText?.toLowerCase().contains(status.toLowerCase()), true, - reason: "Expected status to contain $status"); - } - } - - static Future selectAssignment(FlutterDriver? driver, Assignment assignment) async { - var rowFinder = _assignmentRowFinder(assignment); - await driver?.scrollIntoView(rowFinder); - await driver?.tap(_assignmentNameFinder(assignment)); - } - - static final _totalGradeFinder = find.byValueKey("total_grade"); - - static SerializableFinder _assignmentRowFinder(Assignment assignment) { - return find.byValueKey("assignment_${assignment.id}_row"); - } - - static SerializableFinder _assignmentNameFinder(Assignment assignment) { - return find.byValueKey("assignment_${assignment.id}_name"); - } - - static SerializableFinder _assignmentStatusFinder(Assignment assignment) { - return find.byValueKey("assignment_${assignment.id}_status"); - } - - static SerializableFinder _assignmentGradeFinder(Assignment assignment) { - return find.byValueKey("assignment_${assignment.id}_grade"); - } - - static Future initiateCreateEmail(FlutterDriver? driver) async { - await driver?.tap(find.byType('FloatingActionButton')); - } -} diff --git a/apps/flutter_parent/test_driver/pages/course_summary_page.dart b/apps/flutter_parent/test_driver/pages/course_summary_page.dart deleted file mode 100644 index c8bda44eda..0000000000 --- a/apps/flutter_parent/test_driver/pages/course_summary_page.dart +++ /dev/null @@ -1,81 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:flutter_driver/flutter_driver.dart'; -import 'package:flutter_parent/models/assignment.dart'; -import 'package:flutter_parent/models/dataseeding/quiz.dart'; -import 'package:flutter_parent/models/schedule_item.dart'; -import 'package:flutter_parent/utils/core_extensions/date_time_extensions.dart'; -import 'package:intl/intl.dart'; -import 'package:test/test.dart'; - -import 'assignment_details_page.dart'; -import 'event_details_page.dart'; - -class CourseSummaryPage { - static Future verifyAssignmentPresent(FlutterDriver? driver, Assignment assignment) async { - var titleFinder = find.byValueKey('summary_item_title_${assignment.id}'); - await driver?.scrollIntoView(titleFinder); - var title = await driver?.getText(titleFinder); - expect(title, assignment.name, reason: "assignment title"); - await _validateDueDate(driver, assignment.id, assignment.dueAt); - - // Lets click through to the assignment details, validate them, and come back - await driver?.tap(titleFinder); - await AssignmentDetailsPage.validateUnsubmittedAssignment(driver, assignment); - await driver?.tap(find.pageBack()); - } - - static Future verifyQuizPresent(FlutterDriver? driver, Quiz quiz) async { - var titleFinder = find.byValueKey('summary_item_title_${quiz.id}'); - await driver?.scrollIntoView(titleFinder); - var title = await driver?.getText(titleFinder); - expect(title, quiz.title, reason: "quiz title"); - await _validateDueDate(driver, quiz.id, quiz.dueAt); - - // Lets click through to the quiz/assignment details, validate them, and come back - await driver?.tap(titleFinder); - await AssignmentDetailsPage.validateUnsubmittedQuiz(driver, quiz); - await driver?.tap(find.pageBack()); - } - - static Future verifyEventPresent(FlutterDriver? driver, ScheduleItem event) async { - var titleFinder = find.byValueKey('summary_item_title_${event.id}'); - await driver?.scrollIntoView(titleFinder); - var title = await driver?.getText(titleFinder); - expect(title, event.title, reason: "calendar event title"); - - await _validateDueDate(driver, event.id, event.isAllDay ? event.allDayDate : event.startAt); - - // Let's click through to the event details, validate them, and come back - await driver?.tap(titleFinder); - await EventDetailsPage.verifyEventDisplayed(driver, event); - await driver?.tap(find.pageBack()); - } - - static Future _validateDueDate(FlutterDriver? driver, String itemId, DateTime? dueDate) async { - var dateFinder = find.byValueKey('summary_item_subtitle_${itemId}'); - await driver?.scrollIntoView(dateFinder); - var text = await driver?.getText(dateFinder); - if (dueDate == null) { - expect(text, "No Due Date", reason: "Due date"); - } else { - var localDate = dueDate.toLocal(); - String date = (DateFormat.MMMd(supportedDateLocale)).format(localDate); - String time = (DateFormat.jm(supportedDateLocale)).format(localDate); - expect(text?.contains(date), true, reason: "Expected due date ($text) to contain $date"); - expect(text?.contains(time), true, reason: "Expected due date ($text) to contain $time"); - } - } -} diff --git a/apps/flutter_parent/test_driver/pages/dashboard_page.dart b/apps/flutter_parent/test_driver/pages/dashboard_page.dart deleted file mode 100644 index c9eeb41291..0000000000 --- a/apps/flutter_parent/test_driver/pages/dashboard_page.dart +++ /dev/null @@ -1,81 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:flutter_driver/flutter_driver.dart'; -import 'package:flutter_parent/models/course.dart'; -import 'package:flutter_parent/models/dataseeding/seeded_user.dart'; -import 'package:test/test.dart'; - -import '..//flutter_driver_extensions.dart'; - -class DashboardPage { - static Future verifyCourse(FlutterDriver? driver, Course course, {String? grade = null}) async { - var actualName = await driver?.getTextWithRefreshes(find.byValueKey("${course.courseCode}_name")); - expect(actualName, course.name); - var actualCode = await driver?.getText(find.byValueKey("${course.courseCode}_code")); - expect(actualCode, course.courseCode); - if (grade != null) { - var actualGrade = - await driver?.getTextWithRefreshes(find.byValueKey("${course.courseCode}_grade"), expectedText: grade); - expect(actualGrade, grade); - } - } - - static Future verifyCourses(FlutterDriver? driver, List courses) async { - courses.forEach((course) async { - await verifyCourse(driver, course); - }); - } - - static Future selectCourse(FlutterDriver? driver, Course course) async { - await driver?.tapWithRefreshes(find.text(course.name)); - } - - static Future waitForRender(FlutterDriver? driver) async { - print("Waiting for DashboardScreen to appear"); - await driver?.waitFor(find.byType("DashboardScreen"), - timeout: Duration(seconds: 30)); // It can take a while sometimes... - } - - static Future verifyStudentDisplayed(FlutterDriver? driver, SeededUser student) async { - await driver?.waitFor(find.text(student.shortName)); - } - - static Future changeStudent(FlutterDriver? driver, SeededUser newStudent) async { - // Open the student list expansion - await driver?.tap(find.byValueKey('student_expansion_touch_target')); - - // Select the new student - await driver?.tap(find.byValueKey("${newStudent.shortName}_text")); - await Future.delayed(Duration(seconds: 1)); // Wait for animation to complete. - } - - static Future openNavDrawer(FlutterDriver? driver) async { - await driver?.tap(find.byValueKey("drawer_menu")); - } - - static Future openInbox(FlutterDriver? driver) async { - await openNavDrawer(driver); - await driver?.tap(find.text("Inbox")); - } - - static Future openManageStudents(FlutterDriver? driver) async { - await openNavDrawer(driver); - await driver?.tap(find.text("Manage Students")); - } - - static Future goToCalendar(FlutterDriver? driver) async { - await driver?.tap(find.text("Calendar")); - } -} diff --git a/apps/flutter_parent/test_driver/pages/event_details_page.dart b/apps/flutter_parent/test_driver/pages/event_details_page.dart deleted file mode 100644 index b0bd031d93..0000000000 --- a/apps/flutter_parent/test_driver/pages/event_details_page.dart +++ /dev/null @@ -1,34 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:flutter_driver/flutter_driver.dart'; -import 'package:flutter_parent/models/schedule_item.dart'; -import 'package:test/test.dart'; - -class EventDetailsPage { - static Future verifyEventDisplayed(FlutterDriver? driver, ScheduleItem event) async { - var titleText = await driver?.getText(find.byValueKey('event_details_title')); - expect(titleText, event.title, reason: 'Event title'); - - if (event.locationName != null) { - var locationText = await driver?.getText(find.byValueKey('event_details_location_line1')); - expect(locationText, event.locationName, reason: 'event location name'); - } - - if (event.locationAddress != null) { - var locationAddressText = await driver?.getText(find.byValueKey('event_details_location_line2')); - expect(locationAddressText, event.locationAddress, reason: 'event location address'); - } - } -} diff --git a/apps/flutter_parent/test_driver/pages/manage_students_page.dart b/apps/flutter_parent/test_driver/pages/manage_students_page.dart deleted file mode 100644 index 89433327ad..0000000000 --- a/apps/flutter_parent/test_driver/pages/manage_students_page.dart +++ /dev/null @@ -1,31 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:flutter_driver/flutter_driver.dart'; -import 'package:flutter_parent/models/dataseeding/seeded_user.dart'; - -class ManageStudentsPage { - static Future addStudent(FlutterDriver? driver, String pairingCode) async { - await driver?.tap(find.byType("FloatingActionButton")); - await driver?.tap(find.text("Pairing Code")); // Choose between pairing code and qr-code - await driver?.tap(find.byType("TextFormField")); - await driver?.enterText(pairingCode); - await driver?.tap(find.text("OK")); - } - - static Future verifyStudentDisplayed(FlutterDriver? driver, SeededUser user) async { - await driver?.waitFor( - find.descendant(of: find.byValueKey('studentTextHero${user.id}'), matching: find.text(user.shortName))); - } -} diff --git a/apps/flutter_parent/test_driver/summary.dart b/apps/flutter_parent/test_driver/summary.dart deleted file mode 100644 index 612888dd85..0000000000 --- a/apps/flutter_parent/test_driver/summary.dart +++ /dev/null @@ -1,60 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'dart:convert'; - -import 'package:built_collection/built_collection.dart'; -import 'package:flutter_driver/driver_extension.dart'; -import 'package:flutter_parent/main.dart' as app; -import 'package:flutter_parent/models/serializers.dart'; -import 'package:flutter_parent/network/utils/api_prefs.dart'; - -import 'apis/assignment_seed_api.dart'; -import 'apis/calendar_seed_api.dart'; -import 'apis/quiz_seed_api.dart'; -import 'app_seed_utils.dart'; - -void main() async { - enableFlutterDriverExtension(handler: AppSeedUtils.seedContextListener); - - // Initialize our ApiPrefs - await ApiPrefs.init(); - - // Seed our data - var data = await AppSeedUtils.seed(nStudents: 1, nCourses: 1); - var course = data.courses[0]; - var parent = data.parents[0]; - - var assignment = (await AssignmentSeedApi.createAssignment(course.id, dueAt: DateTime.now().add(Duration(days: 1)).toUtc()))!; - var quiz = (await QuizSeedApi.createQuiz(course.id, "EZ Quiz", DateTime.now().add(Duration(days: 1)).toUtc()))!; - var now = DateTime.now(); - var calendarEvent = (await CalendarSeedApi.createCalendarEvent( - course.id, "Calendar Event", DateTime(now.year, now.month, now.day).toUtc(), - description: "Description", allDay: true, locationName: "Location Name", locationAddress: "Location Address"))!; - - // Sign in the parent - await AppSeedUtils.signIn(parent); - - // Let the test driver know that seeding has completed - AppSeedUtils.markSeedingComplete(MapBuilder({ - "parent": json.encode(serialize(parent)), - "course": json.encode(serialize(course)), - "assignment": json.encode(serialize(assignment)), - "quiz": json.encode(serialize(quiz)), - "event": json.encode(serialize(calendarEvent)), - })); - - // Call app.main(), which should bring up the dashboard. - app.main(); -} diff --git a/apps/flutter_parent/test_driver/summary_test.dart b/apps/flutter_parent/test_driver/summary_test.dart deleted file mode 100644 index ace824e555..0000000000 --- a/apps/flutter_parent/test_driver/summary_test.dart +++ /dev/null @@ -1,70 +0,0 @@ -// Copyright (C) 2020 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -// Imports the Flutter Driver API. - -import 'package:flutter_driver/flutter_driver.dart'; -import 'package:flutter_parent/models/assignment.dart'; -import 'package:flutter_parent/models/course.dart'; -import 'package:flutter_parent/models/dataseeding/quiz.dart'; -import 'package:flutter_parent/models/dataseeding/seeded_user.dart'; -import 'package:flutter_parent/models/schedule_item.dart'; -import 'package:test/test.dart'; - -import 'driver_seed_utils.dart'; -import 'pages/course_details_page.dart'; -import 'pages/course_summary_page.dart'; -import 'pages/dashboard_page.dart'; - -void main() { - FlutterDriver? driver; - - // Connect to the Flutter driver before running any tests. - setUpAll(() async { - driver = await FlutterDriver.connect(); - }); - - // Close the connection to the driver after the tests have completed. - tearDownAll(() async { - if (driver != null) { - driver?.close(); - } - }); - - // An end-to-end test for the course summary page. - // Seeds an assignment, a quiz and a calendar event, and - // verifies that they show up correctly on the summary page. - test('Summary E2E', () async { - // Wait for seeding to complete - var seedContext = (await DriverSeedUtils.waitForSeedingToComplete(driver))!; - - print("driver: Seeding complete!"); - var parent = seedContext.getNamedObject("parent")!; - var course = seedContext.getNamedObject("course")!; - var assignment = seedContext.getNamedObject("assignment")!; - var quiz = seedContext.getNamedObject("quiz")!; - var event = seedContext.getNamedObject("event")!; - - // Let's check that all of our assignments, quizzes and announcements are displayed - await DashboardPage.waitForRender(driver); - await DashboardPage.selectCourse(driver, course); - await CourseDetailsPage.selectSummary(driver); - - // Check that our various items are present - // (Will also click-through to verify that the details pages are shown correctly.) - await CourseSummaryPage.verifyAssignmentPresent(driver, assignment); - await CourseSummaryPage.verifyQuizPresent(driver, quiz); - await CourseSummaryPage.verifyEventPresent(driver, event); - }, timeout: Timeout(Duration(seconds: 90))); // Change timeout from 30 sec default to 90 secs -} diff --git a/apps/flutter_parent/tools/code_coverage.dart b/apps/flutter_parent/tools/code_coverage.dart deleted file mode 100644 index cf68125efa..0000000000 --- a/apps/flutter_parent/tools/code_coverage.dart +++ /dev/null @@ -1,68 +0,0 @@ -// Copyright (C) 2019 - present Instructure, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'dart:io'; - -void main(List args) async { - // Make sure lcov is installed - try { - Process.runSync('lcov', []); - } catch (e) { - print('lcov is not installed! Please run "brew install lcov" first.'); - exit(1); - } - - // Get list of exclusions - File file = new File('tools/codecov_exclusions'); - if (!file.existsSync()) { - print('Could not find exclusions list at ${file.absolute.path}'); - exit(1); - } - List exclusions = file.readAsLinesSync().map((line) => line.trim()).toList(); - exclusions.retainWhere((line) => line.isNotEmpty && !line.startsWith('#')); - - // Run tests with coverage - print('Running tests...'); - await runCommand('flutter', ['test', '--coverage']); - - // Perform exclusions - print('Performing coverage exclusions...'); - await runCommand('lcov', ['--remove', 'coverage/lcov.info', ...exclusions, '-o', 'coverage/lcov_filtered.info']); - - // Generate HTML coverage report - print('Generating HTML report'); - await runCommand('genhtml', [ - 'coverage/lcov_filtered.info', - '-o', - 'coverage', - ]); - - // Open the report - if (!args.contains('--dont-open')) { - print('Opening report'); - await runCommand('open', ['coverage/index.html']); - } -} - -Future runCommand(String command, List args) async { - var process = await Process.start(command, args); - stdout.addStream(process.stdout); - stderr.addStream(process.stderr); - var exitCode = await process.exitCode; - if (exitCode != 0) { - print('Command "$command" failed with exit code $exitCode'); - exit(1); - } - return exitCode; -} diff --git a/apps/flutter_parent/tools/codecov_exclusions b/apps/flutter_parent/tools/codecov_exclusions deleted file mode 100644 index 8e5cc31fa3..0000000000 --- a/apps/flutter_parent/tools/codecov_exclusions +++ /dev/null @@ -1,30 +0,0 @@ -# Generated files -**/*.g.* -**/generated/* - -# APIs -lib/network/api/* - -# App components - Can't test, and not used in any tests -lib/parent_app.dart -lib/utils/crash_utils.dart -lib/utils/service_locator.dart -lib/utils/web_view_utils.dart - -# AttachmentPickerInteractor - all code calls through to system functions -lib/screens/inbox/attachment_utils/attachment_picker_interactor.dart - -# Theme transition currently does not work in widget tests -lib/utils/design/theme_transition/* - -# Dependency veneers (i.e. passthrough wrappers). -# There should be no logic in these files, only direct calls through to unmockable dependencies. -lib/utils/veneers/* - -# Static declarations, since coverage doesn't seem to be recognized at the moment -lib/utils/snickers.dart -lib/utils/design/student_color_set.dart -lib/utils/design/canvas_icons*.dart - -# Data seeding - not important for test coverage -lib/models/dataseeding/*